diff options
author | Alexey Ushakov <Alexey.Ushakov@jetbrains.com> | 2017-09-22 20:04:12 +0300 |
---|---|---|
committer | Alexey Ushakov <Alexey.Ushakov@jetbrains.com> | 2017-09-22 20:08:39 +0300 |
commit | c58dc052af48887338a38beb0c721eddca3af481 (patch) | |
tree | 954f175c0b5c493238f701d9ec0598e82d388807 /src/macosx | |
parent | 778c610c4a4f7e84ec4723f3ff27f978cbaae0f9 (diff) | |
download | jdk8u_jdk-c58dc052af48887338a38beb0c721eddca3af481.tar.gz |
JRE-482 Java_sun_font_CStrike_getNativeGlyphOutline takes too much time in scrollingjb8u152-b1024.2jb8u152-b1024.1jb8u152-b1024
Replaced glyph outlines with bounding boxes for glyph boundaries calculation for most common usages. Also, skipped unnecessary OGL flushes in OGL rendering queue
Diffstat (limited to 'src/macosx')
-rw-r--r-- | src/macosx/classes/sun/font/CStrike.java | 19 | ||||
-rw-r--r-- | src/macosx/native/sun/font/AWTStrike.m | 35 |
2 files changed, 42 insertions, 12 deletions
diff --git a/src/macosx/classes/sun/font/CStrike.java b/src/macosx/classes/sun/font/CStrike.java index 9968a38c4e..8b919347ae 100644 --- a/src/macosx/classes/sun/font/CStrike.java +++ b/src/macosx/classes/sun/font/CStrike.java @@ -64,6 +64,11 @@ public final class CStrike extends PhysicalStrike { double x, double y); + private static native void getNativeGlyphOutlineBounds(long nativeStrikePtr, + int glyphCode, + Rectangle.Float result, + double x, double y); + // returns the bounding rect for a glyph private static native void getNativeGlyphImageBounds(long nativeStrikePtr, int glyphCode, @@ -176,18 +181,8 @@ public final class CStrike extends PhysicalStrike { } Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) { - GeneralPath gp = getGlyphOutline(glyphCode, 0f, 0f); - Rectangle2D r2d = gp.getBounds2D(); - Rectangle2D.Float r2df; - if (r2d instanceof Rectangle2D.Float) { - r2df = (Rectangle2D.Float)r2d; - } else { - float x = (float)r2d.getX(); - float y = (float)r2d.getY(); - float w = (float)r2d.getWidth(); - float h = (float)r2d.getHeight(); - r2df = new Rectangle2D.Float(x, y, w, h); - } + Rectangle2D.Float r2df = new Rectangle2D.Float(); + getNativeGlyphOutlineBounds(getNativeStrikePtr(), glyphCode, r2df, 0, 0); return r2df; } diff --git a/src/macosx/native/sun/font/AWTStrike.m b/src/macosx/native/sun/font/AWTStrike.m index b58fe691bc..4d36d83e9d 100644 --- a/src/macosx/native/sun/font/AWTStrike.m +++ b/src/macosx/native/sun/font/AWTStrike.m @@ -308,6 +308,41 @@ JNF_COCOA_EXIT(env); /* * Class: sun_font_CStrike + * Method: getNativeGlyphOutlineBounds + * Signature: (JILjava/awt/geom/Rectangle2D/Float;DD)V + */ +JNIEXPORT void JNICALL Java_sun_font_CStrike_getNativeGlyphOutlineBounds + (JNIEnv *env, jclass clazz, jlong awtStrikePtr, jint glyphCode, + jobject result, jdouble xPos, jdouble yPos) +{ + + JNF_COCOA_ENTER(env); + + AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr); + AWTFont *awtfont = awtStrike->fAWTFont; + + // get the right font and glyph for this "Java GlyphCode" + + CGGlyph glyph; + const CTFontRef font = CTS_CopyCTFallbackFontAndGlyphForJavaGlyphCode(awtfont, glyphCode, &glyph); + CGRect bbox = CTFontGetBoundingRectsForGlyphs(font, + kCTFontDefaultOrientation, + &glyph, NULL, 1); + CFRelease(font); + static JNF_CLASS_CACHE(sjc_Rectangle2D_Float, + "java/awt/geom/Rectangle2D$Float"); + static JNF_MEMBER_CACHE(sjr_Rectangle2DFloat_setRect, + sjc_Rectangle2D_Float, "setRect", "(FFFF)V"); + + JNFCallVoidMethod(env, result, sjr_Rectangle2DFloat_setRect, + (jfloat)bbox.origin.x + xPos, + (jfloat)bbox.origin.y + yPos, + (jfloat)bbox.size.width, (jfloat)bbox.size.height); + + JNF_COCOA_EXIT(env); +} +/* + * Class: sun_font_CStrike * Method: getGlyphImagePtrsNative * Signature: (JJ[J[II)V */ |