[vassalengine-svn] SF.net SVN: vassalengine: [2463] VASSAL-src/trunk/VASSAL
Brought to you by:
rodneykinney,
uckelman
From: <rod...@us...> - 2007-09-28 12:49:31
|
Revision: 2463 http://vassalengine.svn.sourceforge.net/vassalengine/?rev=2463&view=rev Author: rodneykinney Date: 2007-09-28 05:49:35 -0700 (Fri, 28 Sep 2007) Log Message: ----------- Restore image-scaling option in Preferences Modified Paths: -------------- VASSAL-src/trunk/VASSAL/build/module/GlobalOptions.java VASSAL-src/trunk/VASSAL/i18n/VASSAL.properties VASSAL-src/trunk/VASSAL/tools/DataArchive.java Modified: VASSAL-src/trunk/VASSAL/build/module/GlobalOptions.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/GlobalOptions.java 2007-09-28 12:32:40 UTC (rev 2462) +++ VASSAL-src/trunk/VASSAL/build/module/GlobalOptions.java 2007-09-28 12:49:35 UTC (rev 2463) @@ -101,6 +101,9 @@ GameModule.getGameModule().getPrefs().addOption(config); useSingleWindow = !Boolean.FALSE.equals(config.getValue()); + config = new BooleanConfigurer(SCALER_ALGORITHM, Resources.getString("GlobalOptions.smooth_scaling"), Boolean.TRUE); //$NON-NLS-1$ + GameModule.getGameModule().getPrefs().addOption(config); + validator = new SingleChildInstance(GameModule.getGameModule(), getClass()); } Modified: VASSAL-src/trunk/VASSAL/i18n/VASSAL.properties =================================================================== --- VASSAL-src/trunk/VASSAL/i18n/VASSAL.properties 2007-09-28 12:32:40 UTC (rev 2462) +++ VASSAL-src/trunk/VASSAL/i18n/VASSAL.properties 2007-09-28 12:49:35 UTC (rev 2463) @@ -225,6 +225,7 @@ # GlobalOptions GlobalOptions.use_combined=Use combined application window (requires restart)? +GlobalOptions.smooth_scaling=High-quality image scaling (requires more memory)? GlobalOptions.center_on_move=Center on opponent's moves? GlobalOptions.auto_report=Auto-report moves? GlobalOptions.mark_moved=Mark moved pieces? Modified: VASSAL-src/trunk/VASSAL/tools/DataArchive.java =================================================================== --- VASSAL-src/trunk/VASSAL/tools/DataArchive.java 2007-09-28 12:32:40 UTC (rev 2462) +++ VASSAL-src/trunk/VASSAL/tools/DataArchive.java 2007-09-28 12:49:35 UTC (rev 2463) @@ -30,6 +30,8 @@ import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.ImageProducer; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -59,7 +61,10 @@ import javax.swing.ImageIcon; import sun.applet.AppletAudioClip; +import VASSAL.build.GameModule; +import VASSAL.build.module.GlobalOptions; import VASSAL.build.module.documentation.HelpFile; +import VASSAL.configure.BooleanConfigurer; /** * Wrapper around a Zip archive with methods to cache images @@ -76,6 +81,7 @@ protected String[] imageNames; public static final String IMAGE_DIR = "images/"; public static final String SOUNDS_DIR = "sounds/"; + private BooleanConfigurer smoothPrefs; private CodeSource cs; protected SVGManager svgManager; @@ -245,12 +251,28 @@ double theta) { if (zoom == 1.0 && theta == 0.0) return im; + // get smoothing preferences + if (smoothPrefs == null) { + smoothPrefs = (BooleanConfigurer) GameModule.getGameModule() + .getPrefs().getOption(GlobalOptions.SCALER_ALGORITHM); + if (smoothPrefs == null) { + smoothPrefs = new BooleanConfigurer(null, null, Boolean.FALSE); + } + smoothPrefs.addPropertyChangeListener(new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + clearTransformedImageCache(); + } + }); + } + + final boolean smooth = Boolean.TRUE.equals(smoothPrefs.getValue()); + if (im instanceof SVGManager.SVGBufferedImage) { // render SVG return ((SVGManager.SVGBufferedImage) im) .getTransformedInstance(zoom, theta); } - else { + else if (smooth) { // do high-quality scaling if (theta != 0.0) { final Rectangle ubox = getImageBounds(im); @@ -296,6 +318,32 @@ return GeneralFilter.zoom(sbox, (BufferedImage) im, new GeneralFilter.Lanczos3Filter()); } + else { + // do fast scaling + final Rectangle ubox = getImageBounds(im); + final AffineTransform bt = new AffineTransform(); + bt.rotate(-Math.PI/180 * theta, ubox.getCenterX(), ubox.getCenterY()); + bt.scale(zoom, zoom); + + final Rectangle tbox = bt.createTransformedShape(ubox).getBounds(); + + final BufferedImage trans = + new BufferedImage(tbox.width, tbox.height, + BufferedImage.TYPE_4BYTE_ABGR); + final Graphics2D g = trans.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + final AffineTransform t = new AffineTransform(); + t.translate(-tbox.x, -tbox.y); + t.rotate(-Math.PI/180 * theta, ubox.getCenterX(), ubox.getCenterY()); + t.scale(zoom, zoom); + t.translate(ubox.x, ubox.y); + + g.drawImage(im, t, null); + return trans; + } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |