< 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 >