40 |
|
|
41 |
struct state_table *native_font_state_table; |
struct state_table *native_font_state_table; |
42 |
|
|
|
/* |
|
|
rough sketch of the mapping between java and |
|
|
pango text objects: |
|
|
|
|
|
Font <-> - PangoFont |
|
|
- PangoFontDescription |
|
|
- PangoContext |
|
|
- PangoLayout (for rendering and measuring) |
|
|
|
|
|
GlyphVector <-> - GList of PangoGlyphItem |
|
|
- PangoFontDescription |
|
|
- PangoContext |
|
|
|
|
|
FontRenderContext <-> stays in plain java |
|
|
|
|
|
*/ |
|
|
|
|
43 |
enum java_awt_font_style { |
enum java_awt_font_style { |
44 |
java_awt_font_PLAIN = 0, |
java_awt_font_PLAIN = 0, |
45 |
java_awt_font_BOLD = 1, |
java_awt_font_BOLD = 1, |
52 |
java_awt_font_HANGING_BASELINE = 2 |
java_awt_font_HANGING_BASELINE = 2 |
53 |
}; |
}; |
54 |
|
|
55 |
|
static jmethodID glyphVector_ctor; |
56 |
|
static jclass glyphVector_class; |
57 |
|
static PangoAttrList *attrs = NULL; |
58 |
|
|
59 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
60 |
Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState |
Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState |
61 |
(JNIEnv *env, jclass clazz) |
(JNIEnv *env, jclass clazz) |
62 |
{ |
{ |
63 |
NSA_FONT_INIT (env, clazz); |
NSA_FONT_INIT (env, clazz); |
64 |
|
|
65 |
|
glyphVector_class = (*env)->FindClass |
66 |
|
(env, "gnu/java/awt/peer/gtk/GdkGlyphVector"); |
67 |
|
|
68 |
|
glyphVector_ctor = (*env)->GetMethodID |
69 |
|
(env, glyphVector_class, "<init>", |
70 |
|
"([D[ILjava/awt/Font;Ljava/awt/font/FontRenderContext;)V"); |
71 |
} |
} |
72 |
|
|
73 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
105 |
gdk_threads_leave (); |
gdk_threads_leave (); |
106 |
} |
} |
107 |
|
|
108 |
|
|
109 |
|
JNIEXPORT jobject JNICALL |
110 |
|
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector |
111 |
|
(JNIEnv *env, jobject self, |
112 |
|
jstring chars, |
113 |
|
jobject font, |
114 |
|
jobject fontRenderContext) |
115 |
|
{ |
116 |
|
struct peerfont *pfont = NULL; |
117 |
|
GList *items = NULL, *i = NULL; |
118 |
|
gchar *str = NULL; |
119 |
|
int len, j; |
120 |
|
double *native_extents; |
121 |
|
int *native_codes; |
122 |
|
jintArray java_codes = NULL; |
123 |
|
jdoubleArray java_extents = NULL; |
124 |
|
|
125 |
|
gdk_threads_enter (); |
126 |
|
|
127 |
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self); |
128 |
|
g_assert (pfont != NULL); |
129 |
|
|
130 |
|
len = (*gdk_env())->GetStringUTFLength (env, chars); |
131 |
|
str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL); |
132 |
|
g_assert (str != NULL); |
133 |
|
|
134 |
|
if (attrs == NULL) |
135 |
|
attrs = pango_attr_list_new (); |
136 |
|
|
137 |
|
if (len > 0 && str[len-1] == '\0') |
138 |
|
len--; |
139 |
|
|
140 |
|
items = pango_itemize (pfont->ctx, str, 0, len, attrs, NULL); |
141 |
|
|
142 |
|
i = g_list_first (items); |
143 |
|
|
144 |
|
if (i == NULL) |
145 |
|
{ |
146 |
|
java_extents = (*env)->NewDoubleArray (env, 0); |
147 |
|
java_codes = (*env)->NewIntArray (env, 0); |
148 |
|
} |
149 |
|
else |
150 |
|
{ |
151 |
|
PangoGlyphString *glyphs; |
152 |
|
PangoItem *item = (PangoItem *)i->data; |
153 |
|
|
154 |
|
pango_context_set_font_description (pfont->ctx, pfont->desc); |
155 |
|
pango_context_set_language (pfont->ctx, gtk_get_default_language()); |
156 |
|
pango_context_load_font (pfont->ctx, pfont->desc); |
157 |
|
|
158 |
|
glyphs = pango_glyph_string_new (); |
159 |
|
g_assert (glyphs != NULL); |
160 |
|
|
161 |
|
pango_shape (str + item->offset, item->length, |
162 |
|
&(item->analysis), glyphs); |
163 |
|
|
164 |
|
if (glyphs->num_glyphs > 0) |
165 |
|
{ |
166 |
|
int x = 0; |
167 |
|
double scale = ((double) PANGO_SCALE); |
168 |
|
|
169 |
|
java_extents = (*env)->NewDoubleArray (env, glyphs->num_glyphs * NUM_GLYPH_METRICS); |
170 |
|
java_codes = (*env)->NewIntArray (env, glyphs->num_glyphs); |
171 |
|
native_extents = (*env)->GetDoubleArrayElements (env, java_extents, NULL); |
172 |
|
native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); |
173 |
|
|
174 |
|
for (j = 0; j < glyphs->num_glyphs; ++j) |
175 |
|
{ |
176 |
|
PangoRectangle ink; |
177 |
|
PangoRectangle logical; |
178 |
|
PangoGlyphGeometry *geom = &glyphs->glyphs[j].geometry; |
179 |
|
|
180 |
|
pango_font_get_glyph_extents (pfont->font, |
181 |
|
glyphs->glyphs[j].glyph, |
182 |
|
&ink, &logical); |
183 |
|
|
184 |
|
native_codes[j] = glyphs->glyphs[j].glyph; |
185 |
|
|
186 |
|
native_extents[ GLYPH_LOG_X(j) ] = (logical.x) / scale; |
187 |
|
native_extents[ GLYPH_LOG_Y(j) ] = (- logical.y) / scale; |
188 |
|
native_extents[ GLYPH_LOG_WIDTH(j) ] = (logical.width) / scale; |
189 |
|
native_extents[ GLYPH_LOG_HEIGHT(j) ] = (logical.height) / scale; |
190 |
|
|
191 |
|
native_extents[ GLYPH_INK_X(j) ] = (ink.x) / scale; |
192 |
|
native_extents[ GLYPH_INK_Y(j) ] = (- ink.y) / scale; |
193 |
|
native_extents[ GLYPH_INK_WIDTH(j) ] = (ink.width) / scale; |
194 |
|
native_extents[ GLYPH_INK_HEIGHT(j) ] = (ink.height) / scale; |
195 |
|
|
196 |
|
native_extents[ GLYPH_POS_X(j) ] = (x + geom->x_offset) / scale; |
197 |
|
native_extents[ GLYPH_POS_Y(j) ] = ( - geom->y_offset) / scale; |
198 |
|
|
199 |
|
x += geom->width; |
200 |
|
} |
201 |
|
(*env)->ReleaseDoubleArrayElements (env, java_extents, native_extents, 0); |
202 |
|
(*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); |
203 |
|
} |
204 |
|
|
205 |
|
pango_glyph_string_free (glyphs); |
206 |
|
} |
207 |
|
|
208 |
|
(*env)->ReleaseStringUTFChars (env, chars, str); |
209 |
|
|
210 |
|
for (i = g_list_first (items); i != NULL; i = g_list_next (i)) |
211 |
|
g_free (i->data); |
212 |
|
|
213 |
|
g_list_free (items); |
214 |
|
|
215 |
|
gdk_threads_leave (); |
216 |
|
|
217 |
|
return (*env)->NewObject (env, |
218 |
|
glyphVector_class, |
219 |
|
glyphVector_ctor, |
220 |
|
java_extents, java_codes, |
221 |
|
font, fontRenderContext); |
222 |
|
} |
223 |
|
|
224 |
|
JNIEXPORT void JNICALL |
225 |
|
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics |
226 |
|
(JNIEnv *env, jobject java_font, jdoubleArray java_metrics) |
227 |
|
{ |
228 |
|
struct peerfont *pfont = NULL; |
229 |
|
jdouble *native_metrics = NULL; |
230 |
|
PangoFontMetrics *pango_metrics; |
231 |
|
|
232 |
|
gdk_threads_enter(); |
233 |
|
|
234 |
|
pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font); |
235 |
|
g_assert (pfont != NULL); |
236 |
|
|
237 |
|
pango_metrics |
238 |
|
= pango_context_get_metrics (pfont->ctx, pfont->desc, |
239 |
|
gtk_get_default_language ()); |
240 |
|
|
241 |
|
native_metrics |
242 |
|
= (*env)->GetDoubleArrayElements (env, java_metrics, NULL); |
243 |
|
|
244 |
|
g_assert (native_metrics != NULL); |
245 |
|
|
246 |
|
native_metrics[FONT_METRICS_ASCENT] |
247 |
|
= PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics)); |
248 |
|
|
249 |
|
native_metrics[FONT_METRICS_MAX_ASCENT] |
250 |
|
= native_metrics[FONT_METRICS_ASCENT]; |
251 |
|
|
252 |
|
native_metrics[FONT_METRICS_DESCENT] |
253 |
|
= PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics)); |
254 |
|
|
255 |
|
if (native_metrics[FONT_METRICS_DESCENT] < 0) |
256 |
|
native_metrics[FONT_METRICS_DESCENT] |
257 |
|
= - native_metrics[FONT_METRICS_DESCENT]; |
258 |
|
|
259 |
|
native_metrics[FONT_METRICS_MAX_DESCENT] |
260 |
|
= native_metrics[FONT_METRICS_DESCENT]; |
261 |
|
|
262 |
|
native_metrics[FONT_METRICS_MAX_ADVANCE] |
263 |
|
= PANGO_PIXELS (pango_font_metrics_get_approximate_char_width |
264 |
|
(pango_metrics)); |
265 |
|
|
266 |
|
(*env)->ReleaseDoubleArrayElements (env, |
267 |
|
java_metrics, |
268 |
|
native_metrics, 0); |
269 |
|
|
270 |
|
pango_font_metrics_unref (pango_metrics); |
271 |
|
|
272 |
|
gdk_threads_leave(); |
273 |
|
} |
274 |
|
|
275 |
|
JNIEXPORT void JNICALL |
276 |
|
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics |
277 |
|
(JNIEnv *env, jobject java_font, jstring str, jdoubleArray java_metrics) |
278 |
|
{ |
279 |
|
struct peerfont *pfont = NULL; |
280 |
|
const char *cstr = NULL; |
281 |
|
jdouble *native_metrics = NULL; |
282 |
|
PangoRectangle log; |
283 |
|
|
284 |
|
gdk_threads_enter(); |
285 |
|
|
286 |
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); |
287 |
|
g_assert (pfont != NULL); |
288 |
|
|
289 |
|
cstr = (*env)->GetStringUTFChars (env, str, NULL); |
290 |
|
g_assert(cstr != NULL); |
291 |
|
|
292 |
|
pango_layout_set_text (pfont->layout, cstr, -1); |
293 |
|
pango_layout_get_extents (pfont->layout, NULL, &log); |
294 |
|
|
295 |
|
(*env)->ReleaseStringUTFChars (env, str, cstr); |
296 |
|
pango_layout_set_text (pfont->layout, "", -1); |
297 |
|
|
298 |
|
native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); |
299 |
|
g_assert (native_metrics != NULL); |
300 |
|
|
301 |
|
native_metrics[TEXT_METRICS_X_BEARING] |
302 |
|
= PANGO_PIXELS( ((double)log.x) ); |
303 |
|
|
304 |
|
native_metrics[TEXT_METRICS_Y_BEARING] |
305 |
|
= PANGO_PIXELS( ((double)log.y) ); |
306 |
|
|
307 |
|
native_metrics[TEXT_METRICS_WIDTH] |
308 |
|
= PANGO_PIXELS( ((double)log.width) ); |
309 |
|
|
310 |
|
native_metrics[TEXT_METRICS_HEIGHT] |
311 |
|
= PANGO_PIXELS( ((double)log.height) ); |
312 |
|
|
313 |
|
native_metrics[TEXT_METRICS_X_ADVANCE] |
314 |
|
= PANGO_PIXELS( ((double) (log.x + log.width)) ); |
315 |
|
|
316 |
|
native_metrics[TEXT_METRICS_Y_ADVANCE] |
317 |
|
= PANGO_PIXELS( ((double) (log.y + log.height)) ); |
318 |
|
|
319 |
|
(*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); |
320 |
|
|
321 |
|
gdk_threads_leave(); |
322 |
|
} |
323 |
|
|
324 |
|
|
325 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
326 |
Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont |
Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont |
327 |
(JNIEnv *env, jobject self, jstring family_name_str, jint style_int, jint size, jboolean useGraphics2D) |
(JNIEnv *env, jobject self, jstring family_name_str, jint style_int, jint size, jboolean useGraphics2D) |
353 |
pango_font_description_set_family (pfont->desc, family_name); |
pango_font_description_set_family (pfont->desc, family_name); |
354 |
(*env)->ReleaseStringUTFChars(env, family_name_str, family_name); |
(*env)->ReleaseStringUTFChars(env, family_name_str, family_name); |
355 |
|
|
|
pango_font_description_set_size (pfont->desc, size * dpi_conversion_factor); |
|
356 |
|
|
357 |
if (style & java_awt_font_BOLD) |
if (style & java_awt_font_BOLD) |
358 |
pango_font_description_set_weight (pfont->desc, PANGO_WEIGHT_BOLD); |
pango_font_description_set_weight (pfont->desc, PANGO_WEIGHT_BOLD); |
362 |
|
|
363 |
if (useGraphics2D) |
if (useGraphics2D) |
364 |
{ |
{ |
365 |
|
pango_font_description_set_size (pfont->desc, size * PANGO_SCALE); |
366 |
if (pfont->ctx == NULL) |
if (pfont->ctx == NULL) |
367 |
{ |
{ |
368 |
ft2_map = PANGO_FT2_FONT_MAP(pango_ft2_font_map_for_display ()); |
ft2_map = PANGO_FT2_FONT_MAP(pango_ft2_font_map_for_display ()); |
371 |
} |
} |
372 |
else |
else |
373 |
{ |
{ |
374 |
|
/* GDK uses a slightly different DPI setting. */ |
375 |
|
pango_font_description_set_size (pfont->desc, |
376 |
|
size * dpi_conversion_factor); |
377 |
if (pfont->ctx == NULL) |
if (pfont->ctx == NULL) |
378 |
pfont->ctx = gdk_pango_context_get(); |
pfont->ctx = gdk_pango_context_get(); |
379 |
} |
} |