src/share/native/sun/font/layout/SunLayoutEngine.cpp
Print this page
*** 54,107 ****
#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;
! }
!
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) {
--- 54,70 ----
#define TYPO_MASK 0x7
JNIEXPORT void JNICALL
Java_sun_font_SunLayoutEngine_initGVIDs
(JNIEnv *env, jclass cls) {
! 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");
}
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,203 ****
jint len = max - min;
jchar buffer[256];
jchar* chars = buffer;
if (len > 256) {
size_t size = len * sizeof(jchar);
! if (size / sizeof(jchar) != len) {
return;
}
chars = (jchar*)malloc(size);
if (chars == 0) {
return;
--- 156,166 ----
jint len = max - min;
jchar buffer[256];
jchar* chars = buffer;
if (len > 256) {
size_t size = len * sizeof(jchar);
! if (size / sizeof(jchar) != (size_t)len) {
return;
}
chars = (jchar*)malloc(size);
if (chars == 0) {
return;
*** 218,231 ****
--- 181,196 ----
// 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);
}