OSDN Git Service

libjava/
[pf3gnuchains/gcc-fork.git] / libjava / classpath / native / jni / gtk-peer / gnu_java_awt_peer_gtk_CairoGraphics2D.c
1 /* gnu_java_awt_peer_gtk_CairoGraphics2d.c
2    Copyright (C) 2006  Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5    
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10    
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15    
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20    
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25    
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37
38 #include "jcl.h"
39 #include "gdkfont.h"
40 #include "cairographics2d.h"
41 #include "gnu_java_awt_peer_gtk_CairoGraphics2D.h"
42 #include <gdk/gdktypes.h>
43 #include <gdk/gdkprivate.h>
44 #include <gdk/gdkx.h>
45
46 #include <cairo-ft.h>
47 #include <cairo-xlib.h>
48
49 #include <stdio.h>
50 #include <stdlib.h>
51
52 static void update_pattern_transform (struct cairographics2d *gr);
53
54 /**
55  * Allocates the cairographics2d structure.
56  */
57 JNIEXPORT jlong JNICALL
58 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_init
59   (JNIEnv *env __attribute__ ((unused)),
60    jobject obj __attribute__ ((unused)),
61    jlong cairo_t_pointer)
62 {
63   struct cairographics2d *g = NULL;
64   cairo_t *cr = JLONG_TO_PTR(cairo_t, cairo_t_pointer);
65   g_assert(cr != NULL);
66
67   g = (struct cairographics2d *) g_malloc (sizeof (struct cairographics2d));
68
69   g_assert (g != NULL);
70   memset (g, 0, sizeof(struct cairographics2d));
71   g->cr = cr;
72   
73   return PTR_TO_JLONG(g);
74 }
75
76 /**
77  * Disposes of the cairographics2d structure.
78  */
79 JNIEXPORT void JNICALL
80 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_disposeNative
81   (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
82   jlong pointer)
83 {
84   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
85
86   if (gr == NULL)
87     return;
88
89   if (gr->cr)
90     {
91       gdk_threads_enter();
92       cairo_destroy (gr->cr);
93       gdk_threads_leave();
94     }
95
96   if (gr->pattern)
97     cairo_pattern_destroy (gr->pattern);
98   gr->pattern = NULL;
99   
100   if (gr->pattern_surface)
101     cairo_surface_destroy (gr->pattern_surface);
102   gr->pattern_surface = NULL;
103
104   if (gr->pattern_pixels)
105     g_free(gr->pattern_pixels);
106   gr->pattern_pixels = NULL;
107
108   g_free( gr );
109 }
110
111 /**
112  * Set the gradient.
113  */
114 JNIEXPORT void JNICALL
115 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setGradient
116   (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
117    jlong pointer,
118    jdouble x1, jdouble y1, 
119    jdouble x2, jdouble y2,
120    jint r1, jint g1, jint b1, jint a1,
121    jint r2, jint g2, jint b2, jint a2,
122    jboolean cyclic)
123 {
124   struct cairographics2d *gr = NULL;
125   cairo_pattern_t* pattern;
126   cairo_extend_t extend;
127
128   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
129   g_assert( gr != NULL );
130
131   pattern = cairo_pattern_create_linear(x1, y1, x2, y2);
132   g_assert( pattern != NULL );
133
134   cairo_pattern_add_color_stop_rgba(pattern, 0.0, r1 / 255.0, g1 / 255.0, 
135                                     b1 / 255.0, a1 / 255.0);
136
137   cairo_pattern_add_color_stop_rgba(pattern, 1.0, r2 / 255.0, g2 / 255.0, 
138                                     b2 / 255.0, a2 / 255.0);
139
140   #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 2, 0)
141         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_PAD;
142   #else
143         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_NONE;
144   #endif
145
146   cairo_pattern_set_extend( pattern, extend );
147
148   gr->pattern = pattern;
149   cairo_set_source(gr->cr, gr->pattern);
150 }
151
152 JNIEXPORT void JNICALL
153 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setPaintPixels
154  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
155   jlong pointer, jintArray jarr, jint w, jint h, jint stride, jboolean repeat,
156   jint x, jint y)
157 {
158   struct cairographics2d *gr = NULL;
159   jint *jpixels = NULL;
160
161   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
162   g_assert (gr != NULL);
163
164   if (gr->pattern)
165     cairo_pattern_destroy (gr->pattern);
166
167   if (gr->pattern_surface)
168     cairo_surface_destroy (gr->pattern_surface);
169
170   if (gr->pattern_pixels)
171     g_free (gr->pattern_pixels);
172
173   gr->pattern = NULL;
174   gr->pattern_surface = NULL;
175   gr->pattern_pixels = NULL;
176
177   gr->pattern_pixels = (char *) g_malloc (h * stride * 4);
178   g_assert (gr->pattern_pixels != NULL);
179
180   jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);
181   g_assert (jpixels != NULL);
182   memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
183   (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
184
185   gr->pattern_surface = cairo_image_surface_create_for_data ((unsigned char *)gr->pattern_pixels, 
186                                                         CAIRO_FORMAT_ARGB32, 
187                                                         w, h, stride * 4);
188   g_assert (gr->pattern_surface != NULL);
189   gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
190   g_assert (gr->pattern != NULL);
191   
192   cairo_set_source_surface(gr->cr, gr->pattern_surface, x, y);
193   
194   if (repeat)
195         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_REPEAT);
196   else
197         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_NONE);
198 }
199
200 JNIEXPORT void JNICALL
201 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels 
202 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
203  jlong pointer, jintArray java_pixels, 
204  jint w, jint h, jint stride, jdoubleArray java_matrix, jdouble alpha,
205  jint interpolation)
206 {
207   jint *native_pixels = NULL;
208   jdouble *native_matrix = NULL;
209   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
210   g_assert (gr != NULL);
211
212   native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);
213   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
214   g_assert (native_pixels != NULL);
215   g_assert (native_matrix != NULL);
216   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
217
218  {
219    cairo_matrix_t mat;
220    cairo_pattern_t *p;
221    cairo_surface_t *surf = cairo_image_surface_create_for_data ((unsigned char *)native_pixels, 
222                                                            CAIRO_FORMAT_ARGB32, 
223                                                            w, h, stride * 4);   
224    cairo_matrix_init_identity (&mat);
225    cairo_matrix_init (&mat, 
226                       native_matrix[0], native_matrix[1],
227                       native_matrix[2], native_matrix[3],
228                       native_matrix[4], native_matrix[5]);
229
230    p = cairo_pattern_create_for_surface (surf);
231    cairo_pattern_set_matrix (p, &mat);
232    switch ((enum java_awt_rendering_hints_filter) interpolation)
233      {
234      case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
235        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
236        break;
237      case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
238        cairo_pattern_set_filter (p, CAIRO_FILTER_BILINEAR);
239        break; 
240      case java_awt_rendering_hints_VALUE_INTERPOLATION_BICUBIC:
241        cairo_pattern_set_filter (p, CAIRO_FILTER_GAUSSIAN);
242        break; 
243      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
244        cairo_pattern_set_filter (p, CAIRO_FILTER_FAST);
245        break;
246      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
247        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
248        break;
249      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
250        cairo_pattern_set_filter (p, CAIRO_FILTER_BEST);
251        break;
252      }
253    
254    cairo_set_source (gr->cr, p);
255    if (alpha == 1.)
256      cairo_paint (gr->cr);
257    else
258      cairo_paint_with_alpha(gr->cr, alpha);
259
260    cairo_pattern_destroy (p);
261    cairo_surface_destroy (surf);
262  }
263   
264  (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
265  (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
266 }
267
268
269 JNIEXPORT void JNICALL
270 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix
271 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
272  jlong pointer, jdoubleArray java_matrix)
273 {
274   jdouble *native_matrix = NULL;
275   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
276   g_assert (gr != NULL);
277
278   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  
279   g_assert (native_matrix != NULL);
280   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
281
282   {
283     cairo_matrix_t mat;
284
285     cairo_matrix_init_identity (&mat);
286     cairo_matrix_init (&mat, 
287                        native_matrix[0], native_matrix[1],
288                        native_matrix[2], native_matrix[3],
289                        native_matrix[4], native_matrix[5]);
290     g_assert (gr != NULL);
291     cairo_set_matrix (gr->cr, &mat);
292   }
293
294   (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
295   update_pattern_transform (gr);
296 }
297
298 JNIEXPORT void JNICALL
299 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale
300 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
301  jlong pointer, jdouble x, jdouble y)
302 {
303   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
304   g_assert (gr != NULL);
305
306   cairo_scale (gr->cr, x, y);
307 }
308
309 JNIEXPORT void JNICALL
310 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector
311 (JNIEnv *env, jobject obj __attribute__((unused)), jlong pointer,
312  jobject font,
313  jfloat x, jfloat y, jint n,
314  jintArray java_codes,
315  jfloatArray java_positions, jlongArray java_fontset)
316 {
317   struct cairographics2d *gr = NULL;
318   struct peerfont *pfont = NULL;
319   cairo_glyph_t *glyphs = NULL;
320   int *native_codes;
321   float *native_positions;
322   jint i = 0;
323
324   g_assert (java_codes != NULL);
325   g_assert (java_positions != NULL);
326
327   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
328   g_assert (gr != NULL);
329
330   pfont = (struct peerfont *) gtkpeer_get_font(env, font);
331   g_assert (pfont != NULL);
332
333   glyphs = g_malloc( sizeof(cairo_glyph_t) * n);
334   g_assert (glyphs != NULL);
335
336   native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
337   native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
338   
339   /* Set up glyphs and layout */
340   for (i = 0; i < n; ++i)
341     {
342       glyphs[i].index = native_codes[i];
343       glyphs[i].x = x + native_positions[ 2*i ];
344       glyphs[i].y = y + native_positions[ 2*i + 1];
345     }
346
347   (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
348   (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
349
350   /* Iterate through glyphs and draw */
351   jlong* fonts = (*env)->GetLongArrayElements (env, java_fontset, NULL);
352   gdk_threads_enter();
353   for (i = 0; i < n; i++)
354     {
355       PangoFcFont *font = JLONG_TO_PTR(PangoFcFont, fonts[i]);
356   gdk_threads_leave ();
357
358       /* Draw as many glyphs as possible with the current font */
359       int length = 0;
360       while (i < n-1 && fonts[i] == fonts[i+1])
361         {
362           length++;
363           i++;
364         }
365     
366       FT_Face face = pango_fc_font_lock_face( font );
367       cairo_font_face_t *ft = cairo_ft_font_face_create_for_ft_face (face, 0);
368       g_assert (ft != NULL);
369
370       cairo_set_font_face (gr->cr, ft);
371       cairo_show_glyphs (gr->cr, &glyphs[i-length], length+1);
372                        
373       cairo_font_face_destroy (ft);
374       pango_fc_font_unlock_face(font);
375     }
376     gdk_threads_leave();
377     
378   g_free(glyphs);
379 }
380
381
382 JNIEXPORT void JNICALL
383 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont
384 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
385  jlong pointer, jobject font)
386 {
387   struct cairographics2d *gr = NULL;
388   struct peerfont *pfont = NULL;
389   FT_Face face = NULL;
390   cairo_font_face_t *ft = NULL;
391
392   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
393   g_assert (gr != NULL);
394   
395   pfont = (struct peerfont *) gtkpeer_get_font(env, font);
396   g_assert (pfont != NULL);
397
398   gdk_threads_enter();
399   face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
400   g_assert (face != NULL);
401
402   ft = cairo_ft_font_face_create_for_ft_face (face, 0);
403   g_assert (ft != NULL);
404
405   cairo_set_font_face (gr->cr, ft);
406   cairo_set_font_size (gr->cr,
407                        (pango_font_description_get_size (pfont->desc) /
408                        (double)PANGO_SCALE));
409                        
410   cairo_font_face_destroy (ft);
411   pango_fc_font_unlock_face((PangoFcFont *)pfont->font);
412   gdk_threads_leave();
413 }
414
415 JNIEXPORT void JNICALL
416 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator 
417 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
418  jlong pointer, jint op)
419 {
420   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
421   g_assert (gr != NULL);
422
423   switch ((enum java_awt_alpha_composite_rule) op)
424     {
425     case java_awt_alpha_composite_CLEAR: 
426       cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
427       break;
428       
429     case java_awt_alpha_composite_SRC: 
430       cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
431       break;
432       
433     case java_awt_alpha_composite_SRC_OVER: 
434       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
435       break;
436
437     case java_awt_alpha_composite_DST_OVER: 
438       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
439       break;
440
441     case java_awt_alpha_composite_SRC_IN: 
442       cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
443       break;
444
445     case java_awt_alpha_composite_DST_IN: 
446       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
447       break;
448
449     case java_awt_alpha_composite_SRC_OUT: 
450       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
451       break;
452
453     case java_awt_alpha_composite_DST_OUT: 
454       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
455       break;
456
457     case java_awt_alpha_composite_DST: 
458       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
459       break;
460
461     case java_awt_alpha_composite_SRC_ATOP: 
462       cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
463       break;
464
465     case java_awt_alpha_composite_DST_ATOP: 
466       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
467       break;
468
469     case java_awt_alpha_composite_XOR: 
470       cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
471       break;
472     }
473 }
474
475 JNIEXPORT void JNICALL
476 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
477 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
478  jlong pointer, jdouble r, jdouble g, jdouble b, jdouble a)
479 {
480   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
481   g_assert (gr != NULL);
482
483   cairo_set_source_rgba (gr->cr, r, g, b, a);
484 }
485
486 JNIEXPORT void JNICALL
487 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule 
488 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
489  jlong pointer, jint rule)
490 {
491   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
492   g_assert (gr != NULL);
493
494   switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
495     {
496     case java_awt_geom_path_iterator_WIND_NON_ZERO:
497       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
498       break;
499     case java_awt_geom_path_iterator_WIND_EVEN_ODD:
500       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
501       break;
502     }
503 }
504
505 /**
506  * Set the line style, except for dashes.
507  */
508 JNIEXPORT void JNICALL
509 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
510 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
511  jlong pointer, jdouble width, jint cap, jint join, jdouble miterLimit)
512 {
513   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
514   g_assert (gr != NULL);
515
516   /* set width */
517   cairo_set_line_width (gr->cr, width);
518
519   /* set cap */
520   switch ((enum java_awt_basic_stroke_cap_rule) cap)
521     {
522     case java_awt_basic_stroke_CAP_BUTT: 
523       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
524       break;
525
526     case java_awt_basic_stroke_CAP_ROUND: 
527       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
528       break;
529
530     case java_awt_basic_stroke_CAP_SQUARE: 
531       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
532       break;
533     }
534
535   /* set join */
536   switch ((enum java_awt_basic_stroke_join_rule) join)
537     {
538     case java_awt_basic_stroke_JOIN_MITER:
539       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
540       break;
541
542     case java_awt_basic_stroke_JOIN_ROUND:
543       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
544       break;
545
546     case java_awt_basic_stroke_JOIN_BEVEL:
547       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
548       break;
549     }
550
551   /* set miter */
552   cairo_set_miter_limit (gr->cr, miterLimit);
553 }
554
555 /**
556  * Set the line dashes
557  */ 
558 JNIEXPORT void JNICALL
559 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
560 (JNIEnv *env, jobject obj __attribute__((unused)),
561  jlong pointer, jdoubleArray dashes, jint ndash, jdouble offset)
562 {
563   jdouble *dasharr = NULL;
564   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
565   g_assert (gr != NULL);
566
567   dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);  
568   g_assert (dasharr != NULL);
569
570   cairo_set_dash (gr->cr, dasharr, ndash, offset);
571
572   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
573 }
574
575 JNIEXPORT void JNICALL
576 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave
577 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
578  jlong pointer)
579 {
580   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
581   g_assert (gr != NULL);
582
583   cairo_save (gr->cr);
584 }
585
586 JNIEXPORT void JNICALL
587 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore
588 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
589  jlong pointer)
590 {
591   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
592   g_assert (gr != NULL);
593
594   cairo_restore (gr->cr);
595 }
596
597 JNIEXPORT void JNICALL
598 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath 
599 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
600  jlong pointer)
601 {
602   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
603   g_assert (gr != NULL);
604
605   cairo_new_path (gr->cr);
606 }
607
608 JNIEXPORT void JNICALL
609 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo 
610 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
611  jlong pointer, jdouble x, jdouble y)
612 {
613   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
614   g_assert (gr != NULL);
615
616   cairo_move_to (gr->cr, x, y);
617 }
618
619 JNIEXPORT void JNICALL
620 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo 
621 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
622  jlong pointer, jdouble x, jdouble y)
623 {
624   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
625   g_assert (gr != NULL);
626
627   cairo_line_to (gr->cr, x, y);
628 }
629
630 JNIEXPORT void JNICALL
631 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo 
632 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
633  jlong pointer, jdouble x1, jdouble y1,
634  jdouble x2, jdouble y2, jdouble x3, jdouble y3)
635 {
636   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
637   g_assert (gr != NULL);
638   cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
639 }
640
641 JNIEXPORT void JNICALL
642 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle 
643 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
644  jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
645 {
646   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
647
648   cairo_rectangle (gr->cr, x, y, width, height);
649 }
650
651 JNIEXPORT void JNICALL
652 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc 
653 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
654  jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1,
655  jdouble angle2)
656 {
657   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
658
659   cairo_arc (gr->cr, x, y, radius, angle1, angle2);
660 }
661
662 JNIEXPORT void JNICALL
663 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath 
664 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
665  jlong pointer)
666 {
667   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
668   g_assert (gr != NULL);
669
670   cairo_close_path (gr->cr);
671 }
672
673 JNIEXPORT void JNICALL
674 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke 
675 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
676  jlong pointer)
677 {
678   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
679   g_assert (gr != NULL);
680
681   cairo_stroke (gr->cr);
682 }
683
684 JNIEXPORT void JNICALL
685 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill 
686 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
687  jlong pointer, jdouble alpha)
688 {
689   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
690   g_assert (gr != NULL);
691
692   if (alpha == 1.0)
693     cairo_fill (gr->cr);
694   else
695     {
696       cairo_save(gr->cr);
697       cairo_clip(gr->cr);
698       cairo_paint_with_alpha(gr->cr, alpha);
699       cairo_restore(gr->cr);
700     }
701 }
702
703 JNIEXPORT void JNICALL
704 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip 
705 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
706  jlong pointer)
707 {
708   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
709   g_assert( gr != NULL );
710
711   cairo_clip( gr->cr );
712 }
713
714 JNIEXPORT void JNICALL 
715 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip 
716 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
717  jlong pointer)
718 {
719   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
720   g_assert (gr != NULL);
721
722   cairo_reset_clip( gr->cr );
723 }
724
725 JNIEXPORT void JNICALL
726 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias
727 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
728  jlong pointer, jboolean aa)
729 {
730   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
731   g_assert (gr != NULL);
732
733   if (aa)
734     cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_GRAY);
735   else
736     cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_NONE);
737 }
738
739 static void 
740 update_pattern_transform (struct cairographics2d *gr)
741 {
742   cairo_matrix_t mat;
743
744   g_assert (gr != NULL);
745   if (gr->pattern == NULL)
746     return;
747
748   cairo_get_matrix (gr->cr, &mat);
749   cairo_pattern_set_matrix (gr->pattern, &mat);
750 }
751