< prev index next >
src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java
Print this page
*** 98,107 ****
--- 98,108 ----
import static java.awt.geom.AffineTransform.TYPE_FLIP;
import static java.awt.geom.AffineTransform.TYPE_MASK_SCALE;
import static java.awt.geom.AffineTransform.TYPE_TRANSLATION;
import java.awt.image.VolatileImage;
import sun.awt.image.MultiResolutionToolkitImage;
+ import sun.awt.image.MultiResolutionToolkitImage.ResolutionVariantItem;
import sun.awt.image.ToolkitImage;
/**
* This is a the master Graphics2D superclass for all of the Sun
* Graphics implementations. This class relies on subclasses to
*** 3128,3149 ****
int width = img.getWidth(observer);
int height = img.getHeight(observer);
MultiResolutionImage mrImage = (MultiResolutionImage) img;
! Image resolutionVariant = getResolutionVariant(mrImage, width, height,
dx1, dy1, dx2, dy2,
sx1, sy1, sx2, sy2,
xform);
! if (resolutionVariant != img && resolutionVariant != null) {
// recalculate source region for the resolution variant
ImageObserver rvObserver = MultiResolutionToolkitImage.
getResolutionVariantObserver(img, observer,
! width, height, -1, -1);
!
int rvWidth = resolutionVariant.getWidth(rvObserver);
int rvHeight = resolutionVariant.getHeight(rvObserver);
if (0 < width && 0 < height && 0 < rvWidth && 0 < rvHeight) {
--- 3129,3154 ----
int width = img.getWidth(observer);
int height = img.getHeight(observer);
MultiResolutionImage mrImage = (MultiResolutionImage) img;
! ResolutionVariantItem rvItem = getResolutionVariant(mrImage,
! width, height,
dx1, dy1, dx2, dy2,
sx1, sy1, sx2, sy2,
xform);
!
! if (rvItem != null) {
// recalculate source region for the resolution variant
+ Image resolutionVariant = rvItem.getImage();
ImageObserver rvObserver = MultiResolutionToolkitImage.
getResolutionVariantObserver(img, observer,
! rvItem.getScaleX(),
! rvItem.getScaleY(),
! false);
int rvWidth = resolutionVariant.getWidth(rvObserver);
int rvHeight = resolutionVariant.getHeight(rvObserver);
if (0 < width && 0 < height && 0 < rvWidth && 0 < rvHeight) {
*** 3218,3228 ****
} finally {
surfaceData.markDirty();
}
}
! private Image getResolutionVariant(MultiResolutionImage img,
int srcWidth, int srcHeight, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2, AffineTransform xform) {
if (srcWidth <= 0 || srcHeight <= 0) {
return null;
--- 3223,3233 ----
} finally {
surfaceData.markDirty();
}
}
! private ResolutionVariantItem getResolutionVariant(MultiResolutionImage img,
int srcWidth, int srcHeight, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2, AffineTransform xform) {
if (srcWidth <= 0 || srcHeight <= 0) {
return null;
*** 3281,3301 ****
}
destImageWidth = Math.abs(srcWidth * destRegionWidth / sw);
destImageHeight = Math.abs(srcHeight * destRegionHeight / sh);
}
! Image resolutionVariant
! = img.getResolutionVariant(destImageWidth, destImageHeight);
if (resolutionVariant instanceof ToolkitImage
&& ((ToolkitImage) resolutionVariant).hasError()) {
return null;
}
! return resolutionVariant;
}
/**
* Draws an image scaled to x,y,w,h in nonblocking mode with a
* callback object.
*/
public boolean drawImage(Image img, int x, int y, int width, int height,
--- 3286,3327 ----
}
destImageWidth = Math.abs(srcWidth * destRegionWidth / sw);
destImageHeight = Math.abs(srcHeight * destRegionHeight / sh);
}
! ResolutionVariantItem rvItem = getResolutionVariantItem(
! img, srcWidth, srcHeight, destImageWidth, destImageHeight);
!
! Image resolutionVariant = rvItem.getImage();
! if (resolutionVariant == img) {
! return null;
! }
if (resolutionVariant instanceof ToolkitImage
&& ((ToolkitImage) resolutionVariant).hasError()) {
return null;
}
! return rvItem;
}
+ private static ResolutionVariantItem getResolutionVariantItem(
+ MultiResolutionImage img,
+ double srcWidth, double srcHeight,
+ double dstWidth, double dstHeight) {
+
+ if (img instanceof MultiResolutionToolkitImage) {
+ return ((MultiResolutionToolkitImage) img)
+ .getResolutionVariantItem(dstWidth, dstHeight);
+ }
+
+ Image resolutionVariant
+ = img.getResolutionVariant(dstWidth, dstHeight);
+ double sx = resolutionVariant.getWidth(null) / srcWidth;
+ double sy = resolutionVariant.getWidth(null) / srcHeight;
+ return new ResolutionVariantItem(resolutionVariant, sx, sy);
+ }
/**
* Draws an image scaled to x,y,w,h in nonblocking mode with a
* callback object.
*/
public boolean drawImage(Image img, int x, int y, int width, int height,
< prev index next >