< prev index next >

src/java.desktop/share/classes/sun/swing/CachedPainter.java

Print this page

        

*** 23,32 **** --- 23,33 ---- * questions. */ package sun.swing; import java.awt.*; + import java.awt.geom.AffineTransform; import java.awt.image.*; import java.util.*; /** * A base class used for icons or images that are expensive to paint.
*** 97,109 **** synchronized (CachedPainter.class) { paint0(c, g, x, y, w, h, args); } } ! private void paint0(Component c, Graphics g, int x, ! int y, int w, int h, Object... args) { ! Object key = getClass(); GraphicsConfiguration config = getGraphicsConfiguration(c); ImageCache cache = getCache(key); Image image = cache.getImage(key, config, w, h, args); int attempts = 0; do { --- 98,108 ---- synchronized (CachedPainter.class) { paint0(c, g, x, y, w, h, args); } } ! private Image getImage(Object key, Component c, int w, int h, Object... args) { GraphicsConfiguration config = getGraphicsConfiguration(c); ImageCache cache = getCache(key); Image image = cache.getImage(key, config, w, h, args); int attempts = 0; do {
*** 131,148 **** Graphics g2 = image.getGraphics(); paintToImage(c, image, g2, w, h, args); g2.dispose(); } - // Render to the passed in Graphics - paintImage(c, g, x, y, w, h, image, args); - // If we did this 3 times and the contents are still lost // assume we're painting to a VolatileImage that is bogus and // give up. Presumably we'll be called again to paint. } while ((image instanceof VolatileImage) && ((VolatileImage)image).contentsLost() && ++attempts < 3); } /** * Paints the representation to cache to the supplied Graphics. * --- 130,173 ---- Graphics g2 = image.getGraphics(); paintToImage(c, image, g2, w, h, args); g2.dispose(); } // If we did this 3 times and the contents are still lost // assume we're painting to a VolatileImage that is bogus and // give up. Presumably we'll be called again to paint. } while ((image instanceof VolatileImage) && ((VolatileImage)image).contentsLost() && ++attempts < 3); + + return image; + } + + private void paint0(Component c, Graphics g, int x, + int y, int w, int h, Object... args) { + Object key = getClass(); + GraphicsConfiguration config = getGraphicsConfiguration(c); + ImageCache cache = getCache(key); + Image image = cache.getImage(key, config, w, h, args); + + if (image == null) { + double sx = 1; + double sy = 1; + if (g instanceof Graphics2D) { + AffineTransform tx = ((Graphics2D) g).getTransform(); + sx = tx.getScaleX(); + sy = tx.getScaleY(); + } + image = new PainterMultiResolutionCachedImage(sx, sy, w, h); + cache.setImage(key, config, w, h, args, image); + } + + if (image instanceof PainterMultiResolutionCachedImage) { + ((PainterMultiResolutionCachedImage) image).setParams(c, args); + } + + // Render to the passed in Graphics + paintImage(c, g, x, y, w, h, image, args); } /** * Paints the representation to cache to the supplied Graphics. *
*** 208,213 **** --- 233,296 ---- if (c == null) { return null; } return c.getGraphicsConfiguration(); } + + class PainterMultiResolutionCachedImage extends AbstractMultiResolutionImage { + + private final double scaleX; + private final double scaleY; + private final int baseWidth; + private final int baseHeight; + private Component c; + private Object[] args; + + public PainterMultiResolutionCachedImage(double scaleX, double scaleY, + int baseWidth, int baseHeight) { + this.scaleX = scaleX; + this.scaleY = scaleY; + this.baseWidth = baseWidth; + this.baseHeight = baseHeight; + } + + public void setParams(Component c, Object[] args) { + this.c = c; + this.args = args; + } + + @Override + public int getWidth(ImageObserver observer) { + return baseWidth; + } + + @Override + public int getHeight(ImageObserver observer) { + return baseHeight; + } + + @Override + public Image getResolutionVariant(double destWidth, double destHeight) { + int w = (int) Math.ceil(destWidth); + int h = (int) Math.ceil(destHeight); + return getImage(this, c, w, h, args); + } + + @Override + protected Image getBaseImage() { + return getResolutionVariant(baseWidth, baseHeight); + } + + @Override + public java.util.List<Image> getResolutionVariants() { + + if (scaleX == 1 && scaleY == 1) { + return Arrays.asList(getResolutionVariant(baseWidth, baseHeight)); + } + + return Arrays.asList( + getResolutionVariant(baseWidth, baseHeight), + getResolutionVariant(scaleX * baseWidth, scaleY * baseHeight) + ); + } + } } \ No newline at end of file
< prev index next >