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

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

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

revision 1.21 by mkoch, Thu Feb 3 12:30:30 2005 UTC revision 1.22 by graydon, Sat Feb 12 09:37:31 2005 UTC
# Line 942  install_font_peer(cairo_t *cr, Line 942  install_font_peer(cairo_t *cr,
942        if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n",        if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n",
943                           face->family_name,                           face->family_name,
944                           (pango_font_description_get_size (pfont->desc) /                           (pango_font_description_get_size (pfont->desc) /
945                            (double)PANGO_SCALE) * (96.0 / 72.0));                            (double)PANGO_SCALE));
946            
947        cairo_set_font (cr, ft);        cairo_set_font (cr, ft);
948        cairo_font_destroy (ft);        cairo_font_destroy (ft);
949        cairo_scale_font (cr,        cairo_scale_font (cr,
950                          (pango_font_description_get_size (pfont->desc) /                          (pango_font_description_get_size (pfont->desc) /
951                           (double)PANGO_SCALE) * (96.0 / 72.0));                           (double)PANGO_SCALE));
952        ft = cairo_current_font (cr);        ft = cairo_current_font (cr);
953        pfont->graphics_resource = ft;        pfont->graphics_resource = ft;
954      }      }
# Line 960  install_font_peer(cairo_t *cr, Line 960  install_font_peer(cairo_t *cr,
960      }      }
961  }  }
962    
 static cairo_t *metrics_cairo = NULL;  
 static cairo_surface_t *metrics_surface = NULL;  
   
 static void  
 ensure_metrics_cairo()  
 {  
   if (metrics_cairo == NULL)  
     {  
       metrics_cairo = cairo_create ();  
       metrics_surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 1, 1);  
       cairo_set_target_surface (metrics_cairo, metrics_surface);  
     }  
 }  
   
963    
964  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
965  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource
# Line 994  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 980  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
980    gdk_threads_leave();    gdk_threads_leave();
981  }  }
982    
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics  
    (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jstring str, jdoubleArray java_metrics)  
 {  
   struct peerfont *pfont = NULL;  
   const char *cstr = NULL;  
   jdouble *native_metrics = NULL;  
   cairo_text_extents_t extents;  
   
   g_assert(java_font != NULL);  
   gdk_threads_enter();  
   
   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);  
   g_assert (pfont != NULL);  
   
   ensure_metrics_cairo();  
   install_font_peer (metrics_cairo, pfont, 0);  
   
   cstr = (*env)->GetStringUTFChars (env, str, NULL);  
   g_assert(cstr != NULL);  
   cairo_text_extents (metrics_cairo, (unsigned char *) cstr, &extents);  
   
   native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);  
   g_assert (native_metrics != NULL);  
   
   native_metrics[TEXT_METRICS_X_BEARING] = extents.x_bearing;  
   native_metrics[TEXT_METRICS_Y_BEARING] = extents.y_bearing;  
   native_metrics[TEXT_METRICS_WIDTH] = extents.width;  
   native_metrics[TEXT_METRICS_HEIGHT] = extents.height;  
   native_metrics[TEXT_METRICS_X_ADVANCE] = extents.x_advance;  
   native_metrics[TEXT_METRICS_Y_ADVANCE] = extents.y_advance;  
           
   (*env)->ReleaseStringUTFChars (env, str, cstr);    
   (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);  
   gdk_threads_leave();  
 }  
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics  
    (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jdoubleArray java_metrics)  
 {  
   struct peerfont *pfont = NULL;  
   jdouble *native_metrics = NULL;  
   cairo_font_extents_t extents;  
   
   g_assert(java_font != NULL);  
   
   gdk_threads_enter();  
   
   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);  
   g_assert (pfont != NULL);  
   
   ensure_metrics_cairo();  
   install_font_peer (metrics_cairo, pfont, 0);  
   
   cairo_current_font_extents (metrics_cairo, &extents);  
   
   native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);  
   g_assert (native_metrics != NULL);  
   
   native_metrics[FONT_METRICS_ASCENT] = extents.ascent;  
   native_metrics[FONT_METRICS_MAX_ASCENT] = extents.ascent;  
   native_metrics[FONT_METRICS_DESCENT] = extents.descent;  
   if (native_metrics[FONT_METRICS_DESCENT] < 0)  
     native_metrics[FONT_METRICS_DESCENT] = - native_metrics[FONT_METRICS_DESCENT];  
   native_metrics[FONT_METRICS_MAX_DESCENT] = native_metrics[FONT_METRICS_DESCENT];  
   native_metrics[FONT_METRICS_MAX_ADVANCE] = extents.max_x_advance;  
   
   (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);  
   gdk_threads_leave();  
 }  
   
