--- old/modules/javafx.graphics/src/main/java/com/sun/javafx/font/coretext/CTFontStrike.java 2016-10-04 00:13:34.000000000 +0530 +++ new/modules/javafx.graphics/src/main/java/com/sun/javafx/font/coretext/CTFontStrike.java 2016-10-04 00:13:34.000000000 +0530 @@ -77,9 +77,14 @@ drawShapes = true; } } + long psNameRef = OS.CFStringCreate(fontResource.getPSName()); if (psNameRef != 0) { - fontRef = OS.CTFontCreateWithName(psNameRef, size, matrix); + long fileNameRef = OS.CFStringCreate(fontResource.getFileName()); + if (fileNameRef != 0) { + fontRef = OS.CTFontCreate(fileNameRef, psNameRef, size, matrix); + OS.CFRelease(fileNameRef); + } OS.CFRelease(psNameRef); } if (fontRef == 0) { --- old/modules/javafx.graphics/src/main/java/com/sun/javafx/font/coretext/OS.java 2016-10-04 00:13:35.000000000 +0530 +++ new/modules/javafx.graphics/src/main/java/com/sun/javafx/font/coretext/OS.java 2016-10-04 00:13:35.000000000 +0530 @@ -63,6 +63,7 @@ static final native CGRect CGPathGetPathBoundingBox(long path); static final native long CFStringCreateWithCharacters(long alloc, char[] chars, long start, long numChars); static final native String CTFontCopyAttributeDisplayName(long font); + static final native long CTFontCreate(long fileName, long psName, double size, CGAffineTransform matrix); static final native void CTFontDrawGlyphs(long font, short glyphs, double x, double y, long context); static final native double CTFontGetAdvancesForGlyphs(long font, int orientation, short glyphs, CGSize advances); static final native boolean CTFontGetBoundingRectForGlyphUsingTables(long font, short glyphs, short format, int[] retArr); @@ -98,7 +99,6 @@ static final native long CGColorSpaceCreateDeviceRGB(); static final native void CGColorSpaceRelease(long space); static final native void CGPathRelease(long path); - static final native long CTFontCreateWithName(long name, double size, CGAffineTransform matrix); static final native long CTFontCreatePathForGlyph(long font, short glyph, CGAffineTransform matrix); static final native boolean CTFontManagerRegisterFontsForURL(long fontURL, int scope, long error); static final native long CTLineCreateWithAttributedString(long string); --- old/modules/javafx.graphics/src/main/native-font/coretext.c 2016-10-04 00:13:37.000000000 +0530 +++ new/modules/javafx.graphics/src/main/native-font/coretext.c 2016-10-04 00:13:36.000000000 +0530 @@ -364,19 +364,6 @@ return rc; } -JNIEXPORT jlong JNICALL OS_NATIVE(CTFontCreateWithName) - (JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jobject arg2) -{ - CGAffineTransform _arg2, *lparg2=NULL; - jlong rc = 0; - if (arg2) if ((lparg2 = getCGAffineTransformFields(env, arg2, &_arg2)) == NULL) goto fail; - rc = (jlong)CTFontCreateWithName((CFStringRef)arg0, (CGFloat)arg1, (CGAffineTransform*)lparg2); -fail: - /* In only */ -// if (arg2 && lparg2) setCGAffineTransformFields(env, arg2, lparg2); - return rc; -} - JNIEXPORT void JNICALL OS_NATIVE(CFRelease) (JNIEnv *env, jclass that, jlong arg0) { @@ -679,6 +666,32 @@ return (*env)->NewString(env, (jchar *)buffer, length); } +JNIEXPORT jlong JNICALL OS_NATIVE(CTFontCreate) + (JNIEnv *env, jclass that, jlong fileName, jlong psName, jdouble size, jobject matrix) +{ + CGAffineTransform transform, *transformPtr = NULL; + CTFontRef fontRef = NULL; + + if (matrix) if ((transformPtr = getCGAffineTransformFields(env, matrix, &transform)) == NULL) goto fail; + + CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)fileName, kCFURLPOSIXPathStyle, false); + CGDataProviderRef dataProvider = CGDataProviderCreateWithURL(url); + CGFontRef cgFont = CGFontCreateWithDataProvider(dataProvider); + if (cgFont) { + fontRef = CTFontCreateWithGraphicsFont(cgFont, (CGFloat)size, (CGAffineTransform*)transformPtr, 0); + CFRelease(cgFont); + } else { + // TTC files are supported by CGFontCreateWithDataProvider, fallback to CTFontCreateWithName. + fontRef = CTFontCreateWithName((CFStringRef)psName, (CGFloat)size, (CGAffineTransform*)transformPtr); + } + CFRelease(dataProvider); + CFRelease(url); +fail: + /* In only */ +// if (arg2 && lparg2) setCGAffineTransformFields(env, arg2, lparg2); + return (jlong)fontRef; +} + JNIEXPORT jbyteArray JNICALL OS_NATIVE(CGBitmapContextGetData) (JNIEnv *env, jclass that, jlong arg0, jint dstWidth, jint dstHeight, jint bpp) {