Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | List of all members
skiagm::FontationsFtCompareGM Class Reference
Inheritance diagram for skiagm::FontationsFtCompareGM:
skiagm::GM

Public Member Functions

 FontationsFtCompareGM (std::string testName, std::string fontNameFilterRegexp, std::string langFilterRegexp)
 
- Public Member Functions inherited from skiagm::GM
 GM (SkColor backgroundColor=SK_ColorWHITE)
 
virtual ~GM ()
 
void setMode (Mode mode)
 
Mode getMode () const
 
DrawResult gpuSetup (SkCanvas *, SkString *errorMsg, GraphiteTestContext *=nullptr)
 
void gpuTeardown ()
 
void onceBeforeDraw ()
 
DrawResult draw (SkCanvas *canvas)
 
DrawResult draw (SkCanvas *, SkString *errorMsg)
 
void drawBackground (SkCanvas *)
 
DrawResult drawContent (SkCanvas *canvas)
 
DrawResult drawContent (SkCanvas *, SkString *errorMsg)
 
virtual bool runAsBench () const
 
SkScalar width ()
 
SkScalar height ()
 
SkColor getBGColor () const
 
void setBGColor (SkColor)
 
void drawSizeBounds (SkCanvas *, SkColor)
 
bool animate (double)
 
virtual bool onChar (SkUnichar)
 
bool getControls (SkMetaData *controls)
 
void setControls (const SkMetaData &controls)
 
virtual void modifyGrContextOptions (GrContextOptions *)
 
virtual void modifyGraphiteContextOptions (skgpu::graphite::ContextOptions *) const
 
virtual bool isBazelOnly () const
 
virtual std::map< std::string, std::string > getGoldKeys () const
 

Protected Member Functions

SkString getName () const override
 
SkISize getISize () override
 
DrawResult onDraw (SkCanvas *canvas, SkString *errorMsg) override
 
- Protected Member Functions inherited from skiagm::GM
virtual DrawResult onGpuSetup (SkCanvas *, SkString *, GraphiteTestContext *)
 
virtual void onGpuTeardown ()
 
virtual void onOnceBeforeDraw ()
 
virtual void onDraw (SkCanvas *)
 
virtual bool onAnimate (double)
 
virtual bool onGetControls (SkMetaData *)
 
virtual void onSetControls (const SkMetaData &)
 
GraphiteTestContextgraphiteTestContext () const
 

Additional Inherited Members

- Public Types inherited from skiagm::GM
enum  Mode { kGM_Mode , kSample_Mode , kBench_Mode }
 
using DrawResult = skiagm::DrawResult
 
using GraphiteTestContext = skiatest::graphite::GraphiteTestContext
 
- Static Public Attributes inherited from skiagm::GM
static constexpr char kErrorMsg_DrawSkippedGpuOnly []
 

Detailed Description

Definition at line 70 of file fontations_ft_compare.cpp.

Constructor & Destructor Documentation

◆ FontationsFtCompareGM()

skiagm::FontationsFtCompareGM::FontationsFtCompareGM ( std::string  testName,
std::string  fontNameFilterRegexp,
std::string  langFilterRegexp 
)
inline

Definition at line 72 of file fontations_ft_compare.cpp.

75 : fTestDataIterator(fontNameFilterRegexp, langFilterRegexp)
76 , fTestName(testName.c_str()) {
78 }
constexpr SkColor SK_ColorWHITE
Definition SkColor.h:122
void setBGColor(SkColor)
Definition gm.cpp:159

Member Function Documentation

◆ getISize()

SkISize skiagm::FontationsFtCompareGM::getISize ( )
inlineoverrideprotectedvirtual

Implements skiagm::GM.

Definition at line 85 of file fontations_ft_compare.cpp.

85 {
87 fTestDataIterator.rewind();
88 fTestDataIterator.next(&testSet);
89
90 return SkISize::Make(kGmWidth,
91 testSet.langSamples.size() * kFontSize * kLangYIncrementScale + 100);
92 }
static const ConicPts testSet[]
bool next(TestSet *testSet)
static constexpr SkISize Make(int32_t w, int32_t h)
Definition SkSize.h:20

◆ getName()

SkString skiagm::FontationsFtCompareGM::getName ( ) const
inlineoverrideprotectedvirtual

Implements skiagm::GM.

Definition at line 81 of file fontations_ft_compare.cpp.

81 {
82 return SkStringPrintf("fontations_compare_ft_%s", fTestName.c_str());
83 }
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
const char * c_str() const
Definition SkString.h:133

◆ onDraw()

