aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkGlyphRun.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkGlyphRun.cpp')
-rw-r--r--src/core/SkGlyphRun.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp
index 3548dfa203..e587dc55c6 100644
--- a/src/core/SkGlyphRun.cpp
+++ b/src/core/SkGlyphRun.cpp
@@ -51,6 +51,31 @@ SkGlyphRun::SkGlyphRun(SkPaint&& runPaint,
, fClusters{clusters}
, fRunPaint{std::move(runPaint)} {}
+
+void SkGlyphRun::eachGlyphToGlyphRun(SkGlyphRun::PerGlyph perGlyph) {
+ SkPaint paint{fRunPaint};
+ SkPoint point;
+ SkGlyphID glyphID;
+ SkGlyphRun run{
+ std::move(paint),
+ SkSpan<const uint16_t>{}, // No dense indices for now.
+ SkSpan<const SkPoint>{&point, 1},
+ SkSpan<const SkGlyphID>{&glyphID, 1},
+ SkSpan<const SkGlyphID>{},
+ SkSpan<const char>{},
+ SkSpan<const uint32_t>{}
+ };
+
+ auto runSize = fTemporaryShuntGlyphIDs.size();
+ auto runPaint = run.mutablePaint();
+ for (size_t i = 0; i < runSize; i++) {
+ glyphID = fTemporaryShuntGlyphIDs[i];
+ point = fPositions[i];
+ perGlyph(&run, runPaint);
+ }
+
+}
+
void SkGlyphRun::temporaryShuntToDrawPosText(SkBaseDevice* device, SkPoint origin) {
auto pos = (const SkScalar*) this->positions().data();
@@ -74,6 +99,7 @@ void SkGlyphRun::filloutGlyphsAndPositions(SkGlyphID* glyphIDs, SkPoint* positio
}
// -- SkGlyphRunList -------------------------------------------------------------------------------
+SkGlyphRunList::SkGlyphRunList() = default;
SkGlyphRunList::SkGlyphRunList(
const SkPaint& paint,
const SkTextBlob* blob,
@@ -84,6 +110,12 @@ SkGlyphRunList::SkGlyphRunList(
, fOrigin{origin}
, fGlyphRuns{glyphRunList} { }
+SkGlyphRunList::SkGlyphRunList(SkGlyphRun* glyphRun)
+ : fOriginalPaint{nullptr}
+ , fOriginalTextBlob{nullptr}
+ , fOrigin{SkPoint::Make(0, 0)}
+ , fGlyphRuns{SkSpan<SkGlyphRun>{glyphRun, 1}} {}
+
uint64_t SkGlyphRunList::uniqueID() const {
return fOriginalTextBlob != nullptr ? fOriginalTextBlob->uniqueID()
: SK_InvalidUniqueID;
@@ -166,6 +198,29 @@ SkSpan<const SkGlyphID> SkGlyphIDSet::uniquifyGlyphIDs(
}
// -- SkGlyphRunBuilder ----------------------------------------------------------------------------
+void SkGlyphRunBuilder::drawTextAtOrigin(
+ const SkPaint& paint, const void* bytes, size_t byteLength) {
+ auto glyphIDs = textToGlyphIDs(paint, bytes, byteLength);
+ if (!glyphIDs.empty()) {
+ this->initialize(glyphIDs.size());
+ }
+
+ auto positions = SkSpan<const SkPoint>{fPositions, glyphIDs.size()};
+
+ // Every glyph is at the origin.
+ sk_bzero((void *)positions.data(), positions.size_bytes());
+
+ this->makeGlyphRun(
+ paint,
+ glyphIDs,
+ positions,
+ SkSpan<const uint16_t>{}, // no dense indices for now.,
+ SkSpan<const SkGlyphID>{},
+ SkSpan<const char>{},
+ SkSpan<const uint32_t>{});
+ this->makeGlyphRunList(paint, nullptr, SkPoint::Make(0, 0));
+}
+
void SkGlyphRunBuilder::drawText(
const SkPaint& paint, const void* bytes, size_t byteLength, SkPoint origin) {
auto glyphIDs = textToGlyphIDs(paint, bytes, byteLength);