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

Print this page




  39 
  40 void putFloat(JNIEnv* env, jobject pt, jfloat x, jfloat y) {
  41     env->SetFloatField(pt, sunFontIDs.xFID, x);
  42     env->SetFloatField(pt, sunFontIDs.yFID, y);
  43 }
  44 
  45 static jclass gvdClass = 0;
  46 static const char* gvdClassName = "sun/font/GlyphLayout$GVData";
  47 static jfieldID gvdCountFID = 0;
  48 static jfieldID gvdFlagsFID = 0;
  49 static jfieldID gvdGlyphsFID = 0;
  50 static jfieldID gvdPositionsFID = 0;
  51 static jfieldID gvdIndicesFID = 0;
  52 
  53 #define TYPO_RTL 0x80000000
  54 #define TYPO_MASK 0x7
  55 
  56 JNIEXPORT void JNICALL
  57 Java_sun_font_SunLayoutEngine_initGVIDs
  58     (JNIEnv *env, jclass cls) {
  59     gvdClass = env->FindClass(gvdClassName);
  60     if (!gvdClass) {
  61         JNU_ThrowClassNotFoundException(env, gvdClassName);
  62         return;
  63     }
  64     gvdClass = (jclass)env->NewGlobalRef(gvdClass);
  65       if (!gvdClass) {
  66         JNU_ThrowInternalError(env, "could not create global ref");
  67         return;
  68     }
  69     gvdCountFID = env->GetFieldID(gvdClass, "_count", "I");
  70     if (!gvdCountFID) {
  71       gvdClass = 0;
  72       JNU_ThrowNoSuchFieldException(env, "_count");
  73       return;
  74     }
  75 
  76     gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I");
  77     if (!gvdFlagsFID) {
  78       gvdClass = 0;
  79       JNU_ThrowNoSuchFieldException(env, "_flags");
  80       return;
  81     }
  82 
  83     gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I");
  84     if (!gvdGlyphsFID) {
  85       gvdClass = 0;
  86       JNU_ThrowNoSuchFieldException(env, "_glyphs");
  87       return;
  88     }
  89 
  90     gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F");
  91     if (!gvdPositionsFID) {
  92       gvdClass = 0;
  93       JNU_ThrowNoSuchFieldException(env, "_positions");
  94       return;
  95     }
  96 
  97     gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I");
  98     if (!gvdIndicesFID) {
  99       gvdClass = 0;
 100       JNU_ThrowNoSuchFieldException(env, "_indices");
 101       return;
 102     }
 103 }
 104 
 105 int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) {
 106     int count = env->GetIntField(gvdata, gvdCountFID);
 107     if (count < 0) {
 108       JNU_ThrowInternalError(env, "count negative");
 109       return 0;
 110     }
 111 
 112     jarray glyphArray = (jarray)env->GetObjectField(gvdata, gvdGlyphsFID);
 113     if (IS_NULL(glyphArray)) {
 114       JNU_ThrowInternalError(env, "glypharray null");
 115       return 0;
 116     }
 117     jint capacity = env->GetArrayLength(glyphArray);
 118     if (count + glyphCount > capacity) {
 119       JNU_ThrowArrayIndexOutOfBoundsException(env, "");
 120       return 0;
 121     }
 122 


 178    jlong upem, jlong layoutTables)
 179 {
 180     //  fprintf(stderr, "nl font: %x strike: %x script: %d\n", font2d, strike, script); fflush(stderr);
 181   float mat[4];
 182   env->GetFloatArrayRegion(matrix, 0, 4, mat);
 183   FontInstanceAdapter fia(env, font2d, strike, mat, 72, 72, (le_int32) upem, (TTLayoutTableCache *) layoutTables);
 184   LEErrorCode success = LE_NO_ERROR;
 185   LayoutEngine *engine = LayoutEngine::layoutEngineFactory(&fia, script, lang, typo_flags & TYPO_MASK, success);
 186   if (engine == NULL) {
 187     env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
 188     return;
 189   }
 190 
 191   if (min < 0) min = 0; if (max < min) max = min; /* defensive coding */
 192   // have to copy, yuck, since code does upcalls now.  this will be soooo slow
 193   jint len = max - min;
 194   jchar buffer[256];
 195   jchar* chars = buffer;
 196   if (len > 256) {
 197     size_t size = len * sizeof(jchar);
 198     if (size / sizeof(jchar) != len) {
 199       return;
 200     }
 201     chars = (jchar*)malloc(size);
 202     if (chars == 0) {
 203       return;
 204     }
 205   }
 206   //  fprintf(stderr, "nl chars: %x text: %x min %d len %d typo %x\n", chars, text, min, len, typo_flags); fflush(stderr);
 207 
 208   env->GetCharArrayRegion(text, min, len, chars);
 209 
 210   jfloat x, y;
 211   getFloat(env, pt, x, y);
 212   jboolean rtl = (typo_flags & TYPO_RTL) != 0;
 213   int glyphCount = engine->layoutChars(chars, start - min, limit - start, len, rtl, x, y, success);
 214     // fprintf(stderr, "sle nl len %d -> gc: %d\n", len, glyphCount); fflush(stderr);
 215 
 216   engine->getGlyphPosition(glyphCount, x, y, success);
 217 
 218    // fprintf(stderr, "layout glyphs: %d x: %g y: %g\n", glyphCount, x, y); fflush(stderr);
 219    if (LE_FAILURE(success)) {
 220        env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
 221    } else {
 222       if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) {

 223         // !!! hmmm, could use current value in positions array of GVData...
 224         putFloat(env, pt, x, y);
 225       }

 226    }
 227 
 228   if (chars != buffer) {
 229     free(chars);
 230   }
 231 
 232   delete engine;
 233 
 234 }


  39 
  40 void putFloat(JNIEnv* env, jobject pt, jfloat x, jfloat y) {
  41     env->SetFloatField(pt, sunFontIDs.xFID, x);
  42     env->SetFloatField(pt, sunFontIDs.yFID, y);
  43 }
  44 
  45 static jclass gvdClass = 0;
  46 static const char* gvdClassName = "sun/font/GlyphLayout$GVData";
  47 static jfieldID gvdCountFID = 0;
  48 static jfieldID gvdFlagsFID = 0;
  49 static jfieldID gvdGlyphsFID = 0;
  50 static jfieldID gvdPositionsFID = 0;
  51 static jfieldID gvdIndicesFID = 0;
  52 
  53 #define TYPO_RTL 0x80000000
  54 #define TYPO_MASK 0x7
  55 
  56 JNIEXPORT void JNICALL
  57 Java_sun_font_SunLayoutEngine_initGVIDs
  58     (JNIEnv *env, jclass cls) {
  59     CHECK_NULL(gvdClass = env->FindClass(gvdClassName));
  60     CHECK_NULL(gvdClass = (jclass)env->NewGlobalRef(gvdClass));
  61     CHECK_NULL(gvdCountFID = env->GetFieldID(gvdClass, "_count", "I"));
  62     CHECK_NULL(gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I"));
  63     CHECK_NULL(gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I"));
  64     CHECK_NULL(gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F"));
































  65     gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I");





  66 }
  67 
  68 int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) {
  69     int count = env->GetIntField(gvdata, gvdCountFID);
  70     if (count < 0) {
  71       JNU_ThrowInternalError(env, "count negative");
  72       return 0;
  73     }
  74 
  75     jarray glyphArray = (jarray)env->GetObjectField(gvdata, gvdGlyphsFID);
  76     if (IS_NULL(glyphArray)) {
  77       JNU_ThrowInternalError(env, "glypharray null");
  78       return 0;
  79     }
  80     jint capacity = env->GetArrayLength(glyphArray);
  81     if (count + glyphCount > capacity) {
  82       JNU_ThrowArrayIndexOutOfBoundsException(env, "");
  83       return 0;
  84     }
  85 


 141    jlong upem, jlong layoutTables)
 142 {
 143     //  fprintf(stderr, "nl font: %x strike: %x script: %d\n", font2d, strike, script); fflush(stderr);
 144   float mat[4];
 145   env->GetFloatArrayRegion(matrix, 0, 4, mat);
 146   FontInstanceAdapter fia(env, font2d, strike, mat, 72, 72, (le_int32) upem, (TTLayoutTableCache *) layoutTables);
 147   LEErrorCode success = LE_NO_ERROR;
 148   LayoutEngine *engine = LayoutEngine::layoutEngineFactory(&fia, script, lang, typo_flags & TYPO_MASK, success);
 149   if (engine == NULL) {
 150     env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
 151     return;
 152   }
 153 
 154   if (min < 0) min = 0; if (max < min) max = min; /* defensive coding */
 155   // have to copy, yuck, since code does upcalls now.  this will be soooo slow
 156   jint len = max - min;
 157   jchar buffer[256];
 158   jchar* chars = buffer;
 159   if (len > 256) {
 160     size_t size = len * sizeof(jchar);
 161     if (size / sizeof(jchar) != (size_t)len) {
 162       return;
 163     }
 164     chars = (jchar*)malloc(size);
 165     if (chars == 0) {
 166       return;
 167     }
 168   }
 169   //  fprintf(stderr, "nl chars: %x text: %x min %d len %d typo %x\n", chars, text, min, len, typo_flags); fflush(stderr);
 170 
 171   env->GetCharArrayRegion(text, min, len, chars);
 172 
 173   jfloat x, y;
 174   getFloat(env, pt, x, y);
 175   jboolean rtl = (typo_flags & TYPO_RTL) != 0;
 176   int glyphCount = engine->layoutChars(chars, start - min, limit - start, len, rtl, x, y, success);
 177     // fprintf(stderr, "sle nl len %d -> gc: %d\n", len, glyphCount); fflush(stderr);
 178 
 179   engine->getGlyphPosition(glyphCount, x, y, success);
 180 
 181    // fprintf(stderr, "layout glyphs: %d x: %g y: %g\n", glyphCount, x, y); fflush(stderr);
 182    if (LE_FAILURE(success)) {
 183        env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
 184    } else {
 185       if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) {
 186           if (!(env->ExceptionCheck())) {
 187         // !!! hmmm, could use current value in positions array of GVData...
 188         putFloat(env, pt, x, y);
 189       }
 190    }
 191    }
 192 
 193   if (chars != buffer) {
 194     free(chars);
 195   }
 196 
 197   delete engine;
 198 
 199 }