aboutsummaryrefslogtreecommitdiff
path: root/libjava/jni
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@redhat.com>2003-11-20 22:44:01 +0000
committerGraydon Hoare <graydon@gcc.gnu.org>2003-11-20 22:44:01 +0000
commit146a1ecb877611526fcd141a6efc1e290e13e412 (patch)
tree6393cb9c46b692380d17ed826cc98c7cbca141a1 /libjava/jni
parent531547e90e1394313f68e2c44624638f79317137 (diff)
downloadgcc-146a1ecb877611526fcd141a6efc1e290e13e412.zip
gcc-146a1ecb877611526fcd141a6efc1e290e13e412.tar.gz
gcc-146a1ecb877611526fcd141a6efc1e290e13e412.tar.bz2
GdkClasspathFontPeerMetrics.java: New file.
2003-11-17 Graydon Hoare <graydon@redhat.com> * 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
Diffstat (limited to 'libjava/jni')
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c9
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c93
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c173
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c151
4 files changed, 312 insertions, 114 deletions
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 <math.h>
+
+#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)