< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/CTextPipe.m

Print this page
rev 54094 : 8257853: Remove dependencies on JNF's JNI utility functions in AWT and 2D code
rev 54096 : 8259651: [macOS] Replace JNF_COCOA_ENTER/EXIT macros
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion

@@ -28,15 +28,14 @@
 
 #import "sun_awt_SunHints.h"
 #import "sun_lwawt_macosx_CTextPipe.h"
 #import "sun_java2d_OSXSurfaceData.h"
 
-#import <JavaNativeFoundation/JavaNativeFoundation.h>
-
 #import "CoreTextSupport.h"
 #import "QuartzSurfaceData.h"
 #include "AWTStrike.h"
+#import "JNIUtilities.h"
 
 static const CGAffineTransform sInverseTX = { 1, 0, 0, -1, 0, 0 };
 
 
 #pragma mark --- CoreText Support ---

@@ -320,20 +319,22 @@
     acquired at a given stage, must be released in that stage. Any error that occurs (like a failed malloc)
     is to be handled in the stage it occurs in, and is to return immediatly after freeing it's resources.
 
 -----------------------------------*/
 
-static JNF_CLASS_CACHE(jc_StandardGlyphVector, "sun/font/StandardGlyphVector");
+static jclass jc_StandardGlyphVector = NULL;
+#define GET_SGV_CLASS() GET_CLASS(jc_StandardGlyphVector, "sun/font/StandardGlyphVector");
 
 // Checks the GlyphVector Java object for any transforms that were applied to individual characters. If none are present,
 // strike the glyphs immediately in Core Graphics. Otherwise, obtain the arrays, and defer to above.
 static inline void doDrawGlyphsPipe_checkForPerGlyphTransforms
 (JNIEnv *env, QuartzSDOps *qsdo, const AWTStrike *strike, jobject gVector, BOOL useSubstituion, int *uniChars, CGGlyph *glyphs, CGSize *advances, size_t length)
 {
     // if we have no character substitution, and no per-glyph transformations - strike now!
-    static JNF_MEMBER_CACHE(jm_StandardGlyphVector_gti, jc_StandardGlyphVector, "gti", "Lsun/font/StandardGlyphVector$GlyphTransformInfo;");
-    jobject gti = JNFGetObjectField(env, gVector, jm_StandardGlyphVector_gti);
+    GET_SGV_CLASS();
+    DECLARE_FIELD(jm_StandardGlyphVector_gti, jc_StandardGlyphVector, "gti", "Lsun/font/StandardGlyphVector$GlyphTransformInfo;");
+    jobject gti = (*env)->GetObjectField(env, gVector, jm_StandardGlyphVector_gti);
     if (gti == 0)
     {
         if (useSubstituion)
         {
             // quasi-simple case, substitution, but no per-glyph transforms

@@ -345,24 +346,24 @@
             CGContextShowGlyphsWithAdvances(qsdo->cgRef, glyphs, advances, length);
         }
         return;
     }
 
-    static JNF_CLASS_CACHE(jc_StandardGlyphVector_GlyphTransformInfo, "sun/font/StandardGlyphVector$GlyphTransformInfo");
-    static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_transforms, jc_StandardGlyphVector_GlyphTransformInfo, "transforms", "[D");
-    jdoubleArray g_gtiTransformsArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_transforms); //(*env)->GetObjectField(env, gti, g_gtiTransforms);
+    DECLARE_CLASS(jc_StandardGlyphVector_GlyphTransformInfo, "sun/font/StandardGlyphVector$GlyphTransformInfo");
+    DECLARE_FIELD(jm_StandardGlyphVector_GlyphTransformInfo_transforms, jc_StandardGlyphVector_GlyphTransformInfo, "transforms", "[D");
+    jdoubleArray g_gtiTransformsArray = (*env)->GetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_transforms); //(*env)->GetObjectField(env, gti, g_gtiTransforms);
     if (g_gtiTransformsArray == NULL) {
         return;
     }
     jdouble *g_gvTransformsAsDoubles = (*env)->GetPrimitiveArrayCritical(env, g_gtiTransformsArray, NULL);
     if (g_gvTransformsAsDoubles == NULL) {
         (*env)->DeleteLocalRef(env, g_gtiTransformsArray);
         return;
     }
 
