src/share/classes/sun/awt/image/OffScreenImage.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 29,45 **** import java.awt.Color; import java.awt.SystemColor; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsEnvironment; import java.awt.image.BufferedImage; import java.awt.image.ImageProducer; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import sun.java2d.SunGraphics2D; ! import sun.java2d.SurfaceData; /** * This is a special variant of BufferedImage that keeps a reference to * a Component. The Component's foreground and background colors and * default font are used as the defaults for this image. --- 29,49 ---- import java.awt.Color; import java.awt.SystemColor; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; + import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; + import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.ImageProducer; import java.awt.image.ColorModel; + import java.awt.image.DataBuffer; + import java.awt.image.ImageObserver; import java.awt.image.WritableRaster; import sun.java2d.SunGraphics2D; ! import sun.java2d.loops.SurfaceType; /** * This is a special variant of BufferedImage that keeps a reference to * a Component. The Component's foreground and background colors and * default font are used as the defaults for this image.
*** 48,57 **** --- 52,75 ---- protected Component c; private OffScreenImageSource osis; private Font defaultFont; + // The layout size of the image. + private int width; + private int height; + + // The scale factor which determines the physical size of the raster. + private int scale = 1; + + // Affects the value returned by the size methods. + // When {@code true}, the returned size value matches + // the layout size of the image, otherwise the returned + // size value matches the physical size of the raster, + // which is determined by the scale factor. + private boolean returnLayoutSize; + /** * Constructs an OffScreenImage given a color model and tile, * for offscreen rendering to be used with a given component. * The component is used to obtain the foreground color, background * color and font.
*** 62,71 **** --- 80,197 ---- super(cm, raster, isRasterPremultiplied, null); this.c = c; initSurface(raster.getWidth(), raster.getHeight()); } + private OffScreenImage(Component c, ColorModel cm, WritableRaster raster, + boolean isRasterPremultiplied, + int width, int height, + int scale) + { + this(c, cm, raster, isRasterPremultiplied); + this.width = width; + this.height = height; + this.scale = scale; + } + + /** + * Constructs an OffScreenImage with the {@code scale} factor. + * The scale determines the physical size of the raster, compared + * to the layout {@code width/height} size of the image. + */ + public OffScreenImage(Component c, int width, int height, + int imageType, + int scale) + { + super(width * scale, height * scale, imageType); + this.c = c; + this.width = width; + this.height = height; + this.scale = scale; + } + + /** + * Constructs an OffScreenImage with the {@code scale} factor. + * The scale determines the physical size of the raster, compared + * to the layout {@code width/height} size of the image. + */ + public static OffScreenImage create(Component c, GraphicsConfiguration gc, + int width, int height, + int transparency, + int scale) + { + ColorModel cm = gc.getColorModel(transparency); + WritableRaster wr = cm.createCompatibleWritableRaster(width * scale, height * scale); + return new OffScreenImage(c, cm, wr, cm.isAlphaPremultiplied(), + width, height, scale); + } + + /** + * Sets whether the {@code getWidth/Height} methods should + * return the layout or physical size of the image. + * @param value + */ + public void setReturnLayoutSize(boolean value) { + returnLayoutSize = value; + } + + /** + * Gets whether the {@code getWidth/Height} methods should + * return the layout or physical size of the image. + * @param value + */ + public boolean isReturnLayoutSize() { + return returnLayoutSize; + } + + @Override + public int getWidth() { + return returnLayoutSize ? width : super.getWidth(); + } + + @Override + public int getWidth(ImageObserver o) { + return getWidth(); + } + + @Override + public int getHeight() { + return returnLayoutSize ? height : super.getHeight(); + } + + @Override + public int getHeight(ImageObserver o) { + return getHeight(); + } + + /** + * Gets the layout width of the image. + * + * @return the layout width of the image + */ + public int getLayoutWidth() { + return width; + } + + /** + * Gets the layout height of the image. + * + * @return the layout height of the image + */ + public int getLayoutHeight() { + return height; + } + + /** + * Gets the scale factor used to scale the image on HiDPI devices + * + * @return the HiDPI scale factor + */ + public int getHiDPIScale() { + return scale; + } + public Graphics getGraphics() { return createGraphics(); } public Graphics2D createGraphics() {
*** 110,115 **** --- 236,299 ---- if (osis == null) { osis = new OffScreenImageSource(this); } return osis; } + + /** + * Creates a scaled OffScreenImage. + */ + public class GraphicsConfig extends BufferedImageGraphicsConfig { + public GraphicsConfig() { + super(OffScreenImage.this, null); + } + + public BufferedImage createCompatibleHiDPIImage(int width, int height, int transparency) { + return OffScreenImage.create(null, this, + width, height, + transparency, + OffScreenImage.this.getHiDPIScale()); + } + } + + /** + * Returns correct physical bounds and the scale factor. + */ + public class SurfaceData extends BufImgSurfaceData { + public SurfaceData(DataBuffer db, SurfaceType sType) { + super(db, OffScreenImage.this, sType); + } + + @Override + public Rectangle getBounds() { + return new Rectangle(OffScreenImage.this.getRaster().getWidth(), + OffScreenImage.this.getRaster().getHeight()); + } + + @Override + public int getDefaultScale() { + return OffScreenImage.this.getHiDPIScale(); + } + } + + /** + * Backed by a scaled OffScreenImage. + */ + public static class VolatileImage extends SunVolatileImage { + public VolatileImage(OffScreenImage.GraphicsConfig graphicsConfig, + int width, int height, + int transparency) + { + super(graphicsConfig, width, height, transparency, null); + } + + @Override + public BufferedImage getBackupImage() { + OffScreenImage img = (OffScreenImage) + ((OffScreenImage.GraphicsConfig)getGraphicsConfig()). + createCompatibleHiDPIImage(getWidth(), getHeight(), transparency); + img.setReturnLayoutSize(true); + return img; + } + } + }