Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
SkShaperPrimitive Class Reference
Inheritance diagram for SkShaperPrimitive:
SkShaper

Public Member Functions

 SkShaperPrimitive ()
 
- Public Member Functions inherited from SkShaper
 SkShaper ()
 
virtual ~SkShaper ()
 

Private Member Functions

void shape (const char *utf8, size_t utf8Bytes, const SkFont &srcFont, bool leftToRight, SkScalar width, RunHandler *) const override
 
void shape (const char *utf8, size_t utf8Bytes, FontRunIterator &, BiDiRunIterator &, ScriptRunIterator &, LanguageRunIterator &, SkScalar width, RunHandler *) const override
 
void shape (const char *utf8, size_t utf8Bytes, FontRunIterator &, BiDiRunIterator &, ScriptRunIterator &, LanguageRunIterator &, const Feature *, size_t featureSize, SkScalar width, RunHandler *) const override
 

Additional Inherited Members

- Static Public Member Functions inherited from SkShaper
static std::unique_ptr< SkShaperMakePrimitive ()
 
static std::unique_ptr< SkShaperMake (sk_sp< SkFontMgr > fallback=nullptr)
 
static void PurgeCaches ()
 
static std::unique_ptr< FontRunIteratorMakeFontMgrRunIterator (const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallback)
 
static std::unique_ptr< SkShaper::FontRunIteratorMakeFontMgrRunIterator (const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallback, const char *requestName, SkFontStyle requestStyle, const SkShaper::LanguageRunIterator *)
 
static std::unique_ptr< BiDiRunIteratorMakeBiDiRunIterator (const char *utf8, size_t utf8Bytes, uint8_t bidiLevel)
 
static std::unique_ptr< ScriptRunIteratorMakeScriptRunIterator (const char *utf8, size_t utf8Bytes, SkFourByteTag script)
 
static std::unique_ptr< LanguageRunIteratorMakeStdLanguageRunIterator (const char *utf8, size_t utf8Bytes)
 

Detailed Description

Definition at line 22 of file SkShaper_primitive.cpp.

Constructor & Destructor Documentation

◆ SkShaperPrimitive()

SkShaperPrimitive::SkShaperPrimitive ( )
inline

Definition at line 24 of file SkShaper_primitive.cpp.

24{}

Member Function Documentation

◆ shape() [1/3]

void SkShaperPrimitive::shape ( const char *  utf8,
size_t  utf8Bytes,
const SkFont srcFont,
bool  leftToRight,
SkScalar  width,
RunHandler handler 
) const
overrideprivatevirtual

Implements SkShaper.

Definition at line 151 of file SkShaper_primitive.cpp.

156 {
157 std::unique_ptr<FontRunIterator> fontRuns(
158 MakeFontMgrRunIterator(utf8, utf8Bytes, font, nullptr));
159 if (!fontRuns) {
160 return;
161 }
162 // bidi, script, and lang are all unused so we can construct them with empty data.
163 TrivialBiDiRunIterator bidi{0, 0};
164 TrivialScriptRunIterator script{0, 0};
165 TrivialLanguageRunIterator lang{nullptr, 0};
166 return this->shape(utf8, utf8Bytes, *fontRuns, bidi, script, lang, nullptr, 0, width, handler);
167}
void shape(const char *utf8, size_t utf8Bytes, const SkFont &srcFont, bool leftToRight, SkScalar width, RunHandler *) const override
static std::unique_ptr< FontRunIterator > MakeFontMgrRunIterator(const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallback)
Definition SkShaper.cpp:187
int32_t width

◆ shape() [2/3]

void SkShaperPrimitive::shape ( const char *  utf8,
size_t  utf8Bytes,
FontRunIterator fontRuns,
BiDiRunIterator ,
ScriptRunIterator ,
LanguageRunIterator ,
const Feature ,
size_t  featureSize,
SkScalar  width,
RunHandler handler 
) const
overrideprivatevirtual

Implements SkShaper.

Definition at line 170 of file SkShaper_primitive.cpp.

