/[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.25 by smarothy, Fri Jun 10 03:56:01 2005 UTC revision 1.26 by ziga, Mon Jun 27 21:05:58 2005 UTC
# Line 203  init_graphics2d_as_pixbuf (struct graphi Line 203  init_graphics2d_as_pixbuf (struct graphi
203                                                  gdk_pixbuf_get_height (gr->drawbuf),                                                  gdk_pixbuf_get_height (gr->drawbuf),
204                                                  gdk_pixbuf_get_rowstride (gr->drawbuf));                                                        gdk_pixbuf_get_rowstride (gr->drawbuf));      
205    g_assert (gr->surface != NULL);    g_assert (gr->surface != NULL);
   g_assert (gr->cr != NULL);  
206    gr->mode = MODE_DRAWABLE_NO_RENDER;    gr->mode = MODE_DRAWABLE_NO_RENDER;
207    cairo_destroy (gr->cr);    if (gr->cr != NULL)
208        cairo_destroy (gr->cr);
209    gr->cr = cairo_create (gr->surface);    gr->cr = cairo_create (gr->surface);
210  }  }
211    
# Line 230  init_graphics2d_as_renderable (struct gr Line 230  init_graphics2d_as_renderable (struct gr
230    vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable));    vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable));
231    g_assert (vis != NULL);    g_assert (vis != NULL);
232        
233    gr->surface = cairo_xlib_surface_create (dpy, draw, vis,    gr->surface = cairo_xlib_surface_create (dpy, draw, vis, gr->width, gr->height);
                                            CAIRO_FORMAT_ARGB32,  
                                            DefaultColormap (dpy, DefaultScreen (dpy)));  
234    g_assert (gr->surface != NULL);    g_assert (gr->surface != NULL);
   g_assert (gr->cr != NULL);  
235    gr->mode = MODE_DRAWABLE_WITH_RENDER;    gr->mode = MODE_DRAWABLE_WITH_RENDER;
236    cairo_destroy (gr->cr);    if (gr->cr != NULL)
237        cairo_destroy (gr->cr);
238    gr->cr = cairo_create (gr->surface);    gr->cr = cairo_create (gr->surface);
239  }  }
240    
# Line 275  begin_drawing_operation (JNIEnv *env, st Line 273  begin_drawing_operation (JNIEnv *env, st
273        break;        break;
274    
275      case MODE_JAVA_ARRAY:      case MODE_JAVA_ARRAY:
276        gr->javabuf = (*env)->GetIntArrayElements (env, gr->jarray, &gr->isCopy);        {
277        gr->surface = cairo_image_surface_create_for_data ((unsigned char *) gr->javabuf,          jboolean isCopy;
278                                                      CAIRO_FORMAT_ARGB32,          gr->javabuf = (*env)->GetPrimitiveArrayCritical (env, gr->jarray, &isCopy);
279                                                      gr->width,          gr->isCopy |= isCopy;
280                                                      gr->height,          if (gr->isCopy)
281                                                      gr->width * 4);            {
282        g_assert(gr->surface != NULL);              /* Make sure that the pixel buffer copy is already initalized,
283        g_assert(gr->cr != NULL);                 i.e. we already failed to get direct access in initState. */
284        cairo_destroy (gr->cr);              g_assert (gr->javabuf_copy != NULL);
285        gr->cr = cairo_create (gr->surface);              memcpy (gr->javabuf_copy, gr->javabuf, gr->width * gr->height * 4);
286              }
287          }
288        break;        break;
289      }      }
290  }  }
# Line 323  end_drawing_operation (JNIEnv *env, stru Line 323  end_drawing_operation (JNIEnv *env, stru
323        break;        break;
324                
325      case MODE_JAVA_ARRAY:      case MODE_JAVA_ARRAY:
326        /*        if (gr->isCopy)
327         * FIXME: Perhaps this should use the isCopy flag to try to avoid          memcpy (gr->javabuf, gr->javabuf_copy, gr->width * gr->height * 4);
328         * tearing down the cairo surface.        (*env)->ReleasePrimitiveArrayCritical (env, gr->jarray, gr->javabuf, JNI_COMMIT);
        */  
       cairo_surface_destroy (gr->surface);  
       gr->surface = NULL;  
       (*env)->ReleaseIntArrayElements (env, gr->jarray, gr->javabuf, JNI_COMMIT);  
