Lines Matching refs:run
52 if (textSize) { // Extended run.
67 const SkTextBlob::RunRecord* SkTextBlob::RunRecord::Next(const RunRecord* run) {
68 return SkToBool(run->fFlags & kLast_Flag) ? nullptr : NextUnchecked(run);
98 const SkTextBlob::RunRecord* SkTextBlob::RunRecord::NextUnchecked(const RunRecord* run) {
101 reinterpret_cast<const uint8_t*>(run)
102 + StorageSize(run->glyphCount(), run->textSize(), run->positioning(), &safe));
156 const auto* run = RunRecord::First(this);
158 const auto* nextRun = RunRecord::Next(run);
159 SkDEBUGCODE(run->validate((uint8_t*)this + fStorageSize);)
160 run->~RunRecord();
161 run = nextRun;
162 } while (run);
267 SkRect SkTextBlobBuilder::TightRunBounds(const SkTextBlob::RunRecord& run) {
268 const SkFont& font = run.font();
271 if (SkTextBlob::kDefault_Positioning == run.positioning()) {
272 font.measureText(run.glyphBuffer(), run.glyphCount() * sizeof(uint16_t),
274 return bounds.makeOffset(run.offset().x(), run.offset().y());
277 SkAutoSTArray<16, SkRect> glyphBounds(run.glyphCount());
278 font.getBounds(run.glyphBuffer(), run.glyphCount(), glyphBounds.get(), nullptr);
280 if (SkTextBlob::kRSXform_Positioning == run.positioning()) {
282 const SkRSXform* xform = run.xformBuffer();
283 SkASSERT((void*)(xform + run.glyphCount()) <= SkTextBlob::RunRecord::Next(&run));
284 for (unsigned i = 0; i < run.glyphCount(); ++i) {
288 SkASSERT(SkTextBlob::kFull_Positioning == run.positioning() ||
289 SkTextBlob::kHorizontal_Positioning == run.positioning());
292 // (const y applied by runBounds.offset(run->offset()) later)
294 const SkScalar* glyphPosX = run.posBuffer();
295 const SkScalar* glyphPosY = (run.positioning() == SkTextBlob::kFull_Positioning) ?
297 const unsigned posXInc = SkTextBlob::ScalarsPerGlyph(run.positioning());
298 const unsigned posYInc = (run.positioning() == SkTextBlob::kFull_Positioning) ?
302 for (unsigned i = 0; i < run.glyphCount(); ++i) {
308 SkASSERT((void*)glyphPosX <= SkTextBlob::RunRecord::Next(&run));
310 return bounds.makeOffset(run.offset().x(), run.offset().y());
313 SkRect SkTextBlobBuilder::ConservativeRunBounds(const SkTextBlob::RunRecord& run) {
314 SkASSERT(run.glyphCount() > 0);
315 SkASSERT(SkTextBlob::kFull_Positioning == run.positioning() ||
316 SkTextBlob::kHorizontal_Positioning == run.positioning() ||
317 SkTextBlob::kRSXform_Positioning == run.positioning());
319 const SkRect fontBounds = SkFontPriv::GetFontBounds(run.font());
323 return TightRunBounds(run);
328 switch (run.positioning()) {
330 const SkScalar* glyphPos = run.posBuffer();
331 SkASSERT((void*)(glyphPos + run.glyphCount()) <= SkTextBlob::RunRecord::Next(&run));
335 for (unsigned i = 1; i < run.glyphCount(); ++i) {
344 const SkPoint* glyphPosPts = run.pointBuffer();
345 SkASSERT((void*)(glyphPosPts + run.glyphCount()) <= SkTextBlob::RunRecord::Next(&run));
347 bounds.setBounds(glyphPosPts, run.glyphCount());
350 const SkRSXform* xform = run.xformBuffer();
351 SkASSERT((void*)(xform + run.glyphCount()) <= SkTextBlob::RunRecord::Next(&run));
353 for (unsigned i = 0; i < run.glyphCount(); ++i) {
361 if (run.positioning() != SkTextBlob::kRSXform_Positioning) {
369 // Offset by run position.
370 return bounds.makeOffset(run.offset().x(), run.offset().y());
381 SkTextBlob::RunRecord* run = reinterpret_cast<SkTextBlob::RunRecord*>(fStorage.get() +
385 SkRect runBounds = SkTextBlob::kDefault_Positioning == run->positioning() ?
386 TightRunBounds(*run) : ConservativeRunBounds(*run);
424 SkTextBlob::RunRecord* run = reinterpret_cast<SkTextBlob::RunRecord*>(fStorage.get() +
426 SkASSERT(run->glyphCount() > 0);
428 if (run->textSize() != 0) {
432 if (run->positioning() != positioning
433 || run->font() != font
434 || (run->glyphCount() + count < run->glyphCount())) {
439 // * fully positioned run following another fully positioned run
440 // * horizontally postioned run following another horizontally positioned run with the same
444 || run->offset().y() != offset.y())) {
450 SkTextBlob::RunRecord::StorageSize(run->glyphCount() + count, 0, positioning, &safe) -
451 SkTextBlob::RunRecord::StorageSize(run->glyphCount() , 0, positioning, &safe);
459 run = reinterpret_cast<SkTextBlob::RunRecord*>(fStorage.get() + fLastRun);
460 uint32_t preMergeCount = run->glyphCount();
461 run->grow(count);
464 fCurrentRunBuffer.glyphs = run->glyphBuffer() + preMergeCount;
465 fCurrentRunBuffer.pos = run->posBuffer()
471 run->validate(fStorage.get() + fStorageUsed);
500 SkTextBlob::RunRecord* run = new (fStorage.get() + fStorageUsed)
502 fCurrentRunBuffer.glyphs = run->glyphBuffer();
503 fCurrentRunBuffer.pos = run->posBuffer();
504 fCurrentRunBuffer.utf8text = run->textBuffer();
505 fCurrentRunBuffer.clusters = run->clusterBuffer();
512 run->validate(fStorage.get() + fStorageUsed);
618 // Tag the last run as such.
628 for (const auto* run = SkTextBlob::RunRecord::First(blob); run;
629 run = SkTextBlob::RunRecord::Next(run)) {
631 run->fCount, run->textSize(), run->positioning(), &safe);
632 run->validate(reinterpret_cast<const uint8_t*>(blob) + fStorageUsed);
689 // Marker for the last run (0 is not a valid glyph count).
723 // a run before allocating it.
958 const SkGlyphRun run(*this,
965 intervalCount = get_glyph_run_intercepts(run, paint, bounds, result.data(), &intervalCount);
1050 SkTextBlobRunIterator run(blob);
1051 if (!run.done()) {
1052 const auto glyphCount = run.glyphCount();
1053 switch (run.positioning()) {
1056 const SkPoint* glyphPoints = run.points();
1065 run.next();