OSDN Git Service

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