summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Behdad Esfahbod <behdad@google.com> 2014-07-29 18:43:03 -0400
committer Raph Levien <raph@google.com> 2014-07-30 21:38:23 +0000
commit805f6ebf17e2791624bb1a30834b4c1cc65583bf (patch)
tree89f1dc55a83906ee756096511ab45885bec7d009
parente9a8927662c02df3f2ba17fe24e03da2379afbb2 (diff)
Support FontFeatureSettings in Paint
New API is hidden. Bug: 15246510 Change-Id: Idefca06a366de0d87f53d123b5291788448de4d0
-rw-r--r--core/jni/android/graphics/MinikinUtils.cpp1
-rw-r--r--core/jni/android/graphics/Paint.cpp11
-rw-r--r--core/jni/android/graphics/Paint.h10
-rw-r--r--core/jni/android/graphics/PaintImpl.cpp8
-rw-r--r--graphics/java/android/graphics/Paint.java33
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);
}