From 3333f75818e6fe0af55130083bd8461ef806c1f2 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Fri, 6 Jun 2014 22:31:15 -0700 Subject: Support fake italics This patch adds fake italics, using essentially the same mechanism as the fake bold implementation. Also combines fake bold/italic settings with ones explicitly set in the paint. Change-Id: Ia7eb3ddc8a6192d191711ba723ffd0d1d9d93f2e --- core/jni/android/graphics/MinikinSkia.cpp | 6 ++++-- core/jni/android/graphics/MinikinUtils.h | 6 ++++++ core/jni/android/graphics/Paint.cpp | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/jni/android/graphics/MinikinSkia.cpp b/core/jni/android/graphics/MinikinSkia.cpp index a0796c626023..25eb941e9d8e 100644 --- a/core/jni/android/graphics/MinikinSkia.cpp +++ b/core/jni/android/graphics/MinikinSkia.cpp @@ -118,8 +118,10 @@ void MinikinFontSkia::unpackPaintFlags(SkPaint* paint, uint32_t paintFlags) { void MinikinFontSkia::populateSkPaint(SkPaint* paint, const MinikinFont* font, FontFakery fakery) { paint->setTypeface(reinterpret_cast(font)->GetSkTypeface()); - paint->setFakeBoldText(fakery.isFakeBold()); - // TODO: fake italics + paint->setFakeBoldText(paint->isFakeBoldText() || fakery.isFakeBold()); + if (fakery.isFakeItalic()) { + paint->setTextSkewX(paint->getTextSkewX() - 0.25f); + } } } diff --git a/core/jni/android/graphics/MinikinUtils.h b/core/jni/android/graphics/MinikinUtils.h index 47ab6166c18e..a96c6b19eca9 100644 --- a/core/jni/android/graphics/MinikinUtils.h +++ b/core/jni/android/graphics/MinikinUtils.h @@ -39,6 +39,8 @@ public: // f is a functor of type void f(size_t start, size_t end); template static void forFontRun(const Layout& layout, SkPaint* paint, F& f) { + float saveSkewX = paint->getTextSkewX(); + bool savefakeBold = paint->isFakeBoldText(); MinikinFont* curFont = NULL; size_t start = 0; size_t nGlyphs = layout.nGlyphs(); @@ -47,6 +49,8 @@ public: if (i > 0 && nextFont != curFont) { MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start)); f(start, i); + paint->setTextSkewX(saveSkewX); + paint->setFakeBoldText(savefakeBold); start = i; } curFont = nextFont; @@ -54,6 +58,8 @@ public: if (nGlyphs > start) { MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start)); f(start, nGlyphs); + paint->setTextSkewX(saveSkewX); + paint->setFakeBoldText(savefakeBold); } } }; diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 74f7085d5913..8b11d311894d 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -440,9 +440,18 @@ public: TypefaceImpl* typeface = GraphicsJNI::getNativeTypeface(env, jpaint); typeface = TypefaceImpl_resolveDefault(typeface); FakedFont baseFont = typeface->fFontCollection->baseFontFaked(typeface->fStyle); + float saveSkewX = paint->getTextSkewX(); + bool savefakeBold = paint->isFakeBoldText(); MinikinFontSkia::populateSkPaint(paint, baseFont.font, baseFont.fakery); #endif SkScalar spacing = paint->getFontMetrics(metrics); +#ifdef USE_MINIKIN + // The populateSkPaint call may have changed fake bold / text skew + // because we want to measure with those effects applied, so now + // restore the original settings. + paint->setTextSkewX(saveSkewX); + paint->setFakeBoldText(savefakeBold); +#endif SkPaintOptionsAndroid paintOpts = paint->getPaintOptionsAndroid(); if (paintOpts.getFontVariant() == SkPaintOptionsAndroid::kElegant_Variant) { SkScalar size = paint->getTextSize(); -- cgit v1.2.3-59-g8ed1b