329      }      }
330  }  }
331    
# Line 382  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 378  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
378    g->debug = g_old->debug;    g->debug = g_old->debug;
379    g->mode = g_old->mode;    g->mode = g_old->mode;
380    
381      g->width = g_old->width;
382      g->height = g_old->height;
383    
384    if (g_old->mode == MODE_JAVA_ARRAY)    if (g_old->mode == MODE_JAVA_ARRAY)
385      {      g->jarray = (*env)->NewGlobalRef (env, g_old->jarray);
       g->width = g_old->width;  
       g->height = g_old->height;  
       g->jarray = (*env)->NewGlobalRef(env, g_old->jarray);  
     }  
386    else    else
387      {      {
388        g->drawable = g_old->drawable;        g->drawable = g_old->drawable;
   
389        g_object_ref (g->drawable);        g_object_ref (g->drawable);
390    
       g->cr = gdk_cairo_create (g->drawable);  
       g_assert (g->cr != NULL);  
   
391        if (x_server_has_render_extension ())        if (x_server_has_render_extension ())
392          init_graphics2d_as_renderable (g);          init_graphics2d_as_renderable (g);
393        else        else
# Line 416  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 407  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
407  (JNIEnv *env, jobject obj, jintArray jarr, jint width, jint height)  (JNIEnv *env, jobject obj, jintArray jarr, jint width, jint height)
408  {  {
409    struct graphics2d *gr;    struct graphics2d *gr;
410      jint *cairobuf;
411    
412    gdk_threads_enter();    gdk_threads_enter();
413    gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));    gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));
# Line 426  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 418  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
418    
419    if (gr->debug) printf ("constructing java-backed image of size (%d,%d)\n",    if (gr->debug) printf ("constructing java-backed image of size (%d,%d)\n",
420                           width, height);                           width, height);
     
   gr->cr = gdk_cairo_create (gr->drawable);  
   g_assert (gr->cr != NULL);  
