patchanim-commit Mailing List for patchanim (Page 10)
Brought to you by:
dbrosius
You can subscribe to this list here.
2008 |
Jan
(80) |
Feb
(158) |
Mar
|
Apr
|
May
(3) |
Jun
(7) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(26) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(6) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(9) |
Aug
(1) |
Sep
(2) |
Oct
|
Nov
(2) |
Dec
(3) |
2010 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(4) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <dbr...@us...> - 2008-01-31 22:45:21
|
Revision: 80 http://patchanim.svn.sourceforge.net/patchanim/?rev=80&view=rev Author: dbrosius Date: 2008-01-31 14:45:25 -0800 (Thu, 31 Jan 2008) Log Message: ----------- fix the sync Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java 2008-01-31 06:07:22 UTC (rev 79) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java 2008-01-31 22:45:25 UTC (rev 80) @@ -63,6 +63,8 @@ private BufferedImage image; private PatchDecorator decorator; private Thread redrawThread = null; + private Object redrawLock = new Object(); + private boolean redrawing = false; public JPatchSamplePanel(PatchColor c) { color = c; @@ -142,8 +144,8 @@ } public void recalcImage(final PatchColor color, final CombinedPatch patch) { - synchronized(this) { - if (redrawThread != null) { + synchronized(redrawLock) { + if (redrawing) { try { redrawThread.interrupt(); redrawThread.join(); @@ -163,8 +165,8 @@ } redraw(); - synchronized(this) { - redrawThread = null; + synchronized(redrawLock) { + redrawing = false; } } }); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 06:07:18
|
Revision: 79 http://patchanim.svn.sourceforge.net/patchanim/?rev=79&view=rev Author: dbrosius Date: 2008-01-30 22:07:22 -0800 (Wed, 30 Jan 2008) Log Message: ----------- fix fencepost export problem when there's only one image Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java 2008-01-31 06:00:42 UTC (rev 78) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java 2008-01-31 06:07:22 UTC (rev 79) @@ -86,29 +86,34 @@ agEncoder.setRepeat((atype != AnimationType.None) ? 0 : -1); } - for(int p = 0; p < lastPatch; p++) { - CombinedPatch startPatch = patches.get(p); - CombinedPatch endPatch = patches.get(p+1); - for (int t = 0; t < tweenCount; t++) { - CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); - PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); - writeSingleFile(image, imageIndex++, loc, baseName, type); - } - } - - if (atype == AnimationType.None) - return; - - if (atype == AnimationType.Wave) { - for (int p = lastPatch; p > 0; p--) { - CombinedPatch startPatch = patches.get(p-1); - CombinedPatch endPatch = patches.get(p); - for (int t = tweenCount - 1; t >= 0; t--) { + if (lastPatch == 0) { + PatchGenerator.recalcCombinedImage(patches.get(0), image, oob); + writeSingleFile(image, imageIndex++, loc, baseName, type); + } else { + for(int p = 0; p < lastPatch; p++) { + CombinedPatch startPatch = patches.get(p); + CombinedPatch endPatch = patches.get(p+1); + for (int t = 0; t < tweenCount; t++) { CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); writeSingleFile(image, imageIndex++, loc, baseName, type); } } + + if (atype == AnimationType.None) + return; + + if (atype == AnimationType.Wave) { + for (int p = lastPatch; p > 0; p--) { + CombinedPatch startPatch = patches.get(p-1); + CombinedPatch endPatch = patches.get(p); + for (int t = tweenCount - 1; t >= 0; t--) { + CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); + PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); + writeSingleFile(image, imageIndex++, loc, baseName, type); + } + } + } } } finally { if (type == ExportType.AnimatedGif) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 06:00:38
|
Revision: 78 http://patchanim.svn.sourceforge.net/patchanim/?rev=78&view=rev Author: dbrosius Date: 2008-01-30 22:00:42 -0800 (Wed, 30 Jan 2008) Log Message: ----------- update todos Modified Paths: -------------- trunk/patchanim/htdocs/index.html Modified: trunk/patchanim/htdocs/index.html =================================================================== --- trunk/patchanim/htdocs/index.html 2008-01-31 05:57:23 UTC (rev 77) +++ trunk/patchanim/htdocs/index.html 2008-01-31 06:00:42 UTC (rev 78) @@ -48,9 +48,7 @@ <p><b>Jan 30, 2008 - This tool is not finished at this time, although the patch animations work</b><br/> Still to be done: <ul> - <li>export to mpeg</li> - <li>redraw glitches - better</li> - <li>Performance Improvements</li> + <li>export to mpeg, apng?</li> <li>Patch Library</li> <li>Color Swatch for editing values</li> <li>Patch Name editing</li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 05:57:18
|
Revision: 77 http://patchanim.svn.sourceforge.net/patchanim/?rev=77&view=rev Author: dbrosius Date: 2008-01-30 21:57:23 -0800 (Wed, 30 Jan 2008) Log Message: ----------- set version to 0.3.0 Modified Paths: -------------- trunk/patchanim/build.xml trunk/patchanim/htdocs/jnlp/patchanim.jnlp Modified: trunk/patchanim/build.xml =================================================================== --- trunk/patchanim/build.xml 2008-01-31 05:56:26 UTC (rev 76) +++ trunk/patchanim/build.xml 2008-01-31 05:57:23 UTC (rev 77) @@ -32,7 +32,7 @@ <property name="javac.deprecation" value="on"/> <property name="javac.debug" value="on"/> - <property name="patchanim.version" value="0.2.0"/> + <property name="patchanim.version" value="0.3.0"/> <target name="clean" description="removes all generated collateral"> <delete dir="${classes.dir}"/> Modified: trunk/patchanim/htdocs/jnlp/patchanim.jnlp =================================================================== --- trunk/patchanim/htdocs/jnlp/patchanim.jnlp 2008-01-31 05:56:26 UTC (rev 76) +++ trunk/patchanim/htdocs/jnlp/patchanim.jnlp 2008-01-31 05:57:23 UTC (rev 77) @@ -16,7 +16,7 @@ </security> <resources> <j2se version="1.5+" initial-heap-size="300m" max-heap-size="800m"/> - <jar href="patchanim-0.2.0.jar"/> + <jar href="patchanim-0.3.0.jar"/> </resources> <application-desc main-class="com.mebigfatguy.patchanim.main.PatchMain"/> </jnlp> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 05:56:22
|
Revision: 76 http://patchanim.svn.sourceforge.net/patchanim/?rev=76&view=rev Author: dbrosius Date: 2008-01-30 21:56:26 -0800 (Wed, 30 Jan 2008) Log Message: ----------- synchronize the creation of the redraw thread so that there is only one redraw per patch at a time. Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java 2008-01-31 05:46:28 UTC (rev 75) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java 2008-01-31 05:56:26 UTC (rev 76) @@ -62,6 +62,7 @@ private OutOfBoundsColor oob; private BufferedImage image; private PatchDecorator decorator; + private Thread redrawThread = null; public JPatchSamplePanel(PatchColor c) { color = c; @@ -141,7 +142,19 @@ } public void recalcImage(final PatchColor color, final CombinedPatch patch) { - Thread t = new Thread(new Runnable() { + synchronized(this) { + if (redrawThread != null) { + try { + redrawThread.interrupt(); + redrawThread.join(); + } catch (InterruptedException ie) { + } finally { + redrawThread = null; + } + } + } + + redrawThread = new Thread(new Runnable() { public void run() { if (color == PatchColor.Combined) { PatchGenerator.recalcCombinedImage(patch, image, oob); @@ -150,9 +163,12 @@ } redraw(); + synchronized(this) { + redrawThread = null; + } } }); - t.start(); + redrawThread.start(); } private void redraw() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 05:46:30
|
Revision: 75 http://patchanim.svn.sourceforge.net/patchanim/?rev=75&view=rev Author: dbrosius Date: 2008-01-30 21:46:28 -0800 (Wed, 30 Jan 2008) Log Message: ----------- oops, r/g/b not b/g/r Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java 2008-01-31 05:44:11 UTC (rev 74) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java 2008-01-31 05:46:28 UTC (rev 75) @@ -110,11 +110,9 @@ } } - db.setElem(pixel++, iValue[0]); - db.setElem(pixel++, iValue[1]); db.setElem(pixel++, iValue[2]); - //int compValue = 0xFF000000 | (iValue[0] << 16) | (iValue[1] << 8) | iValue[2]; - //image.setRGB(iu, iv, compValue); + db.setElem(pixel++, iValue[1]); + db.setElem(pixel++, iValue[0]); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-31 05:44:07
|
Revision: 74 http://patchanim.svn.sourceforge.net/patchanim/?rev=74&view=rev Author: dbrosius Date: 2008-01-30 21:44:11 -0800 (Wed, 30 Jan 2008) Log Message: ----------- use WritableRaster's DataBuffer, rather than calling setPixel on the image (performance) Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java 2008-01-30 05:35:33 UTC (rev 73) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/surface/PatchGenerator.java 2008-01-31 05:44:11 UTC (rev 74) @@ -21,7 +21,9 @@ import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; import java.awt.image.IndexColorModel; +import java.awt.image.WritableRaster; import com.mebigfatguy.patchanim.OutOfBoundsColor; import com.mebigfatguy.patchanim.PatchColor; @@ -35,6 +37,10 @@ if (patch == null) return; + WritableRaster wr = image.getRaster(); + DataBuffer db = wr.getDataBuffer(); + int pixel = 0; + PatchCoords[] coords = new PatchCoords[3]; coords[0] = patch.getPatch(PatchColor.Red); @@ -51,32 +57,32 @@ int sampleSizeX = image.getWidth(); int sampleSizeY = image.getHeight(); - for (int iu = 0; iu < sampleSizeX; iu++) { - u = (double)iu / (double)sampleSizeX; - u2 = u * u; - u3 = u2 * u; - oneMinusU = 1.0 - u; - oneMinusU2 = oneMinusU * oneMinusU; - oneMinusU3 = oneMinusU2 * oneMinusU; + for (int iv = 0; iv < sampleSizeY; iv++) { + v = (double)iv / (double)sampleSizeY; + v2 = v * v; + v3 = v2 * v; + oneMinusV = 1.0 - v; + oneMinusV2 = oneMinusV * oneMinusV; + oneMinusV3 = oneMinusV2 * oneMinusV; - uCoeffs[0] = oneMinusU3; - uCoeffs[1] = 3.0 * u * oneMinusU2; - uCoeffs[2] = 3.0 * u2 * oneMinusU; - uCoeffs[3] = u3; + vCoeffs[0] = oneMinusV3; + vCoeffs[1] = 3.0 * v * oneMinusV2; + vCoeffs[2] = 3.0 * v2 * oneMinusV; + vCoeffs[3] = v3; + + for (int iu = 0; iu < sampleSizeX; iu++) { + u = (double)iu / (double)sampleSizeX; + u2 = u * u; + u3 = u2 * u; + oneMinusU = 1.0 - u; + oneMinusU2 = oneMinusU * oneMinusU; + oneMinusU3 = oneMinusU2 * oneMinusU; + + uCoeffs[0] = oneMinusU3; + uCoeffs[1] = 3.0 * u * oneMinusU2; + uCoeffs[2] = 3.0 * u2 * oneMinusU; + uCoeffs[3] = u3; - for (int iv = 0; iv < sampleSizeY; iv++) { - v = (double)iv / (double)sampleSizeY; - v2 = v * v; - v3 = v2 * v; - oneMinusV = 1.0 - v; - oneMinusV2 = oneMinusV * oneMinusV; - oneMinusV3 = oneMinusV2 * oneMinusV; - - vCoeffs[0] = oneMinusV3; - vCoeffs[1] = 3.0 * v * oneMinusV2; - vCoeffs[2] = 3.0 * v2 * oneMinusV; - vCoeffs[3] = v3; - value[0] = value[1] = value[2] = 0.0; for (int i = 0; i < PatchCoords.ORDER; i++) { @@ -103,8 +109,12 @@ iValue[k] = iValue[k] & 0x00FF; } } - int compValue = 0xFF000000 | (iValue[0] << 16) | (iValue[1] << 8) | iValue[2]; - image.setRGB(iu, iv, compValue); + + db.setElem(pixel++, iValue[0]); + db.setElem(pixel++, iValue[1]); + db.setElem(pixel++, iValue[2]); + //int compValue = 0xFF000000 | (iValue[0] << 16) | (iValue[1] << 8) | iValue[2]; + //image.setRGB(iu, iv, compValue); } } } @@ -113,6 +123,10 @@ if (patch == null) return; + WritableRaster wr = image.getRaster(); + DataBuffer db = wr.getDataBuffer(); + int pixel = 0; + PatchCoords coords = patch.getPatch(color); double u, u2, u3, oneMinusU, oneMinusU2, oneMinusU3; @@ -123,32 +137,32 @@ int sampleSizeX = image.getWidth(); int sampleSizeY = image.getHeight(); - for (int iu = 0; iu < sampleSizeX; iu++) { - u = (double)iu / (double)sampleSizeX; - u2 = u * u; - u3 = u2 * u; - oneMinusU = 1.0 - u; - oneMinusU2 = oneMinusU * oneMinusU; - oneMinusU3 = oneMinusU2 * oneMinusU; + for (int iv = 0; iv < sampleSizeY; iv++) { + v = (double)iv / (double)sampleSizeY; + v2 = v * v; + v3 = v2 * v; + oneMinusV = 1.0 - v; + oneMinusV2 = oneMinusV * oneMinusV; + oneMinusV3 = oneMinusV2 * oneMinusV; - uCoeffs[0] = oneMinusU3; - uCoeffs[1] = 3.0 * u * oneMinusU2; - uCoeffs[2] = 3.0 * u2 * oneMinusU; - uCoeffs[3] = u3; + vCoeffs[0] = oneMinusV3; + vCoeffs[1] = 3.0 * v * oneMinusV2; + vCoeffs[2] = 3.0 * v2 * oneMinusV; + vCoeffs[3] = v3; - for (int iv = 0; iv < sampleSizeY; iv++) { - v = (double)iv / (double)sampleSizeY; - v2 = v * v; - v3 = v2 * v; - oneMinusV = 1.0 - v; - oneMinusV2 = oneMinusV * oneMinusV; - oneMinusV3 = oneMinusV2 * oneMinusV; + for (int iu = 0; iu < sampleSizeX; iu++) { + u = (double)iu / (double)sampleSizeX; + u2 = u * u; + u3 = u2 * u; + oneMinusU = 1.0 - u; + oneMinusU2 = oneMinusU * oneMinusU; + oneMinusU3 = oneMinusU2 * oneMinusU; - vCoeffs[0] = oneMinusV3; - vCoeffs[1] = 3.0 * v * oneMinusV2; - vCoeffs[2] = 3.0 * v2 * oneMinusV; - vCoeffs[3] = v3; - + uCoeffs[0] = oneMinusU3; + uCoeffs[1] = 3.0 * u * oneMinusU2; + uCoeffs[2] = 3.0 * u2 * oneMinusU; + uCoeffs[3] = u3; + double value = 0.0; for (int i = 0; i < PatchCoords.ORDER; i++) { for (int j = 0; j < PatchCoords.ORDER; j++) { @@ -169,13 +183,8 @@ else iValue = iValue & 0x00FF; } - if (color == PatchColor.Red) - iValue <<= 16; - else if (color == PatchColor.Green) - iValue <<= 8; - iValue |= 0xFF000000; - image.setRGB(iu, iv, iValue); + db.setElem(pixel++, iValue); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 05:35:28
|
Revision: 73 http://patchanim.svn.sourceforge.net/patchanim/?rev=73&view=rev Author: dbrosius Date: 2008-01-29 21:35:33 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Tag version 0.2.0 Added Paths: ----------- tags/patchanim/v0_2_0/ Copied: tags/patchanim/v0_2_0 (from rev 72, trunk/patchanim) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 05:34:19
|
Revision: 72 http://patchanim.svn.sourceforge.net/patchanim/?rev=72&view=rev Author: dbrosius Date: 2008-01-29 21:34:24 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Create folder for tagging versions Added Paths: ----------- tags/patchanim/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 05:32:16
|
Revision: 71 http://patchanim.svn.sourceforge.net/patchanim/?rev=71&view=rev Author: dbrosius Date: 2008-01-29 21:32:20 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Create folder for tagging versions Added Paths: ----------- tags/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 02:58:29
|
Revision: 69 http://patchanim.svn.sourceforge.net/patchanim/?rev=69&view=rev Author: dbrosius Date: 2008-01-29 18:55:45 -0800 (Tue, 29 Jan 2008) Log Message: ----------- get ready for the 0.2.0 release Modified Paths: -------------- trunk/patchanim/build.xml Modified: trunk/patchanim/build.xml =================================================================== --- trunk/patchanim/build.xml 2008-01-30 02:55:22 UTC (rev 68) +++ trunk/patchanim/build.xml 2008-01-30 02:55:45 UTC (rev 69) @@ -32,7 +32,7 @@ <property name="javac.deprecation" value="on"/> <property name="javac.debug" value="on"/> - <property name="patchanim.version" value="0.1.0"/> + <property name="patchanim.version" value="0.2.0"/> <target name="clean" description="removes all generated collateral"> <delete dir="${classes.dir}"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 02:58:29
|
Revision: 70 http://patchanim.svn.sourceforge.net/patchanim/?rev=70&view=rev Author: dbrosius Date: 2008-01-29 18:58:07 -0800 (Tue, 29 Jan 2008) Log Message: ----------- update jnlp to 0.2.0 Modified Paths: -------------- trunk/patchanim/htdocs/jnlp/patchanim.jnlp Modified: trunk/patchanim/htdocs/jnlp/patchanim.jnlp =================================================================== --- trunk/patchanim/htdocs/jnlp/patchanim.jnlp 2008-01-30 02:55:45 UTC (rev 69) +++ trunk/patchanim/htdocs/jnlp/patchanim.jnlp 2008-01-30 02:58:07 UTC (rev 70) @@ -16,7 +16,7 @@ </security> <resources> <j2se version="1.5+" initial-heap-size="300m" max-heap-size="800m"/> - <jar href="patchanim-0.1.0.jar"/> + <jar href="patchanim-0.2.0.jar"/> </resources> <application-desc main-class="com.mebigfatguy.patchanim.main.PatchMain"/> </jnlp> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 02:58:29
|
Revision: 68 http://patchanim.svn.sourceforge.net/patchanim/?rev=68&view=rev Author: dbrosius Date: 2008-01-29 18:55:22 -0800 (Tue, 29 Jan 2008) Log Message: ----------- minor cleanups Modified Paths: -------------- trunk/patchanim/htdocs/index.html trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java Modified: trunk/patchanim/htdocs/index.html =================================================================== --- trunk/patchanim/htdocs/index.html 2008-01-30 02:35:25 UTC (rev 67) +++ trunk/patchanim/htdocs/index.html 2008-01-30 02:55:22 UTC (rev 68) @@ -45,11 +45,11 @@ very easy to generate in-between images from two separate blend descriptions.</p> - <p><b>Jan 29, 2008 - This tool is not finished at this time, although the patch animations work</b><br/> + <p><b>Jan 30, 2008 - This tool is not finished at this time, although the patch animations work</b><br/> Still to be done: <ul> - <li>Export to GIF, MPEG, etc</li> - <li>redraw glitches</li> + <li>export to mpeg</li> + <li>redraw glitches - better</li> <li>Performance Improvements</li> <li>Patch Library</li> <li>Color Swatch for editing values</li> Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java 2008-01-30 02:35:25 UTC (rev 67) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java 2008-01-30 02:55:22 UTC (rev 68) @@ -1,3 +1,21 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ package com.mebigfatguy.patchanim.gui; import java.awt.BorderLayout; @@ -2,3 +20,2 @@ import java.awt.Container; -import java.awt.Dimension; import java.util.ResourceBundle; @@ -31,7 +48,6 @@ cp.add(bar, BorderLayout.CENTER); pack(); setTitle(rb.getString(PatchAnimBundle.EXPORTINGFILE)); - Dimension d = getPreferredSize(); } public void imageExported(final ExportEvent ee) { Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 02:35:25 UTC (rev 67) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 02:55:22 UTC (rev 68) @@ -334,7 +334,6 @@ } private File getExportLocation(final ExportType type) { - final ResourceBundle rb = PatchAnimBundle.getBundle(); JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); File defLocation; @@ -346,6 +345,7 @@ if (!type.isMultipleFiles()) { chooser.setFileFilter(new FileFilter() { + private final ResourceBundle rb = PatchAnimBundle.getBundle(); @Override public boolean accept(File f) { Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java 2008-01-30 02:35:25 UTC (rev 67) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java 2008-01-30 02:55:22 UTC (rev 68) @@ -31,7 +31,6 @@ private static final long serialVersionUID = 7719900566976553103L; private JPatchControlPanel ctrl; - private JPatchSamplePanel sample; public JPatchAnimPanel() { initComponents(); @@ -43,7 +42,7 @@ p.setLayout(new BorderLayout(4, 4)); ctrl = new JPatchControlPanel(); p.add(ctrl, BorderLayout.WEST); - sample = new JPatchSamplePanel(PatchColor.Combined); + JPatchSamplePanel sample = new JPatchSamplePanel(PatchColor.Combined); JPanel q = new JPanel(); q.setLayout(new BoxLayout(q, BoxLayout.X_AXIS)); q.add(Box.createHorizontalGlue()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 02:35:20
|
Revision: 67 http://patchanim.svn.sourceforge.net/patchanim/?rev=67&view=rev Author: dbrosius Date: 2008-01-29 18:35:25 -0800 (Tue, 29 Jan 2008) Log Message: ----------- add a progress bar on export Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java Added: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java 2008-01-30 02:35:25 UTC (rev 67) @@ -0,0 +1,46 @@ +package com.mebigfatguy.patchanim.gui; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import java.util.ResourceBundle; + +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JProgressBar; +import javax.swing.SwingUtilities; + +import com.mebigfatguy.patchanim.gui.events.ExportEvent; +import com.mebigfatguy.patchanim.gui.events.ExportListener; +import com.mebigfatguy.patchanim.main.PatchAnimBundle; + +public class ExportFrame extends JDialog implements ExportListener { + private static final long serialVersionUID = 3111097499092146056L; + private JProgressBar bar; + + public ExportFrame() { + initComponents(); + } + + private void initComponents() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout(4, 4)); + bar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100); + bar.setBorder(BorderFactory.createEmptyBorder(10, 50, 10, 50)); + cp.add(bar, BorderLayout.CENTER); + pack(); + setTitle(rb.getString(PatchAnimBundle.EXPORTINGFILE)); + Dimension d = getPreferredSize(); + } + + public void imageExported(final ExportEvent ee) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + bar.setMaximum(ee.getTotalImages()); + bar.setValue(ee.getCurrentImage()); + } + }); + } + +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ExportFrame.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 02:04:43 UTC (rev 66) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 02:35:25 UTC (rev 67) @@ -34,6 +34,7 @@ import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import javax.swing.filechooser.FileFilter; import com.mebigfatguy.patchanim.ExportType; @@ -206,57 +207,25 @@ exportJpgsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.JPegs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.JPegs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } + export(ExportType.JPegs); } }); exportPngsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.Pngs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.Pngs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } + export(ExportType.Pngs); } }); exportGifsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.Gifs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.Gifs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } + export(ExportType.Gifs); } }); exportAnimatedGifItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.AnimatedGif); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.AnimatedGif, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } + export(ExportType.AnimatedGif); } }); @@ -396,5 +365,31 @@ return chooser.getSelectedFile(); } + + private void export(ExportType type) { + File f = getExportLocation(type); + if (f != null) { + final PatchExporter exporter = new PatchExporter(type, f); + final ExportFrame ed = new ExportFrame(); + ed.setLocationRelativeTo(JPatchAnimFrame.this); + ed.setVisible(true); + Thread t = new Thread(new Runnable() { + public void run() { + try { + exporter.addExportListener(ed); + exporter.export(document); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ed.dispose(); + } + }); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + t.start(); + } + } } Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-30 02:04:43 UTC (rev 66) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-30 02:35:25 UTC (rev 67) @@ -40,6 +40,7 @@ public static final String ANIMATEDGIFFILTER = "patchanim.filter.animatedgif"; public static final String MPEG = "patchanim.mpeg"; public static final String MPEGFILTER = "patchanim.filter.mpeg"; + public static final String EXPORTINGFILE = "patchanim.exportfile"; public static final String QUIT = "patchanim.quit"; public static final String CONTROLS = "patchanim.control"; public static final String WIDTH = "patchanim.width"; Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-30 02:04:43 UTC (rev 66) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-30 02:35:25 UTC (rev 67) @@ -26,13 +26,14 @@ patchanim.jpgs = a series of JPGs patchanim.filter.jpgs = Files (*.jpg) patchanim.pngs = a series of PNGs -patchanim.filter.pnga = Png Files (*.png) +patchanim.filter.pngs = Png Files (*.png) patchanim.gifs = a series of GIFs patchanim.filter.gifs = Gif Files (*.gif) patchanim.animatedgif = an Animated Gif patchanim.filter.animatedgif = Gif Files (*.gif) patchanim.mpeg = an MPEG patchanim.filter.mpeg = MPEG Files (*.mpg) +patchanim.exportfile = Exporting Animation patchanim.quit = Quit patchanim.control = Controls patchanim.width = Width This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 02:04:38
|
Revision: 66 http://patchanim.svn.sourceforge.net/patchanim/?rev=66&view=rev Author: dbrosius Date: 2008-01-29 18:04:43 -0800 (Tue, 29 Jan 2008) Log Message: ----------- add an export listener so that a gui can show progress Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportEvent.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportListener.java Added: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportEvent.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportEvent.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportEvent.java 2008-01-30 02:04:43 UTC (rev 66) @@ -0,0 +1,25 @@ +package com.mebigfatguy.patchanim.gui.events; + +import java.util.EventObject; + +public class ExportEvent extends EventObject { + private static final long serialVersionUID = 2626267094073359857L; + + private int index; + private int total; + + public ExportEvent(Object src, int curImage, int totalImages) { + super(src); + index = curImage; + total = totalImages; + } + + public int getCurrentImage() { + return index; + } + + public int getTotalImages() { + return total; + } + +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportEvent.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportListener.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportListener.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportListener.java 2008-01-30 02:04:43 UTC (rev 66) @@ -0,0 +1,5 @@ +package com.mebigfatguy.patchanim.gui.events; + +public interface ExportListener { + public void imageExported(ExportEvent ee); +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ExportListener.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java 2008-01-30 01:49:46 UTC (rev 65) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java 2008-01-30 02:04:43 UTC (rev 66) @@ -22,7 +22,9 @@ import java.io.File; import java.io.IOException; import java.text.NumberFormat; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.imageio.ImageIO; @@ -31,6 +33,8 @@ import com.mebigfatguy.patchanim.ExportType; import com.mebigfatguy.patchanim.OutOfBoundsColor; import com.mebigfatguy.patchanim.PatchAnimDocument; +import com.mebigfatguy.patchanim.gui.events.ExportEvent; +import com.mebigfatguy.patchanim.gui.events.ExportListener; import com.mebigfatguy.patchanim.surface.CombinedPatch; import com.mebigfatguy.patchanim.surface.PatchGenerator; @@ -38,6 +42,8 @@ private ExportType type; private File loc; private AnimatedGifEncoder agEncoder; + private int totalImages; + private Set<ExportListener> elisteners = new HashSet<ExportListener>(); public PatchExporter(ExportType exportType, File location) { type = exportType; @@ -48,6 +54,10 @@ agEncoder = null; } + public void addExportListener(ExportListener el) { + elisteners.add(el); + } + public void export(PatchAnimDocument document) throws IOException { try { String baseName = loc.getName(); @@ -62,8 +72,9 @@ agEncoder.start(new File(loc, baseName).getPath()); } + totalImages = calcImageCount(document); + BufferedImage image = PatchGenerator.buildImage(null, document.getWidth(), document.getHeight()); - List<CombinedPatch> patches = document.getPatches(); int lastPatch = patches.size() - 1; int tweenCount = document.getTweenCount(); @@ -71,6 +82,10 @@ int imageIndex = 1; AnimationType atype = document.getAnimationType(); + if (type == ExportType.AnimatedGif) { + agEncoder.setRepeat((atype != AnimationType.None) ? 0 : -1); + } + for(int p = 0; p < lastPatch; p++) { CombinedPatch startPatch = patches.get(p); CombinedPatch endPatch = patches.get(p+1); @@ -120,6 +135,23 @@ } else ImageIO.write(image, type.getExtension(), imageFile); + + fireExportEvent(index); } - + + private void fireExportEvent(int index) { + ExportEvent ee = new ExportEvent(this, index, totalImages); + for (ExportListener el : elisteners) { + el.imageExported(ee); + } + } + + private int calcImageCount(PatchAnimDocument document) { + int total = (document.getPatches().size() - 1) * document.getTweenCount() + 1; + + if (document.getAnimationType() == AnimationType.Wave) + total *= 2; + + return total; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:49:40
|
Revision: 65 http://patchanim.svn.sourceforge.net/patchanim/?rev=65&view=rev Author: dbrosius Date: 2008-01-29 17:49:46 -0800 (Tue, 29 Jan 2008) Log Message: ----------- rework packages to move events/listeners to a new package Modified Paths: -------------- trunk/patchanim/src/com/fmsware/gif/NeuQuant.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchControlPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchDecorator.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchListModel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchPanelMediator.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/Utils.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedEvent.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedListener.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedEvent.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedListener.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedEvent.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedListener.java trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchAnimIO.java Property Changed: ---------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchControlPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchSamplePanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchDecorator.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchListModel.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/PatchPanelMediator.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/Utils.java Modified: trunk/patchanim/src/com/fmsware/gif/NeuQuant.java =================================================================== --- trunk/patchanim/src/com/fmsware/gif/NeuQuant.java 2008-01-30 01:46:25 UTC (rev 64) +++ trunk/patchanim/src/com/fmsware/gif/NeuQuant.java 2008-01-30 01:49:46 UTC (rev 65) @@ -345,7 +345,7 @@ ----------------------------------------------------------------------------------- */ public void unbiasnet() { - int i, j; + int i; for (i = 0; i < netsize; i++) { network[i][0] >>= netbiasshift; Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java 2008-01-30 01:46:25 UTC (rev 64) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java 2008-01-30 01:49:46 UTC (rev 65) @@ -1,194 +1,196 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.util.ResourceBundle; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import com.mebigfatguy.patchanim.PatchColor; -import com.mebigfatguy.patchanim.main.PatchAnimBundle; -import com.mebigfatguy.patchanim.surface.CombinedPatch; -import com.mebigfatguy.patchanim.surface.Coordinate; -import com.mebigfatguy.patchanim.surface.PatchCoords; - -public class JColorControlPatchPanel extends JPanel implements PatchDecorator { - - private static final long serialVersionUID = -2524694507912574529L; - - private PatchCoords coords; - private PatchColor color; - private JPatchSamplePanel sample; - private JLabel colorLabel; - private JTextField colorField; - private ValueDocumentListener docListener = new ValueDocumentListener(); - private int selectedXPt; - private int selectedYPt; - - public JColorControlPatchPanel(PatchColor c) { - color = c; - selectedXPt = 0; - selectedYPt = 0; - initComponents(); - initListeners(); - } - - private void initComponents() { - ResourceBundle rb = PatchAnimBundle.getBundle(); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - sample = new JPatchSamplePanel(color); - sample.setDecorator(this); - - colorLabel = new JLabel(rb.getString(PatchAnimBundle.COLOR)); - colorField = new JTextField(new DoubleDocument(), "", 4); - colorLabel.setLabelFor(colorField); - - add(Box.createVerticalGlue()); - JPanel p = new JPanel(); - { - p.setLayout(new BorderLayout(4, 4)); - p.add(sample, BorderLayout.CENTER); - - JPanel south = new JPanel(); - south.setLayout(new BoxLayout(south, BoxLayout.X_AXIS)); - south.add(Box.createHorizontalGlue()); - south.add(colorLabel); - south.add(Box.createHorizontalStrut(5)); - south.add(colorField); - south.add(Box.createHorizontalGlue()); - p.add(south, BorderLayout.SOUTH); - } - add(p); - add(Box.createVerticalGlue()); - - setMaximumSize(getPreferredSize()); - } - - private void initListeners() { - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.addActivePatchChangedListener(new ActivePatchChangedListener() { - public void activePatchChanged(ActivePatchChangedEvent apce) { - CombinedPatch currentPatch = apce.getActivePatch(); - coords = currentPatch.getPatch(color); - if (coords != null) { - setColorField(false); - sample.recalcImage(color, currentPatch); - } - } - }); - colorField.getDocument().addDocumentListener(docListener); - } - - private void setColorField(final boolean fireEvents) { - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - Coordinate coord = coords.getCoordinate(selectedXPt, selectedYPt); - double newColor = coord.getColor(); - double oldColor; - try { - oldColor = Double.parseDouble(colorField.getText()); - } catch (NumberFormatException nfe) { - oldColor = 0.0; - } - if (newColor != oldColor) { - if (!fireEvents) - colorField.getDocument().removeDocumentListener(docListener); - colorField.setText(String.valueOf(coord.getColor())); - if (!fireEvents) - colorField.getDocument().addDocumentListener(docListener); - } - } - }); - } - - public void drawDecoration(Graphics2D g, Rectangle bounds) { - if (coords == null) - return; - - g.setColor(Color.yellow); - for (int u = 0; u < 4; u++) { - for (int v = 0; v < 4; v++) { - Coordinate c = coords.getCoordinate(u, v); - if ((selectedXPt == u) && (selectedYPt == v)) { - g.fillOval((int)(((c.getX() * (bounds.width - 5)) / 100.0) + bounds.x), - (int)(((c.getY() * (bounds.height - 5)) / 100.0) + bounds.y), 5, 5); - } else { - g.drawOval((int)(((c.getX() * (bounds.width - 5)) / 100.0) + bounds.x), - (int)(((c.getY() * (bounds.height - 5)) / 100.0) + bounds.y), 5, 5); - } - } - } - } - - public void click(Point p, Rectangle bounds) { - int newSelectedXPt = ((((p.x - bounds.x) * 100) / bounds.width) + 16) / 33; - int newSelectedYPt = ((((p.y - bounds.y) * 100) / bounds.height) + 16) / 33; - if ((newSelectedXPt != selectedXPt) || (newSelectedYPt != selectedYPt)) { - selectedXPt = newSelectedXPt; - selectedYPt = newSelectedYPt; - setColorField(false); - invalidate(); - revalidate(); - repaint(); - } - } - - class ValueDocumentListener implements DocumentListener - { - public void changedUpdate(DocumentEvent de) { - processChange(); - } - - public void insertUpdate(DocumentEvent de) { - processChange(); - } - - public void removeUpdate(DocumentEvent de) { - processChange(); - } - - private void processChange() { - double value; - - try { - value = Double.parseDouble(colorField.getText()); - } catch (NumberFormatException nfe) { - value = 0.0; - } - Coordinate coord = coords.getCoordinate(selectedXPt, selectedYPt); - coord.setColor(value); - coords.setCoordinate(selectedXPt, selectedYPt, coord); - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.setNewActivePatch(mediator.getActivePatch()); - } - } -} +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.util.ResourceBundle; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import com.mebigfatguy.patchanim.PatchColor; +import com.mebigfatguy.patchanim.gui.events.ActivePatchChangedEvent; +import com.mebigfatguy.patchanim.gui.events.ActivePatchChangedListener; +import com.mebigfatguy.patchanim.main.PatchAnimBundle; +import com.mebigfatguy.patchanim.surface.CombinedPatch; +import com.mebigfatguy.patchanim.surface.Coordinate; +import com.mebigfatguy.patchanim.surface.PatchCoords; + +public class JColorControlPatchPanel extends JPanel implements PatchDecorator { + + private static final long serialVersionUID = -2524694507912574529L; + + private PatchCoords coords; + private PatchColor color; + private JPatchSamplePanel sample; + private JLabel colorLabel; + private JTextField colorField; + private ValueDocumentListener docListener = new ValueDocumentListener(); + private int selectedXPt; + private int selectedYPt; + + public JColorControlPatchPanel(PatchColor c) { + color = c; + selectedXPt = 0; + selectedYPt = 0; + initComponents(); + initListeners(); + } + + private void initComponents() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + sample = new JPatchSamplePanel(color); + sample.setDecorator(this); + + colorLabel = new JLabel(rb.getString(PatchAnimBundle.COLOR)); + colorField = new JTextField(new DoubleDocument(), "", 4); + colorLabel.setLabelFor(colorField); + + add(Box.createVerticalGlue()); + JPanel p = new JPanel(); + { + p.setLayout(new BorderLayout(4, 4)); + p.add(sample, BorderLayout.CENTER); + + JPanel south = new JPanel(); + south.setLayout(new BoxLayout(south, BoxLayout.X_AXIS)); + south.add(Box.createHorizontalGlue()); + south.add(colorLabel); + south.add(Box.createHorizontalStrut(5)); + south.add(colorField); + south.add(Box.createHorizontalGlue()); + p.add(south, BorderLayout.SOUTH); + } + add(p); + add(Box.createVerticalGlue()); + + setMaximumSize(getPreferredSize()); + } + + private void initListeners() { + PatchPanelMediator mediator = PatchPanelMediator.getMediator(); + mediator.addActivePatchChangedListener(new ActivePatchChangedListener() { + public void activePatchChanged(ActivePatchChangedEvent apce) { + CombinedPatch currentPatch = apce.getActivePatch(); + coords = currentPatch.getPatch(color); + if (coords != null) { + setColorField(false); + sample.recalcImage(color, currentPatch); + } + } + }); + colorField.getDocument().addDocumentListener(docListener); + } + + private void setColorField(final boolean fireEvents) { + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + Coordinate coord = coords.getCoordinate(selectedXPt, selectedYPt); + double newColor = coord.getColor(); + double oldColor; + try { + oldColor = Double.parseDouble(colorField.getText()); + } catch (NumberFormatException nfe) { + oldColor = 0.0; + } + if (newColor != oldColor) { + if (!fireEvents) + colorField.getDocument().removeDocumentListener(docListener); + colorField.setText(String.valueOf(coord.getColor())); + if (!fireEvents) + colorField.getDocument().addDocumentListener(docListener); + } + } + }); + } + + public void drawDecoration(Graphics2D g, Rectangle bounds) { + if (coords == null) + return; + + g.setColor(Color.yellow); + for (int u = 0; u < 4; u++) { + for (int v = 0; v < 4; v++) { + Coordinate c = coords.getCoordinate(u, v); + if ((selectedXPt == u) && (selectedYPt == v)) { + g.fillOval((int)(((c.getX() * (bounds.width - 5)) / 100.0) + bounds.x), + (int)(((c.getY() * (bounds.height - 5)) / 100.0) + bounds.y), 5, 5); + } else { + g.drawOval((int)(((c.getX() * (bounds.width - 5)) / 100.0) + bounds.x), + (int)(((c.getY() * (bounds.height - 5)) / 100.0) + bounds.y), 5, 5); + } + } + } + } + + public void click(Point p, Rectangle bounds) { + int newSelectedXPt = ((((p.x - bounds.x) * 100) / bounds.width) + 16) / 33; + int newSelectedYPt = ((((p.y - bounds.y) * 100) / bounds.height) + 16) / 33; + if ((newSelectedXPt != selectedXPt) || (newSelectedYPt != selectedYPt)) { + selectedXPt = newSelectedXPt; + selectedYPt = newSelectedYPt; + setColorField(false); + invalidate(); + revalidate(); + repaint(); + } + } + + class ValueDocumentListener implements DocumentListener + { + public void changedUpdate(DocumentEvent de) { + processChange(); + } + + public void insertUpdate(DocumentEvent de) { + processChange(); + } + + public void removeUpdate(DocumentEvent de) { + processChange(); + } + + private void processChange() { + double value; + + try { + value = Double.parseDouble(colorField.getText()); + } catch (NumberFormatException nfe) { + value = 0.0; + } + Coordinate coord = coords.getCoordinate(selectedXPt, selectedYPt); + coord.setColor(value); + coords.setCoordinate(selectedXPt, selectedYPt, coord); + PatchPanelMediator mediator = PatchPanelMediator.getMediator(); + mediator.setNewActivePatch(mediator.getActivePatch()); + } + } +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JColorControlPatchPanel.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 01:46:25 UTC (rev 64) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 01:49:46 UTC (rev 65) @@ -1,405 +1,400 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.List; -import java.util.ResourceBundle; - -import javax.imageio.ImageIO; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; - -import com.fmsware.gif.AnimatedGifEncoder; -import com.mebigfatguy.patchanim.AnimationType; -import com.mebigfatguy.patchanim.ExportType; -import com.mebigfatguy.patchanim.OutOfBoundsColor; -import com.mebigfatguy.patchanim.PatchAnimDocument; -import com.mebigfatguy.patchanim.io.PatchAnimIO; -import com.mebigfatguy.patchanim.io.PatchExporter; -import com.mebigfatguy.patchanim.main.PatchAnimBundle; -import com.mebigfatguy.patchanim.surface.CombinedPatch; -import com.mebigfatguy.patchanim.surface.PatchGenerator; - -public class JPatchAnimFrame extends JFrame { - - private static final long serialVersionUID = -4610407923936772733L; - - private JMenuItem newItem; - private JMenuItem openItem; - private JMenuItem saveItem; - private JMenuItem saveAsItem; - private JMenu exportMenu; - private JMenuItem exportJpgsItem; - private JMenuItem exportPngsItem; - private JMenuItem exportGifsItem; - private JMenuItem exportAnimatedGifItem; - private JMenuItem quitItem; - private PatchAnimDocument document; - private File documentLocation; - - public JPatchAnimFrame() { - initComponents(); - initMenus(); - initListeners(); - } - - private void initComponents() { - ResourceBundle rb = PatchAnimBundle.getBundle(); - Container cp = getContentPane(); - cp.setLayout(new BorderLayout(4, 4)); - - JPatchAnimPanel patchPanel = new JPatchAnimPanel(); - document = new PatchAnimDocument(); - documentLocation = null; - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.setDocument(document); - - cp.add(patchPanel, BorderLayout.CENTER); - setTitle(rb.getString(PatchAnimBundle.TITLE)); - pack(); - } - - private void initMenus() { - ResourceBundle rb = PatchAnimBundle.getBundle(); - JMenuBar mb = new JMenuBar(); - JMenu fileMenu = new JMenu(rb.getString(PatchAnimBundle.FILE)); - newItem = new JMenuItem(rb.getString(PatchAnimBundle.NEW)); - fileMenu.add(newItem); - openItem = new JMenuItem(rb.getString(PatchAnimBundle.OPEN)); - fileMenu.add(openItem); - fileMenu.addSeparator(); - saveItem = new JMenuItem(rb.getString(PatchAnimBundle.SAVE)); - saveItem.setEnabled(false); - fileMenu.add(saveItem); - saveAsItem = new JMenuItem(rb.getString(PatchAnimBundle.SAVEAS)); - fileMenu.add(saveAsItem); - fileMenu.addSeparator(); - exportMenu = new JMenu(rb.getString(PatchAnimBundle.EXPORT)); - exportJpgsItem = new JMenuItem(rb.getString(PatchAnimBundle.JPGSERIES)); - exportPngsItem = new JMenuItem(rb.getString(PatchAnimBundle.PNGSERIES)); - exportGifsItem = new JMenuItem(rb.getString(PatchAnimBundle.GIFSERIES)); - exportAnimatedGifItem = new JMenuItem(rb.getString(PatchAnimBundle.ANIMATEDGIF)); - exportMenu.add(exportJpgsItem); - exportMenu.add(exportPngsItem); - exportMenu.add(exportGifsItem); - exportMenu.addSeparator(); - exportMenu.add(exportAnimatedGifItem); - fileMenu.add(exportMenu); - fileMenu.addSeparator(); - quitItem = new JMenuItem(rb.getString(PatchAnimBundle.QUIT)); - fileMenu.add(quitItem); - - mb.add(fileMenu); - - setJMenuBar(mb); - } - - private void initListeners() { - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent we) { - try { - if (document.isDirty()) { - int choice = askSave(); - if (choice == JOptionPane.CANCEL_OPTION) - return; - if (choice == JOptionPane.YES_OPTION) { - save(); - } - } - dispose(); - System.exit(0); - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - } - } - }); - - newItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - if (document.isDirty()) { - int choice = askSave(); - if (choice == JOptionPane.CANCEL_OPTION) - return; - if (choice == JOptionPane.YES_OPTION) { - save(); - } - } - - document = new PatchAnimDocument(); - documentLocation = null; - saveItem.setEnabled(false); - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - } - } - }); - - openItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - if (document.isDirty()) { - int choice = askSave(); - if (choice == JOptionPane.CANCEL_OPTION) - return; - if (choice == JOptionPane.YES_OPTION) { - save(); - } - } - load(); - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.LOADFAILED); - } - } - }); - - saveItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - if (documentLocation == null) { - saveAs(); - } else { - save(); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - } - } - }); - - saveAsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - saveAs(); - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - } - } - }); - - exportJpgsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.JPegs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.JPegs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } - } - }); - - exportPngsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.Pngs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.Pngs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } - } - }); - - exportGifsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.Gifs); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.Gifs, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } - } - }); - - exportAnimatedGifItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - File f = getExportLocation(ExportType.AnimatedGif); - if (f != null) { - PatchExporter exporter = new PatchExporter(ExportType.AnimatedGif, f); - exporter.export(document); - } - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); - } - } - }); - - quitItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - try { - if (document.isDirty()) { - int choice = askSave(); - if (choice == JOptionPane.CANCEL_OPTION) - return; - if (choice == JOptionPane.YES_OPTION) { - save(); - } - } - dispose(); - System.exit(0); - } catch (IOException ioe) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - } - } - }); - - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.addActivePatchChangedListener(new ActivePatchChangedListener () { - public void activePatchChanged(ActivePatchChangedEvent apce) { - document.setDirty(true); - saveItem.setEnabled(true); - } - }); - - mediator.addSettingsChangedListener(new SettingsChangedListener() { - public void settingsChanged(SettingsChangedEvent sce) { - document.setDirty(true); - saveItem.setEnabled(true); - } - }); - } - - private void load() { - try { - JFileChooser chooser = new JFileChooser(); - chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - chooser.setFileFilter(new FileFilter() { - - @Override - public boolean accept(File f) { - if (f.isDirectory()) - return true; - return (f.getPath().endsWith("paf")); - } - - @Override - public String getDescription() { - return "PatchAnim Files (*.paf)"; - } - }); - chooser.setCurrentDirectory(new File(System.getProperty("user.dir"))); - int option = chooser.showOpenDialog(JPatchAnimFrame.this); - if (option == JFileChooser.APPROVE_OPTION) { - documentLocation = chooser.getSelectedFile(); - document = PatchAnimIO.loadFile(documentLocation); - } - } catch (Exception e) { - JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); - documentLocation = null; - document = new PatchAnimDocument(); - } finally { - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.setDocument(document); - saveItem.setEnabled(false); - } - } - - private void saveAs() throws IOException { - JFileChooser chooser = new JFileChooser(); - chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - File defLocation; - if (documentLocation == null) - defLocation = new File(System.getProperty("user.dir")); - else - defLocation = documentLocation.getParentFile(); - - chooser.setCurrentDirectory(defLocation); - int option = chooser.showSaveDialog(JPatchAnimFrame.this); - if (option == JFileChooser.APPROVE_OPTION) { - String path = chooser.getSelectedFile().getPath(); - if (!path.toLowerCase().endsWith(".paf")) - path += ".paf"; - documentLocation = new File(path); - PatchAnimIO.saveFile(documentLocation, document); - documentLocation = chooser.getSelectedFile(); - document.setDirty(false); - saveItem.setEnabled(false); - } - } - - private void save() throws IOException { - PatchAnimIO.saveFile(documentLocation, document); - document.setDirty(false); - saveItem.setEnabled(false); - } - - private int askSave() { - ResourceBundle rb = PatchAnimBundle.getBundle(); - return JOptionPane.showConfirmDialog(JPatchAnimFrame.this, rb.getString(PatchAnimBundle.ASKSAVE), rb.getString(PatchAnimBundle.TITLE), JOptionPane.YES_NO_CANCEL_OPTION); - } - - private File getExportLocation(final ExportType type) { - final ResourceBundle rb = PatchAnimBundle.getBundle(); - JFileChooser chooser = new JFileChooser(); - chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - File defLocation; - if (documentLocation == null) - defLocation = new File(System.getProperty("user.dir")); - else - defLocation = documentLocation.getParentFile(); - chooser.setCurrentDirectory(defLocation); - - if (!type.isMultipleFiles()) { - chooser.setFileFilter(new FileFilter() { - - @Override - public boolean accept(File f) { - return (f.isDirectory() || f.getPath().toLowerCase().endsWith("." + type.getExtension())); - } - - @Override - public String getDescription() { - return rb.getString(type.getDescriptionKey()); - } - }); - } - - int option = chooser.showSaveDialog(JPatchAnimFrame.this); - if (option != JFileChooser.APPROVE_OPTION) - return null; - - return chooser.getSelectedFile(); - } -} - +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.IOException; +import java.util.ResourceBundle; + +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.filechooser.FileFilter; + +import com.mebigfatguy.patchanim.ExportType; +import com.mebigfatguy.patchanim.PatchAnimDocument; +import com.mebigfatguy.patchanim.gui.events.ActivePatchChangedEvent; +import com.mebigfatguy.patchanim.gui.events.ActivePatchChangedListener; +import com.mebigfatguy.patchanim.gui.events.SettingsChangedEvent; +import com.mebigfatguy.patchanim.gui.events.SettingsChangedListener; +import com.mebigfatguy.patchanim.io.PatchAnimIO; +import com.mebigfatguy.patchanim.io.PatchExporter; +import com.mebigfatguy.patchanim.main.PatchAnimBundle; + +public class JPatchAnimFrame extends JFrame { + + private static final long serialVersionUID = -4610407923936772733L; + + private JMenuItem newItem; + private JMenuItem openItem; + private JMenuItem saveItem; + private JMenuItem saveAsItem; + private JMenu exportMenu; + private JMenuItem exportJpgsItem; + private JMenuItem exportPngsItem; + private JMenuItem exportGifsItem; + private JMenuItem exportAnimatedGifItem; + private JMenuItem quitItem; + private PatchAnimDocument document; + private File documentLocation; + + public JPatchAnimFrame() { + initComponents(); + initMenus(); + initListeners(); + } + + private void initComponents() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout(4, 4)); + + JPatchAnimPanel patchPanel = new JPatchAnimPanel(); + document = new PatchAnimDocument(); + documentLocation = null; + PatchPanelMediator mediator = PatchPanelMediator.getMediator(); + mediator.setDocument(document); + + cp.add(patchPanel, BorderLayout.CENTER); + setTitle(rb.getString(PatchAnimBundle.TITLE)); + pack(); + } + + private void initMenus() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + JMenuBar mb = new JMenuBar(); + JMenu fileMenu = new JMenu(rb.getString(PatchAnimBundle.FILE)); + newItem = new JMenuItem(rb.getString(PatchAnimBundle.NEW)); + fileMenu.add(newItem); + openItem = new JMenuItem(rb.getString(PatchAnimBundle.OPEN)); + fileMenu.add(openItem); + fileMenu.addSeparator(); + saveItem = new JMenuItem(rb.getString(PatchAnimBundle.SAVE)); + saveItem.setEnabled(false); + fileMenu.add(saveItem); + saveAsItem = new JMenuItem(rb.getString(PatchAnimBundle.SAVEAS)); + fileMenu.add(saveAsItem); + fileMenu.addSeparator(); + exportMenu = new JMenu(rb.getString(PatchAnimBundle.EXPORT)); + exportJpgsItem = new JMenuItem(rb.getString(PatchAnimBundle.JPGSERIES)); + exportPngsItem = new JMenuItem(rb.getString(PatchAnimBundle.PNGSERIES)); + exportGifsItem = new JMenuItem(rb.getString(PatchAnimBundle.GIFSERIES)); + exportAnimatedGifItem = new JMenuItem(rb.getString(PatchAnimBundle.ANIMATEDGIF)); + exportMenu.add(exportJpgsItem); + exportMenu.add(exportPngsItem); + exportMenu.add(exportGifsItem); + exportMenu.addSeparator(); + exportMenu.add(exportAnimatedGifItem); + fileMenu.add(exportMenu); + fileMenu.addSeparator(); + quitItem = new JMenuItem(rb.getString(PatchAnimBundle.QUIT)); + fileMenu.add(quitItem); + + mb.add(fileMenu); + + setJMenuBar(mb); + } + + private void initListeners() { + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent we) { + try { + if (document.isDirty()) { + int choice = askSave(); + if (choice == JOptionPane.CANCEL_OPTION) + return; + if (choice == JOptionPane.YES_OPTION) { + save(); + } + } + dispose(); + System.exit(0); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + } + } + }); + + newItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + if (document.isDirty()) { + int choice = askSave(); + if (choice == JOptionPane.CANCEL_OPTION) + return; + if (choice == JOptionPane.YES_OPTION) { + save(); + } + } + + document = new PatchAnimDocument(); + documentLocation = null; + saveItem.setEnabled(false); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + } + } + }); + + openItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + if (document.isDirty()) { + int choice = askSave(); + if (choice == JOptionPane.CANCEL_OPTION) + return; + if (choice == JOptionPane.YES_OPTION) { + save(); + } + } + load(); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.LOADFAILED); + } + } + }); + + saveItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + if (documentLocation == null) { + saveAs(); + } else { + save(); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + } + } + }); + + saveAsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + saveAs(); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + } + } + }); + + exportJpgsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + File f = getExportLocation(ExportType.JPegs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.JPegs, f); + exporter.export(document); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + + exportPngsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + File f = getExportLocation(ExportType.Pngs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.Pngs, f); + exporter.export(document); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + + exportGifsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + File f = getExportLocation(ExportType.Gifs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.Gifs, f); + exporter.export(document); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + + exportAnimatedGifItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + File f = getExportLocation(ExportType.AnimatedGif); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.AnimatedGif, f); + exporter.export(document); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + + quitItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + if (document.isDirty()) { + int choice = askSave(); + if (choice == JOptionPane.CANCEL_OPTION) + return; + if (choice == JOptionPane.YES_OPTION) { + save(); + } + } + dispose(); + System.exit(0); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + } + } + }); + + PatchPanelMediator mediator = PatchPanelMediator.getMediator(); + mediator.addActivePatchChangedListener(new ActivePatchChangedListener () { + public void activePatchChanged(ActivePatchChangedEvent apce) { + document.setDirty(true); + saveItem.setEnabled(true); + } + }); + + mediator.addSettingsChangedListener(new SettingsChangedListener() { + public void settingsChanged(SettingsChangedEvent sce) { + document.setDirty(true); + saveItem.setEnabled(true); + } + }); + } + + private void load() { + try { + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setFileFilter(new FileFilter() { + + @Override + public boolean accept(File f) { + if (f.isDirectory()) + return true; + return (f.getPath().endsWith("paf")); + } + + @Override + public String getDescription() { + return "PatchAnim Files (*.paf)"; + } + }); + chooser.setCurrentDirectory(new File(System.getProperty("user.dir"))); + int option = chooser.showOpenDialog(JPatchAnimFrame.this); + if (option == JFileChooser.APPROVE_OPTION) { + documentLocation = chooser.getSelectedFile(); + document = PatchAnimIO.loadFile(documentLocation); + } + } catch (Exception e) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.SAVEFAILED); + documentLocation = null; + document = new PatchAnimDocument(); + } finally { + PatchPanelMediator mediator = PatchPanelMediator.getMediator(); + mediator.setDocument(document); + saveItem.setEnabled(false); + } + } + + private void saveAs() throws IOException { + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + File defLocation; + if (documentLocation == null) + defLocation = new File(System.getProperty("user.dir")); + else + defLocation = documentLocation.getParentFile(); + + chooser.setCurrentDirectory(defLocation); + int option = chooser.showSaveDialog(JPatchAnimFrame.this); + if (option == JFileChooser.APPROVE_OPTION) { + String path = chooser.getSelectedFile().getPath(); + if (!path.toLowerCase().endsWith(".paf")) + path += ".paf"; + documentLocation = new File(path); + PatchAnimIO.saveFile(documentLocation, document); + documentLocation = chooser.getSelectedFile(); + document.setDirty(false); + saveItem.setEnabled(false); + } + } + + private void save() throws IOException { + PatchAnimIO.saveFile(documentLocation, document); + document.setDirty(false); + saveItem.setEnabled(false); + } + + private int askSave() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + return JOptionPane.showConfirmDialog(JPatchAnimFrame.this, rb.getString(PatchAnimBundle.ASKSAVE), rb.getString(PatchAnimBundle.TITLE), JOptionPane.YES_NO_CANCEL_OPTION); + } + + private File getExportLocation(final ExportType type) { + final ResourceBundle rb = PatchAnimBundle.getBundle(); + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + File defLocation; + if (documentLocation == null) + defLocation = new File(System.getProperty("user.dir")); + else + defLocation = documentLocation.getParentFile(); + chooser.setCurrentDirectory(defLocation); + + if (!type.isMultipleFiles()) { + chooser.setFileFilter(new FileFilter() { + + @Override + public boolean accept(File f) { + return (f.isDirectory() || f.getPath().toLowerCase().endsWith("." + type.getExtension())); + } + + @Override + public String getDescription() { + return rb.getString(type.getDescriptionKey()); + } + }); + } + + int option = chooser.showSaveDialog(JPatchAnimFrame.this); + if (option != JFileChooser.APPROVE_OPTION) + return null; + + return chooser.getSelectedFile(); + } +} + Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java 2008-01-30 01:46:25 UTC (rev 64) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java 2008-01-30 01:49:46 UTC (rev 65) @@ -1,84 +1,84 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.awt.BorderLayout; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JPanel; - -import com.mebigfatguy.patchanim.PatchColor; - -public class JPatchAnimPanel extends JPanel { - - private static final long serialVersionUID = 7719900566976553103L; - private JPatchControlPanel ctrl; - private JPatchSamplePanel sample; - - public JPatchAnimPanel() { - initComponents(); - } - - private void initComponents() { - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - JPanel p = new JPanel(); - p.setLayout(new BorderLayout(4, 4)); - ctrl = new JPatchControlPanel(); - p.add(ctrl, BorderLayout.WEST); - sample = new JPatchSamplePanel(PatchColor.Combined); - JPanel q = new JPanel(); - q.setLayout(new BoxLayout(q, BoxLayout.X_AXIS)); - q.add(Box.createHorizontalGlue()); - q.add(sample); - q.add(Box.createHorizontalGlue()); - q.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - p.add(q, BorderLayout.CENTER); - add(p); - - - p = new JPanel(); - p.setLayout(new BorderLayout(4, 4)); - p.add(new JPatchListPanel(), BorderLayout.WEST); - - q = new JPanel(); - { - q.setLayout(new BoxLayout(q, BoxLayout.X_AXIS)); - JColorControlPatchPanel redPatch = new JColorControlPatchPanel(PatchColor.Red); - JColorControlPatchPanel greenPatch = new JColorControlPatchPanel(PatchColor.Green); - JColorControlPatchPanel bluePatch = new JColorControlPatchPanel(PatchColor.Blue); - - q.add(Box.createHorizontalGlue()); - q.add(redPatch); - q.add(Box.createHorizontalStrut(10)); - q.add(greenPatch); - q.add(Box.createHorizontalStrut(10)); - q.add(bluePatch); - q.add(Box.createHorizontalGlue()); - } - - p.add(q, BorderLayout.CENTER); - - p.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - - add(p); - setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - } -} +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.awt.BorderLayout; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JPanel; + +import com.mebigfatguy.patchanim.PatchColor; + +public class JPatchAnimPanel extends JPanel { + + private static final long serialVersionUID = 7719900566976553103L; + private JPatchControlPanel ctrl; + private JPatchSamplePanel sample; + + public JPatchAnimPanel() { + initComponents(); + } + + private void initComponents() { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + JPanel p = new JPanel(); + p.setLayout(new BorderLayout(4, 4)); + ctrl = new JPatchControlPanel(); + p.add(ctrl, BorderLayout.WEST); + sample = new JPatchSamplePanel(PatchColor.Combined); + JPanel q = new JPanel(); + q.setLayout(new BoxLayout(q, BoxLayout.X_AXIS)); + q.add(Box.createHorizontalGlue()); + q.add(sample); + q.add(Box.createHorizontalGlue()); + q.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + p.add(q, BorderLayout.CENTER); + add(p); + + + p = new JPanel(); + p.setLayout(new BorderLayout(4, 4)); + p.add(new JPatchListPanel(), BorderLayout.WEST); + + q = new JPanel(); + { + q.setLayout(new BoxLayout(q, BoxLayout.X_AXIS)); + JColorControlPatchPanel redPatch = new JColorControlPatchPanel(PatchColor.Red); + JColorControlPatchPanel greenPatch = new JColorControlPatchPanel(PatchColor.Green); + JColorControlPatchPanel bluePatch = new JColorControlPatchPanel(PatchColor.Blue); + + q.add(Box.createHorizontalGlue()); + q.add(redPatch); + q.add(Box.createHorizontalStrut(10)); + q.add(greenPatch); + q.add(Box.createHorizontalStrut(10)); + q.add(bluePatch); + q.add(Box.createHorizontalGlue()); + } + + p.add(q, BorderLayout.CENTER); + + p.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + + add(p); + setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + } +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimPanel.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchControlPanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchControlPanel.java 2008-01-30 01:46:25 UTC (rev 64) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchControlPanel.java 2008-01-30 01:49:46 UTC (rev 65) @@ -1,231 +1,233 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ResourceBundle; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; - -import com.mebigfatguy.patchanim.AnimationType; -import com.mebigfatguy.patchanim.OutOfBoundsColor; -import com.mebigfatguy.patchanim.PatchAnimDocument; -import com.mebigfatguy.patchanim.main.PatchAnimBundle; - -public class JPatchControlPanel extends JPanel { - - private static final long serialVersionUID = -5968231995166721151L; - - private PatchAnimDocument document; - private JTextField widthField; - private JTextField heightField; - private JComboBox animationCB; - private JComboBox outOfBoundsColorCB; - private JTextField tweenFramesField; - private JButton testButton; - - public JPatchControlPanel() { - initComponents(); - initListeners(); - } - - private void initComponents() { - ResourceBundle rb = PatchAnimBundle.getBundle(); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - setBorder(BorderFactory.createTitledBorder(rb.getString(PatchAnimBundle.CONTROLS))); - - JLabel widthLabel; - JLabel heightLabel; - JLabel animationLabel; - JLabel outOfBoundsLabel; - JLabel tweenFramesLabel; - - { - widthLabel = new JLabel(rb.getString(PatchAnimBundle.WIDTH)); - widthField = new JTextField(new IntegerDocument(), "", 8); - widthLabel.setLabelFor(widthField); - JPanel p = Utils.createFormPanel(widthLabel, widthField); - - Utils.limitPanelHeight(p, widthField); - add(p); - } - add(Box.createVerticalStrut(5)); - { - heightLabel = new JLabel(rb.getString(PatchAnimBundle.HEIGHT)); - heightField = new JTextField(new IntegerDocument(), "", 8); - heightLabel.setLabelFor(heightField); - JPanel p = Utils.createFormPanel(heightLabel, heightField); - - Utils.limitPanelHeight(p, heightField); - add(p); - } - add(Box.createVerticalStrut(5)); - { - animationLabel = new JLabel(rb.getString(PatchAnimBundle.ANIMATION)); - animationCB = new JComboBox(new Object[] { AnimationType.None, - AnimationType.Cycle, - AnimationType.Wave }); - animationLabel.setLabelFor(animationCB); - JPanel p = Utils.createFormPanel(animationLabel, animationCB); - - Utils.limitPanelHeight(p, animationCB); - add(p); - } - add(Box.createVerticalStrut(5)); - { - outOfBoundsLabel = new JLabel(rb.getString(PatchAnimBundle.OUTOFBOUNDSCOLOR)); - outOfBoundsColorCB = new JComboBox(new Object[] { OutOfBoundsColor.Clip, - OutOfBoundsColor.Roll }); - outOfBoundsLabel.setLabelFor(outOfBoundsColorCB); - JPanel p = Utils.createFormPanel(outOfBoundsLabel, outOfBoundsColorCB); - Utils.limitPanelHeight(p, outOfBoundsColorCB); - add(p); - } - add(Box.createVerticalStrut(5)); - { - tweenFramesLabel = new JLabel(rb.getString(PatchAnimBundle.TWEENFRAMES)); - tweenFramesField = new JTextField(new IntegerDocument(), "", 8); - tweenFramesLabel.setLabelFor(tweenFramesField); - JPanel p = Utils.createFormPanel(tweenFramesLabel, tweenFramesField); - Utils.limitPanelHeight(p, tweenFramesField); - add(p); - } - add(Box.createVerticalStrut(5)); - - testButton = new JButton(rb.getString(PatchAnimBundle.TEST)); - add(testButton); - - Utils.sizeUniformly(new JComponent[] { widthLabel, heightLabel, animationLabel, outOfBoundsLabel, tweenFramesLabel }, Utils.Sizing.Both); - Utils.sizeUniformly(new JComponent[] { widthField, heightField, animationCB, outOfBoundsColorCB, tweenFramesField }, Utils.Sizing.Width); - - add(Box.createVerticalGlue()); - - Dimension d = getPreferredSize(); - if (d.width < 200) - d.width = 200; - setPreferredSize(d); - } - - private void initListeners() { - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.addDocumentChangedListener(new DocumentChangedListener() { - public void documentChanged(DocumentChangedEvent dce) { - document = dce.getDocument(); - SwingUtilities.invokeLater(new Runnable() { - public void run() { - widthField.setText(String.valueOf(document.getWidth())); - heightField.setText(String.valueOf(document.getHeight())); - animationCB.setSelectedIndex(document.getAnimationType().ordinal()); - outOfBoundsColorCB.setSelectedIndex(document.getOutOfBoundsColor().ordinal()); - tweenFramesField.setText(String.valueOf(document.getTweenCount())); - } - }); - } - }); - - widthField.addFocusListener(new FocusAdapter() { - - @Override - public void focusLost(FocusEvent arg0) { - try { - document.setWidth(Integer.parseInt(widthField.getText())); - } catch (NumberFormatException nfe) { - document.setWidth(0); - } - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.fireSettingsChanged(); - } - }); - - - heightField.addFocusListener(new FocusAdapter() { - - @Override - public void focusLost(FocusEvent arg0) { - try { - document.setHeight(Integer.parseInt(heightField.getText())); - } catch (NumberFormatException nfe) { - document.setHeight(0); - } - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.fireSettingsChanged(); - } - }); - - tweenFramesField.addFocusListener(new FocusAdapter() { - - @Override - public void focusLost(FocusEvent arg0) { - try { - document.setTweenCount(Integer.parseInt(tweenFramesField.getText())); - } catch (NumberFormatException nfe) { - document.setTweenCount(0); - } - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.fireSettingsChanged(); - } - }); - - animationCB.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent ie) { - if (ie.getStateChange() == ItemEvent.SELECTED) { - document.setAnimationType((AnimationType)ie.getItem()); - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.fireSettingsChanged(); - } - } - }); - - outOfBoundsColorCB.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent ie) { - if (ie.getStateChange() == ItemEvent.SELECTED) { - document.setOutOfBoundsColor((OutOfBoundsColor)ie.getItem()); - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.fireSettingsChanged(); - } - } - }); - - testButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - JTestFrame tf = new JTestFrame(); - tf.setLocationRelativeTo(null); - tf.setVisible(true); - tf.beginAnimation(); - } - }); - } -} +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ResourceBundle; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; + +import com.mebigfatguy.patchanim.AnimationType; +import com.mebigfatguy.patchanim.OutOfBoundsColor; +import com.mebigfatguy.patchanim.PatchAnimDocument; +import com.mebigfatguy.patchanim.gui.events.DocumentChangedEvent; +import com.mebigfatguy.patchanim.gui.events.DocumentChangedListener; +import com.mebigfatguy.patchanim.main.PatchAnimBundle; + +public class JPatchControlPanel extends JPanel { + + private static final long serialVersionUID = -5968231995166721151L; + + private PatchAnimDocument document; + private JTextField widthField; + private JTextField heightField; + private JComboBox animationCB; + private JComboBox outOfBoundsColorCB; + private JTextField tweenFramesField; + private JButton testButton; + + public JPatchControlPanel() { + initComponents(); + initListeners(); + } + + private void initComponents() { + ResourceBundle rb = PatchAnimBundle.getBundle(); + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBorder(BorderFactory.createTitledBorder(rb.getString(PatchAnimBundle.CONTROLS))); + + JLabel widthLabel; + JLabel heightLabel; + JLabel animationLabel; + JLabel outOfBoundsLabel; + JLabel tweenFramesLabel; + + { + widthLabel = new JLabel(rb.getString(PatchAnimBundle.WIDTH)); + widthField = new JTextField(new IntegerDocument(), "", 8); + widthLabel.setLabelFor(widthField); + JPanel p = Utils.createFormPanel(widthLabel, widthField); + + Utils.limitPanelHeight(p, widthField); + add(p); + } + add(Box.createVerticalStrut(5)); + { + heightLabel = new JLabel(rb.getString(PatchAnimBundle.HEIGHT)); + heightField = new JTextField(new IntegerDocument(), "", 8); + heightLabel.setLabelFor(heightField); + JPanel p = Utils.createFormPanel(heightLabel, heightField); + + Utils.limitPanelHeight(p, heightField); + add(p); + } + add(Box.createVerticalStrut(5)); + { + an... [truncated message content] |
From: <dbr...@us...> - 2008-01-30 01:46:20
|
Revision: 64 http://patchanim.svn.sourceforge.net/patchanim/?rev=64&view=rev Author: dbrosius Date: 2008-01-29 17:46:25 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedListener.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedListener.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedListener.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedListener.java 2008-01-30 01:46:08 UTC (rev 63) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedListener.java 2008-01-30 01:46:25 UTC (rev 64) @@ -1,23 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -public interface SettingsChangedListener { - void settingsChanged(SettingsChangedEvent sce); -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedListener.java (from rev 63, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedListener.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedListener.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedListener.java 2008-01-30 01:46:25 UTC (rev 64) @@ -0,0 +1,23 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +public interface SettingsChangedListener { + void settingsChanged(SettingsChangedEvent sce); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:46:04
|
Revision: 63 http://patchanim.svn.sourceforge.net/patchanim/?rev=63&view=rev Author: dbrosius Date: 2008-01-29 17:46:08 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedEvent.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedEvent.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedEvent.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedEvent.java 2008-01-30 01:45:51 UTC (rev 62) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedEvent.java 2008-01-30 01:46:08 UTC (rev 63) @@ -1,38 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.util.EventObject; - -import com.mebigfatguy.patchanim.PatchAnimDocument; - -public class SettingsChangedEvent extends EventObject { - private static final long serialVersionUID = 2005167344637800832L; - - private PatchAnimDocument doc; - - public SettingsChangedEvent(Object src, PatchAnimDocument document) { - super(src); - doc = document; - } - - public PatchAnimDocument getDocument() { - return doc; - } -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedEvent.java (from rev 62, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/SettingsChangedEvent.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedEvent.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/SettingsChangedEvent.java 2008-01-30 01:46:08 UTC (rev 63) @@ -0,0 +1,38 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.util.EventObject; + +import com.mebigfatguy.patchanim.PatchAnimDocument; + +public class SettingsChangedEvent extends EventObject { + private static final long serialVersionUID = 2005167344637800832L; + + private PatchAnimDocument doc; + + public SettingsChangedEvent(Object src, PatchAnimDocument document) { + super(src); + doc = document; + } + + public PatchAnimDocument getDocument() { + return doc; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:45:53
|
Revision: 62 http://patchanim.svn.sourceforge.net/patchanim/?rev=62&view=rev Author: dbrosius Date: 2008-01-29 17:45:51 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedListener.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedListener.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedListener.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedListener.java 2008-01-30 01:45:33 UTC (rev 61) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedListener.java 2008-01-30 01:45:51 UTC (rev 62) @@ -1,23 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -public interface DocumentChangedListener { - void documentChanged(DocumentChangedEvent dce); -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedListener.java (from rev 61, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedListener.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedListener.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedListener.java 2008-01-30 01:45:51 UTC (rev 62) @@ -0,0 +1,23 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +public interface DocumentChangedListener { + void documentChanged(DocumentChangedEvent dce); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:45:30
|
Revision: 61 http://patchanim.svn.sourceforge.net/patchanim/?rev=61&view=rev Author: dbrosius Date: 2008-01-29 17:45:33 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedEvent.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedEvent.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedEvent.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedEvent.java 2008-01-30 01:45:12 UTC (rev 60) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedEvent.java 2008-01-30 01:45:33 UTC (rev 61) @@ -1,38 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.util.EventObject; - -import com.mebigfatguy.patchanim.PatchAnimDocument; - -public class DocumentChangedEvent extends EventObject { - private static final long serialVersionUID = 7694516648407911200L; - - private PatchAnimDocument document; - - public DocumentChangedEvent(Object src, PatchAnimDocument d) { - super(src); - document = d; - } - - public PatchAnimDocument getDocument() { - return document; - } -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedEvent.java (from rev 60, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/DocumentChangedEvent.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedEvent.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/DocumentChangedEvent.java 2008-01-30 01:45:33 UTC (rev 61) @@ -0,0 +1,38 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.util.EventObject; + +import com.mebigfatguy.patchanim.PatchAnimDocument; + +public class DocumentChangedEvent extends EventObject { + private static final long serialVersionUID = 7694516648407911200L; + + private PatchAnimDocument document; + + public DocumentChangedEvent(Object src, PatchAnimDocument d) { + super(src); + document = d; + } + + public PatchAnimDocument getDocument() { + return document; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:45:07
|
Revision: 60 http://patchanim.svn.sourceforge.net/patchanim/?rev=60&view=rev Author: dbrosius Date: 2008-01-29 17:45:12 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedListener.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedListener.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedListener.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedListener.java 2008-01-30 01:44:54 UTC (rev 59) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedListener.java 2008-01-30 01:45:12 UTC (rev 60) @@ -1,23 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -public interface ActivePatchChangedListener { - void activePatchChanged(ActivePatchChangedEvent apce); -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedListener.java (from rev 59, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedListener.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedListener.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedListener.java 2008-01-30 01:45:12 UTC (rev 60) @@ -0,0 +1,23 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +public interface ActivePatchChangedListener { + void activePatchChanged(ActivePatchChangedEvent apce); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:44:49
|
Revision: 59 http://patchanim.svn.sourceforge.net/patchanim/?rev=59&view=rev Author: dbrosius Date: 2008-01-29 17:44:54 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Move listeners/event objects to separate package Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedEvent.java Removed Paths: ------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedEvent.java Deleted: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedEvent.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedEvent.java 2008-01-30 01:37:31 UTC (rev 58) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedEvent.java 2008-01-30 01:44:54 UTC (rev 59) @@ -1,38 +0,0 @@ -/* - * patchanim - A bezier surface patch color blend gif builder - * Copyright (C) 2008 Dave Brosius - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.mebigfatguy.patchanim.gui; - -import java.util.EventObject; - -import com.mebigfatguy.patchanim.surface.CombinedPatch; - -public class ActivePatchChangedEvent extends EventObject { - private static final long serialVersionUID = -6329025951907079541L; - - private CombinedPatch patch; - - public ActivePatchChangedEvent(Object src, CombinedPatch activePatch) { - super(src); - patch = activePatch; - } - - public CombinedPatch getActivePatch() { - return patch; - } -} Copied: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedEvent.java (from rev 58, trunk/patchanim/src/com/mebigfatguy/patchanim/gui/ActivePatchChangedEvent.java) =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedEvent.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ActivePatchChangedEvent.java 2008-01-30 01:44:54 UTC (rev 59) @@ -0,0 +1,38 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.gui; + +import java.util.EventObject; + +import com.mebigfatguy.patchanim.surface.CombinedPatch; + +public class ActivePatchChangedEvent extends EventObject { + private static final long serialVersionUID = -6329025951907079541L; + + private CombinedPatch patch; + + public ActivePatchChangedEvent(Object src, CombinedPatch activePatch) { + super(src); + patch = activePatch; + } + + public CombinedPatch getActivePatch() { + return patch; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:37:26
|
Revision: 58 http://patchanim.svn.sourceforge.net/patchanim/?rev=58&view=rev Author: dbrosius Date: 2008-01-29 17:37:31 -0800 (Tue, 29 Jan 2008) Log Message: ----------- a package for listeners and event objects Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/events/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 01:34:30
|
Revision: 57 http://patchanim.svn.sourceforge.net/patchanim/?rev=57&view=rev Author: dbrosius Date: 2008-01-29 17:34:35 -0800 (Tue, 29 Jan 2008) Log Message: ----------- break out export routines to another class, fix the add scroll button Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties Added Paths: ----------- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java 2008-01-30 00:59:16 UTC (rev 56) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java 2008-01-30 01:34:35 UTC (rev 57) @@ -1,18 +1,22 @@ package com.mebigfatguy.patchanim; +import com.mebigfatguy.patchanim.main.PatchAnimBundle; + public enum ExportType { - JPegs("jpg", true), - Pngs("png", true), - Gifs("gif", true), - AnimatedGif("gif", false), - MPeg("mpg", false); + JPegs("jpg", true, PatchAnimBundle.JPGSERIESFILTER), + Pngs("png", true, PatchAnimBundle.PNGSERIESFILTER), + Gifs("gif", true, PatchAnimBundle.GIFSERIESFILTER), + AnimatedGif("gif", false, PatchAnimBundle.ANIMATEDGIFFILTER), + MPeg("mpeg", false, PatchAnimBundle.MPEGFILTER); private String ext; private boolean multi; + private String key; - private ExportType(String extension, boolean multipleFiles) { + private ExportType(String extension, boolean multipleFiles, String descriptionKey) { ext = extension; multi = multipleFiles; + key = descriptionKey; } public String getExtension() { @@ -22,4 +26,8 @@ public boolean isMultipleFiles() { return multi; } + + public String getDescriptionKey() { + return key; + } } Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 00:59:16 UTC (rev 56) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 01:34:35 UTC (rev 57) @@ -46,6 +46,7 @@ import com.mebigfatguy.patchanim.OutOfBoundsColor; import com.mebigfatguy.patchanim.PatchAnimDocument; import com.mebigfatguy.patchanim.io.PatchAnimIO; +import com.mebigfatguy.patchanim.io.PatchExporter; import com.mebigfatguy.patchanim.main.PatchAnimBundle; import com.mebigfatguy.patchanim.surface.CombinedPatch; import com.mebigfatguy.patchanim.surface.PatchGenerator; @@ -66,9 +67,7 @@ private JMenuItem quitItem; private PatchAnimDocument document; private File documentLocation; - private AnimatedGifEncoder agEncoder = null; - public JPatchAnimFrame() { initComponents(); initMenus(); @@ -213,7 +212,11 @@ exportJpgsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { - exportFiles(ExportType.JPegs); + File f = getExportLocation(ExportType.JPegs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.JPegs, f); + exporter.export(document); + } } catch (IOException ioe) { JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); } @@ -223,7 +226,11 @@ exportPngsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { - exportFiles(ExportType.Pngs); + File f = getExportLocation(ExportType.Pngs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.Pngs, f); + exporter.export(document); + } } catch (IOException ioe) { JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); } @@ -233,7 +240,11 @@ exportGifsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { - exportFiles(ExportType.Gifs); + File f = getExportLocation(ExportType.Gifs); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.Gifs, f); + exporter.export(document); + } } catch (IOException ioe) { JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); } @@ -243,7 +254,11 @@ exportAnimatedGifItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { - exportFiles(ExportType.AnimatedGif); + File f = getExportLocation(ExportType.AnimatedGif); + if (f != null) { + PatchExporter exporter = new PatchExporter(ExportType.AnimatedGif, f); + exporter.export(document); + } } catch (IOException ioe) { JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); } @@ -354,7 +369,8 @@ return JOptionPane.showConfirmDialog(JPatchAnimFrame.this, rb.getString(PatchAnimBundle.ASKSAVE), rb.getString(PatchAnimBundle.TITLE), JOptionPane.YES_NO_CANCEL_OPTION); } - private void exportFiles(ExportType type) throws IOException { + private File getExportLocation(final ExportType type) { + final ResourceBundle rb = PatchAnimBundle.getBundle(); JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); File defLocation; @@ -362,85 +378,28 @@ defLocation = new File(System.getProperty("user.dir")); else defLocation = documentLocation.getParentFile(); - chooser.setCurrentDirectory(defLocation); - int option = chooser.showSaveDialog(JPatchAnimFrame.this); - if (option != JFileChooser.APPROVE_OPTION) - return; - File dir = chooser.getSelectedFile(); - String baseName = dir.getName(); - if (type.isMultipleFiles()) { - dir.mkdir(); - } else { - dir = dir.getParentFile(); - String dotExt = "." + type.getExtension(); - if (!baseName.endsWith(dotExt)) - baseName = baseName + dotExt; - if (type == ExportType.AnimatedGif) { - agEncoder = new AnimatedGifEncoder(); - agEncoder.start(new File(dir, baseName).getPath()); - } - } + if (!type.isMultipleFiles()) { + chooser.setFileFilter(new FileFilter() { - BufferedImage image = PatchGenerator.buildImage(null, document.getWidth(), document.getHeight()); - - List<CombinedPatch> patches = document.getPatches(); - int lastPatch = patches.size() - 1; - int tweenCount = document.getTweenCount(); - OutOfBoundsColor oob = document.getOutOfBoundsColor(); - int imageIndex = 1; - AnimationType atype = document.getAnimationType(); - - for(int p = 0; p < lastPatch; p++) { - CombinedPatch startPatch = patches.get(p); - CombinedPatch endPatch = patches.get(p+1); - for (int t = 0; t < tweenCount; t++) { - CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); - PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); - writeSingleFile(image, imageIndex++, dir, baseName, type); - } - } - - if (atype == AnimationType.None) - return; - - if (atype == AnimationType.Wave) { - for (int p = lastPatch; p > 0; p--) { - CombinedPatch startPatch = patches.get(p-1); - CombinedPatch endPatch = patches.get(p); - for (int t = tweenCount - 1; t >= 0; t--) { - CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); - PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); - writeSingleFile(image, imageIndex++, dir, baseName, type); + @Override + public boolean accept(File f) { + return (f.isDirectory() || f.getPath().toLowerCase().endsWith("." + type.getExtension())); } - } + + @Override + public String getDescription() { + return rb.getString(type.getDescriptionKey()); + } + }); } - if (type == ExportType.AnimatedGif) { - agEncoder.finish(); - agEncoder = null; - } + int option = chooser.showSaveDialog(JPatchAnimFrame.this); + if (option != JFileChooser.APPROVE_OPTION) + return null; + + return chooser.getSelectedFile(); } - - private void writeSingleFile(BufferedImage image, int index, File dir, String baseName, ExportType type) throws IOException { - NumberFormat nf = NumberFormat.getIntegerInstance(); - nf.setMinimumIntegerDigits(6); - String name = baseName + "_" + nf.format(index) + "." + type.getExtension(); - - File imageFile = new File(dir, name); - - if (type == ExportType.Gifs) { - AnimatedGifEncoder encoder = new AnimatedGifEncoder(); - encoder.start(imageFile.getPath()); - encoder.addFrame(image); - encoder.finish(); - } else if (type == ExportType.AnimatedGif) { - agEncoder.addFrame(image); - agEncoder.setDelay(100); - } - else - ImageIO.write(image, type.getExtension(), imageFile); - } } Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java 2008-01-30 00:59:16 UTC (rev 56) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchListPanel.java 2008-01-30 01:34:35 UTC (rev 57) @@ -96,14 +96,14 @@ public void actionPerformed(ActionEvent ae) { int selIndex = patchList.getSelectedIndex(); if (selIndex < 0) - selIndex = patchListModel.getSize() - 1; + selIndex = patchListModel.getSize(); + else + selIndex++; CombinedPatch newPatch = new CombinedPatch(true); patchListModel.add(selIndex, newPatch); - PatchPanelMediator mediator = PatchPanelMediator.getMediator(); - mediator.setNewActivePatch(newPatch); + patchList.setSelectedIndex(selIndex); removeButton.setEnabled(patchListModel.getSize() > 1); - patchList.setSelectedIndex(selIndex); } }); Added: trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java 2008-01-30 01:34:35 UTC (rev 57) @@ -0,0 +1,125 @@ +/* + * patchanim - A bezier surface patch color blend gif builder + * Copyright (C) 2008 Dave Brosius + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.mebigfatguy.patchanim.io; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.List; + +import javax.imageio.ImageIO; + +import com.fmsware.gif.AnimatedGifEncoder; +import com.mebigfatguy.patchanim.AnimationType; +import com.mebigfatguy.patchanim.ExportType; +import com.mebigfatguy.patchanim.OutOfBoundsColor; +import com.mebigfatguy.patchanim.PatchAnimDocument; +import com.mebigfatguy.patchanim.surface.CombinedPatch; +import com.mebigfatguy.patchanim.surface.PatchGenerator; + +public class PatchExporter { + private ExportType type; + private File loc; + private AnimatedGifEncoder agEncoder; + + public PatchExporter(ExportType exportType, File location) { + type = exportType; + loc = location; + if (type == ExportType.AnimatedGif) + agEncoder = new AnimatedGifEncoder(); + else + agEncoder = null; + } + + public void export(PatchAnimDocument document) throws IOException { + try { + String baseName = loc.getName(); + if (type.isMultipleFiles()) { + loc.mkdir(); + } else { + loc = loc.getParentFile(); + String dotExt = "." + type.getExtension(); + if (!baseName.toLowerCase().endsWith(dotExt)) + baseName = baseName + dotExt; + if (type == ExportType.AnimatedGif) + agEncoder.start(new File(loc, baseName).getPath()); + } + + BufferedImage image = PatchGenerator.buildImage(null, document.getWidth(), document.getHeight()); + + List<CombinedPatch> patches = document.getPatches(); + int lastPatch = patches.size() - 1; + int tweenCount = document.getTweenCount(); + OutOfBoundsColor oob = document.getOutOfBoundsColor(); + int imageIndex = 1; + AnimationType atype = document.getAnimationType(); + + for(int p = 0; p < lastPatch; p++) { + CombinedPatch startPatch = patches.get(p); + CombinedPatch endPatch = patches.get(p+1); + for (int t = 0; t < tweenCount; t++) { + CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); + PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); + writeSingleFile(image, imageIndex++, loc, baseName, type); + } + } + + if (atype == AnimationType.None) + return; + + if (atype == AnimationType.Wave) { + for (int p = lastPatch; p > 0; p--) { + CombinedPatch startPatch = patches.get(p-1); + CombinedPatch endPatch = patches.get(p); + for (int t = tweenCount - 1; t >= 0; t--) { + CombinedPatch tweenPatch = CombinedPatch.tween(startPatch, endPatch, (double)t / (double)tweenCount); + PatchGenerator.recalcCombinedImage(tweenPatch, image, oob); + writeSingleFile(image, imageIndex++, loc, baseName, type); + } + } + } + } finally { + if (type == ExportType.AnimatedGif) { + agEncoder.finish(); + } + } + } + + private void writeSingleFile(BufferedImage image, int index, File dir, String baseName, ExportType type) throws IOException { + NumberFormat nf = NumberFormat.getIntegerInstance(); + nf.setMinimumIntegerDigits(6); + String name = baseName + "_" + nf.format(index) + "." + type.getExtension(); + + File imageFile = new File(dir, name); + + if (type == ExportType.Gifs) { + AnimatedGifEncoder encoder = new AnimatedGifEncoder(); + encoder.start(imageFile.getPath()); + encoder.addFrame(image); + encoder.finish(); + } else if (type == ExportType.AnimatedGif) { + agEncoder.addFrame(image); + agEncoder.setDelay(100); + } + else + ImageIO.write(image, type.getExtension(), imageFile); + } + +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/io/PatchExporter.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-30 00:59:16 UTC (rev 56) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-30 01:34:35 UTC (rev 57) @@ -31,9 +31,15 @@ public static final String SAVEAS = "patchanim.saveas"; public static final String EXPORT = "patchanim.export"; public static final String JPGSERIES = "patchanim.jpgs"; + public static final String JPGSERIESFILTER = "patchanim.filter.jpgs"; public static final String PNGSERIES = "patchanim.pngs"; + public static final String PNGSERIESFILTER = "patchanim.filter.pngs"; public static final String GIFSERIES = "patchanim.gifs"; + public static final String GIFSERIESFILTER = "patchanim.filter.gifs"; public static final String ANIMATEDGIF = "patchanim.animatedgif"; + public static final String ANIMATEDGIFFILTER = "patchanim.filter.animatedgif"; + public static final String MPEG = "patchanim.mpeg"; + public static final String MPEGFILTER = "patchanim.filter.mpeg"; public static final String QUIT = "patchanim.quit"; public static final String CONTROLS = "patchanim.control"; public static final String WIDTH = "patchanim.width"; Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-30 00:59:16 UTC (rev 56) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-30 01:34:35 UTC (rev 57) @@ -24,9 +24,15 @@ patchanim.saveas = Save As... patchanim.export = Export As... patchanim.jpgs = a series of JPGs +patchanim.filter.jpgs = Files (*.jpg) patchanim.pngs = a series of PNGs +patchanim.filter.pnga = Png Files (*.png) patchanim.gifs = a series of GIFs +patchanim.filter.gifs = Gif Files (*.gif) patchanim.animatedgif = an Animated Gif +patchanim.filter.animatedgif = Gif Files (*.gif) +patchanim.mpeg = an MPEG +patchanim.filter.mpeg = MPEG Files (*.mpg) patchanim.quit = Quit patchanim.control = Controls patchanim.width = Width This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dbr...@us...> - 2008-01-30 00:59:20
|
Revision: 56 http://patchanim.svn.sourceforge.net/patchanim/?rev=56&view=rev Author: dbrosius Date: 2008-01-29 16:59:16 -0800 (Tue, 29 Jan 2008) Log Message: ----------- implement with the help of o/s, animated gifs Modified Paths: -------------- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties Added Paths: ----------- trunk/patchanim/src/com/fmsware/ trunk/patchanim/src/com/fmsware/gif/ trunk/patchanim/src/com/fmsware/gif/AnimatedGifEncoder.java trunk/patchanim/src/com/fmsware/gif/LZWEncoder.java trunk/patchanim/src/com/fmsware/gif/NeuQuant.java trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java Added: trunk/patchanim/src/com/fmsware/gif/AnimatedGifEncoder.java =================================================================== --- trunk/patchanim/src/com/fmsware/gif/AnimatedGifEncoder.java (rev 0) +++ trunk/patchanim/src/com/fmsware/gif/AnimatedGifEncoder.java 2008-01-30 00:59:16 UTC (rev 56) @@ -0,0 +1,481 @@ +package com.fmsware.gif; +/* + * AnimatedGifEncoder + * Copyright (C) 2003 FmsWare.com + * + * Any party obtaining a copy of these files from the author, directly or + * indirectly, is granted, free of charge, a full and unrestricted irrevocable, + * world-wide, paid up, royalty-free, nonexclusive right and license to deal + * in this software and documentation files (the "Software"), including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons who receive + * copies from any such party to do so, with the only requirement being + * that this copyright notice remain intact. + */ +import java.io.*; +import java.awt.*; +import java.awt.image.*; + +/** + * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or + * more frames. + * <pre> + * Example: + * AnimatedGifEncoder e = new AnimatedGifEncoder(); + * e.start(outputFileName); + * e.setDelay(1000); // 1 frame per sec + * e.addFrame(image1); + * e.addFrame(image2); + * e.finish(); + * </pre> + * No copyright asserted on the source code of this class. May be used + * for any purpose, however, refer to the Unisys LZW patent for restrictions + * on use of the associated LZWEncoder class. Please forward any corrections + * to kw...@fm.... + * + * @author Kevin Weiner, FM Software + * @version 1.03 November 2003 + * + */ + +public class AnimatedGifEncoder { + + protected int width; // image size + protected int height; + protected Color transparent = null; // transparent color if given + protected int transIndex; // transparent index in color table + protected int repeat = -1; // no repeat + protected int delay = 0; // frame delay (hundredths) + protected boolean started = false; // ready to output frames + protected OutputStream out; + protected BufferedImage image; // current frame + protected byte[] pixels; // BGR byte array from frame + protected byte[] indexedPixels; // converted frame indexed to palette + protected int colorDepth; // number of bit planes + protected byte[] colorTab; // RGB palette + protected boolean[] usedEntry = new boolean[256]; // active palette entries + protected int palSize = 7; // color table size (bits-1) + protected int dispose = -1; // disposal code (-1 = use default) + protected boolean closeStream = false; // close stream when finished + protected boolean firstFrame = true; + protected boolean sizeSet = false; // if false, get size from first frame + protected int sample = 10; // default sample interval for quantizer + + /** + * Sets the delay time between each frame, or changes it + * for subsequent frames (applies to last frame added). + * + * @param ms int delay time in milliseconds + */ + public void setDelay(int ms) { + delay = Math.round(ms / 10.0f); + } + + /** + * Sets the GIF frame disposal code for the last added frame + * and any subsequent frames. Default is 0 if no transparent + * color has been set, otherwise 2. + * @param code int disposal code. + */ + public void setDispose(int code) { + if (code >= 0) { + dispose = code; + } + } + + /** + * Sets the number of times the set of GIF frames + * should be played. Default is 1; 0 means play + * indefinitely. Must be invoked before the first + * image is added. + * + * @param iter int number of iterations. + * @return + */ + public void setRepeat(int iter) { + if (iter >= 0) { + repeat = iter; + } + } + + /** + * Sets the transparent color for the last added frame + * and any subsequent frames. + * Since all colors are subject to modification + * in the quantization process, the color in the final + * palette for each frame closest to the given color + * becomes the transparent color for that frame. + * May be set to null to indicate no transparent color. + * + * @param c Color to be treated as transparent on display. + */ + public void setTransparent(Color c) { + transparent = c; + } + + /** + * Adds next GIF frame. The frame is not written immediately, but is + * actually deferred until the next frame is received so that timing + * data can be inserted. Invoking <code>finish()</code> flushes all + * frames. If <code>setSize</code> was not invoked, the size of the + * first image is used for all subsequent frames. + * + * @param im BufferedImage containing frame to write. + * @return true if successful. + */ + public boolean addFrame(BufferedImage im) { + if ((im == null) || !started) { + return false; + } + boolean ok = true; + try { + if (!sizeSet) { + // use first frame's size + setSize(im.getWidth(), im.getHeight()); + } + image = im; + getImagePixels(); // convert to correct format if necessary + analyzePixels(); // build color table & map pixels + if (firstFrame) { + writeLSD(); // logical screen descriptior + writePalette(); // global color table + if (repeat >= 0) { + // use NS app extension to indicate reps + writeNetscapeExt(); + } + } + writeGraphicCtrlExt(); // write graphic control extension + writeImageDesc(); // image descriptor + if (!firstFrame) { + writePalette(); // local color table + } + writePixels(); // encode and write pixel data + firstFrame = false; + } catch (IOException e) { + ok = false; + } + + return ok; + } + + /** + * Flushes any pending data and closes output file. + * If writing to an OutputStream, the stream is not + * closed. + */ + public boolean finish() { + if (!started) return false; + boolean ok = true; + started = false; + try { + out.write(0x3b); // gif trailer + out.flush(); + if (closeStream) { + out.close(); + } + } catch (IOException e) { + ok = false; + } + + // reset for subsequent use + transIndex = 0; + out = null; + image = null; + pixels = null; + indexedPixels = null; + colorTab = null; + closeStream = false; + firstFrame = true; + + return ok; + } + + /** + * Sets frame rate in frames per second. Equivalent to + * <code>setDelay(1000/fps)</code>. + * + * @param fps float frame rate (frames per second) + */ + public void setFrameRate(float fps) { + if (fps != 0f) { + delay = Math.round(100f / fps); + } + } + + /** + * Sets quality of color quantization (conversion of images + * to the maximum 256 colors allowed by the GIF specification). + * Lower values (minimum = 1) produce better colors, but slow + * processing significantly. 10 is the default, and produces + * good color mapping at reasonable speeds. Values greater + * than 20 do not yield significant improvements in speed. + * + * @param quality int greater than 0. + * @return + */ + public void setQuality(int quality) { + if (quality < 1) quality = 1; + sample = quality; + } + + /** + * Sets the GIF frame size. The default size is the + * size of the first frame added if this method is + * not invoked. + * + * @param w int frame width. + * @param h int frame width. + */ + public void setSize(int w, int h) { + if (started && !firstFrame) return; + width = w; + height = h; + if (width < 1) width = 320; + if (height < 1) height = 240; + sizeSet = true; + } + + /** + * Initiates GIF file creation on the given stream. The stream + * is not closed automatically. + * + * @param os OutputStream on which GIF images are written. + * @return false if initial write failed. + */ + public boolean start(OutputStream os) { + if (os == null) return false; + boolean ok = true; + closeStream = false; + out = os; + try { + writeString("GIF89a"); // header + } catch (IOException e) { + ok = false; + } + return started = ok; + } + + /** + * Initiates writing of a GIF file with the specified name. + * + * @param file String containing output file name. + * @return false if open or initial write failed. + */ + public boolean start(String file) { + boolean ok = true; + try { + out = new BufferedOutputStream(new FileOutputStream(file)); + ok = start(out); + closeStream = true; + } catch (IOException e) { + ok = false; + } + return started = ok; + } + + /** + * Analyzes image colors and creates color map. + */ + protected void analyzePixels() { + int len = pixels.length; + int nPix = len / 3; + indexedPixels = new byte[nPix]; + NeuQuant nq = new NeuQuant(pixels, len, sample); + // initialize quantizer + colorTab = nq.process(); // create reduced palette + // convert map from BGR to RGB + for (int i = 0; i < colorTab.length; i += 3) { + byte temp = colorTab[i]; + colorTab[i] = colorTab[i + 2]; + colorTab[i + 2] = temp; + usedEntry[i / 3] = false; + } + // map image pixels to new palette + int k = 0; + for (int i = 0; i < nPix; i++) { + int index = + nq.map(pixels[k++] & 0xff, + pixels[k++] & 0xff, + pixels[k++] & 0xff); + usedEntry[index] = true; + indexedPixels[i] = (byte) index; + } + pixels = null; + colorDepth = 8; + palSize = 7; + // get closest match to transparent color if specified + if (transparent != null) { + transIndex = findClosest(transparent); + } + } + + /** + * Returns index of palette color closest to c + * + */ + protected int findClosest(Color c) { + if (colorTab == null) return -1; + int r = c.getRed(); + int g = c.getGreen(); + int b = c.getBlue(); + int minpos = 0; + int dmin = 256 * 256 * 256; + int len = colorTab.length; + for (int i = 0; i < len;) { + int dr = r - (colorTab[i++] & 0xff); + int dg = g - (colorTab[i++] & 0xff); + int db = b - (colorTab[i] & 0xff); + int d = dr * dr + dg * dg + db * db; + int index = i / 3; + if (usedEntry[index] && (d < dmin)) { + dmin = d; + minpos = index; + } + i++; + } + return minpos; + } + + /** + * Extracts image pixels into byte array "pixels" + */ + protected void getImagePixels() { + int w = image.getWidth(); + int h = image.getHeight(); + int type = image.getType(); + if ((w != width) + || (h != height) + || (type != BufferedImage.TYPE_3BYTE_BGR)) { + // create new image with right size/format + BufferedImage temp = + new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + Graphics2D g = temp.createGraphics(); + g.drawImage(image, 0, 0, null); + image = temp; + } + pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); + } + + /** + * Writes Graphic Control Extension + */ + protected void writeGraphicCtrlExt() throws IOException { + out.write(0x21); // extension introducer + out.write(0xf9); // GCE label + out.write(4); // data block size + int transp, disp; + if (transparent == null) { + transp = 0; + disp = 0; // dispose = no action + } else { + transp = 1; + disp = 2; // force clear if using transparent color + } + if (dispose >= 0) { + disp = dispose & 7; // user override + } + disp <<= 2; + + // packed fields + out.write(0 | // 1:3 reserved + disp | // 4:6 disposal + 0 | // 7 user input - 0 = none + transp); // 8 transparency flag + + writeShort(delay); // delay x 1/100 sec + out.write(transIndex); // transparent color index + out.write(0); // block terminator + } + + /** + * Writes Image Descriptor + */ + protected void writeImageDesc() throws IOException { + out.write(0x2c); // image separator + writeShort(0); // image position x,y = 0,0 + writeShort(0); + writeShort(width); // image size + writeShort(height); + // packed fields + if (firstFrame) { + // no LCT - GCT is used for first (or only) frame + out.write(0); + } else { + // specify normal LCT + out.write(0x80 | // 1 local color table 1=yes + 0 | // 2 interlace - 0=no + 0 | // 3 sorted - 0=no + 0 | // 4-5 reserved + palSize); // 6-8 size of color table + } + } + + /** + * Writes Logical Screen Descriptor + */ + protected void writeLSD() throws IOException { + // logical screen size + writeShort(width); + writeShort(height); + // packed fields + out.write((0x80 | // 1 : global color table flag = 1 (gct used) + 0x70 | // 2-4 : color resolution = 7 + 0x00 | // 5 : gct sort flag = 0 + palSize)); // 6-8 : gct size + + out.write(0); // background color index + out.write(0); // pixel aspect ratio - assume 1:1 + } + + /** + * Writes Netscape application extension to define + * repeat count. + */ + protected void writeNetscapeExt() throws IOException { + out.write(0x21); // extension introducer + out.write(0xff); // app extension label + out.write(11); // block size + writeString("NETSCAPE" + "2.0"); // app id + auth code + out.write(3); // sub-block size + out.write(1); // loop sub-block id + writeShort(repeat); // loop count (extra iterations, 0=repeat forever) + out.write(0); // block terminator + } + + /** + * Writes color table + */ + protected void writePalette() throws IOException { + out.write(colorTab, 0, colorTab.length); + int n = (3 * 256) - colorTab.length; + for (int i = 0; i < n; i++) { + out.write(0); + } + } + + /** + * Encodes and writes pixel data + */ + protected void writePixels() throws IOException { + LZWEncoder encoder = + new LZWEncoder(width, height, indexedPixels, colorDepth); + encoder.encode(out); + } + + /** + * Write 16-bit value to output stream, LSB first + */ + protected void writeShort(int value) throws IOException { + out.write(value & 0xff); + out.write((value >> 8) & 0xff); + } + + /** + * Writes string to output stream + */ + protected void writeString(String s) throws IOException { + for (int i = 0; i < s.length(); i++) { + out.write((byte) s.charAt(i)); + } + } +} Property changes on: trunk/patchanim/src/com/fmsware/gif/AnimatedGifEncoder.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/patchanim/src/com/fmsware/gif/LZWEncoder.java =================================================================== --- trunk/patchanim/src/com/fmsware/gif/LZWEncoder.java (rev 0) +++ trunk/patchanim/src/com/fmsware/gif/LZWEncoder.java 2008-01-30 00:59:16 UTC (rev 56) @@ -0,0 +1,315 @@ +package com.fmsware.gif; +/* + * LZW Encoder + * Copyright (C) 2003 FmsWare.com + * + * Any party obtaining a copy of these files from the author, directly or + * indirectly, is granted, free of charge, a full and unrestricted irrevocable, + * world-wide, paid up, royalty-free, nonexclusive right and license to deal + * in this software and documentation files (the "Software"), including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons who receive + * copies from any such party to do so, with the only requirement being + * that this copyright notice remain intact. + */ +import java.io.OutputStream; +import java.io.IOException; + +//============================================================================== +// Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott. +// K Weiner 12/00 + +class LZWEncoder { + + private static final int EOF = -1; + + private int imgW, imgH; + private byte[] pixAry; + private int initCodeSize; + private int remaining; + private int curPixel; + + // GIFCOMPR.C - GIF Image compression routines + // + // Lempel-Ziv compression based on 'compress'. GIF modifications by + // David Rowley (mg...@wa...) + + // General DEFINEs + + static final int BITS = 12; + + static final int HSIZE = 5003; // 80% occupancy + + // GIF Image compression - modified 'compress' + // + // Based on: compress.c - File compression ala IEEE Computer, June 1984. + // + // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) + // Jim McKie (decvax!mcvax!jim) + // Steve Davies (decvax!vax135!petsd!peora!srd) + // Ken Turkowski (decvax!decwrl!turtlevax!ken) + // James A. Woods (decvax!ihnp4!ames!jaw) + // Joe Orost (decvax!vax135!petsd!joe) + + int n_bits; // number of bits/code + int maxbits = BITS; // user settable max # bits/code + int maxcode; // maximum code, given n_bits + int maxmaxcode = 1 << BITS; // should NEVER generate this code + + int[] htab = new int[HSIZE]; + int[] codetab = new int[HSIZE]; + + int hsize = HSIZE; // for dynamic table sizing + + int free_ent = 0; // first unused entry + + // block compression parameters -- after all codes are used up, + // and compression rate changes, start over. + boolean clear_flg = false; + + // Algorithm: use open addressing double hashing (no chaining) on the + // prefix code / next character combination. We do a variant of Knuth's + // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime + // secondary probe. Here, the modular division first probe is gives way + // to a faster exclusive-or manipulation. Also do block compression with + // an adaptive reset, whereby the code table is cleared when the compression + // ratio decreases, but after the table fills. The variable-length output + // codes are re-sized at this point, and a special CLEAR code is generated + // for the decompressor. Late addition: construct the table according to + // file size for noticeable speed improvement on small files. Please direct + // questions about this implementation to ames!jaw. + + int g_init_bits; + + int ClearCode; + int EOFCode; + + // output + // + // Output the given code. + // Inputs: + // code: A n_bits-bit integer. If == -1, then EOF. This assumes + // that n_bits =< wordsize - 1. + // Outputs: + // Outputs code to the file. + // Assumptions: + // Chars are 8 bits long. + // Algorithm: + // Maintain a BITS character long buffer (so that 8 codes will + // fit in it exactly). Use the VAX insv instruction to insert each + // code in turn. When the buffer fills up empty it and start over. + + int cur_accum = 0; + int cur_bits = 0; + + int masks[] = + { + 0x0000, + 0x0001, + 0x0003, + 0x0007, + 0x000F, + 0x001F, + 0x003F, + 0x007F, + 0x00FF, + 0x01FF, + 0x03FF, + 0x07FF, + 0x0FFF, + 0x1FFF, + 0x3FFF, + 0x7FFF, + 0xFFFF }; + + // Number of characters so far in this 'packet' + int a_count; + + // Define the storage for the packet accumulator + byte[] accum = new byte[256]; + + //---------------------------------------------------------------------------- + LZWEncoder(int width, int height, byte[] pixels, int color_depth) { + imgW = width; + imgH = height; + pixAry = pixels; + initCodeSize = Math.max(2, color_depth); + } + + // Add a character to the end of the current packet, and if it is 254 + // characters, flush the packet to disk. + void char_out(byte c, OutputStream outs) throws IOException { + accum[a_count++] = c; + if (a_count >= 254) + flush_char(outs); + } + + // Clear out the hash table + + // table clear for block compress + void cl_block(OutputStream outs) throws IOException { + cl_hash(hsize); + free_ent = ClearCode + 2; + clear_flg = true; + + output(ClearCode, outs); + } + + // reset code table + void cl_hash(int hsize) { + for (int i = 0; i < hsize; ++i) + htab[i] = -1; + } + + void compress(int init_bits, OutputStream outs) throws IOException { + int fcode; + int i /* = 0 */; + int c; + int ent; + int disp; + int hsize_reg; + int hshift; + + // Set up the globals: g_init_bits - initial number of bits + g_init_bits = init_bits; + + // Set up the necessary values + clear_flg = false; + n_bits = g_init_bits; + maxcode = MAXCODE(n_bits); + + ClearCode = 1 << (init_bits - 1); + EOFCode = ClearCode + 1; + free_ent = ClearCode + 2; + + a_count = 0; // clear packet + + ent = nextPixel(); + + hshift = 0; + for (fcode = hsize; fcode < 65536; fcode *= 2) + ++hshift; + hshift = 8 - hshift; // set hash code range bound + + hsize_reg = hsize; + cl_hash(hsize_reg); // clear hash table + + output(ClearCode, outs); + + outer_loop : while ((c = nextPixel()) != EOF) { + fcode = (c << maxbits) + ent; + i = (c << hshift) ^ ent; // xor hashing + + if (htab[i] == fcode) { + ent = codetab[i]; + continue; + } else if (htab[i] >= 0) // non-empty slot + { + disp = hsize_reg - i; // secondary hash (after G. Knott) + if (i == 0) + disp = 1; + do { + if ((i -= disp) < 0) + i += hsize_reg; + + if (htab[i] == fcode) { + ent = codetab[i]; + continue outer_loop; + } + } while (htab[i] >= 0); + } + output(ent, outs); + ent = c; + if (free_ent < maxmaxcode) { + codetab[i] = free_ent++; // code -> hashtable + htab[i] = fcode; + } else + cl_block(outs); + } + // Put out the final code. + output(ent, outs); + output(EOFCode, outs); + } + + //---------------------------------------------------------------------------- + void encode(OutputStream os) throws IOException { + os.write(initCodeSize); // write "initial code size" byte + + remaining = imgW * imgH; // reset navigation variables + curPixel = 0; + + compress(initCodeSize + 1, os); // compress and write the pixel data + + os.write(0); // write block terminator + } + + // Flush the packet to disk, and reset the accumulator + void flush_char(OutputStream outs) throws IOException { + if (a_count > 0) { + outs.write(a_count); + outs.write(accum, 0, a_count); + a_count = 0; + } + } + + final int MAXCODE(int n_bits) { + return (1 << n_bits) - 1; + } + + //---------------------------------------------------------------------------- + // Return the next pixel from the image + //---------------------------------------------------------------------------- + private int nextPixel() { + if (remaining == 0) + return EOF; + + --remaining; + + byte pix = pixAry[curPixel++]; + + return pix & 0xff; + } + + void output(int code, OutputStream outs) throws IOException { + cur_accum &= masks[cur_bits]; + + if (cur_bits > 0) + cur_accum |= (code << cur_bits); + else + cur_accum = code; + + cur_bits += n_bits; + + while (cur_bits >= 8) { + char_out((byte) (cur_accum & 0xff), outs); + cur_accum >>= 8; + cur_bits -= 8; + } + + // If the next entry is going to be too big for the code size, + // then increase it, if possible. + if (free_ent > maxcode || clear_flg) { + if (clear_flg) { + maxcode = MAXCODE(n_bits = g_init_bits); + clear_flg = false; + } else { + ++n_bits; + if (n_bits == maxbits) + maxcode = maxmaxcode; + else + maxcode = MAXCODE(n_bits); + } + } + + if (code == EOFCode) { + // At EOF, write the rest of the buffer. + while (cur_bits > 0) { + char_out((byte) (cur_accum & 0xff), outs); + cur_accum >>= 8; + cur_bits -= 8; + } + + flush_char(outs); + } + } +} Property changes on: trunk/patchanim/src/com/fmsware/gif/LZWEncoder.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/patchanim/src/com/fmsware/gif/NeuQuant.java =================================================================== --- trunk/patchanim/src/com/fmsware/gif/NeuQuant.java (rev 0) +++ trunk/patchanim/src/com/fmsware/gif/NeuQuant.java 2008-01-30 00:59:16 UTC (rev 56) @@ -0,0 +1,457 @@ +package com.fmsware.gif; +/* + * NeuQuant Neural-Net Quantization Algorithm + * Copyright (c) 1994 Anthony Dekker + * + * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. + * See "Kohonen neural networks for optimal colour quantization" + * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367. + * for a discussion of the algorithm. + * + * Any party obtaining a copy of these files from the author, directly or + * indirectly, is granted, free of charge, a full and unrestricted irrevocable, + * world-wide, paid up, royalty-free, nonexclusive right and license to deal + * in this software and documentation files (the "Software"), including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons who receive + * copies from any such party to do so, with the only requirement being + * that this copyright notice remain intact. + */ + +// Ported to Java 12/00 K Weiner + +public class NeuQuant { + + protected static final int netsize = 256; /* number of colours used */ + + /* four primes near 500 - assume no image has a length so large */ + /* that it is divisible by all four primes */ + protected static final int prime1 = 499; + protected static final int prime2 = 491; + protected static final int prime3 = 487; + protected static final int prime4 = 503; + + protected static final int minpicturebytes = (3 * prime4); + /* minimum size for input image */ + + /* Program Skeleton + ---------------- + [select samplefac in range 1..30] + [read image from input file] + pic = (unsigned char*) malloc(3*width*height); + initnet(pic,3*width*height,samplefac); + learn(); + unbiasnet(); + [write output image header, using writecolourmap(f)] + inxbuild(); + write output image using inxsearch(b,g,r) */ + + /* Network Definitions + ------------------- */ + + protected static final int maxnetpos = (netsize - 1); + protected static final int netbiasshift = 4; /* bias for colour values */ + protected static final int ncycles = 100; /* no. of learning cycles */ + + /* defs for freq and bias */ + protected static final int intbiasshift = 16; /* bias for fractions */ + protected static final int intbias = (((int) 1) << intbiasshift); + protected static final int gammashift = 10; /* gamma = 1024 */ + protected static final int gamma = (((int) 1) << gammashift); + protected static final int betashift = 10; + protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */ + protected static final int betagamma = + (intbias << (gammashift - betashift)); + + /* defs for decreasing radius factor */ + protected static final int initrad = (netsize >> 3); /* for 256 cols, radius starts */ + protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */ + protected static final int radiusbias = (((int) 1) << radiusbiasshift); + protected static final int initradius = (initrad * radiusbias); /* and decreases by a */ + protected static final int radiusdec = 30; /* factor of 1/30 each cycle */ + + /* defs for decreasing alpha factor */ + protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */ + protected static final int initalpha = (((int) 1) << alphabiasshift); + + protected int alphadec; /* biased by 10 bits */ + + /* radbias and alpharadbias used for radpower calculation */ + protected static final int radbiasshift = 8; + protected static final int radbias = (((int) 1) << radbiasshift); + protected static final int alpharadbshift = (alphabiasshift + radbiasshift); + protected static final int alpharadbias = (((int) 1) << alpharadbshift); + + /* Types and Global Variables + -------------------------- */ + + protected byte[] thepicture; /* the input image itself */ + protected int lengthcount; /* lengthcount = H*W*3 */ + + protected int samplefac; /* sampling factor 1..30 */ + + // typedef int pixel[4]; /* BGRc */ + protected int[][] network; /* the network itself - [netsize][4] */ + + protected int[] netindex = new int[256]; + /* for network lookup - really 256 */ + + protected int[] bias = new int[netsize]; + /* bias and freq arrays for learning */ + protected int[] freq = new int[netsize]; + protected int[] radpower = new int[initrad]; + /* radpower for precomputation */ + + /* Initialise network in range (0,0,0) to (255,255,255) and set parameters + ----------------------------------------------------------------------- */ + public NeuQuant(byte[] thepic, int len, int sample) { + + int i; + int[] p; + + thepicture = thepic; + lengthcount = len; + samplefac = sample; + + network = new int[netsize][]; + for (i = 0; i < netsize; i++) { + network[i] = new int[4]; + p = network[i]; + p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize; + freq[i] = intbias / netsize; /* 1/netsize */ + bias[i] = 0; + } + } + + public byte[] colorMap() { + byte[] map = new byte[3 * netsize]; + int[] index = new int[netsize]; + for (int i = 0; i < netsize; i++) + index[network[i][3]] = i; + int k = 0; + for (int i = 0; i < netsize; i++) { + int j = index[i]; + map[k++] = (byte) (network[j][0]); + map[k++] = (byte) (network[j][1]); + map[k++] = (byte) (network[j][2]); + } + return map; + } + + /* Insertion sort of network and building of netindex[0..255] (to do after unbias) + ------------------------------------------------------------------------------- */ + public void inxbuild() { + + int i, j, smallpos, smallval; + int[] p; + int[] q; + int previouscol, startpos; + + previouscol = 0; + startpos = 0; + for (i = 0; i < netsize; i++) { + p = network[i]; + smallpos = i; + smallval = p[1]; /* index on g */ + /* find smallest in i..netsize-1 */ + for (j = i + 1; j < netsize; j++) { + q = network[j]; + if (q[1] < smallval) { /* index on g */ + smallpos = j; + smallval = q[1]; /* index on g */ + } + } + q = network[smallpos]; + /* swap p (i) and q (smallpos) entries */ + if (i != smallpos) { + j = q[0]; + q[0] = p[0]; + p[0] = j; + j = q[1]; + q[1] = p[1]; + p[1] = j; + j = q[2]; + q[2] = p[2]; + p[2] = j; + j = q[3]; + q[3] = p[3]; + p[3] = j; + } + /* smallval entry is now in position i */ + if (smallval != previouscol) { + netindex[previouscol] = (startpos + i) >> 1; + for (j = previouscol + 1; j < smallval; j++) + netindex[j] = i; + previouscol = smallval; + startpos = i; + } + } + netindex[previouscol] = (startpos + maxnetpos) >> 1; + for (j = previouscol + 1; j < 256; j++) + netindex[j] = maxnetpos; /* really 256 */ + } + + /* Main Learning Loop + ------------------ */ + public void learn() { + + int i, j, b, g, r; + int radius, rad, alpha, step, delta, samplepixels; + byte[] p; + int pix, lim; + + if (lengthcount < minpicturebytes) + samplefac = 1; + alphadec = 30 + ((samplefac - 1) / 3); + p = thepicture; + pix = 0; + lim = lengthcount; + samplepixels = lengthcount / (3 * samplefac); + delta = samplepixels / ncycles; + alpha = initalpha; + radius = initradius; + + rad = radius >> radiusbiasshift; + if (rad <= 1) + rad = 0; + for (i = 0; i < rad; i++) + radpower[i] = + alpha * (((rad * rad - i * i) * radbias) / (rad * rad)); + + //fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); + + if (lengthcount < minpicturebytes) + step = 3; + else if ((lengthcount % prime1) != 0) + step = 3 * prime1; + else { + if ((lengthcount % prime2) != 0) + step = 3 * prime2; + else { + if ((lengthcount % prime3) != 0) + step = 3 * prime3; + else + step = 3 * prime4; + } + } + + i = 0; + while (i < samplepixels) { + b = (p[pix + 0] & 0xff) << netbiasshift; + g = (p[pix + 1] & 0xff) << netbiasshift; + r = (p[pix + 2] & 0xff) << netbiasshift; + j = contest(b, g, r); + + altersingle(alpha, j, b, g, r); + if (rad != 0) + alterneigh(rad, j, b, g, r); /* alter neighbours */ + + pix += step; + if (pix >= lim) + pix -= lengthcount; + + i++; + if (delta == 0) + delta = 1; + if (i % delta == 0) { + alpha -= alpha / alphadec; + radius -= radius / radiusdec; + rad = radius >> radiusbiasshift; + if (rad <= 1) + rad = 0; + for (j = 0; j < rad; j++) + radpower[j] = + alpha * (((rad * rad - j * j) * radbias) / (rad * rad)); + } + } + //fprintf(stderr,"finished 1D learning: final alpha=%f !\n",((float)alpha)/initalpha); + } + + /* Search for BGR values 0..255 (after net is unbiased) and return colour index + ---------------------------------------------------------------------------- */ + public int map(int b, int g, int r) { + + int i, j, dist, a, bestd; + int[] p; + int best; + + bestd = 1000; /* biggest possible dist is 256*3 */ + best = -1; + i = netindex[g]; /* index on g */ + j = i - 1; /* start at netindex[g] and work outwards */ + + while ((i < netsize) || (j >= 0)) { + if (i < netsize) { + p = network[i]; + dist = p[1] - g; /* inx key */ + if (dist >= bestd) + i = netsize; /* stop iter */ + else { + i++; + if (dist < 0) + dist = -dist; + a = p[0] - b; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + a = p[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + best = p[3]; + } + } + } + } + if (j >= 0) { + p = network[j]; + dist = g - p[1]; /* inx key - reverse dif */ + if (dist >= bestd) + j = -1; /* stop iter */ + else { + j--; + if (dist < 0) + dist = -dist; + a = p[0] - b; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + a = p[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + best = p[3]; + } + } + } + } + } + return (best); + } + public byte[] process() { + learn(); + unbiasnet(); + inxbuild(); + return colorMap(); + } + + /* Unbias network to give byte values 0..255 and record position i to prepare for sort + ----------------------------------------------------------------------------------- */ + public void unbiasnet() { + + int i, j; + + for (i = 0; i < netsize; i++) { + network[i][0] >>= netbiasshift; + network[i][1] >>= netbiasshift; + network[i][2] >>= netbiasshift; + network[i][3] = i; /* record colour no */ + } + } + + /* Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in radpower[|i-j|] + --------------------------------------------------------------------------------- */ + protected void alterneigh(int rad, int i, int b, int g, int r) { + + int j, k, lo, hi, a, m; + int[] p; + + lo = i - rad; + if (lo < -1) + lo = -1; + hi = i + rad; + if (hi > netsize) + hi = netsize; + + j = i + 1; + k = i - 1; + m = 1; + while ((j < hi) || (k > lo)) { + a = radpower[m++]; + if (j < hi) { + p = network[j++]; + try { + p[0] -= (a * (p[0] - b)) / alpharadbias; + p[1] -= (a * (p[1] - g)) / alpharadbias; + p[2] -= (a * (p[2] - r)) / alpharadbias; + } catch (Exception e) { + } // prevents 1.3 miscompilation + } + if (k > lo) { + p = network[k--]; + try { + p[0] -= (a * (p[0] - b)) / alpharadbias; + p[1] -= (a * (p[1] - g)) / alpharadbias; + p[2] -= (a * (p[2] - r)) / alpharadbias; + } catch (Exception e) { + } + } + } + } + + /* Move neuron i towards biased (b,g,r) by factor alpha + ---------------------------------------------------- */ + protected void altersingle(int alpha, int i, int b, int g, int r) { + + /* alter hit neuron */ + int[] n = network[i]; + n[0] -= (alpha * (n[0] - b)) / initalpha; + n[1] -= (alpha * (n[1] - g)) / initalpha; + n[2] -= (alpha * (n[2] - r)) / initalpha; + } + + /* Search for biased BGR values + ---------------------------- */ + protected int contest(int b, int g, int r) { + + /* finds closest neuron (min dist) and updates freq */ + /* finds best neuron (min dist-bias) and returns position */ + /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */ + /* bias[i] = gamma*((1/netsize)-freq[i]) */ + + int i, dist, a, biasdist, betafreq; + int bestpos, bestbiaspos, bestd, bestbiasd; + int[] n; + + bestd = ~(((int) 1) << 31); + bestbiasd = bestd; + bestpos = -1; + bestbiaspos = bestpos; + + for (i = 0; i < netsize; i++) { + n = network[i]; + dist = n[0] - b; + if (dist < 0) + dist = -dist; + a = n[1] - g; + if (a < 0) + a = -a; + dist += a; + a = n[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + bestpos = i; + } + biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift)); + if (biasdist < bestbiasd) { + bestbiasd = biasdist; + bestbiaspos = i; + } + betafreq = (freq[i] >> betashift); + freq[i] -= betafreq; + bias[i] += (betafreq << gammashift); + } + freq[bestpos] += beta; + bias[bestpos] -= betagamma; + return (bestbiaspos); + } +} Property changes on: trunk/patchanim/src/com/fmsware/gif/NeuQuant.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java (rev 0) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java 2008-01-30 00:59:16 UTC (rev 56) @@ -0,0 +1,25 @@ +package com.mebigfatguy.patchanim; + +public enum ExportType { + JPegs("jpg", true), + Pngs("png", true), + Gifs("gif", true), + AnimatedGif("gif", false), + MPeg("mpg", false); + + private String ext; + private boolean multi; + + private ExportType(String extension, boolean multipleFiles) { + ext = extension; + multi = multipleFiles; + } + + public String getExtension() { + return ext; + } + + public boolean isMultipleFiles() { + return multi; + } +} Property changes on: trunk/patchanim/src/com/mebigfatguy/patchanim/ExportType.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-29 06:07:53 UTC (rev 55) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/gui/JPatchAnimFrame.java 2008-01-30 00:59:16 UTC (rev 56) @@ -40,6 +40,7 @@ import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; +import com.fmsware.gif.AnimatedGifEncoder; import com.mebigfatguy.patchanim.AnimationType; import com.mebigfatguy.patchanim.ExportType; import com.mebigfatguy.patchanim.OutOfBoundsColor; @@ -60,9 +61,12 @@ private JMenu exportMenu; private JMenuItem exportJpgsItem; private JMenuItem exportPngsItem; + private JMenuItem exportGifsItem; + private JMenuItem exportAnimatedGifItem; private JMenuItem quitItem; private PatchAnimDocument document; private File documentLocation; + private AnimatedGifEncoder agEncoder = null; public JPatchAnimFrame() { @@ -105,8 +109,13 @@ exportMenu = new JMenu(rb.getString(PatchAnimBundle.EXPORT)); exportJpgsItem = new JMenuItem(rb.getString(PatchAnimBundle.JPGSERIES)); exportPngsItem = new JMenuItem(rb.getString(PatchAnimBundle.PNGSERIES)); + exportGifsItem = new JMenuItem(rb.getString(PatchAnimBundle.GIFSERIES)); + exportAnimatedGifItem = new JMenuItem(rb.getString(PatchAnimBundle.ANIMATEDGIF)); exportMenu.add(exportJpgsItem); exportMenu.add(exportPngsItem); + exportMenu.add(exportGifsItem); + exportMenu.addSeparator(); + exportMenu.add(exportAnimatedGifItem); fileMenu.add(exportMenu); fileMenu.addSeparator(); quitItem = new JMenuItem(rb.getString(PatchAnimBundle.QUIT)); @@ -221,6 +230,26 @@ } }); + exportGifsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + exportFiles(ExportType.Gifs); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + + exportAnimatedGifItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + exportFiles(ExportType.AnimatedGif); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(JPatchAnimFrame.this, PatchAnimBundle.EXPORTFAILED); + } + } + }); + quitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { @@ -340,8 +369,19 @@ return; File dir = chooser.getSelectedFile(); - dir.mkdir(); String baseName = dir.getName(); + if (type.isMultipleFiles()) { + dir.mkdir(); + } else { + dir = dir.getParentFile(); + String dotExt = "." + type.getExtension(); + if (!baseName.endsWith(dotExt)) + baseName = baseName + dotExt; + if (type == ExportType.AnimatedGif) { + agEncoder = new AnimatedGifEncoder(); + agEncoder.start(new File(dir, baseName).getPath()); + } + } BufferedImage image = PatchGenerator.buildImage(null, document.getWidth(), document.getHeight()); @@ -376,6 +416,11 @@ } } } + + if (type == ExportType.AnimatedGif) { + agEncoder.finish(); + agEncoder = null; + } } private void writeSingleFile(BufferedImage image, int index, File dir, String baseName, ExportType type) throws IOException { @@ -384,7 +429,18 @@ String name = baseName + "_" + nf.format(index) + "." + type.getExtension(); File imageFile = new File(dir, name); - ImageIO.write(image, type.getExtension(), imageFile); + + if (type == ExportType.Gifs) { + AnimatedGifEncoder encoder = new AnimatedGifEncoder(); + encoder.start(imageFile.getPath()); + encoder.addFrame(image); + encoder.finish(); + } else if (type == ExportType.AnimatedGif) { + agEncoder.addFrame(image); + agEncoder.setDelay(100); + } + else + ImageIO.write(image, type.getExtension(), imageFile); } } Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-29 06:07:53 UTC (rev 55) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/main/PatchAnimBundle.java 2008-01-30 00:59:16 UTC (rev 56) @@ -32,6 +32,8 @@ public static final String EXPORT = "patchanim.export"; public static final String JPGSERIES = "patchanim.jpgs"; public static final String PNGSERIES = "patchanim.pngs"; + public static final String GIFSERIES = "patchanim.gifs"; + public static final String ANIMATEDGIF = "patchanim.animatedgif"; public static final String QUIT = "patchanim.quit"; public static final String CONTROLS = "patchanim.control"; public static final String WIDTH = "patchanim.width"; Modified: trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties =================================================================== --- trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-29 06:07:53 UTC (rev 55) +++ trunk/patchanim/src/com/mebigfatguy/patchanim/resources.properties 2008-01-30 00:59:16 UTC (rev 56) @@ -25,6 +25,8 @@ patchanim.export = Export As... patchanim.jpgs = a series of JPGs patchanim.pngs = a series of PNGs +patchanim.gifs = a series of GIFs +patchanim.animatedgif = an Animated Gif patchanim.quit = Quit patchanim.control = Controls patchanim.width = Width This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |