[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine:[8551] VASSAL-src/trunk/src/VA
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2013-02-07 18:04:15
|
Revision: 8551 http://vassalengine.svn.sourceforge.net/vassalengine/?rev=8551&view=rev Author: uckelman Date: 2013-02-07 18:04:03 +0000 (Thu, 07 Feb 2013) Log Message: ----------- Fxied Bug 9825: Macs with Retina displays unable to paint map tiles at non-power-of-two zoom levels This consists of a workaround in which we detect whether we are running on a Mac with a Retina display, and if so, avoid using BufferedImages of TYPE_INT_ARGB_PRE. Modified Paths: -------------- VASSAL-src/trunk/src/VASSAL/tools/image/ImageUtils.java Modified: VASSAL-src/trunk/src/VASSAL/tools/image/ImageUtils.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/image/ImageUtils.java 2013-02-06 21:17:58 UTC (rev 8550) +++ VASSAL-src/trunk/src/VASSAL/tools/image/ImageUtils.java 2013-02-07 18:04:03 UTC (rev 8551) @@ -21,12 +21,17 @@ import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.Toolkit; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; import java.awt.image.PixelGrabber; +import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -35,8 +40,6 @@ import javax.swing.ImageIcon; -import org.jdesktop.swingx.graphics.GraphicsUtilities; - import VASSAL.Info; import VASSAL.tools.ErrorDialog; import VASSAL.tools.io.TemporaryFileFactory; @@ -48,8 +51,6 @@ // negative, because historically we've done it this way private static final double DEGTORAD = -Math.PI/180.0; - public static final BufferedImage NULL_IMAGE = createCompatibleImage(1,1); - private static final GeneralFilter.Filter upscale = new GeneralFilter.MitchellFilter(); private static final GeneralFilter.Filter downscale = @@ -327,14 +328,69 @@ return dst; } + private static boolean isMacRetina() { + final Object o = Toolkit.getDefaultToolkit().getDesktopProperty( + "apple.awt.contentScaleFactor" + ); + + return (o instanceof Number) && ((Number) o).doubleValue() == 2.0; + } + + private static boolean isHeadless() { + return GraphicsEnvironment.isHeadless(); + } + + private static GraphicsConfiguration getGraphicsConfiguration() { + return GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + } + + protected static final BufferedImage compatOpaqueImage; + protected static final BufferedImage compatTransImage; + protected static final int compatOpaqueImageType; protected static final int compatTranslImageType; static { - compatOpaqueImageType = createCompatibleImage(1,1).getType(); - compatTranslImageType = createCompatibleTranslucentImage(1,1).getType(); + BufferedImage oimg; + BufferedImage timg; + + if (isHeadless()) { + oimg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + timg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + } + else { + final GraphicsConfiguration gc = getGraphicsConfiguration(); + + oimg = gc.createCompatibleImage(1,1, BufferedImage.OPAQUE); + timg = gc.createCompatibleImage(1,1, BufferedImage.TRANSLUCENT); + + // Bug workaround: MacOX X machines with Retina displays are incapable + // of painting TYPE_INT_ARGB_PRE images, despite that these systems + // return that type as the "compatible" image type. + if (isMacRetina()) { + if (oimg.getType() == BufferedImage.TYPE_INT_ARGB_PRE) { + oimg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + } + + if (timg.getType() == BufferedImage.TYPE_INT_ARGB_PRE) { + timg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + } + } + } + + compatOpaqueImage = oimg; + compatTransImage = timg; + + compatOpaqueImageType = compatOpaqueImage.getType(); + compatTranslImageType = compatTransImage.getType(); + + System.err.println("compatOpaque == " + compatOpaqueImageType); + System.err.println("compatTrans == " + compatTranslImageType); } + public static final BufferedImage NULL_IMAGE = createCompatibleImage(1,1); + public static int getCompatibleImageType() { return compatOpaqueImageType; } @@ -352,22 +408,43 @@ } public static BufferedImage createCompatibleImage(int w, int h) { - return GraphicsUtilities.createCompatibleImage(w, h); + final ColorModel cm = compatOpaqueImage.getColorModel(); + final WritableRaster wr = cm.createCompatibleWritableRaster(w, h); + return new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null); } public static BufferedImage createCompatibleImage(int w, int h, boolean transparent) { return transparent ? - GraphicsUtilities.createCompatibleTranslucentImage(w, h) : - GraphicsUtilities.createCompatibleImage(w, h); + createCompatibleTranslucentImage(w, h) : + createCompatibleImage(w, h); } public static BufferedImage createCompatibleTranslucentImage(int w, int h) { - return GraphicsUtilities.createCompatibleTranslucentImage(w, h); + final ColorModel cm = compatTransImage.getColorModel(); + final WritableRaster wr = cm.createCompatibleWritableRaster(w, h); + return new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null); } public static BufferedImage toCompatibleImage(BufferedImage src) { - return GraphicsUtilities.toCompatibleImage(src); + if ((src.getColorModel().equals(compatOpaqueImage.getColorModel()) && + src.getTransparency() == compatOpaqueImage.getTransparency()) + || + (src.getColorModel().equals(compatTransImage.getColorModel()) && + src.getTransparency() == compatTransImage.getTransparency())) + { + return src; + } + + final BufferedImage dst = createCompatibleImage( + src.getWidth(), src.getHeight(), isTransparent(src) + ); + + final Graphics2D g = dst.createGraphics(); + g.drawImage(src, 0, 0, null); + g.dispose(); + + return dst; } public static boolean isCompatibleImage(BufferedImage img) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Free Next-Gen Firewall Hardware Offer Buy your Sophos next-gen firewall before the end March 2013 and get the hardware for free! Learn more. http://p.sf.net/sfu/sophos-d2d-feb _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |