Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0a35e7b authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Store FontCollection in MinikinPaint

Bug: 65024629
Test: hwui_unit_tests
Change-Id: Ibe9b20f782702e0536997727f1cc788789c47552
parent 45a9600e
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -137,18 +137,15 @@ class Run {

class StyleRun : public Run {
    public:
        StyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint,
                std::shared_ptr<minikin::FontCollection>&& collection, bool isRtl)
            : Run(start, end), mPaint(std::move(paint)), mCollection(std::move(collection)),
              mIsRtl(isRtl) {}
        StyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, bool isRtl)
            : Run(start, end), mPaint(std::move(paint)), mIsRtl(isRtl) {}

        void addTo(minikin::LineBreaker* lineBreaker) override {
            lineBreaker->addStyleRun(&mPaint, mCollection, mStart, mEnd, mIsRtl);
            lineBreaker->addStyleRun(&mPaint, mStart, mEnd, mIsRtl);
        }

    private:
        minikin::MinikinPaint mPaint;
        std::shared_ptr<minikin::FontCollection> mCollection;
        const bool mIsRtl;
};

@@ -176,10 +173,8 @@ 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,
                         std::shared_ptr<minikin::FontCollection> collection, bool isRtl) {
            mRuns.emplace_back(std::make_unique<StyleRun>(
                    start, end, std::move(paint), std::move(collection), isRtl));
        void addStyleRun(int32_t start, int32_t end, minikin::MinikinPaint&& paint, bool isRtl) {
            mRuns.emplace_back(std::make_unique<StyleRun>(start, end, std::move(paint), isRtl));
        }

        void addReplacementRun(int32_t start, int32_t end, float width, uint32_t localeListId) {
@@ -334,7 +329,7 @@ static void nAddStyleRun(jlong nativePtr, jlong nativePaint, jint start, jint en
    Paint* paint = reinterpret_cast<Paint*>(nativePaint);
    const Typeface* typeface = Typeface::resolveDefault(paint->getAndroidTypeface());
    minikin::MinikinPaint minikinPaint = MinikinUtils::prepareMinikinPaint(paint, typeface);
    builder->addStyleRun(start, end, std::move(minikinPaint), typeface->fFontCollection, isRtl);
    builder->addStyleRun(start, end, std::move(minikinPaint), isRtl);
}

// CriticalNative
+21 −24
Original line number Diff line number Diff line
@@ -30,45 +30,42 @@ 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;

    minikin::MinikinPaint minikinPaint;
    /* Prepare minikin Paint */
    minikinPaint.size =
            paint->isLinearText() ? paint->getTextSize() : static_cast<int>(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;
    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::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, minikinPaint,
                    Typeface::resolveDefault(typeface)->fFontCollection);
    layout.doLayout(buf, start, count, bufSize, bidiFlags, prepareMinikinPaint(paint, typeface));
    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) {
    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,
    return minikin::Layout::measureText(
            buf, start, count, bufSize, bidiFlags, prepareMinikinPaint(paint, typeface), advances,
            nullptr /* extent */, nullptr /* overhangs */);
}