Merge lp:projekt-programowanie into lp:projekt-programowanie/gui

Proposed by Jakub Brzeski
Status: Merged
Merged at revision: 49
Proposed branch: lp:projekt-programowanie
Merge into: lp:projekt-programowanie/gui
Diff against target: 9049 lines (+5801/-1124)
97 files modified
.bzrignore (+2/-1)
pom.xml (+44/-2)
src/main/java/manager/editor/ColorCMY.java (+35/-35)
src/main/java/manager/editor/ColorConverter.java (+78/-37)
src/main/java/manager/editor/ColorHSV.java (+19/-19)
src/main/java/manager/editor/ColorRGB.java (+35/-35)
src/main/java/manager/editor/EditWindow.java (+228/-14)
src/main/java/manager/editor/FilterBinaryzation.java (+46/-12)
src/main/java/manager/editor/FilterBrightness.java (+34/-9)
src/main/java/manager/editor/FilterCMYCorrection.java (+44/-19)
src/main/java/manager/editor/FilterColorAccent.java (+50/-21)
src/main/java/manager/editor/FilterContrast.java (+37/-11)
src/main/java/manager/editor/FilterExposure.java (+33/-9)
src/main/java/manager/editor/FilterFactory.java (+128/-65)
src/main/java/manager/editor/FilterGamma.java (+38/-12)
src/main/java/manager/editor/FilterGrayScale.java (+28/-17)
src/main/java/manager/editor/FilterHSVCorrection.java (+46/-21)
src/main/java/manager/editor/FilterImageResizeBilinear.java (+29/-23)
src/main/java/manager/editor/FilterImageResizeNearestNeighbour.java (+21/-15)
src/main/java/manager/editor/FilterImageRotate270.java (+18/-12)
src/main/java/manager/editor/FilterImageRotate90.java (+18/-11)
src/main/java/manager/editor/FilterImageSymetryOX.java (+17/-11)
src/main/java/manager/editor/FilterImageSymetryOY.java (+17/-11)
src/main/java/manager/editor/FilterLUTCorrectionCMY.java (+73/-0)
src/main/java/manager/editor/FilterLUTCorrectionHSV.java (+73/-0)
src/main/java/manager/editor/FilterLUTCorrectionRGB.java (+73/-0)
src/main/java/manager/editor/FilterMatrixAdapter.java (+32/-20)
src/main/java/manager/editor/FilterNegative.java (+12/-6)
src/main/java/manager/editor/FilterRGBCorrection.java (+44/-19)
src/main/java/manager/editor/FilterSepia.java (+40/-13)
src/main/java/manager/editor/FilterSolarize.java (+38/-13)
src/main/java/manager/editor/FilterTexturer.java (+34/-22)
src/main/java/manager/editor/Gradient.java (+18/-10)
src/main/java/manager/editor/Histogram.java (+1/-1)
src/main/java/manager/editor/IFilter.java (+7/-2)
src/main/java/manager/editor/IFilterLUT.java (+7/-3)
src/main/java/manager/editor/IFilterMatrix.java (+2/-2)
src/main/java/manager/editor/IFilterRange.java (+10/-1)
src/main/java/manager/editor/ITextureGenerator.java (+2/-2)
src/main/java/manager/editor/IWindowFilter.java (+11/-0)
src/main/java/manager/editor/ImageMaker.java (+4/-1)
src/main/java/manager/editor/ImagePanel.java (+50/-0)
src/main/java/manager/editor/ImageViewer.java (+66/-0)
src/main/java/manager/editor/LUTTable.java (+21/-8)
src/main/java/manager/editor/Matrix.java (+16/-7)
src/main/java/manager/editor/PixelData.java (+198/-92)
src/main/java/manager/editor/Point.java (+18/-0)
src/main/java/manager/editor/Range.java (+32/-12)
src/main/java/manager/editor/TextureGeneratorGradientCircle.java (+69/-0)
src/main/java/manager/editor/TextureGeneratorGradientHorizontal.java (+0/-39)
src/main/java/manager/editor/TextureGeneratorGradientLinear.java (+65/-0)
src/main/java/manager/editor/TextureGeneratorGradientVertical.java (+0/-39)
src/main/java/manager/editor/TexturerFactory.java (+83/-0)
src/main/java/manager/editor/WindowHistogram.java (+17/-0)
src/main/java/manager/editor/WindowLUT.java (+24/-0)
src/main/java/manager/editor/WindowMatrix.java (+269/-0)
src/main/java/manager/editor/WindowRange.java (+151/-0)
src/main/java/manager/editor/WindowResize.java (+214/-0)
src/main/java/manager/files/FileID.java (+17/-6)
src/main/java/manager/files/FileNotAvailableException.java (+17/-4)
src/main/java/manager/files/FileSaveException.java (+16/-3)
src/main/java/manager/files/FileSystem.java (+0/-75)
src/main/java/manager/files/ImageHolder.java (+0/-60)
src/main/java/manager/files/OperationInterruptedException.java (+16/-3)
src/main/java/manager/files/backup/Backup.java (+0/-47)
src/main/java/manager/files/backup/BackupsManager.java (+52/-0)
src/main/java/manager/files/backup/Change.java (+0/-5)
src/main/java/manager/files/backup/FileSystemBackupImplementation.java (+169/-0)
src/main/java/manager/files/backup/PicasaBackupImplementation.java (+115/-0)
src/main/java/manager/files/backup/PrimaryBackup.java (+49/-0)
src/main/java/manager/files/backup/PrimaryBackupImplementation.java (+277/-0)
src/main/java/manager/files/backup/SecondaryBackup.java (+49/-0)
src/main/java/manager/files/picasa/AbstractAlbumPropertiesSetter.java (+80/-0)
src/main/java/manager/files/picasa/AuthorizationException.java (+0/-10)
src/main/java/manager/files/picasa/PicasaAPI.java (+0/-56)
src/main/java/manager/files/picasa/PicasaAlbum.java (+321/-0)
src/main/java/manager/files/picasa/PicasaAuthenticationException.java (+23/-0)
src/main/java/manager/files/picasa/PicasaDataModificationException.java (+23/-0)
src/main/java/manager/files/picasa/PicasaInformationCollectionException.java (+23/-0)
src/main/java/manager/files/picasa/PicasaMediaDownloadException.java (+23/-0)
src/main/java/manager/files/picasa/PicasaMediaUploadException.java (+23/-0)
src/main/java/manager/files/picasa/PicasaPhoto.java (+149/-0)
src/main/java/manager/files/picasa/PicasaService.java (+165/-0)
src/main/java/manager/tags/MasterTag.java (+59/-12)
src/main/java/manager/tags/Tag.java (+33/-8)
src/main/java/manager/tags/Tags.java (+359/-14)
src/main/java/manager/tags/UserTag.java (+46/-4)
src/test/java/manager/files/backup/FileSystemBackupImplementationTest.java (+50/-0)
src/test/java/manager/files/backup/PicasaBackupImplementationTest.java (+64/-0)
src/test/java/manager/files/backup/PrimaryBackupImplementationTest.java (+48/-0)
src/test/java/manager/files/picasa/AbstractAlbumPropertiesSetterTestFrame.java (+96/-0)
src/test/java/manager/files/picasa/PicasaAlbumPropertiesSetterTest.java (+46/-0)
src/test/java/manager/files/picasa/PicasaAlbumTest.java (+104/-0)
src/test/java/manager/files/picasa/PicasaPhotoTest.java (+30/-0)
src/test/java/manager/files/picasa/PicasaServiceAlbumCreatorTest.java (+69/-0)
src/test/java/manager/files/picasa/PicasaServiceTest.java (+201/-0)
src/test/java/manager/tags/Tags1Test.java (+170/-83)
To merge this branch: bzr merge lp:projekt-programowanie
Reviewer Review Type Date Requested Status
Moduł GUI Pending
Review via email: mp+102369@code.launchpad.net

Description of the change