-    static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_indices, jc_StandardGlyphVector_GlyphTransformInfo, "indices", "[I");
-    jintArray g_gtiTXIndicesArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_indices);
+    DECLARE_FIELD(jm_StandardGlyphVector_GlyphTransformInfo_indices, jc_StandardGlyphVector_GlyphTransformInfo, "indices", "[I");
+    jintArray g_gtiTXIndicesArray = (*env)->GetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_indices);
     jint *g_gvTXIndicesAsInts = (*env)->GetPrimitiveArrayCritical(env, g_gtiTXIndicesArray, NULL);
     if (g_gvTXIndicesAsInts == NULL) {
         (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTransformsArray, g_gvTransformsAsDoubles, JNI_ABORT);
         (*env)->DeleteLocalRef(env, g_gtiTransformsArray);
         (*env)->DeleteLocalRef(env, g_gtiTXIndicesArray);

@@ -435,12 +436,13 @@
     }
 
     (*env)->ReleasePrimitiveArrayCritical(env, glyphsArray, glyphsAsInts, JNI_ABORT);
 
     // fill the advance buffer
-    static JNF_MEMBER_CACHE(jm_StandardGlyphVector_positions, jc_StandardGlyphVector, "positions", "[F");
-    jfloatArray posArray = JNFGetObjectField(env, gVector, jm_StandardGlyphVector_positions);
+    GET_SGV_CLASS();
+    DECLARE_FIELD(jm_StandardGlyphVector_positions, jc_StandardGlyphVector, "positions", "[F");
+    jfloatArray posArray = (*env)->GetObjectField(env, gVector, jm_StandardGlyphVector_positions);
     jfloat *positions = NULL;
     if (posArray != NULL) {
         // in this case, the positions have already been pre-calculated for us on the Java side
         positions = (*env)->GetPrimitiveArrayCritical(env, posArray, NULL);
         if (positions == NULL) {

@@ -495,12 +497,13 @@
 // Obtains the glyph array to determine the number of glyphs we are dealing with. If we are dealing a large number of glyphs,
 // we malloc a buffer to hold the glyphs and their advances, otherwise we use stack allocated buffers.
 static inline void doDrawGlyphsPipe_getGlyphVectorLengthAndAlloc
 (JNIEnv *env, QuartzSDOps *qsdo, const AWTStrike *strike, jobject gVector)
 {
-    static JNF_MEMBER_CACHE(jm_StandardGlyphVector_glyphs, jc_StandardGlyphVector, "glyphs", "[I");
-    jintArray glyphsArray = JNFGetObjectField(env, gVector, jm_StandardGlyphVector_glyphs);
+    GET_SGV_CLASS();
+    DECLARE_FIELD(jm_StandardGlyphVector_glyphs, jc_StandardGlyphVector, "glyphs", "[I");
+    jintArray glyphsArray = (*env)->GetObjectField(env, gVector, jm_StandardGlyphVector_glyphs);
     jsize length = (*env)->GetArrayLength(env, glyphsArray);
 
     if (length == 0)
     {
         // nothing to draw

@@ -579,38 +582,45 @@
  * Signature: (Lsun/java2d/SurfaceData;JLjava/lang/String;DD)V
  */
 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CTextPipe_doDrawString
 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jlong awtStrikePtr, jstring str, jdouble x, jdouble y)
 {
+    if (str == NULL) {
+        return;
+    }
     QuartzSDOps *qsdo = (QuartzSDOps *)SurfaceData_GetOps(env, jsurfacedata);
     AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
 
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
 
     jsize len = (*env)->GetStringLength(env, str);
 
     if (len < MAX_STACK_ALLOC_GLYPH_BUFFER_SIZE) // optimized for stack allocation <rdar://problem/4285041>
     {
         jchar unichars[len];
         (*env)->GetStringRegion(env, str, 0, len, unichars);
-        JNF_CHECK_AND_RETHROW_EXCEPTION(env);
+        CHECK_EXCEPTION();
 
         // Draw the text context
         DrawTextContext(env, qsdo, awtStrike, unichars, len, x, y);
     }
     else
     {
         // Get string to draw and the length
-        const jchar *unichars = JNFGetStringUTF16UniChars(env, str);
+        const jchar *unichars = (*env)->GetStringChars(env, str, NULL);
+        if (unichars == NULL) {
+            JNU_ThrowOutOfMemoryError(env, "Could not get string chars");
+            return;
+        }
 
         // Draw the text context
         DrawTextContext(env, qsdo, awtStrike, unichars, len, x, y);
 
-        JNFReleaseStringUTF16UniChars(env, str, unichars);
+        (*env)->ReleaseStringChars(env, str, unichars);
     }
 
-JNF_COCOA_RENDERER_EXIT(env);
+JNI_COCOA_RENDERER_EXIT(env);
 }
 
 
 /*
  * Class:     sun_lwawt_macosx_CTextPipe

@@ -621,37 +631,38 @@
 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jlong awtStrikePtr, jcharArray unicodes, jint offset, jint length, jfloat x, jfloat y)
 {
     QuartzSDOps *qsdo = (QuartzSDOps *)SurfaceData_GetOps(env, jsurfacedata);
     AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
 
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
 
     // Setup the text context
     if (length < MAX_STACK_ALLOC_GLYPH_BUFFER_SIZE) // optimized for stack allocation
     {
         jchar copyUnichars[length];
         (*env)->GetCharArrayRegion(env, unicodes, offset, length, copyUnichars);
-        JNF_CHECK_AND_RETHROW_EXCEPTION(env);
+        CHECK_EXCEPTION();
         DrawTextContext(env, qsdo, awtStrike, copyUnichars, length, x, y);
     }
     else
     {
         jchar *copyUnichars = malloc(length * sizeof(jchar));
         if (!copyUnichars) {
-            [JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory to create the glyphs for string drawing"];
+            JNU_ThrowOutOfMemoryError(env, "Failed to malloc memory to create the glyphs for string drawing");
+            return;
         }
 
         @try {
             (*env)->GetCharArrayRegion(env, unicodes, offset, length, copyUnichars);
-            JNF_CHECK_AND_RETHROW_EXCEPTION(env);
+            CHECK_EXCEPTION();
             DrawTextContext(env, qsdo, awtStrike, copyUnichars, length, x, y);
         } @finally {
             free(copyUnichars);
         }
     }
 
-JNF_COCOA_RENDERER_EXIT(env);
+JNI_COCOA_RENDERER_EXIT(env);
 }
 
 /*
  * Class:     sun_lwawt_macosx_CTextPipe
  * Method:    doOneUnicode

@@ -661,15 +672,15 @@
 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jlong awtStrikePtr, jchar aUnicode, jfloat x, jfloat y)
 {
     QuartzSDOps *qsdo = (QuartzSDOps *)SurfaceData_GetOps(env, jsurfacedata);
     AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
 
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
 
     DrawTextContext(env, qsdo, awtStrike, &aUnicode, 1, x, y);
 
-JNF_COCOA_RENDERER_EXIT(env);
+JNI_COCOA_RENDERER_EXIT(env);
 }
 
 /*
  * Class: sun_lwawt_macosx_CTextPipe
  * Method: doDrawGlyphs

@@ -679,11 +690,11 @@
 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jlong awtStrikePtr, jobject gVector, jfloat x, jfloat y)
 {
     QuartzSDOps *qsdo = (QuartzSDOps *)SurfaceData_GetOps(env, jsurfacedata);
     AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
 
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
 
     qsdo->BeginSurface(env, qsdo, SD_Text);
     if (qsdo->cgRef == NULL)
     {
         qsdo->FinishSurface(env, qsdo);

@@ -697,7 +708,7 @@
 
     CGContextRestoreGState(qsdo->cgRef);
 
     qsdo->FinishSurface(env, qsdo);
 
-JNF_COCOA_RENDERER_EXIT(env);
+JNI_COCOA_RENDERER_EXIT(env);
 }
< prev index next >