Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dftext.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm/gm.h"
12#include "include/core/SkFont.h"
19#include "include/core/SkRect.h"
22#include "include/core/SkSize.h"
33#include "tools/ToolUtils.h"
35
36#include <string.h>
37
38using namespace skia_private;
39
40class DFTextGM : public skiagm::GM {
41public:
43 this->setBGColor(0xFFFFFFFF);
44 }
45
46protected:
47 void onOnceBeforeDraw() override { fEmojiSample = ToolUtils::EmojiSample(); }
48
49 SkString getName() const override { return SkString("dftext"); }
50
51 SkISize getISize() override { return SkISize::Make(1024, 768); }
52
53 void onDraw(SkCanvas* inputCanvas) override {
54 SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f };
55 SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f };
56
57 // set up offscreen rendering with distance field text
58 auto ctx = inputCanvas->recordingContext();
59 SkISize size = getISize();
60 SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType,
61 inputCanvas->imageInfo().refColorSpace());
62 SkSurfaceProps inputProps;
63 inputCanvas->getProps(&inputProps);
65 inputProps.pixelGeometry());
67 SkCanvas* canvas = surface ? surface->getCanvas() : inputCanvas;
68 // init our new canvas with the old canvas's matrix
69 canvas->setMatrix(inputCanvas->getLocalToDeviceAs3x3());
70 // apply global scale to test glyph positioning
71 canvas->scale(1.05f, 1.05f);
72 canvas->clear(0xffffffff);
73
75 paint.setAntiAlias(true);
76
78 font.setSubpixel(true);
79
80 const char* text = "Hamburgefons";
81 const size_t textLen = strlen(text);
82
83 // check scaling up
86 for (size_t i = 0; i < std::size(textSizes); ++i) {
87 SkAutoCanvasRestore acr(canvas, true);
88 canvas->translate(x, y);
89 canvas->scale(scales[i], scales[i]);
90 font.setSize(textSizes[i]);
91 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint);
92 y += font.getMetrics(nullptr)*scales[i];
93 }
94
95 // check rotation
96 for (size_t i = 0; i < 5; ++i) {
97 SkScalar rotX = SkIntToScalar(10);
98 SkScalar rotY = y;
99
100 SkAutoCanvasRestore acr(canvas, true);
101 canvas->translate(SkIntToScalar(10 + i * 200), -80);
102 canvas->rotate(SkIntToScalar(i * 5), rotX, rotY);
103 for (int ps = 6; ps <= 32; ps += 3) {
104 font.setSize(SkIntToScalar(ps));
105 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, rotX, rotY, font, paint);
106 rotY += font.getMetrics(nullptr);
107 }
108 }
109
110 // check scaling down
112 x = SkIntToScalar(680);
113 y = SkIntToScalar(20);
114 size_t arraySize = std::size(textSizes);
115 for (size_t i = 0; i < arraySize; ++i) {
116 SkAutoCanvasRestore acr(canvas, true);
117 canvas->translate(x, y);
118 SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]);
119 canvas->scale(scaleFactor, scaleFactor);
120 font.setSize(textSizes[i]);
121 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint);
122 y += font.getMetrics(nullptr)*scaleFactor;
123 }
124
125 // check pos text
126 {
127 SkAutoCanvasRestore acr(canvas, true);
128
129 canvas->scale(2.0f, 2.0f);
130
132 int count = font.textToGlyphs(text, textLen, SkTextEncoding::kUTF8, glyphs.get(), textLen);
134 font.setSize(textSizes[0]);
135 font.getPos(glyphs.get(), count, pos.get(), {340, 75});
136
137 auto blob = SkTextBlob::MakeFromPosText(glyphs.get(), count * sizeof(SkGlyphID),
138 pos.get(), font, SkTextEncoding::kGlyphID);
139 canvas->drawTextBlob(blob, 0, 0, paint);
140 }
141
142
143 // check gamma-corrected blending
144 const SkColor fg[] = {
145 0xFFFFFFFF,
146 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,
147 0xFFFF0000, 0xFF00FF00, 0xFF0000FF,
148 0xFF000000,
149 };
150
151 paint.setColor(0xFFF7F3F7);
152 SkRect r = SkRect::MakeLTRB(670, 215, 820, 397);
153 canvas->drawRect(r, paint);
154
155 x = SkIntToScalar(680);
156 y = SkIntToScalar(235);
157 font.setSize(SkIntToScalar(19));
158 for (size_t i = 0; i < std::size(fg); ++i) {
159 paint.setColor(fg[i]);
160
161 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, x, y, font, paint);
162 y += font.getMetrics(nullptr);
163 }
164
165 paint.setColor(0xFF181C18);
166 r = SkRect::MakeLTRB(820, 215, 970, 397);
167 canvas->drawRect(r, paint);
168
169 x = SkIntToScalar(830);
170 y = SkIntToScalar(235);
171 font.setSize(SkIntToScalar(19));
172 for (size_t i = 0; i < std::size(fg); ++i) {
173 paint.setColor(fg[i]);
174
175 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, x, y, font, paint);
176 y += font.getMetrics(nullptr);
177 }
178
179 // check skew
180 {
181 font.setEdging(SkFont::Edging::kAntiAlias);
182 SkAutoCanvasRestore acr(canvas, true);
183 canvas->skew(0.0f, 0.151515f);
184 font.setSize(SkIntToScalar(32));
185 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 745, 70, font, paint);
186 }
187 {
189 SkAutoCanvasRestore acr(canvas, true);
190 canvas->skew(0.5f, 0.0f);
191 font.setSize(SkIntToScalar(32));
192 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 580, 125, font, paint);
193 }
194
195 // check perspective
196 {
197 font.setEdging(SkFont::Edging::kAntiAlias);
198 SkAutoCanvasRestore acr(canvas, true);
199 SkMatrix persp;
200 persp.setAll(0.9839f, 0, 0,
201 0.2246f, 0.6829f, 0,
202 0.0002352f, -0.0003844f, 1);
203 canvas->concat(persp);
204 canvas->translate(1100, -295);
205 font.setSize(37.5f);
206 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint);
207 }
208 {
209 font.setSubpixel(false);
210 font.setEdging(SkFont::Edging::kAlias);
211 SkAutoCanvasRestore acr(canvas, true);
212 SkMatrix persp;
213 persp.setAll(0.9839f, 0, 0,
214 0.2246f, 0.6829f, 0,
215 0.0002352f, -0.0003844f, 1);
216 canvas->concat(persp);
217 canvas->translate(1075, -245);
218 canvas->scale(375, 375);
219 font.setSize(0.1f);
220 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint);
221 }
222
223 // check color emoji
224 if (fEmojiSample.typeface) {
225 SkFont emojiFont;
226 emojiFont.setSubpixel(true);
227 emojiFont.setTypeface(fEmojiSample.typeface);
228 emojiFont.setSize(SkIntToScalar(19));
229 canvas->drawSimpleText(fEmojiSample.sampleText,
230 strlen(fEmojiSample.sampleText),
232 670,
233 90,
234 emojiFont,
235 paint);
236 }
237
238 // render offscreen buffer
239 if (surface) {
240 SkAutoCanvasRestore acr(inputCanvas, true);
241 // since we prepended this matrix already, we blit using identity
242 inputCanvas->resetMatrix();
243 inputCanvas->drawImage(surface->makeImageSnapshot().get(), 0, 0);
244 }
245 }
246
247private:
248 ToolUtils::EmojiTestSample fEmojiSample;
249
250 using INHERITED = skiagm::GM;
251};
252
253DEF_GM(return new DFTextGM;)
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
uint16_t glyphs[5]
int count
SkPoint pos
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition SkAlphaType.h:29
uint32_t SkColor
Definition SkColor.h:37
@ kUTF8
uses bytes to represent UTF-8 or ASCII
@ kGlyphID
uses two byte words to represent glyph indices
#define SkScalarInvert(x)
Definition SkScalar.h:73
#define SkIntToScalar(x)
Definition SkScalar.h:57
constexpr int SkToInt(S x)
Definition SkTo.h:29
uint16_t SkGlyphID
Definition SkTypes.h:179
void onDraw(SkCanvas *inputCanvas) override
Definition dftext.cpp:53
SkString getName() const override
Definition dftext.cpp:49
void onOnceBeforeDraw() override
Definition dftext.cpp:47
DFTextGM()
Definition dftext.cpp:42
SkISize getISize() override
Definition dftext.cpp:51
bool getProps(SkSurfaceProps *props) const
void drawRect(const SkRect &rect, const SkPaint &paint)
void drawSimpleText(const void *text, size_t byteLength, SkTextEncoding encoding, SkScalar x, SkScalar y, const SkFont &font, const SkPaint &paint)
void translate(SkScalar dx, SkScalar dy)
SkMatrix getLocalToDeviceAs3x3() const
Definition SkCanvas.h:2222
virtual GrRecordingContext * recordingContext() const
void clear(SkColor color)
Definition SkCanvas.h:1199
void rotate(SkScalar degrees)
void resetMatrix()
void setMatrix(const SkM44 &matrix)
void scale(SkScalar sx, SkScalar sy)
void concat(const SkMatrix &matrix)
SkImageInfo imageInfo() const
void skew(SkScalar sx, SkScalar sy)
void drawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint)
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
void setSubpixel(bool subpixel)
Definition SkFont.cpp:109
void setTypeface(sk_sp< SkTypeface > tf)
Definition SkFont.cpp:90
void setSize(SkScalar textSize)
Definition SkFont.cpp:129
@ kAntiAlias
may have transparent pixels on glyph edges
@ kAlias
no transparent pixels on glyph edges
@ kSubpixelAntiAlias
glyph positioned in pixel using transparency
SkMatrix & setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar persp0, SkScalar persp1, SkScalar persp2)
Definition SkMatrix.h:562
@ kUseDeviceIndependentFonts_Flag
uint32_t flags() const
SkPixelGeometry pixelGeometry() const
static sk_sp< SkTextBlob > MakeFromPosText(const void *text, size_t byteLength, const SkPoint pos[], const SkFont &font, SkTextEncoding encoding=SkTextEncoding::kUTF8)
void setBGColor(SkColor)
Definition gm.cpp:159
const Paint & paint
VkSurfaceKHR surface
Definition main.cc:49
float SkScalar
Definition extension.cpp:12
#define DEF_GM(CODE)
Definition gm.h:40
std::u16string text
double y
double x
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
sk_sp< SkTypeface > CreatePortableTypeface(const char *name, SkFontStyle style)
EmojiTestSample EmojiSample()
static constexpr SkISize Make(int32_t w, int32_t h)
Definition SkSize.h:20
sk_sp< SkColorSpace > refColorSpace() const
static SkImageInfo MakeN32(int width, int height, SkAlphaType at)
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
Definition SkRect.h:646
sk_sp< SkTypeface > typeface