diff options
-rw-r--r-- | core/jni/android/graphics/MinikinUtils.cpp | 1 | ||||
-rw-r--r-- | core/jni/android/graphics/Paint.cpp | 11 | ||||
-rw-r--r-- | core/jni/android/graphics/Paint.h | 10 | ||||
-rw-r--r-- | core/jni/android/graphics/PaintImpl.cpp | 8 | ||||
-rw-r--r-- | graphics/java/android/graphics/Paint.java | 33 |
5 files changed, 60 insertions, 3 deletions
diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp index 47f72c4349dd..b00e1abaf89c 100644 --- a/core/jni/android/graphics/MinikinUtils.cpp +++ b/core/jni/android/graphics/MinikinUtils.cpp @@ -59,6 +59,7 @@ void MinikinUtils::doLayout(Layout* layout, const Paint* paint, int bidiFlags, T minikinPaint.skewX = paint->getTextSkewX(); minikinPaint.letterSpacing = paint->getLetterSpacing(); minikinPaint.paintFlags = MinikinFontSkia::packPaintFlags(paint); + minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings(); layout->doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint); } diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 2b0d68ce9216..235e4f27d829 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -428,6 +428,16 @@ public: paint->setLetterSpacing(letterSpacing); } + static void setFontFeatureSettings(JNIEnv* env, jobject clazz, jlong paintHandle, jstring settings) { + Paint* paint = reinterpret_cast<Paint*>(paintHandle); + if (!settings) + paint->setFontFeatureSettings(std::string()); + else { + ScopedUtfChars settingsChars(env, settings); + paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size())); + } + } + static SkScalar getMetricsInternal(JNIEnv* env, jobject jpaint, Paint::FontMetrics *metrics) { const int kElegantTop = 2500; const int kElegantBottom = -1000; @@ -987,6 +997,7 @@ static JNINativeMethod methods[] = { {"setTextSkewX","(F)V", (void*) PaintGlue::setTextSkewX}, {"native_getLetterSpacing","(J)F", (void*) PaintGlue::getLetterSpacing}, {"native_setLetterSpacing","(JF)V", (void*) PaintGlue::setLetterSpacing}, + {"native_setFontFeatureSettings","(JLjava/lang/String;)V", (void*) PaintGlue::setFontFeatureSettings}, {"ascent","()F", (void*) PaintGlue::ascent}, {"descent","()F", (void*) PaintGlue::descent}, {"getFontMetrics", "(Landroid/graphics/Paint$FontMetrics;)F", (void*)PaintGlue::getFontMetrics}, diff --git a/core/jni/android/graphics/Paint.h b/core/jni/android/graphics/Paint.h index 7235cc450959..efc65be0d32f 100644 --- a/core/jni/android/graphics/Paint.h +++ b/core/jni/android/graphics/Paint.h @@ -18,6 +18,7 @@ #define ANDROID_GRAPHICS_PAINT_H #include <SkPaint.h> +#include <string> namespace android { @@ -42,8 +43,17 @@ public: return mLetterSpacing; } + void setFontFeatureSettings(const std::string &fontFeatureSettings) { + mFontFeatureSettings = fontFeatureSettings; + } + + std::string getFontFeatureSettings() const { + return mFontFeatureSettings; + } + private: float mLetterSpacing; + std::string mFontFeatureSettings; }; } // namespace android diff --git a/core/jni/android/graphics/PaintImpl.cpp b/core/jni/android/graphics/PaintImpl.cpp index ff2bbc514ad8..05020d2ee1ac 100644 --- a/core/jni/android/graphics/PaintImpl.cpp +++ b/core/jni/android/graphics/PaintImpl.cpp @@ -23,11 +23,11 @@ namespace android { Paint::Paint() : SkPaint(), - mLetterSpacing(0) { + mLetterSpacing(0), mFontFeatureSettings() { } Paint::Paint(const Paint& paint) : SkPaint(paint), - mLetterSpacing(0) { + mLetterSpacing(0), mFontFeatureSettings() { } Paint::~Paint() { @@ -36,12 +36,14 @@ Paint::~Paint() { Paint& Paint::operator=(const Paint& other) { SkPaint::operator=(other); mLetterSpacing = other.mLetterSpacing; + mFontFeatureSettings = other.mFontFeatureSettings; return *this; } bool operator==(const Paint& a, const Paint& b) { return static_cast<const SkPaint&>(a) == static_cast<const SkPaint&>(b) - && a.mLetterSpacing == b.mLetterSpacing; + && a.mLetterSpacing == b.mLetterSpacing + && a.mFontFeatureSettings == b.mFontFeatureSettings; } } diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 58a1bf24c62e..ec862f8a65d5 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -51,6 +51,7 @@ public class Paint { private float mInvCompatScaling; private Locale mLocale; + private String mFontFeatureSettings; /** * @hide @@ -474,6 +475,7 @@ public class Paint { mBidiFlags = BIDI_DEFAULT_LTR; setTextLocale(Locale.getDefault()); setElegantTextHeight(false); + mFontFeatureSettings = null; } /** @@ -513,6 +515,7 @@ public class Paint { mBidiFlags = paint.mBidiFlags; mLocale = paint.mLocale; + mFontFeatureSettings = paint.mFontFeatureSettings; } /** @hide */ @@ -1283,6 +1286,34 @@ public class Paint { } /** + * Get font feature settings. Default is null. + * + * @return the paint's currently set font feature settings. + * @hide + */ + public String getFontFeatureSettings() { + return mFontFeatureSettings; + } + + /** + * Set font feature settings. + * + * The format is the same as the CSS font-feature-settings attribute: + * http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings + * + * @param settings the font feature settings string to use, may be null. + * @hide + */ + public void setFontFeatureSettings(String settings) { + if (settings != null && settings.equals("")) + settings = null; + if ((settings == null && mFontFeatureSettings == null) + || (settings != null && settings.equals(mFontFeatureSettings))) return; + mFontFeatureSettings = settings; + native_setFontFeatureSettings(mNativePaint, settings); + } + + /** * Return the distance above (negative) the baseline (ascent) based on the * current typeface and text size. * @@ -2259,4 +2290,6 @@ public class Paint { private static native float native_getLetterSpacing(long native_object); private static native void native_setLetterSpacing(long native_object, float letterSpacing); + private static native void native_setFontFeatureSettings(long native_object, + String settings); } |