OSDN Git Service

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