983  static void  static void
984  paint_glyph_run(JNIEnv *env,  paint_glyph_run(JNIEnv *env,
985                  struct graphics2d *gr,                  struct graphics2d *gr,
# Line 1122  paint_glyph_run(JNIEnv *env, Line 1036  paint_glyph_run(JNIEnv *env,
1036      }      }
1037  }  }
1038    
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString  
   (JNIEnv *env, jobject obj, jobject font, jstring str, float x, float y)  
 {  
   struct graphics2d *gr = NULL;  
   const char *cstr = NULL;  
   struct peerfont *pfont = NULL;  
   
   /*  
   cairo_glyph_t *glyphs = NULL;  
   gint n_glyphs = 0;  
   PangoLayoutRun *run = NULL;  
   PangoLayoutIter *iter = NULL;  
   */  
   
   g_assert(obj != NULL);  
   g_assert(font != NULL);  
   g_assert(str != NULL);  
   
   gdk_threads_enter ();  
   if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }  
   
   gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);  
   g_assert(gr != NULL);  
   
   pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);  
   g_assert (pfont != NULL);  
   
   cstr = (*env)->GetStringUTFChars (env, str, NULL);  
   g_assert(cstr != NULL);  
   
   if (gr->debug) printf ("painting string '%s' at (%f,%f)\n", cstr, x, y);  
   
   /* For now we let cairo do the glyph conversion; eventually this  
    * ought to be unified with pango, but it is impossible to get  
    * pango and cairo to agree on metrics at the moment, so we either  
    * have to use "all cairo" metrics (the string-based APIs) or  
    * "all pango" metrics (the glyph-vector based APIs).  
    */  
   
   install_font_peer (gr->cr, pfont, gr->debug);  
   cairo_move_to (gr->cr, x, y);  
   cairo_show_text (gr->cr, (unsigned char *) cstr);  
     
   /*  
       
   pango_layout_set_text (gr->pango_layout, cstr, -1);  
   
   iter = pango_layout_get_iter (gr->pango_layout);  
   g_assert(iter != NULL);  
   
   cairo_translate (gr->cr, x, y);  
   
   do  
     {  
       run = pango_layout_iter_get_run (iter);  
       if (run != NULL)  
         paint_glyph_run (gr, &glyphs, &n_glyphs, run);  
     }  
   while (pango_layout_iter_next_run (iter));  
     
   if (glyphs != NULL)  
     g_free (glyphs);  
   
   cairo_translate (gr->cr, -x, -y);  
     
   pango_layout_iter_free (iter);  
   
   */  
   
   gdk_threads_leave ();  
   
   (*env)->ReleaseStringUTFChars (env, str, cstr);  
 }  
   
