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

Commit ea3cbd09 authored by Ben Wagner's avatar Ben Wagner
Browse files

Interpret linearMetrics flag to imply no-hinting.

When drawing text and the linearMetrics flag is set, interpret it as a
'linear' flag which implies no-hinting. This will keep existing behavior
and match how the flag is currently documented when Skia changes the
behavior to be seperable from hinting.

Test: Strict improvement, broken tests will be fixed before landing.
Change-Id: Ie76f84e4fd23f4086a2f955b37d3be140452e77f
parent 5bad6247
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -154,6 +154,11 @@ void Canvas::drawText(const uint16_t* text, int textSize, int start, int count,
    // minikin may modify the original paint
    Paint paint(origPaint);

    // interpret 'linear metrics' flag as 'linear', forcing no-hinting when drawing
    if (paint.getSkFont().isLinearMetrics()) {
        paint.getSkFont().setHinting(SkFontHinting::kNone);
    }

    minikin::Layout layout = MinikinUtils::doLayout(&paint, bidiFlags, typeface, text, textSize,
                                                    start, count, contextStart, contextCount, mt);

@@ -234,23 +239,30 @@ private:
};

void Canvas::drawTextOnPath(const uint16_t* text, int count, minikin::Bidi bidiFlags,
                            const SkPath& path, float hOffset, float vOffset, const Paint& paint,
                            const Typeface* typeface) {
    Paint paintCopy(paint);
                            const SkPath& path, float hOffset, float vOffset,
                            const Paint& origPaint, const Typeface* typeface) {
    // minikin may modify the original paint
    Paint paint(origPaint);

    // interpret 'linear metrics' flag as 'linear', forcing no-hinting when drawing
    if (paint.getSkFont().isLinearMetrics()) {
        paint.getSkFont().setHinting(SkFontHinting::kNone);
    }

    minikin::Layout layout =
            MinikinUtils::doLayout(&paintCopy, bidiFlags, typeface, text, count,  // text buffer
            MinikinUtils::doLayout(&paint, bidiFlags, typeface, text, count,  // text buffer
                                   0, count,                                  // draw range
                                   0, count,                                  // context range
                                   nullptr);
    hOffset += MinikinUtils::hOffsetForTextAlign(&paintCopy, layout, path);
    hOffset += MinikinUtils::hOffsetForTextAlign(&paint, layout, path);

    // Set align to left for drawing, as we don't want individual
    // glyphs centered or right-aligned; the offset above takes
    // care of all alignment.
    paintCopy.setTextAlign(Paint::kLeft_Align);
    paint.setTextAlign(Paint::kLeft_Align);

    DrawTextOnPathFunctor f(layout, this, hOffset, vOffset, paintCopy, path);
    MinikinUtils::forFontRun(layout, &paintCopy, f);
    DrawTextOnPathFunctor f(layout, this, hOffset, vOffset, paint, path);
    MinikinUtils::forFontRun(layout, &paint, f);
}

int Canvas::sApiLevel = 1;