vcl/inc/unx/cairotextrender.hxx         |    5 --
 vcl/unx/generic/gdi/cairotextrender.cxx |   66 +++++++++++++++++++++-----------
 2 files changed, 44 insertions(+), 27 deletions(-)

New commits:
commit 28615c7c048151820b44beddf444690403ee55e6
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Tue May 23 18:19:45 2023 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue May 23 21:15:29 2023 +0200

    perf: surprising to see PDF being vsprintf'd during JSDialog rendering.
    
    Avoid some hundreds of these:
    
    _cairo_pdf_surface_show_page
    ...
    cairo_surface_destroy
    CairoTextRender::CairoTextRender
    
    via.
    
    SvpCairoTextRender: :SvpCairoTextRender(SvpSalGraphics&)
    SvpSalGraphics: :SvpSalGraphics()
    Change-Id: Ieefb65138f7e685f09dbf4c36a2fccd39b4b05cd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152168
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/vcl/inc/unx/cairotextrender.hxx b/vcl/inc/unx/cairotextrender.hxx
index e9a85739827b..70ae0dceccc4 100644
--- a/vcl/inc/unx/cairotextrender.hxx
+++ b/vcl/inc/unx/cairotextrender.hxx
@@ -29,11 +29,6 @@ typedef struct _cairo_font_options cairo_font_options_t;
 
 class VCL_DLLPUBLIC CairoTextRender : public FreeTypeTextRenderImpl
 {
-private:
-    // https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/235
-    // I don't want to have CAIRO_ROUND_GLYPH_POS_ON set in the cairo
-    // surfaces font_options, but that's private, so tricky to achieve
-    cairo_font_options_t*       mpRoundGlyphPosOffOptions;
 protected:
     virtual cairo_t*            getCairoContext() = 0;
     virtual void                getSurfaceOffset(double& nDX, double& nDY) = 0;
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx 
b/vcl/unx/generic/gdi/cairotextrender.cxx
index 612bf49ff6d0..0a10f6708faf 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -131,34 +131,56 @@ extern "C"
 }
 #endif
 
-CairoTextRender::CairoTextRender()
-{
-    // https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/235
-    // I don't want to have CAIRO_ROUND_GLYPH_POS_ON set in the cairo surfaces
-    // font_options when trying subpixel rendering, but that's a private
-    // feature of cairo_font_options_t, so tricky to achieve. Hack this by
-    // getting the font options of a backend known to set this private feature
-    // to CAIRO_ROUND_GLYPH_POS_OFF and then set to defaults the public
-    // features and the result can be merged with new font options to set
-    // CAIRO_ROUND_GLYPH_POS_OFF in those
-    mpRoundGlyphPosOffOptions = cairo_font_options_create();
+namespace {
+    struct CairoFontOptions
+    {
+        // https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/235
+        // I don't want to have CAIRO_ROUND_GLYPH_POS_ON set in the cairo
+        // surfaces font_options, but that's private, so tricky to achieve
+        cairo_font_options_t* mpRoundGlyphPosOffOptions;
+
+        CairoFontOptions()
+        {
+            // https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/235
+            // I don't want to have CAIRO_ROUND_GLYPH_POS_ON set in the cairo 
surfaces
+            // font_options when trying subpixel rendering, but that's a 
private
+            // feature of cairo_font_options_t, so tricky to achieve. Hack 
this by
+            // getting the font options of a backend known to set this private 
feature
+            // to CAIRO_ROUND_GLYPH_POS_OFF and then set to defaults the public
+            // features and the result can be merged with new font options to 
set
+            // CAIRO_ROUND_GLYPH_POS_OFF in those
+            mpRoundGlyphPosOffOptions = cairo_font_options_create();
 #if defined(CAIRO_HAS_SVG_SURFACE)
-    // svg, pdf and ps backends have CAIRO_ROUND_GLYPH_POS_OFF by default
-    cairo_surface_t* hack = cairo_svg_surface_create(nullptr, 1, 1);
+            // svg, pdf and ps backends have CAIRO_ROUND_GLYPH_POS_OFF by 
default
+            cairo_surface_t* hack = cairo_svg_surface_create(nullptr, 1, 1);
 #elif defined(CAIRO_HAS_PDF_SURFACE)
-    cairo_surface_t* hack = cairo_pdf_surface_create(nullptr, 1, 1);
+            cairo_surface_t* hack = cairo_pdf_surface_create(nullptr, 1, 1);
 #endif
-    cairo_surface_get_font_options(hack, mpRoundGlyphPosOffOptions);
-    cairo_surface_destroy(hack);
-    cairo_font_options_set_antialias(mpRoundGlyphPosOffOptions, 
CAIRO_ANTIALIAS_DEFAULT);
-    cairo_font_options_set_subpixel_order(mpRoundGlyphPosOffOptions, 
CAIRO_SUBPIXEL_ORDER_DEFAULT);
-    cairo_font_options_set_hint_style(mpRoundGlyphPosOffOptions, 
CAIRO_HINT_STYLE_DEFAULT);
-    cairo_font_options_set_hint_metrics(mpRoundGlyphPosOffOptions, 
CAIRO_HINT_METRICS_DEFAULT);
+            cairo_surface_get_font_options(hack, mpRoundGlyphPosOffOptions);
+            cairo_surface_destroy(hack);
+            cairo_font_options_set_antialias(mpRoundGlyphPosOffOptions, 
CAIRO_ANTIALIAS_DEFAULT);
+            cairo_font_options_set_subpixel_order(mpRoundGlyphPosOffOptions, 
CAIRO_SUBPIXEL_ORDER_DEFAULT);
+            cairo_font_options_set_hint_style(mpRoundGlyphPosOffOptions, 
CAIRO_HINT_STYLE_DEFAULT);
+            cairo_font_options_set_hint_metrics(mpRoundGlyphPosOffOptions, 
CAIRO_HINT_METRICS_DEFAULT);
+        }
+        ~CairoFontOptions()
+        {
+            cairo_font_options_destroy(mpRoundGlyphPosOffOptions);
+        }
+        static const cairo_font_options_t *get()
+        {
+            static CairoFontOptions opts;
+            return opts.mpRoundGlyphPosOffOptions;
+        }
+    };
+}
+
+CairoTextRender::CairoTextRender()
+{
 }
 
 CairoTextRender::~CairoTextRender()
 {
-    cairo_font_options_destroy(mpRoundGlyphPosOffOptions);
 }
 
 void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const 
SalGraphics& rGraphics)
@@ -293,7 +315,7 @@ void CairoTextRender::DrawTextLayout(const 
GenericSalLayout& rLayout, const SalG
             // CAIRO_ROUND_GLYPH_POS_OFF
             if (bResolutionIndependentLayoutEnabled)
             {
-                cairo_font_options_merge(pOptions, mpRoundGlyphPosOffOptions);
+                cairo_font_options_merge(pOptions, CairoFontOptions::get());
                 // tdf#153699 skip this with cairo 1.17.8 as it has a problem
                 // See: https://gitlab.freedesktop.org/cairo/cairo/-/issues/643
                 if (cairo_version() != CAIRO_VERSION_ENCODE(1,17,8))

Reply via email to