25 26 #import <JavaNativeFoundation/JavaNativeFoundation.h> 27 28 #import "java_awt_Font.h" 29 #import "sun_awt_PlatformFont.h" 30 #import "sun_awt_FontDescriptor.h" 31 #import "sun_font_CFont.h" 32 #import "sun_font_CFontManager.h" 33 34 #import "AWTFont.h" 35 #import "AWTStrike.h" 36 #import "CoreTextSupport.h" 37 38 @implementation AWTFont 39 40 - (id) initWithFont:(NSFont *)font { 41 self = [super init]; 42 if (self) { 43 fFont = [font retain]; 44 fNativeCGFont = CTFontCopyGraphicsFont((CTFontRef)font, NULL); 45 } 46 return self; 47 } 48 49 - (void) dealloc { 50 [fFont release]; 51 fFont = nil; 52 53 if (fNativeCGFont) { 54 CGFontRelease(fNativeCGFont); 55 fNativeCGFont = NULL; 56 } 57 58 [super dealloc]; 59 } 60 61 - (void) finalize { 62 if (fNativeCGFont) { 63 CGFontRelease(fNativeCGFont); 64 fNativeCGFont = NULL; 65 } 66 [super finalize]; 67 } 68 69 + (AWTFont *) awtFontForName:(NSString *)name 70 style:(int)style 71 { 72 // create font with family & size 73 NSFont *nsFont = [NSFont fontWithName:name size:1.0]; 74 75 if (nsFont == nil) { 76 // if can't get font of that name, substitute system default font 77 nsFont = [NSFont fontWithName:@"Lucida Grande" size:1.0]; 78 #ifdef DEBUG 79 NSLog(@"needed to substitute Lucida Grande for: %@", name); 80 #endif 81 } 82 83 // create an italic style (if one is installed) 84 if (style & java_awt_Font_ITALIC) { 85 nsFont = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSItalicFontMask]; 328 NSString *nsFilePath = JNFJavaToNSString(env, filename); 329 330 FSRef iFile; 331 OSStatus status = CreateFSRef(&iFile, nsFilePath); 332 333 if (status == noErr) { 334 ATSFontContainerRef oContainer; 335 status = ATSFontActivateFromFileReference(&iFile, kATSFontContextLocal, 336 kATSFontFormatUnspecified, 337 NULL, kNilOptions, 338 &oContainer); 339 } 340 341 JNF_COCOA_EXIT(env); 342 } 343 344 #pragma mark --- sun.font.CFont JNI --- 345 346 /* 347 * Class: sun_font_CFont 348 * Method: initNativeFont 349 * Signature: (Ljava/lang/String;I)J 350 */ 351 JNIEXPORT jlong JNICALL 352 Java_sun_font_CFont_createNativeFont 353 (JNIEnv *env, jclass clazz, 354 jstring nativeFontName, jint style) 355 { 356 AWTFont *awtFont = nil; 357 358 JNF_COCOA_ENTER(env); 359 360 awtFont = 361 [AWTFont awtFontForName:JNFJavaToNSString(env, nativeFontName) 362 style:style]; // autoreleased 363 364 if (awtFont) { 365 CFRetain(awtFont); // GC 366 } 367 443 * Method: initIDs 444 * Signature: ()V 445 */ 446 JNIEXPORT void JNICALL 447 Java_sun_awt_PlatformFont_initIDs 448 (JNIEnv *env, jclass cls) 449 { 450 } 451 452 /* 453 * Class: sun_awt_FontDescriptor 454 * Method: initIDs 455 * Signature: ()V 456 */ 457 JNIEXPORT void JNICALL 458 Java_sun_awt_FontDescriptor_initIDs 459 (JNIEnv *env, jclass cls) 460 { 461 } 462 #endif | 25 26 #import <JavaNativeFoundation/JavaNativeFoundation.h> 27 28 #import "java_awt_Font.h" 29 #import "sun_awt_PlatformFont.h" 30 #import "sun_awt_FontDescriptor.h" 31 #import "sun_font_CFont.h" 32 #import "sun_font_CFontManager.h" 33 34 #import "AWTFont.h" 35 #import "AWTStrike.h" 36 #import "CoreTextSupport.h" 37 38 @implementation AWTFont 39 40 - (id) initWithFont:(NSFont *)font { 41 self = [super init]; 42 if (self) { 43 fFont = [font retain]; 44 fNativeCGFont = CTFontCopyGraphicsFont((CTFontRef)font, NULL); 45 layoutTableCache = NULL; 46 } 47 return self; 48 } 49 50 static TTLayoutTableCache* newCFontLayoutTableCache() { 51 TTLayoutTableCache* ltc = calloc(1, sizeof(TTLayoutTableCache)); 52 if (ltc) { 53 int i; 54 for(i=0;i<LAYOUTCACHE_ENTRIES;i++) { 55 ltc->entries[i].len = -1; 56 } 57 } 58 return ltc; 59 } 60 61 static void freeCFontLayoutTableCache(TTLayoutTableCache* ltc) { 62 if (ltc) { 63 int i; 64 for(i=0;i<LAYOUTCACHE_ENTRIES;i++) { 65 if(ltc->entries[i].ptr) free (ltc->entries[i].ptr); 66 } 67 if (ltc->kernPairs) free(ltc->kernPairs); 68 free(ltc); 69 } 70 } 71 72 - (void) dealloc { 73 [fFont release]; 74 fFont = nil; 75 76 if (fNativeCGFont) { 77 CGFontRelease(fNativeCGFont); 78 fNativeCGFont = NULL; 79 if (layoutTableCache != NULL) { 80 freeCFontLayoutTableCache(layoutTableCache); 81 layoutTableCache = NULL; 82 } 83 } 84 85 [super dealloc]; 86 } 87 88 - (void) finalize { 89 if (fNativeCGFont) { 90 CGFontRelease(fNativeCGFont); 91 fNativeCGFont = NULL; 92 } 93 if (layoutTableCache != NULL) { 94 freeCFontLayoutTableCache(layoutTableCache); 95 layoutTableCache = NULL; 96 } 97 [super finalize]; 98 } 99 100 + (AWTFont *) awtFontForName:(NSString *)name 101 style:(int)style 102 { 103 // create font with family & size 104 NSFont *nsFont = [NSFont fontWithName:name size:1.0]; 105 106 if (nsFont == nil) { 107 // if can't get font of that name, substitute system default font 108 nsFont = [NSFont fontWithName:@"Lucida Grande" size:1.0]; 109 #ifdef DEBUG 110 NSLog(@"needed to substitute Lucida Grande for: %@", name); 111 #endif 112 } 113 114 // create an italic style (if one is installed) 115 if (style & java_awt_Font_ITALIC) { 116 nsFont = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSItalicFontMask]; 359 NSString *nsFilePath = JNFJavaToNSString(env, filename); 360 361 FSRef iFile; 362 OSStatus status = CreateFSRef(&iFile, nsFilePath); 363 364 if (status == noErr) { 365 ATSFontContainerRef oContainer; 366 status = ATSFontActivateFromFileReference(&iFile, kATSFontContextLocal, 367 kATSFontFormatUnspecified, 368 NULL, kNilOptions, 369 &oContainer); 370 } 371 372 JNF_COCOA_EXIT(env); 373 } 374 375 #pragma mark --- sun.font.CFont JNI --- 376 377 /* 378 * Class: sun_font_CFont 379 * Method: getPlatformFontPtrNative 380 * Signature: (JI)[B 381 */ 382 JNIEXPORT jlong JNICALL 383 Java_sun_font_CFont_getCGFontPtrNative 384 (JNIEnv *env, jclass clazz, 385 jlong awtFontPtr) 386 { 387 AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); 388 return (jlong)(awtFont->fNativeCGFont); 389 } 390 391 /* 392 * Class: sun_font_CFont 393 * Method: getLayoutTableCacheNative 394 * Signature: (J)J 395 */ 396 JNIEXPORT jlong JNICALL 397 Java_sun_font_CFont_getLayoutTableCacheNative 398 (JNIEnv *env, jclass clazz, 399 jlong awtFontPtr) 400 { 401 AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); 402 if (awtFont->layoutTableCache == NULL) { 403 awtFont->layoutTableCache = newCFontLayoutTableCache(); 404 } 405 return (jlong)(awtFont->layoutTableCache); 406 } 407 408 /* 409 * Class: sun_font_CFont 410 * Method: getTableBytesNative 411 * Signature: (JI)[B 412 */ 413 JNIEXPORT jbyteArray JNICALL 414 Java_sun_font_CFont_getTableBytesNative 415 (JNIEnv *env, jclass clazz, 416 jlong awtFontPtr, jint jtag) 417 { 418 jbyteArray jbytes = NULL; 419 JNF_COCOA_ENTER(env); 420 421 CTFontTableTag tag = (CTFontTableTag)jtag; 422 int i, found = 0; 423 AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); 424 NSFont* nsFont = awtFont->fFont; 425 CTFontRef ctfont = (CTFontRef)nsFont; 426 CFArrayRef tagsArray = 427 CTFontCopyAvailableTables(ctfont, kCTFontTableOptionNoOptions); 428 CFIndex numTags = CFArrayGetCount(tagsArray); 429 for (i=0; i<numTags; i++) { 430 if (tag == 431 (CTFontTableTag)(uintptr_t)CFArrayGetValueAtIndex(tagsArray, i)) { 432 found = 1; 433 break; 434 } 435 } 436 CFRelease(tagsArray); 437 if (!found) { 438 return NULL; 439 } 440 CFDataRef table = CTFontCopyTable(ctfont, tag, kCTFontTableOptionNoOptions); 441 if (table == NULL) { 442 return NULL; 443 } 444 445 char *tableBytes = (char*)(CFDataGetBytePtr(table)); 446 size_t tableLength = CFDataGetLength(table); 447 if (tableBytes == NULL || tableLength == 0) { 448 CFRelease(table); 449 return NULL; 450 } 451 452 jbytes = (*env)->NewByteArray(env, (jsize)tableLength); 453 if (jbytes == NULL) { 454 return NULL; 455 } 456 (*env)->SetByteArrayRegion(env, jbytes, 0, 457 (jsize)tableLength, 458 (jbyte*)tableBytes); 459 CFRelease(table); 460 461 JNF_COCOA_EXIT(env); 462 463 return jbytes; 464 } 465 466 /* 467 * Class: sun_font_CFont 468 * Method: initNativeFont 469 * Signature: (Ljava/lang/String;I)J 470 */ 471 JNIEXPORT jlong JNICALL 472 Java_sun_font_CFont_createNativeFont 473 (JNIEnv *env, jclass clazz, 474 jstring nativeFontName, jint style) 475 { 476 AWTFont *awtFont = nil; 477 478 JNF_COCOA_ENTER(env); 479 480 awtFont = 481 [AWTFont awtFontForName:JNFJavaToNSString(env, nativeFontName) 482 style:style]; // autoreleased 483 484 if (awtFont) { 485 CFRetain(awtFont); // GC 486 } 487 563 * Method: initIDs 564 * Signature: ()V 565 */ 566 JNIEXPORT void JNICALL 567 Java_sun_awt_PlatformFont_initIDs 568 (JNIEnv *env, jclass cls) 569 { 570 } 571 572 /* 573 * Class: sun_awt_FontDescriptor 574 * Method: initIDs 575 * Signature: ()V 576 */ 577 JNIEXPORT void JNICALL 578 Java_sun_awt_FontDescriptor_initIDs 579 (JNIEnv *env, jclass cls) 580 { 581 } 582 #endif 583 584 /* 585 * Class: sun_awt_FontDescriptor 586 * Method: initIDs 587 * Signature: ()V 588 */ 589 JNIEXPORT void JNICALL 590 Java_sun_font_CFont_getCascadeList 591 (JNIEnv *env, jclass cls, jlong awtFontPtr, jobject arrayListOfString) 592 { 593 jclass alc = (*env)->FindClass(env, "java/util/ArrayList"); 594 if (alc == NULL) return; 595 jmethodID addMID = (*env)->GetMethodID(env, alc, "add", "(Ljava/lang/Object;)Z"); 596 if (addMID == NULL) return; 597 598 CFIndex i; 599 AWTFont *awtFont = (AWTFont *)jlong_to_ptr(awtFontPtr); 600 NSFont* nsFont = awtFont->fFont; 601 CTFontRef font = (CTFontRef)nsFont; 602 CFStringRef base = CTFontCopyFullName(font); 603 CFArrayRef codes = CFLocaleCopyISOLanguageCodes(); 604 605 #ifdef DEBUG 606 NSLog(@"BaseFont is : %@", (NSString*)base); 607 #endif 608 CFArrayRef fds = CTFontCopyDefaultCascadeListForLanguages(font, codes); 609 CFIndex cnt = CFArrayGetCount(fds); 610 for (i=0; i<cnt; i++) { 611 CTFontDescriptorRef ref = CFArrayGetValueAtIndex(fds, i); 612 CFStringRef fontname = 613 CTFontDescriptorCopyAttribute(ref, kCTFontNameAttribute); 614 #ifdef DEBUG 615 NSLog(@"Font is : %@", (NSString*)fontname); 616 #endif 617 jstring jFontName = (jstring)JNFNSToJavaString(env, fontname); 618 (*env)->CallBooleanMethod(env, arrayListOfString, addMID, jFontName); 619 (*env)->DeleteLocalRef(env, jFontName); 620 } 621 } |