diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 3423899491cff..951e01d85245f 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -236,6 +236,22 @@ TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, hinting = paint->getHinting(); } +TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) : + text(NULL), + textCopy(other.textCopy), + contextCount(other.contextCount), + dirFlags(other.dirFlags), + typeface(other.typeface), + textSize(other.textSize), + textSkewX(other.textSkewX), + textScaleX(other.textScaleX), + flags(other.flags), + hinting(other.hinting) { + if (other.text) { + textCopy.setTo(other.text); + } +} + bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const { LTE_INT(count) { LTE_INT(contextCount) { @@ -247,7 +263,7 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const { LTE_INT(flags) { LTE_INT(hinting) { LTE_INT(dirFlags) { - return strncmp16(text, rhs.text, contextCount) < 0; + return strncmp16(getText(), rhs.getText(), contextCount) < 0; } } } @@ -263,7 +279,7 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const { void TextLayoutCacheKey::internalTextCopy() { textCopy.setTo(text, contextCount); - text = textCopy.string(); + text = NULL; } size_t TextLayoutCacheKey::getSize() { diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index 0d8d71fe7c26d..91439548dea9d 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -72,6 +72,8 @@ public: const UChar* text, size_t start, size_t count, size_t contextCount, int dirFlags); + TextLayoutCacheKey(const TextLayoutCacheKey& other); + bool operator<(const TextLayoutCacheKey& rhs) const; /** @@ -86,7 +88,7 @@ public: size_t getSize(); private: - const UChar* text; + const UChar* text; // if text is NULL, use textCopy String16 textCopy; size_t start; size_t count; @@ -98,6 +100,10 @@ private: SkScalar textScaleX; uint32_t flags; SkPaint::Hinting hinting; + + inline const UChar* getText() const { + return text ? text : textCopy.string(); + } }; // TextLayoutCacheKey /*