Merge lp:projekt-programowanie into lp:projekt-programowanie/gui
- trunk
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Moduł GUI | Pending | ||
Review via email: mp+102369@code.launchpad.net |
Commit message
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.