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