| Index: src/core/SkPaint.cpp
|
| diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
|
| index 67b630e850ed288d058977866fa13356fffbe6cc..7ce7fc9ccd19df02b740bb96c38e934d63c7974d 100644
|
| --- a/src/core/SkPaint.cpp
|
| +++ b/src/core/SkPaint.cpp
|
| @@ -608,14 +608,6 @@ static const SkGlyph& sk_getMetrics_utf8_next(SkGlyphCache* cache,
|
| return cache->getUnicharMetrics(SkUTF8_NextUnichar(text));
|
| }
|
|
|
| -static const SkGlyph& sk_getMetrics_utf8_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - return cache->getUnicharMetrics(SkUTF8_PrevUnichar(text));
|
| -}
|
| -
|
| static const SkGlyph& sk_getMetrics_utf16_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -624,14 +616,6 @@ static const SkGlyph& sk_getMetrics_utf16_next(SkGlyphCache* cache,
|
| return cache->getUnicharMetrics(SkUTF16_NextUnichar((const uint16_t**)text));
|
| }
|
|
|
| -static const SkGlyph& sk_getMetrics_utf16_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - return cache->getUnicharMetrics(SkUTF16_PrevUnichar((const uint16_t**)text));
|
| -}
|
| -
|
| static const SkGlyph& sk_getMetrics_utf32_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -643,17 +627,6 @@ static const SkGlyph& sk_getMetrics_utf32_next(SkGlyphCache* cache,
|
| return cache->getUnicharMetrics(uni);
|
| }
|
|
|
| -static const SkGlyph& sk_getMetrics_utf32_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - const int32_t* ptr = *(const int32_t**)text;
|
| - SkUnichar uni = *--ptr;
|
| - *text = (const char*)ptr;
|
| - return cache->getUnicharMetrics(uni);
|
| -}
|
| -
|
| static const SkGlyph& sk_getMetrics_glyph_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -666,18 +639,6 @@ static const SkGlyph& sk_getMetrics_glyph_next(SkGlyphCache* cache,
|
| return cache->getGlyphIDMetrics(glyphID);
|
| }
|
|
|
| -static const SkGlyph& sk_getMetrics_glyph_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - const uint16_t* ptr = *(const uint16_t**)text;
|
| - ptr -= 1;
|
| - unsigned glyphID = *ptr;
|
| - *text = (const char*)ptr;
|
| - return cache->getGlyphIDMetrics(glyphID);
|
| -}
|
| -
|
| static const SkGlyph& sk_getAdvance_utf8_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -686,14 +647,6 @@ static const SkGlyph& sk_getAdvance_utf8_next(SkGlyphCache* cache,
|
| return cache->getUnicharAdvance(SkUTF8_NextUnichar(text));
|
| }
|
|
|
| -static const SkGlyph& sk_getAdvance_utf8_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - return cache->getUnicharAdvance(SkUTF8_PrevUnichar(text));
|
| -}
|
| -
|
| static const SkGlyph& sk_getAdvance_utf16_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -702,14 +655,6 @@ static const SkGlyph& sk_getAdvance_utf16_next(SkGlyphCache* cache,
|
| return cache->getUnicharAdvance(SkUTF16_NextUnichar((const uint16_t**)text));
|
| }
|
|
|
| -static const SkGlyph& sk_getAdvance_utf16_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - return cache->getUnicharAdvance(SkUTF16_PrevUnichar((const uint16_t**)text));
|
| -}
|
| -
|
| static const SkGlyph& sk_getAdvance_utf32_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -721,17 +666,6 @@ static const SkGlyph& sk_getAdvance_utf32_next(SkGlyphCache* cache,
|
| return cache->getUnicharAdvance(uni);
|
| }
|
|
|
| -static const SkGlyph& sk_getAdvance_utf32_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - const int32_t* ptr = *(const int32_t**)text;
|
| - SkUnichar uni = *--ptr;
|
| - *text = (const char*)ptr;
|
| - return cache->getUnicharAdvance(uni);
|
| -}
|
| -
|
| static const SkGlyph& sk_getAdvance_glyph_next(SkGlyphCache* cache,
|
| const char** text) {
|
| SkASSERT(cache != NULL);
|
| @@ -744,49 +678,23 @@ static const SkGlyph& sk_getAdvance_glyph_next(SkGlyphCache* cache,
|
| return cache->getGlyphIDAdvance(glyphID);
|
| }
|
|
|
| -static const SkGlyph& sk_getAdvance_glyph_prev(SkGlyphCache* cache,
|
| - const char** text) {
|
| - SkASSERT(cache != NULL);
|
| - SkASSERT(text != NULL);
|
| -
|
| - const uint16_t* ptr = *(const uint16_t**)text;
|
| - ptr -= 1;
|
| - unsigned glyphID = *ptr;
|
| - *text = (const char*)ptr;
|
| - return cache->getGlyphIDAdvance(glyphID);
|
| -}
|
| -
|
| -SkMeasureCacheProc SkPaint::getMeasureCacheProc(TextBufferDirection tbd,
|
| - bool needFullMetrics) const {
|
| +SkMeasureCacheProc SkPaint::getMeasureCacheProc(bool needFullMetrics) const {
|
| static const SkMeasureCacheProc gMeasureCacheProcs[] = {
|
| sk_getMetrics_utf8_next,
|
| sk_getMetrics_utf16_next,
|
| sk_getMetrics_utf32_next,
|
| sk_getMetrics_glyph_next,
|
|
|
| - sk_getMetrics_utf8_prev,
|
| - sk_getMetrics_utf16_prev,
|
| - sk_getMetrics_utf32_prev,
|
| - sk_getMetrics_glyph_prev,
|
| -
|
| sk_getAdvance_utf8_next,
|
| sk_getAdvance_utf16_next,
|
| sk_getAdvance_utf32_next,
|
| sk_getAdvance_glyph_next,
|
| -
|
| - sk_getAdvance_utf8_prev,
|
| - sk_getAdvance_utf16_prev,
|
| - sk_getAdvance_utf32_prev,
|
| - sk_getAdvance_glyph_prev
|
| };
|
|
|
| unsigned index = this->getTextEncoding();
|
|
|
| - if (kBackward_TextBufferDirection == tbd) {
|
| - index += 4;
|
| - }
|
| if (!needFullMetrics && !this->isDevKernText()) {
|
| - index += 8;
|
| + index += 4;
|
| }
|
|
|
| SkASSERT(index < SK_ARRAY_COUNT(gMeasureCacheProcs));
|
| @@ -996,9 +904,7 @@ SkScalar SkPaint::measure_text(SkGlyphCache* cache,
|
| return 0;
|
| }
|
|
|
| - SkMeasureCacheProc glyphCacheProc;
|
| - glyphCacheProc = this->getMeasureCacheProc(kForward_TextBufferDirection,
|
| - bounds);
|
| + SkMeasureCacheProc glyphCacheProc = this->getMeasureCacheProc(NULL != bounds);
|
|
|
| int xyIndex;
|
| JoinBoundsProc joinBoundsProc;
|
| @@ -1091,33 +997,8 @@ SkScalar SkPaint::measureText(const void* textData, size_t length, SkRect* bound
|
| return width;
|
| }
|
|
|
| -typedef bool (*SkTextBufferPred)(const char* text, const char* stop);
|
| -
|
| -static bool forward_textBufferPred(const char* text, const char* stop) {
|
| - return text < stop;
|
| -}
|
| -
|
| -static bool backward_textBufferPred(const char* text, const char* stop) {
|
| - return text > stop;
|
| -}
|
| -
|
| -static SkTextBufferPred chooseTextBufferPred(SkPaint::TextBufferDirection tbd,
|
| - const char** text, size_t length,
|
| - const char** stop) {
|
| - if (SkPaint::kForward_TextBufferDirection == tbd) {
|
| - *stop = *text + length;
|
| - return forward_textBufferPred;
|
| - } else {
|
| - // text should point to the end of the buffer, and stop to the beginning
|
| - *stop = *text;
|
| - *text += length;
|
| - return backward_textBufferPred;
|
| - }
|
| -}
|
| -
|
| size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
| - SkScalar* measuredWidth,
|
| - TextBufferDirection tbd) const {
|
| + SkScalar* measuredWidth) const {
|
| if (0 == length || 0 >= maxWidth) {
|
| if (measuredWidth) {
|
| *measuredWidth = 0;
|
| @@ -1134,6 +1015,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
|
|
| SkASSERT(textD != NULL);
|
| const char* text = (const char*)textD;
|
| + const char* stop = text + length;
|
|
|
| SkCanonicalizePaint canon(*this);
|
| const SkPaint& paint = canon.getPaint();
|
| @@ -1147,9 +1029,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
| SkAutoGlyphCache autoCache(paint, NULL, NULL);
|
| SkGlyphCache* cache = autoCache.getCache();
|
|
|
| - SkMeasureCacheProc glyphCacheProc = paint.getMeasureCacheProc(tbd, false);
|
| - const char* stop;
|
| - SkTextBufferPred pred = chooseTextBufferPred(tbd, &text, length, &stop);
|
| + SkMeasureCacheProc glyphCacheProc = paint.getMeasureCacheProc(false);
|
| const int xyIndex = paint.isVerticalText() ? 1 : 0;
|
| // use 64bits for our accumulator, to avoid overflowing 16.16
|
| Sk48Dot16 max = SkScalarToFixed(maxWidth);
|
| @@ -1159,7 +1039,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
|
|
| if (this->isDevKernText()) {
|
| int rsb = 0;
|
| - while (pred(text, stop)) {
|
| + while (text < stop) {
|
| const char* curr = text;
|
| const SkGlyph& g = glyphCacheProc(cache, &text);
|
| SkFixed x = SkAutoKern_AdjustF(rsb, g.fLsbDelta) + advance(g, xyIndex);
|
| @@ -1171,7 +1051,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
| rsb = g.fRsbDelta;
|
| }
|
| } else {
|
| - while (pred(text, stop)) {
|
| + while (text < stop) {
|
| const char* curr = text;
|
| SkFixed x = advance(glyphCacheProc(cache, &text), xyIndex);
|
| if ((width += x) > max) {
|
| @@ -1191,8 +1071,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
| }
|
|
|
| // return the number of bytes measured
|
| - return (kForward_TextBufferDirection == tbd) ?
|
| - text - stop + length : stop - text + length;
|
| + return text - stop + length;
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -1269,8 +1148,7 @@ int SkPaint::getTextWidths(const void* textData, size_t byteLength,
|
| SkAutoGlyphCache autoCache(paint, NULL, NULL);
|
| SkGlyphCache* cache = autoCache.getCache();
|
| SkMeasureCacheProc glyphCacheProc;
|
| - glyphCacheProc = paint.getMeasureCacheProc(kForward_TextBufferDirection,
|
| - bounds);
|
| + glyphCacheProc = paint.getMeasureCacheProc(NULL != bounds);
|
|
|
| const char* text = (const char*)textData;
|
| const char* stop = text + byteLength;
|
| @@ -2471,8 +2349,7 @@ SkTextToPathIter::SkTextToPathIter( const char text[], size_t length,
|
| const SkPaint& paint,
|
| bool applyStrokeAndPathEffects)
|
| : fPaint(paint) {
|
| - fGlyphCacheProc = paint.getMeasureCacheProc(SkPaint::kForward_TextBufferDirection,
|
| - true);
|
| + fGlyphCacheProc = paint.getMeasureCacheProc(true);
|
|
|
| fPaint.setLinearText(true);
|
| fPaint.setMaskFilter(NULL); // don't want this affecting our path-cache lookup
|
|
|