src/java.desktop/macosx/native/libawt_lwawt/font/AWTFont.m

Print this page

        

*** 40,70 **** --- 40,101 ---- - (id) initWithFont:(NSFont *)font { self = [super init]; 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;i<LAYOUTCACHE_ENTRIES;i++) { + ltc->entries[i].len = -1; + } + } + return ltc; + } + + static void freeCFontLayoutTableCache(TTLayoutTableCache* ltc) { + if (ltc) { + int i; + for(i=0;i<LAYOUTCACHE_ENTRIES;i++) { + if(ltc->entries[i].ptr) free (ltc->entries[i].ptr); + } + if (ltc->kernPairs) free(ltc->kernPairs); + free(ltc); + } + } + - (void) dealloc { [fFont release]; fFont = nil; if (fNativeCGFont) { CGFontRelease(fNativeCGFont); fNativeCGFont = NULL; + if (layoutTableCache != NULL) { + freeCFontLayoutTableCache(layoutTableCache); + layoutTableCache = NULL; + } } [super dealloc]; } - (void) finalize { if (fNativeCGFont) { CGFontRelease(fNativeCGFont); fNativeCGFont = NULL; } + if (layoutTableCache != NULL) { + freeCFontLayoutTableCache(layoutTableCache); + layoutTableCache = NULL; + } [super finalize]; } + (AWTFont *) awtFontForName:(NSString *)name style:(int)style
*** 343,352 **** --- 374,472 ---- #pragma mark --- sun.font.CFont JNI --- /* * 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; i<numTags; i++) { + if (tag == + (CTFontTableTag)(uintptr_t)CFArrayGetValueAtIndex(tagsArray, i)) { + found = 1; + break; + } + } + CFRelease(tagsArray); + if (!found) { + return NULL; + } + CFDataRef table = CTFontCopyTable(ctfont, tag, kCTFontTableOptionNoOptions); + if (table == NULL) { + return NULL; + } + + char *tableBytes = (char*)(CFDataGetBytePtr(table)); + size_t tableLength = CFDataGetLength(table); + if (tableBytes == NULL || tableLength == 0) { + CFRelease(table); + return NULL; + } + + jbytes = (*env)->NewByteArray(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 */ JNIEXPORT jlong JNICALL Java_sun_font_CFont_createNativeFont
*** 458,462 **** --- 578,621 ---- Java_sun_awt_FontDescriptor_initIDs (JNIEnv *env, jclass cls) { } #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; i<cnt; i++) { + CTFontDescriptorRef ref = CFArrayGetValueAtIndex(fds, i); + CFStringRef fontname = + CTFontDescriptorCopyAttribute(ref, kCTFontNameAttribute); + #ifdef DEBUG + NSLog(@"Font is : %@", (NSString*)fontname); + #endif + jstring jFontName = (jstring)JNFNSToJavaString(env, fontname); + (*env)->CallBooleanMethod(env, arrayListOfString, addMID, jFontName); + (*env)->DeleteLocalRef(env, jFontName); + } + }