/[classpath]/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
ViewVC logotype

Diff of /classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4.2.2 by gnu_andrew, Sun Jan 16 02:14:50 2005 UTC revision 1.4.2.3 by gnu_andrew, Wed Feb 16 01:11:42 2005 UTC
# Line 40  Line 40 
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,
# Line 69  enum java_awt_font_baseline { Line 52  enum java_awt_font_baseline {
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
# Line 111  Java_gnu_java_awt_peer_gtk_GdkFontPeer_d Line 105  Java_gnu_java_awt_peer_gtk_GdkFontPeer_d
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)
# Line 142  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s Line 353  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s
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);
# Line 152  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s Line 362  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s
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 ());
# Line 160  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s Line 371  Java_gnu_java_awt_peer_gtk_GdkFontPeer_s
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      }      }

Legend:
Removed from v.1.4.2.2  
changed lines
  Added in v.1.4.2.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26