summaryrefslogtreecommitdiff
path: root/gnu/java
diff options
context:
space:
mode:
authorSven de Marothy <sven@physto.se>2006-05-31 03:32:25 +0000
committerSven de Marothy <sven@physto.se>2006-05-31 03:32:25 +0000
commit3775dc68a99b3c4d3d0529d29334cbcc5aabfaf3 (patch)
treecb8b7235a182441e3376c1fccde1a34e235afc5d /gnu/java
parent6fdcb8e60c0a8ae36e3e511c5c0ae79c15844cb5 (diff)
downloadclasspath-3775dc68a99b3c4d3d0529d29334cbcc5aabfaf3.tar.gz
2006-05-30 Sven de Marothy <sven@physto.se>
* gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawImage): Clip scaled image to dest rectangle.
Diffstat (limited to 'gnu/java')
-rw-r--r--gnu/java/awt/peer/gtk/CairoGraphics2D.java39
1 files changed, 19 insertions, 20 deletions
diff --git a/gnu/java/awt/peer/gtk/CairoGraphics2D.java b/gnu/java/awt/peer/gtk/CairoGraphics2D.java
index 9be40ed3c..19d68f729 100644
--- a/gnu/java/awt/peer/gtk/CairoGraphics2D.java
+++ b/gnu/java/awt/peer/gtk/CairoGraphics2D.java
@@ -1092,8 +1092,6 @@ public abstract class CairoGraphics2D extends Graphics2D
if (img == null)
return false;
- Image subImage;
-
int sourceWidth = sx2 - sx1;
int sourceHeight = sy2 - sy1;
@@ -1107,27 +1105,28 @@ public abstract class CairoGraphics2D extends Graphics2D
double scaleX = destWidth / (double) sourceWidth;
double scaleY = destHeight / (double) sourceHeight;
- // Get the subimage of the source enclosed in the
- // rectangle specified by sx1, sy1, sx2, sy2
-
- if (img instanceof BufferedImage)
- {
- BufferedImage b = (BufferedImage) img;
- subImage = b.getSubimage(sx1, sy1, sx2, sy2);
- }
+ // FIXME: Avoid using an AT if possible here - it's at least twice as slow.
+
+ Shape oldClip = getClip();
+ int cx, cy, cw, ch;
+ if( dx1 < dx2 )
+ { cx = dx1; cw = dx2 - dx1; }
else
- {
- CropImageFilter filter = new CropImageFilter(sx1, sx2, sx2, sy2);
- FilteredImageSource src = new FilteredImageSource(img.getSource(),
- filter);
+ { cx = dx2; cw = dx1 - dx2; }
+ if( dy1 < dy2 )
+ { cy = dy1; ch = dy2 - dy1; }
+ else
+ { cy = dy2; ch = dy1 - dy2; }
+
+ setClip( cx, cy, cw, ch );
- subImage = Toolkit.getDefaultToolkit().createImage(src);
- }
+ AffineTransform tx = new AffineTransform();
+ tx.translate( dx1 - sx1*scaleX, dy1 - sy1*scaleY );
+ tx.scale( scaleX, scaleY );
- // FIXME: Avoid using an AT if possible here - it's at least twice as slow.
- return drawImage(subImage,
- new AffineTransform(scaleX, 0, 0, scaleY, dx1, dy1),
- bgcolor, observer);
+ boolean retval = drawImage(img, tx, bgcolor, observer);
+ setClip( oldClip );
+ return retval;
}
public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,