421    
422    gr->width = width;    gr->width = width;
423    gr->height = height;    gr->height = height;
424    gr->jarray = (*env)->NewGlobalRef(env, jarr);    gr->jarray = (*env)->NewGlobalRef(env, jarr);
425      gr->javabuf = (*env)->GetPrimitiveArrayCritical (env, gr->jarray, &gr->isCopy);
426      if (gr->isCopy)
427        {
428          /* We didn't get direct access to the pixel buffer, so we'll have to
429             maintain a separate copy for Cairo. */
430          jint size = gr->width * gr->height * 4;
431          gr->javabuf_copy = (jint *) malloc (size);
432          memcpy (gr->javabuf_copy, gr->javabuf, size);
433          cairobuf = gr->javabuf_copy;
434        }
435      else
436        {
437          /* Have Cairo write directly to the Java array. */
438          cairobuf = gr->javabuf;
439        }
440      gr->surface = cairo_image_surface_create_for_data ((unsigned char *) cairobuf,
441                                                         CAIRO_FORMAT_ARGB32,
442                                                         gr->width,
443                                                         gr->height,
444                                                         gr->width * 4);
445      g_assert (gr->surface != NULL);
446      gr->cr = cairo_create (gr->surface);
447      g_assert (gr->cr != NULL);
448      (*env)->ReleasePrimitiveArrayCritical (env, gr->jarray, gr->javabuf, JNI_COMMIT);
449      
450    gr->mode = MODE_JAVA_ARRAY;    gr->mode = MODE_JAVA_ARRAY;
451    
452    if (gr->debug) printf ("constructed java-backed image of size (%d,%d)\n",    if (gr->debug) printf ("constructed java-backed image of size (%d,%d)\n",
# Line 462  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 476  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
476                                                   gdk_rgb_get_visual ()->depth);                                                   gdk_rgb_get_visual ()->depth);
477    g_assert (gr->drawable != NULL);    g_assert (gr->drawable != NULL);
478    
479    gr->cr = gdk_cairo_create (gr->drawable);    gr->width = width;
480    g_assert (gr->cr != NULL);    gr->height = height;
481    
482    if (x_server_has_render_extension ())    if (x_server_has_render_extension ())
483      init_graphics2d_as_renderable (gr);      init_graphics2d_as_renderable (gr);
# Line 509  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 523  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
523      cairo_pattern_set_matrix (src->pattern, &matrix);      cairo_pattern_set_matrix (src->pattern, &matrix);
524    tmp_op = cairo_get_operator (dst->cr);    tmp_op = cairo_get_operator (dst->cr);
525    cairo_set_operator(dst->cr, CAIRO_OPERATOR_SOURCE);    cairo_set_operator(dst->cr, CAIRO_OPERATOR_SOURCE);
526    cairo_set_source_surface (dst->cr, src->surface, width, height);    cairo_set_source_surface (dst->cr, src->surface, 0, 0);
527    cairo_paint (dst->cr);    cairo_paint (dst->cr);
528    cairo_set_operator(dst->cr, tmp_op);    cairo_set_operator(dst->cr, tmp_op);
529    
# Line 550  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 564  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
564    grab_current_drawable (widget, &(gr->drawable), &(gr->win));    grab_current_drawable (widget, &(gr->drawable), &(gr->win));
565    g_assert (gr->drawable != NULL);    g_assert (gr->drawable != NULL);
566    
567    gr->cr = gdk_cairo_create (gr->drawable);    gr->width = widget->allocation.width;
568    g_assert (gr->cr != NULL);    gr->height = widget->allocation.height;
569    
570    if (x_server_has_render_extension ())    if (x_server_has_render_extension ())
571      init_graphics2d_as_renderable (gr);      init_graphics2d_as_renderable (gr);
# Line 600  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 614  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
614    if (gr->drawbuf)    if (gr->drawbuf)
615      g_object_unref (gr->drawbuf);      g_object_unref (gr->drawbuf);
616    
617    g_object_unref (gr->drawable);    if (gr->drawable)
618        g_object_unref (gr->drawable);
619    
620    if (gr->pattern)    if (gr->pattern)
621      cairo_pattern_destroy (gr->pattern);      cairo_pattern_destroy (gr->pattern);
# Line 612  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 627  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
627      free (gr->pattern_pixels);      free (gr->pattern_pixels);
628    
629    if (gr->mode == MODE_JAVA_ARRAY)    if (gr->mode == MODE_JAVA_ARRAY)
630      (*env)->DeleteGlobalRef(env, gr->jarray);      {
631          (*env)->DeleteGlobalRef (env, gr->jarray);
632          if (gr->javabuf_copy)
633            free (gr->javabuf_copy);
634        }
635    
636    if (gr->debug) printf ("disposed of graphics2d\n");    if (gr->debug) printf ("disposed of graphics2d\n");
637    
# Line 824  Java_gnu_java_awt_peer_gtk_GdkGraphics2D Line 843  Java_gnu_java_awt_peer_gtk_GdkGraphics2D
843     cairo_matrix_init (&mat,     cairo_matrix_init (&mat,
844                        native_matrix[0], native_matrix[1],                        native_matrix[0], native_matrix[1],
845                        native_matrix[2], native_matrix[3],                        native_matrix[2], native_matrix[3],
846                        native_matrix[4], native_matrix[5]);                        -native_matrix[4], -native_matrix[5]);
   
847     p = cairo_pattern_create_for_surface (surf);     p = cairo_pattern_create_for_surface (surf);
848     cairo_pattern_set_matrix (p, &mat);     cairo_pattern_set_matrix (p, &mat);
849     if (gr->pattern)     if (gr->pattern)
850       cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern));       cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern));
851     cairo_set_source_surface (gr->cr, surf, w, h);     cairo_set_source (gr->cr, p);
852     cairo_paint (gr->cr);     cairo_paint (gr->cr);
853       cairo_pattern_destroy (p);
854     cairo_surface_destroy (surf);     cairo_surface_destroy (surf);
855   }   }
856        

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.26

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