OSDN Git Service

2006-08-14 Mark Wielaard <mark@klomp.org>
[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 (gr != NULL);
243
244   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  
245   g_assert (native_matrix != NULL);
246   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
247
248   {
249     cairo_matrix_t mat;
250
251     cairo_matrix_init_identity (&mat);
252     cairo_matrix_init (&mat, 
253                        native_matrix[0], native_matrix[1],
254                        native_matrix[2], native_matrix[3],
255                        native_matrix[4], native_matrix[5]);
256     g_assert (gr != NULL);
257     cairo_set_matrix (gr->cr, &mat);
258   }
259
260   (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
261   update_pattern_transform (gr);
262 }
263
264 JNIEXPORT void JNICALL
265 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale
266 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
267  jlong pointer, jdouble x, jdouble y)
268 {
269   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
270   g_assert (gr != NULL);
271
272   cairo_scale (gr->cr, x, y);
273 }
274
275 JNIEXPORT void JNICALL
276 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector
277 (JNIEnv *env, jobject obj __attribute__((unused)), jlong pointer,
278  jobject font,
279  jfloat x, jfloat y, jint n,
280  jintArray java_codes,
281  jfloatArray java_positions)
282 {
283   
284   struct cairographics2d *gr = NULL;
285   struct peerfont *pfont = NULL;
286   cairo_glyph_t *glyphs = NULL;
287   int *native_codes;
288   float *native_positions;
289   jint i = 0;
290
291   g_assert (java_codes != NULL);
292   g_assert (java_positions != NULL);
293
294   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
295   g_assert (gr != NULL);
296
297   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
298   g_assert (pfont != NULL);
299
300   install_font_peer(gr->cr, pfont);
301
302   glyphs = g_malloc( sizeof(cairo_glyph_t) * n);
303   g_assert (glyphs != NULL);
304
305   native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
306   native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
307   
308   for (i = 0; i < n; ++i)
309     {
310       glyphs[i].index = native_codes[i];
311       glyphs[i].x = x + native_positions[ 2*i ];
312       glyphs[i].y = y + native_positions[ 2*i + 1];
313     }
314
315   (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
316   (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
317
318   pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
319   cairo_show_glyphs (gr->cr, glyphs, n);
320   pango_fc_font_unlock_face( (PangoFcFont *)pfont->font );
321
322   g_free(glyphs);
323 }
324
325
326 JNIEXPORT void JNICALL
327 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator 
328 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
329  jlong pointer, jint op)
330 {
331   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
332   g_assert (gr != NULL);
333
334   switch ((enum java_awt_alpha_composite_rule) op)
335     {
336     case java_awt_alpha_composite_CLEAR: 
337       cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
338       break;
339       
340     case java_awt_alpha_composite_SRC: 
341       cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
342       break;
343       
344     case java_awt_alpha_composite_SRC_OVER: 
345       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
346       break;
347
348     case java_awt_alpha_composite_DST_OVER: 
349       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
350       break;
351
352     case java_awt_alpha_composite_SRC_IN: 
353       cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
354       break;
355
356     case java_awt_alpha_composite_DST_IN: 
357       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
358       break;
359
360     case java_awt_alpha_composite_SRC_OUT: 
361       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
362       break;
363
364     case java_awt_alpha_composite_DST_OUT: 
365       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
366       break;
367
368     case java_awt_alpha_composite_DST: 
369       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
370       break;
371
372     case java_awt_alpha_composite_SRC_ATOP: 
373       cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
374       break;
375
376     case java_awt_alpha_composite_DST_ATOP: 
377       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
378       break;
379
380     case java_awt_alpha_composite_XOR: 
381       cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
382       break;
383     }
384 }
385
386 JNIEXPORT void JNICALL
387 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
388 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
389  jlong pointer, jdouble r, jdouble g, jdouble b, jdouble a)
390 {
391   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
392   g_assert (gr != NULL);
393
394   cairo_set_source_rgba (gr->cr, r, g, b, a);
395 }
396
397 JNIEXPORT void JNICALL
398 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule 
399 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
400  jlong pointer, jint rule)
401 {
402   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
403   g_assert (gr != NULL);
404
405   switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
406     {
407     case java_awt_geom_path_iterator_WIND_NON_ZERO:
408       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
409       break;
410     case java_awt_geom_path_iterator_WIND_EVEN_ODD:
411       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
412       break;
413     }
414 }
415
416 /**
417  * Set the line style, except for dashes.
418  */
419 JNIEXPORT void JNICALL
420 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
421 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
422  jlong pointer, jdouble width, int cap, int join, double miterLimit)
423 {
424   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
425   g_assert (gr != NULL);
426
427   /* set width */
428   cairo_set_line_width (gr->cr, width);
429
430   /* set cap */
431   switch ((enum java_awt_basic_stroke_cap_rule) cap)
432     {
433     case java_awt_basic_stroke_CAP_BUTT: 
434       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
435       break;
436
437     case java_awt_basic_stroke_CAP_ROUND: 
438       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
439       break;
440
441     case java_awt_basic_stroke_CAP_SQUARE: 
442       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
443       break;
444     }
445
446   /* set join */
447   switch ((enum java_awt_basic_stroke_join_rule) join)
448     {
449     case java_awt_basic_stroke_JOIN_MITER:
450       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
451       break;
452
453     case java_awt_basic_stroke_JOIN_ROUND:
454       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
455       break;
456
457     case java_awt_basic_stroke_JOIN_BEVEL:
458       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
459       break;
460     }
461
462   /* set miter */
463   cairo_set_miter_limit (gr->cr, miterLimit);
464 }
465
466 /**
467  * Set the line dashes
468  */ 
469 JNIEXPORT void JNICALL
470 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
471 (JNIEnv *env, jobject obj __attribute__((unused)),
472  jlong pointer, jdoubleArray dashes, jint ndash, jdouble offset)
473 {
474   jdouble *dasharr = NULL;
475   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
476   g_assert (gr != NULL);
477
478   dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);  
479   g_assert (dasharr != NULL);
480
481   cairo_set_dash (gr->cr, dasharr, ndash, offset);
482
483   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
484 }
485
486 JNIEXPORT void JNICALL
487 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave
488 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
489  jlong pointer)
490 {
491   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
492   g_assert (gr != NULL);
493
494   cairo_save (gr->cr);
495 }
496
497 JNIEXPORT void JNICALL
498 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore
499 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
500  jlong pointer)
501 {
502   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
503   g_assert (gr != NULL);
504
505   cairo_restore (gr->cr);
506 }
507
508 JNIEXPORT void JNICALL
509 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath 
510 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
511  jlong pointer)
512 {
513   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
514   g_assert (gr != NULL);
515
516   cairo_new_path (gr->cr);
517 }
518
519 JNIEXPORT void JNICALL
520 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo 
521 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
522  jlong pointer, jdouble x, jdouble y)
523 {
524   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
525   g_assert (gr != NULL);
526
527   cairo_move_to (gr->cr, x, y);
528 }
529
530 JNIEXPORT void JNICALL
531 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo 
532 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
533  jlong pointer, jdouble x, jdouble y)
534 {
535   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
536   g_assert (gr != NULL);
537
538   cairo_line_to (gr->cr, x, y);
539 }
540
541 JNIEXPORT void JNICALL
542 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo 
543 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
544  jlong pointer, jdouble x1, jdouble y1,
545  jdouble x2, jdouble y2, jdouble x3, jdouble y3)
546 {
547   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
548   g_assert (gr != NULL);
549   cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
550 }
551
552 JNIEXPORT void JNICALL
553 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo 
554 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
555  jlong pointer, jdouble dx, jdouble dy)
556 {
557   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
558   g_assert (gr != NULL);
559
560   cairo_rel_move_to (gr->cr, dx, dy);
561 }
562
563 JNIEXPORT void JNICALL
564 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo 
565 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
566  jlong pointer, jdouble dx, jdouble dy)
567 {
568   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
569   g_assert (gr != NULL);
570
571   cairo_rel_line_to (gr->cr, dx, dy);
572 }
573
574 JNIEXPORT void JNICALL
575 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo 
576 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
577  jlong pointer, jdouble dx1, jdouble dy1,
578  jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
579 {
580   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
581   g_assert (gr != NULL);
582
583   cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
584 }
585
586 JNIEXPORT void JNICALL
587 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle 
588 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
589  jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
590 {
591   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
592
593   cairo_rectangle (gr->cr, x, y, width, height);
594 }
595
596 JNIEXPORT void JNICALL
597 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc 
598 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
599  jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1,
600  jdouble angle2)
601 {
602   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
603
604   cairo_arc (gr->cr, x, y, radius, angle1, angle2);
605 }
606
607 JNIEXPORT void JNICALL
608 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath 
609 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
610  jlong pointer)
611 {
612   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
613   g_assert (gr != NULL);
614
615   cairo_close_path (gr->cr);
616 }
617
618 JNIEXPORT void JNICALL
619 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke 
620 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
621  jlong pointer)
622 {
623   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
624   g_assert (gr != NULL);
625
626   cairo_stroke (gr->cr);
627 }
628
629 JNIEXPORT void JNICALL
630 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill 
631 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
632  jlong pointer, jdouble alpha)
633 {
634   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
635   g_assert (gr != NULL);
636
637   if (alpha == 1.0)
638     cairo_fill (gr->cr);
639   else
640     {
641       cairo_save(gr->cr);
642       cairo_clip(gr->cr);
643       cairo_paint_with_alpha(gr->cr, alpha);
644       cairo_restore(gr->cr);
645     }
646 }
647
648 JNIEXPORT void JNICALL
649 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip 
650 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
651  jlong pointer)
652 {
653   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
654   g_assert( gr != NULL );
655
656   cairo_clip( gr->cr );
657 }
658
659 JNIEXPORT void JNICALL 
660 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip 
661 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
662  jlong pointer)
663 {
664   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
665   g_assert (gr != NULL);
666
667   cairo_reset_clip( gr->cr );
668 }
669
670 JNIEXPORT void JNICALL 
671 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip 
672 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
673  jlong pointer)
674 {
675   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
676   g_assert (gr != NULL);
677
678   cairo_clip_preserve( gr->cr );
679 }
680
681 JNIEXPORT void JNICALL
682 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSurfaceSetFilter
683 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
684  jlong pointer, jint filter)
685 {
686   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
687   g_assert (gr != NULL);
688   
689   if (gr->pattern == NULL)
690     return;
691   
692   switch ((enum java_awt_rendering_hints_filter) filter)
693     {
694     case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
695       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_NEAREST);
696       break;
697     case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
698       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_BILINEAR);
699       break; 
700     case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
701       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_FAST);
702       break;
703     case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
704       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_NEAREST);
705       break;
706     case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
707       cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_BEST);
708       break;
709     }
710 }
711
712 JNIEXPORT void JNICALL
713 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine
714 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
715  jlong pointer, jdouble x1, jdouble y1, jdouble x2, jdouble y2)
716 {
717   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
718   g_assert (gr != NULL);
719
720   cairo_new_path(gr->cr);
721   cairo_move_to(gr->cr, x1, y1);
722   cairo_line_to(gr->cr, x2, y2);
723   cairo_stroke(gr->cr);
724 }
725
726 JNIEXPORT void JNICALL
727 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect
728 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
729  jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
730 {
731   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
732   g_assert (gr != NULL);
733
734   cairo_new_path(gr->cr);
735   cairo_rectangle(gr->cr, x, y, w, h);
736   cairo_stroke(gr->cr);
737 }
738
739 JNIEXPORT void JNICALL
740 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect
741 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
742  jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
743 {
744   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
745   g_assert (gr != NULL);
746
747   cairo_new_path(gr->cr);
748   cairo_rectangle(gr->cr, x, y, w, h);
749   cairo_fill(gr->cr);
750 }
751
752
753 /************************** FONT STUFF ****************************/
754 static void
755 install_font_peer(cairo_t *cr,
756                   struct peerfont *pfont)
757 {
758   cairo_font_face_t *ft;
759   FT_Face face = NULL;
760
761   g_assert(cr != NULL);
762   g_assert(pfont != NULL);
763
764   if (pfont->graphics_resource == NULL)
765     {
766       face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
767       g_assert (face != NULL);
768
769       ft = cairo_ft_font_face_create_for_ft_face (face, 0);
770       g_assert (ft != NULL);
771
772       cairo_set_font_face (cr, ft);
773       /*      cairo_font_face_destroy (ft);*/
774       cairo_set_font_size (cr,
775                            (pango_font_description_get_size (pfont->desc) /
776                             (double)PANGO_SCALE));
777       ft = cairo_get_font_face (cr);
778       pango_fc_font_unlock_face( (PangoFcFont *)pfont->font );
779       pfont->graphics_resource = ft;
780     }
781   else
782     {
783       ft = (cairo_font_face_t *) pfont->graphics_resource;
784       cairo_set_font_face (cr, ft);
785       cairo_set_font_size (cr,
786                            (pango_font_description_get_size (pfont->desc) /
787                             (double)PANGO_SCALE));
788     }
789 }
790
791 static void 
792 update_pattern_transform (struct cairographics2d *gr)
793 {
794   cairo_matrix_t mat;
795
796   g_assert (gr != NULL);
797   if (gr->pattern == NULL)
798     return;
799
800   cairo_get_matrix (gr->cr, &mat);
801   cairo_pattern_set_matrix (gr->pattern, &mat);
802 }
803