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

Print this page




  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 }