Test of merging.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2012-04-06 16:18:15 +0000
3+++ .bzrignore 2012-04-17 18:42:22 +0000
4@@ -1,7 +1,8 @@
5 ./.idea
6 ./target
7-./manager.iml
8 ./.classpath
9 ./.project
10 ./.settings
11 ./.bzignore
12+./bin
13+./*.iml
14
15=== modified file 'pom.xml'
16--- pom.xml 2012-04-08 22:13:36 +0000
17+++ pom.xml 2012-04-17 18:42:22 +0000
18@@ -1,10 +1,10 @@
19-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
20+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
21 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
22 <modelVersion>4.0.0</modelVersion>
23
24 <groupId>manager</groupId>
25 <artifactId>net.launchpad.projekt-programowanie</artifactId>
26- <version>0.1</version>
27+ <version>0.5</version>
28 <packaging>jar</packaging>
29
30 <name>Menadżer plików i edytor grafiki</name>
31@@ -15,6 +15,13 @@
32 <powermock.version>1.4.12</powermock.version>
33 </properties>
34
35+ <repositories>
36+ <repository>
37+ <id>mandubian-mvn</id>
38+ <url>http://mandubian-mvn.googlecode.com/svn/trunk/mandubian-mvn/repository</url>
39+ </repository>
40+ </repositories>
41+
42 <dependencies>
43 <dependency>
44 <groupId>junit</groupId>
45@@ -46,6 +53,41 @@
46 <version>${powermock.version}</version>
47 <scope>test</scope>
48 </dependency>
49+ <dependency>
50+ <groupId>com.sun.mail</groupId>
51+ <artifactId>javax.mail</artifactId>
52+ <version>1.4.5</version>
53+ </dependency>
54+ <dependency>
55+ <groupId>com.google.gdata</groupId>
56+ <artifactId>gdata-client-1.0</artifactId>
57+ <version>1.41.1</version>
58+ </dependency>
59+ <dependency>
60+ <groupId>com.google.gdata</groupId>
61+ <artifactId>gdata-client-meta-1.0</artifactId>
62+ <version>1.41.1</version>
63+ </dependency>
64+ <dependency>
65+ <groupId>com.google.gdata</groupId>
66+ <artifactId>gdata-core-1.0</artifactId>
67+ <version>1.41.1</version>
68+ </dependency>
69+ <dependency>
70+ <groupId>com.google.gdata</groupId>
71+ <artifactId>gdata-media-1.0</artifactId>
72+ <version>1.41.1</version>
73+ </dependency>
74+ <dependency>
75+ <groupId>com.google.gdata</groupId>
76+ <artifactId>gdata-photos-2.0</artifactId>
77+ <version>1.41.1</version>
78+ </dependency>
79+ <dependency>
80+ <groupId>com.google.gdata</groupId>
81+ <artifactId>gdata-photos-meta-2.0</artifactId>
82+ <version>1.41.1</version>
83+ </dependency>
84 </dependencies>
85 <build>
86 <plugins>
87
88=== modified file 'src/main/java/manager/editor/ColorCMY.java'
89--- src/main/java/manager/editor/ColorCMY.java 2012-04-09 18:10:58 +0000
90+++ src/main/java/manager/editor/ColorCMY.java 2012-04-17 18:42:22 +0000
91@@ -8,79 +8,79 @@
92 private float mCyan, mMagenta, mYellow;
93
94 /**
95- * @param C - kanał cyjan [0,255]
96- * @param M - kanał purpura [0,255]
97- * @param Y - kanał żółty [0,255]
98+ * @param mC - kanał cyjan [0,255]
99+ * @param mM - kanał purpura [0,255]
100+ * @param mY - kanał żółty [0,255]
101 */
102- public ColorCMY(int C, int M, int Y){
103- setC(C);
104- setM(M);
105- setY(Y);
106+ public ColorCMY(int mC, int mM, int mY){
107+ setC(mC);
108+ setM(mM);
109+ setY(mY);
110 }
111 /**
112- * @param C - kanał cyjan [0,1]
113- * @param M - kanał purpura [0,1]
114- * @param Y - kanał żółty [0,1]
115+ * @param mC - kanał cyjan [0,1]
116+ * @param mM - kanał purpura [0,1]
117+ * @param mY - kanał żółty [0,1]
118 */
119- public ColorCMY(float C, float M, float Y){
120- setC(C);
121- setM(M);
122- setY(Y);
123+ public ColorCMY(float mC, float mM, float mY){
124+ setC(mC);
125+ setM(mM);
126+ setY(mY);
127 }
128
129 /**
130 * @return kanał cyjan [0,1]
131 */
132- public float getC(){return mCyan;}
133+ public final float getC(){return mCyan;}
134 /**
135 * @return kanał purpura [0,1]
136 */
137- public float getM(){return mMagenta;}
138+ public final float getM(){return mMagenta;}
139 /**
140 * @return kanał żółty [0,1]
141 */
142- public float getY(){return mYellow;}
143+ public final float getY(){return mYellow;}
144
145 /**
146 * Ustawia wartość kanału cyjanu
147- * @param C - kanał cyjan [0,1]
148+ * @param mC - kanał cyjan [0,1]
149 */
150- public void setC(float C){
151- mCyan = Math.max(0.0f, Math.min(1.0f, C));
152+ public final void setC(float mC){
153+ mCyan = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mC));
154 }
155 /**
156 * Ustawia wartość kanału purpury
157- * @param M - kanał purpury [0,1]
158+ * @param mM - kanał purpury [0,1]
159 */
160- public void setM(float M){
161- mMagenta = Math.max(0.0f, Math.min(1.0f, M));
162+ public final void setM(float mM){
163+ mMagenta = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mM));
164 }
165 /**
166 * Ustawia wartość kanału żółtego
167- * @param B - kanał żółty [0,1]
168+ * @param mY - kanał żółty [0,1]
169 */
170- public void setY(float Y){
171- mYellow = Math.max(0.0f, Math.min(1.0f, Y));
172+ public final void setY(float mY){
173+ mYellow = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mY));
174 }
175 /**
176 * Ustawia wartość kanału cyjanu
177- * @param C - kanał cyjan [0,255]
178+ * @param mC - kanał cyjan [0,255]
179 */
180- public void setC(int C){
181- mCyan = Math.max(0.0f, Math.min(255.0f, (float)C/255.0f));
182+ public final void setC(int mC){
183+ mCyan = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mC/ColorConverter.RGBCMY_BYTE_MAX));
184 }
185 /**
186 * Ustawia wartość kanału purpury
187- * @param M - kanał purpury [0,255]
188+ * @param mM - kanał purpury [0,255]
189 */
190- public void setM(int M){
191- mMagenta = Math.max(0.0f, Math.min(255.0f, (float)M/255.0f));
192+ public final void setM(int mM){
193+ mMagenta = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mM/ColorConverter.RGBCMY_BYTE_MAX));
194 }
195 /**
196 * Ustawia wartość kanału żółtego
197- * @param Y - kanał żółty [0,255]
198+ * @param mY - kanał żółty [0,255]
199 */
200- public void setY(int Y){
201- mYellow = Math.max(0.0f, Math.min(255.0f, (float)Y/255.0f));
202+ public final void setY(int mY){
203+ mYellow = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mY/ColorConverter.RGBCMY_BYTE_MAX));
204 }
205 }
206\ No newline at end of file
207
208=== modified file 'src/main/java/manager/editor/ColorConverter.java'
209--- src/main/java/manager/editor/ColorConverter.java 2012-04-10 11:51:18 +0000
210+++ src/main/java/manager/editor/ColorConverter.java 2012-04-17 18:42:22 +0000
211@@ -2,41 +2,82 @@
212
213 /**
214 * Klasa konwertująca pomiędzy przestrzeniami barw
215+ * Próba stworzenia obiektu tej klasy nawet przy pomocy refleksji
216+ * skończy się wyrzuceniem wyjątku <b>UnsupportedOperationException</b>
217 * @author Patryk
218 */
219-public class ColorConverter {
220+public final class ColorConverter {
221+ /**
222+ * Stała opisuje precyzje porównywania floatów
223+ */
224+ public static final float FLOAT_PRECISION = 0.00001f;
225+ /**
226+ * Kąt pełny palety barw (Hue) służy do zapętlenia wartości (modulo)
227+ */
228+ public static final int HUE_CHANNEL_PRECISION = 360;
229+ /**
230+ * Kąt wyznaczający podział koła barw na podzbiory do konwersji RGB -> HSV i odwrotnie
231+ */
232+ public static final float HUE_CIRCLE_SPLITTER = 60.0f;
233+ /**
234+ * Maksymalna dopuszczalna wartość kanału barwy (Hue) zarówno w
235+ * modelu barw jak i w bitmapie
236+ */
237+ public static final float HUE_MAX = 359.999f;
238+ /**
239+ * Maksymalna wartość kanałów RGB, CMY oraz SV (z modelu HSV) w modelach barw
240+ */
241+ public static final float RGBCMY_FLOAT_MAX = 1.0f;
242+ /**
243+ * Maksymalna wartość kanałów RGB i CMY w bitmapie
244+ */
245+ public static final float RGBCMY_BYTE_MAX = 255.0f;
246+ /**
247+ * Stosunek udziału koloru czerwonego w barwie wykrywanej przez ludzkie oko
248+ */
249+ public static final float RED_LUMINOSITY = 0.21f;
250+ /**
251+ * Stosunek udziału koloru zielonego w barwie wykrywanej przez ludzkie oko
252+ */
253+ public static final float GREEN_LUMINOSITY = 0.71f;
254+ /**
255+ * Stosunek udziału koloru niebieskiego w barwie wykrywanej przez ludzkie oko
256+ */
257+ public static final float BLUE_LUMINOSITY = 0.07f;
258+
259+ private ColorConverter(){throw new UnsupportedOperationException();};
260 /**
261 * @param color - kolor z przestrzeni CMY
262 * @return odpowiadający kolor z przestrzeni RGB
263 */
264 public static ColorRGB cmyTOrgb(ColorCMY color){
265- return new ColorRGB(1.0f-color.getC(), 1.0f-color.getM(), 1.0f-color.getY());
266+ return new ColorRGB(RGBCMY_FLOAT_MAX-color.getC(), RGBCMY_FLOAT_MAX-color.getM(), RGBCMY_FLOAT_MAX-color.getY());
267 }
268 /**
269 * @param color - kolor z przestrzeni HSV
270 * @return odpowiadający kolor z przestrzeni RGB
271 */
272 public static ColorRGB hsvTOrgb(ColorHSV color){
273- float R=0,G=0,B=0,I,f,p,q,t;
274- float H = color.getH();
275- float S = color.getS();
276- float V = color.getV();
277- if(V == 0.0f) R=G=B=0.0f;
278+ float mR=0,mG=0,mB=0,mI,f,p,q,t;
279+ float mH = color.getH();
280+ float mS = color.getS();
281+ float mV = color.getV();
282+ if(Math.abs(mV) < FLOAT_PRECISION) {mR=0.0f; mG=0.0f; mB=0.0f;}
283 else{
284- H /= 60.0f;
285- I = (int)Math.floor(H);
286- f = H-I;
287- p = V*(1.0f-S);
288- q = V*(1.0f-(S*f));
289- t = V*(1.0f-(S*(1.0f-f)));
290- if (I==0) {R=V; G=t; B=p;}
291- else if (I==1) {R=q; G=V; B=p;}
292- else if (I==2) {R=p; G=V; B=t;}
293- else if (I==3) {R=p; G=q; B=V;}
294- else if (I==4) {R=t; G=p; B=V;}
295- else if (I==5) {R=V; G=p; B=q;}
296+ mH /= HUE_CIRCLE_SPLITTER;
297+ mI = (int)Math.floor(mH);
298+ f = mH-mI;
299+ p = mV*(RGBCMY_FLOAT_MAX-mS);
300+ q = mV*(RGBCMY_FLOAT_MAX-(mS*f));
301+ t = mV*(RGBCMY_FLOAT_MAX-(mS*(RGBCMY_FLOAT_MAX-f)));
302+ if (mI==0) {mR=mV; mG=t; mB=p;}
303+ else if (mI==1) {mR=q; mG=mV; mB=p;}
304+ else if (mI==2) {mR=p; mG=mV; mB=t;}
305+ else if (mI==3) {mR=p; mG=q; mB=mV;}
306+ else if (mI==4) {mR=t; mG=p; mB=mV;}
307+ else if (mI==5) {mR=mV; mG=p; mB=q;}
308 }
309- return new ColorRGB(R,G,B);
310+ return new ColorRGB(mR,mG,mB);
311 }
312
313 /**
314@@ -44,7 +85,7 @@
315 * @return odpowiadający kolor z przestrzeni CMY
316 */
317 public static ColorCMY rgbTOcmy(ColorRGB color){
318- return new ColorCMY(1.0f-color.getR(), 1.0f-color.getG(), 1.0f-color.getB());
319+ return new ColorCMY(RGBCMY_FLOAT_MAX-color.getR(), RGBCMY_FLOAT_MAX-color.getG(), RGBCMY_FLOAT_MAX-color.getB());
320 }
321 /**
322 * @param color - kolor z przestrzeni HSV
323@@ -59,25 +100,25 @@
324 * @return odpowiadający kolor z przestrzeni HSV
325 */
326 public static ColorHSV rgbTOhsv(ColorRGB color){
327- float H=0.0f,S=0.0f,V=0.0f,R,G,B,x,I,f;
328- R = color.getR();
329- G = color.getG();
330- B = color.getB();
331- x = Math.min(Math.min(R, G), B);
332- V = Math.max(Math.max(R, G), B);
333- if (x == V) H=S=0.0f;
334+ float mH=0.0f,mS=0.0f,mV=0.0f,mR,mG,mB,x,mI,f;
335+ mR = color.getR();
336+ mG = color.getG();
337+ mB = color.getB();
338+ x = Math.min(Math.min(mR, mG), mB);
339+ mV = Math.max(Math.max(mR, mG), mB);
340+ if (Math.abs(x - mV) < FLOAT_PRECISION) {mH=0.0f; mS=0.0f;}
341 else {
342- if(R == x) f = G-B;
343- else if(G == x) f = B-R;
344- else f = R-G;
345+ if(Math.abs(mR - x) < FLOAT_PRECISION) {f = mG-mB;}
346+ else if(Math.abs(mG - x) < FLOAT_PRECISION) {f = mB-mR;}
347+ else {f = mR-mG;}
348
349- if(R == x) I=3.0f;
350- else if(G == x) I=5.0f;
351- else I=1.0f;
352- H = (float)( (int)((I-f/(V-x))*60.0f) )%360;
353- S = ((V-x)/V);
354+ if(Math.abs(mR - x) < FLOAT_PRECISION) {mI=3.0f;}
355+ else if(Math.abs(mG - x) < FLOAT_PRECISION) {mI=5.0f;}
356+ else {mI=1.0f;}
357+ mH = (float)( (int)((mI-f/(mV-x))*HUE_CIRCLE_SPLITTER) ) % HUE_CHANNEL_PRECISION;
358+ mS = ((mV-x)/mV);
359 }
360- return new ColorHSV(H,S,V);
361+ return new ColorHSV(mH,mS,mV);
362 }
363 /**
364 * @param color - kolor z przestrzeni CMY
365
366=== modified file 'src/main/java/manager/editor/ColorHSV.java'
367--- src/main/java/manager/editor/ColorHSV.java 2012-04-09 18:10:58 +0000
368+++ src/main/java/manager/editor/ColorHSV.java 2012-04-17 18:42:22 +0000
369@@ -8,48 +8,48 @@
370 private float mHue, mSaturation, mValue;
371
372 /**
373- * @param H - Barwa [0,359]
374- * @param S - Nasycenie [0,1]
375- * @param V - Jasność [0,1]
376+ * @param mH - Barwa [0,359]
377+ * @param mS - Nasycenie [0,1]
378+ * @param mV - Jasność [0,1]
379 */
380- public ColorHSV(float H, float S, float V){
381- setH(H);
382- setS(S);
383- setV(V);
384+ public ColorHSV(float mH, float mS, float mV){
385+ setH(mH);
386+ setS(mS);
387+ setV(mV);
388 }
389
390 /**
391 * @return wartość kanału barwy [0,359]
392 */
393- public float getH(){return mHue;}
394+ public final float getH(){return mHue;}
395 /**
396 * @return wartość kanału nasycenia [0,1]
397 */
398- public float getS(){return mSaturation;}
399+ public final float getS(){return mSaturation;}
400 /**
401 * @return wartość kanału jasności [0,1]
402 */
403- public float getV(){return mValue;}
404+ public final float getV(){return mValue;}
405
406 /**
407 * Ustawia wartość kanału barwy dla koloru
408- * @param H - kanał barwy
409+ * @param mH - kanał barwy
410 */
411- public void setH(float H){
412- mHue = Math.max(0.0f, Math.min(359.9f, H));
413+ public final void setH(float mH){
414+ mHue = Math.max(0.0f, Math.min(ColorConverter.HUE_MAX, mH));
415 }
416 /**
417 * Ustawia wartość kanału nasycenia dla koloru
418- * @param S - kanał nasycenia
419+ * @param mS - kanał nasycenia
420 */
421- public void setS(float S){
422- mSaturation = Math.max(0.0f, Math.min(1.0f, S));
423+ public final void setS(float mS){
424+ mSaturation = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mS));
425 }
426 /**
427 * Ustawia wartość kanału jasności dla koloru
428- * @param V - kanał jasności
429+ * @param mV - kanał jasności
430 */
431- public void setV(float V){
432- mValue = Math.max(0.0f, Math.min(1.0f, V));
433+ public final void setV(float mV){
434+ mValue = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mV));
435 }
436 }
437
438=== modified file 'src/main/java/manager/editor/ColorRGB.java'
439--- src/main/java/manager/editor/ColorRGB.java 2012-04-09 18:10:58 +0000
440+++ src/main/java/manager/editor/ColorRGB.java 2012-04-17 18:42:22 +0000
441@@ -8,79 +8,79 @@
442 private float mRed, mGreen, mBlue;
443
444 /**
445- * @param R - kanał czerwony [0,255]
446- * @param G - kanał zielony [0,255]
447- * @param B - kanał niebieski [0,255]
448+ * @param mR - kanał czerwony [0,255]
449+ * @param mG - kanał zielony [0,255]
450+ * @param mB - kanał niebieski [0,255]
451 */
452- public ColorRGB(int R, int G, int B){
453- setR(R);
454- setG(G);
455- setB(B);
456+ public ColorRGB(int mR, int mG, int mB){
457+ setR(mR);
458+ setG(mG);
459+ setB(mB);
460 }
461 /**
462- * @param R - kanał czerwony [0,1]
463- * @param G - kanał zielony [0,1]
464- * @param B - kanał niebieski [0,1]
465+ * @param mR - kanał czerwony [0,1]
466+ * @param mG - kanał zielony [0,1]
467+ * @param mB - kanał niebieski [0,1]
468 */
469- public ColorRGB(float R, float G, float B){
470- setR(R);
471- setG(G);
472- setB(B);
473+ public ColorRGB(float mR, float mG, float mB){
474+ setR(mR);
475+ setG(mG);
476+ setB(mB);
477 }
478
479 /**
480 * @return kanał czerwony [0,1]
481 */
482- public float getR(){return mRed;}
483+ public final float getR(){return mRed;}
484 /**
485 * @return kanał zielony [0,1]
486 */
487- public float getG(){return mGreen;}
488+ public final float getG(){return mGreen;}
489 /**
490 * @return kanał niebieski [0,1]
491 */
492- public float getB(){return mBlue;}
493+ public final float getB(){return mBlue;}
494
495 /**
496 * Ustawia wartość kanału czerwonego
497- * @param R - kanał czerwony [0,1]
498+ * @param mR - kanał czerwony [0,1]
499 */
500- public void setR(float R){
501- mRed = Math.max(0.0f, Math.min(1.0f, R));
502+ public final void setR(float mR){
503+ mRed = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mR));
504 }
505 /**
506 * Ustawia wartość kanału zielonego
507- * @param G - kanał zielony [0,1]
508+ * @param mG - kanał zielony [0,1]
509 */
510- public void setG(float G){
511- mGreen = Math.max(0.0f, Math.min(1.0f, G));
512+ public final void setG(float mG){
513+ mGreen = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mG));
514 }
515 /**
516 * Ustawia wartość kanału niebieskiego
517- * @param B - kanał niebieski [0,1]
518+ * @param mB - kanał niebieski [0,1]
519 */
520- public void setB(float B){
521- mBlue = Math.max(0.0f, Math.min(1.0f, B));
522+ public final void setB(float mB){
523+ mBlue = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mB));
524 }
525 /**
526 * Ustawia wartość kanału czerwonego
527- * @param R - kanał czerwony [0,255]
528+ * @param mR - kanał czerwony [0,255]
529 */
530- public void setR(int R){
531- mRed = Math.max(0.0f, Math.min(255.0f, (float)R/255.0f));
532+ public final void setR(int mR){
533+ mRed = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mR/ColorConverter.RGBCMY_BYTE_MAX));
534 }
535 /**
536 * Ustawia wartość kanału zielonego
537- * @param G - kanał zielony [0,255]
538+ * @param mG - kanał zielony [0,255]
539 */
540- public void setG(int G){
541- mGreen = Math.max(0.0f, Math.min(255.0f, (float)G/255.0f));
542+ public final void setG(int mG){
543+ mGreen = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mG/ColorConverter.RGBCMY_BYTE_MAX));
544 }
545 /**
546 * Ustawia wartość kanału niebieskiego
547- * @param B - kanał niebieski [0,255]
548+ * @param mB - kanał niebieski [0,255]
549 */
550- public void setB(int B){
551- mBlue = Math.max(0.0f, Math.min(255.0f, (float)B/255.0f));
552+ public final void setB(int mB){
553+ mBlue = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, (float)mB/ColorConverter.RGBCMY_BYTE_MAX));
554 }
555 }
556
557=== modified file 'src/main/java/manager/editor/EditWindow.java'
558--- src/main/java/manager/editor/EditWindow.java 2012-04-07 09:14:46 +0000
559+++ src/main/java/manager/editor/EditWindow.java 2012-04-17 18:42:22 +0000
560@@ -1,19 +1,233 @@
561 package manager.editor;
562
563 import javax.swing.*;
564+import javax.swing.border.EmptyBorder;
565+
566+import java.awt.BorderLayout;
567+import java.awt.event.ActionEvent;
568+import java.awt.event.ActionListener;
569 import java.awt.image.BufferedImage;
570-
571-public class EditWindow extends JDialog {
572- /**
573- * @param image - referencja do objektu klasy BufferedImage przechowująca obraz do edycji
574- */
575- public EditWindow(BufferedImage image) {
576- }
577-
578- /**
579- * @return przetworzony obraz
580- */
581- public BufferedImage getTransformedImage() {
582- return null;
583- }
584+import java.util.LinkedList;
585+
586+/**
587+ * Klasa reprezentuje okno dialogowe w którym dokonywana jest edycja obrazu
588+ * @author Marcin Regdos
589+ */
590+public class EditWindow extends JFrame implements ActionListener {
591+ private JPanel contentPane;
592+ private PixelData PDImage;
593+ private LinkedList<PixelData> history;
594+ private ImageViewer mainImageViewer;
595+ private String [] filterNamesGUI;
596+ private String [] filterCategoryNamesGUI;
597+ //private IFilter [] filters;
598+ private int [] filterType;
599+ private JMenuItem [] JMenuFilterButtons;
600+ private JMenu [] JMenuFilterCategories;
601+ private FilterGUI [] filters;
602+ private int nFilters=17;
603+ private int nCategories=6;
604+ private static class FilterGUI{
605+ String name, nameGUI;
606+ FWindowType window;
607+ IFilter filter;
608+ FilterGUI(String name, String nameGUI, FWindowType window, IFilter Filter){
609+ this.name=name;
610+ this.nameGUI=nameGUI;
611+ this.window=window;
612+ this.filter=Filter;
613+ }
614+ }
615+ private enum FWindowType{
616+ WindowRange, WindowResize, WindowMatrix, WindowLUT, WindowHistogram, NoWindow, WindowGallery
617+ }
618+ private void InitGui(){
619+ setTitle("Edytor plików graficznych");
620+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
621+ setBounds(100, 100, 600, 600);
622+ InitMenu();
623+ contentPane = new JPanel();
624+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
625+ contentPane.setLayout(new BorderLayout(0, 0));
626+ setContentPane(contentPane);
627+
628+ JToolBar toolBar = new JToolBar();
629+ contentPane.add(toolBar, BorderLayout.NORTH);
630+
631+ JButton buttonUndo = new JButton("Cofnij");
632+ toolBar.add(buttonUndo);
633+ buttonUndo.setActionCommand("undo");
634+ buttonUndo.addActionListener(this);
635+ JButton bClose = new JButton("Zamknij");
636+ toolBar.add(bClose);
637+ bClose.setActionCommand("close");
638+ bClose.addActionListener(this);
639+ JButton bsClose = new JButton("Zapisz i zamknij");
640+ toolBar.add(bsClose);
641+ bsClose.setActionCommand("applyclose");
642+ bsClose.addActionListener(this);
643+
644+ }
645+ private void InitFiltersToGUI(){
646+ filterNamesGUI =new String[]{
647+ "Detekcja krawędzi", "Filtr LUT", "Filtr matrycowy", "Histogram", "Obrót w lewo", "Obrót w prawo", "Symetria", "Uwypuklenie", "Wygładzenie", "Wyostrzanie", "Zmiana rozmiaru"
648+ };
649+ filterCategoryNamesGUI=new String[]{
650+ "Edycja", "Filtry podstawowe", "Filtry kolorystyczne","Inne", "Filtry kanałowe", "Własne filtry",
651+ };
652+ filters=new FilterGUI[]{
653+ new FilterGUI("FilterBrightness","Jasność", FWindowType.WindowRange, new FilterBrightness() ),
654+ new FilterGUI("FilterContrast","Kontrast", FWindowType.WindowRange, new FilterContrast() ),
655+ new FilterGUI("FilterGamma","Korekta gamma", FWindowType.WindowRange, new FilterGamma() ),
656+ new FilterGUI("FilterExposure","Korekta ekspozycji", FWindowType.WindowRange, new FilterExposure() ),
657+ new FilterGUI("FilterSepia","Sepia", FWindowType.WindowRange, new FilterSepia() ),
658+ new FilterGUI("FilterColorAccent","Akcent kolorystyczny", FWindowType.WindowRange, new FilterColorAccent() ),
659+ new FilterGUI("FilterBinaryzation","Binaryzacja", FWindowType.WindowRange, new FilterBinaryzation() ),
660+ new FilterGUI("FilterSolarize","Solaryzacja", FWindowType.WindowRange, new FilterSolarize() ),
661+ new FilterGUI("FilterRGBCorrection","Korekta RGB", FWindowType.WindowRange, new FilterRGBCorrection() ),
662+ new FilterGUI("FilterCMYCorrection","Korekta CMY", FWindowType.WindowRange, new FilterCMYCorrection() ),
663+ new FilterGUI("FilterHSBCorrection", "Korekta HSV", FWindowType.WindowRange, new FilterHSVCorrection() ),
664+ new FilterGUI("grayScaleLightness", "Skala szarości (jasność)", FWindowType.NoWindow, FilterFactory.grayScaleLightness()),
665+ new FilterGUI("grayScaleAverage", "Skala szarości (średnia)", FWindowType.NoWindow, FilterFactory.grayScaleAverage()),
666+ new FilterGUI("grayScaleLuminosity", "Skala szarości (nasycenie)", FWindowType.NoWindow, FilterFactory.grayScaleLuminosity()),
667+ new FilterGUI("MatrixFilter", "Filtr macierzowy", FWindowType.WindowMatrix, null),
668+ new FilterGUI("LUTFilter", "Filtr LUT", FWindowType.WindowLUT, null),
669+ new FilterGUI("Resize", "Zmień rozmiar", FWindowType.WindowResize, null),
670+ };
671+ JMenuFilterButtons=new JMenuItem[nFilters];
672+ JMenuFilterCategories=new JMenu[nCategories];
673+
674+ }
675+ private void InitMenu(){
676+ JMenuBar menuBar = new JMenuBar();
677+ setJMenuBar(menuBar);
678+ for (int i=0; i<nCategories; ++i){
679+ JMenuFilterCategories[i]=new JMenu(filterCategoryNamesGUI[i]);
680+ menuBar.add(JMenuFilterCategories[i]);
681+ }
682+ for (int i=0; i<nFilters; ++i){
683+ JMenuFilterButtons[i]=new JMenuItem(filters[i].nameGUI);
684+ JMenuFilterButtons[i].setActionCommand(filters[i].name);
685+ JMenuFilterButtons[i].addActionListener(this);
686+ }
687+ JMenuFilterCategories[1].add(JMenuFilterButtons[0]);
688+ JMenuFilterCategories[1].add(JMenuFilterButtons[1]);
689+ JMenuFilterCategories[1].add(JMenuFilterButtons[2]);
690+ JMenuFilterCategories[1].add(JMenuFilterButtons[3]);
691+ JMenuFilterCategories[2].add(JMenuFilterButtons[4]);
692+ JMenuFilterCategories[2].add(JMenuFilterButtons[5]);
693+ JMenuFilterCategories[2].add(JMenuFilterButtons[11]);
694+ JMenuFilterCategories[2].add(JMenuFilterButtons[12]);
695+ JMenuFilterCategories[2].add(JMenuFilterButtons[13]);
696+ JMenuFilterCategories[3].add(JMenuFilterButtons[6]);
697+ JMenuFilterCategories[3].add(JMenuFilterButtons[7]);
698+ JMenuFilterCategories[4].add(JMenuFilterButtons[8]);
699+ JMenuFilterCategories[4].add(JMenuFilterButtons[9]);
700+ JMenuFilterCategories[4].add(JMenuFilterButtons[10]);
701+ JMenuFilterCategories[5].add(JMenuFilterButtons[14]);
702+ JMenuFilterCategories[5].add(JMenuFilterButtons[15]);
703+ JMenuItem mHistogram = new JMenuItem("Histogram");
704+ mHistogram.setActionCommand("mHistogram");
705+ mHistogram.addActionListener(this);
706+ menuBar.add(mHistogram);
707+
708+ JMenuItem mUndo = new JMenuItem("Cofnij");
709+ mUndo.setActionCommand("undo");
710+ mUndo.addActionListener(this);
711+ JMenuFilterCategories[0].add(mUndo);
712+ JMenuFilterCategories[0].add(JMenuFilterButtons[16]);
713+ //mEdycja.add(mUndo);
714+ }
715+
716+ /**
717+ * Konstruktor - wymagany jest obraz do edycji
718+ * @param image - referencja do objektu klasy BufferedImage przechowująca obraz do edycji
719+ */
720+ public EditWindow(BufferedImage image) {
721+ if (image==null){
722+ return;
723+ }
724+ InitFiltersToGUI();
725+ mainImageViewer=new ImageViewer(image, 400, 400);
726+ PDImage=new PixelData(image);
727+ history=new LinkedList<PixelData>();
728+ InitGui();
729+ getContentPane().add(mainImageViewer);
730+ this.setVisible(true);
731+ }
732+ /**
733+ * Zwraca obraz po edycji. Jeśli użytkownik nie zdecydował się na zastosowanie zmian, obraz jest nullem
734+ * @return przetworzony obraz
735+ *
736+ */
737+ public BufferedImage getTransformedImage() {
738+ this.setVisible(true);
739+ if (PDImage==null){
740+ return null;
741+ }
742+ return PDImage.toBufferedImage();
743+ }
744+ private void undo (){
745+ if (history.isEmpty()==false){
746+ PDImage=history.pollLast();
747+ mainImageViewer.setImage(PDImage.toBufferedImage());
748+ }else{
749+ JOptionPane.showMessageDialog(this,"Brak wcześniejszej wersji","error", JOptionPane.ERROR_MESSAGE);
750+ }
751+ }
752+ private void apply (PixelData newPixelData){
753+ if (newPixelData==null)return;
754+ history.add(PDImage);
755+ PDImage=newPixelData;
756+ mainImageViewer.setImage(PDImage.toBufferedImage());
757+ }
758+ @Override
759+ public void actionPerformed(ActionEvent e) {
760+ if (e.getActionCommand().equals("undo")) {
761+ undo();
762+ return;
763+ }
764+ if (e.getActionCommand().equals("close")) {
765+ PDImage=null;
766+ this.setVisible(false);
767+ this.dispose();
768+ return;
769+ }
770+ if (e.getActionCommand().equals("applyclose")) {
771+ this.setVisible(false);
772+ this.dispose();
773+ return;
774+ }
775+ if (e.getActionCommand().equals("mHistogram")) {
776+ new WindowHistogram(null);
777+ return;
778+ }
779+ for (int i=0; i<filters.length; ++i){
780+ if (e.getActionCommand().equals(filters[i].name)) {
781+ switch(filters[i].window){
782+ case WindowRange:
783+ apply (new WindowRange(PDImage, (IFilterRange)filters[i].filter, filters[i].nameGUI).showDialog());
784+ filters[i].filter.reset();
785+ break;
786+ case WindowMatrix:
787+ apply (new WindowMatrix(PDImage).showDialog());
788+ break;
789+ case WindowLUT:
790+ apply (new WindowLUT(PDImage).showDialog());
791+ break;
792+ case WindowResize:
793+ apply (new WindowResize(PDImage).showDialog());
794+ break;
795+ case NoWindow:
796+ PixelData tdata= (PixelData)PDImage.clone();
797+ filters[i].filter.apply(PDImage, tdata);
798+ apply (tdata);
799+ break;
800+ case WindowGallery:
801+ break;
802+ }
803+ return;
804+ }
805+ }
806+ }
807 }
808
809=== modified file 'src/main/java/manager/editor/FilterBinaryzation.java'
810--- src/main/java/manager/editor/FilterBinaryzation.java 2012-04-10 11:51:18 +0000
811+++ src/main/java/manager/editor/FilterBinaryzation.java 2012-04-17 18:42:22 +0000
812@@ -8,28 +8,40 @@
813 */
814 public class FilterBinaryzation implements IFilterRange{
815 private final Range[] mRange = new Range[]{
816- new Range(0.0f, 255.0f, 127.5f)
817+ new Range(0.0f, ColorConverter.RGBCMY_BYTE_MAX, ColorConverter.RGBCMY_BYTE_MAX / 2.0f, "Próg")
818 };
819
820 @Override
821- public void apply(PixelData original, PixelData temp)
822- throws IllegalArgumentException {
823- if(original == null || temp == null) throw new NullPointerException();
824- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
825+ public void apply(PixelData original, PixelData temp) {
826+ int mWidth = original.getWidth(), mHeight = original.getHeight();
827+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
828 throw new IllegalArgumentException();
829+ }
830+ float[] origData = original.getData();
831+ float[] tempData = temp.getData();
832 float prog = mRange[0].getValue(), gray;
833 original.toRGB(); temp.toRGB();
834- for(int j=0;j<original.mHeight;j++)
835- for(int i=0;i<original.mWidth;i++){
836- gray = (original.mData[3*(j*original.mWidth+i)]+original.mData[3*(j*original.mWidth+i)+1]+original.mData[3*(j*original.mWidth+i)+2])/3.0f;
837- if(gray < prog) temp.mData[3*(j*original.mWidth+i)] = temp.mData[3*(j*original.mWidth+i)+1] = temp.mData[3*(j*original.mWidth+i)+2] = 0.0f;
838- else temp.mData[3*(j*original.mWidth+i)] = temp.mData[3*(j*original.mWidth+i)+1] = temp.mData[3*(j*original.mWidth+i)+2] = 255.0f;
839+ for(int j=0;j<mHeight;j++){
840+ for(int i=0;i<mWidth;i++){
841+ gray = (origData[PixelData.PIXEL_SIZE*(j*mWidth+i)]+
842+ origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1]+
843+ origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2]) / ((float)PixelData.PIXEL_SIZE);
844+ if(gray < prog) {
845+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = 0.0f;
846+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = 0.0f;
847+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = 0.0f;
848+ } else {
849+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = ColorConverter.RGBCMY_BYTE_MAX;
850+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = ColorConverter.RGBCMY_BYTE_MAX;
851+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = ColorConverter.RGBCMY_BYTE_MAX;
852+ }
853 }
854+ }
855 }
856
857 @Override
858 public PixelData apply(PixelData image) {
859- if(image == null) return null;
860+ if(image == null) {return null;}
861 PixelData ret = (PixelData)image.clone();
862 apply(image, image);
863 return ret;
864@@ -37,7 +49,29 @@
865
866 @Override
867 public Range[] getRangeTable() {
868- return mRange;
869+ return mRange.clone();
870+ }
871+
872+ @Override
873+ public void setRangeTable(Range[] table) {
874+ if(table == null || table.length != mRange.length){
875+ throw new IllegalArgumentException();
876+ }
877+ for(int i=0;i<table.length;i++){
878+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
879+ throw new IllegalArgumentException();
880+ }
881+ }
882+ for(int i=0;i<table.length;i++){
883+ mRange[i].setValue(table[i].getValue());
884+ }
885+ }
886+
887+ @Override
888+ public void reset() {
889+ for(int i=0;i<mRange.length;i++){
890+ mRange[i].reset();
891+ }
892 }
893
894 }
895
896=== modified file 'src/main/java/manager/editor/FilterBrightness.java'
897--- src/main/java/manager/editor/FilterBrightness.java 2012-04-08 17:57:35 +0000
898+++ src/main/java/manager/editor/FilterBrightness.java 2012-04-17 18:42:22 +0000
899@@ -6,22 +6,25 @@
900 */
901 public class FilterBrightness implements IFilterRange{
902 private final Range[] mRange = new Range[]{
903- new Range(-128.0f, 128.0f, 0.0f)
904+ new Range(-ColorConverter.RGBCMY_BYTE_MAX / 2.0f, ColorConverter.RGBCMY_BYTE_MAX / 2.0f, 0.0f, "Jasność")
905 };
906 @Override
907- public void apply(PixelData original, PixelData temp)
908- throws IllegalArgumentException {
909- if(original == null || temp == null) throw new NullPointerException();
910- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
911+ public void apply(PixelData original, PixelData temp) {
912+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
913 throw new IllegalArgumentException();
914+ }
915+ float[] origData = original.getData();
916+ float[] tempData = temp.getData();
917+ float delta = mRange[0].getValue();
918 original.toRGB(); temp.toRGB();
919- for(int i=0;i<original.mData.length;i++)
920- temp.mData[i] = Math.max(0.0f, Math.min(255.0f, original.mData[i] + mRange[0].getValue()));
921+ for(int i=0;i<origData.length;i++){
922+ tempData[i] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, origData[i] + delta));
923+ }
924 }
925
926 @Override
927 public PixelData apply(PixelData image) {
928- if(image == null) return null;
929+ if(image == null) {return null;}
930 PixelData ret = (PixelData)image.clone();
931 apply(image, image);
932 return ret;
933@@ -29,7 +32,29 @@
934
935 @Override
936 public Range[] getRangeTable() {
937- return mRange;
938+ return mRange.clone();
939+ }
940+
941+ @Override
942+ public void setRangeTable(Range[] table) {
943+ if(table == null || table.length != mRange.length){
944+ throw new IllegalArgumentException();
945+ }
946+ for(int i=0;i<table.length;i++){
947+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
948+ throw new IllegalArgumentException();
949+ }
950+ }
951+ for(int i=0;i<table.length;i++){
952+ mRange[i].setValue(table[i].getValue());
953+ }
954+ }
955+
956+ @Override
957+ public void reset() {
958+ for(int i=0;i<mRange.length;i++){
959+ mRange[i].reset();
960+ }
961 }
962
963 }
964
965=== modified file 'src/main/java/manager/editor/FilterCMYCorrection.java'
966--- src/main/java/manager/editor/FilterCMYCorrection.java 2012-04-08 17:57:35 +0000
967+++ src/main/java/manager/editor/FilterCMYCorrection.java 2012-04-17 18:42:22 +0000
968@@ -6,34 +6,37 @@
969 */
970 public class FilterCMYCorrection implements IFilterRange{
971 private final Range[] mRange = new Range[]{
972- new Range(-128.0f, 128.0f, 0.0f),
973- new Range(-128.0f, 128.0f, 0.0f),
974- new Range(-128.0f, 128.0f, 0.0f)
975+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Cyjan"),
976+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Purpura"),
977+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Żółty")
978 };
979
980 @Override
981- public void apply(PixelData original, PixelData temp)
982- throws IllegalArgumentException {
983- if(original == null || temp == null) throw new NullPointerException();
984- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
985+ public void apply(PixelData original, PixelData temp) {
986+ int mWidth = original.getWidth(), mHeight = original.getHeight();
987+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
988 throw new IllegalArgumentException();
989+ }
990+ float[] origData = original.getData();
991+ float[] tempData = temp.getData();
992 original.toCMY(); temp.toCMY();
993- float C,M,Y;
994- float Cd = mRange[0].getValue(), Md = mRange[1].getValue(), Yd = mRange[2].getValue();
995- for(int i=0;i<original.mWidth;i++)
996- for(int j=0;j<original.mHeight;j++){
997- C = original.mData[3*(i*original.mHeight+j)];
998- M = original.mData[3*(i*original.mHeight+j)+1];
999- Y = original.mData[3*(i*original.mHeight+j)+2];
1000- temp.mData[3*(i*original.mHeight+j)] = Math.max(0.0f, Math.min(255.0f, C+Cd));
1001- temp.mData[3*(i*original.mHeight+j)+1] = Math.max(0.0f, Math.min(255.0f, M+Md));
1002- temp.mData[3*(i*original.mHeight+j)+2] = Math.max(0.0f, Math.min(255.0f, Y+Yd));
1003+ float mC,mM,mY;
1004+ float dC = mRange[0].getValue(), dM = mRange[1].getValue(), dY = mRange[2].getValue();
1005+ for(int i=0;i<mWidth;i++){
1006+ for(int j=0;j<mHeight;j++){
1007+ mC = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)];
1008+ mM = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1];
1009+ mY = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
1010+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mC+dC));
1011+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mM+dM));
1012+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mY+dY));
1013 }
1014+ }
1015 }
1016
1017 @Override
1018 public PixelData apply(PixelData image) {
1019- if(image == null) return null;
1020+ if(image == null) {return null;}
1021 PixelData ret = (PixelData)image.clone();
1022 apply(image, image);
1023 return ret;
1024@@ -41,7 +44,29 @@
1025
1026 @Override
1027 public Range[] getRangeTable() {
1028- return mRange;
1029+ return mRange.clone();
1030+ }
1031+
1032+ @Override
1033+ public void setRangeTable(Range[] table) {
1034+ if(table == null || table.length != mRange.length){
1035+ throw new IllegalArgumentException();
1036+ }
1037+ for(int i=0;i<table.length;i++){
1038+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
1039+ throw new IllegalArgumentException();
1040+ }
1041+ }
1042+ for(int i=0;i<table.length;i++){
1043+ mRange[i].setValue(table[i].getValue());
1044+ }
1045+ }
1046+
1047+ @Override
1048+ public void reset() {
1049+ for(int i=0;i<mRange.length;i++){
1050+ mRange[i].reset();
1051+ }
1052 }
1053
1054 }
1055
1056=== modified file 'src/main/java/manager/editor/FilterColorAccent.java'
1057--- src/main/java/manager/editor/FilterColorAccent.java 2012-04-10 11:51:18 +0000
1058+++ src/main/java/manager/editor/FilterColorAccent.java 2012-04-17 18:42:22 +0000
1059@@ -11,36 +11,43 @@
1060 */
1061 public class FilterColorAccent implements IFilterRange{
1062 private final Range[] mRange = new Range[]{
1063- new Range(0.0f, 359.9f, 0.0f),
1064- new Range(0.0f, 180.0f, 10.0f)
1065+ new Range(0.0f, 360.0f, 0.0f, "Barwa"),
1066+ new Range(0.0f, 180.0f, 10.0f, "Tolerancja")
1067 };
1068
1069 @Override
1070- public void apply(PixelData original, PixelData temp)
1071- throws IllegalArgumentException {
1072- if(original == null || temp == null) throw new NullPointerException();
1073- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1074+ public void apply(PixelData original, PixelData temp){
1075+ int mWidth = original.getWidth(), mHeight = original.getHeight();
1076+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
1077 throw new IllegalArgumentException();
1078+ }
1079+ float[] origData = original.getData();
1080+ float[] tempData = temp.getData();
1081 original.toHSV(); temp.toHSV();
1082- float Hue = mRange[0].getValue(), Tol = mRange[1].getValue();
1083- float Hmax = Hue+Tol, Hmin = Hue-Tol;
1084- float H=0,S=0,V=0;
1085- for(int i=0;i<original.mWidth;i++)
1086- for(int j=0;j<original.mHeight;j++){
1087- H = original.mData[3*(j*original.mWidth+i)];
1088- S = original.mData[3*(j*original.mWidth+i)+1];
1089- V = original.mData[3*(j*original.mWidth+i)+2];
1090- if((Hmin <= H && H <= Hmax) || (Hmin <= H-360.0f && H-360.0f <= Hmax) || (Hmin <= H+360.0f && H+360.0f <= Hmax))
1091- temp.mData[3*(j*original.mWidth+i)+1] = S;
1092- else temp.mData[3*(j*original.mWidth+i)+1] = 0.0f;
1093- temp.mData[3*(j*original.mWidth+i)] = H;
1094- temp.mData[3*(j*original.mWidth+i)+2] = V;
1095+ float mHue = mRange[0].getValue(), mTol = mRange[1].getValue();
1096+ float mHmax = mHue+mTol, mHmin = mHue-mTol;
1097+ float mH=0,mS=0,mV=0;
1098+ for(int i=0;i<mWidth;i++){
1099+ for(int j=0;j<mHeight;j++){
1100+ mH = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)];
1101+ mS = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1];
1102+ mV = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2];
1103+ if((mHmin <= mH && mH <= mHmax) ||
1104+ (mHmin <= mH - ColorConverter.HUE_MAX && mH - ColorConverter.HUE_MAX <= mHmax) ||
1105+ (mHmin <= mH + ColorConverter.HUE_MAX && mH + ColorConverter.HUE_MAX <= mHmax)){
1106+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = mS;
1107+ } else {
1108+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = 0.0f;
1109+ }
1110+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = mH;
1111+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = mV;
1112 }
1113+ }
1114 }
1115
1116 @Override
1117 public PixelData apply(PixelData image) {
1118- if(image == null) return null;
1119+ if(image == null) {return null;}
1120 PixelData ret = (PixelData)image.clone();
1121 apply(image, image);
1122 return ret;
1123@@ -48,7 +55,29 @@
1124
1125 @Override
1126 public Range[] getRangeTable() {
1127- return mRange;
1128+ return mRange.clone();
1129+ }
1130+
1131+ @Override
1132+ public void setRangeTable(Range[] table) {
1133+ if(table == null || table.length != mRange.length){
1134+ throw new IllegalArgumentException();
1135+ }
1136+ for(int i=0;i<table.length;i++){
1137+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
1138+ throw new IllegalArgumentException();
1139+ }
1140+ }
1141+ for(int i=0;i<table.length;i++){
1142+ mRange[i].setValue(table[i].getValue());
1143+ }
1144+ }
1145+
1146+ @Override
1147+ public void reset() {
1148+ for(int i=0;i<mRange.length;i++){
1149+ mRange[i].reset();
1150+ }
1151 }
1152
1153 }
1154
1155=== modified file 'src/main/java/manager/editor/FilterContrast.java'
1156--- src/main/java/manager/editor/FilterContrast.java 2012-04-08 17:57:35 +0000
1157+++ src/main/java/manager/editor/FilterContrast.java 2012-04-17 18:42:22 +0000
1158@@ -6,25 +6,29 @@
1159 */
1160 public class FilterContrast implements IFilterRange {
1161 private final Range[] mRange = new Range[]{
1162- new Range(0.1f, 10.0f, 1.0f)
1163+ new Range(0.1f, 10.0f, 1.0f, "Kontrast")
1164 };
1165
1166 @Override
1167- public void apply(PixelData original, PixelData temp)
1168- throws IllegalArgumentException {
1169- if(original == null || temp == null) throw new NullPointerException();
1170- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1171+ public void apply(PixelData original, PixelData temp){
1172+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
1173 throw new IllegalArgumentException();
1174- float mLUT[] = new float[256];
1175- for(int i=0;i<256;i++) mLUT[i] = Math.max(0.0f, Math.min(255.0f, mRange[0].getValue()*((float)i-127.5f)+127.5f));
1176+ }
1177+ float[] origData = original.getData();
1178+ float[] tempData = temp.getData();
1179+ float mLUT[] = new float[PixelData.RGBCMY_CHANNEL_PRECISION];
1180+ for(int i=0;i<PixelData.RGBCMY_CHANNEL_PRECISION;i++){
1181+ mLUT[i] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mRange[0].getValue()*((float)i-PixelData.RGBCMY_CHANNEL_PRECISION/2.0f) + PixelData.RGBCMY_CHANNEL_PRECISION/2.0f));
1182+ }
1183 original.toRGB(); temp.toRGB();
1184- for(int i=0;i<original.mData.length;i++)
1185- temp.mData[i] = mLUT[(int)original.mData[i]];
1186+ for(int i=0;i<origData.length;i++){
1187+ tempData[i] = mLUT[(int)origData[i]];
1188+ }
1189 }
1190
1191 @Override
1192 public PixelData apply(PixelData image) {
1193- if(image == null) return null;
1194+ if(image == null) {return null;}
1195 PixelData ret = (PixelData)image.clone();
1196 apply(image, image);
1197 return ret;
1198@@ -32,7 +36,29 @@
1199
1200 @Override
1201 public Range[] getRangeTable() {
1202- return mRange;
1203+ return mRange.clone();
1204+ }
1205+
1206+ @Override
1207+ public void setRangeTable(Range[] table) {
1208+ if(table == null || table.length != mRange.length){
1209+ throw new IllegalArgumentException();
1210+ }
1211+ for(int i=0;i<table.length;i++){
1212+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
1213+ throw new IllegalArgumentException();
1214+ }
1215+ }
1216+ for(int i=0;i<table.length;i++){
1217+ mRange[i].setValue(table[i].getValue());
1218+ }
1219+ }
1220+
1221+ @Override
1222+ public void reset() {
1223+ for(int i=0;i<mRange.length;i++){
1224+ mRange[i].reset();
1225+ }
1226 }
1227
1228 }
1229
1230=== modified file 'src/main/java/manager/editor/FilterExposure.java'
1231--- src/main/java/manager/editor/FilterExposure.java 2012-04-08 17:57:35 +0000
1232+++ src/main/java/manager/editor/FilterExposure.java 2012-04-17 18:42:22 +0000
1233@@ -8,24 +8,26 @@
1234 */
1235 public class FilterExposure implements IFilterRange{
1236 private final Range[] mRange = new Range[]{
1237- new Range(-3.0f, 3.0f, 0.0f)
1238+ new Range(-3.0f, 3.0f, 0.0f, "EV")
1239 };
1240
1241 @Override
1242- public void apply(PixelData original, PixelData temp)
1243- throws IllegalArgumentException {
1244- if(original == null || temp == null) throw new NullPointerException();
1245- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1246+ public void apply(PixelData original, PixelData temp) {
1247+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
1248 throw new IllegalArgumentException();
1249+ }
1250+ float[] origData = original.getData();
1251+ float[] tempData = temp.getData();
1252 float coef = (float)Math.pow(2.0f, mRange[0].getValue());
1253 original.toRGB(); temp.toRGB();
1254- for(int i=0;i<original.mData.length;i++)
1255- temp.mData[i] = Math.max(0.0f, Math.min(255.0f, coef*original.mData[i]));
1256+ for(int i=0;i<origData.length;i++){
1257+ tempData[i] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, coef*origData[i]));
1258+ }
1259 }
1260
1261 @Override
1262 public PixelData apply(PixelData image) {
1263- if(image == null) return null;
1264+ if(image == null) {return null;}
1265 PixelData ret = (PixelData)image.clone();
1266 apply(image, image);
1267 return ret;
1268@@ -33,7 +35,29 @@
1269
1270 @Override
1271 public Range[] getRangeTable() {
1272- return mRange;
1273+ return mRange.clone();
1274+ }
1275+
1276+ @Override
1277+ public void setRangeTable(Range[] table) {
1278+ if(table == null || table.length != mRange.length){
1279+ throw new IllegalArgumentException();
1280+ }
1281+ for(int i=0;i<table.length;i++){
1282+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
1283+ throw new IllegalArgumentException();
1284+ }
1285+ }
1286+ for(int i=0;i<table.length;i++){
1287+ mRange[i].setValue(table[i].getValue());
1288+ }
1289+ }
1290+
1291+ @Override
1292+ public void reset() {
1293+ for(int i=0;i<mRange.length;i++){
1294+ mRange[i].reset();
1295+ }
1296 }
1297
1298 }
1299
1300=== modified file 'src/main/java/manager/editor/FilterFactory.java'
1301--- src/main/java/manager/editor/FilterFactory.java 2012-04-10 11:51:18 +0000
1302+++ src/main/java/manager/editor/FilterFactory.java 2012-04-17 18:42:22 +0000
1303@@ -4,9 +4,12 @@
1304
1305 /**
1306 * Fabryka Filtrów - generuje filtry gotowe do aplikowania na obrazie
1307+ * próba stworzenia obiektu tej klasy nawet przy użyciu refleksji skończy się
1308+ * wyrzuceniem wyjątku <b>UnsupportedOperationException</b>
1309 * @author Patryk
1310 */
1311-public class FilterFactory {
1312+public final class FilterFactory {
1313+ private FilterFactory(){throw new UnsupportedOperationException();}
1314 /**
1315 * @return Filtr tworzący negatyw obrazu
1316 */
1317@@ -43,19 +46,19 @@
1318 /**
1319 * @return Filtr odpowiedzialny za korekcję kanałów RGB
1320 */
1321- public static IFilterRange RGBCorrection(){
1322+ public static IFilterRange rgbCorrection(){
1323 return new FilterRGBCorrection();
1324 }
1325 /**
1326 * @return Filtr odpowiedzialny za korekcję kanałów CMY
1327 */
1328- public static IFilterRange CMYCorrection(){
1329+ public static IFilterRange cmyCorrection(){
1330 return new FilterCMYCorrection();
1331 }
1332 /**
1333 * @return Filtr odpowiedzialny za korekcję kanałów HSV
1334 */
1335- public static IFilterRange HSVCorrection(){
1336+ public static IFilterRange hsvCorrection(){
1337 return new FilterHSVCorrection();
1338 }
1339 /**
1340@@ -101,55 +104,84 @@
1341 return new FilterColorAccent();
1342 }
1343
1344+ //LUT
1345+
1346+ /**
1347+ * @return Filtr odpowiedzialny za kanałowa korektę RGB tablicą LUT
1348+ */
1349+ public static IFilterLUT lutRGBCorrection(){
1350+ return new FilterLUTCorrectionRGB();
1351+ }
1352+ /**
1353+ * @return Filtr odpowiedzialny za kanałowa korektę CMY tablicą LUT
1354+ */
1355+ public static IFilterLUT lutCMYCorrection(){
1356+ return new FilterLUTCorrectionCMY();
1357+ }
1358+ /**
1359+ * @return Filtr odpowiedzialny za kanałowa korektę HSV tablicą LUT
1360+ */
1361+ public static IFilterLUT lutHSVCorrection(){
1362+ return new FilterLUTCorrectionHSV();
1363+ }
1364+
1365 //EDGE DETECTING
1366
1367 /**
1368 * @return Filtr wykrywający krawędzie ukierunkowany na pionowe krawędzie
1369 */
1370 public static IFilter edgeDetectionVertical(){
1371- return new FilterMatrixAdapter(new Matrix(new float[]{0,0,0, -1,1,0, 0,0,0}));
1372+ float[] mCoef = new float[]{0,0,0, -1,1,0, 0,0,0};
1373+ return new FilterMatrixAdapter(new Matrix(mCoef));
1374 }
1375 /**
1376 * @return Filtr wykrywający krawędzie ukierunkowany na poziome krawędzie
1377 */
1378 public static IFilter edgeDetectionHorizontal(){
1379- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,0, 0,1,0, 0,0,0}));
1380+ float[] mCoef = new float[]{0,-1,0, 0,1,0, 0,0,0};
1381+ return new FilterMatrixAdapter(new Matrix(mCoef));
1382 }
1383 /**
1384 * @return Filtr wykrywający krawędzie ukierunkowany na skośne krawędzie
1385 */
1386 public static IFilter edgeDetectionDiagonal1(){
1387- return new FilterMatrixAdapter(new Matrix(new float[]{-1,0,0, 0,1,0, 0,0,0}));
1388+ float[] mCoef = new float[]{-1,0,0, 0,1,0, 0,0,0};
1389+ return new FilterMatrixAdapter(new Matrix(mCoef));
1390 }
1391 /**
1392 * @return Filtr wykrywający krawędzie ukierunkowany na skośne krawędzie
1393 */
1394 public static IFilter edgeDetectionDiagonal2(){
1395- return new FilterMatrixAdapter(new Matrix(new float[]{0,0,-1, 0,1,0, 0,0,0}));
1396+ float[] mCoef = new float[]{0,0,-1, 0,1,0, 0,0,0};
1397+ return new FilterMatrixAdapter(new Matrix(mCoef));
1398 }
1399 /**
1400 * @return Filtr wykrywający krawędzie metodą Sobel'a typ poziomy
1401 */
1402 public static IFilter edgeDetectionSobelHorizontal(){
1403- return new FilterMatrixAdapter(new Matrix(new float[]{1,2,1,0,0,0,-1,-2,-1}));
1404+ float[] mCoef = new float[]{1,2,1, 0,0,0, -1,-2,-1};
1405+ return new FilterMatrixAdapter(new Matrix(mCoef));
1406 }
1407 /**
1408 * @return Filtr wykrywający krawędzie metodą Sobel'a typ pionowy
1409 */
1410 public static IFilter edgeDetectionSobelVertical(){
1411- return new FilterMatrixAdapter(new Matrix(new float[]{1,0,-1,2,0,-2,1,0,-1}));
1412+ float[] mCoef = new float[]{1,0,-1, 2,0,-2, 1,0,-1};
1413+ return new FilterMatrixAdapter(new Matrix(mCoef));
1414 }
1415 /**
1416 * @return Filtr wykrywający krawędzie metodą Prewitt'a typ poziomy
1417 */
1418 public static IFilter edgeDetectionPrewittHorizontal(){
1419- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,-1,0,0,0,1,1,1}));
1420+ float[] mCoef = new float[]{-1,-1,-1, 0,0,0, 1,1,1};
1421+ return new FilterMatrixAdapter(new Matrix(mCoef));
1422 }
1423 /**
1424 * @return Filtr wykrywający krawędzie metodą Prewitt'a typ pionowy
1425 */
1426 public static IFilter edgeDetectionPrewittVertical(){
1427- return new FilterMatrixAdapter(new Matrix(new float[]{1,0,-1,1,0,-1,1,0,-1}));
1428+ float[] mCoef = new float[]{1,0,-1 ,1,0,-1, 1,0,-1};
1429+ return new FilterMatrixAdapter(new Matrix(mCoef));
1430 }
1431
1432 //EDGE DETECTING LAPLACE
1433@@ -159,39 +191,45 @@
1434 * go zdolność do tworzenia ostrzejszych krawędzi
1435 */
1436 public static IFilter edgeDetectionLaplace1(){
1437- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,0, -1,4,-1, 0,-1,0}));
1438+ float[] mCoef = new float[]{0,-1,0, -1,4,-1, 0,-1,0};
1439+ return new FilterMatrixAdapter(new Matrix(mCoef));
1440 }
1441 /**
1442 * @return Filtr Laplace'a do wielokierunkowego wykrywania krawędzi - od pozostałych filtrów odróżnia
1443 * go zdolność do tworzenia ostrzejszych krawędzi
1444 */
1445 public static IFilter edgeDetectionLaplace2(){
1446- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,-1, -1,8,-1, -1,-1,-1}));
1447+ float[] mCoef = new float[]{-1,-1,-1, -1,8,-1, -1,-1,-1};
1448+ return new FilterMatrixAdapter(new Matrix(mCoef));
1449 }
1450 /**
1451 * @return Filtr Laplace'a do wielokierunkowego wykrywania krawędzi - od pozostałych filtrów odróżnia
1452 * go zdolność do tworzenia ostrzejszych krawędzi
1453 */
1454 public static IFilter edgeDetectionLaplace3(){
1455- return new FilterMatrixAdapter(new Matrix(new float[]{1,-2,1, -2,4,-2, 1,-2,1}));
1456+ float[] mCoef = new float[]{1,-2,1, -2,4,-2, 1,-2,1};
1457+ return new FilterMatrixAdapter(new Matrix(mCoef));
1458 }
1459 /**
1460 * @return Filtr Laplace'a do przekątniowego wykrywania krawędzi
1461 */
1462 public static IFilter edgeDetectionLaplaceDiagonal(){
1463- return new FilterMatrixAdapter(new Matrix(new float[]{-1,0,-1, 0,4,0, -1,0,-1}));
1464+ float[] mCoef = new float[]{-1,0,-1, 0,4,0, -1,0,-1};
1465+ return new FilterMatrixAdapter(new Matrix(mCoef));
1466 }
1467 /**
1468 * @return Filtr Laplace'a do wykrywania krawędzi poziomych
1469 */
1470 public static IFilter edgeDetectionLaplaceHorizontal(){
1471- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,0, 0,2,0, 0,-1,0}));
1472+ float[] mCoef = new float[]{0,-1,0, 0,2,0, 0,-1,0};
1473+ return new FilterMatrixAdapter(new Matrix(mCoef));
1474 }
1475 /**
1476 * @return Filtr Laplace'a do wykrywania krawędzi pionowych
1477 */
1478 public static IFilter edgeDetectionLaplaceVertical(){
1479- return new FilterMatrixAdapter(new Matrix(new float[]{0,0,0, -1,2,-1, 0,0,0}));
1480+ float[] mCoef = new float[]{0,0,0, -1,2,-1, 0,0,0};
1481+ return new FilterMatrixAdapter(new Matrix(mCoef));
1482 }
1483
1484 //GRADIENT DIRECTIONAL EDGE DETECTING
1485@@ -200,49 +238,57 @@
1486 * @return Filtr gradientowy wykrywający krawędzie w kierunku wschodnim
1487 */
1488 public static IFilter edgeDetectionGradientDirectionalEast(){
1489- return new FilterMatrixAdapter(new Matrix(new float[]{-1,1,1, -1,-2,1, -1,1,1}));
1490+ float[] mCoef = new float[]{-1,1,1, -1,-2,1, -1,1,1};
1491+ return new FilterMatrixAdapter(new Matrix(mCoef));
1492 }
1493 /**
1494 * @return Filtr gradientowy wykrywający krawędzie w kierunku południowo-wschodnim
1495 */
1496 public static IFilter edgeDetectionGradientDirectionalSouthEast(){
1497- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,1, -1,-2,1, 1,1,1}));
1498+ float[] mCoef = new float[]{-1,-1,1, -1,-2,1, 1,1,1};
1499+ return new FilterMatrixAdapter(new Matrix(mCoef));
1500 }
1501 /**
1502 * @return Filtr gradientowy wykrywający krawędzie w kierunku południowym
1503 */
1504 public static IFilter edgeDetectionGradientDirectionalSouth(){
1505- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,-1, 1,-2,1, 1,1,1}));
1506+ float[] mCoef = new float[]{-1,-1,-1, 1,-2,1, 1,1,1};
1507+ return new FilterMatrixAdapter(new Matrix(mCoef));
1508 }
1509 /**
1510 * @return Filtr gradientowy wykrywający krawędzie w kierunku południowo-zachodnim
1511 */
1512 public static IFilter edgeDetectionGradientDirectionalSouthWest(){
1513- return new FilterMatrixAdapter(new Matrix(new float[]{1,-1,-1, 1,-2,-1, 1,1,1}));
1514+ float[] mCoef = new float[]{1,-1,-1, 1,-2,-1, 1,1,1};
1515+ return new FilterMatrixAdapter(new Matrix(mCoef));
1516 }
1517 /**
1518 * @return Filtr gradientowy wykrywający krawędzie w kierunku zachodnim
1519 */
1520 public static IFilter edgeDetectionGradientDirectionalWest(){
1521- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,-1, 1,-2,-1, 1,1,-1}));
1522+ float[] mCoef = new float[]{1,1,-1, 1,-2,-1, 1,1,-1};
1523+ return new FilterMatrixAdapter(new Matrix(mCoef));
1524 }
1525 /**
1526 * @return Filtr gradientowy wykrywający krawędzie w kierunku północno-zachodnim
1527 */
1528 public static IFilter edgeDetectionGradientDirectionalNorthWest(){
1529- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,-2,-1, 1,-1,-1}));
1530+ float[] mCoef = new float[]{1,1,1, 1,-2,-1, 1,-1,-1};
1531+ return new FilterMatrixAdapter(new Matrix(mCoef));
1532 }
1533 /**
1534 * @return Filtr gradientowy wykrywający krawędzie w kierunku północnym
1535 */
1536 public static IFilter edgeDetectionGradientDirectionalNorth(){
1537- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,-2,1, -1,-1,-1}));
1538+ float[] mCoef = new float[]{1,1,1, 1,-2,1, -1,-1,-1};
1539+ return new FilterMatrixAdapter(new Matrix(mCoef));
1540 }
1541 /**
1542 * @return Filtr gradientowy wykrywający krawędzie w kierunku północn0-wschodnim
1543 */
1544 public static IFilter edgeDetectionGradientDirectionalNorthEast(){
1545- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, -1,-2,1, -1,-1,1}));
1546+ float[] mCoef = new float[]{1,1,1, -1,-2,1, -1,-1,1};
1547+ return new FilterMatrixAdapter(new Matrix(mCoef));
1548 }
1549
1550 //LOW PASS FILTERS
1551@@ -252,23 +298,24 @@
1552 * aktualnego pixela wraz ze swoimi 8 sąsiadami
1553 */
1554 public static IFilter lowPassAverage3x3(){
1555- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,1,1, 1,1,1}));
1556+ float[] mCoef = new float[]{1,1,1, 1,1,1, 1,1,1};
1557+ return new FilterMatrixAdapter(new Matrix(mCoef));
1558 }
1559 /**
1560 * @return Filtr dolnoprzepustowy uśredniający - podstawowy filtr uśredniający, uśrednia wartość
1561 * aktualnego pixela wraz ze swoimi 24 sąsiadami
1562 */
1563 public static IFilter lowPassAverage5x5(){
1564- return new FilterMatrixAdapter(new Matrix(
1565- new float[]{1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1}));
1566+ float[] mCoef = new float[]{1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1};
1567+ return new FilterMatrixAdapter(new Matrix(mCoef));
1568 }
1569 /**
1570 * @return Filtr dolnoprzepustowy uśredniający - podstawowy filtr uśredniający, uśrednia wartość
1571 * aktualnego pixela wraz ze swoimi 20 sąsiadami (leżacymi najbliżej na kole)
1572 */
1573 public static IFilter lowPassAverageCircle(){
1574- return new FilterMatrixAdapter(new Matrix(
1575- new float[]{0,1,1,1,0, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,1,1,1,0}));
1576+ float[] mCoef = new float[]{0,1,1,1,0, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,1,1,1,0};
1577+ return new FilterMatrixAdapter(new Matrix(mCoef));
1578 }
1579 /**
1580 * @return Filtr dolnoprzepustowy uśredniający - uśrednia wartość
1581@@ -276,44 +323,48 @@
1582 * niż w przypadku filtru klasycznego
1583 */
1584 public static IFilter lowPassLP1(){
1585- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,2,1, 1,1,1}));
1586+ float[] mCoef = new float[]{1,1,1, 1,2,1, 1,1,1};
1587+ return new FilterMatrixAdapter(new Matrix(mCoef));
1588 }
1589 /**
1590 * @return Filtr dolnoprzepustowy uśredniający - uśrednia wartość
1591 * aktualnego pixela wraz ze swoimi 8 sąsiadami, jeszcze mniejsze rozmycie niż w przypadku LP1
1592 */
1593 public static IFilter lowPassLP2(){
1594- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,4,1, 1,1,1}));
1595+ float[] mCoef = new float[]{1,1,1, 1,4,1, 1,1,1};
1596+ return new FilterMatrixAdapter(new Matrix(mCoef));
1597 }
1598 /**
1599 * @return Filtr dolnoprzepustowy uśredniający - uśrednia wartość
1600 * aktualnego pixela wraz ze swoimi 8 sąsiadami, jeszcze mniejsze rozmycie niż w przypadku LP2 i LP1
1601 */
1602 public static IFilter lowPassLP3(){
1603- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 1,12,1, 1,1,1}));
1604+ float[] mCoef = new float[]{1,1,1, 1,12,1, 1,1,1};
1605+ return new FilterMatrixAdapter(new Matrix(mCoef));
1606 }
1607 /**
1608 * @return Filtr dolnoprzepustowy piramidalny - nazwa bierze się od rozkładu czynników w macierzy,
1609 * które układają się wysokościowo w piramidę - waga pixela maleje wraz z oddalaniem od źródła
1610 */
1611 public static IFilter lowPassPyramid(){
1612- return new FilterMatrixAdapter(new Matrix(
1613- new float[]{1,2,3,2,1, 2,4,6,4,2, 3,6,9,6,3, 2,4,6,4,2, 1,2,3,2,1}));
1614+ float[] mCoef = new float[]{1,2,3,2,1, 2,4,6,4,2, 3,6,9,6,3, 2,4,6,4,2, 1,2,3,2,1};
1615+ return new FilterMatrixAdapter(new Matrix(mCoef));
1616 }
1617 /**
1618 * @return Filtr dolnoprzepustowy stożkowy - nazwa bierze się od rozkładu czynników w macierzy,
1619 * które układają się wysokościowo w stożek - waga pixela maleje wraz z oddalaniem od źródła
1620 */
1621 public static IFilter lowPassConical(){
1622- return new FilterMatrixAdapter(new Matrix(
1623- new float[]{0,0,1,0,0, 0,2,2,2,0, 1,2,5,2,1, 0,2,2,2,0, 0,0,1,0,0}));
1624+ float[] mCoef = new float[]{0,0,1,0,0, 0,2,2,2,0, 1,2,5,2,1, 0,2,2,2,0, 0,0,1,0,0};
1625+ return new FilterMatrixAdapter(new Matrix(mCoef));
1626 }
1627 /**
1628 * @return Filtr dolnoprzepustowy Gaussa - wartość wynikowa jest wynikiem funkcji rozkładu
1629 * normalnego - krzywej Gaussa - znaczenie punktu maleje wraz z oddalaniem od źródła
1630 */
1631 public static IFilter lowPassGauss1(){
1632- return new FilterMatrixAdapter(new Matrix(new float[]{1,2,1, 2,4,2, 1,2,1}));
1633+ float[] mCoef = new float[]{1,2,1, 2,4,2, 1,2,1};
1634+ return new FilterMatrixAdapter(new Matrix(mCoef));
1635 }
1636 /**
1637 * @return Filtr dolnoprzepustowy Gaussa - wartość wynikowa jest wynikiem funkcji rozkładu
1638@@ -321,8 +372,8 @@
1639 * dokładniejszy od Gauss1 - analizuje większą liczbę pixeli
1640 */
1641 public static IFilter lowPassGauss2(){
1642- return new FilterMatrixAdapter(new Matrix(
1643- new float[]{1,1,2,1,1, 1,2,4,2,1, 2,4,8,4,2, 1,2,4,2,1, 1,1,2,1,1}));
1644+ float[] mCoef = new float[]{1,1,2,1,1, 1,2,4,2,1, 2,4,8,4,2, 1,2,4,2,1, 1,1,2,1,1};
1645+ return new FilterMatrixAdapter(new Matrix(mCoef));
1646 }
1647 /**
1648 * @return Filtr dolnoprzepustowy Gaussa - wartość wynikowa jest wynikiem funkcji rozkładu
1649@@ -330,8 +381,8 @@
1650 * zmienione czynniki w stosunku do Gauss2
1651 */
1652 public static IFilter lowPassGauss3(){
1653- return new FilterMatrixAdapter(new Matrix(
1654- new float[]{0,1,2,1,0, 1,4,8,4,1, 2,8,16,8,2, 1,4,8,4,1, 0,1,2,1,0}));
1655+ float[] mCoef = new float[]{0,1,2,1,0, 1,4,8,4,1, 2,8,16,8,2, 1,4,8,4,1, 0,1,2,1,0};
1656+ return new FilterMatrixAdapter(new Matrix(mCoef));
1657 }
1658 /**
1659 * @return Filtr dolnoprzepustowy Gaussa - wartość wynikowa jest wynikiem funkcji rozkładu
1660@@ -339,21 +390,21 @@
1661 * zmienione czynniki w stosunku do Gauss2 i Gauss3
1662 */
1663 public static IFilter lowPassGauss4(){
1664- return new FilterMatrixAdapter(new Matrix(
1665- new float[]{1,4,7,4,1, 4,16,26,16,4, 7,26,41,26,7, 4,16,26,16,4, 1,4,7,4,1}));
1666+ float[] mCoef =new float[]{1,4,7,4,1, 4,16,26,16,4, 7,26,41,26,7, 4,16,26,16,4, 1,4,7,4,1};
1667+ return new FilterMatrixAdapter(new Matrix(mCoef));
1668 }
1669 /**
1670 * @return Filtr dolnoprzepustowy Gaussa - wersja 7x7 - obejmuje 49 pixeli
1671 */
1672 public static IFilter lowPassGauss5(){
1673- return new FilterMatrixAdapter(new Matrix(
1674- new float[]{1,1,2,2,2,1,1,
1675- 1,2,2,4,2,2,1,
1676- 2,2,4,8,4,2,2,
1677- 2,4,8,16,8,4,2,
1678- 2,2,4,8,4,2,2,
1679- 1,2,2,4,2,2,1,
1680- 1,1,2,2,2,1,1}));
1681+ float[] mCoef = new float[]{1,1,2,2,2,1,1,
1682+ 1,2,2,4,2,2,1,
1683+ 2,2,4,8,4,2,2,
1684+ 2,4,8,16,8,4,2,
1685+ 2,2,4,8,4,2,2,
1686+ 1,2,2,4,2,2,1,
1687+ 1,1,2,2,2,1,1};
1688+ return new FilterMatrixAdapter(new Matrix(mCoef));
1689 }
1690
1691 //HIGH PASS FILTERS
1692@@ -363,26 +414,30 @@
1693 * jest to podstawowy filtr wyostrzający szumy i krawędzie
1694 */
1695 public static IFilter highPassMeanRemoval(){
1696- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,-1, -1,9,-1, -1,-1,-1}));
1697+ float[] mCoef = new float[]{-1,-1,-1, -1,9,-1, -1,-1,-1};
1698+ return new FilterMatrixAdapter(new Matrix(mCoef));
1699 }
1700 /**
1701 * @return Filtr górnoprzepustowy - wyostrzający charakteryzuje się mniejszym wyostrzeniem szumów niż
1702 * MeanRemoval
1703 */
1704 public static IFilter highPassHP1(){
1705- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,0, -1,5,-1, 0,-1,0}));
1706+ float[] mCoef = new float[]{0,-1,0, -1,5,-1, 0,-1,0};
1707+ return new FilterMatrixAdapter(new Matrix(mCoef));
1708 }
1709 /**
1710 * @return Filtr górnoprzepustowy - wyostrzający w stosunku do HP1 zmienione współczynniki
1711 */
1712 public static IFilter highPassHP2(){
1713- return new FilterMatrixAdapter(new Matrix(new float[]{1,-2,1, -2,5,-2, 1,-2,1}));
1714+ float[] mCoef = new float[]{1,-2,1, -2,5,-2, 1,-2,1};
1715+ return new FilterMatrixAdapter(new Matrix(mCoef));
1716 }
1717 /**
1718 * @return Filtr górnoprzepustowy - wyostrzający większy nacisk na dany pixel niż w HP1
1719 */
1720 public static IFilter highPassHP3(){
1721- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,0, -1,20,-1, 0,-1,0}));
1722+ float[] mCoef = new float[]{0,-1,0, -1,20,-1, 0,-1,0};
1723+ return new FilterMatrixAdapter(new Matrix(mCoef));
1724 }
1725
1726 //EMBOSSING FILTERS
1727@@ -392,55 +447,63 @@
1728 * działa w kierunku wschodnim
1729 */
1730 public static IFilter embossEast(){
1731- return new FilterMatrixAdapter(new Matrix(new float[]{-1,0,1, -1,1,1, -1,0,1}));
1732+ float[] mCoef = new float[]{-1,0,1, -1,1,1, -1,0,1};
1733+ return new FilterMatrixAdapter(new Matrix(mCoef));
1734 }
1735 /**
1736 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1737 * działa w kierunku południowo-wschodnim
1738 */
1739 public static IFilter embossSouthEast(){
1740- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,0, -1,1,1, 0,1,1}));
1741+ float[] mCoef = new float[]{-1,-1,0, -1,1,1, 0,1,1};
1742+ return new FilterMatrixAdapter(new Matrix(mCoef));
1743 }
1744 /**
1745 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1746 * działa w kierunku południowym
1747 */
1748 public static IFilter embossSouth(){
1749- return new FilterMatrixAdapter(new Matrix(new float[]{-1,-1,-1, 0,1,0, 1,1,1}));
1750+ float[] mCoef = new float[]{-1,-1,-1, 0,1,0, 1,1,1};
1751+ return new FilterMatrixAdapter(new Matrix(mCoef));
1752 }
1753 /**
1754 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1755 * działa w kierunku południowo-zachodnim
1756 */
1757 public static IFilter embossSouthWest(){
1758- return new FilterMatrixAdapter(new Matrix(new float[]{0,-1,-1, 1,1,-1, 1,1,0}));
1759+ float[] mCoef = new float[]{0,-1,-1, 1,1,-1, 1,1,0};
1760+ return new FilterMatrixAdapter(new Matrix(mCoef));
1761 }
1762 /**
1763 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1764 * działa w kierunku zachodnim
1765 */
1766 public static IFilter embossWest(){
1767- return new FilterMatrixAdapter(new Matrix(new float[]{1,0,-1, 1,1,-1, 1,0,-1}));
1768+ float[] mCoef = new float[]{1,0,-1, 1,1,-1, 1,0,-1};
1769+ return new FilterMatrixAdapter(new Matrix(mCoef));
1770 }
1771 /**
1772 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1773 * działa w kierunku północno-zachodnim
1774 */
1775 public static IFilter embossNorthWest(){
1776- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,0, 1,1,-1, 0,-1,-1}));
1777+ float[] mCoef = new float[]{1,1,0, 1,1,-1, 0,-1,-1};
1778+ return new FilterMatrixAdapter(new Matrix(mCoef));
1779 }
1780 /**
1781 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1782 * działa w kierunku północnym
1783 */
1784 public static IFilter embossNorth(){
1785- return new FilterMatrixAdapter(new Matrix(new float[]{1,1,1, 0,1,0, -1,0,-1}));
1786+ float[] mCoef = new float[]{1,1,1, 0,1,0, -1,0,-1};
1787+ return new FilterMatrixAdapter(new Matrix(mCoef));
1788 }
1789 /**
1790 * @return Filtr uwypuklający - wprowadza złudzenie wypukłości tworząc efekt płaskorzeźby,
1791 * działa w kierunku północno-wschodnim
1792 */
1793 public static IFilter embossNorthEast(){
1794- return new FilterMatrixAdapter(new Matrix(new float[]{0,1,1, -1,1,1, -1,-1,0}));
1795+ float[] mCoef = new float[]{0,1,1, -1,1,1, -1,-1,0};
1796+ return new FilterMatrixAdapter(new Matrix(mCoef));
1797 }
1798 }
1799
1800=== modified file 'src/main/java/manager/editor/FilterGamma.java'
1801--- src/main/java/manager/editor/FilterGamma.java 2012-04-08 17:57:35 +0000
1802+++ src/main/java/manager/editor/FilterGamma.java 2012-04-17 18:42:22 +0000
1803@@ -6,26 +6,30 @@
1804 */
1805 public class FilterGamma implements IFilterRange{
1806 private final Range[] mRange = new Range[]{
1807- new Range(0.2f, 5.0f, 1.0f)
1808+ new Range(0.2f, 5.0f, 1.0f, "Gamma")
1809 };
1810
1811 @Override
1812- public void apply(PixelData original, PixelData temp)
1813- throws IllegalArgumentException {
1814- if(original == null || temp == null) throw new NullPointerException();
1815- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1816+ public void apply(PixelData original, PixelData temp) {
1817+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
1818 throw new IllegalArgumentException();
1819- float mLUT[] = new float[256];
1820- float gamma = 1 / mRange[0].getValue();
1821- for(int i=0;i<256;i++) mLUT[i] = 255.0f * (float)Math.pow((float)i/255.0f, gamma);
1822+ }
1823+ float[] origData = original.getData();
1824+ float[] tempData = temp.getData();
1825+ float mLUT[] = new float[PixelData.RGBCMY_CHANNEL_PRECISION];
1826+ float gamma = 1.0f / mRange[0].getValue();
1827+ for(int i=0;i<PixelData.RGBCMY_CHANNEL_PRECISION;i++) {
1828+ mLUT[i] = ColorConverter.RGBCMY_BYTE_MAX * (float)Math.pow((float)i/ColorConverter.RGBCMY_BYTE_MAX, gamma);
1829+ }
1830 original.toRGB(); temp.toRGB();
1831- for(int i=0;i<original.mData.length;i++)
1832- temp.mData[i] = mLUT[(int)original.mData[i]];
1833+ for(int i=0;i<origData.length;i++){
1834+ tempData[i] = mLUT[(int)origData[i]];
1835+ }
1836 }
1837
1838 @Override
1839 public PixelData apply(PixelData image) {
1840- if(image == null) return null;
1841+ if(image == null) {return null;}
1842 PixelData ret = (PixelData)image.clone();
1843 apply(image, image);
1844 return ret;
1845@@ -33,7 +37,29 @@
1846
1847 @Override
1848 public Range[] getRangeTable() {
1849- return mRange;
1850+ return mRange.clone();
1851+ }
1852+
1853+ @Override
1854+ public void setRangeTable(Range[] table) {
1855+ if(table == null || table.length != mRange.length){
1856+ throw new IllegalArgumentException();
1857+ }
1858+ for(int i=0;i<table.length;i++){
1859+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
1860+ throw new IllegalArgumentException();
1861+ }
1862+ }
1863+ for(int i=0;i<table.length;i++){
1864+ mRange[i].setValue(table[i].getValue());
1865+ }
1866+ }
1867+
1868+ @Override
1869+ public void reset() {
1870+ for(int i=0;i<mRange.length;i++){
1871+ mRange[i].reset();
1872+ }
1873 }
1874
1875 }
1876
1877=== modified file 'src/main/java/manager/editor/FilterGrayScale.java'
1878--- src/main/java/manager/editor/FilterGrayScale.java 2012-04-08 17:57:35 +0000
1879+++ src/main/java/manager/editor/FilterGrayScale.java 2012-04-17 18:42:22 +0000
1880@@ -16,41 +16,52 @@
1881 mType = type;
1882 }
1883 @Override
1884- public void apply(PixelData original, PixelData temp)
1885- throws IllegalArgumentException {
1886- if(original == null || temp == null) throw new NullPointerException();
1887- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1888+ public void apply(PixelData original, PixelData temp){
1889+ int mWidth = original.getWidth(), mHeight = original.getHeight();
1890+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
1891 throw new IllegalArgumentException();
1892+ }
1893+ float[] origData = original.getData();
1894+ float[] tempData = temp.getData();
1895 original.toRGB(); temp.toRGB();
1896- float gray=0.0f,R,G,B;
1897- for(int i=0;i<original.mWidth;i++)
1898- for(int j=0;j<original.mHeight;j++){
1899- R = original.mData[3*(i*original.mHeight+j)];
1900- G = original.mData[3*(i*original.mHeight+j)+1];
1901- B = original.mData[3*(i*original.mHeight+j)+2];
1902+ float gray=0.0f,mR,mG,mB;
1903+ for(int i=0;i<mWidth;i++){
1904+ for(int j=0;j<mHeight;j++){
1905+ mR = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)];
1906+ mG = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1];
1907+ mB = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
1908 switch(mType){
1909 case LIGHTNESS:
1910- gray = (Math.max(R, Math.max(G, B)) + Math.min(R, Math.min(G, B)))/2.0f;
1911+ gray = (Math.max(mR, Math.max(mG, mB)) + Math.min(mR, Math.min(mG, mB)))/2.0f;
1912 break;
1913 case AVERAGE:
1914- gray = (R+G+B)/3.0f;
1915+ gray = (mR+mG+mB)/(float)PixelData.PIXEL_SIZE;
1916 break;
1917 case LUMINOSITY:
1918- gray = 0.21f*R + 0.71f*G + 0.07f*B;
1919+ gray = ColorConverter.RED_LUMINOSITY * mR +
1920+ ColorConverter.GREEN_LUMINOSITY * mG +
1921+ ColorConverter.BLUE_LUMINOSITY * mB;
1922+ break;
1923+ default:
1924+ gray = 0.0f;
1925 break;
1926 }
1927- temp.mData[3*(i*original.mHeight+j)] = gray;
1928- temp.mData[3*(i*original.mHeight+j)+1] = gray;
1929- temp.mData[3*(i*original.mHeight+j)+2] = gray;
1930+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = gray;
1931+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = gray;
1932+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = gray;
1933 }
1934+ }
1935 }
1936
1937 @Override
1938 public PixelData apply(PixelData image) {
1939- if(image == null) return null;
1940+ if(image == null) {return null;}
1941 PixelData ret = (PixelData)image.clone();
1942 apply(image, image);
1943 return ret;
1944 }
1945+
1946+ @Override
1947+ public void reset() {}
1948
1949 }
1950
1951=== modified file 'src/main/java/manager/editor/FilterHSVCorrection.java'
1952--- src/main/java/manager/editor/FilterHSVCorrection.java 2012-04-10 11:51:18 +0000
1953+++ src/main/java/manager/editor/FilterHSVCorrection.java 2012-04-17 18:42:22 +0000
1954@@ -6,36 +6,39 @@
1955 */
1956 public class FilterHSVCorrection implements IFilterRange{
1957 private final Range[] mRange = new Range[]{
1958- new Range(-180.0f, 180.0f, 0.0f),
1959- new Range(-0.5f, 0.5f, 0.0f),
1960- new Range(-0.5f, 0.5f, 0.0f)
1961+ new Range(-ColorConverter.HUE_MAX/2.0f, ColorConverter.HUE_MAX/2.0f, 0.0f, "Barwa"),
1962+ new Range(-ColorConverter.RGBCMY_FLOAT_MAX/2.0f, ColorConverter.RGBCMY_FLOAT_MAX/2.0f, 0.0f, "Nasycenie"),
1963+ new Range(-ColorConverter.RGBCMY_FLOAT_MAX/2.0f, ColorConverter.RGBCMY_FLOAT_MAX/2.0f, 0.0f, "Jasność")
1964 };
1965
1966 @Override
1967- public void apply(PixelData original, PixelData temp)
1968- throws IllegalArgumentException {
1969- if(original == null || temp == null) throw new NullPointerException();
1970- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
1971+ public void apply(PixelData original, PixelData temp){
1972+ int mWidth = original.getWidth(), mHeight = original.getHeight();
1973+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
1974 throw new IllegalArgumentException();
1975+ }
1976+ float[] origData = original.getData();
1977+ float[] tempData = temp.getData();
1978 original.toHSV(); temp.toHSV();
1979- float H,S,V;
1980- float Hd = mRange[0].getValue(), Sd = mRange[1].getValue(), Vd = mRange[2].getValue();
1981- for(int i=0;i<original.mWidth;i++)
1982- for(int j=0;j<original.mHeight;j++){
1983- H = original.mData[3*(i*original.mHeight+j)];
1984- S = original.mData[3*(i*original.mHeight+j)+1];
1985- V = original.mData[3*(i*original.mHeight+j)+2];
1986- H+=Hd; if(H >= 360.0f) H -= 360.0f;
1987- if(H < 0.0f) H += 360.0f;
1988- temp.mData[3*(i*original.mHeight+j)] = H;
1989- temp.mData[3*(i*original.mHeight+j)+1] = Math.max(0.0f, Math.min(1.0f, S+Sd));
1990- temp.mData[3*(i*original.mHeight+j)+2] = Math.max(0.0f, Math.min(1.0f, V+Vd));
1991+ float mH,mS,mV;
1992+ float dH = mRange[0].getValue(), dS = mRange[1].getValue(), dV = mRange[2].getValue();
1993+ for(int i=0;i<mWidth;i++){
1994+ for(int j=0;j<mHeight;j++){
1995+ mH = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)];
1996+ mS = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1];
1997+ mV = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
1998+ mH+=dH; if(mH >= ColorConverter.HUE_MAX) {mH -= ColorConverter.HUE_MAX;}
1999+ if(mH < 0.0f) {mH += ColorConverter.HUE_MAX;}
2000+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = mH;
2001+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mS+dS));
2002+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_FLOAT_MAX, mV+dV));
2003 }
2004+ }
2005 }
2006
2007 @Override
2008 public PixelData apply(PixelData image) {
2009- if(image == null) return null;
2010+ if(image == null) {return null;}
2011 PixelData ret = (PixelData)image.clone();
2012 apply(image, image);
2013 return ret;
2014@@ -43,6 +46,28 @@
2015
2016 @Override
2017 public Range[] getRangeTable() {
2018- return mRange;
2019+ return mRange.clone();
2020+ }
2021+
2022+ @Override
2023+ public void setRangeTable(Range[] table) {
2024+ if(table == null || table.length != mRange.length){
2025+ throw new IllegalArgumentException();
2026+ }
2027+ for(int i=0;i<table.length;i++){
2028+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
2029+ throw new IllegalArgumentException();
2030+ }
2031+ }
2032+ for(int i=0;i<table.length;i++){
2033+ mRange[i].setValue(table[i].getValue());
2034+ }
2035+ }
2036+
2037+ @Override
2038+ public void reset() {
2039+ for(int i=0;i<mRange.length;i++){
2040+ mRange[i].reset();
2041+ }
2042 }
2043 }
2044
2045=== modified file 'src/main/java/manager/editor/FilterImageResizeBilinear.java'
2046--- src/main/java/manager/editor/FilterImageResizeBilinear.java 2012-04-08 17:57:35 +0000
2047+++ src/main/java/manager/editor/FilterImageResizeBilinear.java 2012-04-17 18:42:22 +0000
2048@@ -20,38 +20,41 @@
2049 * zapisuje obraz original do obrazu image odpowiednio go skalując
2050 */
2051 @Override
2052- public void apply(PixelData original, PixelData temp)
2053- throws IllegalArgumentException {
2054- if(original == null || temp == null) throw new NullPointerException();
2055- float ratioX = (float)original.mWidth/(float)temp.mWidth;
2056- float ratioY = (float)original.mHeight/(float)temp.mHeight;
2057+ public void apply(PixelData original, PixelData temp) {
2058+ int mOrigWidth = original.getWidth(), mOrigHeight = original.getHeight();
2059+ int mTempWidth = temp.getWidth(), mTempHeight = temp.getHeight();
2060+ float ratioX = (float)mOrigWidth/(float)mTempWidth;
2061+ float ratioY = (float)mOrigHeight/(float)mTempHeight;
2062+ float[] origData = original.getData();
2063+ float[] tempData = temp.getData();
2064 original.toRGB(); temp.toRGB();
2065- float ip,jp,Rbeg,Rend,Gbeg,Gend,Bbeg,Bend,coef;
2066+ float ip,jp,mRbeg,mRend,mGbeg,mGend,mBbeg,mBend,coef;
2067 int indIbeg, indIend, indJbeg, indJend;
2068- for(int j=0;j<temp.mHeight;j++)
2069- for(int i=0;i<temp.mWidth;i++){
2070+ for(int j=0;j<mTempHeight;j++){
2071+ for(int i=0;i<mTempWidth;i++){
2072 ip = (float)i*ratioX;
2073 jp = (float)j*ratioY;
2074 //wspolrzene kraty próbkowania
2075- if((int)ip >= original.mWidth) indIbeg = original.mWidth-1; else indIbeg = (int)ip;
2076- if((int)jp >= original.mHeight) indJbeg = original.mHeight-1; else indJbeg = (int)jp;
2077- if(indIbeg + 1 >= original.mWidth) indIend = original.mWidth-1; else indIend = indIbeg+1;
2078- if(indJbeg + 1 >= original.mHeight) indJend = original.mHeight-1; else indJend = indJbeg+1;
2079- jp = Math.min(original.mHeight, jp); ip = Math.min(original.mWidth, ip);
2080+ if((int)ip >= mOrigWidth) {indIbeg = mOrigWidth-1;} else {indIbeg = (int)ip;}
2081+ if((int)jp >= mOrigHeight) {indJbeg = mOrigHeight-1;} else {indJbeg = (int)jp;}
2082+ if(indIbeg + 1 >= mOrigWidth) {indIend = mOrigWidth-1;} else {indIend = indIbeg+1;}
2083+ if(indJbeg + 1 >= mOrigHeight) {indJend = mOrigHeight-1;} else {indJend = indJbeg+1;}
2084+ jp = Math.min(mOrigHeight, jp); ip = Math.min(mOrigWidth, ip);
2085 //probkowanie poziome
2086 coef = ip-(float)indIbeg;
2087- Rbeg = original.mData[3*(indJbeg*original.mWidth+indIbeg)] * coef + original.mData[3*(indJbeg*original.mWidth+indIend)] * (1.0f-coef);
2088- Gbeg = original.mData[3*(indJbeg*original.mWidth+indIbeg)+1] * coef + original.mData[3*(indJbeg*original.mWidth+indIend)+1] * (1.0f-coef);
2089- Bbeg = original.mData[3*(indJbeg*original.mWidth+indIbeg)+2] * coef + original.mData[3*(indJbeg*original.mWidth+indIend)+2] * (1.0f-coef);
2090- Rend = original.mData[3*(indJend*original.mWidth+indIbeg)] * coef + original.mData[3*(indJend*original.mWidth+indIend)] * (1.0f-coef);
2091- Gend = original.mData[3*(indJend*original.mWidth+indIbeg)+1] * coef + original.mData[3*(indJend*original.mWidth+indIend)+1] * (1.0f-coef);
2092- Bend = original.mData[3*(indJend*original.mWidth+indIbeg)+2] * coef + original.mData[3*(indJend*original.mWidth+indIend)+2] * (1.0f-coef);
2093+ mRbeg = origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIbeg)] * coef + origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIend)] * (1.0f-coef);
2094+ mGbeg = origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIbeg)+1] * coef + origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIend)+1] * (1.0f-coef);
2095+ mBbeg = origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIbeg)+2] * coef + origData[PixelData.PIXEL_SIZE*(indJbeg*mOrigWidth+indIend)+2] * (1.0f-coef);
2096+ mRend = origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIbeg)] * coef + origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIend)] * (1.0f-coef);
2097+ mGend = origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIbeg)+1] * coef + origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIend)+1] * (1.0f-coef);
2098+ mBend = origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIbeg)+2] * coef + origData[PixelData.PIXEL_SIZE*(indJend*mOrigWidth+indIend)+2] * (1.0f-coef);
2099 //probkowanie pionowe
2100 coef = jp-(float)indJbeg;
2101- temp.mData[3*(j*temp.mWidth+i)] = Rbeg * coef + Rend * (1.0f-coef);
2102- temp.mData[3*(j*temp.mWidth+i)+1] = Gbeg * coef + Gend * (1.0f-coef);
2103- temp.mData[3*(j*temp.mWidth+i)+2] = Bbeg * coef + Bend * (1.0f-coef);
2104+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)] = mRbeg * coef + mRend * (1.0f-coef);
2105+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)+1] = mGbeg * coef + mGend * (1.0f-coef);
2106+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)+2] = mBbeg * coef + mBend * (1.0f-coef);
2107 }
2108+ }
2109 }
2110 /**
2111 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2112@@ -60,9 +63,12 @@
2113 */
2114 @Override
2115 public PixelData apply(PixelData image) {
2116- if(image == null) return null;
2117+ if(image == null) {return null;}
2118 PixelData ret = new PixelData(mWidth, mHeight);
2119 apply(image, ret);
2120 return ret;
2121 }
2122+
2123+ @Override
2124+ public void reset() {}
2125 }
2126
2127=== modified file 'src/main/java/manager/editor/FilterImageResizeNearestNeighbour.java'
2128--- src/main/java/manager/editor/FilterImageResizeNearestNeighbour.java 2012-04-08 17:57:35 +0000
2129+++ src/main/java/manager/editor/FilterImageResizeNearestNeighbour.java 2012-04-17 18:42:22 +0000
2130@@ -14,25 +14,28 @@
2131 * zapisuje obraz original do obrazu image odpowiednio go skalując
2132 */
2133 @Override
2134- public void apply(PixelData original, PixelData temp)
2135- throws IllegalArgumentException {
2136- if(original == null || temp == null) throw new NullPointerException();
2137- float ratioX = (float)original.mWidth/(float)temp.mWidth;
2138- float ratioY = (float)original.mHeight/(float)temp.mHeight;
2139+ public void apply(PixelData original, PixelData temp){
2140+ int mOrigWidth = original.getWidth(), mOrigHeight = original.getHeight();
2141+ int mTempWidth = temp.getWidth(), mTempHeight = temp.getHeight();
2142+ float ratioX = (float)mOrigWidth/(float)mTempWidth;
2143+ float ratioY = (float)mOrigHeight/(float)mTempHeight;
2144+ float[] origData = original.getData();
2145+ float[] tempData = temp.getData();
2146 original.toRGB(); temp.toRGB();
2147 float ip,jp; int indI, indJ;
2148- for(int j=0;j<temp.mHeight;j++)
2149- for(int i=0;i<temp.mWidth;i++){
2150+ for(int j=0;j<mTempHeight;j++){
2151+ for(int i=0;i<mTempWidth;i++){
2152 ip = (float)i*ratioX;
2153 jp = (float)j*ratioY;
2154- if((float)((int)ip+1)-ip < ip-(float)((int)ip)) indI = (int)ip+1; else indI = (int)ip;
2155- if((float)((int)jp+1)-jp < jp-(float)((int)jp)) indJ = (int)jp+1; else indJ = (int)jp;
2156- indI = Math.max(0, Math.min(indI, original.mWidth-1));
2157- indJ = Math.max(0, Math.min(indJ, original.mHeight-1));
2158- temp.mData[3*(j*temp.mWidth+i)] = original.mData[3*(indJ*original.mWidth+indI)];
2159- temp.mData[3*(j*temp.mWidth+i)+1] = original.mData[3*(indJ*original.mWidth+indI)+1];
2160- temp.mData[3*(j*temp.mWidth+i)+2] = original.mData[3*(indJ*original.mWidth+indI)+2];
2161+ if((float)((int)ip+1)-ip < ip-(float)((int)ip)) {indI = (int)ip+1;} else {indI = (int)ip;}
2162+ if((float)((int)jp+1)-jp < jp-(float)((int)jp)) {indJ = (int)jp+1;} else {indJ = (int)jp;}
2163+ indI = Math.max(0, Math.min(indI, mOrigWidth-1));
2164+ indJ = Math.max(0, Math.min(indJ, mOrigHeight-1));
2165+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)] = origData[PixelData.PIXEL_SIZE*(indJ*mOrigWidth+indI)];
2166+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)+1] = origData[PixelData.PIXEL_SIZE*(indJ*mOrigWidth+indI)+1];
2167+ tempData[PixelData.PIXEL_SIZE*(j*mTempWidth+i)+2] = origData[PixelData.PIXEL_SIZE*(indJ*mOrigWidth+indI)+2];
2168 }
2169+ }
2170 }
2171 /**
2172 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2173@@ -41,9 +44,12 @@
2174 */
2175 @Override
2176 public PixelData apply(PixelData image) {
2177- if(image == null) return null;
2178+ if(image == null) {return null;}
2179 PixelData ret = new PixelData(mWidth, mHeight);
2180 apply(image, ret);
2181 return ret;
2182 }
2183+
2184+ @Override
2185+ public void reset() {}
2186 }
2187
2188=== modified file 'src/main/java/manager/editor/FilterImageRotate270.java'
2189--- src/main/java/manager/editor/FilterImageRotate270.java 2012-04-08 17:57:35 +0000
2190+++ src/main/java/manager/editor/FilterImageRotate270.java 2012-04-17 18:42:22 +0000
2191@@ -9,18 +9,22 @@
2192 * zapisuje obraz original do obrazu image obracając go
2193 */
2194 @Override
2195- public void apply(PixelData original, PixelData temp)
2196- throws IllegalArgumentException {
2197- if(original == null || temp == null) throw new NullPointerException();
2198- if(original.mWidth != temp.mHeight || original.mHeight != temp.mWidth)
2199+ public void apply(PixelData original, PixelData temp) {
2200+ int mOrigWidth = original.getWidth(), mOrigHeight = original.getHeight();
2201+ int mTempWidth = temp.getWidth(), mTempHeight = temp.getHeight();
2202+ if(mOrigWidth != mTempHeight || mOrigHeight != mTempWidth){
2203 throw new IllegalArgumentException();
2204+ }
2205+ float[] origData = original.getData();
2206+ float[] tempData = temp.getData();
2207 original.toRGB(); temp.toRGB();
2208- for(int i=0;i<original.mWidth;i++)
2209- for(int j=0;j<original.mHeight;j++){
2210- temp.mData[3*((temp.mHeight-1-i)*temp.mWidth+j)] = original.mData[3*(j*original.mWidth+i)];
2211- temp.mData[3*((temp.mHeight-1-i)*temp.mWidth+j)+1] = original.mData[3*(j*original.mWidth+i)+1];
2212- temp.mData[3*((temp.mHeight-1-i)*temp.mWidth+j)+2] = original.mData[3*(j*original.mWidth+i)+2];
2213+ for(int i=0;i<mOrigWidth;i++){
2214+ for(int j=0;j<mOrigHeight;j++){
2215+ tempData[PixelData.PIXEL_SIZE*((mTempHeight-1-i)*mTempWidth+j)] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)];
2216+ tempData[PixelData.PIXEL_SIZE*((mTempHeight-1-i)*mTempWidth+j)+1] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)+1];
2217+ tempData[PixelData.PIXEL_SIZE*((mTempHeight-1-i)*mTempWidth+j)+2] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)+2];
2218 }
2219+ }
2220 }
2221 /**
2222 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2223@@ -29,10 +33,12 @@
2224 */
2225 @Override
2226 public PixelData apply(PixelData image) {
2227- if(image == null) return null;
2228- PixelData ret = new PixelData(image.mHeight, image.mWidth);
2229+ if(image == null) {return null;}
2230+ PixelData ret = new PixelData(image.getHeight(), image.getWidth());
2231 apply(image, ret);
2232 return ret;
2233 }
2234-
2235+
2236+ @Override
2237+ public void reset() {}
2238 }
2239
2240=== modified file 'src/main/java/manager/editor/FilterImageRotate90.java'
2241--- src/main/java/manager/editor/FilterImageRotate90.java 2012-04-08 17:57:35 +0000
2242+++ src/main/java/manager/editor/FilterImageRotate90.java 2012-04-17 18:42:22 +0000
2243@@ -9,18 +9,22 @@
2244 * zapisuje obraz original do obrazu image obracając go
2245 */
2246 @Override
2247- public void apply(PixelData original, PixelData temp)
2248- throws IllegalArgumentException {
2249- if(original == null || temp == null) throw new NullPointerException();
2250- if(original.mWidth != temp.mHeight || original.mHeight != temp.mWidth)
2251+ public void apply(PixelData original, PixelData temp){
2252+ int mOrigWidth = original.getWidth(), mOrigHeight = original.getHeight();
2253+ int mTempWidth = temp.getWidth(), mTempHeight = temp.getHeight();
2254+ if(mOrigWidth != mTempHeight || mOrigHeight != mTempWidth){
2255 throw new IllegalArgumentException();
2256+ }
2257+ float[] origData = original.getData();
2258+ float[] tempData = temp.getData();
2259 original.toRGB(); temp.toRGB();
2260- for(int i=0;i<original.mWidth;i++)
2261- for(int j=0;j<original.mHeight;j++){
2262- temp.mData[3*(i*temp.mWidth+temp.mWidth-1-j)] = original.mData[3*(j*original.mWidth+i)];
2263- temp.mData[3*(i*temp.mWidth+temp.mWidth-1-j)+1] = original.mData[3*(j*original.mWidth+i)+1];
2264- temp.mData[3*(i*temp.mWidth+temp.mWidth-1-j)+2] = original.mData[3*(j*original.mWidth+i)+2];
2265+ for(int i=0;i<mOrigWidth;i++){
2266+ for(int j=0;j<mOrigHeight;j++){
2267+ tempData[PixelData.PIXEL_SIZE*(i*mTempWidth+mTempWidth-1-j)] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)];
2268+ tempData[PixelData.PIXEL_SIZE*(i*mTempWidth+mTempWidth-1-j)+1] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)+1];
2269+ tempData[PixelData.PIXEL_SIZE*(i*mTempWidth+mTempWidth-1-j)+2] = origData[PixelData.PIXEL_SIZE*(j*mOrigWidth+i)+2];
2270 }
2271+ }
2272 }
2273 /**
2274 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2275@@ -29,10 +33,13 @@
2276 */
2277 @Override
2278 public PixelData apply(PixelData image) {
2279- if(image == null) return null;
2280- PixelData ret = new PixelData(image.mHeight, image.mWidth);
2281+ if(image == null) {return null;}
2282+ PixelData ret = new PixelData(image.getHeight(), image.getWidth());
2283 apply(image, ret);
2284 return ret;
2285 }
2286+
2287+ @Override
2288+ public void reset() {}
2289
2290 }
2291
2292=== modified file 'src/main/java/manager/editor/FilterImageSymetryOX.java'
2293--- src/main/java/manager/editor/FilterImageSymetryOX.java 2012-04-08 17:57:35 +0000
2294+++ src/main/java/manager/editor/FilterImageSymetryOX.java 2012-04-17 18:42:22 +0000
2295@@ -9,18 +9,21 @@
2296 * zapisuje obraz original do obrazu image odbijając go wzdłuż osi pionowej
2297 */
2298 @Override
2299- public void apply(PixelData original, PixelData temp)
2300- throws IllegalArgumentException {
2301- if(original == null || temp == null) throw new NullPointerException();
2302- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2303+ public void apply(PixelData original, PixelData temp){
2304+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2305+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2306 throw new IllegalArgumentException();
2307+ }
2308+ float[] origData = original.getData();
2309+ float[] tempData = temp.getData();
2310 original.toRGB(); temp.toRGB();
2311- for(int i=0;i<original.mWidth;i++)
2312- for(int j=0;j<original.mHeight;j++){
2313- temp.mData[3*(j*original.mWidth+original.mWidth-i-1)] = original.mData[3*(j*original.mWidth+i)];
2314- temp.mData[3*(j*original.mWidth+original.mWidth-i-1)+1] = original.mData[3*(j*original.mWidth+i)+1];
2315- temp.mData[3*(j*original.mWidth+original.mWidth-i-1)+2] = original.mData[3*(j*original.mWidth+i)+2];
2316+ for(int i=0;i<mWidth;i++){
2317+ for(int j=0;j<mHeight;j++){
2318+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+mWidth-i-1)] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)];
2319+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+mWidth-i-1)+1] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1];
2320+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+mWidth-i-1)+2] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2];
2321 }
2322+ }
2323 }
2324 /**
2325 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2326@@ -29,9 +32,12 @@
2327 */
2328 @Override
2329 public PixelData apply(PixelData image) {
2330- if(image == null) return null;
2331- PixelData ret = new PixelData(image.mWidth, image.mHeight);
2332+ if(image == null) {return null;}
2333+ PixelData ret = new PixelData(image.getWidth(), image.getHeight());
2334 apply(image, ret);
2335 return ret;
2336 }
2337+
2338+ @Override
2339+ public void reset() {}
2340 }
2341
2342=== modified file 'src/main/java/manager/editor/FilterImageSymetryOY.java'
2343--- src/main/java/manager/editor/FilterImageSymetryOY.java 2012-04-08 17:57:35 +0000
2344+++ src/main/java/manager/editor/FilterImageSymetryOY.java 2012-04-17 18:42:22 +0000
2345@@ -9,18 +9,21 @@
2346 * zapisuje obraz original do obrazu image odbijając go wzdłuż osi poziomej
2347 */
2348 @Override
2349- public void apply(PixelData original, PixelData temp)
2350- throws IllegalArgumentException {
2351- if(original == null || temp == null) throw new NullPointerException();
2352- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2353+ public void apply(PixelData original, PixelData temp){
2354+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2355+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2356 throw new IllegalArgumentException();
2357+ }
2358+ float[] origData = original.getData();
2359+ float[] tempData = temp.getData();
2360 original.toRGB(); temp.toRGB();
2361- for(int i=0;i<original.mWidth;i++)
2362- for(int j=0;j<original.mHeight;j++){
2363- temp.mData[3*((original.mHeight-1-j)*original.mWidth+i)] = original.mData[3*(j*original.mWidth+i)];
2364- temp.mData[3*((original.mHeight-1-j)*original.mWidth+i)+1] = original.mData[3*(j*original.mWidth+i)+1];
2365- temp.mData[3*((original.mHeight-1-j)*original.mWidth+i)+2] = original.mData[3*(j*original.mWidth+i)+2];
2366+ for(int i=0;i<mWidth;i++){
2367+ for(int j=0;j<mHeight;j++){
2368+ tempData[PixelData.PIXEL_SIZE*((mHeight-1-j)*mWidth+i)] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)];
2369+ tempData[PixelData.PIXEL_SIZE*((mHeight-1-j)*mWidth+i)+1] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1];
2370+ tempData[PixelData.PIXEL_SIZE*((mHeight-1-j)*mWidth+i)+2] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2];
2371 }
2372+ }
2373 }
2374 /**
2375 * Odwrotnie niż w przypadku zwykłych filtrów zwraca obraz zmodyfikowany,
2376@@ -29,9 +32,12 @@
2377 */
2378 @Override
2379 public PixelData apply(PixelData image) {
2380- if(image == null) return null;
2381- PixelData ret = new PixelData(image.mWidth, image.mHeight);
2382+ if(image == null) {return null;}
2383+ PixelData ret = new PixelData(image.getWidth(), image.getHeight());
2384 apply(image, ret);
2385 return ret;
2386 }
2387+
2388+ @Override
2389+ public void reset() {}
2390 }
2391\ No newline at end of file
2392
2393=== added file 'src/main/java/manager/editor/FilterLUTCorrectionCMY.java'
2394--- src/main/java/manager/editor/FilterLUTCorrectionCMY.java 1970-01-01 00:00:00 +0000
2395+++ src/main/java/manager/editor/FilterLUTCorrectionCMY.java 2012-04-17 18:42:22 +0000
2396@@ -0,0 +1,73 @@
2397+package manager.editor;
2398+
2399+/**
2400+ * Filtr umożliwiający kanałową korekte CMY przy pomocy tablicy LUT
2401+ * @author Patryk
2402+ */
2403+public class FilterLUTCorrectionCMY implements IFilterLUT{
2404+ private LUTTable[] mTable = new LUTTable[3];
2405+
2406+ public FilterLUTCorrectionCMY(){
2407+ for(int i=0;i<mTable.length;i++){
2408+ mTable[i] = new LUTTable(null);
2409+ }
2410+ }
2411+
2412+ @Override
2413+ public void apply(PixelData original, PixelData temp) {
2414+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2415+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2416+ throw new IllegalArgumentException();
2417+ }
2418+ float[] origData = original.getData();
2419+ float[] tempData = temp.getData();
2420+ original.toCMY(); temp.toCMY();
2421+ float mC,mM,mY;
2422+ for(int i=0;i<mWidth;i++){
2423+ for(int j=0;j<mHeight;j++){
2424+ mC = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)] / ColorConverter.RGBCMY_BYTE_MAX;
2425+ mM = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] / ColorConverter.RGBCMY_BYTE_MAX;
2426+ mY = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] / ColorConverter.RGBCMY_BYTE_MAX;
2427+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = mTable[0].getValue(mC) * ColorConverter.RGBCMY_BYTE_MAX;
2428+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = mTable[1].getValue(mM) * ColorConverter.RGBCMY_BYTE_MAX;
2429+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = mTable[2].getValue(mY) * ColorConverter.RGBCMY_BYTE_MAX;
2430+ }
2431+ }
2432+ }
2433+
2434+ @Override
2435+ public PixelData apply(PixelData image) {
2436+ if(image == null) {return null;}
2437+ PixelData ret = (PixelData)image.clone();
2438+ apply(image, image);
2439+ return ret;
2440+ }
2441+
2442+ @Override
2443+ public LUTTable[] getConversionTable() {
2444+ return mTable.clone();
2445+ }
2446+
2447+ @Override
2448+ public void setConversionTable(LUTTable[] table) {
2449+ if(table == null || table.length != mTable.length){
2450+ throw new IllegalArgumentException();
2451+ }
2452+ for(int i=0;i<table.length;i++){
2453+ if(table[i] == null){
2454+ throw new IllegalArgumentException();
2455+ }
2456+ }
2457+ for(int i=0;i<table.length;i++){
2458+ mTable[i] = table[i];
2459+ }
2460+ }
2461+
2462+ @Override
2463+ public void reset() {
2464+ for(int i=0;i<mTable.length;i++){
2465+ mTable[i].reset();
2466+ }
2467+ }
2468+
2469+}
2470
2471=== added file 'src/main/java/manager/editor/FilterLUTCorrectionHSV.java'
2472--- src/main/java/manager/editor/FilterLUTCorrectionHSV.java 1970-01-01 00:00:00 +0000
2473+++ src/main/java/manager/editor/FilterLUTCorrectionHSV.java 2012-04-17 18:42:22 +0000
2474@@ -0,0 +1,73 @@
2475+package manager.editor;
2476+
2477+/**
2478+ * Filtr umożliwiający kanałową korekte HSV przy pomocy tablicy LUT
2479+ * @author Patryk
2480+ */
2481+public class FilterLUTCorrectionHSV implements IFilterLUT{
2482+ private LUTTable[] mTable = new LUTTable[3];
2483+
2484+ public FilterLUTCorrectionHSV(){
2485+ for(int i=0;i<mTable.length;i++){
2486+ mTable[i] = new LUTTable(null);
2487+ }
2488+ }
2489+
2490+ @Override
2491+ public void apply(PixelData original, PixelData temp) {
2492+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2493+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2494+ throw new IllegalArgumentException();
2495+ }
2496+ float[] origData = original.getData();
2497+ float[] tempData = temp.getData();
2498+ original.toHSV(); temp.toHSV();
2499+ float mH,mS,mV;
2500+ for(int i=0;i<mWidth;i++){
2501+ for(int j=0;j<mHeight;j++){
2502+ mH = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)] / ColorConverter.HUE_MAX;
2503+ mS = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1];
2504+ mV = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
2505+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = mTable[0].getValue(mH) * ColorConverter.HUE_MAX;
2506+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = mTable[1].getValue(mS);
2507+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = mTable[2].getValue(mV);
2508+ }
2509+ }
2510+ }
2511+
2512+ @Override
2513+ public PixelData apply(PixelData image) {
2514+ if(image == null) {return null;}
2515+ PixelData ret = (PixelData)image.clone();
2516+ apply(image, image);
2517+ return ret;
2518+ }
2519+
2520+ @Override
2521+ public LUTTable[] getConversionTable() {
2522+ return mTable.clone();
2523+ }
2524+
2525+ @Override
2526+ public void setConversionTable(LUTTable[] table) {
2527+ if(table == null || table.length != mTable.length){
2528+ throw new IllegalArgumentException();
2529+ }
2530+ for(int i=0;i<table.length;i++){
2531+ if(table[i] == null){
2532+ throw new IllegalArgumentException();
2533+ }
2534+ }
2535+ for(int i=0;i<table.length;i++){
2536+ mTable[i] = table[i];
2537+ }
2538+ }
2539+
2540+ @Override
2541+ public void reset() {
2542+ for(int i=0;i<mTable.length;i++){
2543+ mTable[i].reset();
2544+ }
2545+ }
2546+
2547+}
2548
2549=== added file 'src/main/java/manager/editor/FilterLUTCorrectionRGB.java'
2550--- src/main/java/manager/editor/FilterLUTCorrectionRGB.java 1970-01-01 00:00:00 +0000
2551+++ src/main/java/manager/editor/FilterLUTCorrectionRGB.java 2012-04-17 18:42:22 +0000
2552@@ -0,0 +1,73 @@
2553+package manager.editor;
2554+
2555+/**
2556+ * Filtr umożliwiający kanałową korektę RGB przy pomocy tablicy LUT
2557+ * @author Patryk
2558+ */
2559+public class FilterLUTCorrectionRGB implements IFilterLUT{
2560+ private LUTTable[] mTable = new LUTTable[3];
2561+
2562+ public FilterLUTCorrectionRGB(){
2563+ for(int i=0;i<mTable.length;i++){
2564+ mTable[i] = new LUTTable(null);
2565+ }
2566+ }
2567+
2568+ @Override
2569+ public void apply(PixelData original, PixelData temp) {
2570+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2571+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2572+ throw new IllegalArgumentException();
2573+ }
2574+ float[] origData = original.getData();
2575+ float[] tempData = temp.getData();
2576+ original.toRGB(); temp.toRGB();
2577+ float mR,mG,mB;
2578+ for(int i=0;i<mWidth;i++){
2579+ for(int j=0;j<mHeight;j++){
2580+ mR = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)] / ColorConverter.RGBCMY_BYTE_MAX;
2581+ mG = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] / ColorConverter.RGBCMY_BYTE_MAX;
2582+ mB = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] / ColorConverter.RGBCMY_BYTE_MAX;
2583+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = mTable[0].getValue(mR) * ColorConverter.RGBCMY_BYTE_MAX;
2584+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = mTable[1].getValue(mG) * ColorConverter.RGBCMY_BYTE_MAX;
2585+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = mTable[2].getValue(mB) * ColorConverter.RGBCMY_BYTE_MAX;
2586+ }
2587+ }
2588+ }
2589+
2590+ @Override
2591+ public PixelData apply(PixelData image) {
2592+ if(image == null) {return null;}
2593+ PixelData ret = (PixelData)image.clone();
2594+ apply(image, image);
2595+ return ret;
2596+ }
2597+
2598+ @Override
2599+ public LUTTable[] getConversionTable() {
2600+ return mTable.clone();
2601+ }
2602+
2603+ @Override
2604+ public void setConversionTable(LUTTable[] table) {
2605+ if(table == null || table.length != mTable.length){
2606+ throw new IllegalArgumentException();
2607+ }
2608+ for(int i=0;i<table.length;i++){
2609+ if(table[i] == null){
2610+ throw new IllegalArgumentException();
2611+ }
2612+ }
2613+ for(int i=0;i<table.length;i++){
2614+ mTable[i] = table[i];
2615+ }
2616+ }
2617+
2618+ @Override
2619+ public void reset() {
2620+ for(int i=0;i<mTable.length;i++){
2621+ mTable[i].reset();
2622+ }
2623+ }
2624+
2625+}
2626
2627=== modified file 'src/main/java/manager/editor/FilterMatrixAdapter.java'
2628--- src/main/java/manager/editor/FilterMatrixAdapter.java 2012-04-07 13:25:56 +0000
2629+++ src/main/java/manager/editor/FilterMatrixAdapter.java 2012-04-17 18:42:22 +0000
2630@@ -6,51 +6,58 @@
2631 */
2632 public class FilterMatrixAdapter implements IFilterMatrix{
2633 private Matrix mMatrix;
2634+ private final Matrix mDefault;
2635
2636 FilterMatrixAdapter(Matrix mat){
2637 mMatrix = mat;
2638+ mDefault = new Matrix(mMatrix.getTable());
2639 }
2640
2641 @Override
2642- public void apply(PixelData original, PixelData temp)
2643- throws IllegalArgumentException {
2644- if(original == null || temp == null) throw new NullPointerException();
2645- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2646+ public void apply(PixelData original, PixelData temp){
2647+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2648+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2649 throw new IllegalArgumentException();
2650+ }
2651+ float[] origData = original.getData();
2652+ float[] tempData = temp.getData();
2653 original.toRGB(); temp.toRGB();
2654 int matSize = mMatrix.getSize();
2655 int center = matSize/2, ip, jp;
2656 float[] matTable = mMatrix.getTable();
2657- float sum = 0.0f, R,G,B;
2658- for(int i=0;i<matTable.length;i++) sum += matTable[i];
2659- for(int j=0;j<original.mHeight;j++)
2660- for(int i=0;i<original.mWidth;i++){
2661- R = G = B = 0.0f;
2662+ float sum = 0.0f, mR,mG,mB;
2663+ for(int i=0;i<matTable.length;i++) {
2664+ sum += matTable[i];
2665+ }
2666+ for(int j=0;j<mHeight;j++){
2667+ for(int i=0;i<mWidth;i++){
2668+ mR=0.0f; mG=0.0f; mB = 0.0f;
2669 for(int mj=0;mj<matSize;mj++){
2670 jp = j+mj-center;
2671 for(int mi=0;mi<matSize;mi++){
2672 ip = i+mi-center;
2673- if(ip >= 0 && ip < original.mWidth && jp >= 0 && jp < original.mHeight){
2674- R += original.mData[3*(jp*original.mWidth+ip)] * matTable[mj*matSize+mi];
2675- G += original.mData[3*(jp*original.mWidth+ip)+1] * matTable[mj*matSize+mi];
2676- B += original.mData[3*(jp*original.mWidth+ip)+2] * matTable[mj*matSize+mi];
2677+ if(ip >= 0 && ip < mWidth && jp >= 0 && jp < mHeight){
2678+ mR += origData[PixelData.PIXEL_SIZE*(jp*mWidth+ip)] * matTable[mj*matSize+mi];
2679+ mG += origData[PixelData.PIXEL_SIZE*(jp*mWidth+ip)+1] * matTable[mj*matSize+mi];
2680+ mB += origData[PixelData.PIXEL_SIZE*(jp*mWidth+ip)+2] * matTable[mj*matSize+mi];
2681 }
2682 }
2683 }
2684 if(sum != 0.0f){
2685- R /= sum;
2686- G /= sum;
2687- B /= sum;
2688+ mR /= sum;
2689+ mG /= sum;
2690+ mB /= sum;
2691 }
2692- temp.mData[3*(j*original.mWidth+i)] = Math.max(0.0f, Math.min(255.0f, R));
2693- temp.mData[3*(j*original.mWidth+i)+1] = Math.max(0.0f, Math.min(255.0f, G));
2694- temp.mData[3*(j*original.mWidth+i)+2] = Math.max(0.0f, Math.min(255.0f, B));
2695+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mR));
2696+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mG));
2697+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mB));
2698 }
2699+ }
2700 }
2701
2702 @Override
2703 public PixelData apply(PixelData image) {
2704- if(image == null) return null;
2705+ if(image == null) {return null;}
2706 PixelData ret = (PixelData)image.clone();
2707 apply(ret, image);
2708 return ret;
2709@@ -65,5 +72,10 @@
2710 public void setMatrix(Matrix matrix) {
2711 mMatrix = matrix;
2712 }
2713+
2714+ @Override
2715+ public void reset() {
2716+ mMatrix = new Matrix(mDefault.getTable());
2717+ }
2718
2719 }
2720
2721=== modified file 'src/main/java/manager/editor/FilterNegative.java'
2722--- src/main/java/manager/editor/FilterNegative.java 2012-04-07 10:12:47 +0000
2723+++ src/main/java/manager/editor/FilterNegative.java 2012-04-17 18:42:22 +0000
2724@@ -6,20 +6,26 @@
2725 */
2726 public class FilterNegative implements IFilter {
2727 @Override
2728- public void apply(PixelData original, PixelData temp)
2729- throws IllegalArgumentException {
2730- if(original == null || temp == null) throw new NullPointerException();
2731- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2732+ public void apply(PixelData original, PixelData temp){
2733+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
2734 throw new IllegalArgumentException();
2735+ }
2736+ float[] origData = original.getData();
2737+ float[] tempData = temp.getData();
2738 original.toRGB(); temp.toRGB();
2739- for(int i=0;i<original.mData.length;i++) temp.mData[i] = 255.0f - original.mData[i];
2740+ for(int i=0;i<origData.length;i++) {
2741+ tempData[i] = ColorConverter.RGBCMY_BYTE_MAX - origData[i];
2742+ }
2743 }
2744
2745 @Override
2746 public PixelData apply(PixelData image) {
2747- if(image == null) return null;
2748+ if(image == null) {return null;}
2749 PixelData ret = (PixelData)image.clone();
2750 apply(image, image);
2751 return ret;
2752 }
2753+
2754+ @Override
2755+ public void reset() {}
2756 }
2757
2758=== modified file 'src/main/java/manager/editor/FilterRGBCorrection.java'
2759--- src/main/java/manager/editor/FilterRGBCorrection.java 2012-04-08 17:57:35 +0000
2760+++ src/main/java/manager/editor/FilterRGBCorrection.java 2012-04-17 18:42:22 +0000
2761@@ -6,34 +6,37 @@
2762 */
2763 public class FilterRGBCorrection implements IFilterRange{
2764 private final Range[] mRange = new Range[]{
2765- new Range(-128.0f, 128.0f, 0.0f),
2766- new Range(-128.0f, 128.0f, 0.0f),
2767- new Range(-128.0f, 128.0f, 0.0f)
2768+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Czerwony"),
2769+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Zielony"),
2770+ new Range(-ColorConverter.RGBCMY_BYTE_MAX/2.0f, ColorConverter.RGBCMY_BYTE_MAX/2.0f, 0.0f, "Niebieski")
2771 };
2772
2773 @Override
2774- public void apply(PixelData original, PixelData temp)
2775- throws IllegalArgumentException {
2776- if(original == null || temp == null) throw new NullPointerException();
2777- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2778+ public void apply(PixelData original, PixelData temp) {
2779+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2780+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2781 throw new IllegalArgumentException();
2782+ }
2783+ float[] origData = original.getData();
2784+ float[] tempData = temp.getData();
2785 original.toRGB(); temp.toRGB();
2786- float R,G,B;
2787- float Rd = mRange[0].getValue(), Gd = mRange[1].getValue(), Bd = mRange[2].getValue();
2788- for(int i=0;i<original.mWidth;i++)
2789- for(int j=0;j<original.mHeight;j++){
2790- R = original.mData[3*(i*original.mHeight+j)];
2791- G = original.mData[3*(i*original.mHeight+j)+1];
2792- B = original.mData[3*(i*original.mHeight+j)+2];
2793- temp.mData[3*(i*original.mHeight+j)] = Math.max(0.0f, Math.min(255.0f, R+Rd));
2794- temp.mData[3*(i*original.mHeight+j)+1] = Math.max(0.0f, Math.min(255.0f, G+Gd));
2795- temp.mData[3*(i*original.mHeight+j)+2] = Math.max(0.0f, Math.min(255.0f, B+Bd));
2796+ float mR,mG,mB;
2797+ float dR = mRange[0].getValue(), dG = mRange[1].getValue(), dB = mRange[2].getValue();
2798+ for(int i=0;i<mWidth;i++){
2799+ for(int j=0;j<mHeight;j++){
2800+ mR = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)];
2801+ mG = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1];
2802+ mB = origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
2803+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mR+dR));
2804+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mG+dG));
2805+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, mB+dB));
2806 }
2807+ }
2808 }
2809
2810 @Override
2811 public PixelData apply(PixelData image) {
2812- if(image == null) return null;
2813+ if(image == null) {return null;}
2814 PixelData ret = (PixelData)image.clone();
2815 apply(image, image);
2816 return ret;
2817@@ -41,7 +44,29 @@
2818
2819 @Override
2820 public Range[] getRangeTable() {
2821- return mRange;
2822+ return mRange.clone();
2823+ }
2824+
2825+ @Override
2826+ public void setRangeTable(Range[] table) {
2827+ if(table == null || table.length != mRange.length){
2828+ throw new IllegalArgumentException();
2829+ }
2830+ for(int i=0;i<table.length;i++){
2831+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
2832+ throw new IllegalArgumentException();
2833+ }
2834+ }
2835+ for(int i=0;i<table.length;i++){
2836+ mRange[i].setValue(table[i].getValue());
2837+ }
2838+ }
2839+
2840+ @Override
2841+ public void reset() {
2842+ for(int i=0;i<mRange.length;i++){
2843+ mRange[i].reset();
2844+ }
2845 }
2846
2847 }
2848
2849=== modified file 'src/main/java/manager/editor/FilterSepia.java'
2850--- src/main/java/manager/editor/FilterSepia.java 2012-04-08 17:57:35 +0000
2851+++ src/main/java/manager/editor/FilterSepia.java 2012-04-17 18:42:22 +0000
2852@@ -6,29 +6,34 @@
2853 */
2854 public class FilterSepia implements IFilterRange{
2855 private final Range[] mRange = new Range[]{
2856- new Range(20.0f, 50.0f, 30.0f)
2857+ new Range(20.0f, 50.0f, 30.0f, "Nasycenie")
2858 };
2859
2860 @Override
2861- public void apply(PixelData original, PixelData temp)
2862- throws IllegalArgumentException {
2863- if(original == null || temp == null) throw new NullPointerException();
2864- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2865+ public void apply(PixelData original, PixelData temp){
2866+ int mWidth = original.getWidth(), mHeight = original.getHeight();
2867+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
2868 throw new IllegalArgumentException();
2869+ }
2870+ float[] origData = original.getData();
2871+ float[] tempData = temp.getData();
2872 float det = mRange[0].getValue(), grey;
2873 original.toRGB(); temp.toRGB();
2874- for(int i=0;i<original.mWidth;i++)
2875- for(int j=0;j<original.mHeight;j++){
2876- grey = 0.21f*temp.mData[3*(i*original.mHeight+j)] + 0.71f*temp.mData[3*(i*original.mHeight+j)+1] + 0.07f*temp.mData[3*(i*original.mHeight+j)+2];
2877- temp.mData[3*(i*original.mHeight+j)] = Math.min(255.0f, grey+2*det);
2878- temp.mData[3*(i*original.mHeight+j)+1] = Math.min(255.0f, grey+det);
2879- temp.mData[3*(i*original.mHeight+j)+2] = Math.min(255.0f, grey);
2880+ for(int i=0;i<mWidth;i++){
2881+ for(int j=0;j<mHeight;j++){
2882+ grey = ColorConverter.RED_LUMINOSITY * origData[PixelData.PIXEL_SIZE*(i*mHeight+j)] +
2883+ ColorConverter.GREEN_LUMINOSITY * origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] +
2884+ ColorConverter.BLUE_LUMINOSITY * origData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2];
2885+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, grey+2*det);
2886+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+1] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, grey+det);
2887+ tempData[PixelData.PIXEL_SIZE*(i*mHeight+j)+2] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, grey);
2888 }
2889+ }
2890 }
2891
2892 @Override
2893 public PixelData apply(PixelData image) {
2894- if(image == null) return null;
2895+ if(image == null) {return null;}
2896 PixelData ret = (PixelData)image.clone();
2897 apply(image, image);
2898 return ret;
2899@@ -36,6 +41,28 @@
2900
2901 @Override
2902 public Range[] getRangeTable() {
2903- return mRange;
2904+ return mRange.clone();
2905+ }
2906+
2907+ @Override
2908+ public void setRangeTable(Range[] table) {
2909+ if(table == null || table.length != mRange.length){
2910+ throw new IllegalArgumentException();
2911+ }
2912+ for(int i=0;i<table.length;i++){
2913+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
2914+ throw new IllegalArgumentException();
2915+ }
2916+ }
2917+ for(int i=0;i<table.length;i++){
2918+ mRange[i].setValue(table[i].getValue());
2919+ }
2920+ }
2921+
2922+ @Override
2923+ public void reset() {
2924+ for(int i=0;i<mRange.length;i++){
2925+ mRange[i].reset();
2926+ }
2927 }
2928 }
2929
2930=== modified file 'src/main/java/manager/editor/FilterSolarize.java'
2931--- src/main/java/manager/editor/FilterSolarize.java 2012-04-10 11:51:18 +0000
2932+++ src/main/java/manager/editor/FilterSolarize.java 2012-04-17 18:42:22 +0000
2933@@ -12,28 +12,31 @@
2934 */
2935 public class FilterSolarize implements IFilterRange{
2936 private final Range[] mRange = new Range[]{
2937- new Range(0.0f, 255.0f, 127.5f)
2938+ new Range(0.0f, ColorConverter.RGBCMY_BYTE_MAX, ColorConverter.RGBCMY_BYTE_MAX/2.0f, "Próg")
2939 };
2940
2941 @Override
2942- public void apply(PixelData original, PixelData temp)
2943- throws IllegalArgumentException {
2944- if(original == null || temp == null) throw new NullPointerException();
2945- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
2946+ public void apply(PixelData original, PixelData temp) {
2947+ if(original.getWidth() != temp.getWidth() || original.getHeight() != temp.getHeight()){
2948 throw new IllegalArgumentException();
2949- float mLUT[] = new float[256];
2950+ }
2951+ float[] origData = original.getData();
2952+ float[] tempData = temp.getData();
2953+ float mLUT[] = new float[PixelData.RGBCMY_CHANNEL_PRECISION];
2954 float prog = mRange[0].getValue();
2955- for(int i=0;i<256;i++)
2956- if(i < prog) mLUT[i] = (float)i;
2957- else mLUT[i] = (float)(255-i);
2958+ for(int i=0;i<PixelData.RGBCMY_CHANNEL_PRECISION;i++) {
2959+ if(i < prog) {mLUT[i] = (float)i;}
2960+ else {mLUT[i] = ColorConverter.RGBCMY_BYTE_MAX-(float)i;}
2961+ }
2962 original.toRGB(); temp.toRGB();
2963- for(int i=0;i<original.mData.length;i++)
2964- temp.mData[i] = mLUT[(int)original.mData[i]];
2965+ for(int i=0;i<origData.length;i++){
2966+ tempData[i] = mLUT[(int)origData[i]];
2967+ }
2968 }
2969
2970 @Override
2971 public PixelData apply(PixelData image) {
2972- if(image == null) return null;
2973+ if(image == null) {return null;}
2974 PixelData ret = (PixelData)image.clone();
2975 apply(image, image);
2976 return ret;
2977@@ -41,7 +44,29 @@
2978
2979 @Override
2980 public Range[] getRangeTable() {
2981- return mRange;
2982+ return mRange.clone();
2983+ }
2984+
2985+ @Override
2986+ public void setRangeTable(Range[] table) {
2987+ if(table == null || table.length != mRange.length){
2988+ throw new IllegalArgumentException();
2989+ }
2990+ for(int i=0;i<table.length;i++){
2991+ if(table[i].getMin() != mRange[i].getMin() || table[i].getMax() != mRange[i].getMax()){
2992+ throw new IllegalArgumentException();
2993+ }
2994+ }
2995+ for(int i=0;i<table.length;i++){
2996+ mRange[i].setValue(table[i].getValue());
2997+ }
2998+ }
2999+
3000+ @Override
3001+ public void reset() {
3002+ for(int i=0;i<mRange.length;i++){
3003+ mRange[i].reset();
3004+ }
3005 }
3006
3007 }
3008
3009=== modified file 'src/main/java/manager/editor/FilterTexturer.java'
3010--- src/main/java/manager/editor/FilterTexturer.java 2012-04-09 18:10:58 +0000
3011+++ src/main/java/manager/editor/FilterTexturer.java 2012-04-17 18:42:22 +0000
3012@@ -18,7 +18,7 @@
3013 * aby pracować
3014 */
3015 FilterTexturer(ITextureGenerator generator){
3016- if(generator == null) throw new NullPointerException();
3017+ if(generator == null) {throw new NullPointerException();}
3018 mGenerator = generator;
3019 }
3020 /**
3021@@ -52,46 +52,58 @@
3022 }
3023
3024 @Override
3025- public void apply(PixelData original, PixelData temp)
3026- throws IllegalArgumentException {
3027- if(original == null || temp == null) throw new NullPointerException();
3028- if(original.mWidth != temp.mWidth || original.mHeight != temp.mHeight)
3029+ public void apply(PixelData original, PixelData temp) {
3030+ int mWidth = original.getWidth(), mHeight = original.getHeight();
3031+ if(mWidth != temp.getWidth() || mHeight != temp.getHeight()){
3032 throw new IllegalArgumentException();
3033+ }
3034+ float[] origData = original.getData();
3035+ float[] tempData = temp.getData();
3036 float gray; ColorRGB mCol = new ColorRGB(0,0,0);
3037 original.toRGB(); temp.toRGB();
3038- for(int i=0;i<original.mWidth;i++)
3039- for(int j=0;j<original.mHeight;j++){
3040- mGenerator.getValue((float)i/(float)original.mWidth, (float)j/(float)original.mHeight, mCol);
3041+ for(int i=0;i<mWidth;i++){
3042+ for(int j=0;j<mHeight;j++){
3043+ mGenerator.getValue((float)i/(float)mWidth, (float)j/(float)mHeight, mCol);
3044 switch(mMode){
3045 case ADD:
3046- temp.mData[3*(j*original.mWidth+i)] = Math.min(255.0f, original.mData[3*(j*original.mWidth+i)] + mCol.getR()*255.0f);
3047- temp.mData[3*(j*original.mWidth+i)+1] = Math.min(255.0f, original.mData[3*(j*original.mWidth+i)+1] + mCol.getG()*255.0f);
3048- temp.mData[3*(j*original.mWidth+i)+2] = Math.min(255.0f, original.mData[3*(j*original.mWidth+i)+2] + mCol.getB()*255.0f);
3049+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)] + mCol.getR()*ColorConverter.RGBCMY_BYTE_MAX);
3050+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] + mCol.getG()*ColorConverter.RGBCMY_BYTE_MAX);
3051+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = Math.min(ColorConverter.RGBCMY_BYTE_MAX, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] + mCol.getB()*ColorConverter.RGBCMY_BYTE_MAX);
3052 break;
3053 case SUBSTRACT:
3054- temp.mData[3*(j*original.mWidth+i)] = Math.max(0.0f, original.mData[3*(j*original.mWidth+i)] - mCol.getR()*255.0f);
3055- temp.mData[3*(j*original.mWidth+i)+1] = Math.max(0.0f, original.mData[3*(j*original.mWidth+i)+1] - mCol.getG()*255.0f);
3056- temp.mData[3*(j*original.mWidth+i)+2] = Math.max(0.0f, original.mData[3*(j*original.mWidth+i)+2] - mCol.getB()*255.0f);
3057+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = Math.max(0.0f, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)] - mCol.getR()*ColorConverter.RGBCMY_BYTE_MAX);
3058+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = Math.max(0.0f, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] - mCol.getG()*ColorConverter.RGBCMY_BYTE_MAX);
3059+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = Math.max(0.0f, origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] - mCol.getB()*ColorConverter.RGBCMY_BYTE_MAX);
3060 break;
3061 case MULTIPLY:
3062- temp.mData[3*(j*original.mWidth+i)] = original.mData[3*(j*original.mWidth+i)] * mCol.getR();
3063- temp.mData[3*(j*original.mWidth+i)+1] = original.mData[3*(j*original.mWidth+i)+1] * mCol.getG();
3064- temp.mData[3*(j*original.mWidth+i)+2] = original.mData[3*(j*original.mWidth+i)+2] * mCol.getB();
3065+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)] * mCol.getR();
3066+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] * mCol.getG();
3067+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] * mCol.getB();
3068 break;
3069 case MASK:
3070- gray = 0.21f*original.mData[3*(j*original.mWidth+i)] + 0.71f*original.mData[3*(j*original.mWidth+i)+1] + 0.07f*original.mData[3*(j*original.mWidth+i)+2];
3071- temp.mData[3*(j*original.mWidth+i)] = gray * mCol.getR();
3072- temp.mData[3*(j*original.mWidth+i)+1] = gray * mCol.getG();
3073- temp.mData[3*(j*original.mWidth+i)+2] = gray * mCol.getB();
3074+ gray = 0.21f*origData[PixelData.PIXEL_SIZE*(j*mWidth+i)] +
3075+ 0.71f*origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] +
3076+ 0.07f*origData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2];
3077+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)] = gray * mCol.getR();
3078+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+1] = gray * mCol.getG();
3079+ tempData[PixelData.PIXEL_SIZE*(j*mWidth+i)+2] = gray * mCol.getB();
3080+ break;
3081+ default:
3082 break;
3083 }
3084 }
3085+ }
3086 }
3087 @Override
3088 public PixelData apply(PixelData image) {
3089- if(image == null) return null;
3090+ if(image == null) {return null;}
3091 PixelData ret = (PixelData)image.clone();
3092 apply(image, image);
3093 return ret;
3094 }
3095+
3096+ @Override
3097+ public void reset() {
3098+ mMode = TexturingMode.ADD;
3099+ }
3100 }
3101
3102=== modified file 'src/main/java/manager/editor/Gradient.java'
3103--- src/main/java/manager/editor/Gradient.java 2012-04-10 17:51:49 +0000
3104+++ src/main/java/manager/editor/Gradient.java 2012-04-17 18:42:22 +0000
3105@@ -10,6 +10,10 @@
3106 * @author Patryk
3107 */
3108 public class Gradient {
3109+ /**
3110+ * Klasa opisująca kolor wraz z jego relatywnym położeniem w gradiencie
3111+ * @author Patryk
3112+ */
3113 public static class ColorPos implements Comparable<ColorPos>{
3114 private ColorRGB mColor = new ColorRGB(0,0,0);
3115 private float mPos;
3116@@ -36,26 +40,30 @@
3117 * gdy pos > 1 przypisane zostanie 1
3118 * @param pos - pozycja w gradiencie [0,1]
3119 */
3120- public void setPos(float pos){
3121+ public final void setPos(float pos){
3122 mPos = Math.max(0.0f, Math.min(1.0f, pos));
3123 }
3124 /**
3125 * Ustawia kolor, jesli argument jest <b>null</b> kolor nie zostanie zmieniony
3126 * @param rgb - kolor z przestrzeni barw RGB
3127 */
3128- public void setColor(ColorRGB rgb){
3129- if(rgb != null) mColor = rgb;
3130+ public final void setColor(ColorRGB rgb){
3131+ if(rgb != null) {
3132+ mColor = rgb;
3133+ }
3134 }
3135 @Override
3136 public int compareTo(ColorPos arg0) {
3137- if(mPos < arg0.mPos) return -1;
3138- if(mPos > arg0.mPos) return 1;
3139- return 0;
3140+ return Float.valueOf(mPos).compareTo(arg0.mPos);
3141 }
3142 @Override
3143 public boolean equals(Object obj){
3144- if(obj == null || !(obj instanceof ColorPos)) return false;
3145- return ((ColorPos)obj).mPos == mPos;
3146+ if(!(obj instanceof ColorPos)) {return false;}
3147+ return Float.valueOf((((ColorPos)obj).mPos)).equals(mPos);
3148+ }
3149+ @Override
3150+ public int hashCode(){
3151+ return Float.valueOf(mPos).hashCode();
3152 }
3153 }
3154
3155@@ -83,7 +91,6 @@
3156 * @param ref - referencja do wyniku
3157 */
3158 public void interpolate(float pos, ColorRGB ref){
3159- if(ref == null) throw new NullPointerException();
3160 if(lista.size() == 0){
3161 ref.setR(0);
3162 ref.setG(0);
3163@@ -96,7 +103,8 @@
3164 } else {
3165 ColorPos prev, last;
3166 Iterator<ColorPos> iter = lista.iterator();
3167- prev = last = iter.next();
3168+ prev = iter.next();
3169+ last = prev;
3170 while(iter.hasNext() && last.getPos() <= pos){
3171 prev = last;
3172 last = iter.next();
3173
3174=== modified file 'src/main/java/manager/editor/Histogram.java'
3175--- src/main/java/manager/editor/Histogram.java 2012-04-07 09:14:46 +0000
3176+++ src/main/java/manager/editor/Histogram.java 2012-04-17 18:42:22 +0000
3177@@ -24,7 +24,7 @@
3178 * @return częstotliwość wystąpień danego argumentu
3179 */
3180 public int getValue(int argument) {
3181- if(argument < 0 || argument >= mData.length) return 0;
3182+ if(argument < 0 || argument >= mData.length) {return 0;}
3183 return mData[argument];
3184 }
3185 /**
3186
3187=== modified file 'src/main/java/manager/editor/IFilter.java'
3188--- src/main/java/manager/editor/IFilter.java 2012-04-08 17:57:35 +0000
3189+++ src/main/java/manager/editor/IFilter.java 2012-04-17 18:42:22 +0000
3190@@ -14,7 +14,7 @@
3191 * @param temp - obraz tymczasowy
3192 * @throws IllegalArgumentException - gdy rozmiar temp jest niezgodny z rozmiarem original
3193 */
3194- public void apply(PixelData original, PixelData temp) throws IllegalArgumentException;
3195+ void apply(PixelData original, PixelData temp);
3196
3197 /**
3198 * Aplikuje filtr na obraz i wynik zapisuje w nim samym, ale zwraca kopię przed wprowadzeniem zmian
3199@@ -23,5 +23,10 @@
3200 * @param image - obraz na którym aplikujemy filtr
3201 * @return kopia obrazu przed zastosowaniem filtru lub null gdy <b>image</b> jest null
3202 */
3203- public PixelData apply(PixelData image);
3204+ PixelData apply(PixelData image);
3205+
3206+ /**
3207+ * Resetuje ustawienia filtru do wartości podstawoaych
3208+ */
3209+ void reset();
3210 }
3211
3212=== modified file 'src/main/java/manager/editor/IFilterLUT.java'
3213--- src/main/java/manager/editor/IFilterLUT.java 2012-04-07 09:14:46 +0000
3214+++ src/main/java/manager/editor/IFilterLUT.java 2012-04-17 18:42:22 +0000
3215@@ -6,13 +6,17 @@
3216 */
3217 public interface IFilterLUT extends IFilter {
3218 /**
3219+ * Zwraca tablice funckji LUT (filtr może pracować wielokanałowo)
3220 * @return tablica funkcji LUT
3221 */
3222- public LUTTable getConversionTable();
3223+ LUTTable[] getConversionTable();
3224
3225 /**
3226- * Ustawia funkcję LUT która będzie parametrem pracy filtru
3227+ * Ustawia tablicę funkcji LUT które będą parametrami pracy filtru.
3228+ * Gdy rozmiar tablicy podanej jako argument się nie zgadza lub któryś jej element jest nullem
3229+ * wyrzuca wyjątek
3230 * @param table - nowa tablica
3231+ * @throws IllegalArgumentException - gdy tablica jest nieodpowiednia
3232 */
3233- public void setConversionTable(LUTTable table);
3234+ void setConversionTable(LUTTable[] table);
3235 }
3236\ No newline at end of file
3237
3238=== modified file 'src/main/java/manager/editor/IFilterMatrix.java'
3239--- src/main/java/manager/editor/IFilterMatrix.java 2012-04-07 09:14:46 +0000
3240+++ src/main/java/manager/editor/IFilterMatrix.java 2012-04-17 18:42:22 +0000
3241@@ -8,11 +8,11 @@
3242 /**
3243 * @return macierz przekształcenia
3244 */
3245- public Matrix getMatrix();
3246+ Matrix getMatrix();
3247
3248 /**
3249 * Ustawia nową macierz przekształcenia
3250 * @param matrix - nowa macierz przekształcenia
3251 */
3252- public void setMatrix(Matrix matrix);
3253+ void setMatrix(Matrix matrix);
3254 }
3255
3256=== modified file 'src/main/java/manager/editor/IFilterRange.java'
3257--- src/main/java/manager/editor/IFilterRange.java 2012-04-07 09:14:46 +0000
3258+++ src/main/java/manager/editor/IFilterRange.java 2012-04-17 18:42:22 +0000
3259@@ -7,7 +7,16 @@
3260 */
3261 public interface IFilterRange extends IFilter {
3262 /**
3263+ * Zwraca tablicę dozwolonych zakresów
3264 * @return tablica dozwolonych zakresów
3265 */
3266- public Range[] getRangeTable();
3267+ Range[] getRangeTable();
3268+
3269+ /**
3270+ * Ustawia tablice zakresów, jeśli zakresy są niedozwolone (np różnią się krańcami lub
3271+ * jest ich niedozwolona dla danego filtru ilość zostanie rzucony wyjątek)
3272+ * @param table - nowa tablica zakresów z ustawionymi wartościami
3273+ * @throws IllegalArgumentException
3274+ */
3275+ void setRangeTable(Range[] table);
3276 }
3277
3278=== modified file 'src/main/java/manager/editor/ITextureGenerator.java'
3279--- src/main/java/manager/editor/ITextureGenerator.java 2012-04-09 18:10:58 +0000
3280+++ src/main/java/manager/editor/ITextureGenerator.java 2012-04-17 18:42:22 +0000
3281@@ -9,7 +9,7 @@
3282 * Zwraca wynik pracy generatora na podanych współrzędnych pod referencje <b>temp</b>
3283 * @param fx - współrzędna pozioma w teksturze z przedziału [0,1]
3284 * @param fy - współrzędna pionowa w teksturze z przedziału [0,1]
3285- * @return Kolor pixela tekstury w przestrzeni barw RGB
3286+ * @param temp - referencja na obiekt w którym ma być zapisany wynik
3287 */
3288- public void getValue(float fx, float fy, ColorRGB temp);
3289+ void getValue(float fx, float fy, ColorRGB temp);
3290 }
3291
3292=== added file 'src/main/java/manager/editor/IWindowFilter.java'
3293--- src/main/java/manager/editor/IWindowFilter.java 1970-01-01 00:00:00 +0000
3294+++ src/main/java/manager/editor/IWindowFilter.java 2012-04-17 18:42:22 +0000
3295@@ -0,0 +1,11 @@
3296+package manager.editor;
3297+/**
3298+ * Podstawowy interfejs reprezentujący okienko służace do modyfikacji ustawień danego filtru
3299+ * @author Marcin Regdos
3300+ */
3301+public interface IWindowFilter {
3302+ /**
3303+ * Zwraca zmodyfikowaną przez filtr kopię obrazu. Jeśli użytkownik nie zastosuje filtru, zwraca nulla.
3304+ */
3305+ public PixelData showDialog();
3306+}
3307
3308=== modified file 'src/main/java/manager/editor/ImageMaker.java'
3309--- src/main/java/manager/editor/ImageMaker.java 2012-04-08 17:57:35 +0000
3310+++ src/main/java/manager/editor/ImageMaker.java 2012-04-17 18:42:22 +0000
3311@@ -8,9 +8,12 @@
3312 * Klasa ta jest wyróżniona, gdyż z uwagi na fakt, że większość jej filtrów tworzy obraz fizycznie innych
3313 * rozmiarów, posiadają one odwróconą metodę <b>PixelData apply(PixelData)</b> (zwracany jest obraz PO
3314 * obróbce a nie jak w wszystkich innych filtrach PRZED, zaś parametr jest nie zmieniany)
3315+ * Próba utworzenia obiektu tej kalsy nawet przy użyciu refleksji
3316+ * skończy się wyjątkiem <b>UnsupportedOperationException</B>
3317 * @author Patryk
3318 */
3319-public class ImageMaker {
3320+public final class ImageMaker {
3321+ private ImageMaker(){throw new UnsupportedOperationException();}
3322 /**
3323 * @param width - długość obrazu wynikowego
3324 * @param height - wysokość obrazu wynikowego
3325
3326=== added file 'src/main/java/manager/editor/ImagePanel.java'
3327--- src/main/java/manager/editor/ImagePanel.java 1970-01-01 00:00:00 +0000
3328+++ src/main/java/manager/editor/ImagePanel.java 2012-04-17 18:42:22 +0000
3329@@ -0,0 +1,50 @@
3330+package manager.editor;
3331+
3332+import java.awt.Color;
3333+import java.awt.Dimension;
3334+import java.awt.Graphics;
3335+import java.awt.Image;
3336+import javax.swing.JPanel;
3337+
3338+/**
3339+ * Kontrolka do wyswietlania obrazu
3340+ * Nie korzystac bezposrednio, nalezy uzyc ImageViewer
3341+ * @author Marcin Regdos
3342+ */
3343+class ImagePanel extends JPanel {
3344+ private static final long serialVersionUID = 1L;
3345+ private Image image; //? BufferedImage
3346+ private int zoom;
3347+ public ImagePanel (Image image){
3348+ this.image=image;
3349+ zoom=100;
3350+ }
3351+ /**
3352+ * Zmiana obrazu
3353+ * @param image - nowy obraz
3354+ */
3355+ void changeImage (Image image){
3356+ this.image=image;
3357+ this.repaint();
3358+ }
3359+ void changeZoom (int zoom){
3360+ this.zoom=zoom;
3361+ this.repaint();
3362+ }
3363+ @Override
3364+ protected void paintComponent(Graphics g){
3365+ super.paintComponents(g);
3366+ g.setColor(Color.GRAY);
3367+ g.fillRect(0, 0, this.getWidth(), this.getHeight());
3368+ if (image!=null){
3369+ g.drawImage(image, 0, 0, image.getWidth(null)*zoom/100, image.getHeight(null)*zoom/100, null);
3370+ }
3371+ }
3372+ public Dimension getPreferredSize() {
3373+ if (image==null) {
3374+ return new Dimension(1, 1);
3375+ } else {
3376+ return new java.awt.Dimension(image.getWidth(null)*zoom/100, image.getHeight(null)*zoom/100);
3377+ }
3378+ }
3379+}
3380
3381=== added file 'src/main/java/manager/editor/ImageViewer.java'
3382--- src/main/java/manager/editor/ImageViewer.java 1970-01-01 00:00:00 +0000
3383+++ src/main/java/manager/editor/ImageViewer.java 2012-04-17 18:42:22 +0000
3384@@ -0,0 +1,66 @@
3385+package manager.editor;
3386+
3387+import java.awt.Color;
3388+import java.awt.Image;
3389+import javax.swing.BorderFactory;
3390+import javax.swing.JLabel;
3391+import javax.swing.JPanel;
3392+import javax.swing.JScrollPane;
3393+import javax.swing.JSpinner;
3394+import javax.swing.SpinnerNumberModel;
3395+import javax.swing.event.ChangeEvent;
3396+import javax.swing.event.ChangeListener;
3397+
3398+/**
3399+ * Kontrolka do wyswietlania obrazu (scroll)
3400+ * @author Marcin Regdos
3401+ */
3402+public class ImageViewer extends JPanel implements ChangeListener{
3403+ private static final long serialVersionUID = 1L;
3404+ private ImagePanel iPanel;
3405+ private JPanel topPanel;
3406+ private JScrollPane scrollPane;
3407+ private JSpinner zoomSpinner;
3408+ private int height, width;
3409+ /**
3410+ * Zostanie utworzona nowa kontrolka
3411+ * @param image wyswietlany obraz
3412+ * @param width szerokosc kontrolki
3413+ * @param height wysokosc kontrolki
3414+ */
3415+ public ImageViewer (Image image, int width, int height){
3416+ this.height=height;
3417+ this.width=width;
3418+ iPanel=new ImagePanel(image);
3419+ zoomSpinner =new JSpinner (new SpinnerNumberModel(100, 10,1000,10));
3420+ zoomSpinner.addChangeListener(this);
3421+
3422+ topPanel=new JPanel();
3423+ topPanel.add(new JLabel ("Zoom"));
3424+ topPanel.add(zoomSpinner);
3425+
3426+ scrollPane = new JScrollPane(iPanel);
3427+ scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.BLACK));
3428+ scrollPane.setWheelScrollingEnabled(true);
3429+ scrollPane.setColumnHeaderView(topPanel);
3430+ scrollPane.setPreferredSize(new java.awt.Dimension(this.width, this.height));
3431+ //scrollPane.setSize(scrollPane.getPreferredSize());
3432+ this.setPreferredSize(scrollPane.getPreferredSize());
3433+ this.add(scrollPane);
3434+ this.repaint();
3435+ }
3436+ /**
3437+ * Zmiana wyswietlanego obrazu
3438+ * @param image - nowy obraz
3439+ */
3440+ public void setImage (Image image){
3441+ iPanel.changeImage(image);
3442+ }
3443+ @Override
3444+ public void stateChanged(ChangeEvent arg0) {
3445+ iPanel.changeZoom((Integer)zoomSpinner.getValue());
3446+ this.revalidate();
3447+ //this.repaint();
3448+ }
3449+}
3450+
3451
3452=== modified file 'src/main/java/manager/editor/LUTTable.java'
3453--- src/main/java/manager/editor/LUTTable.java 2012-04-10 17:51:49 +0000
3454+++ src/main/java/manager/editor/LUTTable.java 2012-04-17 18:42:22 +0000
3455@@ -15,7 +15,7 @@
3456 * @param vals - tablica wartości funkcji
3457 * @throws IllegalArgumentException - gdy w podanej tablicy znajdzą sie wartosci z poza [0,1]
3458 */
3459- LUTTable(float[] vals) throws IllegalArgumentException{
3460+ LUTTable(float[] vals){
3461 setConversionTable(vals);
3462 }
3463
3464@@ -23,12 +23,12 @@
3465 * @param arg - argumnet z dziedziny [0,1]
3466 * @return interpolowana wartosc funkcji LUT na argumencie <b>arg</b>
3467 */
3468- public float getValue(float arg){
3469- if(arg <= 0.0f) return mData[0];
3470- if(arg >= 1.0f) return mData[mData.length-1];
3471+ public final float getValue(float arg){
3472+ if(arg <= 0.0f) {return mData[0];}
3473+ if(arg >= 1.0f) {return mData[mData.length-1];}
3474 float delta = 1.0f/(mData.length-1);
3475 int beg = (int)(arg/delta);
3476- if(delta*beg == arg) return mData[beg];
3477+ if(Math.abs(delta*beg - arg) < ColorConverter.FLOAT_PRECISION) {return mData[beg];}
3478 float hdet = (mData[beg+1] - mData[beg])/delta;
3479 return mData[beg] + hdet * (arg-beg*delta);
3480 }
3481@@ -40,12 +40,25 @@
3482 * @param table - nowa tablica konwersji
3483 * @throws IllegalArgumentException - gdy w podanej tablicy znajdą sie wartosci z poza [0,1]
3484 */
3485- public void setConversionTable(float[] table) throws IllegalArgumentException{
3486- if(table != null) for(int i=0;i<table.length;i++) if(table[i] < 0.0f || table[i] > 1.0f) throw new IllegalArgumentException();
3487+ public final void setConversionTable(float[] table){
3488+ if(table != null) {
3489+ for(int i=0;i<table.length;i++){
3490+ if(table[i] < 0.0f || table[i] > 1.0f) {
3491+ throw new IllegalArgumentException();
3492+ }
3493+ }
3494+ }
3495 if(table == null || table.length < 2){
3496 mData = new float[2];
3497 mData[0] = 0.0f;
3498 mData[1] = 1.0f;
3499- } else mData = table.clone();
3500+ } else {mData = table.clone();}
3501+ }
3502+
3503+ /**
3504+ * Resetuje ustawienia tablicy LUT
3505+ */
3506+ public final void reset(){
3507+ mData = new float[]{0.0f,1.0f};
3508 }
3509 }
3510
3511=== modified file 'src/main/java/manager/editor/Matrix.java'
3512--- src/main/java/manager/editor/Matrix.java 2012-04-07 09:14:46 +0000
3513+++ src/main/java/manager/editor/Matrix.java 2012-04-17 18:42:22 +0000
3514@@ -8,6 +8,7 @@
3515 *
3516 */
3517 public class Matrix {
3518+ private static final int MinimumMatrixSize = 3;
3519 private int mSize;
3520 private float[] mData;
3521
3522@@ -17,8 +18,10 @@
3523 * @param size - rozmiar boku macierzy, dozwolone są tylko liczby nieparzyste
3524 * @throws IllegalArgumentException - gdy rozmiar jets nie prawidłowy
3525 */
3526- public Matrix(int size) throws IllegalArgumentException{
3527- if(size <= 0 || size%2==0) throw new IllegalArgumentException();
3528+ public Matrix(int size){
3529+ if(size <= 0 || size%2==0){
3530+ throw new IllegalArgumentException();
3531+ }
3532 mSize = size;
3533 mData = new float[size*size];
3534 mData[size*size/2] = 1.0f;
3535@@ -30,8 +33,10 @@
3536 * @throws IllegalArgumentException gdy rozmiar tablicy jest niedozwolony
3537 * (nie opisuje mecierzy 3x3 5x5 itd)
3538 */
3539- public Matrix(float[] table) throws IllegalArgumentException {
3540- if(table == null) throw new NullPointerException();
3541+ public Matrix(float[] table){
3542+ if(table == null) {
3543+ throw new IllegalArgumentException();
3544+ }
3545 setFromTable(table);
3546 }
3547
3548@@ -54,10 +59,14 @@
3549 * @param table - tablica z wartościami pól macierzy
3550 * @throws IllegalArgumentException gdy rozmiar macierzy jest niedozwolony
3551 */
3552- public void setFromTable(float[] table) throws IllegalArgumentException {
3553- if(table == null) throw new NullPointerException();
3554+ public final void setFromTable(float[] table){
3555+ if(table == null) {
3556+ throw new IllegalArgumentException();
3557+ }
3558 int size = (int)Math.sqrt(table.length);
3559- if(size*size != table.length || size < 3 || size%2==0) throw new IllegalArgumentException();
3560+ if(size*size != table.length || size < MinimumMatrixSize || size%2==0){
3561+ throw new IllegalArgumentException();
3562+ }
3563 mSize = size;
3564 mData = table.clone();
3565 }
3566
3567=== modified file 'src/main/java/manager/editor/PixelData.java'
3568--- src/main/java/manager/editor/PixelData.java 2012-04-10 11:51:18 +0000
3569+++ src/main/java/manager/editor/PixelData.java 2012-04-17 18:42:22 +0000
3570@@ -1,6 +1,7 @@
3571 package manager.editor;
3572
3573 import java.awt.image.BufferedImage;
3574+import manager.editor.Histogram.HistogramChannel;
3575
3576 /**
3577 * Reprezentuje tablice pixeli obrazu. Może przechowywać dane w 3 przestrzeniach kolorów
3578@@ -11,24 +12,41 @@
3579 *
3580 */
3581 public class PixelData implements Cloneable {
3582+ /**
3583+ * Rozmiar danych zajmowanych w tablicy przez każdego pixela w bajtach
3584+ */
3585+ public static final int PIXEL_SIZE = 3;
3586+ /**
3587+ * Tablicowa precyzja zapisu kanałów Saturation i Value (modelu HSV)
3588+ */
3589+ public static final int SV_CHANNEL_PRECISON = 100;
3590+ /**
3591+ * Tablicowa precyzja zapisu kanałów Hue (modelu HSV)
3592+ */
3593+ public static final int HUE_CHANNEL_PRECISION = 360;
3594+ /**
3595+ * Tablicowa precyzja zapisu kanałów RGB i CMY
3596+ */
3597+ public static final int RGBCMY_CHANNEL_PRECISION = 256;
3598+
3599 private enum DataType{
3600 RGB, CMY, HSV;
3601 }
3602 private DataType mDataType = DataType.RGB;
3603- int mWidth, mHeight;
3604- float[] mData;
3605+ private int mWidth, mHeight;
3606+ private float[] mData;
3607
3608 /**
3609 * Tworzy nowy obraz o podanych wymiarach
3610 * @param width - długość obrazu
3611 * @param height - wysokość obrazu
3612- * @throws IllegalArgumentException - gdy width lub height sa < 1
3613+ * @throws IllegalArgumentException - gdy width lub height są < 1
3614 */
3615- public PixelData(int width, int height) throws IllegalArgumentException{
3616- if(width <= 0 || height <= 0) throw new IllegalArgumentException();
3617+ public PixelData(int width, int height) {
3618+ if(width <= 0 || height <= 0) {throw new IllegalArgumentException();}
3619 mWidth = width;
3620 mHeight = height;
3621- mData = new float[width*height*3];
3622+ mData = new float[width*height*PIXEL_SIZE];
3623 }
3624
3625 /**
3626@@ -39,41 +57,66 @@
3627 mHeight = image.getHeight();
3628 mData = image.getRaster().getPixels(0, 0, mWidth, mHeight, (float[])null);
3629 }
3630+
3631+ /**
3632+ * Zwraca szerokość obrazu
3633+ * @return Szerokość obrazu
3634+ */
3635+ public int getWidth(){
3636+ return mWidth;
3637+ }
3638+
3639+ /**
3640+ * Zwraca wysokość obrazu
3641+ * @return Wysokość obrazu
3642+ */
3643+ public int getHeight(){
3644+ return mHeight;
3645+ }
3646+
3647+ /**
3648+ * Zwraca tablicę danych o pixelach
3649+ * @return tablica danych pixeli
3650+ */
3651+ final float[] getData(){
3652+ return mData;
3653+ }
3654
3655 /**
3656 * Transformuje obraz do przestrzeni barw RGB
3657 */
3658 public void toRGB() {
3659 if(mDataType == DataType.CMY){
3660- for(int i=0;i<mData.length;i++) mData[i] = 255.0f - mData[i];
3661+ for(int i=0;i<mData.length;i++) {mData[i] = ColorConverter.RGBCMY_BYTE_MAX - mData[i];}
3662 }
3663 if(mDataType == DataType.HSV){
3664- float H,S,V,R=0.0f,G=0.0f,B=0.0f;
3665- float f,p,q,t; int I;
3666- for(int i=0;i<mWidth;i++)
3667+ float mH,mS,mV,mR=0.0f,mG=0.0f,mB=0.0f;
3668+ float f,p,q,t; int mI;
3669+ for(int i=0;i<mWidth;i++){
3670 for(int j=0;j<mHeight;j++){
3671- H = mData[3*(i*mHeight+j)];
3672- S = mData[3*(i*mHeight+j)+1];
3673- V = mData[3*(i*mHeight+j)+2];
3674- if(V == 0.0f) R=G=B=0.0f;
3675+ mH = mData[PIXEL_SIZE*(i*mHeight+j)];
3676+ mS = mData[PIXEL_SIZE*(i*mHeight+j)+1];
3677+ mV = mData[PIXEL_SIZE*(i*mHeight+j)+2];
3678+ if(Math.abs(mV) < ColorConverter.FLOAT_PRECISION) {mR=0.0f; mG=0.0f; mB=0.0f;}
3679 else{
3680- H /= 60.0f;
3681- I = (int)Math.floor(H);
3682- f = H-I;
3683- p = V*(1.0f-S);
3684- q = V*(1.0f-(S*f));
3685- t = V*(1.0f-(S*(1.0f-f)));
3686- if (I==0) {R=V; G=t; B=p;}
3687- else if (I==1) {R=q; G=V; B=p;}
3688- else if (I==2) {R=p; G=V; B=t;}
3689- else if (I==3) {R=p; G=q; B=V;}
3690- else if (I==4) {R=t; G=p; B=V;}
3691- else if (I==5) {R=V; G=p; B=q;}
3692+ mH /= ColorConverter.HUE_CIRCLE_SPLITTER;
3693+ mI = (int)Math.floor(mH);
3694+ f = mH-mI;
3695+ p = mV*(1.0f-mS);
3696+ q = mV*(1.0f-(mS*f));
3697+ t = mV*(1.0f-(mS*(1.0f-f)));
3698+ if (mI==0) {mR=mV; mG=t; mB=p;}
3699+ else if (mI==1) {mR=q; mG=mV; mB=p;}
3700+ else if (mI==2) {mR=p; mG=mV; mB=t;}
3701+ else if (mI==3) {mR=p; mG=q; mB=mV;}
3702+ else if (mI==4) {mR=t; mG=p; mB=mV;}
3703+ else if (mI==5) {mR=mV; mG=p; mB=q;}
3704 }
3705- mData[3*(i*mHeight+j)] = Math.max(0.0f, Math.min(255.0f, 255.0f * R));
3706- mData[3*(i*mHeight+j)+1] = Math.max(0.0f, Math.min(255.0f, 255.0f * G));
3707- mData[3*(i*mHeight+j)+2] = Math.max(0.0f, Math.min(255.0f, 255.0f * B));
3708+ mData[PIXEL_SIZE*(i*mHeight+j)] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, ColorConverter.RGBCMY_BYTE_MAX * mR));
3709+ mData[PIXEL_SIZE*(i*mHeight+j)+1] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, ColorConverter.RGBCMY_BYTE_MAX * mG));
3710+ mData[PIXEL_SIZE*(i*mHeight+j)+2] = Math.max(0.0f, Math.min(ColorConverter.RGBCMY_BYTE_MAX, ColorConverter.RGBCMY_BYTE_MAX * mB));
3711 }
3712+ }
3713 }
3714 mDataType = DataType.RGB;
3715 }
3716@@ -82,33 +125,34 @@
3717 * Transformuje obraz do przestrzeni barw HSV
3718 */
3719 public void toHSV() {
3720- if(mDataType == DataType.CMY) toRGB();
3721+ if(mDataType == DataType.CMY) {toRGB();}
3722 if(mDataType == DataType.RGB){
3723- float H=0.0f,S=0.0f,V=0.0f,R,G,B,x,f,I;
3724- for(int i=0;i<mWidth;i++)
3725+ float mH=0.0f,mS=0.0f,mV=0.0f,mR,mG,mB,x,f,mI;
3726+ for(int i=0;i<mWidth;i++){
3727 for(int j=0;j<mHeight;j++){
3728- R = mData[3*(i*mHeight+j)] / 255.0f;
3729- G = mData[3*(i*mHeight+j)+1] / 255.0f;
3730- B = mData[3*(i*mHeight+j)+2] / 255.0f;
3731- x = Math.min(Math.min(R, G), B);
3732- V = Math.max(Math.max(R, G), B);
3733- if (x == V) H=S=0.0f;
3734+ mR = mData[PIXEL_SIZE*(i*mHeight+j)] / ColorConverter.RGBCMY_BYTE_MAX;
3735+ mG = mData[PIXEL_SIZE*(i*mHeight+j)+1] / ColorConverter.RGBCMY_BYTE_MAX;
3736+ mB = mData[PIXEL_SIZE*(i*mHeight+j)+2] / ColorConverter.RGBCMY_BYTE_MAX;
3737+ x = Math.min(Math.min(mR, mG), mB);
3738+ mV = Math.max(Math.max(mR, mG), mB);
3739+ if (Math.abs(x - mV) < ColorConverter.FLOAT_PRECISION) {mH=0.0f; mS=0.0f;}
3740 else {
3741- if(R == x) f = G-B;
3742- else if(G == x) f = B-R;
3743- else f = R-G;
3744+ if(Math.abs(mR - x) < ColorConverter.FLOAT_PRECISION) {f = mG-mB;}
3745+ else if(Math.abs(mG - x) < ColorConverter.FLOAT_PRECISION) {f = mB-mR;}
3746+ else {f = mR-mG;}
3747
3748- if(R == x) I=3.0f;
3749- else if(G == x) I=5.0f;
3750- else I=1.0f;
3751- H = (float)( (int)((I-f/(V-x))*60.0f) )%360;
3752- S = ((V-x)/V);
3753+ if(Math.abs(mR - x) < ColorConverter.FLOAT_PRECISION) {mI=3.0f;}
3754+ else if(Math.abs(mG - x) < ColorConverter.FLOAT_PRECISION) {mI=5.0f;}
3755+ else {mI=1.0f;}
3756+ mH = (float)( (int)((mI-f/(mV-x))*ColorConverter.HUE_CIRCLE_SPLITTER) )%HUE_CHANNEL_PRECISION;
3757+ mS = ((mV-x)/mV);
3758 }
3759
3760- mData[3*(i*mHeight+j)] = H;
3761- mData[3*(i*mHeight+j)+1] = S;
3762- mData[3*(i*mHeight+j)+2] = V;
3763+ mData[PIXEL_SIZE*(i*mHeight+j)] = mH;
3764+ mData[PIXEL_SIZE*(i*mHeight+j)+1] = mS;
3765+ mData[PIXEL_SIZE*(i*mHeight+j)+2] = mV;
3766 }
3767+ }
3768 }
3769 mDataType = DataType.HSV;
3770 }
3771@@ -117,8 +161,10 @@
3772 * Transformuje obraz do przestrzeni barw CMY
3773 */
3774 public void toCMY() {
3775- if(mDataType == DataType.HSV) toRGB();
3776- if(mDataType == DataType.RGB) for(int i=0;i<mData.length;i++) mData[i] = 255.0f - mData[i];
3777+ if(mDataType == DataType.HSV) {toRGB();}
3778+ if(mDataType == DataType.RGB) {
3779+ for(int i=0;i<mData.length;i++) {mData[i] = ColorConverter.RGBCMY_BYTE_MAX - mData[i];}
3780+ }
3781 mDataType = DataType.CMY;
3782 }
3783
3784@@ -149,9 +195,8 @@
3785 * @throws IllegalArgumentException - gdy rozmiar <b>image</b> nie zgadza się z rozmiarem danych PixelData
3786 * Należy wtedy użyc metody <b>toBufferedData()</b>
3787 */
3788- public void toBufferedImage(BufferedImage image) throws IllegalArgumentException{
3789- if(image == null) throw new NullPointerException();
3790- if(image.getWidth() != mWidth || image.getHeight() != mHeight) throw new IllegalArgumentException();
3791+ public void toBufferedImage(BufferedImage image) {
3792+ if(image.getWidth() != mWidth || image.getHeight() != mHeight) {throw new IllegalArgumentException();}
3793 toRGB();
3794 image.getRaster().setPixels(0, 0, mWidth, mHeight, mData);
3795 }
3796@@ -161,43 +206,104 @@
3797 * @return <b>Histogram</b> zwierający informacje o danym kanale.
3798 */
3799 public Histogram getHistogram(Histogram.HistogramChannel channel) {
3800- int table[] = null;
3801- if(channel == Histogram.HistogramChannel.RED){
3802- table = new int[256]; toRGB();
3803- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)]]++;
3804- }
3805- if(channel == Histogram.HistogramChannel.GREEN){
3806- table = new int[256]; toRGB();
3807- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)+1]]++;
3808- }
3809- if(channel == Histogram.HistogramChannel.BLUE){
3810- table = new int[256]; toRGB();
3811- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)+2]]++;
3812- }
3813- if(channel == Histogram.HistogramChannel.CYAN){
3814- table = new int[256]; toCMY();
3815- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)]]++;
3816- }
3817- if(channel == Histogram.HistogramChannel.MAGENTA){
3818- table = new int[256]; toCMY();
3819- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)+1]]++;
3820- }
3821- if(channel == Histogram.HistogramChannel.YELLOW){
3822- table = new int[256]; toCMY();
3823- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)mData[3*(i*mHeight+j)+2]]++;
3824- }
3825- if(channel == Histogram.HistogramChannel.HUE){
3826- table = new int[360]; toHSV();
3827- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[((int)mData[3*(i*mHeight+j)])%360]++;
3828- }
3829- if(channel == Histogram.HistogramChannel.SATURATION){
3830- table = new int[100]; toHSV();
3831- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)(mData[3*(i*mHeight+j)+1]*100.0f)]++;
3832- }
3833- if(channel == Histogram.HistogramChannel.VALUE){
3834- table = new int[100]; toHSV();
3835- for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) table[(int)(mData[3*(i*mHeight+j)+2]*100.0f)]++;
3836- }
3837- return new Histogram(table, channel);
3838+ if(channel == Histogram.HistogramChannel.RED) {return getHistogramRed();}
3839+ else if(channel == Histogram.HistogramChannel.GREEN) {return getHistogramGreen();}
3840+ else if(channel == Histogram.HistogramChannel.BLUE) {return getHistogramBlue();}
3841+ else if(channel == Histogram.HistogramChannel.CYAN) {return getHistogramCyan();}
3842+ else if(channel == Histogram.HistogramChannel.MAGENTA) {return getHistogramMagenta();}
3843+ else if(channel == Histogram.HistogramChannel.YELLOW) {return getHistogramYellow();}
3844+ else if(channel == Histogram.HistogramChannel.HUE) {return getHistogramHue();}
3845+ else if(channel == Histogram.HistogramChannel.SATURATION) {return getHistogramSaturation();}
3846+ return getHistogramValue();
3847+ }
3848+
3849+ private Histogram getHistogramRed(){
3850+ toRGB();
3851+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3852+ for(int i=0;i<mWidth;i++) {
3853+ for(int j=0;j<mHeight;j++) {
3854+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)]]++;
3855+ }
3856+ }
3857+ return new Histogram(table, HistogramChannel.RED);
3858+ }
3859+ private Histogram getHistogramGreen(){
3860+ toRGB();
3861+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3862+ for(int i=0;i<mWidth;i++) {
3863+ for(int j=0;j<mHeight;j++) {
3864+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)+1]]++;
3865+ }
3866+ }
3867+ return new Histogram(table, HistogramChannel.GREEN);
3868+ }
3869+ private Histogram getHistogramBlue(){
3870+ toRGB();
3871+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3872+ for(int i=0;i<mWidth;i++) {
3873+ for(int j=0;j<mHeight;j++) {
3874+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)+2]]++;
3875+ }
3876+ }
3877+ return new Histogram(table, HistogramChannel.BLUE);
3878+ }
3879+
3880+ private Histogram getHistogramCyan(){
3881+ toCMY();
3882+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3883+ for(int i=0;i<mWidth;i++) {
3884+ for(int j=0;j<mHeight;j++) {
3885+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)]]++;
3886+ }
3887+ }
3888+ return new Histogram(table, HistogramChannel.CYAN);
3889+ }
3890+ private Histogram getHistogramMagenta(){
3891+ toCMY();
3892+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3893+ for(int i=0;i<mWidth;i++) {
3894+ for(int j=0;j<mHeight;j++) {
3895+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)+1]]++;
3896+ }
3897+ }
3898+ return new Histogram(table, HistogramChannel.MAGENTA);
3899+ }
3900+ private Histogram getHistogramYellow(){
3901+ toCMY();
3902+ int[] table = new int[RGBCMY_CHANNEL_PRECISION];
3903+ for(int i=0;i<mWidth;i++) {
3904+ for(int j=0;j<mHeight;j++) {
3905+ table[(int)mData[PIXEL_SIZE*(i*mHeight+j)+2]]++;
3906+ }
3907+ }
3908+ return new Histogram(table, HistogramChannel.YELLOW);
3909+ }
3910+
3911+ private Histogram getHistogramHue(){
3912+ int[] table = new int[HUE_CHANNEL_PRECISION]; toHSV();
3913+ for(int i=0;i<mWidth;i++) {
3914+ for(int j=0;j<mHeight;j++) {
3915+ table[((int)mData[PIXEL_SIZE*(i*mHeight+j)])%HUE_CHANNEL_PRECISION]++;
3916+ }
3917+ }
3918+ return new Histogram(table, HistogramChannel.HUE);
3919+ }
3920+ private Histogram getHistogramSaturation(){
3921+ int[] table = new int[SV_CHANNEL_PRECISON]; toHSV();
3922+ for(int i=0;i<mWidth;i++) {
3923+ for(int j=0;j<mHeight;j++) {
3924+ table[(int)(mData[PIXEL_SIZE*(i*mHeight+j)+1]*(float)SV_CHANNEL_PRECISON)]++;
3925+ }
3926+ }
3927+ return new Histogram(table, HistogramChannel.SATURATION);
3928+ }
3929+ private Histogram getHistogramValue(){
3930+ int[] table = new int[SV_CHANNEL_PRECISON]; toHSV();
3931+ for(int i=0;i<mWidth;i++) {
3932+ for(int j=0;j<mHeight;j++) {
3933+ table[(int)(mData[PIXEL_SIZE*(i*mHeight+j)+2]*(float)SV_CHANNEL_PRECISON)]++;
3934+ }
3935+ }
3936+ return new Histogram(table, HistogramChannel.VALUE);
3937 }
3938 }
3939
3940=== added file 'src/main/java/manager/editor/Point.java'
3941--- src/main/java/manager/editor/Point.java 1970-01-01 00:00:00 +0000
3942+++ src/main/java/manager/editor/Point.java 2012-04-17 18:42:22 +0000
3943@@ -0,0 +1,18 @@
3944+package manager.editor;
3945+
3946+/**
3947+ * Klasa opisująca puntk w przestrzeni pracy gradientu tj bitmapie mapowanej
3948+ * układem współrzędnych o granicach 0 i 1 (można wylatywać poza przedział pracy, bo
3949+ * generatory gradientowe obsługują takie sytuacje jako rozciągnięcie gradientu w przestrzeni
3950+ * o większym rozmiarze i nałożenie wyszczególniony fragment przestrzeni tj własnie 0 do 1)
3951+ * @author Patryk
3952+ */
3953+public class Point {
3954+ public float x;
3955+ public float y;
3956+
3957+ public Point(float mX, float mY){
3958+ x = mX;
3959+ y = mY;
3960+ }
3961+}
3962
3963=== modified file 'src/main/java/manager/editor/Range.java'
3964--- src/main/java/manager/editor/Range.java 2012-04-07 09:14:46 +0000
3965+++ src/main/java/manager/editor/Range.java 2012-04-17 18:42:22 +0000
3966@@ -7,17 +7,21 @@
3967 *
3968 */
3969 public class Range {
3970- private float mMin, mMax, mValue;
3971+ private float mMin, mMax, mValue, mDefault;
3972+ private final String mName;
3973
3974 /**
3975 * Zostanie utworzony obiekt reprezentujący przedział [min(a,b), max(a,b)]
3976 * @param a - jeden z krańców przedziału
3977 * @param b - jeden z krańców przedziału
3978+ * @param name - nazwa przedziału
3979 */
3980- public Range(float a, float b) {
3981+ public Range(float a, float b, String name) {
3982 mMin = Math.min(a, b);
3983 mMax = Math.max(a, b);
3984 mValue = (a+b)/2.0f;
3985+ mName = name;
3986+ mDefault = mValue;
3987 }
3988
3989 /**
3990@@ -26,10 +30,19 @@
3991 * @param a - jeden z krańców przedziału
3992 * @param b - jeden z krańców przedziału
3993 * @param val - wartość wyróżniona
3994+ * @param name - nazwa przedziału
3995 */
3996- public Range(float a, float b, float val){
3997- this(a,b);
3998+ public Range(float a, float b, float val, String name){
3999+ this(a,b,name);
4000 setValue(val);
4001+ mDefault = mValue;
4002+ }
4003+
4004+ /**
4005+ * Resetuje ustawienia przedzialu tzn ustawia wartośc w przedziale na domyślną
4006+ */
4007+ public void reset(){
4008+ setValue(mDefault);
4009 }
4010
4011 /**
4012@@ -43,7 +56,7 @@
4013 * @return interpolowana pozycja wartości wyróżnionej w przedziale -> należy do [0,1]
4014 */
4015 public float getInterpolatedValue(){
4016- if(mMin == mMax) return 0.0f;
4017+ if(mMin == mMax) {return 0.0f;}
4018 return (mValue - mMin) / (mMax - mMin);
4019 }
4020
4021@@ -62,14 +75,21 @@
4022 }
4023
4024 /**
4025+ * @return nazwa przedziału
4026+ */
4027+ public String getName(){
4028+ return mName;
4029+ }
4030+
4031+ /**
4032 * Ustawia wartość wyróżnioną
4033 * @param value - Wartość z przedziału [0,1] reprezentująca wyskalowane położenie
4034 * wartości wybranej wewnątrz przedziału. Gdy <b>value</b> < 0 zostaje domyślnie przypisane <b>value = 0</b>
4035 * gdy <b>value</b> > 1 zostaje domyślnie przypisane <b>value = 1</b>
4036 */
4037- public void interpolate(float value){
4038- if(value > 1.0f) value = 1.0f;
4039- if(value < 0.0f) value = 0.0f;
4040+ public final void interpolate(float value){
4041+ if(value > 1.0f) {value = 1.0f;}
4042+ if(value < 0.0f) {value = 0.0f;}
4043 mValue = mMin + (mMax-mMin)*value;
4044 }
4045
4046@@ -78,10 +98,10 @@
4047 * @param value - wartość wyróżniona z przedziału, gdy value < minimum to domyślnie value = minimum
4048 * gdy value > maximum to domyślnie value = maximum
4049 */
4050- public void setValue(float value) {
4051- if(value < mMin) mValue = mMin;
4052- else if(value > mMax) mValue = mMax;
4053- else mValue = value;
4054+ public final void setValue(float value) {
4055+ if(value < mMin) {mValue = mMin;}
4056+ else if(value > mMax) {mValue = mMax;}
4057+ else {mValue = value;}
4058 }
4059
4060 @Override
4061
4062=== added file 'src/main/java/manager/editor/TextureGeneratorGradientCircle.java'
4063--- src/main/java/manager/editor/TextureGeneratorGradientCircle.java 1970-01-01 00:00:00 +0000
4064+++ src/main/java/manager/editor/TextureGeneratorGradientCircle.java 2012-04-17 18:42:22 +0000
4065@@ -0,0 +1,69 @@
4066+package manager.editor;
4067+
4068+/**
4069+ * Klasa implementująca gradientowy generatur tekstur działający w trybie kołowym.
4070+ * Generator generuje tekstury będące gradientami kołowymi o danym środku i promieniu
4071+ * wyznaczonym przez dwa punkty w przestrzeni RxR
4072+ * @author Patryk
4073+ */
4074+public class TextureGeneratorGradientCircle implements ITextureGenerator{
4075+ private Gradient mGrad;
4076+ private Point mBegin, mEnd;
4077+ private float mRadius;
4078+ /**
4079+ * Ustawia wektor kierunkowy dla gradientu, wyznacza on środek oraz promień gradientu.
4080+ * Jeśli punkty wyznaczają wektor zerowy lub gradient jest nullem
4081+ * zostaje rzucony wyjątek
4082+ * @param beg - początek wektora
4083+ * @param end - koniec wektora
4084+ * @throws IllegalArgumentException - gdy wektor podany jako argument jest wektorem zerowym
4085+ * @throws NullPointerException - gdy gradient jest nullem
4086+ */
4087+ TextureGeneratorGradientCircle(Gradient grad, Point beg, Point end){
4088+ setVector(beg, end);
4089+ setGradient(grad);
4090+ }
4091+ /**
4092+ * Ustawia wektor kierunkowy dla gradientu, wyznacza on środek oraz promień gradientu.
4093+ * Jeśli punkty wyznaczają wektor zerowy lub gradient jest nullem
4094+ * zostaje rzucony wyjątek
4095+ * @param beg - początek wektora
4096+ * @param end - koniec wektora
4097+ * @throws IllegalArgumentException - gdy wektor podany jako argument jest wektorem zerowym
4098+ */
4099+ public final void setVector(Point beg, Point end){
4100+ if(Math.abs(beg.x - end.x) < ColorConverter.FLOAT_PRECISION &&
4101+ Math.abs(beg.y - end.y) < ColorConverter.FLOAT_PRECISION){
4102+ throw new IllegalArgumentException();
4103+ }
4104+ mBegin = beg;
4105+ mEnd = end;
4106+ float dX = mEnd.x-mBegin.x;
4107+ float dY = mEnd.y-mBegin.y;
4108+ mRadius = (float)Math.sqrt(dX*dX+dY*dY);
4109+ }
4110+
4111+ /**
4112+ * Zwraca gradient generujący
4113+ * @return aktulany gradient generujący
4114+ */
4115+ public Gradient getGradient(){
4116+ return mGrad;
4117+ }
4118+
4119+ /**
4120+ * Ustawia gradient generujący teksture, gdy <b>null</b> rzuca wyjątek,
4121+ * bo generator musi na czymś pracować
4122+ * @param grad - Gradient który posłuży do generacji tekstury
4123+ */
4124+ public final void setGradient(Gradient grad){
4125+ if(grad == null) {throw new NullPointerException();}
4126+ mGrad = grad;
4127+ }
4128+
4129+ @Override
4130+ public void getValue(float fx, float fy, ColorRGB temp) {
4131+ float distance = (float)Math.sqrt((mBegin.x-fx)*(mBegin.x-fx) + (mBegin.y-fy)*(mBegin.y-fy));
4132+ mGrad.interpolate(Math.max(0.0f, Math.min(1.0f, distance/mRadius)), temp);
4133+ }
4134+}
4135
4136=== removed file 'src/main/java/manager/editor/TextureGeneratorGradientHorizontal.java'
4137--- src/main/java/manager/editor/TextureGeneratorGradientHorizontal.java 2012-04-10 17:51:49 +0000
4138+++ src/main/java/manager/editor/TextureGeneratorGradientHorizontal.java 1970-01-01 00:00:00 +0000
4139@@ -1,39 +0,0 @@
4140-package manager.editor;
4141-
4142-/**
4143- * Klasa implementująca gradientowy generatur tekstur działający w kierunku poziomym
4144- * @author Patryk
4145- */
4146-public class TextureGeneratorGradientHorizontal implements ITextureGenerator{
4147- private Gradient mGrad;
4148-
4149- /**
4150- * @param grad - referencja na Gradient który posłuży do generacji tekstury
4151- */
4152- public TextureGeneratorGradientHorizontal(Gradient grad){
4153- setGradient(grad);
4154- }
4155-
4156- /**
4157- * Zwraca gradient generujący
4158- * @return aktulany gradient generujący
4159- */
4160- public Gradient getGradient(){
4161- return mGrad;
4162- }
4163-
4164- /**
4165- * Ustawia gradient generujący teksture, gdy <b>null</b> rzuca wyjątek,
4166- * bo generator musi na czymś pracować
4167- * @param grad - Gradient który posłuży do generacji tekstury
4168- */
4169- public void setGradient(Gradient grad){
4170- if(grad == null) throw new NullPointerException();
4171- mGrad = grad;
4172- }
4173-
4174- @Override
4175- public void getValue(float fx, float fy, ColorRGB temp) {
4176- mGrad.interpolate(Math.max(0.0f, Math.min(1.0f, fx)), temp);
4177- }
4178-}
4179
4180=== added file 'src/main/java/manager/editor/TextureGeneratorGradientLinear.java'
4181--- src/main/java/manager/editor/TextureGeneratorGradientLinear.java 1970-01-01 00:00:00 +0000
4182+++ src/main/java/manager/editor/TextureGeneratorGradientLinear.java 2012-04-17 18:42:22 +0000
4183@@ -0,0 +1,65 @@
4184+package manager.editor;
4185+
4186+/**
4187+ * Klasa implementująca gradientowy generatur tekstur działający w trybie liniowym.
4188+ * Generator generuje tekstury w dowolnym kierunku i skali (jest bardzo uniwersalny)
4189+ * @author Patryk
4190+ */
4191+public class TextureGeneratorGradientLinear implements ITextureGenerator{
4192+ private Gradient mGrad;
4193+ private Point mBegin, mEnd;
4194+ /**
4195+ * Ustawia wektor kierunkowy dla gradientu wzdłuż którego zostaje wyznaczany
4196+ * gradient liniowy. Jeśli punkty wyznaczają wektor zerowy lub gradient jest nullem
4197+ * zostaje rzucony wyjątek
4198+ * @param beg - początek wektora
4199+ * @param end - koniec wektora
4200+ * @throws IllegalArgumentException - gdy wektor podany jako argument jest wektorem zerowym
4201+ * @throws NullPointerException - gdy gradient jest nullem
4202+ */
4203+ TextureGeneratorGradientLinear(Gradient grad, Point beg, Point end){
4204+ setVector(beg, end);
4205+ setGradient(grad);
4206+ }
4207+ /**
4208+ * Ustawia wektor kierunkowy dla gradientu wzdłuż którego zostaje wyznaczany
4209+ * gradient liniowy. Jeśli punkty wyznaczają wektor zerowy zostaje rzucony wyjątek
4210+ * @param beg - początek wektora
4211+ * @param end - koniec wektora
4212+ * @throws IllegalArgumentException - gdy wektor podany jako argument jest wektorem zerowym
4213+ */
4214+ public final void setVector(Point beg, Point end){
4215+ if(Math.abs(beg.x - end.x) < ColorConverter.FLOAT_PRECISION &&
4216+ Math.abs(beg.y - end.y) < ColorConverter.FLOAT_PRECISION){
4217+ throw new IllegalArgumentException();
4218+ }
4219+ mBegin = beg;
4220+ mEnd = end;
4221+ }
4222+
4223+ /**
4224+ * Zwraca gradient generujący
4225+ * @return aktulany gradient generujący
4226+ */
4227+ public Gradient getGradient(){
4228+ return mGrad;
4229+ }
4230+
4231+ /**
4232+ * Ustawia gradient generujący teksture, gdy <b>null</b> rzuca wyjątek,
4233+ * bo generator musi na czymś pracować
4234+ * @param grad - Gradient który posłuży do generacji tekstury
4235+ */
4236+ public final void setGradient(Gradient grad){
4237+ if(grad == null) {throw new NullPointerException();}
4238+ mGrad = grad;
4239+ }
4240+
4241+ @Override
4242+ public void getValue(float fx, float fy, ColorRGB temp) {
4243+ float x = fx - mBegin.x, y = fy - mBegin.y;
4244+ float a = mEnd.x - mBegin.x, b = mEnd.y - mBegin.y;
4245+ float len = a*a+b*b;
4246+ mGrad.interpolate(Math.max(0.0f, Math.min(1.0f, (a*x+b*y)/len)), temp);
4247+ }
4248+}
4249
4250=== removed file 'src/main/java/manager/editor/TextureGeneratorGradientVertical.java'
4251--- src/main/java/manager/editor/TextureGeneratorGradientVertical.java 2012-04-10 17:51:49 +0000
4252+++ src/main/java/manager/editor/TextureGeneratorGradientVertical.java 1970-01-01 00:00:00 +0000
4253@@ -1,39 +0,0 @@
4254-package manager.editor;
4255-
4256-/**
4257- * Klasa implementująca gradientowy generatur tekstur działający w kierunku pionowym
4258- * @author Patryk
4259- */
4260-public class TextureGeneratorGradientVertical implements ITextureGenerator{
4261- private Gradient mGrad;
4262-
4263- /**
4264- * @param grad - referencja na Gradient który posłuży do generacji tekstury
4265- */
4266- public TextureGeneratorGradientVertical(Gradient grad){
4267- setGradient(grad);
4268- }
4269-
4270- /**
4271- * Zwraca gradient generujący
4272- * @return aktulany gradient generujący
4273- */
4274- public Gradient getGradient(){
4275- return mGrad;
4276- }
4277-
4278- /**
4279- * Ustawia gradient generujący teksture, gdy <b>null</b> rzuca wyjątek,
4280- * bo generator musi na czymś pracować
4281- * @param grad - Gradient który posłuży do generacji tekstury
4282- */
4283- public void setGradient(Gradient grad){
4284- if(grad == null) throw new NullPointerException();
4285- mGrad = grad;
4286- }
4287-
4288- @Override
4289- public void getValue(float fx, float fy, ColorRGB temp) {
4290- mGrad.interpolate(Math.max(0.0f, Math.min(1.0f, fy)), temp);
4291- }
4292-}
4293
4294=== added file 'src/main/java/manager/editor/TexturerFactory.java'
4295--- src/main/java/manager/editor/TexturerFactory.java 1970-01-01 00:00:00 +0000
4296+++ src/main/java/manager/editor/TexturerFactory.java 2012-04-17 18:42:22 +0000
4297@@ -0,0 +1,83 @@
4298+package manager.editor;
4299+
4300+/**
4301+ * Klasa udostępnia generatory tekstur
4302+ * Próba utworzenia obiektu tej klasy nawet przy użyciu refleksji
4303+ * skończy się wyjątkiem <b>UnsupportedOperationException</B>
4304+ * @author Patryk
4305+ */
4306+public final class TexturerFactory {
4307+ private TexturerFactory(){
4308+ throw new UnsupportedOperationException();
4309+ }
4310+
4311+ /**
4312+ * Zwraca monochromatyczna maskę
4313+ * @param color - kolor maski
4314+ * @return monochromatyczy generator tekstur
4315+ */
4316+ public static FilterTexturer monochromatic(ColorRGB color){
4317+ return new FilterTexturer(new TextureGeneratorMonochromatic(color));
4318+ }
4319+ /**
4320+ * Zwraca monochromatyczna maskę
4321+ * @param color - kolor maski
4322+ * @return monochromatyczy generator tekstur
4323+ */
4324+ public static FilterTexturer monochromatic(ColorCMY color){
4325+ return new FilterTexturer(new TextureGeneratorMonochromatic(color));
4326+ }
4327+ /**
4328+ * Zwraca monochromatyczna maskę
4329+ * @param color - kolor maski
4330+ * @return monochromatyczy generator tekstur
4331+ */
4332+ public static FilterTexturer monochromatic(ColorHSV color){
4333+ return new FilterTexturer(new TextureGeneratorMonochromatic(color));
4334+ }
4335+
4336+ /**
4337+ * Zwraca pionowy generator gradientowy o interpolacji liniowej
4338+ * @param grad - gradient na którym pracuje generator
4339+ * @return generator tekstur będących pionowymi gradientami liniowymi
4340+ */
4341+ public static FilterTexturer gradientLinearVertical(Gradient grad){
4342+ return new FilterTexturer(new TextureGeneratorGradientLinear(grad, new Point(0,0), new Point(0,1)));
4343+ }
4344+ /**
4345+ * Zwraca poziomy generator gradientowy o interpolacji liniowej
4346+ * @param grad - gradient na którym pracuje generator
4347+ * @return generator tekstur będących poziomymi gradientami liniowymi
4348+ */
4349+ public static FilterTexturer gradientLinearHorizontal(Gradient grad){
4350+ return new FilterTexturer(new TextureGeneratorGradientLinear(grad, new Point(0,0), new Point(1,0)));
4351+ }
4352+ /**
4353+ * Zwraca skośny generator gradientowy o interpolacji liniowej pracujący na przekątnej
4354+ * lewy górny do prawy dolny
4355+ * @param grad - gradient na którym pracuje generator
4356+ * @return generator tekstur będących skośnymi gradientami liniowymi
4357+ */
4358+ public static FilterTexturer gradientLinearDiagonal1(Gradient grad){
4359+ return new FilterTexturer(new TextureGeneratorGradientLinear(grad, new Point(0,0), new Point(1,1)));
4360+ }
4361+ /**
4362+ * Zwraca skośny generator gradientowy o interpolacji liniowej pracujący na przekątnej
4363+ * prawy górny do lewy dolny
4364+ * @param grad - gradient na którym pracuje generator
4365+ * @return generator tekstur będących skosnymi gradientami liniowymi
4366+ */
4367+ public static FilterTexturer gradientLinearDiagonal2(Gradient grad){
4368+ return new FilterTexturer(new TextureGeneratorGradientLinear(grad, new Point(1,0), new Point(0,1)));
4369+ }
4370+
4371+
4372+ /**
4373+ * Zwraca kołowy generator gradientowy
4374+ * @param grad - gradient na którym pracuje generator
4375+ * @return generator tekstur będących kołowymi gradientami
4376+ */
4377+ public static FilterTexturer gradientCircle(Gradient grad){
4378+ return new FilterTexturer(new TextureGeneratorGradientCircle(grad, new Point(0.5f,0.5f), new Point(0,0)));
4379+ }
4380+}
4381
4382=== added file 'src/main/java/manager/editor/WindowHistogram.java'
4383--- src/main/java/manager/editor/WindowHistogram.java 1970-01-01 00:00:00 +0000
4384+++ src/main/java/manager/editor/WindowHistogram.java 2012-04-17 18:42:22 +0000
4385@@ -0,0 +1,17 @@
4386+package manager.editor;
4387+
4388+import javax.swing.JDialog;
4389+
4390+/**
4391+ * Klasa reprezentująca okienko z informacjami histogramu - informacje
4392+ * o kanałach badanego obrazu
4393+ * @author Wojtek Jędras
4394+ */
4395+public class WindowHistogram extends JDialog{
4396+ /**
4397+ * Kontruktor pobierający informacje o obrazie które potem będzie wyświetlał
4398+ * @param table - tablica historgamów pobranych z obrazu
4399+ */
4400+ public WindowHistogram(Histogram[] table) {
4401+ }
4402+}
4403
4404=== added file 'src/main/java/manager/editor/WindowLUT.java'
4405--- src/main/java/manager/editor/WindowLUT.java 1970-01-01 00:00:00 +0000
4406+++ src/main/java/manager/editor/WindowLUT.java 2012-04-17 18:42:22 +0000
4407@@ -0,0 +1,24 @@
4408+package manager.editor;
4409+
4410+import javax.swing.JDialog;
4411+
4412+/**
4413+ * Klasa reprezentująca okienko do nieliniowej edycji kanałowej (LUTTable)
4414+ * @author Mikołaj Bińkowski
4415+ */
4416+public class WindowLUT extends JDialog{
4417+ /**
4418+ * Konstruktor wymaga podania obrazu na którym będziemy pracować
4419+ * @param image - obraz do edycji
4420+ */
4421+ WindowLUT(PixelData image){
4422+ }
4423+
4424+ /**
4425+ * Zwraca obraz po edycji
4426+ * @return obraz po edycji
4427+ */
4428+ public PixelData showDialog(){
4429+ return null;
4430+ }
4431+}
4432
4433=== added file 'src/main/java/manager/editor/WindowMatrix.java'
4434--- src/main/java/manager/editor/WindowMatrix.java 1970-01-01 00:00:00 +0000
4435+++ src/main/java/manager/editor/WindowMatrix.java 2012-04-17 18:42:22 +0000
4436@@ -0,0 +1,269 @@
4437+package manager.editor;
4438+
4439+import java.awt.event.MouseAdapter;
4440+import java.awt.event.MouseEvent;
4441+import javax.swing.GroupLayout;
4442+import javax.swing.JButton;
4443+import javax.swing.JDialog;
4444+import javax.swing.JPanel;
4445+import javax.swing.JTextField;
4446+import javax.swing.JToggleButton;
4447+import javax.swing.LayoutStyle;
4448+
4449+/**
4450+ * Klasa reprezentująca okienko do własnoręcznego zdefiniowania macierzy
4451+ * do filtru macierzowego aplikowanego dla obrazu
4452+ * @author Mikołaj Bińkowski
4453+ */
4454+public class WindowMatrix extends JDialog implements IWindowFilter{
4455+ private int mode;
4456+ PixelData inputData;
4457+ PixelData tempData;
4458+ PixelData returnData;
4459+ private float[][] matrix;
4460+ private JTextField fields[][];
4461+ private JButton applyButton;
4462+ private JButton previewButton;
4463+ private JButton abortButton;
4464+ private JToggleButton modeButton[];
4465+ private JPanel imagePanel;
4466+
4467+ /**
4468+ * Konstruktor wymaga podania obrazu na którym pracujemy
4469+ * @param image - obraz
4470+ */
4471+ WindowMatrix(PixelData image){
4472+ this.setTitle("title");
4473+ this.setModal(true);
4474+ // this.setSize(new Dimension(200,150));
4475+ this.setLocation(100,100);
4476+ this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
4477+ inputData=image;
4478+ tempData=null;
4479+ returnData=null;
4480+ imagePanel=new ImageViewer(image.toBufferedImage(), 320, 240);
4481+ initComponents();
4482+ mode=-1;
4483+ enableTextSpaces();
4484+ }
4485+
4486+ @SuppressWarnings("unchecked")
4487+ private void initComponents() {
4488+
4489+ applyButton = new JButton();
4490+ previewButton = new JButton();
4491+ abortButton = new JButton();
4492+ modeButton = new JToggleButton[3];
4493+ fields = new JTextField[7][7];
4494+ for(int i=0;i<3;i++){
4495+ modeButton[i] = new JToggleButton();
4496+ }
4497+ for(int i=0;i<49;i++){
4498+ fields[i/7][i%7]=new JTextField();
4499+ }
4500+
4501+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
4502+
4503+ applyButton.setText("Wykonaj");
4504+ previewButton.setText("Podglad");
4505+ abortButton.setText("Anuluj");
4506+ modeButton[0].setText("3x3");
4507+ modeButton[1].setText("5x5");
4508+ modeButton[2].setText("7x7");
4509+
4510+ applyButton.addMouseListener(new MouseAdapter() {
4511+ @Override
4512+ public void mousePressed(java.awt.event.MouseEvent evt) {
4513+ applyMousePressed(evt);
4514+ }
4515+ });
4516+ previewButton.addMouseListener(new MouseAdapter() {
4517+ @Override
4518+ public void mousePressed(java.awt.event.MouseEvent evt) {
4519+ previewMousePressed(evt);
4520+ }
4521+ });
4522+ abortButton.addMouseListener(new MouseAdapter() {
4523+ @Override
4524+ public void mousePressed(java.awt.event.MouseEvent evt) {
4525+ abortMousePressed(evt);
4526+ }
4527+ });
4528+ modeButton[0].addMouseListener(new MouseAdapter() {
4529+ @Override
4530+ public void mousePressed(java.awt.event.MouseEvent evt) {
4531+ modeMousePressed(evt,0);
4532+ }
4533+ });
4534+ modeButton[1].addMouseListener(new MouseAdapter() {
4535+ @Override
4536+ public void mousePressed(java.awt.event.MouseEvent evt) {
4537+ modeMousePressed(evt,1);
4538+ }
4539+ });
4540+ modeButton[2].addMouseListener(new MouseAdapter() {
4541+ @Override
4542+ public void mousePressed(java.awt.event.MouseEvent evt) {
4543+ modeMousePressed(evt,2);
4544+ }
4545+ });
4546+
4547+ GroupLayout layout = new GroupLayout(getContentPane());
4548+
4549+ GroupLayout.ParallelGroup x = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
4550+ GroupLayout.SequentialGroup y = layout.createSequentialGroup();
4551+
4552+ GroupLayout.SequentialGroup xSeq[]=new GroupLayout.SequentialGroup[7];
4553+ GroupLayout.ParallelGroup yPar[]=new GroupLayout.ParallelGroup[7];
4554+
4555+ // x.addComponent(imagePanel);
4556+ y.addGap(20,20,20);
4557+
4558+ for(int i=0;i<7;i++){
4559+ xSeq[i]= layout.createSequentialGroup();
4560+ xSeq[i].addGap(400,400,400);
4561+ yPar[i]= layout.createParallelGroup();
4562+ for(int j=0;j<7;j++){
4563+ xSeq[i].addComponent(fields[i][j], GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE);
4564+ yPar[i].addComponent(fields[i][j], GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE);
4565+ }
4566+ xSeq[i].addContainerGap(20, Short.MAX_VALUE);
4567+
4568+ x.addGroup(xSeq[i]);
4569+ y.addGroup(yPar[i]);
4570+ }
4571+
4572+ getContentPane().setLayout(layout);
4573+ layout.setHorizontalGroup(x
4574+ .addGroup(layout.createSequentialGroup()
4575+ .addGap(20,20,20)
4576+ .addComponent(imagePanel)
4577+ .addContainerGap(20, Short.MAX_VALUE)
4578+ )
4579+ .addGroup(layout.createSequentialGroup()
4580+ .addGap(40, 40, 40)
4581+ .addComponent(modeButton[0])
4582+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
4583+ .addComponent(modeButton[1])
4584+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
4585+ .addComponent(modeButton[2])
4586+ .addGap(110, 110, 110)
4587+ .addComponent(applyButton)
4588+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
4589+ .addComponent(previewButton)
4590+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
4591+ .addComponent(abortButton)
4592+ .addContainerGap(20, Short.MAX_VALUE))
4593+ );
4594+ layout.setVerticalGroup(
4595+ layout.createParallelGroup(GroupLayout.Alignment.LEADING)
4596+ .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
4597+ .addGap(20,20,20)
4598+ .addComponent(imagePanel)
4599+ )
4600+ .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
4601+ .addGroup(y)
4602+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 100, Short.MAX_VALUE)
4603+ .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
4604+ .addComponent(applyButton)
4605+ .addComponent(previewButton)
4606+ .addComponent(abortButton)
4607+ .addComponent(modeButton[0])
4608+ .addComponent(modeButton[1])
4609+ .addComponent(modeButton[2])
4610+ )
4611+ .addContainerGap()
4612+ )
4613+ );
4614+ pack();
4615+ }
4616+
4617+ private void enableTextSpaces(){
4618+ int v = (7-mode)/2;
4619+ int i, j;
4620+ for(i=0;i<49;i++){
4621+ fields[i/7][i%7].setEnabled(false);
4622+ }
4623+ for(j=v;j<7-v;j++){
4624+ for(i=v;i<7-v;i++){
4625+ fields[i][j].setEnabled(true);
4626+ }
4627+ }
4628+ }
4629+
4630+ private Matrix createMatrix(){
4631+ if(mode==-1){
4632+ throw new IllegalArgumentException();
4633+ }
4634+ int v=(7-mode)/2;
4635+ int i, j;
4636+ float tab[]= new float[mode*mode];
4637+ for(i=v;i<7-v;i++){
4638+ for(j=v;j<7-v;j++){
4639+ try{
4640+ tab[i-v+mode*(j-v)]=Float.parseFloat(fields[i][j].getText());
4641+ } catch(NumberFormatException e){
4642+ throw e;
4643+ }
4644+ System.out.println(tab[i-v+mode*(j-v)]=Float.parseFloat(fields[i][j].getText()));
4645+ }
4646+ }
4647+ return new Matrix(tab);
4648+ }
4649+
4650+ private void applyMousePressed(MouseEvent evt) {
4651+ try{
4652+ IFilter filter = new FilterMatrixAdapter(createMatrix());
4653+ inputData = filter.apply(inputData);
4654+ imagePanel=new ImageViewer(inputData.toBufferedImage(), 320, 240);
4655+ returnData = inputData;
4656+ } catch(NumberFormatException e){
4657+ throw e;
4658+ }
4659+ }
4660+
4661+ private void previewMousePressed(MouseEvent evt) {
4662+ try{
4663+ IFilter filter = new FilterMatrixAdapter(createMatrix());
4664+ tempData = filter.apply(inputData);
4665+ imagePanel=new ImageViewer(tempData.toBufferedImage(), 320, 240);
4666+ } catch(NumberFormatException e){
4667+ throw e;
4668+ }
4669+ }
4670+
4671+ private void abortMousePressed(MouseEvent evt) {
4672+ this.setVisible(false);
4673+ returnData=null;
4674+ // throw new UnsupportedOperationException("Not yet implemented");
4675+ }
4676+
4677+ private void modeMousePressed(MouseEvent evt, int i){
4678+ if(modeButton[i].isSelected()){
4679+ mode=-1;
4680+ enableTextSpaces();
4681+ return;
4682+ }
4683+ mode = 3+2*i;
4684+ enableTextSpaces();
4685+ modeButton[0].setSelected(false);
4686+ for(int j=0;j<3;j++){
4687+ if((i!=j)&&(modeButton[j].isSelected())){
4688+ modeButton[j].setSelected(false);
4689+ }
4690+ }
4691+ }
4692+
4693+ /**
4694+ * Zwraca obraz po edycji
4695+ * @return obraz po edycji
4696+ */
4697+ public PixelData getTransformedImage(){
4698+ return returnData;
4699+ }
4700+
4701+ public PixelData showDialog() {
4702+ this.setVisible(true);
4703+ return returnData;
4704+ }
4705+}
4706\ No newline at end of file
4707
4708=== added file 'src/main/java/manager/editor/WindowRange.java'
4709--- src/main/java/manager/editor/WindowRange.java 1970-01-01 00:00:00 +0000
4710+++ src/main/java/manager/editor/WindowRange.java 2012-04-17 18:42:22 +0000
4711@@ -0,0 +1,151 @@
4712+package manager.editor;
4713+
4714+import java.awt.BorderLayout;
4715+import java.awt.FlowLayout;
4716+import javax.swing.JButton;
4717+import javax.swing.JDialog;
4718+import javax.swing.JPanel;
4719+import javax.swing.border.EmptyBorder;
4720+import javax.swing.event.ChangeEvent;
4721+import javax.swing.event.ChangeListener;
4722+import javax.swing.JSlider;
4723+import javax.swing.JLabel;
4724+import javax.swing.BoxLayout;
4725+import java.awt.event.ActionEvent;
4726+import java.awt.event.ActionListener;
4727+
4728+
4729+/**
4730+ * Klasa reprezentująca okno do modyfikacji filtrów zakresowych
4731+ * @author Marcin Regdos
4732+ */
4733+public class WindowRange extends JDialog implements ChangeListener, ActionListener, IWindowFilter {
4734+
4735+ private final JPanel contentPanel = new JPanel();
4736+
4737+ private final PixelData image;
4738+ private PixelData timage;
4739+ private final IFilterRange filter;
4740+ private Range[] ranges;
4741+ private JLabel [] jlabels;
4742+ private JSlider [] fSliders;
4743+ private ImageViewer preview;
4744+ /**
4745+ * Konstruktor wymaga podania obrazu na którym filtr ma pracować oraz samego filtru
4746+ * @param image obraz do edycji
4747+ * * @param iFilter filtr zakresowy
4748+ */
4749+ WindowRange(PixelData image, IFilterRange iFilter, String name){
4750+ this.setModalityType(JDialog.DEFAULT_MODALITY_TYPE);
4751+ this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
4752+ this.image=image;
4753+ this.filter=iFilter;
4754+ ranges=filter.getRangeTable();
4755+ jlabels=new JLabel [ranges.length];
4756+ fSliders=new JSlider [ranges.length];
4757+ timage=(PixelData) image.clone();
4758+ this.setTitle(name);
4759+ InitGui();
4760+ filter.apply(image, timage);
4761+ preview.setImage(timage.toBufferedImage());
4762+
4763+ }
4764+ private void InitGui() {
4765+ this.setSize(450, 450);
4766+
4767+ getContentPane().setLayout(new BorderLayout());
4768+ contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
4769+ getContentPane().add(contentPanel, BorderLayout.CENTER);
4770+ contentPanel.setLayout(new BorderLayout(0, 0));
4771+ {
4772+ JPanel DescrAndSlidersPanel = new JPanel();
4773+ JPanel DescrPanel = new JPanel();
4774+ JPanel SlidersPanel = new JPanel();
4775+ contentPanel.add(DescrAndSlidersPanel, BorderLayout.CENTER);
4776+ DescrAndSlidersPanel.setLayout(new BoxLayout(DescrAndSlidersPanel, BoxLayout.X_AXIS));
4777+ DescrAndSlidersPanel.add(DescrPanel);
4778+ DescrAndSlidersPanel.add(SlidersPanel);
4779+ SlidersPanel.setLayout(new BoxLayout(SlidersPanel, BoxLayout.Y_AXIS));
4780+ DescrPanel.setLayout(new BoxLayout(DescrPanel, BoxLayout.Y_AXIS));
4781+ for (int i=0; i<ranges.length;++i){
4782+ {
4783+ jlabels[i] = new JLabel();
4784+ DescrPanel.add(jlabels[i]);
4785+ }
4786+ {
4787+ fSliders[i] = new JSlider(0, 100, new Float((ranges[i].getValue()-ranges[i].getMin())/(ranges[i].getMax()-ranges[i].getMin())*100).intValue());
4788+ fSliders[i].setToolTipText("Zakres od "+ ranges[i].getMin() + " do " + ranges[i].getMax());
4789+ fSliders[i].addChangeListener(this);
4790+ SlidersPanel.add(fSliders[i]);
4791+ jlabels[i].setText(ranges[i].getName());
4792+ }
4793+ }
4794+
4795+ }
4796+ preview =new ImageViewer(timage.toBufferedImage(), 300, 300);
4797+ contentPanel.add(preview, BorderLayout.NORTH);
4798+ {
4799+ JPanel buttonPane = new JPanel();
4800+ buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
4801+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
4802+ JButton revertButton = new JButton("Resetuj filtr");
4803+ revertButton.setActionCommand("reset");
4804+ buttonPane.add(revertButton);
4805+ revertButton.addActionListener(this);
4806+ {
4807+ JButton okButton = new JButton("Zastosuj");
4808+ okButton.setActionCommand("OK");
4809+ buttonPane.add(okButton);
4810+ okButton.addActionListener(this);
4811+ }
4812+ {
4813+ JButton cancelButton = new JButton("Anuluj");
4814+ cancelButton.setActionCommand("Cancel");
4815+ buttonPane.add(cancelButton);
4816+ cancelButton.addActionListener(this);
4817+ }
4818+
4819+ }
4820+
4821+
4822+ }
4823+ public void stateChanged(ChangeEvent e) {
4824+ JSlider source = (JSlider)e.getSource();
4825+ //if (!source.getValueIsAdjusting()) {
4826+ for (int i=0; i<ranges.length;++i){
4827+ if (source==fSliders[i]){
4828+ ranges[i].interpolate(new Integer (fSliders[i].getValue()).floatValue()/100);
4829+ }
4830+ }
4831+ filter.setRangeTable(ranges);
4832+ filter.apply(image, timage);
4833+ preview.setImage(timage.toBufferedImage());
4834+ //}
4835+ }
4836+ @Override
4837+ public PixelData showDialog(){
4838+ this.setVisible(true);
4839+ return timage;
4840+ }
4841+
4842+ public void actionPerformed(ActionEvent e) {
4843+ if ("OK".equals(e.getActionCommand())) {
4844+ this.setVisible(false);
4845+ this.dispose();
4846+ return;
4847+ }
4848+ if ("Cancel".equals(e.getActionCommand())) {
4849+ timage=null;
4850+ this.setVisible(false);
4851+ this.dispose();
4852+ return;
4853+ }
4854+ if (e.getActionCommand().equals("reset")){
4855+ filter.reset();
4856+ for (int i=0; i<ranges.length;++i){
4857+ fSliders[i].setValue( new Float((ranges[i].getValue()-ranges[i].getMin())/(ranges[i].getMax()-ranges[i].getMin())*100).intValue());
4858+ }
4859+ return;
4860+ }
4861+ }
4862+}
4863
4864=== added file 'src/main/java/manager/editor/WindowResize.java'
4865--- src/main/java/manager/editor/WindowResize.java 1970-01-01 00:00:00 +0000
4866+++ src/main/java/manager/editor/WindowResize.java 2012-04-17 18:42:22 +0000
4867@@ -0,0 +1,214 @@
4868+package manager.editor;
4869+
4870+
4871+import java.awt.event.ActionEvent;
4872+import java.awt.event.ActionListener;
4873+import javax.swing.*;
4874+
4875+/**
4876+ * Klasa opisuje okno dialogowe s�u��ce zmianie rozmiaru obrazka
4877+ * @author Wojtek J�dras
4878+ */
4879+
4880+public class WindowResize extends JDialog implements ActionListener, IWindowFilter
4881+{
4882+ private PixelData iMage;
4883+ private ButtonGroup buttonGroup1;
4884+ private ButtonGroup buttonGroup2;
4885+ private JButton jButton1;
4886+ private JButton jButton2;
4887+ private JLabel jLabel1;
4888+ private JLabel jLabel2;
4889+ private JLabel jLabel3;
4890+ private JLabel jLabel4;
4891+ private JRadioButton jRadioButton1;
4892+ private JRadioButton jRadioButton2;
4893+ private JRadioButton jRadioButton3;
4894+ private JRadioButton jRadioButton4;
4895+ private JTextField jTextField1;
4896+ private JTextField jTextField2;
4897+
4898+ /**
4899+ * Konstruktor - wymagany jest obraz do edycji
4900+ * @param image - referencja do objektu klasy PixelData przechowuj�ca obraz do edycji
4901+ */
4902+
4903+ public WindowResize(PixelData image)
4904+ {
4905+ iMage = image;
4906+ initComponents();
4907+ }
4908+
4909+
4910+
4911+ private void initComponents()
4912+ {
4913+ this.setModal(true);
4914+ buttonGroup1 = new ButtonGroup();
4915+ buttonGroup2 = new ButtonGroup();
4916+ jLabel1 = new JLabel();
4917+ jRadioButton1 = new JRadioButton();
4918+ jRadioButton2 = new JRadioButton();
4919+ jLabel2 = new JLabel();
4920+ jRadioButton3 = new JRadioButton();
4921+ jRadioButton4 = new JRadioButton();
4922+ jLabel3 = new JLabel();
4923+ jLabel4 = new JLabel();
4924+ jTextField1 = new JTextField();
4925+ jTextField2 = new JTextField();
4926+ jButton1 = new JButton();
4927+ jButton2 = new JButton();
4928+
4929+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
4930+
4931+ jLabel1.setText("Algorytm kowersji:");
4932+
4933+ buttonGroup1.add(jRadioButton1);
4934+ jRadioButton1.setSelected(true);
4935+ jRadioButton1.setText("Dwuliniowy");
4936+
4937+ buttonGroup1.add(jRadioButton2);
4938+ jRadioButton2.setText("Najbli�szy s�siad");
4939+
4940+ jLabel2.setText("Zmiana rozmiaru:");
4941+
4942+ jButton1.setText("OK");
4943+ jButton2.setText("Anuluj");
4944+ jLabel3.setText("W poziomie:");
4945+ jLabel4.setText("W pionie:");
4946+
4947+ buttonGroup2.add(jRadioButton3);
4948+ jRadioButton3.setSelected(true);
4949+ jRadioButton3.setText("Piksele");
4950+
4951+ buttonGroup2.add(jRadioButton4);
4952+ jRadioButton4.setText("Warto�� procentowa");
4953+
4954+
4955+ jButton1.addActionListener(this);
4956+ jButton2.addActionListener(this);
4957+
4958+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
4959+ getContentPane().setLayout(layout);
4960+ layout.setHorizontalGroup(
4961+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4962+ .addGroup(layout.createSequentialGroup()
4963+ .addContainerGap()
4964+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4965+ .addGroup(layout.createSequentialGroup()
4966+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4967+ .addComponent(jLabel1)
4968+ .addGroup(layout.createSequentialGroup()
4969+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4970+ .addGroup(layout.createSequentialGroup()
4971+ .addGap(39, 39, 39)
4972+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
4973+ .addComponent(jLabel3)
4974+ .addComponent(jLabel4)))
4975+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
4976+ .addComponent(jRadioButton1)
4977+ .addGap(8, 8, 8))
4978+ .addGroup(layout.createSequentialGroup()
4979+ .addGap(10, 10, 10)
4980+ .addComponent(jRadioButton3)))
4981+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
4982+ .addGroup(layout.createSequentialGroup()
4983+ .addGap(32, 32, 32)
4984+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4985+ .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
4986+ .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE))
4987+ .addGap(0, 0, Short.MAX_VALUE))
4988+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
4989+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 4, Short.MAX_VALUE)
4990+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
4991+ .addComponent(jRadioButton2, javax.swing.GroupLayout.Alignment.TRAILING)
4992+ .addComponent(jRadioButton4, javax.swing.GroupLayout.Alignment.TRAILING))))))
4993+ .addContainerGap())
4994+ .addGroup(layout.createSequentialGroup()
4995+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
4996+ .addComponent(jLabel2)
4997+ .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE))
4998+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
4999+ .addComponent(jButton2)
5000+ .addGap(35, 35, 35))))
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: