aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkClusterator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf/SkClusterator.cpp')
-rw-r--r--src/pdf/SkClusterator.cpp98
1 files changed, 13 insertions, 85 deletions
diff --git a/src/pdf/SkClusterator.cpp b/src/pdf/SkClusterator.cpp
index 6c56eb6b45..1b74d38f11 100644
--- a/src/pdf/SkClusterator.cpp
+++ b/src/pdf/SkClusterator.cpp
@@ -7,6 +7,7 @@
#include "SkClusterator.h"
+#include "SkGlyphRun.h"
#include "SkTo.h"
#include "SkUtils.h"
@@ -24,90 +25,18 @@ static bool is_reversed(const uint32_t* clusters, uint32_t count) {
return true;
}
-SkClusterator::SkClusterator(const void* sourceText,
- size_t sourceByteCount,
- const SkPaint& paint,
- const uint32_t* clusters,
- uint32_t utf8TextByteLength,
- const char* utf8Text) {
- if (SkPaint::kGlyphID_TextEncoding == paint.getTextEncoding()) {
- fGlyphs = reinterpret_cast<const SkGlyphID*>(sourceText);
- fClusters = clusters;
- fUtf8Text = utf8Text;
- fGlyphCount = sourceByteCount / sizeof(SkGlyphID);
- fTextByteLength = utf8TextByteLength;
- if (fClusters) {
- SkASSERT(fUtf8Text && fTextByteLength > 0 && fGlyphCount > 0);
- fReversedChars = is_reversed(fClusters, fGlyphCount);
- } else {
- SkASSERT(!fUtf8Text && fTextByteLength == 0);
- }
- return;
- }
-
- // If Skia is given text (not glyphs), then our fallback primitive shaping will
- // produce a simple 1-1 cluster mapping.
- fGlyphCount = SkToU32(paint.textToGlyphs(sourceText, sourceByteCount, nullptr));
- fGlyphStorage.resize(fGlyphCount);
- (void)paint.textToGlyphs(sourceText, sourceByteCount, fGlyphStorage.data());
- fGlyphs = fGlyphStorage.data();
- fClusterStorage.resize(fGlyphCount);
- fClusters = fClusterStorage.data();
-
- switch (paint.getTextEncoding()) {
- case SkPaint::kUTF8_TextEncoding:
- {
- fUtf8Text = reinterpret_cast<const char*>(sourceText);
- fTextByteLength = SkToU32(sourceByteCount);
- const char* txtPtr = fUtf8Text;
- for (uint32_t i = 0; i < fGlyphCount; ++i) {
- fClusterStorage[i] = SkToU32(txtPtr - fUtf8Text);
- txtPtr += SkUTF8_LeadByteToCount(*(const unsigned char*)txtPtr);
- SkASSERT(txtPtr <= fUtf8Text + sourceByteCount);
- }
- SkASSERT(txtPtr == fUtf8Text + sourceByteCount);
- return;
- }
- case SkPaint::kUTF16_TextEncoding:
- {
- const uint16_t* utf16ptr = reinterpret_cast<const uint16_t*>(sourceText);
- int utf16count = SkToInt(sourceByteCount / sizeof(uint16_t));
- fTextByteLength = SkToU32(SkUTF16_ToUTF8(utf16ptr, utf16count));
- fUtf8textStorage.resize(fTextByteLength);
- fUtf8Text = fUtf8textStorage.data();
- char* txtPtr = fUtf8textStorage.data();
- uint32_t clusterIndex = 0;
- while (utf16ptr < (const uint16_t*)sourceText + utf16count) {
- fClusterStorage[clusterIndex++] = SkToU32(txtPtr - fUtf8Text);
- SkUnichar uni = SkUTF16_NextUnichar(&utf16ptr);
- txtPtr += SkUTF8_FromUnichar(uni, txtPtr);
- }
- SkASSERT(clusterIndex == fGlyphCount);
- SkASSERT(txtPtr == fUtf8textStorage.data() + fTextByteLength);
- SkASSERT(utf16ptr == (const uint16_t*)sourceText + utf16count);
- return;
- }
- case SkPaint::kUTF32_TextEncoding:
- {
- const SkUnichar* utf32 = reinterpret_cast<const SkUnichar*>(sourceText);
- uint32_t utf32count = SkToU32(sourceByteCount / sizeof(SkUnichar));
- SkASSERT(fGlyphCount == utf32count);
- fTextByteLength = 0;
- for (uint32_t i = 0; i < utf32count; ++i) {
- fTextByteLength += SkToU32(SkUTF8_FromUnichar(utf32[i]));
- }
- fUtf8textStorage.resize(SkToSizeT(fTextByteLength));
- fUtf8Text = fUtf8textStorage.data();
- char* txtPtr = fUtf8textStorage.data();
- for (uint32_t i = 0; i < utf32count; ++i) {
- fClusterStorage[i] = SkToU32(txtPtr - fUtf8Text);
- txtPtr += SkUTF8_FromUnichar(utf32[i], txtPtr);
- }
- return;
- }
- default:
- SkDEBUGFAIL("");
- break;
+SkClusterator::SkClusterator(const SkGlyphRun& run)
+ : fClusters(run.clusters().data())
+ , fUtf8Text(run.text().data())
+ , fGlyphCount(SkToU32(run.shuntGlyphsIDs().size()))
+ , fTextByteLength(SkToU32(run.text().size()))
+{
+ SkASSERT(SkPaint::kGlyphID_TextEncoding == run.paint().getTextEncoding());
+ if (fClusters) {
+ SkASSERT(fUtf8Text && fTextByteLength > 0 && fGlyphCount > 0);
+ fReversedChars = is_reversed(fClusters, fGlyphCount);
+ } else {
+ SkASSERT(!fUtf8Text && fTextByteLength == 0);
}
}
@@ -134,4 +63,3 @@ SkClusterator::Cluster SkClusterator::next() {
uint32_t clusterLen = clusterEnd - cluster;
return Cluster{fUtf8Text + cluster, clusterLen, clusterGlyphIndex, clusterGlyphCount};
}
-