diff options
author | Raph Levien <raph@google.com> | 2014-06-03 17:15:56 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-06-03 17:15:56 +0000 |
commit | 690d45157d01088778e4da398c31575be5aa35ce (patch) | |
tree | f7a17bd3358d2f58a6987e815e2218335228ed8e | |
parent | d7954a8a29d7a64ab798e76ea45c7f993c94c79f (diff) | |
parent | 596f0b1a03c1d733697f89757bcf3c80b9900c78 (diff) | |
download | frameworks_base-690d45157d01088778e4da398c31575be5aa35ce.zip frameworks_base-690d45157d01088778e4da398c31575be5aa35ce.tar.gz frameworks_base-690d45157d01088778e4da398c31575be5aa35ce.tar.bz2 |
am faa91203: Merge "Support fallbacks for custom typefaces (Minikin)" into lmp-preview-dev
* commit 'faa912037ca4895eb99155a4a53354435ee413c2':
Support fallbacks for custom typefaces (Minikin)
-rw-r--r-- | core/jni/android/graphics/FontFamily.cpp | 52 | ||||
-rw-r--r-- | core/jni/android/graphics/MinikinSkia.h | 1 | ||||
-rw-r--r-- | graphics/java/android/graphics/FontFamily.java | 18 | ||||
-rw-r--r-- | graphics/java/android/graphics/Typeface.java | 22 |
4 files changed, 83 insertions, 10 deletions
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp index 3bab8a2..dd6b36f 100644 --- a/core/jni/android/graphics/FontFamily.cpp +++ b/core/jni/android/graphics/FontFamily.cpp @@ -23,6 +23,9 @@ #include "GraphicsJNI.h" #include <ScopedPrimitiveArray.h> #include <ScopedUtfChars.h> +#include <android_runtime/android_util_AssetManager.h> +#include <androidfw/AssetManager.h> +#include "Utils.h" #ifdef USE_MINIKIN #include <minikin/FontFamily.h> @@ -51,19 +54,60 @@ static void FontFamily_unref(JNIEnv* env, jobject clazz, jlong familyPtr) { #endif } +#ifdef USE_MINIKIN +static jboolean addSkTypeface(FontFamily* family, SkTypeface* face) { + MinikinFont* minikinFont = new MinikinFontSkia(face); + bool result = family->addFont(minikinFont); + minikinFont->Unref(); + return result; +} +#endif + static jboolean FontFamily_addFont(JNIEnv* env, jobject clazz, jlong familyPtr, jstring path) { #ifdef USE_MINIKIN NPE_CHECK_RETURN_ZERO(env, path); ScopedUtfChars str(env, path); - ALOGD("addFont %s", str.c_str()); SkTypeface* face = SkTypeface::CreateFromFile(str.c_str()); if (face == NULL) { ALOGE("addFont failed to create font %s", str.c_str()); return false; } - MinikinFont* minikinFont = new MinikinFontSkia(face); FontFamily* fontFamily = (FontFamily*)familyPtr; - return fontFamily->addFont(minikinFont); + return addSkTypeface(fontFamily, face); +#else + return false; +#endif +} + +static jboolean FontFamily_addFontFromAsset(JNIEnv* env, jobject, jlong familyPtr, + jobject jassetMgr, jstring jpath) { +#ifdef USE_MINIKIN + NPE_CHECK_RETURN_ZERO(env, jassetMgr); + NPE_CHECK_RETURN_ZERO(env, jpath); + + AssetManager* mgr = assetManagerForJavaObject(env, jassetMgr); + if (NULL == mgr) { + return false; + } + + ScopedUtfChars str(env, jpath); + Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); + if (NULL == asset) { + return false; + } + + SkStream* stream = new AssetStreamAdaptor(asset, + AssetStreamAdaptor::kYes_OwnAsset, + AssetStreamAdaptor::kYes_HasMemoryBase); + SkTypeface* face = SkTypeface::CreateFromStream(stream); + // Note: SkTypeface::CreateFromStream holds its own reference to the stream + stream->unref(); + if (face == NULL) { + ALOGE("addFontFromAsset failed to create font %s", str.c_str()); + return false; + } + FontFamily* fontFamily = (FontFamily*)familyPtr; + return addSkTypeface(fontFamily, face); #else return false; #endif @@ -75,6 +119,8 @@ static JNINativeMethod gFontFamilyMethods[] = { { "nCreateFamily", "(Ljava/lang/String;I)J", (void*)FontFamily_create }, { "nUnrefFamily", "(J)V", (void*)FontFamily_unref }, { "nAddFont", "(JLjava/lang/String;)Z", (void*)FontFamily_addFont }, + { "nAddFontFromAsset", "(JLandroid/content/res/AssetManager;Ljava/lang/String;)Z", + (void*)FontFamily_addFontFromAsset }, }; int register_android_graphics_FontFamily(JNIEnv* env) diff --git a/core/jni/android/graphics/MinikinSkia.h b/core/jni/android/graphics/MinikinSkia.h index 7a8954d..1cc2c51 100644 --- a/core/jni/android/graphics/MinikinSkia.h +++ b/core/jni/android/graphics/MinikinSkia.h @@ -18,6 +18,7 @@ namespace android { class MinikinFontSkia : public MinikinFont { public: + // Note: this takes ownership of the reference (will unref on dtor) explicit MinikinFontSkia(SkTypeface *typeface); ~MinikinFontSkia(); diff --git a/graphics/java/android/graphics/FontFamily.java b/graphics/java/android/graphics/FontFamily.java index 6802b9a..11d3165 100644 --- a/graphics/java/android/graphics/FontFamily.java +++ b/graphics/java/android/graphics/FontFamily.java @@ -16,6 +16,8 @@ package android.graphics; +import android.content.res.AssetManager; + import java.io.File; /** @@ -58,11 +60,17 @@ public class FontFamily { } } - public boolean addFont(File path) { - return nAddFont(mNativePtr, path.getAbsolutePath()); + public boolean addFont(String path) { + return nAddFont(mNativePtr, path); + } + + public boolean addFontFromAsset(AssetManager mgr, String path) { + return nAddFontFromAsset(mNativePtr, mgr, path); } - static native long nCreateFamily(String lang, int variant); - static native void nUnrefFamily(long nativePtr); - static native boolean nAddFont(long nativeFamily, String path); + private static native long nCreateFamily(String lang, int variant); + private static native void nUnrefFamily(long nativePtr); + private static native boolean nAddFont(long nativeFamily, String path); + private static native boolean nAddFontFromAsset(long nativeFamily, AssetManager mgr, + String path); } diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 2b07c3f..cb48de2 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -178,6 +178,15 @@ public class Typeface { * @return The new typeface. */ public static Typeface createFromAsset(AssetManager mgr, String path) { + if (sFallbackFonts != null) { + FontFamily fontFamily = new FontFamily(); + if (fontFamily.addFontFromAsset(mgr, path)) { + FontFamily[] families = { fontFamily }; + return createFromFamiliesWithDefault(families); + } else { + return null; + } + } return new Typeface(nativeCreateFromAsset(mgr, path)); } @@ -188,7 +197,7 @@ public class Typeface { * @return The new typeface. */ public static Typeface createFromFile(File path) { - return new Typeface(nativeCreateFromFile(path.getAbsolutePath())); + return createFromFile(path.getAbsolutePath()); } /** @@ -198,6 +207,15 @@ public class Typeface { * @return The new typeface. */ public static Typeface createFromFile(String path) { + if (sFallbackFonts != null) { + FontFamily fontFamily = new FontFamily(); + if (fontFamily.addFont(path)) { + FontFamily[] families = { fontFamily }; + return createFromFamiliesWithDefault(families); + } else { + return null; + } + } return new Typeface(nativeCreateFromFile(path)); } @@ -247,7 +265,7 @@ public class Typeface { // TODO: expand to handle attributes like lang and variant FontFamily fontFamily = new FontFamily(family.lang, family.variant); for (String fontFile : family.fontFiles) { - fontFamily.addFont(new File(fontFile)); + fontFamily.addFont(fontFile); } return fontFamily; } |