--- old/src/java.desktop/share/classes/sun/awt/image/BufImgSurfaceData.java 2015-11-05 00:37:56.964538900 -0800 +++ new/src/java.desktop/share/classes/sun/awt/image/BufImgSurfaceData.java 2015-11-05 00:37:56.636388700 -0800 @@ -50,6 +50,8 @@ BufferedImage bufImg; private BufferedImageGraphicsConfig graphicsConfig; RenderLoops solidloops; + private final double scaleX; + private final double scaleY; private static native void initIDs(Class ICM, Class ICMColorData); @@ -73,6 +75,12 @@ } 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"); } @@ -82,31 +90,36 @@ // 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: { @@ -128,14 +141,16 @@ 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: { @@ -154,7 +169,7 @@ default: throw new InternalError("Unrecognized pixel size"); } - sData = createDataBP(bufImg, sType); + sData = createDataBP(bufImg, sType, scaleX, scaleY); } break; case BufferedImage.TYPE_CUSTOM: @@ -191,7 +206,7 @@ sType = SurfaceType.AnyDcm; } } - sData = createDataIC(bufImg, sType); + sData = createDataIC(bufImg, sType, scaleX, scaleY); break; } else if (raster instanceof ShortComponentRaster && raster.getNumDataElements() == 1 && @@ -233,11 +248,12 @@ 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; } @@ -250,11 +266,15 @@ } 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(), @@ -267,11 +287,14 @@ 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(), @@ -284,11 +307,14 @@ 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 @@ -304,11 +330,14 @@ } 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 @@ -350,15 +379,22 @@ 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() { @@ -395,7 +431,8 @@ public synchronized GraphicsConfiguration getDeviceConfiguration() { if (graphicsConfig == null) { - graphicsConfig = BufferedImageGraphicsConfig.getConfig(bufImg); + graphicsConfig = BufferedImageGraphicsConfig + .getConfig(bufImg, scaleX, scaleY); } return graphicsConfig; } @@ -418,6 +455,16 @@ return bufImg; } + @Override + public double getDefaultScaleX() { + return scaleX; + } + + @Override + public double getDefaultScaleY() { + return scaleY; + } + public static final class ICMColorData { private long pData = 0L;