179 {
180 SkFont font;
181 if (!fontRuns.atEnd()) {
182 fontRuns.consume();
183 font = fontRuns.currentFont();
184 }
185 SkASSERT(font.getTypeface());
186
187 int glyphCount = font.countText(utf8, utf8Bytes, SkTextEncoding::kUTF8);
188 if (glyphCount < 0) {
189 return;
190 }
191
192 std::unique_ptr<SkGlyphID[]> glyphs(new SkGlyphID[glyphCount]);
193 font.textToGlyphs(utf8, utf8Bytes, SkTextEncoding::kUTF8, glyphs.get(), glyphCount);
194
195 std::unique_ptr<SkScalar[]> advances(new SkScalar[glyphCount]);
196 font.getWidthsBounds(glyphs.get(), glyphCount, advances.get(), nullptr, nullptr);
197
198 size_t glyphOffset = 0;
199 size_t utf8Offset = 0;
200 do {
201 size_t bytesCollapsed;
202 size_t bytesConsumed = linebreak(utf8, utf8 + utf8Bytes, font, width,
203 advances.get() + glyphOffset, &bytesCollapsed);
204 size_t bytesVisible = bytesConsumed - bytesCollapsed;
205
206 size_t numGlyphs = SkUTF::CountUTF8(utf8, bytesVisible);
207 const RunHandler::RunInfo info = {
208 font,
209 0,
210 { font.measureText(utf8, bytesVisible, SkTextEncoding::kUTF8), 0 },
211 numGlyphs,
212 RunHandler::Range(utf8Offset, bytesVisible)
213 };
214 handler->beginLine();
215 if (info.glyphCount) {
216 handler->runInfo(info);
217 }
218 handler->commitRunInfo();
219 if (info.glyphCount) {
220 const auto buffer = handler->runBuffer(info);
221
222 memcpy(buffer.glyphs, glyphs.get() + glyphOffset, info.glyphCount * sizeof(SkGlyphID));
223 SkPoint position = buffer.point;
224 for (size_t i = 0; i < info.glyphCount; ++i) {
225 buffer.positions[i] = position;
226 position.fX += advances[i + glyphOffset];
227 }
228 if (buffer.clusters) {
229 const char* txtPtr = utf8;
230 for (size_t i = 0; i < info.glyphCount; ++i) {
231 // Each character maps to exactly one glyph.
232 buffer.clusters[i] = SkToU32(txtPtr - utf8 + utf8Offset);
233 SkUTF::NextUTF8(&txtPtr, utf8 + utf8Bytes);
234 }
235 }
236 handler->commitRunBuffer(info);
237 }
238 handler->commitLine();
239
240 glyphOffset += SkUTF::CountUTF8(utf8, bytesConsumed);
241 utf8Offset += bytesConsumed;
242 utf8 += bytesConsumed;
243 utf8Bytes -= bytesConsumed;
244 } while (0 < utf8Bytes);
245}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
uint16_t glyphs[5]
#define SkASSERT(cond)
Definition SkAssert.h:116
@ kUTF8
uses bytes to represent UTF-8 or ASCII
static size_t linebreak(const char text[], const char stop[], const SkFont &font, SkScalar width, SkScalar *advance, size_t *trailing)
constexpr uint32_t SkToU32(S x)
Definition SkTo.h:26
uint16_t SkGlyphID
Definition SkTypes.h:179
float SkScalar
Definition extension.cpp:12
static const uint8_t buffer[]
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)
Definition SkUTF.cpp:118
SK_SPI int CountUTF8(const char *utf8, size_t byteLength)
Definition SkUTF.cpp:47
font
Font Metadata and Metrics.
float fX
x-axis value

◆ shape() [3/3]

void SkShaperPrimitive::shape ( const char *  utf8,
size_t  utf8Bytes,
FontRunIterator font,
BiDiRunIterator bidi,
ScriptRunIterator script,
LanguageRunIterator lang,
SkScalar  width,
RunHandler handler 
) const
overrideprivatevirtual

Implements SkShaper.

Definition at line 140 of file SkShaper_primitive.cpp.

147 {
148 return this->shape(utf8, utf8Bytes, font, bidi, script, lang, nullptr, 0, width, handler);
149}

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