Skip to content

Commit

Permalink
Merge pull request #4 from JetBrains/ivan.matkov/fix-rastr-cache
Browse files Browse the repository at this point in the history
Fix `FontRastrSettings` caching
  • Loading branch information
MatkovIvan authored Sep 16, 2024
2 parents 1d69d9b + df402c6 commit 2213bff
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 58 deletions.
18 changes: 9 additions & 9 deletions modules/skparagraph/include/FontRastrSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};


Expand Down
2 changes: 1 addition & 1 deletion modules/skparagraph/include/ParagraphStyle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
2 changes: 1 addition & 1 deletion modules/skparagraph/include/TextStyle.h
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ class TextStyle {
void setTypeface(sk_sp<SkTypeface> 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; }
Expand Down
122 changes: 75 additions & 47 deletions modules/skparagraph/slides/ParagraphSlide.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<TestFontCollection>(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<TestFontCollection>(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<Paragraph> paragraphWithRastrSettings(sk_sp<FontCollection> 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> 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<SkImage> 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<Paragraph> 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)
Expand Down
5 changes: 5 additions & 0 deletions modules/skparagraph/src/ParagraphCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())));
Expand Down

0 comments on commit 2213bff

Please sign in to comment.