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.
|