summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Kung <fkung@redhat.com>2007-03-16 15:14:53 +0000
committerFrancis Kung <fkung@redhat.com>2007-03-16 15:14:53 +0000
commitdd8d7b5172cd89d71c4ec8abdc75a11f5ee756f9 (patch)
tree58066df7d955103d99cbf8b5ccf3615c5e8894b9
parent49d052d30cc7f5579709b69c5e1064dc102195fe (diff)
downloadclasspath-dd8d7b5172cd89d71c4ec8abdc75a11f5ee756f9.tar.gz
2007-03-16 Francis Kung <fkung@redhat.com>
* gnu/java/awt/peer/gtk/CairoGraphics2D.java (cairoArc): Make protected rather than private so it can be over-ridden. (cairoClip): Likewise. (cairoClosePath): Likewise. (cairoCurveTo): Likewise. (cairoDrawGlyphVector): Likewise. (cairoFill): Likewise. (cairoLineTo): Likewise. (cairoMoveTo): Likewise. (cairoNewPath): Likewise. (cairoRectangle): Likewise. (cairoResetClip): Likewise. (cairoRestore): Likewise. (cairoSave): Likewise. (cairoScale): Likewise. (cairoSetAntialias): Likewise. (cairoSetDash): Likewise. (cairoSetFillRule): Likewise. (cairoSetFont): Likewise. (cairoSetLine): Likewise. (cairoSetMatrix): Likewise. (cairoSetOperator): Likewise. (cairoSetRGBAColor): Likewise. (cairoStroke): Likewise. (drawPixels): Likewise. (init): Likewise. (setGradient): Likewise. (setPaintPixels): Likewise. (cairoDrawLine): Removed. (cairoDrawRect): Removed. (cairoFillRect): Removed. (cairoPreserveClip): Removed. (cairoRelCurveTo): Removed. (cairoRelLineTo): Removed. (cairoRelMoveTo): Removed. * gnu/java/awt/peer/gtk/ComponentGraphics.java (cairoArc): New method wrapping superclass method in locks. (cairoClip): Likewise. (cairoClosePath): Likewise. (cairoCurveTo): Likewise. (cairoDrawGlyphVector): Likewise. (cairoFill): Likewise. (cairoLineTo): Likewise. (cairoMoveTo): Likewise. (cairoNewPath): Likewise. (cairoRectangle): Likewise. (cairoResetClip): Likewise. (cairoRestore): Likewise. (cairoSave): Likewise. (cairoScale): Likewise. (cairoSetAntialias): Likewise. (cairoSetDash): Likewise. (cairoSetFillRule): Likewise. (cairoSetFont): Likewise. (cairoSetLine): Likewise. (cairoSetMatrix): Likewise. (cairoSetOperator): Likewise. (cairoSetRGBAColor): Likewise. (cairoStroke): Likewise. (disposeNative): Likewise. (drawPixels): Likewise. (init): Likewise. (setGradient): Likewise. (setPaintPixels): Likewise. (draw): Do not lock, as locking is now done in the wrapped native methods. (drawComposite): Likewise. (drawGlyphVector): Likewise. (drawImage): Likewise. (drawRenderedImage): Likewise. (fill): Likewise. (setClip): Removed. (lock): Added documentation. (unlock): Added documentation. * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h: Regenerated. * include/gnu_java_awt_peer_gtk_CairoSurface.h: Regenerated. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo): Removed. (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo): Removed.
-rw-r--r--ChangeLog86
-rw-r--r--gnu/java/awt/peer/gtk/CairoGraphics2D.java110
-rw-r--r--gnu/java/awt/peer/gtk/ComponentGraphics.java655
-rw-r--r--include/gnu_java_awt_peer_gtk_CairoGraphics2D.h7
-rw-r--r--include/gnu_java_awt_peer_gtk_CairoSurface.h4
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c85
6 files changed, 634 insertions, 313 deletions
diff --git a/ChangeLog b/ChangeLog
index 30f6255e5..369f9d8b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,89 @@
+2007-03-16 Francis Kung <fkung@redhat.com>
+
+ * gnu/java/awt/peer/gtk/CairoGraphics2D.java
+ (cairoArc): Make protected rather than private so it can be over-ridden.
+ (cairoClip): Likewise.
+ (cairoClosePath): Likewise.
+ (cairoCurveTo): Likewise.
+ (cairoDrawGlyphVector): Likewise.
+ (cairoFill): Likewise.
+ (cairoLineTo): Likewise.
+ (cairoMoveTo): Likewise.
+ (cairoNewPath): Likewise.
+ (cairoRectangle): Likewise.
+ (cairoResetClip): Likewise.
+ (cairoRestore): Likewise.
+ (cairoSave): Likewise.
+ (cairoScale): Likewise.
+ (cairoSetAntialias): Likewise.
+ (cairoSetDash): Likewise.
+ (cairoSetFillRule): Likewise.
+ (cairoSetFont): Likewise.
+ (cairoSetLine): Likewise.
+ (cairoSetMatrix): Likewise.
+ (cairoSetOperator): Likewise.
+ (cairoSetRGBAColor): Likewise.
+ (cairoStroke): Likewise.
+ (drawPixels): Likewise.
+ (init): Likewise.
+ (setGradient): Likewise.
+ (setPaintPixels): Likewise.
+ (cairoDrawLine): Removed.
+ (cairoDrawRect): Removed.
+ (cairoFillRect): Removed.
+ (cairoPreserveClip): Removed.
+ (cairoRelCurveTo): Removed.
+ (cairoRelLineTo): Removed.
+ (cairoRelMoveTo): Removed.
+ * gnu/java/awt/peer/gtk/ComponentGraphics.java
+ (cairoArc): New method wrapping superclass method in locks.
+ (cairoClip): Likewise.
+ (cairoClosePath): Likewise.
+ (cairoCurveTo): Likewise.
+ (cairoDrawGlyphVector): Likewise.
+ (cairoFill): Likewise.
+ (cairoLineTo): Likewise.
+ (cairoMoveTo): Likewise.
+ (cairoNewPath): Likewise.
+ (cairoRectangle): Likewise.
+ (cairoResetClip): Likewise.
+ (cairoRestore): Likewise.
+ (cairoSave): Likewise.
+ (cairoScale): Likewise.
+ (cairoSetAntialias): Likewise.
+ (cairoSetDash): Likewise.
+ (cairoSetFillRule): Likewise.
+ (cairoSetFont): Likewise.
+ (cairoSetLine): Likewise.
+ (cairoSetMatrix): Likewise.
+ (cairoSetOperator): Likewise.
+ (cairoSetRGBAColor): Likewise.
+ (cairoStroke): Likewise.
+ (disposeNative): Likewise.
+ (drawPixels): Likewise.
+ (init): Likewise.
+ (setGradient): Likewise.
+ (setPaintPixels): Likewise.
+ (draw): Do not lock, as locking is now done in the wrapped native methods.
+ (drawComposite): Likewise.
+ (drawGlyphVector): Likewise.
+ (drawImage): Likewise.
+ (drawRenderedImage): Likewise.
+ (fill): Likewise.
+ (setClip): Removed.
+ (lock): Added documentation.
+ (unlock): Added documentation.
+ * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h: Regenerated.
+ * include/gnu_java_awt_peer_gtk_CairoSurface.h: Regenerated.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo): Removed.
+ (Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo): Removed.
+
2007-03-11 Andrew John Hughes <gnu_andrew@member.fsf.org>
* javax/management/openmbean/ArrayType.java:
diff --git a/gnu/java/awt/peer/gtk/CairoGraphics2D.java b/gnu/java/awt/peer/gtk/CairoGraphics2D.java
index c0463f2bd..16a9a5560 100644
--- a/gnu/java/awt/peer/gtk/CairoGraphics2D.java
+++ b/gnu/java/awt/peer/gtk/CairoGraphics2D.java
@@ -312,7 +312,7 @@ public abstract class CairoGraphics2D extends Graphics2D
* Allocate the cairographics2d structure and set the cairo_t pointer in it.
* @param pointer - a cairo_t pointer, casted to a long.
*/
- private native long init(long pointer);
+ protected native long init(long pointer);
/**
* These are declared abstract as there may be context-specific issues.
@@ -345,187 +345,133 @@ public abstract class CairoGraphics2D extends Graphics2D
* @param stride - stride of the array width
* @param i2u - affine transform array
*/
- private native void drawPixels(long pointer, int[] pixels, int w, int h,
+ protected native void drawPixels(long pointer, int[] pixels, int w, int h,
int stride, double[] i2u, double alpha,
int interpolation);
- private native void setGradient(long pointer, double x1, double y1,
+ protected native void setGradient(long pointer, double x1, double y1,
double x2, double y2,
int r1, int g1, int b1, int a1, int r2,
int g2, int b2, int a2, boolean cyclic);
- private native void setPaintPixels(long pointer, int[] pixels, int w,
+ protected native void setPaintPixels(long pointer, int[] pixels, int w,
int h, int stride, boolean repeat,
int x, int y);
/**
* Set the current transform matrix
*/
- private native void cairoSetMatrix(long pointer, double[] m);
+ protected native void cairoSetMatrix(long pointer, double[] m);
/**
* Scaling method
*/
- private native void cairoScale(long pointer, double x, double y);
+ protected native void cairoScale(long pointer, double x, double y);
/**
* Set the compositing operator
*/
- private native void cairoSetOperator(long pointer, int cairoOperator);
+ protected native void cairoSetOperator(long pointer, int cairoOperator);
/**
* Sets the current color in RGBA as a 0.0-1.0 double
*/
- private native void cairoSetRGBAColor(long pointer, double red, double green,
+ protected native void cairoSetRGBAColor(long pointer, double red, double green,
double blue, double alpha);
/**
* Sets the current winding rule in Cairo
*/
- private native void cairoSetFillRule(long pointer, int cairoFillRule);
+ protected native void cairoSetFillRule(long pointer, int cairoFillRule);
/**
* Set the line style, cap, join and miter limit.
* Cap and join parameters are in the BasicStroke enumerations.
*/
- private native void cairoSetLine(long pointer, double width, int cap,
+ protected native void cairoSetLine(long pointer, double width, int cap,
int join, double miterLimit);
/**
* Set the dash style
*/
- private native void cairoSetDash(long pointer, double[] dashes, int ndash,
+ protected native void cairoSetDash(long pointer, double[] dashes, int ndash,
double offset);
/*
* Draws a Glyph Vector
*/
- native void cairoDrawGlyphVector(long pointer, GdkFontPeer font,
+ protected native void cairoDrawGlyphVector(long pointer, GdkFontPeer font,
float x, float y, int n,
int[] codes, float[] positions);
/**
* Set the font in cairo.
*/
- private native void cairoSetFont(long pointer, GdkFontPeer font);
-
- private native void cairoRelCurveTo(long pointer, double dx1, double dy1,
- double dx2, double dy2, double dx3,
- double dy3);
+ protected native void cairoSetFont(long pointer, GdkFontPeer font);
/**
* Appends a rectangle to the current path
*/
- private native void cairoRectangle(long pointer, double x, double y,
+ protected native void cairoRectangle(long pointer, double x, double y,
double width, double height);
/**
* Appends an arc to the current path
*/
- private native void cairoArc(long pointer, double x, double y,
+ protected native void cairoArc(long pointer, double x, double y,
double radius, double angle1, double angle2);
/**
* Save / restore a cairo path
*/
- private native void cairoSave(long pointer);
- private native void cairoRestore(long pointer);
+ protected native void cairoSave(long pointer);
+ protected native void cairoRestore(long pointer);
/**
* New current path
*/
- private native void cairoNewPath(long pointer);
+ protected native void cairoNewPath(long pointer);
/**
* Close current path
*/
- private native void cairoClosePath(long pointer);
+ protected native void cairoClosePath(long pointer);
/** moveTo */
- private native void cairoMoveTo(long pointer, double x, double y);
-
- /** relative moveTo */
- private native void cairoRelMoveTo(long pointer, double dx, double dy);
+ protected native void cairoMoveTo(long pointer, double x, double y);
/** lineTo */
- private native void cairoLineTo(long pointer, double x, double y);
-
- /** relative lineTo */
- private native void cairoRelLineTo(long pointer, double dx, double dy);
+ protected native void cairoLineTo(long pointer, double x, double y);
/** Cubic curve-to */
- private native void cairoCurveTo(long pointer, double x1, double y1,
+ protected native void cairoCurveTo(long pointer, double x1, double y1,
double x2, double y2,
double x3, double y3);
/**
* Stroke current path
*/
- private native void cairoStroke(long pointer);
+ protected native void cairoStroke(long pointer);
/**
* Fill current path
*/
- private native void cairoFill(long pointer, double alpha);
+ protected native void cairoFill(long pointer, double alpha);
/**
* Clip current path
*/
- private native void cairoClip(long pointer);
-
- /**
- * Save clip
- */
- private native void cairoPreserveClip(long pointer);
+ protected native void cairoClip(long pointer);
/**
- * Save clip
+ * Clear clip
*/
- private native void cairoResetClip(long pointer);
+ protected native void cairoResetClip(long pointer);
/**
* Set antialias.
*/
- private native void cairoSetAntialias(long pointer, boolean aa);
-
- /**
- * Draws a line from (x1,y1) to (x2,y2).
- *
- * @param pointer the native pointer
- *
- * @param x1 the x coordinate of the starting point
- * @param y1 the y coordinate of the starting point
- * @param x2 the x coordinate of the end point
- * @param y2 the y coordinate of the end point
- */
- private native void cairoDrawLine(long pointer, double x1, double y1,
- double x2, double y2);
-
- /**
- * Draws a rectangle at starting point (x,y) and with the specified width
- * and height.
- *
- * @param pointer the native pointer
- * @param x the x coordinate of the upper left corner
- * @param y the y coordinate of the upper left corner
- * @param w the width of the rectangle
- * @param h the height of the rectangle
- */
- private native void cairoDrawRect(long pointer, double x, double y, double w,
- double h);
-
- /**
- * Fills a rectangle at starting point (x,y) and with the specified width
- * and height.
- *
- * @param pointer the native pointer
- * @param x the x coordinate of the upper left corner
- * @param y the y coordinate of the upper left corner
- * @param w the width of the rectangle
- * @param h the height of the rectangle
- */
- private native void cairoFillRect(long pointer, double x, double y, double w,
- double h);
+ protected native void cairoSetAntialias(long pointer, boolean aa);
///////////////////////// TRANSFORMS ///////////////////////////////////
diff --git a/gnu/java/awt/peer/gtk/ComponentGraphics.java b/gnu/java/awt/peer/gtk/ComponentGraphics.java
index fc05264a1..c2c769217 100644
--- a/gnu/java/awt/peer/gtk/ComponentGraphics.java
+++ b/gnu/java/awt/peer/gtk/ComponentGraphics.java
@@ -111,6 +111,14 @@ public class ComponentGraphics extends CairoGraphics2D
*/
private native long initState(GtkComponentPeer component);
+ /**
+ * Obtain and hold a GDK lock, which is required for all drawing operations
+ * in this graphics context (since it is backed by an X surface).
+ *
+ * This method causes the GDK locking behaviour to be re-entrant. No race
+ * conditions are caused since a ThreadLocal is used and each thread has its
+ * own lock counter.
+ */
private void lock()
{
Integer i = (Integer) hasLock.get();
@@ -123,6 +131,9 @@ public class ComponentGraphics extends CairoGraphics2D
hasLock.set(Integer.valueOf(i.intValue() + 1));
}
+ /**
+ * Release the re-entrant GDK lock.
+ */
private void unlock()
{
Integer i = (Integer) hasLock.get();
@@ -233,78 +244,54 @@ public class ComponentGraphics extends CairoGraphics2D
*/
public void draw(Shape s)
{
- lock();
- try
+ if (comp == null || comp instanceof AlphaComposite)
+ super.draw(s);
+
+ else
{
- if (comp == null || comp instanceof AlphaComposite)
- super.draw(s);
+ createBuffer();
- else
- {
- createBuffer();
-
- Graphics2D g2d = (Graphics2D)buffer.getGraphics();
- g2d.setStroke(this.getStroke());
- g2d.setColor(this.getColor());
- g2d.draw(s);
-
- drawComposite(s.getBounds2D(), null);
- }
- }
- finally
- {
- unlock();
+ Graphics2D g2d = (Graphics2D)buffer.getGraphics();
+ g2d.setStroke(this.getStroke());
+ g2d.setColor(this.getColor());
+ g2d.draw(s);
+
+ drawComposite(s.getBounds2D(), null);
}
}
public void fill(Shape s)
{
- lock();
- try
+ if (comp == null || comp instanceof AlphaComposite)
+ super.fill(s);
+
+ else
{
- if (comp == null || comp instanceof AlphaComposite)
- super.fill(s);
+ createBuffer();
- else
- {
- createBuffer();
-
- Graphics2D g2d = (Graphics2D)buffer.getGraphics();
- g2d.setPaint(this.getPaint());
- g2d.setColor(this.getColor());
- g2d.fill(s);
-
- drawComposite(s.getBounds2D(), null);
- }
- }
- finally
- {
- unlock();
+ Graphics2D g2d = (Graphics2D)buffer.getGraphics();
+ g2d.setPaint(this.getPaint());
+ g2d.setColor(this.getColor());
+ g2d.fill(s);
+
+ drawComposite(s.getBounds2D(), null);
}
}
public void drawRenderedImage(RenderedImage image, AffineTransform xform)
{
- lock();
- try
+ if (comp == null || comp instanceof AlphaComposite)
+ super.drawRenderedImage(image, xform);
+
+ else
{
- if (comp == null || comp instanceof AlphaComposite)
- super.drawRenderedImage(image, xform);
-
- else
- {
- createBuffer();
+ createBuffer();
- Graphics2D g2d = (Graphics2D)buffer.getGraphics();
- g2d.setRenderingHints(this.getRenderingHints());
- g2d.drawRenderedImage(image, xform);
-
- drawComposite(buffer.getRaster().getBounds(), null);
- }
- }
- finally
- {
- unlock();
+ Graphics2D g2d = (Graphics2D)buffer.getGraphics();
+ g2d.setRenderingHints(this.getRenderingHints());
+ g2d.drawRenderedImage(image, xform);
+
+ drawComposite(buffer.getRaster().getBounds(), null);
}
}
@@ -312,81 +299,65 @@ public class ComponentGraphics extends CairoGraphics2D
Color bgcolor, ImageObserver obs)
{
boolean rv;
- lock();
- try
+ if (comp == null || comp instanceof AlphaComposite)
+ rv = super.drawImage(img, xform, bgcolor, obs);
+
+ else
{
- if (comp == null || comp instanceof AlphaComposite)
- rv = super.drawImage(img, xform, bgcolor, obs);
+ // Get buffered image of source
+ if( !(img instanceof BufferedImage) )
+ {
+ ImageProducer source = img.getSource();
+ if (source == null)
+ return false;
+ img = Toolkit.getDefaultToolkit().createImage(source);
+ }
+ BufferedImage bImg = (BufferedImage) img;
- else
+ // Find translated bounds
+ Point2D origin = new Point2D.Double(bImg.getMinX(), bImg.getMinY());
+ Point2D pt = new Point2D.Double(bImg.getWidth() + bImg.getMinX(),
+ bImg.getHeight() + bImg.getMinY());
+ if (xform != null)
{
- // Get buffered image of source
- if( !(img instanceof BufferedImage) )
- {
- ImageProducer source = img.getSource();
- if (source == null)
- return false;
- img = Toolkit.getDefaultToolkit().createImage(source);
- }
- BufferedImage bImg = (BufferedImage) img;
-
- // Find translated bounds
- Point2D origin = new Point2D.Double(bImg.getMinX(), bImg.getMinY());
- Point2D pt = new Point2D.Double(bImg.getWidth() + bImg.getMinX(),
- bImg.getHeight() + bImg.getMinY());
- if (xform != null)
- {
- origin = xform.transform(origin, origin);
- pt = xform.transform(pt, pt);
- }
-
- // Create buffer and draw image
- createBuffer();
-
- Graphics2D g2d = (Graphics2D)buffer.getGraphics();
- g2d.setRenderingHints(this.getRenderingHints());
- g2d.drawImage(img, xform, obs);
-
- // Perform compositing
- rv = drawComposite(new Rectangle2D.Double(origin.getX(),
- origin.getY(),
- pt.getX(), pt.getY()),
- obs);
+ origin = xform.transform(origin, origin);
+ pt = xform.transform(pt, pt);
}
- }
- finally
- {
- unlock();
+
+ // Create buffer and draw image
+ createBuffer();
+
+ Graphics2D g2d = (Graphics2D)buffer.getGraphics();
+ g2d.setRenderingHints(this.getRenderingHints());
+ g2d.drawImage(img, xform, obs);
+
+ // Perform compositing
+ rv = drawComposite(new Rectangle2D.Double(origin.getX(),
+ origin.getY(),
+ pt.getX(), pt.getY()),
+ obs);
}
return rv;
}
public void drawGlyphVector(GlyphVector gv, float x, float y)
{
- lock();
- try
+ if (comp == null || comp instanceof AlphaComposite)
+ super.drawGlyphVector(gv, x, y);
+
+ else
{
- if (comp == null || comp instanceof AlphaComposite)
- super.drawGlyphVector(gv, x, y);
+ createBuffer();
+
+ Graphics2D g2d = (Graphics2D)buffer.getGraphics();
+ g2d.setPaint(this.getPaint());
+ g2d.setStroke(this.getStroke());
+ g2d.drawGlyphVector(gv, x, y);
- else
- {
- createBuffer();
-
- Graphics2D g2d = (Graphics2D)buffer.getGraphics();
- g2d.setPaint(this.getPaint());
- g2d.setStroke(this.getStroke());
- g2d.drawGlyphVector(gv, x, y);
-
- Rectangle2D bounds = gv.getLogicalBounds();
- bounds = new Rectangle2D.Double(x + bounds.getX(), y + bounds.getY(),
- bounds.getWidth(), bounds.getHeight());
- drawComposite(bounds, null);
- }
- }
- finally
- {
- unlock();
+ Rectangle2D bounds = gv.getLogicalBounds();
+ bounds = new Rectangle2D.Double(x + bounds.getX(), y + bounds.getY(),
+ bounds.getWidth(), bounds.getHeight());
+ drawComposite(bounds, null);
}
}
@@ -480,20 +451,6 @@ public class ComponentGraphics extends CairoGraphics2D
return super.drawImage(bimg, x, y, width, height, observer);
}
- public void setClip(Shape s)
- {
- lock();
- try
- {
- super.setClip(s);
- }
- finally
- {
- unlock();
- }
- }
-
-
private boolean drawComposite(Rectangle2D bounds, ImageObserver observer)
{
// Clip source to visible areas that need updating
@@ -521,12 +478,10 @@ public class ComponentGraphics extends CairoGraphics2D
Rectangle2D.intersect(deviceBounds, this.getClipInDevSpace(), deviceBounds);
// Get current image on the component
- unlock();
GtkImage img = grab(component);
Graphics gr = componentBuffer.createGraphics();
gr.drawImage(img, 0, 0, null);
gr.dispose();
- lock();
BufferedImage cBuffer = componentBuffer;
if (!deviceBounds.equals(cBuffer.getRaster().getBounds()))
@@ -587,5 +542,431 @@ public class ComponentGraphics extends CairoGraphics2D
{
return GtkVolatileImage.gdkColorModel;
}
-}
-
+
+ /* --- START OVERRIDDEN NATIVE METHODS ----
+ * All native methods in CairoGraphics2D should be overridden here and
+ * enclosed in locks, since the cairo surface is backed by an X surface
+ * in this graphics context and the X surface requires external locking.
+ *
+ * We lock everything "just in case", since it's difficult to know which
+ * calls are and aren't thread-safe. Overriding and locking the native
+ * methods allows superclass code in CairoGraphics2D to execute properly,
+ * without the need to override every single method.
+ *
+ * CAVEAT: if native code obtains a lock (using gdk_threads_enter(), not the
+ * lock() method provided here) and then calls back into Java and one of these
+ * methods ends up being called, we will deadlock. The lock is only reentrant
+ * when called via our lock() method.
+ */
+ @Override
+ protected long init(long pointer)
+ {
+ long ret;
+
+ try
+ {
+ lock();
+ ret = super.init(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+
+ return ret;
+ }
+
+ @Override
+ public void disposeNative(long pointer)
+ {
+ try
+ {
+ lock();
+ super.disposeNative(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void drawPixels(long pointer, int[] pixels, int w, int h,
+ int stride, double[] i2u, double alpha,
+ int interpolation)
+ {
+ try
+ {
+ lock();
+ super.drawPixels(pointer, pixels, w, h, stride, i2u, alpha,
+ interpolation);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void setGradient(long pointer, double x1, double y1,
+ double x2, double y2,
+ int r1, int g1, int b1, int a1,
+ int r2, int g2, int b2, int a2, boolean cyclic)
+ {
+ try
+ {
+ lock();
+ super.setGradient(pointer, x1, y1, x2, y2, r1, g1, b1, a1, r2, g2, b2, a2,
+ cyclic);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void setPaintPixels(long pointer, int[] pixels, int w, int h,
+ int stride, boolean repeat, int x, int y)
+ {
+ try
+ {
+ lock();
+ super.setPaintPixels(pointer, pixels, w, h, stride, repeat, x, y);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetMatrix(long pointer, double[] m)
+ {
+ try
+ {
+ lock();
+ super.cairoSetMatrix(pointer, m);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoScale(long pointer, double x, double y)
+ {
+ try
+ {
+ lock();
+ super.cairoScale(pointer, x, y);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetOperator(long pointer, int cairoOperator)
+ {
+ try
+ {
+ lock();
+ super.cairoSetOperator(pointer, cairoOperator);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetRGBAColor(long pointer, double red, double green,
+ double blue, double alpha)
+ {
+ try
+ {
+ lock();
+ super.cairoSetRGBAColor(pointer, red, green, blue, alpha);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetFillRule(long pointer, int cairoFillRule)
+ {
+ try
+ {
+ lock();
+ super.cairoSetFillRule(pointer, cairoFillRule);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetLine(long pointer, double width, int cap, int join,
+ double miterLimit)
+ {
+ try
+ {
+ lock();
+ super.cairoSetLine(pointer, width, cap, join, miterLimit);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetDash(long pointer, double[] dashes, int ndash,
+ double offset)
+ {
+ try
+ {
+ lock();
+ super.cairoSetDash(pointer, dashes, ndash, offset);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoDrawGlyphVector(long pointer, GdkFontPeer font,
+ float x, float y, int n,
+ int[] codes, float[] positions)
+ {
+ try
+ {
+ lock();
+ super.cairoDrawGlyphVector(pointer, font, x, y, n, codes, positions);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetFont(long pointer, GdkFontPeer font)
+ {
+ try
+ {
+ lock();
+ super.cairoSetFont(pointer, font);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoRectangle(long pointer, double x, double y,
+ double width, double height)
+ {
+ try
+ {
+ lock();
+ super.cairoRectangle(pointer, x, y, width, height);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoArc(long pointer, double x, double y,
+ double radius, double angle1, double angle2)
+ {
+ try
+ {
+ lock();
+ super.cairoArc(pointer, x, y, radius, angle1, angle2);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSave(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoSave(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoRestore(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoRestore(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoNewPath(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoNewPath(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoClosePath(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoClosePath(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoMoveTo(long pointer, double x, double y)
+ {
+ try
+ {
+ lock();
+ super.cairoMoveTo(pointer, x, y);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoLineTo(long pointer, double x, double y)
+ {
+ try
+ {
+ lock();
+ super.cairoLineTo(pointer, x, y);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoCurveTo(long pointer, double x1, double y1, double x2,
+ double y2, double x3, double y3)
+ {
+ try
+ {
+ lock();
+ super.cairoCurveTo(pointer, x1, y1, x2, y2, x3, y3);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoStroke(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoStroke(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoFill(long pointer, double alpha)
+ {
+ try
+ {
+ lock();
+ super.cairoFill(pointer, alpha);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoClip(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoClip(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoResetClip(long pointer)
+ {
+ try
+ {
+ lock();
+ super.cairoResetClip(pointer);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+
+ @Override
+ protected void cairoSetAntialias(long pointer, boolean aa)
+ {
+ try
+ {
+ lock();
+ super.cairoSetAntialias(pointer, aa);
+ }
+ finally
+ {
+ unlock();
+ }
+ }
+} \ No newline at end of file
diff --git a/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h b/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h
index 6d252340a..1bb829de3 100644
--- a/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h
+++ b/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h
@@ -24,7 +24,6 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine (
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash (JNIEnv *env, jobject, jlong, jdoubleArray, jint, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector (JNIEnv *env, jobject, jlong, jobject, jfloat, jfloat, jint, jintArray, jfloatArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont (JNIEnv *env, jobject, jlong, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave (JNIEnv *env, jobject, jlong);
@@ -32,19 +31,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore (
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo (JNIEnv *env, jobject, jlong, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo (JNIEnv *env, jobject, jlong, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo (JNIEnv *env, jobject, jlong, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo (JNIEnv *env, jobject, jlong, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill (JNIEnv *env, jobject, jlong, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip (JNIEnv *env, jobject, jlong);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias (JNIEnv *env, jobject, jlong, jboolean);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble);
#undef gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_NEAREST
#define gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_NEAREST 0L
#undef gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_BILINEAR
diff --git a/include/gnu_java_awt_peer_gtk_CairoSurface.h b/include/gnu_java_awt_peer_gtk_CairoSurface.h
index 1da9c369b..ba7a1f573 100644
--- a/include/gnu_java_awt_peer_gtk_CairoSurface.h
+++ b/include/gnu_java_awt_peer_gtk_CairoSurface.h
@@ -13,11 +13,11 @@ extern "C"
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_create (JNIEnv *env, jobject, jint, jint, jint, jintArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_destroy (JNIEnv *env, jobject, jlong, jintArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeDrawSurface (JNIEnv *env, jobject, jlong, jlong, jdoubleArray, jdouble, jint);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_syncNativeToJava (JNIEnv *env, jobject, jlong, jintArray);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_syncJavaToNative (JNIEnv *env, jobject, jlong, jintArray);
JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_getFlippedBuffer (JNIEnv *env, jobject, jlong);
JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeNewCairoContext (JNIEnv *env, jobject, jlong);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_copyAreaNative2 (JNIEnv *env, jobject, jlong, jint, jint, jint, jint, jint, jint, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_syncJavaToNative (JNIEnv *env, jobject, jlong, jintArray);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_syncNativeToJava (JNIEnv *env, jobject, jlong, jintArray);
#ifdef __cplusplus
}
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
index f7c2edc7a..8ab7a79aa 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
@@ -609,40 +609,6 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo
-(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
- jlong pointer, jdouble dx, jdouble dy)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_rel_move_to (gr->cr, dx, dy);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo
-(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
- jlong pointer, jdouble dx, jdouble dy)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_rel_line_to (gr->cr, dx, dy);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo
-(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
- jlong pointer, jdouble dx1, jdouble dy1,
- jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
-}
-
-JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle
(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
@@ -726,57 +692,6 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip
cairo_reset_clip( gr->cr );
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip
-(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
- jlong pointer)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_clip_preserve( gr->cr );
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine
-(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
- jlong pointer, jdouble x1, jdouble y1, jdouble x2, jdouble y2)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_new_path(gr->cr);
- cairo_move_to(gr->cr, x1, y1);
- cairo_line_to(gr->cr, x2, y2);
- cairo_stroke(gr->cr);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect
-(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
- jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_new_path(gr->cr);
- cairo_rectangle(gr->cr, x, y, w, h);
- cairo_stroke(gr->cr);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect
-(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
- jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h)
-{
- struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
- g_assert (gr != NULL);
-
- cairo_new_path(gr->cr);
- cairo_rectangle(gr->cr, x, y, w, h);
- cairo_fill(gr->cr);
-}
-
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias
(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),