DrawResult skiagm::FontationsFtCompareGM::onDraw ( SkCanvas canvas,
SkString errorMsg 
)
inlineoverrideprotectedvirtual

Reimplemented from skiagm::GM.

Definition at line 94 of file fontations_ft_compare.cpp.

94 {
96 paint.setColor(SK_ColorBLACK);
97
98 fTestDataIterator.rewind();
100
101 while (fTestDataIterator.next(&testSet)) {
103 SkStream::MakeFromFile(testSet.fontFilename.c_str()), SkFontArguments());
105 SkStream::MakeFromFile(testSet.fontFilename.c_str()), SkFontArguments());
106
107 if (!testTypeface || !ftTypeface) {
108 *errorMsg = "Unable to initialize typeface.";
109 return DrawResult::kSkip;
110 }
111
112 auto configureFont = [](SkFont& font) {
113 font.setSize(kFontSize);
115 font.setSubpixel(true);
116 font.setHinting(SkFontHinting::kNone);
117 };
118
119 SkFont font(testTypeface);
120 configureFont(font);
121
122 SkFont ftFont(ftTypeface);
123 configureFont(ftFont);
124 enum class DrawPhase { Fontations, FreeType, Comparison };
125
126 SkRect maxBounds = SkRect::MakeEmpty();
127 for (auto phase : {DrawPhase::Fontations, DrawPhase::FreeType, DrawPhase::Comparison}) {
128 SkScalar yCoord = kFontSize * 1.5f;
129
130 for (auto& langEntry : testSet.langSamples) {
131 auto shapeAndDrawToCanvas = [canvas, paint, langEntry](const SkFont& font,
132 SkPoint coord) {
133 std::string testString(langEntry.sampleShort.c_str(),
134 langEntry.sampleShort.size());
135 SkTextBlobBuilderRunHandler textBlobBuilder(testString.c_str(), {0, 0});
136 std::unique_ptr<SkShaper> shaper = SkShaper::Make();
137 shaper->shape(testString.c_str(),
138 testString.size(),
139 font,
140 true,
141 999999, /* Don't linebreak. */
142 &textBlobBuilder);
143 sk_sp<const SkTextBlob> blob = textBlobBuilder.makeBlob();
144 canvas->drawTextBlob(blob.get(), coord.x(), coord.y(), paint);
145 return blob->bounds();
146 };
147
148 auto roundToDevicePixels = [canvas](SkPoint& point) {
149 SkMatrix ctm = canvas->getLocalToDeviceAs3x3();
150 SkPoint mapped = ctm.mapPoint(point);
151 SkPoint mappedRounded =
152 SkPoint::Make(roundf(mapped.x()), roundf(mapped.y()));
153 SkMatrix inverse;
154 bool inverseExists = ctm.invert(&inverse);
155 SkASSERT(inverseExists);
156 if (inverseExists) {
157 point = inverse.mapPoint(mappedRounded);
158 }
159 };
160
161 auto fontationsCoord = [yCoord, roundToDevicePixels]() {
162 SkPoint fontationsCoord = SkPoint::Make(kMargin, yCoord);
163 roundToDevicePixels(fontationsCoord);
164 return fontationsCoord;
165 };
166
167 auto freetypeCoord = [yCoord, maxBounds, roundToDevicePixels]() {
168 SkPoint freetypeCoord = SkPoint::Make(
169 2 * kMargin + maxBounds.left() + maxBounds.width(), yCoord);
170 roundToDevicePixels(freetypeCoord);
171 return freetypeCoord;
172 };
173
174 switch (phase) {
175 case DrawPhase::Fontations: {
176 SkRect boundsFontations = shapeAndDrawToCanvas(font, fontationsCoord());
177 /* Determine maximum of column width across all language samples. */
178 boundsFontations.roundOut();
179 maxBounds.join(boundsFontations);
180 break;
181 }
182 case DrawPhase::FreeType: {
183 shapeAndDrawToCanvas(ftFont, freetypeCoord());
184 break;
185 }
186 case DrawPhase::Comparison: {
187 /* Read back pixels from equally sized rectangles from the space in
188 * SkCanvas where Fontations and FreeType sample texts were drawn,
189 * compare them using pixel comparisons similar to SkDiff, draw a
190 * comparison as faint pixel differences, and as an amplified
191 * visualization in which each differing pixel is drawn as white. */
192 SkPoint copyBoxFontationsCoord = fontationsCoord();
193 SkPoint copyBoxFreetypeCoord = freetypeCoord();
194 SkRect copyBoxFontations(maxBounds);
195 copyBoxFontations.roundOut(&copyBoxFontations);
196 SkRect copyBoxFreetype(copyBoxFontations);
197 copyBoxFontations.offset(copyBoxFontationsCoord.x(),
198 copyBoxFontationsCoord.y());
199 copyBoxFreetype.offset(copyBoxFreetypeCoord.x(),
200 copyBoxFreetypeCoord.y());
201
202 SkMatrix ctm = canvas->getLocalToDeviceAs3x3();
203 ctm.mapRect(&copyBoxFontations, copyBoxFontations);
204 ctm.mapRect(&copyBoxFreetype, copyBoxFreetype);
205
206 SkISize pixelDimensions(copyBoxFontations.roundOut().size());
207 SkImageInfo canvasImageInfo = canvas->imageInfo();
208 SkImageInfo copyImageInfo =
209 SkImageInfo::Make(pixelDimensions,
210 canvasImageInfo.colorType(),
211 canvasImageInfo.alphaType());
212
213 SkBitmap fontationsBitmap, freetypeBitmap, diffBitmap,
214 highlightDiffBitmap;
215 fontationsBitmap.allocPixels(copyImageInfo, 0);
216 freetypeBitmap.allocPixels(copyImageInfo, 0);
217 diffBitmap.allocPixels(copyImageInfo, 0);
218 highlightDiffBitmap.allocPixels(copyImageInfo, 0);
219
220 canvas->readPixels(
221 fontationsBitmap, copyBoxFontations.x(), copyBoxFontations.y());
222 canvas->readPixels(
223 freetypeBitmap, copyBoxFreetype.x(), copyBoxFreetype.y());
224
225 comparePixels(fontationsBitmap,
226 freetypeBitmap,
227 &diffBitmap,
228 &highlightDiffBitmap);
229
230 /* Place comparison results as two extra columns, shift up to account
231 for placement of rectangles vs. SkTextBlobs (baseline shift). */
232 SkPoint comparisonCoord = ctm.mapPoint(SkPoint::Make(
233 3 * kMargin + maxBounds.width() * 2, yCoord + maxBounds.top()));
234 SkPoint whiteCoord = ctm.mapPoint(SkPoint::Make(
235 4 * kMargin + maxBounds.width() * 3, yCoord + maxBounds.top()));
236
237 canvas->writePixels(
238 diffBitmap, comparisonCoord.x(), comparisonCoord.y());
239 canvas->writePixels(
240 highlightDiffBitmap, whiteCoord.x(), whiteCoord.y());
241 break;
242 }
243 }
244
245 yCoord += font.getSize() * kLangYIncrementScale;
246 }
247 }
248 }
249
250 return DrawResult::kOk;
251 }
#define SkASSERT(cond)
Definition SkAssert.h:116
constexpr SkColor SK_ColorBLACK
Definition SkColor.h:103
@ kNone
glyph outlines unchanged
SK_API sk_sp< SkTypeface > SkTypeface_Make_Fontations(std::unique_ptr< SkStreamAsset > fontData, const SkFontArguments &args)
@ kMargin
void allocPixels(const SkImageInfo &info, size_t rowBytes)
Definition SkBitmap.cpp:258
SkMatrix getLocalToDeviceAs3x3() const
Definition SkCanvas.h:2222
bool writePixels(const SkImageInfo &info, const void *pixels, size_t rowBytes, int x, int y)
Definition SkCanvas.cpp:403
SkImageInfo imageInfo() const
bool readPixels(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRowBytes, int srcX, int srcY)
Definition SkCanvas.cpp:386
void drawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint)
@ kSubpixelAntiAlias
glyph positioned in pixel using transparency
SkPoint mapPoint(SkPoint pt) const
Definition SkMatrix.h:1374
bool invert(SkMatrix *inverse) const
Definition SkMatrix.h:1206
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
static std::unique_ptr< SkShaper > Make(sk_sp< SkFontMgr > fallback=nullptr)
Definition SkShaper.cpp:36
static std::unique_ptr< SkStreamAsset > MakeFromFile(const char path[])
Definition SkStream.cpp:922
static sk_sp< SkTypeface > MakeFromStream(std::unique_ptr< SkStreamAsset >, const SkFontArguments &)
T * get() const
Definition SkRefCnt.h:303
const Paint & paint
float SkScalar
Definition extension.cpp:12
font
Font Metadata and Metrics.
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
SkAlphaType alphaType() const
SkColorType colorType() const
static constexpr SkPoint Make(float x, float y)
constexpr float y() const
constexpr float x() const
static constexpr SkRect MakeEmpty()
Definition SkRect.h:595
void roundOut(SkIRect *dst) const
Definition SkRect.h:1241

The documentation for this class was generated from the following file: