< prev index next >
src/java.desktop/share/classes/sun/awt/image/BufImgSurfaceData.java
Print this page
@@ -48,10 +48,12 @@
public class BufImgSurfaceData extends SurfaceData {
BufferedImage bufImg;
private BufferedImageGraphicsConfig graphicsConfig;
RenderLoops solidloops;
+ private final double scaleX;
+ private final double scaleY;
private static native void initIDs(Class<?> ICM, Class<?> ICMColorData);
private static final int DCM_RGBX_RED_MASK = 0xff000000;
private static final int DCM_RGBX_GREEN_MASK = 0x00ff0000;
@@ -71,44 +73,55 @@
static {
initIDs(IndexColorModel.class, ICMColorData.class);
}
public static SurfaceData createData(BufferedImage bufImg) {
+ return createData(bufImg, 1, 1);
+ }
+
+ public static SurfaceData createData(BufferedImage bufImg,
+ double scaleX, double scaleY)
+ {
if (bufImg == null) {
throw new NullPointerException("BufferedImage cannot be null");
}
SurfaceData sData;
ColorModel cm = bufImg.getColorModel();
int type = bufImg.getType();
// REMIND: Check the image type and pick an appropriate subclass
switch (type) {
case BufferedImage.TYPE_INT_BGR:
- sData = createDataIC(bufImg, SurfaceType.IntBgr);
+ sData = createDataIC(bufImg, SurfaceType.IntBgr, scaleX, scaleY);
break;
case BufferedImage.TYPE_INT_RGB:
- sData = createDataIC(bufImg, SurfaceType.IntRgb);
+ sData = createDataIC(bufImg, SurfaceType.IntRgb, scaleX, scaleY);
break;
case BufferedImage.TYPE_INT_ARGB:
- sData = createDataIC(bufImg, SurfaceType.IntArgb);
+ sData = createDataIC(bufImg, SurfaceType.IntArgb, scaleX, scaleY);
break;
case BufferedImage.TYPE_INT_ARGB_PRE:
- sData = createDataIC(bufImg, SurfaceType.IntArgbPre);
+ sData = createDataIC(bufImg, SurfaceType.IntArgbPre, scaleX, scaleY);
break;
case BufferedImage.TYPE_3BYTE_BGR:
- sData = createDataBC(bufImg, SurfaceType.ThreeByteBgr, 2);
+ sData = createDataBC(bufImg, SurfaceType.ThreeByteBgr, 2,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_4BYTE_ABGR:
- sData = createDataBC(bufImg, SurfaceType.FourByteAbgr, 3);
+ sData = createDataBC(bufImg, SurfaceType.FourByteAbgr, 3,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_4BYTE_ABGR_PRE:
- sData = createDataBC(bufImg, SurfaceType.FourByteAbgrPre, 3);
+ sData = createDataBC(bufImg, SurfaceType.FourByteAbgrPre, 3,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_USHORT_565_RGB:
- sData = createDataSC(bufImg, SurfaceType.Ushort565Rgb, null);
+ sData = createDataSC(bufImg, SurfaceType.Ushort565Rgb, null,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_USHORT_555_RGB:
- sData = createDataSC(bufImg, SurfaceType.Ushort555Rgb, null);
+ sData = createDataSC(bufImg, SurfaceType.Ushort555Rgb, null,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_BYTE_INDEXED:
{
SurfaceType sType;
switch (cm.getTransparency()) {
@@ -126,18 +139,20 @@
sType = SurfaceType.ByteIndexed;
break;
default:
throw new InternalError("Unrecognized transparency");
}
- sData = createDataBC(bufImg, sType, 0);
+ sData = createDataBC(bufImg, sType, 0, scaleX, scaleY);
}
break;
case BufferedImage.TYPE_BYTE_GRAY:
- sData = createDataBC(bufImg, SurfaceType.ByteGray, 0);
+ sData = createDataBC(bufImg, SurfaceType.ByteGray, 0,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_USHORT_GRAY:
- sData = createDataSC(bufImg, SurfaceType.UshortGray, null);
+ sData = createDataSC(bufImg, SurfaceType.UshortGray, null,
+ scaleX, scaleY);
break;
case BufferedImage.TYPE_BYTE_BINARY:
{
SurfaceType sType;
SampleModel sm = bufImg.getRaster().getSampleModel();
@@ -152,11 +167,11 @@
sType = SurfaceType.ByteBinary4Bit;
break;
default:
throw new InternalError("Unrecognized pixel size");
}
- sData = createDataBP(bufImg, sType);
+ sData = createDataBP(bufImg, sType, scaleX, scaleY);
}
break;
case BufferedImage.TYPE_CUSTOM:
default:
{
@@ -189,11 +204,11 @@
sType = SurfaceType.IntArgbBm;
} else {
sType = SurfaceType.AnyDcm;
}
}
- sData = createDataIC(bufImg, sType);
+ sData = createDataIC(bufImg, sType, scaleX, scaleY);
break;
} else if (raster instanceof ShortComponentRaster &&
raster.getNumDataElements() == 1 &&
((ShortComponentRaster)raster).getPixelStride() == 1)
{
@@ -231,15 +246,16 @@
}
} else {
icm = null;
}
}
- sData = createDataSC(bufImg, sType, icm);
+ sData = createDataSC(bufImg, sType, icm, scaleX, scaleY);
break;
}
- sData = new BufImgSurfaceData(raster.getDataBuffer(),
- bufImg, SurfaceType.Custom);
+ sData = new BufImgSurfaceData(raster.getDataBuffer(), bufImg,
+ SurfaceType.Custom,
+ scaleX, scaleY);
}
break;
}
((BufImgSurfaceData) sData).initSolidLoops();
return sData;
@@ -248,15 +264,19 @@
public static SurfaceData createData(Raster ras, ColorModel cm) {
throw new InternalError("SurfaceData not implemented for Raster/CM");
}
public static SurfaceData createDataIC(BufferedImage bImg,
- SurfaceType sType) {
+ SurfaceType sType,
+ double scaleX,
+ double scaleY)
+ {
IntegerComponentRaster icRaster =
(IntegerComponentRaster)bImg.getRaster();
BufImgSurfaceData bisd =
- new BufImgSurfaceData(icRaster.getDataBuffer(), bImg, sType);
+ new BufImgSurfaceData(icRaster.getDataBuffer(), bImg, sType,
+ scaleX, scaleY);
bisd.initRaster(icRaster.getDataStorage(),
icRaster.getDataOffset(0) * 4, 0,
icRaster.getWidth(),
icRaster.getHeight(),
icRaster.getPixelStride() * 4,
@@ -265,15 +285,18 @@
return bisd;
}
public static SurfaceData createDataSC(BufferedImage bImg,
SurfaceType sType,
- IndexColorModel icm) {
+ IndexColorModel icm,
+ double scaleX, double scaleY)
+ {
ShortComponentRaster scRaster =
(ShortComponentRaster)bImg.getRaster();
BufImgSurfaceData bisd =
- new BufImgSurfaceData(scRaster.getDataBuffer(), bImg, sType);
+ new BufImgSurfaceData(scRaster.getDataBuffer(), bImg, sType,
+ scaleX, scaleY);
bisd.initRaster(scRaster.getDataStorage(),
scRaster.getDataOffset(0) * 2, 0,
scRaster.getWidth(),
scRaster.getHeight(),
scRaster.getPixelStride() * 2,
@@ -282,15 +305,18 @@
return bisd;
}
public static SurfaceData createDataBC(BufferedImage bImg,
SurfaceType sType,
- int primaryBank) {
+ int primaryBank,
+ double scaleX, double scaleY)
+ {
ByteComponentRaster bcRaster =
(ByteComponentRaster)bImg.getRaster();
BufImgSurfaceData bisd =
- new BufImgSurfaceData(bcRaster.getDataBuffer(), bImg, sType);
+ new BufImgSurfaceData(bcRaster.getDataBuffer(), bImg, sType,
+ scaleX, scaleY);
ColorModel cm = bImg.getColorModel();
IndexColorModel icm = ((cm instanceof IndexColorModel)
? (IndexColorModel) cm
: null);
bisd.initRaster(bcRaster.getDataStorage(),
@@ -302,15 +328,18 @@
icm);
return bisd;
}
public static SurfaceData createDataBP(BufferedImage bImg,
- SurfaceType sType) {
+ SurfaceType sType,
+ double scaleX, double scaleY)
+ {
BytePackedRaster bpRaster =
(BytePackedRaster)bImg.getRaster();
BufImgSurfaceData bisd =
- new BufImgSurfaceData(bpRaster.getDataBuffer(), bImg, sType);
+ new BufImgSurfaceData(bpRaster.getDataBuffer(), bImg, sType,
+ scaleX, scaleY);
ColorModel cm = bImg.getColorModel();
IndexColorModel icm = ((cm instanceof IndexColorModel)
? (IndexColorModel) cm
: null);
bisd.initRaster(bpRaster.getDataStorage(),
@@ -348,19 +377,26 @@
int pixStr,
int scanStr,
IndexColorModel icm);
public BufImgSurfaceData(DataBuffer db,
- BufferedImage bufImg, SurfaceType sType)
+ BufferedImage bufImg,
+ SurfaceType sType,
+ double scaleX,
+ double scaleY)
{
super(SunWritableRaster.stealTrackable(db),
sType, bufImg.getColorModel());
this.bufImg = bufImg;
+ this.scaleX = scaleX;
+ this.scaleY = scaleY;
}
protected BufImgSurfaceData(SurfaceType surfaceType, ColorModel cm) {
super(surfaceType, cm);
+ this.scaleX = 1;
+ this.scaleY = 1;
}
public void initSolidLoops() {
this.solidloops = getSolidLoops(getSurfaceType());
}
@@ -393,11 +429,12 @@
return restoreContents(bufImg);
}
public synchronized GraphicsConfiguration getDeviceConfiguration() {
if (graphicsConfig == null) {
- graphicsConfig = BufferedImageGraphicsConfig.getConfig(bufImg);
+ graphicsConfig = BufferedImageGraphicsConfig
+ .getConfig(bufImg, scaleX, scaleY);
}
return graphicsConfig;
}
public java.awt.Rectangle getBounds() {
@@ -416,10 +453,20 @@
*/
public Object getDestination() {
return bufImg;
}
+ @Override
+ public double getDefaultScaleX() {
+ return scaleX;
+ }
+
+ @Override
+ public double getDefaultScaleY() {
+ return scaleY;
+ }
+
public static final class ICMColorData {
private long pData = 0L;
private ICMColorData(long pData) {
this.pData = pData;
< prev index next >