vcl/unx/generic/gdi/cairotextrender.cxx | 70 +++++++++++++++++--------------- 1 file changed, 39 insertions(+), 31 deletions(-)
New commits: commit c9c463af22d1c7ea75c8af2d7cf5e2c0a152e40f Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Apr 4 17:15:13 2023 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Apr 4 22:26:47 2023 +0200 split out the pieces that apply the font to the cairo context Change-Id: I0577832f57b15621d150da4cb50e134c9c06bae7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150029 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx index 664c8dbea9cd..f3fb3bde6b83 100644 --- a/vcl/unx/generic/gdi/cairotextrender.cxx +++ b/vcl/unx/generic/gdi/cairotextrender.cxx @@ -162,6 +162,44 @@ CairoTextRender::~CairoTextRender() cairo_font_options_destroy(mpRoundGlyphPosOffOptions); } +static void ApplyFont(cairo_t* cr, const CairoFontsCache::CacheId& rId, double nWidth, double nHeight, int nGlyphRotation, + const GenericSalLayout& rLayout) +{ + cairo_font_face_t* font_face = CairoFontsCache::FindCachedFont(rId); + if (!font_face) + { + const FontConfigFontOptions *pOptions = rId.mpOptions; + FcPattern *pPattern = pOptions->GetPattern(); + font_face = cairo_ft_font_face_create_for_pattern(pPattern); + CairoFontsCache::CacheFont(font_face, rId); + } + cairo_set_font_face(cr, font_face); + + cairo_set_font_size(cr, nHeight); + + cairo_matrix_t m; + cairo_matrix_init_identity(&m); + + if (rLayout.GetOrientation()) + cairo_matrix_rotate(&m, toRadian(rLayout.GetOrientation())); + + cairo_matrix_scale(&m, nWidth, nHeight); + + if (nGlyphRotation) + cairo_matrix_rotate(&m, toRadian(Degree10(nGlyphRotation * 900))); + + const FreetypeFontInstance& rInstance = static_cast<FreetypeFontInstance&>(rLayout.GetFont()); + if (rInstance.NeedsArtificialItalic()) + { + cairo_matrix_t shear; + cairo_matrix_init_identity(&shear); + shear.xy = -shear.xx * ARTIFICIAL_ITALIC_SKEW; + cairo_matrix_multiply(&m, &shear, &m); + } + + cairo_set_font_matrix(cr, &m); +} + void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalGraphics& rGraphics) { const FreetypeFontInstance& rInstance = static_cast<FreetypeFontInstance&>(rLayout.GetFont()); @@ -326,8 +364,6 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG aId.mpOptions = rFont.GetFontOptions(); aId.mbEmbolden = rInstance.NeedsArtificialBold(); - cairo_matrix_t m; - std::vector<int>::const_iterator aEnd = glyph_extrarotation.end(); std::vector<int>::const_iterator aStart = glyph_extrarotation.begin(); std::vector<int>::const_iterator aI = aStart; @@ -341,37 +377,9 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG size_t nLen = std::distance(aI, aNext); aId.mbVerticalMetrics = nGlyphRotation != 0.0; - cairo_font_face_t* font_face = CairoFontsCache::FindCachedFont(aId); - if (!font_face) - { - const FontConfigFontOptions *pOptions = aId.mpOptions; - FcPattern *pPattern = pOptions->GetPattern(); - font_face = cairo_ft_font_face_create_for_pattern(pPattern); - CairoFontsCache::CacheFont(font_face, aId); - } - cairo_set_font_face(cr, font_face); - - cairo_set_font_size(cr, nHeight); - cairo_matrix_init_identity(&m); - - if (rLayout.GetOrientation()) - cairo_matrix_rotate(&m, toRadian(rLayout.GetOrientation())); - - cairo_matrix_scale(&m, nWidth, nHeight); - - if (nGlyphRotation) - cairo_matrix_rotate(&m, toRadian(Degree10(nGlyphRotation * 900))); - - if (rInstance.NeedsArtificialItalic()) - { - cairo_matrix_t shear; - cairo_matrix_init_identity(&shear); - shear.xy = -shear.xx * ARTIFICIAL_ITALIC_SKEW; - cairo_matrix_multiply(&m, &shear, &m); - } + ApplyFont(cr, aId, nWidth, nHeight, nGlyphRotation, rLayout); - cairo_set_font_matrix(cr, &m); cairo_show_glyphs(cr, &cairo_glyphs[nStartIndex], nLen); if (cairo_status(cr) != CAIRO_STATUS_SUCCESS) {