--- old/src/java.desktop/macosx/native/libawt_lwawt/font/AWTFont.m 2015-11-12 21:21:17.000000000 -0800 +++ new/src/java.desktop/macosx/native/libawt_lwawt/font/AWTFont.m 2015-11-12 21:21:17.000000000 -0800 @@ -42,10 +42,33 @@ if (self) { fFont = [font retain]; fNativeCGFont = CTFontCopyGraphicsFont((CTFontRef)font, NULL); + layoutTableCache = NULL; } return self; } +static TTLayoutTableCache* newCFontLayoutTableCache() { + TTLayoutTableCache* ltc = calloc(1, sizeof(TTLayoutTableCache)); + if (ltc) { + int i; + for(i=0;ientries[i].len = -1; + } + } + return ltc; +} + +static void freeCFontLayoutTableCache(TTLayoutTableCache* ltc) { + if (ltc) { + int i; + for(i=0;ientries[i].ptr) free (ltc->entries[i].ptr); + } + if (ltc->kernPairs) free(ltc->kernPairs); + free(ltc); + } +} + - (void) dealloc { [fFont release]; fFont = nil; @@ -53,6 +76,10 @@ if (fNativeCGFont) { CGFontRelease(fNativeCGFont); fNativeCGFont = NULL; + if (layoutTableCache != NULL) { + freeCFontLayoutTableCache(layoutTableCache); + layoutTableCache = NULL; + } } [super dealloc]; @@ -63,6 +90,10 @@ CGFontRelease(fNativeCGFont); fNativeCGFont = NULL; } + if (layoutTableCache != NULL) { + freeCFontLayoutTableCache(layoutTableCache); + layoutTableCache = NULL; + } [super finalize]; } @@ -345,6 +376,95 @@ /* * Class: sun_font_CFont + * Method: getPlatformFontPtrNative + * Signature: (JI)[B + */ +JNIEXPORT jlong JNICALL +Java_sun_font_CFont_getCGFontPtrNative + (JNIEnv *env, jclass clazz, + jlong awtFontPtr) +{ + AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); + return (jlong)(awtFont->fNativeCGFont); +} + +/* + * Class: sun_font_CFont + * Method: getLayoutTableCacheNative + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL +Java_sun_font_CFont_getLayoutTableCacheNative + (JNIEnv *env, jclass clazz, + jlong awtFontPtr) +{ + AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); + if (awtFont->layoutTableCache == NULL) { + awtFont->layoutTableCache = newCFontLayoutTableCache(); + } + return (jlong)(awtFont->layoutTableCache); +} + +/* + * Class: sun_font_CFont + * Method: getTableBytesNative + * Signature: (JI)[B + */ +JNIEXPORT jbyteArray JNICALL +Java_sun_font_CFont_getTableBytesNative + (JNIEnv *env, jclass clazz, + jlong awtFontPtr, jint jtag) +{ + jbyteArray jbytes = NULL; +JNF_COCOA_ENTER(env); + + CTFontTableTag tag = (CTFontTableTag)jtag; + int i, found = 0; + AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); + NSFont* nsFont = awtFont->fFont; + CTFontRef ctfont = (CTFontRef)nsFont; + CFArrayRef tagsArray = + CTFontCopyAvailableTables(ctfont, kCTFontTableOptionNoOptions); + CFIndex numTags = CFArrayGetCount(tagsArray); + for (i=0; iNewByteArray(env, (jsize)tableLength); + if (jbytes == NULL) { + return NULL; + } + (*env)->SetByteArrayRegion(env, jbytes, 0, + (jsize)tableLength, + (jbyte*)tableBytes); + CFRelease(table); + +JNF_COCOA_EXIT(env); + + return jbytes; +} + +/* + * Class: sun_font_CFont * Method: initNativeFont * Signature: (Ljava/lang/String;I)J */ @@ -460,3 +580,42 @@ { } #endif + +/* + * Class: sun_awt_FontDescriptor + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_sun_font_CFont_getCascadeList + (JNIEnv *env, jclass cls, jlong awtFontPtr, jobject arrayListOfString) +{ + jclass alc = (*env)->FindClass(env, "java/util/ArrayList"); + if (alc == NULL) return; + jmethodID addMID = (*env)->GetMethodID(env, alc, "add", "(Ljava/lang/Object;)Z"); + if (addMID == NULL) return; + + CFIndex i; + AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); + NSFont* nsFont = awtFont->fFont; + CTFontRef font = (CTFontRef)nsFont; + CFStringRef base = CTFontCopyFullName(font); + CFArrayRef codes = CFLocaleCopyISOLanguageCodes(); + +#ifdef DEBUG + NSLog(@"BaseFont is : %@", (NSString*)base); +#endif + CFArrayRef fds = CTFontCopyDefaultCascadeListForLanguages(font, codes); + CFIndex cnt = CFArrayGetCount(fds); + for (i=0; iCallBooleanMethod(env, arrayListOfString, addMID, jFontName); + (*env)->DeleteLocalRef(env, jFontName); + } +}