src/share/native/sun/font/layout/SunLayoutEngine.cpp

Print this page

        

@@ -54,54 +54,17 @@
 #define TYPO_MASK 0x7
 
 JNIEXPORT void JNICALL
 Java_sun_font_SunLayoutEngine_initGVIDs
     (JNIEnv *env, jclass cls) {
-    gvdClass = env->FindClass(gvdClassName);
-    if (!gvdClass) {
-        JNU_ThrowClassNotFoundException(env, gvdClassName);
-        return;
-    }
-    gvdClass = (jclass)env->NewGlobalRef(gvdClass);
-      if (!gvdClass) {
-        JNU_ThrowInternalError(env, "could not create global ref");
-        return;
-    }
-    gvdCountFID = env->GetFieldID(gvdClass, "_count", "I");
-    if (!gvdCountFID) {
-      gvdClass = 0;
-      JNU_ThrowNoSuchFieldException(env, "_count");
-      return;
-    }
-
-    gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I");
-    if (!gvdFlagsFID) {
-      gvdClass = 0;
-      JNU_ThrowNoSuchFieldException(env, "_flags");
-      return;
-    }
-
-    gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I");
-    if (!gvdGlyphsFID) {
-      gvdClass = 0;
-      JNU_ThrowNoSuchFieldException(env, "_glyphs");
-      return;
-    }
-
-    gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F");
-    if (!gvdPositionsFID) {
-      gvdClass = 0;
-      JNU_ThrowNoSuchFieldException(env, "_positions");
-      return;
-    }
-
+    CHECK_NULL(gvdClass = env->FindClass(gvdClassName));
+    CHECK_NULL(gvdClass = (jclass)env->NewGlobalRef(gvdClass));
+    CHECK_NULL(gvdCountFID = env->GetFieldID(gvdClass, "_count", "I"));
+    CHECK_NULL(gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I"));
+    CHECK_NULL(gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I"));
+    CHECK_NULL(gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F"));
     gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I");
-    if (!gvdIndicesFID) {
-      gvdClass = 0;
-      JNU_ThrowNoSuchFieldException(env, "_indices");
-      return;
-    }
 }
 
 int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) {
     int count = env->GetIntField(gvdata, gvdCountFID);
     if (count < 0) {

@@ -193,11 +156,11 @@
   jint len = max - min;
   jchar buffer[256];
   jchar* chars = buffer;
   if (len > 256) {
     size_t size = len * sizeof(jchar);
-    if (size / sizeof(jchar) != len) {
+    if (size / sizeof(jchar) != (size_t)len) {
       return;
     }
     chars = (jchar*)malloc(size);
     if (chars == 0) {
       return;

@@ -218,14 +181,16 @@
    // fprintf(stderr, "layout glyphs: %d x: %g y: %g\n", glyphCount, x, y); fflush(stderr);
    if (LE_FAILURE(success)) {
        env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
    } else {
       if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) {
+          if (!(env->ExceptionCheck())) {
         // !!! hmmm, could use current value in positions array of GVData...
         putFloat(env, pt, x, y);
       }
    }
+   }
 
   if (chars != buffer) {
     free(chars);
   }