1039    
1040  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
1041  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector
1042     (JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, jfloat y)     (JNIEnv *env, jobject self,
1043        jobject font,
1044        jfloat x, jfloat y, jint n,
1045        jintArray java_codes,
1046        jfloatArray java_positions)
1047  {  {
1048        
1049    struct graphics2d *gr = NULL;    struct graphics2d *gr = NULL;
1050    struct peerfont *pfont = NULL;    struct peerfont *pfont = NULL;
   struct glyphvec *gv = NULL;  
   PangoLayoutRun *run = NULL;  
1051    cairo_glyph_t *glyphs = NULL;    cairo_glyph_t *glyphs = NULL;
1052    gint n_glyphs = 0;    int *native_codes;
1053      float *native_positions;
1054      jint i = 0;
1055    
1056    g_assert (self != NULL);    g_assert (self != NULL);
1057    g_assert (java_vec != NULL);    g_assert (java_codes != NULL);
1058      g_assert (java_positions != NULL);
1059    
1060    gdk_threads_enter ();    gdk_threads_enter ();
1061    if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }    if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }
1062    
1063    gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);    gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
   gv = (struct glyphvec *)NSA_GET_GV_PTR (env, java_vec);  
   pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);  
   
1064    g_assert (gr != NULL);    g_assert (gr != NULL);
1065    g_assert (gv != NULL);  
1066      pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
1067    g_assert (pfont != NULL);    g_assert (pfont != NULL);
1068    
1069    if (gr->debug) printf ("painting pango glyph vector\n");    install_font_peer(gr->cr, pfont, gr->debug);
1070    
1071    install_font_peer (gr->cr, pfont, gr->debug);    glyphs = malloc( sizeof(cairo_glyph_t) * n);
1072    cairo_translate (gr->cr, x, y);    g_assert (glyphs != NULL);
1073    
1074      native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
1075      native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
1076      
1077      for (i = 0; i < n; ++i)
1078        {
1079          glyphs[i].index = native_codes[i];
1080          glyphs[i].x = x + native_positions[ 2*i ];
1081          glyphs[i].y = y + native_positions[ 2*i + 1];
1082        }
1083    
1084    /* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */    (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
1085    run = (PangoLayoutRun *) gv->glyphitems;    (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
   if (run != NULL)  
     paint_glyph_run (env, gr, &glyphs, &n_glyphs, run);  
1086    
1087    if (glyphs != NULL)    begin_drawing_operation (env, gr);  
1088      g_free (glyphs);    cairo_show_glyphs (gr->cr, glyphs, n);
1089      end_drawing_operation (env, gr);
1090    
   cairo_translate (gr->cr, -x, -y);  
1091    gdk_threads_leave ();      gdk_threads_leave ();  
1092      free(glyphs);
1093  }  }
1094    
1095  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
1096  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout  Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout
1097     (JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, jfloat y)     (JNIEnv *env, jobject self, jobject java_layout, jfloat x, jfloat y)
1098  {  {
1099    /*    /*
1100     * FIXME: Some day we expect either cairo or pango will know how to make     * FIXME: Some day we expect either cairo or pango will know how to make
# Line 1251  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 1102  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
1102     */     */
1103    
1104    struct graphics2d *gr = NULL;    struct graphics2d *gr = NULL;
   struct peerfont *pfont = NULL;  
1105    struct textlayout *tl = NULL;    struct textlayout *tl = NULL;
1106    PangoLayoutIter *i = NULL;    PangoLayoutIter *i = NULL;
1107    PangoLayoutRun *run = NULL;    PangoLayoutRun *run = NULL;
# Line 1263  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 1113  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
1113    
1114    gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);    gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
1115    tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout);    tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout);
   pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);  
1116    
1117    g_assert (gr != NULL);    g_assert (gr != NULL);
1118    g_assert (tl != NULL);    g_assert (tl != NULL);
1119    g_assert (tl->pango_layout != NULL);    g_assert (tl->pango_layout != NULL);
   g_assert (pfont != NULL);  
1120    
1121    if (gr->debug) printf ("painting pango layout\n");    if (gr->debug) printf ("painting pango layout\n");
1122    
# Line 1278  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 1126  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
1126    i = pango_layout_get_iter (tl->pango_layout);    i = pango_layout_get_iter (tl->pango_layout);
1127    g_assert (i != NULL);    g_assert (i != NULL);
1128    
   install_font_peer (gr->cr, pfont, gr->debug);  
1129    cairo_translate (gr->cr, x, y);    cairo_translate (gr->cr, x, y);
1130    
1131    do    do

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.22

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