From db57a7b9d4b77e772d5d935ee157a3ec408f3049 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Fri, 13 Sep 2024 16:01:55 +0200 Subject: [PATCH 1/2] Fix FontRastrSettings cacheing --- .../skparagraph/include/FontRastrSettings.h | 18 +++++++++--------- modules/skparagraph/include/ParagraphStyle.h | 2 +- modules/skparagraph/include/TextStyle.h | 2 +- modules/skparagraph/src/ParagraphCache.cpp | 5 +++++ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/skparagraph/include/FontRastrSettings.h b/modules/skparagraph/include/FontRastrSettings.h index 009513bb2627..cfcb1d4d90ca 100644 --- a/modules/skparagraph/include/FontRastrSettings.h +++ b/modules/skparagraph/include/FontRastrSettings.h @@ -9,15 +9,15 @@ namespace skia { namespace textlayout { struct FontRastrSettings { - FontRastrSettings() { - fEdging = SkFont::Edging::kAntiAlias; - fHinting = SkFontHinting::kSlight; - fSubpixel = true; - } - - SkFont::Edging fEdging; - SkFontHinting fHinting; - bool fSubpixel; + + /** Whether edge pixels draw opaque or with partial transparency. */ + SkFont::Edging fEdging = SkFont::Edging::kAntiAlias; + + /** Level of glyph outline adjustment. */ + SkFontHinting fHinting = SkFontHinting::kSlight; + + /** Whether glyphs respect sub-pixel positioning. */ + bool fSubpixel = true; }; diff --git a/modules/skparagraph/include/ParagraphStyle.h b/modules/skparagraph/include/ParagraphStyle.h index 6682041a535b..653e00594f6e 100644 --- a/modules/skparagraph/include/ParagraphStyle.h +++ b/modules/skparagraph/include/ParagraphStyle.h @@ -112,7 +112,7 @@ struct ParagraphStyle { void setStrutStyle(StrutStyle strutStyle) { fStrutStyle = std::move(strutStyle); } const FontRastrSettings& getFontRastrSettings() const { return fFontRastrSettings; } - void setFontRastrSettings(FontRastrSettings fontRastrSettings) { fFontRastrSettings = fontRastrSettings; } + void setFontRastrSettings(const FontRastrSettings& fontRastrSettings) { fFontRastrSettings = fontRastrSettings; } const TextStyle& getTextStyle() const { return fDefaultTextStyle; } void setTextStyle(const TextStyle& textStyle) { fDefaultTextStyle = textStyle; } diff --git a/modules/skparagraph/include/TextStyle.h b/modules/skparagraph/include/TextStyle.h index 228519e3c3ed..ac6cbb1eebe4 100644 --- a/modules/skparagraph/include/TextStyle.h +++ b/modules/skparagraph/include/TextStyle.h @@ -278,7 +278,7 @@ class TextStyle { void setTypeface(sk_sp typeface) { fTypeface = std::move(typeface); } const FontRastrSettings& getFontRastrSettings() const { return fFontRastrSettings; } - void setFontRastrSettings(FontRastrSettings fontRastrSettings) { fFontRastrSettings = fontRastrSettings; } + void setFontRastrSettings(const FontRastrSettings& fontRastrSettings) { fFontRastrSettings = fontRastrSettings; } SkString getLocale() const { return fLocale; } void setLocale(const SkString& locale) { fLocale = locale; } diff --git a/modules/skparagraph/src/ParagraphCache.cpp b/modules/skparagraph/src/ParagraphCache.cpp index f0ad95892772..0be281e6edc7 100644 --- a/modules/skparagraph/src/ParagraphCache.cpp +++ b/modules/skparagraph/src/ParagraphCache.cpp @@ -145,6 +145,11 @@ uint32_t ParagraphCacheKey::computeHash() const { hash = mix(hash, SkGoodHash()(fParagraphStyle.getTextDirection())); hash = mix(hash, SkGoodHash()(fParagraphStyle.getReplaceTabCharacters() ? 1 : 0)); + auto& fontRastrSettings = fParagraphStyle.getFontRastrSettings(); + hash = mix(hash, SkGoodHash()(fontRastrSettings.fEdging)); + hash = mix(hash, SkGoodHash()(fontRastrSettings.fHinting)); + hash = mix(hash, SkGoodHash()(fontRastrSettings.fSubpixel ? 1 : 0)); + auto& strutStyle = fParagraphStyle.getStrutStyle(); if (strutStyle.getStrutEnabled()) { hash = mix(hash, SkGoodHash()(relax(strutStyle.getHeight()))); From df402c6c8f5f1e81e63ebebba518df82764181db Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Fri, 13 Sep 2024 16:42:32 +0200 Subject: [PATCH 2/2] Update Paragraph69 example --- modules/skparagraph/slides/ParagraphSlide.cpp | 122 +++++++++++------- 1 file changed, 75 insertions(+), 47 deletions(-) diff --git a/modules/skparagraph/slides/ParagraphSlide.cpp b/modules/skparagraph/slides/ParagraphSlide.cpp index db594a31f131..cb941535e2f0 100644 --- a/modules/skparagraph/slides/ParagraphSlide.cpp +++ b/modules/skparagraph/slides/ParagraphSlide.cpp @@ -10,6 +10,7 @@ #include "include/core/SkStream.h" #include "include/core/SkTextBlob.h" #include "include/core/SkTypeface.h" +#include "include/core/SkSurface.h" #include "include/effects/SkGradientShader.h" #include "modules/skparagraph/include/Paragraph.h" #include "modules/skparagraph/include/ParagraphStyle.h" @@ -3598,60 +3599,87 @@ class ParagraphSlide68 : public ParagraphSlide_Base { class ParagraphSlide69 : public ParagraphSlide_Base { public: - ParagraphSlide69() { fName = "Paragraph69"; } + ParagraphSlide69() { fName = "Paragraph69"; } - void draw(SkCanvas* canvas) override { - canvas->drawColor(SK_ColorWHITE); + void load(SkScalar w, SkScalar h) override { + fontCollection = + sk_make_sp(GetResourcePath("fonts").c_str(), false, true); + // fontCollection->getParagraphCache()->reset(); + // fontCollection->getParagraphCache()->turnOn(false); + } + + void draw(SkCanvas* canvas) override { + canvas->drawColor(SK_ColorWHITE); + canvas->translate(10, 10); - auto fontCollection = - sk_make_sp(GetResourcePath("fonts").c_str(), false, true); + constexpr SkFont::Edging edgingTypes[] { + SkFont::Edging::kAlias, + SkFont::Edging::kAntiAlias, + SkFont::Edging::kSubpixelAntiAlias, + }; - auto paragraph1 = paragraphWithRastrSettings(fontCollection, "Lorien Ipsum [kAntiAlias, SkFontHinting::kSlight, subpixel: true] [default]", - SkFont::Edging::kAntiAlias, - SkFontHinting::kSlight, - true); + constexpr SkFontHinting hintingTypes[] { + SkFontHinting::kNone, + SkFontHinting::kSlight, + SkFontHinting::kNormal, + SkFontHinting::kFull + }; - auto paragraph2 = paragraphWithRastrSettings(fontCollection, "Lorien Ipsum [kSubpixelAntiAlias, SkFontHinting::kFull, subpixel: true]", - SkFont::Edging::kSubpixelAntiAlias, - SkFontHinting::kFull, - true); + FontRastrSettings fontRastrSettings; + for (const SkFont::Edging& edging : edgingTypes) { + fontRastrSettings.fEdging = edging; + canvas->save(); + for (const SkFontHinting& hinting : hintingTypes) { + fontRastrSettings.fHinting = hinting; - auto paragraph3 = paragraphWithRastrSettings(fontCollection, "Lorien Ipsum [kSubpixelAntiAlias, SkFontHinting::kFull, subpixel: false]", - SkFont::Edging::kSubpixelAntiAlias, - SkFontHinting::kFull, - false); + fontRastrSettings.fSubpixel = false; + drawGlyph(canvas, fontRastrSettings); + canvas->translate(80, 0); - paragraph1->layout(600); - paragraph1->paint(canvas, 0, 0); - paragraph2->layout(600); - paragraph2->paint(canvas, 0, 40); - paragraph3->layout(600); - paragraph3->paint(canvas, 0, 80); - } + fontRastrSettings.fSubpixel = true; + drawGlyph(canvas, fontRastrSettings); + canvas->translate(80, 0); + } + canvas->restore(); + canvas->translate(0, 80); + } + } -protected: - std::unique_ptr paragraphWithRastrSettings(sk_sp fontCollection, - const char* text, - SkFont::Edging edging, - SkFontHinting hinting, - bool subpixel) { - FontRastrSettings fontRastrSettings; - fontRastrSettings.fEdging = edging; - fontRastrSettings.fHinting = hinting; - fontRastrSettings.fSubpixel = subpixel; - - - ParagraphStyle paragraph_style; - paragraph_style.setFontRastrSettings(fontRastrSettings); - TextStyle textStyle; - textStyle.setFontFamilies({SkString("Roboto")}); - textStyle.setFontSize(14.0); - textStyle.setColor(SK_ColorBLACK); - ParagraphBuilderImpl builder(paragraph_style, fontCollection); - builder.pushStyle(textStyle); - builder.addText(text); - return builder.Build(); - } +private: + sk_sp fontCollection; + + void drawGlyph(SkCanvas* canvas, const FontRastrSettings& fontRastrSettings) { + auto p = buildParagraph("A", fontRastrSettings); + p->layout(10); + auto i = makeImage(canvas, 10, 10, p.get()); + canvas->save(); + canvas->scale(8.0f, 8.0f); + canvas->drawImageRect(i.get(), + SkRect::MakeWH(10, 10), SkRect::MakeWH(10, 10), + SkFilterMode::kNearest, nullptr, SkCanvas::kFast_SrcRectConstraint); + canvas->restore(); + } + + sk_sp makeImage(SkCanvas* canvas, int width, int height, Paragraph *paragraph) { + auto info = SkImageInfo::Make(width, height, kRGBA_8888_SkColorType, kPremul_SkAlphaType); + auto surface = canvas->makeSurface(info); + surface->getCanvas()->clear(SK_ColorTRANSPARENT); + paragraph->paint(surface->getCanvas(), 0.25f, 0.25f); + return surface->makeImageSnapshot(); + } + + std::unique_ptr buildParagraph(const char* text, const FontRastrSettings& fontRastrSettings) { + ParagraphStyle paragraphStyle; + paragraphStyle.setFontRastrSettings(fontRastrSettings); + TextStyle textStyle; + textStyle.setFontFamilies({ SkString("Roboto") }); + textStyle.setFontSize(10); + textStyle.setColor(SK_ColorBLACK); + ParagraphBuilderImpl builder(paragraphStyle, fontCollection); + builder.pushStyle(textStyle); + builder.addText(text); + return builder.Build(); + } }; // Google logo is shown in one style (the first one)