| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkPaint.h" | 8 #include "SkPaint.h" |
| 9 #include "SkAutoKern.h" | 9 #include "SkAutoKern.h" |
| 10 #include "SkChecksum.h" | 10 #include "SkChecksum.h" |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 SkASSERT(cache != nullptr); | 654 SkASSERT(cache != nullptr); |
| 655 SkASSERT(text != nullptr); | 655 SkASSERT(text != nullptr); |
| 656 | 656 |
| 657 const uint16_t* ptr = *(const uint16_t**)text; | 657 const uint16_t* ptr = *(const uint16_t**)text; |
| 658 unsigned glyphID = *ptr; | 658 unsigned glyphID = *ptr; |
| 659 ptr += 1; | 659 ptr += 1; |
| 660 *text = (const char*)ptr; | 660 *text = (const char*)ptr; |
| 661 return cache->getGlyphIDAdvance(glyphID); | 661 return cache->getGlyphIDAdvance(glyphID); |
| 662 } | 662 } |
| 663 | 663 |
| 664 SkPaint::GlyphCacheProc SkPaint::getGlyphCacheProc(bool needFullMetrics) const { | 664 SkPaint::GlyphCacheProc SkPaint::GetGlyphCacheProc(TextEncoding encoding, |
| 665 bool isDevKern, |
| 666 bool needFullMetrics) { |
| 665 static const GlyphCacheProc gGlyphCacheProcs[] = { | 667 static const GlyphCacheProc gGlyphCacheProcs[] = { |
| 666 sk_getMetrics_utf8_next, | 668 sk_getMetrics_utf8_next, |
| 667 sk_getMetrics_utf16_next, | 669 sk_getMetrics_utf16_next, |
| 668 sk_getMetrics_utf32_next, | 670 sk_getMetrics_utf32_next, |
| 669 sk_getMetrics_glyph_next, | 671 sk_getMetrics_glyph_next, |
| 670 | 672 |
| 671 sk_getAdvance_utf8_next, | 673 sk_getAdvance_utf8_next, |
| 672 sk_getAdvance_utf16_next, | 674 sk_getAdvance_utf16_next, |
| 673 sk_getAdvance_utf32_next, | 675 sk_getAdvance_utf32_next, |
| 674 sk_getAdvance_glyph_next, | 676 sk_getAdvance_glyph_next, |
| 675 }; | 677 }; |
| 676 | 678 |
| 677 unsigned index = this->getTextEncoding(); | 679 unsigned index = encoding; |
| 678 | 680 |
| 679 if (!needFullMetrics && !this->isDevKernText()) { | 681 if (!needFullMetrics && !isDevKern) { |
| 680 index += 4; | 682 index += 4; |
| 681 } | 683 } |
| 682 | 684 |
| 683 SkASSERT(index < SK_ARRAY_COUNT(gGlyphCacheProcs)); | 685 SkASSERT(index < SK_ARRAY_COUNT(gGlyphCacheProcs)); |
| 684 return gGlyphCacheProcs[index]; | 686 return gGlyphCacheProcs[index]; |
| 685 } | 687 } |
| 686 | 688 |
| 687 /////////////////////////////////////////////////////////////////////////////// | 689 /////////////////////////////////////////////////////////////////////////////// |
| 688 | 690 |
| 689 #define TEXT_AS_PATHS_PAINT_FLAGS_TO_IGNORE ( \ | 691 #define TEXT_AS_PATHS_PAINT_FLAGS_TO_IGNORE ( \ |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 int* count, SkRect* bounds) const { | 769 int* count, SkRect* bounds) const { |
| 768 SkASSERT(count); | 770 SkASSERT(count); |
| 769 if (byteLength == 0) { | 771 if (byteLength == 0) { |
| 770 *count = 0; | 772 *count = 0; |
| 771 if (bounds) { | 773 if (bounds) { |
| 772 bounds->setEmpty(); | 774 bounds->setEmpty(); |
| 773 } | 775 } |
| 774 return 0; | 776 return 0; |
| 775 } | 777 } |
| 776 | 778 |
| 777 GlyphCacheProc glyphCacheProc = this->getGlyphCacheProc(nullptr != bounds); | 779 GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(this->getTextEnco
ding(), |
| 780 this->isDevKernTe
xt(), |
| 781 nullptr != bounds
); |
| 778 | 782 |
| 779 int xyIndex; | 783 int xyIndex; |
| 780 JoinBoundsProc joinBoundsProc; | 784 JoinBoundsProc joinBoundsProc; |
| 781 if (this->isVerticalText()) { | 785 if (this->isVerticalText()) { |
| 782 xyIndex = 1; | 786 xyIndex = 1; |
| 783 joinBoundsProc = join_bounds_y; | 787 joinBoundsProc = join_bounds_y; |
| 784 } else { | 788 } else { |
| 785 xyIndex = 0; | 789 xyIndex = 0; |
| 786 joinBoundsProc = join_bounds_x; | 790 joinBoundsProc = join_bounds_x; |
| 787 } | 791 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 SkScalar scale = canon.getScale(); | 889 SkScalar scale = canon.getScale(); |
| 886 | 890 |
| 887 // adjust max in case we changed the textSize in paint | 891 // adjust max in case we changed the textSize in paint |
| 888 if (scale) { | 892 if (scale) { |
| 889 maxWidth /= scale; | 893 maxWidth /= scale; |
| 890 } | 894 } |
| 891 | 895 |
| 892 SkAutoGlyphCache autoCache(paint, nullptr, nullptr); | 896 SkAutoGlyphCache autoCache(paint, nullptr, nullptr); |
| 893 SkGlyphCache* cache = autoCache.getCache(); | 897 SkGlyphCache* cache = autoCache.getCache(); |
| 894 | 898 |
| 895 GlyphCacheProc glyphCacheProc = paint.getGlyphCacheProc(false); | 899 GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(paint.getTextEn
coding(), |
| 900 paint.isDevKern
Text(), |
| 901 false); |
| 896 const int xyIndex = paint.isVerticalText() ? 1 : 0; | 902 const int xyIndex = paint.isVerticalText() ? 1 : 0; |
| 897 SkScalar width = 0; | 903 SkScalar width = 0; |
| 898 | 904 |
| 899 if (this->isDevKernText()) { | 905 if (this->isDevKernText()) { |
| 900 int rsb = 0; | 906 int rsb = 0; |
| 901 while (text < stop) { | 907 while (text < stop) { |
| 902 const char* curr = text; | 908 const char* curr = text; |
| 903 const SkGlyph& g = glyphCacheProc(cache, &text); | 909 const SkGlyph& g = glyphCacheProc(cache, &text); |
| 904 SkScalar x = SkAutoKern_Adjust(rsb, g.fLsbDelta) + advance(g, xyInde
x); | 910 SkScalar x = SkAutoKern_Adjust(rsb, g.fLsbDelta) + advance(g, xyInde
x); |
| 905 if ((width += x) > maxWidth) { | 911 if ((width += x) > maxWidth) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 if (nullptr == widths && nullptr == bounds) { | 1004 if (nullptr == widths && nullptr == bounds) { |
| 999 return this->countText(textData, byteLength); | 1005 return this->countText(textData, byteLength); |
| 1000 } | 1006 } |
| 1001 | 1007 |
| 1002 SkCanonicalizePaint canon(*this); | 1008 SkCanonicalizePaint canon(*this); |
| 1003 const SkPaint& paint = canon.getPaint(); | 1009 const SkPaint& paint = canon.getPaint(); |
| 1004 SkScalar scale = canon.getScale(); | 1010 SkScalar scale = canon.getScale(); |
| 1005 | 1011 |
| 1006 SkAutoGlyphCache autoCache(paint, nullptr, nullptr); | 1012 SkAutoGlyphCache autoCache(paint, nullptr, nullptr); |
| 1007 SkGlyphCache* cache = autoCache.getCache(); | 1013 SkGlyphCache* cache = autoCache.getCache(); |
| 1008 GlyphCacheProc glyphCacheProc = paint.getGlyphCacheProc(nullptr != boun
ds); | 1014 GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(paint.getTex
tEncoding(), |
| 1015 paint.isDevK
ernText(), |
| 1016 nullptr != b
ounds); |
| 1009 | 1017 |
| 1010 const char* text = (const char*)textData; | 1018 const char* text = (const char*)textData; |
| 1011 const char* stop = text + byteLength; | 1019 const char* stop = text + byteLength; |
| 1012 int count = 0; | 1020 int count = 0; |
| 1013 const int xyIndex = paint.isVerticalText() ? 1 : 0; | 1021 const int xyIndex = paint.isVerticalText() ? 1 : 0; |
| 1014 | 1022 |
| 1015 if (this->isDevKernText()) { | 1023 if (this->isDevKernText()) { |
| 1016 // we adjust the widths returned here through auto-kerning | 1024 // we adjust the widths returned here through auto-kerning |
| 1017 SkAutoKern autokern; | 1025 SkAutoKern autokern; |
| 1018 SkScalar prevWidth = 0; | 1026 SkScalar prevWidth = 0; |
| (...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2175 | 2183 |
| 2176 static bool has_thick_frame(const SkPaint& paint) { | 2184 static bool has_thick_frame(const SkPaint& paint) { |
| 2177 return paint.getStrokeWidth() > 0 && | 2185 return paint.getStrokeWidth() > 0 && |
| 2178 paint.getStyle() != SkPaint::kFill_Style; | 2186 paint.getStyle() != SkPaint::kFill_Style; |
| 2179 } | 2187 } |
| 2180 | 2188 |
| 2181 SkTextBaseIter::SkTextBaseIter(const char text[], size_t length, | 2189 SkTextBaseIter::SkTextBaseIter(const char text[], size_t length, |
| 2182 const SkPaint& paint, | 2190 const SkPaint& paint, |
| 2183 bool applyStrokeAndPathEffects) | 2191 bool applyStrokeAndPathEffects) |
| 2184 : fPaint(paint) { | 2192 : fPaint(paint) { |
| 2185 fGlyphCacheProc = paint.getGlyphCacheProc(true); | 2193 fGlyphCacheProc = SkPaint::GetGlyphCacheProc(paint.getTextEncoding(), |
| 2194 paint.isDevKernText(), |
| 2195 true); |
| 2186 | 2196 |
| 2187 fPaint.setLinearText(true); | 2197 fPaint.setLinearText(true); |
| 2188 fPaint.setMaskFilter(nullptr); // don't want this affecting our path-cache
lookup | 2198 fPaint.setMaskFilter(nullptr); // don't want this affecting our path-cache
lookup |
| 2189 | 2199 |
| 2190 if (fPaint.getPathEffect() == nullptr && !has_thick_frame(fPaint)) { | 2200 if (fPaint.getPathEffect() == nullptr && !has_thick_frame(fPaint)) { |
| 2191 applyStrokeAndPathEffects = false; | 2201 applyStrokeAndPathEffects = false; |
| 2192 } | 2202 } |
| 2193 | 2203 |
| 2194 // can't use our canonical size if we need to apply patheffects | 2204 // can't use our canonical size if we need to apply patheffects |
| 2195 if (fPaint.getPathEffect() == nullptr) { | 2205 if (fPaint.getPathEffect() == nullptr) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2322 } | 2332 } |
| 2323 | 2333 |
| 2324 uint32_t SkPaint::getHash() const { | 2334 uint32_t SkPaint::getHash() const { |
| 2325 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, | 2335 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, |
| 2326 // so fBitfields should be 10 pointers and 6 32-bit values from the start. | 2336 // so fBitfields should be 10 pointers and 6 32-bit values from the start. |
| 2327 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo
f(uint32_t), | 2337 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo
f(uint32_t), |
| 2328 "SkPaint_notPackedTightly"); | 2338 "SkPaint_notPackedTightly"); |
| 2329 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), | 2339 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), |
| 2330 offsetof(SkPaint, fBitfields) + sizeof(fBitfields
)); | 2340 offsetof(SkPaint, fBitfields) + sizeof(fBitfields
)); |
| 2331 } | 2341 } |
| OLD | NEW |