94 {
97
98 fTestDataIterator.
rewind();
100
106
107 if (!testTypeface || !ftTypeface) {
108 *errorMsg = "Unable to initialize typeface.";
110 }
111
115 font.setSubpixel(
true);
117 };
118
120 configureFont(font);
121
122 SkFont ftFont(ftTypeface);
123 configureFont(ftFont);
124 enum class DrawPhase { Fontations, FreeType, Comparison };
125
127 for (auto phase : {DrawPhase::Fontations, DrawPhase::FreeType, DrawPhase::Comparison}) {
129
130 for (
auto& langEntry :
testSet.langSamples) {
131 auto shapeAndDrawToCanvas = [canvas,
paint, langEntry](
const SkFont&
font,
133 std::string testString(langEntry.sampleShort.c_str(),
134 langEntry.sampleShort.size());
137 shaper->shape(testString.c_str(),
138 testString.size(),
139 font,
140 true,
141 999999,
142 &textBlobBuilder);
145 return blob->bounds();
146 };
147
148 auto roundToDevicePixels = [canvas](
SkPoint& point) {
154 bool inverseExists = ctm.
invert(&inverse);
156 if (inverseExists) {
157 point = inverse.
mapPoint(mappedRounded);
158 }
159 };
160
161 auto fontationsCoord = [yCoord, roundToDevicePixels]() {
163 roundToDevicePixels(fontationsCoord);
164 return fontationsCoord;
165 };
166
167 auto freetypeCoord = [yCoord, maxBounds, roundToDevicePixels]() {
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
179 maxBounds.join(boundsFontations);
180 break;
181 }
182 case DrawPhase::FreeType: {
183 shapeAndDrawToCanvas(ftFont, freetypeCoord());
184 break;
185 }
186 case DrawPhase::Comparison: {
187
188
189
190
191
192 SkPoint copyBoxFontationsCoord = fontationsCoord();
193 SkPoint copyBoxFreetypeCoord = freetypeCoord();
194 SkRect copyBoxFontations(maxBounds);
195 copyBoxFontations.roundOut(©BoxFontations);
196 SkRect copyBoxFreetype(copyBoxFontations);
197 copyBoxFontations.offset(copyBoxFontationsCoord.
x(),
198 copyBoxFontationsCoord.
y());
199 copyBoxFreetype.offset(copyBoxFreetypeCoord.
x(),
200 copyBoxFreetypeCoord.
y());
201
203 ctm.
mapRect(©BoxFontations, copyBoxFontations);
204 ctm.
mapRect(©BoxFreetype, copyBoxFreetype);
205
206 SkISize pixelDimensions(copyBoxFontations.roundOut().size());
212
213 SkBitmap fontationsBitmap, freetypeBitmap, diffBitmap,
214 highlightDiffBitmap;
219
221 fontationsBitmap, copyBoxFontations.x(), copyBoxFontations.y());
223 freetypeBitmap, copyBoxFreetype.x(), copyBoxFreetype.y());
224
225 comparePixels(fontationsBitmap,
226 freetypeBitmap,
227 &diffBitmap,
228 &highlightDiffBitmap);
229
230
231
233 3 *
kMargin + maxBounds.width() * 2, yCoord + maxBounds.top()));
235 4 *
kMargin + maxBounds.width() * 3, yCoord + maxBounds.top()));
236
238 diffBitmap, comparisonCoord.
x(), comparisonCoord.
y());
240 highlightDiffBitmap, whiteCoord.
x(), whiteCoord.
y());
241 break;
242 }
243 }
244
245 yCoord +=
font.getSize() * kLangYIncrementScale;
246 }
247 }
248 }
249
251 }
constexpr SkColor SK_ColorBLACK
@ kNone
glyph outlines unchanged
SK_API sk_sp< SkTypeface > SkTypeface_Make_Fontations(std::unique_ptr< SkStreamAsset > fontData, const SkFontArguments &args)
void allocPixels(const SkImageInfo &info, size_t rowBytes)
SkMatrix getLocalToDeviceAs3x3() const
bool writePixels(const SkImageInfo &info, const void *pixels, size_t rowBytes, int x, int y)
SkImageInfo imageInfo() const
bool readPixels(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRowBytes, int srcX, int srcY)
void drawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint)
@ kSubpixelAntiAlias
glyph positioned in pixel using transparency
SkPoint mapPoint(SkPoint pt) const
bool invert(SkMatrix *inverse) const
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
static std::unique_ptr< SkShaper > Make(sk_sp< SkFontMgr > fallback=nullptr)
static std::unique_ptr< SkStreamAsset > MakeFromFile(const char path[])
static sk_sp< SkTypeface > MakeFromStream(std::unique_ptr< SkStreamAsset >, const SkFontArguments &)
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()
void roundOut(SkIRect *dst) const