From 1c4ab704d14c047775b3e42f87ea4081fa204e37 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Sat, 11 Nov 2017 00:02:17 +0000 Subject: [PATCH] Revert "Store FontCollection in MinikinPaint" This regresses the performance. Bug: 69165958 This reverts commit c0a35e7b0ecbd35c9c39205fec6ef2555e86db8b. Change-Id: I86f0b55dc83fdde4ca04659ec0f7bb3589f571fa --- core/jni/android_text_StaticLayout.cpp | 17 ++++++---- libs/hwui/hwui/MinikinUtils.cpp | 45 ++++++++++++++------------ 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp index 18afe6e1ee8f6..ac7924930cc81 100644 --- a/core/jni/android_text_StaticLayout.cpp +++ b/core/jni/android_text_StaticLayout.cpp @@ -137,15 +137,18 @@ class Run { class StyleRun : public Run { public: - StyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, bool isRtl) - : Run(start, end), mPaint(std::move(paint)), mIsRtl(isRtl) {} + StyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, + std::shared_ptr&& collection, bool isRtl) + : Run(start, end), mPaint(std::move(paint)), mCollection(std::move(collection)), + mIsRtl(isRtl) {} void addTo(minikin::LineBreaker* lineBreaker) override { - lineBreaker->addStyleRun(&mPaint, mStart, mEnd, mIsRtl); + lineBreaker->addStyleRun(&mPaint, mCollection, mStart, mEnd, mIsRtl); } private: minikin::MinikinPaint mPaint; + std::shared_ptr mCollection; const bool mIsRtl; }; @@ -173,8 +176,10 @@ class StaticLayoutNative { mIndents(std::move(indents)), mLeftPaddings(std::move(leftPaddings)), mRightPaddings(std::move(rightPaddings)) {} - void addStyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, bool isRtl) { - mRuns.emplace_back(std::make_unique(start, end, std::move(paint), isRtl)); + void addStyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, + std::shared_ptr collection, bool isRtl) { + mRuns.emplace_back(std::make_unique( + start, end, std::move(paint), std::move(collection), isRtl)); } void addReplacementRun(int32_t start, int32_t end, float width, uint32_t localeListId) { @@ -329,7 +334,7 @@ static void nAddStyleRun(jlong nativePtr, jlong nativePaint, jint start, jint en Paint* paint = reinterpret_cast(nativePaint); const Typeface* typeface = Typeface::resolveDefault(paint->getAndroidTypeface()); minikin::MinikinPaint minikinPaint = MinikinUtils::prepareMinikinPaint(paint, typeface); - builder->addStyleRun(start, end, std::move(minikinPaint), isRtl); + builder->addStyleRun(start, end, std::move(minikinPaint), typeface->fFontCollection, isRtl); } // CriticalNative diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp index 2a1a1f3e4cf02..90fe0b74dcec2 100644 --- a/libs/hwui/hwui/MinikinUtils.cpp +++ b/libs/hwui/hwui/MinikinUtils.cpp @@ -30,43 +30,46 @@ minikin::MinikinPaint MinikinUtils::prepareMinikinPaint(const Paint* paint, const Typeface* typeface) { const Typeface* resolvedFace = Typeface::resolveDefault(typeface); minikin::FontStyle resolved = resolvedFace->fStyle; + const minikin::FontVariant minikinVariant = (paint->getFontVariant() == minikin::FontVariant::ELEGANT) ? minikin::FontVariant::ELEGANT : minikin::FontVariant::COMPACT; - float textSize = paint->getTextSize(); - if (!paint->isLinearText()) { - // If linear text is not specified, truncate the value. - textSize = trunc(textSize); - } - return minikin::MinikinPaint( - textSize, - paint->getTextScaleX(), - paint->getTextSkewX(), - paint->getLetterSpacing(), - paint->getWordSpacing(), - MinikinFontSkia::packPaintFlags(paint), - paint->getMinikinLocaleListId(), - minikin::FontStyle(minikinVariant, resolved.weight, resolved.slant), - minikin::HyphenEdit(paint->getHyphenEdit()), - paint->getFontFeatureSettings(), - resolvedFace->fFontCollection); + + minikin::MinikinPaint minikinPaint; + /* Prepare minikin Paint */ + minikinPaint.size = + paint->isLinearText() ? paint->getTextSize() : static_cast(paint->getTextSize()); + minikinPaint.scaleX = paint->getTextScaleX(); + minikinPaint.skewX = paint->getTextSkewX(); + minikinPaint.letterSpacing = paint->getLetterSpacing(); + minikinPaint.wordSpacing = paint->getWordSpacing(); + minikinPaint.paintFlags = MinikinFontSkia::packPaintFlags(paint); + minikinPaint.localeListId = paint->getMinikinLocaleListId(); + minikinPaint.fontStyle = minikin::FontStyle(minikinVariant, resolved.weight, resolved.slant); + minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings(); + minikinPaint.hyphenEdit = minikin::HyphenEdit(paint->getHyphenEdit()); + return minikinPaint; } minikin::Layout MinikinUtils::doLayout(const Paint* paint, minikin::Bidi bidiFlags, const Typeface* typeface, const uint16_t* buf, size_t start, size_t count, size_t bufSize) { + minikin::MinikinPaint minikinPaint = prepareMinikinPaint(paint, typeface); minikin::Layout layout; - layout.doLayout(buf, start, count, bufSize, bidiFlags, prepareMinikinPaint(paint, typeface)); + layout.doLayout(buf, start, count, bufSize, bidiFlags, minikinPaint, + Typeface::resolveDefault(typeface)->fFontCollection); return layout; } float MinikinUtils::measureText(const Paint* paint, minikin::Bidi bidiFlags, const Typeface* typeface, const uint16_t* buf, size_t start, size_t count, size_t bufSize, float* advances) { - return minikin::Layout::measureText( - buf, start, count, bufSize, bidiFlags, prepareMinikinPaint(paint, typeface), advances, - nullptr /* extent */, nullptr /* overhangs */); + minikin::MinikinPaint minikinPaint = prepareMinikinPaint(paint, typeface); + const Typeface* resolvedTypeface = Typeface::resolveDefault(typeface); + return minikin::Layout::measureText(buf, start, count, bufSize, bidiFlags, minikinPaint, + resolvedTypeface->fFontCollection, advances, + nullptr /* extent */, nullptr /* overhangs */); } bool MinikinUtils::hasVariationSelector(const Typeface* typeface, uint32_t codepoint, uint32_t vs) {