aboutsummaryrefslogtreecommitdiff
path: root/src/macosx
diff options
context:
space:
mode:
authorAlexey Ushakov <Alexey.Ushakov@jetbrains.com>2017-09-22 20:04:12 +0300
committerAlexey Ushakov <Alexey.Ushakov@jetbrains.com>2017-09-22 20:08:39 +0300
commitc58dc052af48887338a38beb0c721eddca3af481 (patch)
tree954f175c0b5c493238f701d9ec0598e82d388807 /src/macosx
parent778c610c4a4f7e84ec4723f3ff27f978cbaae0f9 (diff)
downloadjdk8u_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.java19
-rw-r--r--src/macosx/native/sun/font/AWTStrike.m35
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
*/