OSDN Git Service

Merged gcj-eclipse branch to trunk.
[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     cairo_destroy (gr->cr);
91
92   if (gr->pattern)
93     cairo_pattern_destroy (gr->pattern);
94   gr->pattern = NULL;
95   
96   if (gr->pattern_surface)
97     cairo_surface_destroy (gr->pattern_surface);
98   gr->pattern_surface = NULL;
99
100   if (gr->pattern_pixels)
101     g_free(gr->pattern_pixels);
102   gr->pattern_pixels = NULL;
103
104   g_free( gr );
105 }
106
107 /**
108  * Set the gradient.
109  */
110 JNIEXPORT void JNICALL
111 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setGradient
112   (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
113    jlong pointer,
114    jdouble x1, jdouble y1, 
115    jdouble x2, jdouble y2,
116    jint r1, jint g1, jint b1, jint a1,
117    jint r2, jint g2, jint b2, jint a2,
118    jboolean cyclic)
119 {
120   struct cairographics2d *gr = NULL;
121   cairo_pattern_t* pattern;
122   cairo_extend_t extend;
123
124   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
125   g_assert( gr != NULL );
126
127   pattern = cairo_pattern_create_linear(x1, y1, x2, y2);
128   g_assert( pattern != NULL );
129
130   cairo_pattern_add_color_stop_rgba(pattern, 0.0, r1 / 255.0, g1 / 255.0, 
131                                     b1 / 255.0, a1 / 255.0);
132
133   cairo_pattern_add_color_stop_rgba(pattern, 1.0, r2 / 255.0, g2 / 255.0, 
134                                     b2 / 255.0, a2 / 255.0);
135
136   #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 2, 0)
137         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_PAD;
138   #else
139         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_NONE;
140   #endif
141
142   cairo_pattern_set_extend( pattern, extend );
143
144   gr->pattern = pattern;
145   cairo_set_source(gr->cr, gr->pattern);
146 }
147
148 JNIEXPORT void JNICALL
149 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setPaintPixels
150  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
151   jlong pointer, jintArray jarr, jint w, jint h, jint stride, jboolean repeat,
152   jint x, jint y)
153 {
154   struct cairographics2d *gr = NULL;
155   jint *jpixels = NULL;
156
157   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
158   g_assert (gr != NULL);
159
160   if (gr->pattern)
161     cairo_pattern_destroy (gr->pattern);
162
163   if (gr->pattern_surface)
164     cairo_surface_destroy (gr->pattern_surface);
165
166   if (gr->pattern_pixels)
167     g_free (gr->pattern_pixels);
168
169   gr->pattern = NULL;
170   gr->pattern_surface = NULL;
171   gr->pattern_pixels = NULL;
172
173   gr->pattern_pixels = (char *) g_malloc (h * stride * 4);
174   g_assert (gr->pattern_pixels != NULL);
175
176   jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);
177   g_assert (jpixels != NULL);
178   memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
179   (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
180
181   gr->pattern_surface = cairo_image_surface_create_for_data ((unsigned char *)gr->pattern_pixels, 
182                                                         CAIRO_FORMAT_ARGB32, 
183                                                         w, h, stride * 4);
184   g_assert (gr->pattern_surface != NULL);
185   gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
186   g_assert (gr->pattern != NULL);
187   
188   cairo_set_source_surface(gr->cr, gr->pattern_surface, x, y);
189   
190   if (repeat)
191         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_REPEAT);
192   else
193         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_NONE);
194 }
195
196 JNIEXPORT void JNICALL
197 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels 
198 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
199  jlong pointer, jintArray java_pixels, 
200  jint w, jint h, jint stride, jdoubleArray java_matrix, jdouble alpha,
201  jint interpolation)
202 {
203   jint *native_pixels = NULL;
204   jdouble *native_matrix = NULL;
205   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
206   g_assert (gr != NULL);
207
208   native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);
209   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
210   g_assert (native_pixels != NULL);
211   g_assert (native_matrix != NULL);
212   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
213
214  {
215    cairo_matrix_t mat;
216    cairo_pattern_t *p;
217    cairo_surface_t *surf = cairo_image_surface_create_for_data ((unsigned char *)native_pixels, 
218                                                            CAIRO_FORMAT_ARGB32, 
219                                                            w, h, stride * 4);   
220    cairo_matrix_init_identity (&mat);
221    cairo_matrix_init (&mat, 
222                       native_matrix[0], native_matrix[1],
223                       native_matrix[2], native_matrix[3],
224                       native_matrix[4], native_matrix[5]);
225
226    p = cairo_pattern_create_for_surface (surf);
227    cairo_pattern_set_matrix (p, &mat);
228    switch ((enum java_awt_rendering_hints_filter) interpolation)
229      {
230      case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
231        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
232        break;
233      case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
234        cairo_pattern_set_filter (p, CAIRO_FILTER_BILINEAR);
235        break; 
236      case java_awt_rendering_hints_VALUE_INTERPOLATION_BICUBIC:
237        cairo_pattern_set_filter (p, CAIRO_FILTER_GAUSSIAN);
238        break; 
239      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
240        cairo_pattern_set_filter (p, CAIRO_FILTER_FAST);
241        break;
242      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
243        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
244        break;
245      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
246        cairo_pattern_set_filter (p, CAIRO_FILTER_BEST);
247        break;
248      }
249    
250    cairo_set_source (gr->cr, p);
251    if (alpha == 1.)
252      cairo_paint (gr->cr);
253    else
254      cairo_paint_with_alpha(gr->cr, alpha);
255
256    cairo_pattern_destroy (p);
257    cairo_surface_destroy (surf);
258  }
259   
260  (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
261  (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
262 }
263
264
265 JNIEXPORT void JNICALL
266 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix
267 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
268  jlong pointer, jdoubleArray java_matrix)
269 {
270   jdouble *native_matrix = NULL;
271   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
272   g_assert (gr != NULL);
273
274   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  
275   g_assert (native_matrix != NULL);
276   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
277
278   {
279     cairo_matrix_t mat;
280
281     cairo_matrix_init_identity (&mat);
282     cairo_matrix_init (&mat, 
283                        native_matrix[0], native_matrix[1],
284                        native_matrix[2], native_matrix[3],
285                        native_matrix[4], native_matrix[5]);
286     g_assert (gr != NULL);
287     cairo_set_matrix (gr->cr, &mat);
288   }
289
290   (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
291   update_pattern_transform (gr);
292 }
293
294 JNIEXPORT void JNICALL
295 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale
296 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
297  jlong pointer, jdouble x, jdouble y)
298 {
299   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
300   g_assert (gr != NULL);
301
302   cairo_scale (gr->cr, x, y);
303 }
304
305 JNIEXPORT void JNICALL
306 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector
307 (JNIEnv *env, jobject obj __attribute__((unused)), jlong pointer,
308  jobject font,
309  jfloat x, jfloat y, jint n,
310  jintArray java_codes,
311  jfloatArray java_positions)
312 {
313   
314   struct cairographics2d *gr = NULL;
315   struct peerfont *pfont = NULL;
316   cairo_glyph_t *glyphs = NULL;
317   int *native_codes;
318   float *native_positions;
319   jint i = 0;
320
321   g_assert (java_codes != NULL);
322   g_assert (java_positions != NULL);
323
324   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
325   g_assert (gr != NULL);
326
327   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
328   g_assert (pfont != NULL);
329
330   glyphs = g_malloc( sizeof(cairo_glyph_t) * n);
331   g_assert (glyphs != NULL);
332
333   native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
334   native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
335   
336   for (i = 0; i < n; ++i)
337     {
338       glyphs[i].index = native_codes[i];
339       glyphs[i].x = x + native_positions[ 2*i ];
340       glyphs[i].y = y + native_positions[ 2*i + 1];
341     }
342
343   (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
344   (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
345
346   pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
347   cairo_show_glyphs (gr->cr, glyphs, n);
348   pango_fc_font_unlock_face( (PangoFcFont *)pfont->font );
349
350   g_free(glyphs);
351 }
352
353
354 JNIEXPORT void JNICALL
355 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont
356 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
357  jlong pointer, jobject font)
358 {
359   struct cairographics2d *gr = NULL;
360   struct peerfont *pfont = NULL;
361   FT_Face face = NULL;
362   cairo_font_face_t *ft = NULL;
363
364   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
365   g_assert (gr != NULL);
366   
367   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
368   g_assert (pfont != NULL);
369
370   face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
371   g_assert (face != NULL);
372
373   ft = cairo_ft_font_face_create_for_ft_face (face, 0);
374   g_assert (ft != NULL);
375
376   cairo_set_font_face (gr->cr, ft);
377   cairo_set_font_size (gr->cr,
378                        (pango_font_description_get_size (pfont->desc) /
379                        (double)PANGO_SCALE));
380                        
381   cairo_font_face_destroy (ft);
382   pango_fc_font_unlock_face((PangoFcFont *)pfont->font);
383 }
384
385 JNIEXPORT void JNICALL
386 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator 
387 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
388  jlong pointer, jint op)
389 {
390   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
391   g_assert (gr != NULL);
392
393   switch ((enum java_awt_alpha_composite_rule) op)
394     {
395     case java_awt_alpha_composite_CLEAR: 
396       cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
397       break;
398       
399     case java_awt_alpha_composite_SRC: 
400       cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
401       break;
402       
403     case java_awt_alpha_composite_SRC_OVER: 
404       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
405       break;
406
407     case java_awt_alpha_composite_DST_OVER: 
408       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
409       break;
410
411     case java_awt_alpha_composite_SRC_IN: 
412       cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
413       break;
414
415     case java_awt_alpha_composite_DST_IN: 
416       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
417       break;
418
419     case java_awt_alpha_composite_SRC_OUT: 
420       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
421       break;
422
423     case java_awt_alpha_composite_DST_OUT: 
424       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
425       break;
426
427     case java_awt_alpha_composite_DST: 
428       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
429       break;
430
431     case java_awt_alpha_composite_SRC_ATOP: 
432       cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
433       break;
434
435     case java_awt_alpha_composite_DST_ATOP: 
436       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
437       break;
438
439     case java_awt_alpha_composite_XOR: 
440       cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
441       break;
442     }
443 }
444
445 JNIEXPORT void JNICALL
446 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
447 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
448  jlong pointer, jdouble r, jdouble g, jdouble b, jdouble a)
449 {
450   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
451   g_assert (gr != NULL);
452
453   cairo_set_source_rgba (gr->cr, r, g, b, a);
454 }
455
456 JNIEXPORT void JNICALL
457 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule 
458 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
459  jlong pointer, jint rule)
460 {
461   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
462   g_assert (gr != NULL);
463
464   switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
465     {
466     case java_awt_geom_path_iterator_WIND_NON_ZERO:
467       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
468       break;
469     case java_awt_geom_path_iterator_WIND_EVEN_ODD:
470       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
471       break;
472     }
473 }
474
475 /**
476  * Set the line style, except for dashes.
477  */
478 JNIEXPORT void JNICALL
479 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
480 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
481  jlong pointer, jdouble width, int cap, int join, double miterLimit)
482 {
483   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
484   g_assert (gr != NULL);
485
486   /* set width */
487   cairo_set_line_width (gr->cr, width);
488
489   /* set cap */
490   switch ((enum java_awt_basic_stroke_cap_rule) cap)
491     {
492     case java_awt_basic_stroke_CAP_BUTT: 
493       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
494       break;
495
496     case java_awt_basic_stroke_CAP_ROUND: 
497       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
498       break;
499
500     case java_awt_basic_stroke_CAP_SQUARE: 
501       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
502       break;
503     }
504
505   /* set join */
506   switch ((enum java_awt_basic_stroke_join_rule) join)
507     {
508     case java_awt_basic_stroke_JOIN_MITER:
509       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
510       break;
511
512     case java_awt_basic_stroke_JOIN_ROUND:
513       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
514       break;
515
516     case java_awt_basic_stroke_JOIN_BEVEL:
517       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
518       break;
519     }
520
521   /* set miter */
522   cairo_set_miter_limit (gr->cr, miterLimit);
523 }
524
525 /**
526  * Set the line dashes
527  */ 
528 JNIEXPORT void JNICALL
529 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
530 (JNIEnv *env, jobject obj __attribute__((unused)),
531  jlong pointer, jdoubleArray dashes, jint ndash, jdouble offset)
532 {
533   jdouble *dasharr = NULL;
534   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
535   g_assert (gr != NULL);
536
537   dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);  
538   g_assert (dasharr != NULL);
539
540   cairo_set_dash (gr->cr, dasharr, ndash, offset);
541
542   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
543 }
544
545 JNIEXPORT void JNICALL
546 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave
547 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
548  jlong pointer)
549 {
550   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
551   g_assert (gr != NULL);
552
553   cairo_save (gr->cr);
554 }
555
556 JNIEXPORT void JNICALL
557 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore
558 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
559  jlong pointer)
560 {
561   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
562   g_assert (gr != NULL);
563
564   cairo_restore (gr->cr);
565 }
566
567 JNIEXPORT void JNICALL
568 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath 
569 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
570  jlong pointer)
571 {
572   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
573   g_assert (gr != NULL);
574
575   cairo_new_path (gr->cr);
576 }
577
578 JNIEXPORT void JNICALL
579 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo 
580 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
581  jlong pointer, jdouble x, jdouble y)
582 {
583   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
584   g_assert (gr != NULL);
585
586   cairo_move_to (gr->cr, x, y);
587 }
588
589 JNIEXPORT void JNICALL
590 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo 
591 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
592  jlong pointer, jdouble x, jdouble y)
593 {
594   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
595   g_assert (gr != NULL);
596
597   cairo_line_to (gr->cr, x, y);
598 }
599
600 JNIEXPORT void JNICALL
601 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo 
602 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
603  jlong pointer, jdouble x1, jdouble y1,
604  jdouble x2, jdouble y2, jdouble x3, jdouble y3)
605 {
606   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
607   g_assert (gr != NULL);
608   cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
609 }
610
611 JNIEXPORT void JNICALL
612 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo 
613 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
614  jlong pointer, jdouble dx, jdouble dy)
615 {
616   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
617   g_assert (gr != NULL);
618
619   cairo_rel_move_to (gr->cr, dx, dy);
620 }
621
622 JNIEXPORT void JNICALL
623 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo 
624 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
625  jlong pointer, jdouble dx, jdouble dy)
626 {
627   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
628   g_assert (gr != NULL);
629
630   cairo_rel_line_to (gr->cr, dx, dy);
631 }
632
633 JNIEXPORT void JNICALL
634 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo 
635 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
636  jlong pointer, jdouble dx1, jdouble dy1,
637  jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
638 {
639   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
640   g_assert (gr != NULL);
641
642   cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
643 }
644
645 JNIEXPORT void JNICALL
646 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle 
647 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
648  jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
649 {
650   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
651
652   cairo_rectangle (gr->cr, x, y, width, height);
653 }
654
655 JNIEXPORT void JNICALL
656 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc 
657 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
658  jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1,
659  jdouble angle2)
660 {
661   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
662
663   cairo_arc (gr->cr, x, y, radius, angle1, angle2);
664 }
665
666 JNIEXPORT void JNICALL
667 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath 
668 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
669  jlong pointer)
670 {
671   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
672   g_assert (gr != NULL);
673
674   cairo_close_path (gr->cr);
675 }
676
677 JNIEXPORT void JNICALL
678 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke 
679 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
680  jlong pointer)
681 {
682   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
683   g_assert (gr != NULL);
684
685   cairo_stroke (gr->cr);
686 }
687
688 JNIEXPORT void JNICALL
689 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill 
690 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
691  jlong pointer, jdouble alpha)
692 {
693   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
694   g_assert (gr != NULL);
695
696   if (alpha == 1.0)
697     cairo_fill (gr->cr);
698   else
699     {
700       cairo_save(gr->cr);
701       cairo_clip(gr->cr);
702       cairo_paint_with_alpha(gr->cr, alpha);
703       cairo_restore(gr->cr);
704     }
705 }
706
707 JNIEXPORT void JNICALL
708 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip 
709 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
710  jlong pointer)
711 {
712   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
713   g_assert( gr != NULL );
714
715   cairo_clip( gr->cr );
716 }
717
718 JNIEXPORT void JNICALL 
719 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip 
720 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
721  jlong pointer)
722 {
723   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
724   g_assert (gr != NULL);
725
726   cairo_reset_clip( gr->cr );
727 }
728
729 JNIEXPORT void JNICALL 
730 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip 
731 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
732  jlong pointer)
733 {
734   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
735   g_assert (gr != NULL);
736
737   cairo_clip_preserve( gr->cr );
738 }
739
740 JNIEXPORT void JNICALL
741 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine
742 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
743  jlong pointer, jdouble x1, jdouble y1, jdouble x2, jdouble y2)
744 {
745   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
746   g_assert (gr != NULL);
747
748   cairo_new_path(gr->cr);
749   cairo_move_to(gr->cr, x1, y1);
750   cairo_line_to(gr->cr, x2, y2);
751   cairo_stroke(gr->cr);
752 }
753
754 JNIEXPORT void JNICALL
755 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect
756 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
757  jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
758 {
759   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
760   g_assert (gr != NULL);
761
762   cairo_new_path(gr->cr);
763   cairo_rectangle(gr->cr, x, y, w, h);
764   cairo_stroke(gr->cr);
765 }
766
767 JNIEXPORT void JNICALL
768 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect
769 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
770  jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
771 {
772   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
773   g_assert (gr != NULL);
774
775   cairo_new_path(gr->cr);
776   cairo_rectangle(gr->cr, x, y, w, h);
777   cairo_fill(gr->cr);
778 }
779
780 static void 
781 update_pattern_transform (struct cairographics2d *gr)
782 {
783   cairo_matrix_t mat;
784
785   g_assert (gr != NULL);
786   if (gr->pattern == NULL)
787     return;
788
789   cairo_get_matrix (gr->cr, &mat);
790   cairo_pattern_set_matrix (gr->pattern, &mat);
791 }
792