libbluray | branch: master | hpi1 <[email protected]> | Fri Nov 21 13:21:16 2014 +0200| [a6ac65861a3817f8f53d358c2836df1dae5f4f37] | committer: hpi1
Get font family and style from font file. Fixes loading fonts from streams. > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=a6ac65861a3817f8f53d358c2836df1dae5f4f37 --- src/libbluray/bdj/java/java/awt/BDFontMetrics.java | 5 +++ src/libbluray/bdj/java/java/awt/Font.java | 45 +++++++++++++++++++- src/libbluray/bdj/native/java_awt_BDFontMetrics.c | 43 +++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/libbluray/bdj/java/java/awt/BDFontMetrics.java b/src/libbluray/bdj/java/java/awt/BDFontMetrics.java index 5c2492d..2a2f9d5 100644 --- a/src/libbluray/bdj/java/java/awt/BDFontMetrics.java +++ b/src/libbluray/bdj/java/java/awt/BDFontMetrics.java @@ -37,6 +37,11 @@ public class BDFontMetrics extends FontMetrics { private static native long initN(); private static native void destroyN(long ftLib); + private static native String[] getFontFamilyAndStyleN(long ftLib, String fontName); + + protected synchronized static String[] getFontFamilyAndStyle(String fontFile) { + return getFontFamilyAndStyleN(ftLib, fontFile); + } private native static String resolveFontN(String fontFamily, int fontStyle); private native static void unloadFontConfigN(); diff --git a/src/libbluray/bdj/java/java/awt/Font.java b/src/libbluray/bdj/java/java/awt/Font.java index e97b9b1..4bf3042 100644 --- a/src/libbluray/bdj/java/java/awt/Font.java +++ b/src/libbluray/bdj/java/java/awt/Font.java @@ -178,7 +178,20 @@ public class Font implements java.io.Serializable { if (type != TRUETYPE_FONT) { throw new FontFormatException("unsupported font format"); } - return new Font(null, -1, 1, fontFile, null); + + if (fontFile == null) { + throw new NullPointerException("fontFile is null"); + } + + String data[] = BDFontMetrics.getFontFamilyAndStyle(fontFile.getPath()); + if (data == null || data.length < 2) { + throw new FontFormatException("error loading font " + fontFile.getPath()); + } + + String family = data[0]; + int style = parseStyle(data[1]); + + return new Font(family, style, 1, fontFile, family); } /* used by org.dvb.ui.FontFacrtory */ @@ -215,6 +228,36 @@ public class Font implements java.io.Serializable { setFamily(); } + private static void parseStyle(String styleName) { + int style = PLAIN; + + if (styleName != null && styleName.length() > 0) { + String[] styles = org.videolan.StrUtil.split(styleName, ' '); + if (styles.length == 1) { + styles = org.videolan.StrUtil.split(styles[0], ','); + } + + for (int i = 0; i < styles.length; i++) { + styleName = styles[i].toLowerCase(); + if (styleName.equals("bolditalic")) { + style |= BOLD | ITALIC; + } else if (styleName.equals("italic")) { + style |= ITALIC; + } else if (styleName.equals("bold")) { + style |= BOLD; + } else if (styleName.equals("plain")) { + } else if (styleName.equals("serif")) { + } else if (styleName.equals("regular")) { + } else if (styleName.equals("roman")) { + } else { + org.videolan.Logger.getLogger("Font").info("unregonized style: " + styleName); + } + } + } + + return style; + } + private void setFamily() { String[] names = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); if (names.length == 0) { diff --git a/src/libbluray/bdj/native/java_awt_BDFontMetrics.c b/src/libbluray/bdj/native/java_awt_BDFontMetrics.c index 269f749..cfc256c 100644 --- a/src/libbluray/bdj/native/java_awt_BDFontMetrics.c +++ b/src/libbluray/bdj/native/java_awt_BDFontMetrics.c @@ -23,6 +23,8 @@ #include <jni.h> +#include "util.h" + #include "util/logging.h" #ifdef HAVE_FT2 @@ -184,6 +186,41 @@ Java_java_awt_BDFontMetrics_destroyN(JNIEnv * env, jclass cls, jlong ftLib) #endif } +JNIEXPORT jobjectArray JNICALL +Java_java_awt_BDFontMetrics_getFontFamilyAndStyleN(JNIEnv * env, jclass cls, jlong ftLib, jstring fontName) +{ + jobjectArray array = bdj_make_array(env, "java/lang/String", 2); + +#ifdef HAVE_FT2 + const char *name; + FT_Face ftFace; + FT_Error result; + FT_Library lib = (FT_Library)(intptr_t)ftLib; + jstring jfamily, jstyle; + + if (!lib) { + return NULL; + } + + name = (*env)->GetStringUTFChars(env, fontName, NULL); + result = FT_New_Face(lib, name, 0, &ftFace); + (*env)->ReleaseStringUTFChars(env, fontName, name); + if (result) { + return NULL; + } + + jfamily = (*env)->NewStringUTF(env, ftFace->family_name); + jstyle = (*env)->NewStringUTF(env, ftFace->style_name); + + FT_Done_Face(ftFace); + + (*env)->SetObjectArrayElement(env, array, 0, jfamily); + (*env)->SetObjectArrayElement(env, array, 1, jstyle); +#endif + + return array; +} + JNIEXPORT jlong JNICALL Java_java_awt_BDFontMetrics_loadFontN(JNIEnv * env, jobject obj, jlong ftLib, jstring fontName, jint size) { @@ -204,6 +241,7 @@ Java_java_awt_BDFontMetrics_loadFontN(JNIEnv * env, jobject obj, jlong ftLib, js (*env)->ReleaseStringUTFChars(env, fontName, name); if (result) return 0; + FT_Set_Char_Size(ftFace, 0, size << 6, 0, 0); cls = (*env)->GetObjectClass(env, obj); @@ -353,6 +391,11 @@ Java_java_awt_BDFontMetrics_methods[] = VC(Java_java_awt_BDFontMetrics_unloadFontConfigN), }, { + CC("getFontFamilyAndStyleN"), + CC("(JLjava/lang/String;)[Ljava/lang/String;"), + VC(Java_java_awt_BDFontMetrics_getFontFamilyAndStyleN), + }, + { CC("loadFontN"), CC("(JLjava/lang/String;I)J"), VC(Java_java_awt_BDFontMetrics_loadFontN), _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
