From 146a1ecb877611526fcd141a6efc1e290e13e412 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Thu, 20 Nov 2003 22:44:01 +0000 Subject: GdkClasspathFontPeerMetrics.java: New file. 2003-11-17 Graydon Hoare * gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java: New file. * gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java (GdkFontLineMetrics): New inner class. (getLineMetrics): Return new GdkFontLineMetrics. (getFontMetrics): Return new GdkClasspathFontPeerMetrics. (layoutGlyphVector): Create GdkGlyphVector. * gnu/java/awt/peer/gtk/GdkGraphics2D.java (stateStack): New member. (GdkGraphics2D): Initialize state via mathod calls. (cairoSetMatrix, cairoShowGlyphs): Simplify native calls. (cairoTranslate, cairoScale, cairoRotate): Remove. (various methods): use setTransform for special transform cases. (DrawState): New inner class. (stateSave): New method. (stateRestore): New method. (various methods): use stateSave, stateRestore. (getClipInDevSpace): New method. (clip, clipRect, setClip, getClip, getClipBounds): Follow spec more closely. (getTransform): Return clone of transform. (setStroke): Set linewidth to passed width / 2.0. (setPaintMode): Set SrcOver rather than Xor. (setColor): Set paint to passed color. (drawRaster, drawImage, PainterThread, drawPixels): Take affine transform from image to user space. (drawRenderedImage, drawRenderableImage): Implement. (getFontRenderContext, getFontMetrics, drawString, getFont): Implement (drawArc, drawOval, drawRoundRect, fillArc, fillOval, fillRoundRect): Implement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Match changes to java side. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c: Release resources. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: Don't use pango for metrics. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c: New file. From-SVN: r73776 --- .../gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c | 9 +- ...java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c | 93 +++++++++++ .../gnu_java_awt_peer_gtk_GdkGlyphVector.c | 173 ++++++++++++++++----- .../gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c | 151 +++++++++--------- 4 files changed, 312 insertions(+), 114 deletions(-) create mode 100644 libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c (limited to 'libjava/jni') diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c index 092979b..afb705b 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c @@ -120,6 +120,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_setFont pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self); g_assert (pfont != NULL); + if (pfont->ctx != NULL) + g_object_unref (pfont->ctx); + if (pfont->font != NULL) + g_object_unref (pfont->font); + if (pfont->desc != NULL) + pango_font_description_free (pfont->desc); + pfont->desc = pango_font_description_new (); g_assert (pfont->desc != NULL); @@ -153,7 +160,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_setFont pfont->font = pango_font_map_load_font (map, pfont->ctx, pfont->desc); g_assert (pfont->font != NULL); - + gdk_threads_leave (); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c new file mode 100644 index 0000000..0f0b424 --- /dev/null +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c @@ -0,0 +1,93 @@ +/* gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c + Copyright (C) 1999, 2003 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +#include + +#include "gtkpeer.h" +#include "gdkfont.h" +#include "gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.h" + +#define ASCENT 0 +#define MAX_ASCENT 1 +#define DESCENT 2 +#define MAX_DESCENT 3 +#define MAX_ADVANCE 4 +#define NUM_METRICS 5 + +JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics_initState + (JNIEnv *env, jobject self, jobject font) +{ + jintArray array; + jint *metrics; + struct peerfont *pf = NULL; + + pf = NSA_GET_FONT_PTR(env, font); + g_assert (pf != NULL); + + array = (*env)->NewIntArray (env, NUM_METRICS); + metrics = (*env)->GetIntArrayElements (env, array, NULL); + + gdk_threads_enter (); + +#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) +#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ + + ((double)((t) & 0x3F) / 63.0)) + + double pointsize = pango_font_description_get_size (pf->desc); + pointsize /= (double) PANGO_SCALE; + + FT_Face face = pango_ft2_font_get_face (pf->font); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); + + metrics[ASCENT] = ceil (DOUBLE_FROM_26_6(face->size->metrics.ascender)); + metrics[MAX_ASCENT] = metrics[ASCENT]; + metrics[DESCENT] = floor (DOUBLE_FROM_26_6(face->size->metrics.descender)); + if (metrics[DESCENT] < 0) + metrics[DESCENT] = - metrics[DESCENT]; + metrics[MAX_DESCENT] = metrics[DESCENT]; + metrics[MAX_ADVANCE] = ceil (DOUBLE_FROM_26_6(face->size->metrics.max_advance)); + + gdk_threads_leave (); + + (*env)->ReleaseIntArrayElements (env, array, metrics, 0); + + return array; +} + diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c index 052f7e9..29616c7 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c @@ -40,6 +40,16 @@ struct state_table *native_glyphvector_state_table; +typedef struct { + double x; + double y; + double width; + double height; +} rect_t; + +#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) +#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ + + ((double)((t) & 0x3F) / 63.0)) JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState (JNIEnv *env, jclass clazz) @@ -64,8 +74,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initState vec = (struct glyphvec *) g_malloc0 (sizeof (struct glyphvec)); g_assert (vec != NULL); - vec->desc = pango_font_description_copy (pfont->desc); + vec->desc = pango_font_describe (pfont->font); g_assert (vec->desc != NULL); + + vec->font = pfont->font; + g_object_ref (vec->font); vec->ctx = pfont->ctx; g_object_ref (vec->ctx); @@ -150,10 +163,10 @@ static void seek_glyph_idx (GList *list, int idx, *g = gs->glyphs + nidx; } -static void union_rects (PangoRectangle *r1, - const PangoRectangle *r2) +static void union_rects (rect_t *r1, + const rect_t *r2) { - PangoRectangle r; + rect_t r; g_assert (r1 != NULL); g_assert (r2 != NULL); @@ -184,7 +197,7 @@ static void union_rects (PangoRectangle *r1, *r1 = r; } -static jdoubleArray rect_to_array (JNIEnv *env, const PangoRectangle *r) +static jdoubleArray rect_to_array (JNIEnv *env, const rect_t *r) { /* We often return rectangles as arrays : { x, y, w, h } */ jdoubleArray ret; @@ -193,11 +206,11 @@ static jdoubleArray rect_to_array (JNIEnv *env, const PangoRectangle *r) ret = (*env)->NewDoubleArray (env, 4); rp = (*env)->GetDoubleArrayElements (env, ret, NULL); g_assert (rp != NULL); - rp[0] = r->x / (double)PANGO_SCALE; + rp[0] = r->x; /* freetype and pango's view of space is upside down from java2d's */ - rp[1] = (r->y / (double)PANGO_SCALE) * -1; - rp[2] = r->width / (double)PANGO_SCALE; - rp[3] = r->height / (double)PANGO_SCALE; + rp[1] = r->y * -1; + rp[2] = r->width; + rp[3] = r->height; (*env)->ReleaseDoubleArrayElements (env, ret, rp, 0); return ret; } @@ -251,18 +264,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL); g_assert (str != NULL); - /* step 1: mark the text as having our FontFescription as an - attribute, then "itemize" the text */ + /* step 1: set our FontFescription in the context, then "itemize" the + text */ attrs = pango_attr_list_new (); g_assert (attrs != NULL); - PangoAttribute *da = pango_attr_font_desc_new(vec->desc); - g_assert (da != NULL); - da->start_index = 0; - da->end_index = len; - - pango_attr_list_insert (attrs, da); + pango_context_set_font_description (vec->ctx, vec->desc); + items = pango_itemize (vec->ctx, str, 0, len, attrs, NULL); g_assert (items != NULL); @@ -393,15 +402,19 @@ JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCharIndex } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents +JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents (JNIEnv *env, jobject self) { struct glyphvec *vec = NULL; + int j; GList *i; PangoGlyphItem *gi = NULL; - PangoRectangle rect = {0,0,0,0}; - PangoRectangle tmp, dummy; + rect_t rect = {0,0,0,0}; + rect_t tmp; jdoubleArray ret; + double x = 0, y = 0; + double pointsize; + FT_Face face; gdk_threads_enter (); g_assert (self != NULL); @@ -409,17 +422,33 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogi g_assert (vec != NULL); g_assert (vec->glyphitems != NULL); + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i)) { g_assert (i->data != NULL); gi = (PangoGlyphItem *)i->data; g_assert (gi->glyphs != NULL); + + face = pango_ft2_font_get_face (gi->item->analysis.font); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); - pango_glyph_string_extents (gi->glyphs, - gi->item->analysis.font, - &dummy, - &tmp); - union_rects (&rect, &tmp); + for (j = 0; j < gi->glyphs->num_glyphs; ++j) + { + FT_Load_Glyph (face, gi->glyphs->glyphs[j].glyph, FT_LOAD_DEFAULT); + /* FIXME: this needs to change for vertical layouts */ + tmp.x = x + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX); + tmp.y = y + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY); + tmp.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width); + tmp.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height); + union_rects (&rect, &tmp); + x += DOUBLE_FROM_26_6 (face->glyph->advance.x); + y += DOUBLE_FROM_26_6 (face->glyph->advance.y); + } } ret = rect_to_array (env, &rect); @@ -428,15 +457,19 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogi } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents +JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents (JNIEnv *env, jobject self) { struct glyphvec *vec = NULL; + int j; GList *i; PangoGlyphItem *gi = NULL; - PangoRectangle rect = {0,0,0,0}; - PangoRectangle tmp, dummy; + rect_t rect = {0,0,0,0}; + rect_t tmp; jdoubleArray ret; + double x = 0, y = 0; + double pointsize; + FT_Face face; gdk_threads_enter (); g_assert (self != NULL); @@ -444,17 +477,38 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkE g_assert (vec != NULL); g_assert (vec->glyphitems != NULL); + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i)) { g_assert (i->data != NULL); gi = (PangoGlyphItem *)i->data; g_assert (gi->glyphs != NULL); + + face = pango_ft2_font_get_face (gi->item->analysis.font); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); - pango_glyph_string_extents (gi->glyphs, - gi->item->analysis.font, - &tmp, - &dummy); - union_rects (&rect, &tmp); + for (j = 0; j < gi->glyphs->num_glyphs; ++j) + { + FT_Load_Glyph (face, gi->glyphs->glyphs[j].glyph, FT_LOAD_DEFAULT); + + /* FIXME: also, this is probably not the correct set of metrics; + the "logical bounds" are some fancy combination of hori + advance and height such that it's good for inverting as a + highlight. revisit. */ + + tmp.x = x; + tmp.y = y; + tmp.width = DOUBLE_FROM_26_6 (face->glyph->advance.x); + tmp.height = DOUBLE_FROM_26_6 (face->glyph->advance.y); + union_rects (&rect, &tmp); + x += DOUBLE_FROM_26_6 (face->glyph->advance.x); + y += DOUBLE_FROM_26_6 (face->glyph->advance.y); + } } ret = rect_to_array (env, &rect); @@ -462,27 +516,47 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkE return ret; } + JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLogicalExtents (JNIEnv *env, jobject self, jint idx) { struct glyphvec *vec = NULL; - PangoRectangle rect = {0,0,0,0}; - PangoRectangle dummy; + rect_t rect = {0,0,0,0}; PangoGlyphInfo *gi = NULL; PangoFont *font = NULL; jdoubleArray ret; + double pointsize; + FT_Face face; gdk_threads_enter (); g_assert (self != NULL); vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self); g_assert (vec != NULL); g_assert (vec->glyphitems != NULL); - + seek_glyph_idx (vec->glyphitems, idx, &gi, &font); g_assert (gi != NULL); g_assert (font != NULL); - pango_font_get_glyph_extents (font, gi->glyph, &dummy, &rect); + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + face = pango_ft2_font_get_face (font); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); + + FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); + + /* FIXME: this is probably not the correct set of metrics; + the "logical bounds" are some fancy combination of hori + advance and height such that it's good for inverting as a + highlight. revisit. */ + + rect.x = 0; + rect.y = 0; + rect.width = DOUBLE_FROM_26_6 (face->glyph->advance.x); + rect.height = DOUBLE_FROM_26_6 (face->glyph->advance.y); ret = rect_to_array (env, &rect); gdk_threads_leave (); @@ -494,29 +568,44 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIn (JNIEnv *env, jobject self, jint idx) { struct glyphvec *vec = NULL; - PangoRectangle rect = {0,0,0,0}; - PangoRectangle dummy; + rect_t rect = {0,0,0,0}; PangoGlyphInfo *gi = NULL; PangoFont *font = NULL; jdoubleArray ret; - + double pointsize; + FT_Face face; + gdk_threads_enter (); g_assert (self != NULL); vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self); g_assert (vec != NULL); g_assert (vec->glyphitems != NULL); - + seek_glyph_idx (vec->glyphitems, idx, &gi, &font); g_assert (gi != NULL); g_assert (font != NULL); - pango_font_get_glyph_extents (font, gi->glyph, &rect, &dummy); + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; + face = pango_ft2_font_get_face (font); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); + + FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); + /* FIXME: this needs to change for vertical layouts */ + rect.x = DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX); + rect.y = DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY); + rect.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width); + rect.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height); ret = rect_to_array (env, &rect); gdk_threads_leave (); return ret; } + JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHorizontal (JNIEnv *env, jobject self, jint idx) { diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c index 08a9742..76305ca 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c @@ -302,6 +302,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState g_old = (struct graphics2d *) NSA_GET_G2D_PTR (env, old); g_assert (g_old != NULL); + if (g_old->debug) printf ("copying state from existing graphics2d\n"); + g->drawable = g_old->drawable; g->debug = g_old->debug; @@ -316,7 +318,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState else init_graphics2d_as_pixbuf (g); - cairo_surface_set_filter (g->surface, CAIRO_FILTER_BILINEAR); + cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST); gdk_threads_leave (); @@ -649,36 +651,61 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels - (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride) + (JNIEnv *env, jobject obj, jintArray java_pixels, + jint w, jint h, jint stride, jdoubleArray java_matrix) { struct graphics2d *gr = NULL; - jint *jpixels = NULL; + jint *native_pixels = NULL; + jdouble *native_matrix = NULL; gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); if (gr->debug) printf ("drawPixels (%d pixels, %dx%d, stride: %d)\n", - (*env)->GetArrayLength (env, jarr), w, h, stride); + (*env)->GetArrayLength (env, java_pixels), w, h, stride); - jpixels = (*env)->GetIntArrayElements (env, jarr, NULL); - g_assert (jpixels != NULL); + native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL); + native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); + g_assert (native_pixels != NULL); + g_assert (native_matrix != NULL); + g_assert ((*env)->GetArrayLength (env, java_matrix) == 6); begin_drawing_operation (gr); - { - cairo_surface_t *surf = cairo_surface_create_for_image ((char *)jpixels, + cairo_matrix_t *mat = NULL; + cairo_surface_t *surf = cairo_surface_create_for_image ((char *)native_pixels, CAIRO_FORMAT_ARGB32, w, h, stride * 4); - cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); + mat = cairo_matrix_create (); + cairo_matrix_set_affine (mat, + native_matrix[0], native_matrix[1], + native_matrix[2], native_matrix[3], + native_matrix[4], native_matrix[5]); + cairo_surface_set_matrix (surf, mat); + if (native_matrix[0] != 1. + || native_matrix[1] != 0. + || native_matrix[2] != 0. + || native_matrix[3] != 1.) + { + cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); + } + else + { + cairo_surface_set_filter (surf, CAIRO_FILTER_FAST); + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); + } cairo_show_surface (gr->cr, surf, w, h); + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); + cairo_matrix_destroy (mat); cairo_surface_destroy (surf); } - end_drawing_operation (gr); - (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0); + (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0); + (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); } @@ -706,25 +733,34 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix - (JNIEnv *env, jobject obj, - jdouble m00, jdouble m10, - jdouble m01, jdouble m11, - jdouble m02, jdouble m12) + (JNIEnv *env, jobject obj, jdoubleArray java_matrix) { struct graphics2d *gr = NULL; + jdouble *native_matrix = NULL; + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); - if (gr->debug) printf ("cairo_set_matrix\n"); + + native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); + g_assert (native_matrix != NULL); + g_assert ((*env)->GetArrayLength (env, java_matrix) == 6); + + if (gr->debug) printf ("cairo_set_matrix [ %f, %f, %f, %f, %f, %f ]\n", + native_matrix[0], native_matrix[1], + native_matrix[2], native_matrix[3], + native_matrix[4], native_matrix[5]); { cairo_matrix_t * mat = cairo_matrix_create (); - cairo_matrix_set_affine (mat, - m00, m10, - m01, m11, - m02, m12); + cairo_matrix_set_affine (mat, + native_matrix[0], native_matrix[1], + native_matrix[2], native_matrix[3], + native_matrix[4], native_matrix[5]); cairo_set_matrix (gr->cr, mat); cairo_matrix_destroy (mat); } + + (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); update_pattern_transform (gr); } @@ -750,8 +786,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont ft = cairo_ft_font_create_for_ft_face (face); g_assert (ft != NULL); - if (gr->debug) printf ("cairo_set_font '%s'\n", - face->family_name); + if (gr->debug) printf ("cairo_set_font '%s'\n", face->family_name); cairo_set_font (gr->cr, ft); @@ -765,40 +800,46 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs - (JNIEnv *env, jobject obj, jintArray jcodes, jfloatArray jposns, jint nglyphs) + (JNIEnv *env, jobject obj, jintArray java_codes, jfloatArray java_posns) { struct graphics2d *gr = NULL; cairo_glyph_t *glyphs = NULL; - jfloat *posns = NULL; - jint *codes = NULL; + jfloat *native_posns = NULL; + jint *native_codes = NULL; jint i; + jint ncodes, nposns; gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); - if (gr->debug) printf ("cairo_show_glyphs (%d glyphs)\n", nglyphs); + native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); + native_posns = (*env)->GetFloatArrayElements (env, java_posns, NULL); + g_assert (native_codes != NULL); + g_assert (native_posns != NULL); - glyphs = malloc (sizeof(cairo_glyph_t) * nglyphs); - g_assert (glyphs); + ncodes = (*env)->GetArrayLength (env, java_codes); + nposns = (*env)->GetArrayLength (env, java_posns); + g_assert (2 * ncodes == nposns); - codes = (*env)->GetIntArrayElements (env, jcodes, NULL); - g_assert (codes != NULL); + if (gr->debug) printf ("cairo_show_glyphs (%d glyphs)\n", ncodes); - posns = (*env)->GetFloatArrayElements (env, jposns, NULL); - g_assert (posns != NULL); + glyphs = malloc (sizeof(cairo_glyph_t) * ncodes); + g_assert (glyphs); - for (i = 0; i < nglyphs; ++i) + for (i = 0; i < ncodes; ++i) { - glyphs[i].index = codes[i]; - glyphs[i].x = (double) posns[2*i]; - glyphs[i].y = (double) posns[2*i + 1]; + glyphs[i].index = native_codes[i]; + glyphs[i].x = (double) native_posns[2*i]; + glyphs[i].y = (double) native_posns[2*i + 1]; + if (gr->debug) printf ("cairo_show_glyphs (glyph %d (code %d) : %f,%f)\n", + i, glyphs[i].index, glyphs[i].x, glyphs[i].y); } - (*env)->ReleaseIntArrayElements (env, jcodes, codes, 0); - (*env)->ReleaseFloatArrayElements (env, jposns, posns, 0); + (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); + (*env)->ReleaseFloatArrayElements (env, java_posns, native_posns, 0); begin_drawing_operation (gr); - cairo_show_glyphs (gr->cr, glyphs, nglyphs); + cairo_show_glyphs (gr->cr, glyphs, ncodes); end_drawing_operation (gr); free(glyphs); @@ -991,38 +1032,6 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLim cairo_set_miter_limit (gr->cr, miter); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoTranslate - (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) -{ - struct graphics2d *gr = NULL; - gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); - if (gr->debug) printf ("cairo_translate (%f, %f)\n", dx, dy); - cairo_translate (gr->cr, dx, dy); - update_pattern_transform (gr); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoScale - (JNIEnv *env, jobject obj, jdouble sx, jdouble sy) -{ - struct graphics2d *gr = NULL; - gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); - if (gr->debug) printf ("cairo_scale (%f, %f)\n", sx, sy); - cairo_scale (gr->cr, sx, sy); - update_pattern_transform (gr); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRotate - (JNIEnv *env, jobject obj, jdouble angle) -{ - struct graphics2d *gr = NULL; - gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); - if (gr->debug) printf ("cairo_rotate %f\n", angle); - cairo_rotate (gr->cr, angle); - update_pattern_transform (gr); -} JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath (JNIEnv *env, jobject obj) -- cgit v1.1