Revert "Store FontCollection in MinikinPaint"

This regresses the performance.

Bug: 69165958

This reverts commit c0a35e7b0e.

Change-Id: I86f0b55dc83fdde4ca04659ec0f7bb3589f571fa
This commit is contained in:
Seigo Nonaka
2017-11-11 00:02:17 +00:00
parent ae5eb83a32
commit 1c4ab704d1
2 changed files with 35 additions and 27 deletions

View File

@@ -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<minikin::FontCollection>&& 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<minikin::FontCollection> 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<StyleRun>(start, end, std::move(paint), isRtl));
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 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<Paint*>(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

View File

@@ -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<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;
}
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) {