picrate 0.7.0-java → 0.8.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -1
  5. data/.travis.yml +2 -5
  6. data/CHANGELOG.md +4 -0
  7. data/README.md +3 -3
  8. data/Rakefile +15 -27
  9. data/docs/_config.yml +1 -1
  10. data/docs/_posts/2018-05-11-arch-linux-arm.md +1 -1
  11. data/docs/_posts/2018-11-18-building-gem.md +1 -1
  12. data/lib/picrate/app.rb +1 -1
  13. data/lib/picrate/native_folder.rb +1 -1
  14. data/lib/picrate/version.rb +1 -1
  15. data/mvnw +127 -51
  16. data/mvnw.cmd +182 -0
  17. data/pom.rb +39 -30
  18. data/pom.xml +50 -37
  19. data/src/main/java/monkstone/ColorUtil.java +1 -1
  20. data/src/main/java/monkstone/core/LibraryProxy.java +0 -1
  21. data/src/main/java/monkstone/noise/SimplexNoise.java +1 -1
  22. data/src/main/java/monkstone/vecmath/GfxRender.java +87 -0
  23. data/src/main/java/monkstone/vecmath/ShapeRender.java +1 -1
  24. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
  25. data/src/main/java/processing/awt/PGraphicsJava2D.java +48 -50
  26. data/src/main/java/processing/awt/PShapeJava2D.java +10 -0
  27. data/src/main/java/processing/awt/PSurfaceAWT.java +315 -371
  28. data/src/main/java/processing/core/PApplet.java +15424 -15495
  29. data/src/main/java/processing/core/PConstants.java +4 -4
  30. data/src/main/java/processing/core/PFont.java +394 -369
  31. data/src/main/java/processing/core/PGraphics.java +11 -10
  32. data/src/main/java/processing/core/PImage.java +1389 -1435
  33. data/src/main/java/processing/core/PMatrix2D.java +297 -294
  34. data/src/main/java/processing/core/PMatrix3D.java +641 -594
  35. data/src/main/java/processing/core/PShape.java +1755 -1784
  36. data/src/main/java/processing/core/PShapeOBJ.java +145 -133
  37. data/src/main/java/processing/core/PShapeSVG.java +808 -801
  38. data/src/main/java/processing/core/PStyle.java +141 -149
  39. data/src/main/java/processing/core/PSurface.java +111 -117
  40. data/src/main/java/processing/core/PSurfaceNone.java +178 -187
  41. data/src/main/java/processing/javafx/PGraphicsFX2D.java +349 -346
  42. data/src/main/java/processing/opengl/FontTexture.java +40 -59
  43. data/src/main/java/processing/opengl/FrameBuffer.java +28 -18
  44. data/src/main/java/processing/opengl/LinePath.java +7 -7
  45. data/src/main/java/processing/opengl/LineStroker.java +6 -10
  46. data/src/main/java/processing/opengl/PGL.java +56 -44
  47. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +909 -2338
  48. data/src/main/java/processing/opengl/PJOGL.java +1722 -1763
  49. data/src/main/java/processing/opengl/PShader.java +1308 -1192
  50. data/src/main/java/processing/opengl/PShapeOpenGL.java +487 -1811
  51. data/src/main/java/processing/opengl/PSurfaceJOGL.java +482 -497
  52. data/src/main/java/processing/opengl/Texture.java +99 -76
  53. data/src/main/java/processing/opengl/VertexBuffer.java +41 -43
  54. data/vendors/Rakefile +1 -1
  55. metadata +7 -4
@@ -1085,12 +1085,12 @@ public class PGraphics extends PImage implements PConstants{
1085
1085
  /**
1086
1086
  *
1087
1087
  */
1088
- static final protected float sinLUT[];
1088
+ static final protected float[] SIN_LUT;
1089
1089
 
1090
1090
  /**
1091
1091
  *
1092
1092
  */
1093
- static final protected float cosLUT[];
1093
+ static final protected float[] COS_LUT;
1094
1094
 
1095
1095
  /**
1096
1096
  *
@@ -1103,11 +1103,11 @@ public class PGraphics extends PImage implements PConstants{
1103
1103
  static final protected int SINCOS_LENGTH = (int) (360f / SINCOS_PRECISION);
1104
1104
 
1105
1105
  static {
1106
- sinLUT = new float[SINCOS_LENGTH];
1107
- cosLUT = new float[SINCOS_LENGTH];
1106
+ SIN_LUT = new float[SINCOS_LENGTH];
1107
+ COS_LUT = new float[SINCOS_LENGTH];
1108
1108
  for (int i = 0; i < SINCOS_LENGTH; i++) {
1109
- sinLUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
1110
- cosLUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
1109
+ SIN_LUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
1110
+ COS_LUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
1111
1111
  }
1112
1112
  }
1113
1113
 
@@ -3781,8 +3781,8 @@ public class PGraphics extends PImage implements PConstants{
3781
3781
  float[] cz = new float[ures];
3782
3782
  // calc unit circle in XZ plane
3783
3783
  for (int i = 0; i < ures; i++) {
3784
- cx[i] = cosLUT[(int) (i * delta) % SINCOS_LENGTH];
3785
- cz[i] = sinLUT[(int) (i * delta) % SINCOS_LENGTH];
3784
+ cx[i] = COS_LUT[(int) (i * delta) % SINCOS_LENGTH];
3785
+ cz[i] = SIN_LUT[(int) (i * delta) % SINCOS_LENGTH];
3786
3786
  }
3787
3787
  // computing vertexlist
3788
3788
  // vertexlist starts at south pole
@@ -3799,8 +3799,8 @@ public class PGraphics extends PImage implements PConstants{
3799
3799
 
3800
3800
  // step along Y axis
3801
3801
  for (int i = 1; i < vres; i++) {
3802
- float curradius = sinLUT[(int) angle % SINCOS_LENGTH];
3803
- float currY = cosLUT[(int) angle % SINCOS_LENGTH];
3802
+ float curradius = SIN_LUT[(int) angle % SINCOS_LENGTH];
3803
+ float currY = COS_LUT[(int) angle % SINCOS_LENGTH];
3804
3804
  for (int j = 0; j < ures; j++) {
3805
3805
  sphereX[currVert] = cx[j] * curradius;
3806
3806
  sphereY[currVert] = currY;
@@ -9388,6 +9388,7 @@ public class PGraphics extends PImage implements PConstants{
9388
9388
  * @return
9389
9389
  */
9390
9390
 
9391
+ @Override
9391
9392
  public boolean save(String filename) { // ignore
9392
9393
 
9393
9394
  if (hints[DISABLE_ASYNC_SAVEFRAME]) {
@@ -1,6 +1,6 @@
1
1
  /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
2
 
3
- /*
3
+ /*
4
4
  Part of the Processing project - http://processing.org
5
5
 
6
6
  Copyright (c) 2004-14 Ben Fry and Casey Reas
@@ -20,8 +20,7 @@
20
20
  Public License along with this library; if not, write to the
21
21
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
22
22
  Boston, MA 02111-1307 USA
23
- */
24
-
23
+ */
25
24
  package processing.core;
26
25
 
27
26
  import java.awt.*;
@@ -32,26 +31,25 @@ import java.util.Iterator;
32
31
  import javax.imageio.*;
33
32
  import javax.imageio.metadata.*;
34
33
 
35
-
36
34
  /**
37
- * ( begin auto-generated from PImage.xml )
38
- *
39
- * Datatype for storing images. Processing can display <b>.gif</b>,
40
- * <b>.jpg</b>, <b>.tga</b>, and <b>.png</b> images. Images may be
41
- * displayed in 2D and 3D space. Before an image is used, it must be loaded
42
- * with the <b>loadImage()</b> function. The <b>PImage</b> class contains
43
- * fields for the <b>width</b> and <b>height</b> of the image, as well as
44
- * an array called <b>pixels[]</b> that contains the values for every pixel
45
- * in the image. The methods described below allow easy access to the
46
- * image's pixels and alpha channel and simplify the process of compositing.<br/>
47
- * <br/> using the <b>pixels[]</b> array, be sure to use the
48
- * <b>loadPixels()</b> method on the image to make sure that the pixel data
49
- * is properly loaded.<br/>
50
- * <br/> create a new image, use the <b>createImage()</b> function. Do not
51
- * use the syntax <b>new PImage()</b>.
52
- *
53
- * ( end auto-generated )
54
- *
35
+ * ( begin auto-generated from PImage.xml )
36
+ *
37
+ * Datatype for storing images. Processing can display <b>.gif</b>,
38
+ * <b>.jpg</b>, <b>.tga</b>, and <b>.png</b> images. Images may be displayed in
39
+ * 2D and 3D space. Before an image is used, it must be loaded with the
40
+ * <b>loadImage()</b> function. The <b>PImage</b> class contains fields for the
41
+ * <b>width</b> and <b>height</b> of the image, as well as an array called
42
+ * <b>pixels[]</b> that contains the values for every pixel in the image. The
43
+ * methods described below allow easy access to the image's pixels and alpha
44
+ * channel and simplify the process of compositing.<br/>
45
+ * <br/> using the <b>pixels[]</b> array, be sure to use the
46
+ * <b>loadPixels()</b> method on the image to make sure that the pixel data is
47
+ * properly loaded.<br/>
48
+ * <br/> create a new image, use the <b>createImage()</b> function. Do not use
49
+ * the syntax <b>new PImage()</b>.
50
+ *
51
+ * ( end auto-generated )
52
+ *
55
53
  * @webref image
56
54
  * @usage Web &amp; Application
57
55
  * @instanceName pimg any object of type PImage
@@ -62,48 +60,51 @@ import javax.imageio.metadata.*;
62
60
  public class PImage implements PConstants, Cloneable {
63
61
 
64
62
  /**
65
- * Format for this image, one of RGB, ARGB or ALPHA.
66
- * note that RGB images still require 0xff in the high byte
67
- * because of how they'll be manipulated by other functions
63
+ * Format for this image, one of RGB, ARGB or ALPHA. note that RGB images
64
+ * still require 0xff in the high byte because of how they'll be manipulated
65
+ * by other functions
68
66
  */
69
67
  public int format;
70
68
 
71
69
  /**
72
70
  * ( begin auto-generated from pixels.xml )
73
71
  *
74
- * Array containing the values for all the pixels in the display window.
75
- * These values are of the color datatype. This array is the size of the
76
- * display window. For example, if the image is 100x100 pixels, there will
77
- * be 10000 values and if the window is 200x300 pixels, there will be 60000
78
- * values. The <b>index</b> value defines the position of a value within
79
- * the array. For example, the statement <b>color b = pixels[230]</b> will
80
- * set the variable <b>b</b> to be equal to the value at that location in
81
- * the array.<br />
72
+ * Array containing the values for all the pixels in the display window. These
73
+ * values are of the color datatype. This array is the size of the display
74
+ * window. For example, if the image is 100x100 pixels, there will be 10000
75
+ * values and if the window is 200x300 pixels, there will be 60000 values. The
76
+ * <b>index</b> value defines the position of a value within the array. For
77
+ * example, the statement <b>color b = pixels[230]</b> will set the variable
78
+ * <b>b</b> to be equal to the value at that location in the array.<br />
82
79
  * <br />
83
80
  * Before accessing this array, the data must loaded with the
84
- * <b>loadPixels()</b> function. After the array data has been modified,
85
- * the <b>updatePixels()</b> function must be run to update the changes.
86
- * Without <b>loadPixels()</b>, running the code may (or will in future
87
- * releases) result in a NullPointerException.
81
+ * <b>loadPixels()</b> function. After the array data has been modified, the
82
+ * <b>updatePixels()</b> function must be run to update the changes. Without
83
+ * <b>loadPixels()</b>, running the code may (or will in future releases)
84
+ * result in a NullPointerException.
88
85
  *
89
86
  * ( end auto-generated )
90
87
  *
91
88
  * @webref image:pixels
92
89
  * @usage web_application
93
- * @brief Array containing the color of every pixel in the image
90
+ * @brief Array containing the color of every pixel in the image
94
91
  */
95
92
  public int[] pixels;
96
93
 
97
- /** 1 for most images, 2 for hi-dpi/retina */
94
+ /**
95
+ * 1 for most images, 2 for hi-dpi/retina
96
+ */
98
97
  public int pixelDensity = 1;
99
98
 
100
- /** Actual dimensions of pixels array, taking into account the 2x setting. */
99
+ /**
100
+ * Actual dimensions of pixels array, taking into account the 2x setting.
101
+ */
101
102
  public int pixelWidth;
102
103
 
103
- /**
104
- *
105
- */
106
- public int pixelHeight;
104
+ /**
105
+ *
106
+ */
107
+ public int pixelHeight;
107
108
 
108
109
  /**
109
110
  * ( begin auto-generated from PImage_width.xml )
@@ -111,9 +112,10 @@ public class PImage implements PConstants, Cloneable {
111
112
  * The width of the image in units of pixels.
112
113
  *
113
114
  * ( end auto-generated )
115
+ *
114
116
  * @webref pimage:field
115
117
  * @usage web_application
116
- * @brief Image width
118
+ * @brief Image width
117
119
  */
118
120
  public int width;
119
121
 
@@ -123,51 +125,48 @@ public class PImage implements PConstants, Cloneable {
123
125
  * The height of the image in units of pixels.
124
126
  *
125
127
  * ( end auto-generated )
128
+ *
126
129
  * @webref pimage:field
127
130
  * @usage web_application
128
- * @brief Image height
131
+ * @brief Image height
129
132
  */
130
133
  public int height;
131
134
 
132
135
  /**
133
- * Path to parent object that will be used with save().
134
- * This prevents users from needing savePath() to use PImage.save().
136
+ * Path to parent object that will be used with save(). This prevents users
137
+ * from needing savePath() to use PImage.save().
135
138
  */
136
139
  public PApplet parent;
137
140
 
138
-
139
141
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
140
-
141
-
142
- /** modified portion of the image */
142
+ /**
143
+ * modified portion of the image
144
+ */
143
145
  protected boolean modified;
144
146
 
145
- /**
146
- *
147
- */
148
- protected int mx1,
149
-
147
+ /**
148
+ *
149
+ */
150
+ protected int mx1,
150
151
  /**
151
152
  *
152
153
  */
153
154
  my1,
154
-
155
155
  /**
156
156
  *
157
157
  */
158
158
  mx2,
159
-
160
159
  /**
161
160
  *
162
161
  */
163
162
  my2;
164
163
 
165
- /** Loaded pixels flag */
164
+ /**
165
+ * Loaded pixels flag
166
+ */
166
167
  public boolean loaded = false;
167
168
 
168
169
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
169
-
170
-
171
170
  // private fields
172
171
  private int fracU, ifU, fracV, ifV, u1, u2, v1, v2, sX, sY, iw, iw1, ih1;
173
172
  private int ul, ll, ur, lr, cUL, cLL, cUR, cLR;
@@ -178,9 +177,9 @@ public class PImage implements PConstants, Cloneable {
178
177
  // fixed point precision is limited to 15 bits!!
179
178
  static final int PRECISIONB = 15;
180
179
  static final int PRECISIONF = 1 << PRECISIONB;
181
- static final int PREC_MAXVAL = PRECISIONF-1;
182
- static final int PREC_ALPHA_SHIFT = 24-PRECISIONB;
183
- static final int PREC_RED_SHIFT = 16-PRECISIONB;
180
+ static final int PREC_MAXVAL = PRECISIONF - 1;
181
+ static final int PREC_ALPHA_SHIFT = 24 - PRECISIONB;
182
+ static final int PREC_RED_SHIFT = 16 - PRECISIONB;
184
183
 
185
184
  // internal kernel stuff for the gaussian blur filter
186
185
  private int blurRadius;
@@ -189,51 +188,46 @@ public class PImage implements PConstants, Cloneable {
189
188
  private int[][] blurMult;
190
189
 
191
190
  // colour component bitmasks (moved from PConstants in 2.0b7)
192
-
193
- /**
194
- *
195
- */
191
+ /**
192
+ *
193
+ */
196
194
  public static final int ALPHA_MASK = 0xff000000;
197
195
 
198
- /**
199
- *
200
- */
201
- public static final int RED_MASK = 0x00ff0000;
202
-
203
- /**
204
- *
205
- */
206
- public static final int GREEN_MASK = 0x0000ff00;
196
+ /**
197
+ *
198
+ */
199
+ public static final int RED_MASK = 0x00ff0000;
207
200
 
208
- /**
209
- *
210
- */
211
- public static final int BLUE_MASK = 0x000000ff;
201
+ /**
202
+ *
203
+ */
204
+ public static final int GREEN_MASK = 0x0000ff00;
212
205
 
206
+ /**
207
+ *
208
+ */
209
+ public static final int BLUE_MASK = 0x000000ff;
213
210
 
214
211
  //////////////////////////////////////////////////////////////
215
-
216
-
217
212
  /**
218
213
  * ( begin auto-generated from PImage.xml )
219
214
  *
220
215
  * Datatype for storing images. Processing can display <b>.gif</b>,
221
- * <b>.jpg</b>, <b>.tga</b>, and <b>.png</b> images. Images may be
222
- * displayed in 2D and 3D space. Before an image is used, it must be loaded
223
- * with the <b>loadImage()</b> function. The <b>PImage</b> object contains
224
- * fields for the <b>width</b> and <b>height</b> of the image, as well as
225
- * an array called <b>pixels[]</b> which contains the values for every
226
- * pixel in the image. A group of methods, described below, allow easy
227
- * access to the image's pixels and alpha channel and simplify the process
228
- * of compositing.
229
- * <br/> <br/>
216
+ * <b>.jpg</b>, <b>.tga</b>, and <b>.png</b> images. Images may be displayed
217
+ * in 2D and 3D space. Before an image is used, it must be loaded with the
218
+ * <b>loadImage()</b> function. The <b>PImage</b> object contains fields for
219
+ * the <b>width</b> and <b>height</b> of the image, as well as an array called
220
+ * <b>pixels[]</b> which contains the values for every pixel in the image. A
221
+ * group of methods, described below, allow easy access to the image's pixels
222
+ * and alpha channel and simplify the process of compositing.
223
+ *
230
224
  * Before using the <b>pixels[]</b> array, be sure to use the
231
- * <b>loadPixels()</b> method on the image to make sure that the pixel data
232
- * is properly loaded.
233
- * <br/> <br/>
225
+ * <b>loadPixels()</b> method on the image to make sure that the pixel data is
226
+ * properly loaded.
227
+ *
234
228
  * To create a new image, use the <b>createImage()</b> function (do not use
235
- * <b>new PImage()</b>).
236
- * ( end auto-generated )
229
+ * <b>new PImage()</b>). ( end auto-generated )
230
+ *
237
231
  * @nowebref
238
232
  * @usage web_application
239
233
  * @see PApplet#loadImage(String, String)
@@ -245,10 +239,8 @@ public class PImage implements PConstants, Cloneable {
245
239
  pixelDensity = 1;
246
240
  }
247
241
 
248
-
249
242
  /**
250
- * @nowebref
251
- * @param width image width
243
+ * @nowebref @param width image width
252
244
  * @param height image height
253
245
  */
254
246
  public PImage(int width, int height) {
@@ -264,10 +256,9 @@ public class PImage implements PConstants, Cloneable {
264
256
  // toxi: agreed and same reasons why i left it out ;)
265
257
  }
266
258
 
267
-
268
259
  /**
269
- * @param width
270
- * @param height
260
+ * @param width
261
+ * @param height
271
262
  * @nowebref
272
263
  * @param format Either RGB, ARGB, ALPHA (grayscale alpha channel)
273
264
  */
@@ -275,39 +266,39 @@ public class PImage implements PConstants, Cloneable {
275
266
  init(width, height, format, 1);
276
267
  }
277
268
 
278
- /**
279
- *
280
- * @param width
281
- * @param height
282
- * @param format
283
- * @param factor
284
- */
285
- public PImage(int width, int height, int format, int factor) {
269
+ /**
270
+ *
271
+ * @param width
272
+ * @param height
273
+ * @param format
274
+ * @param factor
275
+ */
276
+ public PImage(int width, int height, int format, int factor) {
286
277
  init(width, height, format, factor);
287
278
  }
288
279
 
289
-
290
280
  /**
291
281
  * Do not remove, see notes in the other variant.
292
- * @param width
293
- * @param height
294
- * @param format
282
+ *
283
+ * @param width
284
+ * @param height
285
+ * @param format
295
286
  */
296
287
  public void init(int width, int height, int format) { // ignore
297
288
  init(width, height, format, 1);
298
289
  }
299
290
 
300
-
301
291
  /**
302
- * Function to be used by subclasses of PImage to init later than
303
- * at the constructor, or re-init later when things changes.
304
- * Used by Capture and Movie classes (and perhaps others),
305
- * because the width/height will not be known when super() is called.
306
- * (Leave this public so that other libraries can do the same.)
307
- * @param width
308
- * @param factor
309
- * @param height
310
- * @param format
292
+ * Function to be used by subclasses of PImage to init later than at the
293
+ * constructor, or re-init later when things changes. Used by Capture and
294
+ * Movie classes (and perhaps others), because the width/height will not be
295
+ * known when super() is called. (Leave this public so that other libraries
296
+ * can do the same.)
297
+ *
298
+ * @param width
299
+ * @param factor
300
+ * @param height
301
+ * @param format
311
302
  */
312
303
  public void init(int width, int height, int format, int factor) { // ignore
313
304
  this.width = width;
@@ -320,12 +311,13 @@ public class PImage implements PConstants, Cloneable {
320
311
  this.pixels = new int[pixelWidth * pixelHeight];
321
312
  }
322
313
 
323
-
324
314
  /**
325
315
  * Check the alpha on an image, using a really primitive loop.
326
316
  */
327
317
  protected void checkAlpha() {
328
- if (pixels == null) return;
318
+ if (pixels == null) {
319
+ return;
320
+ }
329
321
 
330
322
  for (int i = 0; i < pixels.length; i++) {
331
323
  // since transparency is often at corners, hopefully this
@@ -337,18 +329,15 @@ public class PImage implements PConstants, Cloneable {
337
329
  }
338
330
  }
339
331
 
340
-
341
332
  //////////////////////////////////////////////////////////////
342
-
343
-
344
333
  /**
345
- * Construct a new PImage from a java.awt.Image. This constructor assumes
346
- * that you've done the work of making sure a MediaTracker has been used
347
- * to fully download the data and that the img is valid.
334
+ * Construct a new PImage from a java.awt.Image. This constructor assumes that
335
+ * you've done the work of making sure a MediaTracker has been used to fully
336
+ * download the data and that the img is valid.
348
337
  *
349
338
  * @nowebref
350
- * @param img assumes a MediaTracker has been used to fully download
351
- * the data and the img is valid
339
+ * @param img assumes a MediaTracker has been used to fully download the data
340
+ * and the img is valid
352
341
  */
353
342
  public PImage(Image img) {
354
343
  format = RGB;
@@ -357,8 +346,8 @@ public class PImage implements PConstants, Cloneable {
357
346
  width = bi.getWidth();
358
347
  height = bi.getHeight();
359
348
  int type = bi.getType();
360
- if (type == BufferedImage.TYPE_3BYTE_BGR ||
361
- type == BufferedImage.TYPE_4BYTE_ABGR) {
349
+ if (type == BufferedImage.TYPE_3BYTE_BGR
350
+ || type == BufferedImage.TYPE_4BYTE_ABGR) {
362
351
  pixels = new int[width * height];
363
352
  bi.getRGB(0, 0, width, height, pixels, 0, width);
364
353
  if (type == BufferedImage.TYPE_4BYTE_ABGR) {
@@ -384,62 +373,58 @@ public class PImage implements PConstants, Cloneable {
384
373
  width = img.getWidth(null);
385
374
  height = img.getHeight(null);
386
375
  pixels = new int[width * height];
387
- PixelGrabber pg =
388
- new PixelGrabber(img, 0, 0, width, height, pixels, 0, width);
376
+ PixelGrabber pg
377
+ = new PixelGrabber(img, 0, 0, width, height, pixels, 0, width);
389
378
  try {
390
379
  pg.grabPixels();
391
- } catch (InterruptedException e) { }
380
+ } catch (InterruptedException e) {
381
+ }
392
382
  }
393
383
  pixelDensity = 1;
394
384
  pixelWidth = width;
395
385
  pixelHeight = height;
396
386
  }
397
387
 
398
-
399
388
  /**
400
389
  * Use the getNative() method instead, which allows library interfaces to be
401
- * written in a cross-platform fashion for desktop, Android, and others.
402
- * This is still included for PGraphics objects, which may need the image.
403
- * @return
390
+ * written in a cross-platform fashion for desktop, Android, and others. This
391
+ * is still included for PGraphics objects, which may need the image.
392
+ *
393
+ * @return
404
394
  */
405
395
  public Image getImage() { // ignore
406
396
  return (Image) getNative();
407
397
  }
408
398
 
409
-
410
399
  /**
411
400
  * Returns a native BufferedImage from this PImage.
412
- * @return
401
+ *
402
+ * @return
413
403
  */
414
404
  public Object getNative() { // ignore
415
405
  loadPixels();
416
- int type = (format == RGB) ?
417
- BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
406
+ int type = (format == RGB)
407
+ ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
418
408
  BufferedImage image = new BufferedImage(pixelWidth, pixelHeight, type);
419
409
  WritableRaster wr = image.getRaster();
420
410
  wr.setDataElements(0, 0, pixelWidth, pixelHeight, pixels);
421
411
  return image;
422
412
  }
423
413
 
424
-
425
414
  //////////////////////////////////////////////////////////////
426
-
427
415
  // MARKING IMAGE AS MODIFIED / FOR USE w/ GET/SET
428
-
429
- /**
430
- *
431
- * @return
432
- */
433
-
434
-
416
+ /**
417
+ *
418
+ * @return
419
+ */
435
420
  public boolean isModified() { // ignore
436
421
  return modified;
437
422
  }
438
423
 
439
- /**
440
- *
441
- */
442
- public void setModified() { // ignore
424
+ /**
425
+ *
426
+ */
427
+ public void setModified() { // ignore
443
428
  modified = true;
444
429
  mx1 = 0;
445
430
  my1 = 0;
@@ -447,87 +432,86 @@ public class PImage implements PConstants, Cloneable {
447
432
  my2 = pixelHeight;
448
433
  }
449
434
 
450
- /**
451
- *
452
- * @param m
453
- */
454
- public void setModified(boolean m) { // ignore
435
+ /**
436
+ *
437
+ * @param m
438
+ */
439
+ public void setModified(boolean m) { // ignore
455
440
  modified = m;
456
441
  }
457
442
 
458
- /**
459
- *
460
- * @return
461
- */
462
- public int getModifiedX1() { // ignore
443
+ /**
444
+ *
445
+ * @return
446
+ */
447
+ public int getModifiedX1() { // ignore
463
448
  return mx1;
464
449
  }
465
450
 
466
- /**
467
- *
468
- * @return
469
- */
470
- public int getModifiedX2() { // ignore
451
+ /**
452
+ *
453
+ * @return
454
+ */
455
+ public int getModifiedX2() { // ignore
471
456
  return mx2;
472
457
  }
473
458
 
474
- /**
475
- *
476
- * @return
477
- */
478
- public int getModifiedY1() { // ignore
459
+ /**
460
+ *
461
+ * @return
462
+ */
463
+ public int getModifiedY1() { // ignore
479
464
  return my1;
480
465
  }
481
466
 
482
- /**
483
- *
484
- * @return
485
- */
486
- public int getModifiedY2() { // ignore
467
+ /**
468
+ *
469
+ * @return
470
+ */
471
+ public int getModifiedY2() { // ignore
487
472
  return my2;
488
473
  }
489
474
 
490
-
491
475
  /**
492
476
  * ( begin auto-generated from PImage_loadPixels.xml )
493
477
  *
494
478
  * Loads the pixel data for the image into its <b>pixels[]</b> array. This
495
- * function must always be called before reading from or writing to <b>pixels[]</b>.
479
+ * function must always be called before reading from or writing to
480
+ * <b>pixels[]</b>.
496
481
  * <br/><br/> renderers may or may not seem to require <b>loadPixels()</b>
497
482
  * or <b>updatePixels()</b>. However, the rule is that any time you want to
498
483
  * manipulate the <b>pixels[]</b> array, you must first call
499
484
  * <b>loadPixels()</b>, and after changes have been made, call
500
485
  * <b>updatePixels()</b>. Even if the renderer may not seem to use this
501
- * function in the current Processing release, this will always be subject
502
- * to change.
486
+ * function in the current Processing release, this will always be subject to
487
+ * change.
503
488
  *
504
489
  * ( end auto-generated )
505
490
  *
506
491
  * <h3>Advanced</h3>
507
492
  * Call this when you want to mess with the pixels[] array.
508
- * <p/>
509
- * For subclasses where the pixels[] buffer isn't set by default,
510
- * this should copy all data into the pixels[] array
493
+ *
494
+ * For subclasses where the pixels[] buffer isn't set by default, this should
495
+ * copy all data into the pixels[] array
511
496
  *
512
497
  * @webref pimage:pixels
513
498
  * @brief Loads the pixel data for the image into its pixels[] array
514
499
  * @usage web_application
515
500
  */
516
501
  public void loadPixels() { // ignore
517
- if (pixels == null || pixels.length != pixelWidth*pixelHeight) {
518
- pixels = new int[pixelWidth*pixelHeight];
502
+ if (pixels == null || pixels.length != pixelWidth * pixelHeight) {
503
+ pixels = new int[pixelWidth * pixelHeight];
519
504
  }
520
505
  setLoaded();
521
506
  }
522
507
 
523
- /**
524
- *
525
- */
526
- public void updatePixels() { // ignore
508
+ /**
509
+ *
510
+ */
511
+ public void updatePixels() { // ignore
527
512
  updatePixels(0, 0, pixelWidth, pixelHeight);
528
513
  }
529
514
 
530
-
531
515
  /**
532
516
  * ( begin auto-generated from PImage_updatePixels.xml )
533
517
  *
@@ -539,18 +523,18 @@ public class PImage implements PConstants, Cloneable {
539
523
  * manipulate the <b>pixels[]</b> array, you must first call
540
524
  * <b>loadPixels()</b>, and after changes have been made, call
541
525
  * <b>updatePixels()</b>. Even if the renderer may not seem to use this
542
- * function in the current Processing release, this will always be subject
543
- * to change.
544
- * <br/> <br/>
526
+ * function in the current Processing release, this will always be subject to
527
+ * change.
528
+ *
545
529
  * Currently, none of the renderers use the additional parameters to
546
530
  * <b>updatePixels()</b>, however this may be implemented in the future.
547
531
  *
548
532
  * ( end auto-generated )
549
533
  * <h3>Advanced</h3>
550
- * Mark the pixels in this region as needing an update.
551
- * This is not currently used by any of the renderers, however the api
552
- * is structured this way in the hope of being able to use this to
553
- * speed things up in the future.
534
+ * Mark the pixels in this region as needing an update. This is not currently
535
+ * used by any of the renderers, however the api is structured this way in the
536
+ * hope of being able to use this to speed things up in the future.
537
+ *
554
538
  * @webref pimage:pixels
555
539
  * @brief Updates the image with the data in its pixels[] array
556
540
  * @usage web_application
@@ -571,40 +555,51 @@ public class PImage implements PConstants, Cloneable {
571
555
  modified = true;
572
556
 
573
557
  } else {
574
- if (x < mx1) mx1 = PApplet.max(0, x);
575
- if (x > mx2) mx2 = PApplet.min(pixelWidth, x);
576
- if (y < my1) my1 = PApplet.max(0, y);
577
- if (y > my2) my2 = PApplet.min(pixelHeight, y);
558
+ if (x < mx1) {
559
+ mx1 = PApplet.max(0, x);
560
+ }
561
+ if (x > mx2) {
562
+ mx2 = PApplet.min(pixelWidth, x);
563
+ }
564
+ if (y < my1) {
565
+ my1 = PApplet.max(0, y);
566
+ }
567
+ if (y > my2) {
568
+ my2 = PApplet.min(pixelHeight, y);
569
+ }
578
570
 
579
- if (x2 < mx1) mx1 = PApplet.max(0, x2);
580
- if (x2 > mx2) mx2 = PApplet.min(pixelWidth, x2);
581
- if (y2 < my1) my1 = PApplet.max(0, y2);
582
- if (y2 > my2) my2 = PApplet.min(pixelHeight, y2);
571
+ if (x2 < mx1) {
572
+ mx1 = PApplet.max(0, x2);
573
+ }
574
+ if (x2 > mx2) {
575
+ mx2 = PApplet.min(pixelWidth, x2);
576
+ }
577
+ if (y2 < my1) {
578
+ my1 = PApplet.max(0, y2);
579
+ }
580
+ if (y2 > my2) {
581
+ my2 = PApplet.min(pixelHeight, y2);
582
+ }
583
583
  }
584
584
  }
585
585
 
586
-
587
586
  //////////////////////////////////////////////////////////////
588
-
589
587
  // COPYING IMAGE DATA
590
-
591
-
592
588
  /**
593
- * Duplicate an image, returns new PImage object.
594
- * The pixels[] array for the new object will be unique
595
- * and recopied from the source image. This is implemented as an
596
- * override of Object.clone(). We recommend using get() instead,
597
- * because it prevents you from needing to catch the
589
+ * Duplicate an image, returns new PImage object. The pixels[] array for the
590
+ * new object will be unique and recopied from the source image. This is
591
+ * implemented as an override of Object.clone(). We recommend using get()
592
+ * instead, because it prevents you from needing to catch the
598
593
  * CloneNotSupportedException, and from doing a cast from the result.
599
- * @return
600
- * @throws java.lang.CloneNotSupportedException
594
+ *
595
+ * @return
596
+ * @throws java.lang.CloneNotSupportedException
601
597
  */
602
598
  @Override
603
599
  public Object clone() throws CloneNotSupportedException { // ignore
604
600
  return get();
605
601
  }
606
602
 
607
-
608
603
  /**
609
604
  * ( begin auto-generated from PImage_resize.xml )
610
605
  *
@@ -614,13 +609,14 @@ public class PImage implements PConstants, Cloneable {
614
609
  * change the height using the same proportion, use resize(150, 0).<br />
615
610
  * <br />
616
611
  * Even though a PGraphics is technically a PImage, it is not possible to
617
- * rescale the image data found in a PGraphics. (It's simply not possible
618
- * to do this consistently across renderers: technically infeasible with
619
- * P3D, or what would it even do with PDF?) If you want to resize PGraphics
620
- * content, first get a copy of its image data using the <b>get()</b>
612
+ * rescale the image data found in a PGraphics. (It's simply not possible to
613
+ * do this consistently across renderers: technically infeasible with P3D, or
614
+ * what would it even do with PDF?) If you want to resize PGraphics content,
615
+ * first get a copy of its image data using the <b>get()</b>
621
616
  * method, and call <b>resize()</b> on the PImage that is returned.
622
617
  *
623
618
  * ( end auto-generated )
619
+ *
624
620
  * @webref pimage:method
625
621
  * @brief Changes the size of an image to a new width and height
626
622
  * @usage web_application
@@ -641,8 +637,8 @@ public class PImage implements PConstants, Cloneable {
641
637
  h = (int) (height * diff);
642
638
  }
643
639
 
644
- BufferedImage img =
645
- shrinkImage((BufferedImage) getNative(), w*pixelDensity, h*pixelDensity);
640
+ BufferedImage img
641
+ = shrinkImage((BufferedImage) getNative(), w * pixelDensity, h * pixelDensity);
646
642
 
647
643
  PImage temp = new PImage(img);
648
644
  this.pixelWidth = temp.width;
@@ -658,16 +654,15 @@ public class PImage implements PConstants, Cloneable {
658
654
  updatePixels();
659
655
  }
660
656
 
661
-
662
657
  // Adapted from getFasterScaledInstance() method from page 111 of
663
658
  // "Filthy Rich Clients" by Chet Haase and Romain Guy
664
659
  // Additional modifications and simplifications have been added,
665
660
  // plus a fix to deal with an infinite loop if images are expanded.
666
661
  // http://code.google.com/p/processing/issues/detail?id=1463
667
662
  static private BufferedImage shrinkImage(BufferedImage img,
668
- int targetWidth, int targetHeight) {
669
- int type = (img.getTransparency() == Transparency.OPAQUE) ?
670
- BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
663
+ int targetWidth, int targetHeight) {
664
+ int type = (img.getTransparency() == Transparency.OPAQUE)
665
+ ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
671
666
  BufferedImage outgoing = img;
672
667
  BufferedImage scratchImage = null;
673
668
  Graphics2D g2 = null;
@@ -705,7 +700,7 @@ public class PImage implements PConstants, Cloneable {
705
700
  g2 = scratchImage.createGraphics();
706
701
  }
707
702
  g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
708
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
703
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
709
704
  g2.drawImage(outgoing, 0, 0, w, h, 0, 0, prevW, prevH, null);
710
705
  prevW = w;
711
706
  prevH = h;
@@ -718,8 +713,8 @@ public class PImage implements PConstants, Cloneable {
718
713
 
719
714
  // If we used a scratch buffer that is larger than our target size,
720
715
  // create an image of the right size and copy the results into it
721
- if (targetWidth != outgoing.getWidth() ||
722
- targetHeight != outgoing.getHeight()) {
716
+ if (targetWidth != outgoing.getWidth()
717
+ || targetHeight != outgoing.getHeight()) {
723
718
  scratchImage = new BufferedImage(targetWidth, targetHeight, type);
724
719
  g2 = scratchImage.createGraphics();
725
720
  g2.drawImage(outgoing, 0, 0, null);
@@ -729,85 +724,75 @@ public class PImage implements PConstants, Cloneable {
729
724
  return outgoing;
730
725
  }
731
726
 
732
-
733
727
  //////////////////////////////////////////////////////////////
734
-
735
728
  // MARKING IMAGE AS LOADED / FOR USE IN RENDERERS
736
-
737
- /**
738
- *
739
- * @return
740
- */
741
-
742
-
729
+ /**
730
+ *
731
+ * @return
732
+ */
743
733
  public boolean isLoaded() { // ignore
744
734
  return loaded;
745
735
  }
746
736
 
747
- /**
748
- *
749
- */
750
- public void setLoaded() { // ignore
737
+ /**
738
+ *
739
+ */
740
+ public void setLoaded() { // ignore
751
741
  loaded = true;
752
742
  }
753
743
 
754
- /**
755
- *
756
- * @param l
757
- */
758
- public void setLoaded(boolean l) { // ignore
744
+ /**
745
+ *
746
+ * @param l
747
+ */
748
+ public void setLoaded(boolean l) { // ignore
759
749
  loaded = l;
760
750
  }
761
751
 
762
-
763
752
  //////////////////////////////////////////////////////////////
764
-
765
753
  // GET/SET PIXELS
766
-
767
-
768
754
  /**
769
755
  * ( begin auto-generated from PImage_get.xml )
770
756
  *
771
757
  * Reads the color of any pixel or grabs a section of an image. If no
772
758
  * parameters are specified, the entire image is returned. Use the <b>x</b>
773
- * and <b>y</b> parameters to get the value of one pixel. Get a section of
774
- * the display window by specifying an additional <b>width</b> and
759
+ * and <b>y</b> parameters to get the value of one pixel. Get a section of the
760
+ * display window by specifying an additional <b>width</b> and
775
761
  * <b>height</b> parameter. When getting an image, the <b>x</b> and
776
- * <b>y</b> parameters define the coordinates for the upper-left corner of
777
- * the image, regardless of the current <b>imageMode()</b>.<br />
762
+ * <b>y</b> parameters define the coordinates for the upper-left corner of the
763
+ * image, regardless of the current <b>imageMode()</b>.<br />
778
764
  * <br />
779
- * If the pixel requested is outside of the image window, black is
780
- * returned. The numbers returned are scaled according to the current color
781
- * ranges, but only RGB values are returned by this function. For example,
782
- * even though you may have drawn a shape with <b>colorMode(HSB)</b>, the
783
- * numbers returned will be in RGB format.<br />
765
+ * If the pixel requested is outside of the image window, black is returned.
766
+ * The numbers returned are scaled according to the current color ranges, but
767
+ * only RGB values are returned by this function. For example, even though you
768
+ * may have drawn a shape with <b>colorMode(HSB)</b>, the numbers returned
769
+ * will be in RGB format.<br />
784
770
  * <br />
785
- * Getting the color of a single pixel with <b>get(x, y)</b> is easy, but
786
- * not as fast as grabbing the data directly from <b>pixels[]</b>. The
787
- * equivalent statement to <b>get(x, y)</b> using <b>pixels[]</b> is
788
- * <b>pixels[y*width+x]</b>. See the reference for <b>pixels[]</b> for more information.
771
+ * Getting the color of a single pixel with <b>get(x, y)</b> is easy, but not
772
+ * as fast as grabbing the data directly from <b>pixels[]</b>. The equivalent
773
+ * statement to <b>get(x, y)</b> using <b>pixels[]</b> is
774
+ * <b>pixels[y*width+x]</b>. See the reference for <b>pixels[]</b> for more
775
+ * information.
789
776
  *
790
777
  * ( end auto-generated )
791
778
  *
792
779
  * <h3>Advanced</h3>
793
- * Returns an ARGB "color" type (a packed 32 bit int with the color.
794
- * If the coordinate is outside the image, zero is returned
795
- * (black, but completely transparent).
780
+ * Returns an ARGB "color" type (a packed 32 bit int with the color. If the
781
+ * coordinate is outside the image, zero is returned (black, but completely
782
+ * transparent).
796
783
  * <P>
797
- * If the image is in RGB format (i.e. on a PVideo object),
798
- * the value will get its high bits set, just to avoid cases where
799
- * they haven't been set already.
784
+ * If the image is in RGB format (i.e. on a PVideo object), the value will get
785
+ * its high bits set, just to avoid cases where they haven't been set already.
800
786
  * <P>
801
- * If the image is in ALPHA format, this returns a white with its
802
- * alpha value set.
787
+ * If the image is in ALPHA format, this returns a white with its alpha value
788
+ * set.
803
789
  * <P>
804
- * This function is included primarily for beginners. It is quite
805
- * slow because it has to check to see if the x, y that was provided
806
- * is inside the bounds, and then has to check to see what image
807
- * type it is. If you want things to be more efficient, access the
808
- * pixels[] array directly.
790
+ * This function is included primarily for beginners. It is quite slow because
791
+ * it has to check to see if the x, y that was provided is inside the bounds,
792
+ * and then has to check to see what image type it is. If you want things to
793
+ * be more efficient, access the pixels[] array directly.
809
794
  *
810
- * @return
795
+ * @return
811
796
  * @webref image:pixels
812
797
  * @brief Reads the color of any pixel or grabs a rectangle of pixels
813
798
  * @usage web_application
@@ -818,28 +803,29 @@ public class PImage implements PConstants, Cloneable {
818
803
  * @see PApplet#copy(PImage, int, int, int, int, int, int, int, int)
819
804
  */
820
805
  public int get(int x, int y) {
821
- if ((x < 0) || (y < 0) || (x >= pixelWidth) || (y >= pixelHeight)) return 0;
806
+ if ((x < 0) || (y < 0) || (x >= pixelWidth) || (y >= pixelHeight)) {
807
+ return 0;
808
+ }
822
809
 
823
810
  switch (format) {
824
811
  case RGB:
825
- return pixels[y*pixelWidth + x] | 0xff000000;
812
+ return pixels[y * pixelWidth + x] | 0xff000000;
826
813
 
827
814
  case ARGB:
828
- return pixels[y*pixelWidth + x];
815
+ return pixels[y * pixelWidth + x];
829
816
 
830
817
  case ALPHA:
831
- return (pixels[y*pixelWidth + x] << 24) | 0xffffff;
818
+ return (pixels[y * pixelWidth + x] << 24) | 0xffffff;
832
819
  }
833
820
  return 0;
834
821
  }
835
822
 
836
-
837
823
  /**
838
- * @param x
839
- * @param y
824
+ * @param x
825
+ * @param y
840
826
  * @param w width of pixel rectangle to get
841
827
  * @param h height of pixel rectangle to get
842
- * @return
828
+ * @return
843
829
  */
844
830
  public PImage get(int x, int y, int w, int h) {
845
831
  int targetX = 0;
@@ -883,8 +869,8 @@ public class PImage implements PConstants, Cloneable {
883
869
  }
884
870
 
885
871
  PImage target = new PImage(targetWidth / pixelDensity,
886
- targetHeight / pixelDensity,
887
- targetFormat, pixelDensity);
872
+ targetHeight / pixelDensity,
873
+ targetFormat, pixelDensity);
888
874
  target.parent = parent; // parent may be null so can't use createImage()
889
875
  if (w > 0 && h > 0) {
890
876
  getImpl(x, y, w, h, target, targetX, targetY);
@@ -892,11 +878,11 @@ public class PImage implements PConstants, Cloneable {
892
878
  return target;
893
879
  }
894
880
 
895
-
896
881
  /**
897
882
  * Returns a copy of this PImage. Equivalent to get(0, 0, width, height).
898
883
  * Deprecated, just use copy() instead.
899
- * @return
884
+ *
885
+ * @return
900
886
  */
901
887
  public PImage get() {
902
888
  // Formerly this used clone(), which caused memory problems.
@@ -904,33 +890,33 @@ public class PImage implements PConstants, Cloneable {
904
890
  return get(0, 0, pixelWidth, pixelHeight);
905
891
  }
906
892
 
907
- /**
908
- *
909
- * @return
910
- */
911
- public PImage copy() {
893
+ /**
894
+ *
895
+ * @return
896
+ */
897
+ public PImage copy() {
912
898
  return get(0, 0, pixelWidth, pixelHeight);
913
899
  }
914
900
 
915
-
916
901
  /**
917
- * Internal function to actually handle getting a block of pixels that
918
- * has already been properly cropped to a valid region. That is, x/y/w/h
919
- * are guaranteed to be inside the image space, so the implementation can
920
- * use the fastest possible pixel copying method.
921
- * @param sourceX
922
- * @param sourceY
923
- * @param sourceWidth
924
- * @param target
925
- * @param sourceHeight
926
- * @param targetX
927
- * @param targetY
902
+ * Internal function to actually handle getting a block of pixels that has
903
+ * already been properly cropped to a valid region. That is, x/y/w/h are
904
+ * guaranteed to be inside the image space, so the implementation can use the
905
+ * fastest possible pixel copying method.
906
+ *
907
+ * @param sourceX
908
+ * @param sourceY
909
+ * @param sourceWidth
910
+ * @param target
911
+ * @param sourceHeight
912
+ * @param targetX
913
+ * @param targetY
928
914
  */
929
915
  protected void getImpl(int sourceX, int sourceY,
930
- int sourceWidth, int sourceHeight,
931
- PImage target, int targetX, int targetY) {
932
- int sourceIndex = sourceY*pixelWidth + sourceX;
933
- int targetIndex = targetY*target.pixelWidth + targetX;
916
+ int sourceWidth, int sourceHeight,
917
+ PImage target, int targetX, int targetY) {
918
+ int sourceIndex = sourceY * pixelWidth + sourceX;
919
+ int targetIndex = targetY * target.pixelWidth + targetX;
934
920
  for (int row = 0; row < sourceHeight; row++) {
935
921
  System.arraycopy(pixels, sourceIndex, target.pixels, targetIndex, sourceWidth);
936
922
  sourceIndex += pixelWidth;
@@ -938,23 +924,22 @@ public class PImage implements PConstants, Cloneable {
938
924
  }
939
925
  }
940
926
 
941
-
942
927
  /**
943
928
  * ( begin auto-generated from PImage_set.xml )
944
929
  *
945
- * Changes the color of any pixel or writes an image directly into the
946
- * display window.<br />
930
+ * Changes the color of any pixel or writes an image directly into the display
931
+ * window.<br />
947
932
  * <br />
948
933
  * The <b>x</b> and <b>y</b> parameters specify the pixel to change and the
949
934
  * <b>color</b> parameter specifies the color value. The color parameter is
950
935
  * affected by the current color mode (the default is RGB values from 0 to
951
936
  * 255). When setting an image, the <b>x</b> and <b>y</b> parameters define
952
- * the coordinates for the upper-left corner of the image, regardless of
953
- * the current <b>imageMode()</b>.
954
- * <br /><br />
955
- * Setting the color of a single pixel with <b>set(x, y)</b> is easy, but
956
- * not as fast as putting the data directly into <b>pixels[]</b>. The
957
- * equivalent statement to <b>set(x, y, #000000)</b> using <b>pixels[]</b>
937
+ * the coordinates for the upper-left corner of the image, regardless of the
938
+ * current <b>imageMode()</b>.
939
+ *
940
+ * Setting the color of a single pixel with <b>set(x, y)</b> is easy, but not
941
+ * as fast as putting the data directly into <b>pixels[]</b>. The equivalent
942
+ * statement to <b>set(x, y, #000000)</b> using <b>pixels[]</b>
958
943
  * is <b>pixels[y*width+x] = #000000</b>. See the reference for
959
944
  * <b>pixels[]</b> for more information.
960
945
  *
@@ -971,21 +956,22 @@ public class PImage implements PConstants, Cloneable {
971
956
  * @see PImage#copy(PImage, int, int, int, int, int, int, int, int)
972
957
  */
973
958
  public void set(int x, int y, int c) {
974
- if ((x < 0) || (y < 0) || (x >= pixelWidth) || (y >= pixelHeight)) return;
975
- pixels[y*pixelWidth + x] = c;
959
+ if ((x < 0) || (y < 0) || (x >= pixelWidth) || (y >= pixelHeight)) {
960
+ return;
961
+ }
962
+ pixels[y * pixelWidth + x] = c;
976
963
  updatePixels(x, y, 1, 1); // slow...
977
964
  }
978
965
 
979
-
980
966
  /**
981
967
  * <h3>Advanced</h3>
982
- * Efficient method of drawing an image's pixels directly to this surface.
983
- * No variations are employed, meaning that any scale, tint, or imageMode
968
+ * Efficient method of drawing an image's pixels directly to this surface. No
969
+ * variations are employed, meaning that any scale, tint, or imageMode
984
970
  * settings will be ignored.
985
971
  *
986
- * @param x
972
+ * @param x
987
973
  * @param img image to copy into the original image
988
- * @param y
974
+ * @param y
989
975
  */
990
976
  public void set(int x, int y, PImage img) {
991
977
  int sx = 0;
@@ -1011,27 +997,29 @@ public class PImage implements PConstants, Cloneable {
1011
997
  }
1012
998
 
1013
999
  // this could be nonexistent
1014
- if ((sw <= 0) || (sh <= 0)) return;
1000
+ if ((sw <= 0) || (sh <= 0)) {
1001
+ return;
1002
+ }
1015
1003
 
1016
1004
  setImpl(img, sx, sy, sw, sh, x, y);
1017
1005
  }
1018
1006
 
1019
-
1020
1007
  /**
1021
- * Internal function to actually handle setting a block of pixels that
1022
- * has already been properly cropped from the image to a valid region.
1023
- * @param sourceImage
1024
- * @param sourceX
1025
- * @param targetY
1026
- * @param sourceHeight
1027
- * @param sourceY
1028
- * @param sourceWidth
1029
- * @param targetX
1008
+ * Internal function to actually handle setting a block of pixels that has
1009
+ * already been properly cropped from the image to a valid region.
1010
+ *
1011
+ * @param sourceImage
1012
+ * @param sourceX
1013
+ * @param targetY
1014
+ * @param sourceHeight
1015
+ * @param sourceY
1016
+ * @param sourceWidth
1017
+ * @param targetX
1030
1018
  */
1031
1019
  protected void setImpl(PImage sourceImage,
1032
- int sourceX, int sourceY,
1033
- int sourceWidth, int sourceHeight,
1034
- int targetX, int targetY) {
1020
+ int sourceX, int sourceY,
1021
+ int sourceWidth, int sourceHeight,
1022
+ int targetX, int targetY) {
1035
1023
  int sourceOffset = sourceY * sourceImage.pixelWidth + sourceX;
1036
1024
  int targetOffset = targetY * pixelWidth + targetX;
1037
1025
 
@@ -1045,13 +1033,8 @@ public class PImage implements PConstants, Cloneable {
1045
1033
  updatePixels(targetX, targetY, sourceWidth, sourceHeight);
1046
1034
  }
1047
1035
 
1048
-
1049
-
1050
1036
  //////////////////////////////////////////////////////////////
1051
-
1052
1037
  // ALPHA CHANNEL
1053
-
1054
-
1055
1038
  /**
1056
1039
  * @param maskArray array of integers used as the alpha channel, needs to be
1057
1040
  * the same length as the image's pixel array.
@@ -1069,35 +1052,32 @@ public class PImage implements PConstants, Cloneable {
1069
1052
  updatePixels();
1070
1053
  }
1071
1054
 
1072
-
1073
1055
  /**
1074
1056
  * ( begin auto-generated from PImage_mask.xml )
1075
1057
  *
1076
- * Masks part of an image from displaying by loading another image and
1077
- * using it as an alpha channel. This mask image should only contain
1078
- * grayscale data, but only the blue color channel is used. The mask image
1079
- * needs to be the same size as the image to which it is applied.<br />
1058
+ * Masks part of an image from displaying by loading another image and using
1059
+ * it as an alpha channel. This mask image should only contain grayscale data,
1060
+ * but only the blue color channel is used. The mask image needs to be the
1061
+ * same size as the image to which it is applied.<br />
1080
1062
  * <br />
1081
1063
  * In addition to using a mask image, an integer array containing the alpha
1082
- * channel data can be specified directly. This method is useful for
1083
- * creating dynamically generated alpha masks. This array must be of the
1084
- * same length as the target image's pixels array and should contain only
1085
- * grayscale data of values between 0-255.
1064
+ * channel data can be specified directly. This method is useful for creating
1065
+ * dynamically generated alpha masks. This array must be of the same length as
1066
+ * the target image's pixels array and should contain only grayscale data of
1067
+ * values between 0-255.
1086
1068
  *
1087
1069
  * ( end auto-generated )
1088
1070
  *
1089
1071
  * <h3>Advanced</h3>
1090
1072
  *
1091
- * Set alpha channel for an image. Black colors in the source
1092
- * image will make the destination image completely transparent,
1093
- * and white will make things fully opaque. Gray values will
1094
- * be in-between steps.
1073
+ * Set alpha channel for an image. Black colors in the source image will make
1074
+ * the destination image completely transparent, and white will make things
1075
+ * fully opaque. Gray values will be in-between steps.
1095
1076
  * <P>
1096
- * Strictly speaking the "blue" value from the source image is
1097
- * used as the alpha color. For a fully grayscale image, this
1098
- * is correct, but for a color image it's not 100% accurate.
1099
- * For a more accurate conversion, first use filter(GRAY)
1100
- * which will make the image into a "correct" grayscale by
1077
+ * Strictly speaking the "blue" value from the source image is used as the
1078
+ * alpha color. For a fully grayscale image, this is correct, but for a color
1079
+ * image it's not 100% accurate. For a more accurate conversion, first use
1080
+ * filter(GRAY) which will make the image into a "correct" grayscale by
1101
1081
  * performing a proper luminance-based conversion.
1102
1082
  *
1103
1083
  * @webref pimage:method
@@ -1110,18 +1090,12 @@ public class PImage implements PConstants, Cloneable {
1110
1090
  mask(img.pixels);
1111
1091
  }
1112
1092
 
1113
-
1114
-
1115
1093
  //////////////////////////////////////////////////////////////
1116
-
1117
1094
  // IMAGE FILTERS
1118
-
1119
- /**
1120
- *
1121
- * @param kind
1122
- */
1123
-
1124
-
1095
+ /**
1096
+ *
1097
+ * @param kind
1098
+ */
1125
1099
  public void filter(int kind) {
1126
1100
  loadPixels();
1127
1101
 
@@ -1152,8 +1126,8 @@ public class PImage implements PConstants, Cloneable {
1152
1126
  // 0.30 * 256 = 77
1153
1127
  // 0.59 * 256 = 151
1154
1128
  // 0.11 * 256 = 28
1155
- int lum = (77*(col>>16&0xff) + 151*(col>>8&0xff) + 28*(col&0xff))>>8;
1156
- pixels[i] = (col & ALPHA_MASK) | lum<<16 | lum<<8 | lum;
1129
+ int lum = (77 * (col >> 16 & 0xff) + 151 * (col >> 8 & 0xff) + 28 * (col & 0xff)) >> 8;
1130
+ pixels[i] = (col & ALPHA_MASK) | lum << 16 | lum << 8 | lum;
1157
1131
  }
1158
1132
  }
1159
1133
  break;
@@ -1166,8 +1140,8 @@ public class PImage implements PConstants, Cloneable {
1166
1140
  break;
1167
1141
 
1168
1142
  case POSTERIZE:
1169
- throw new RuntimeException("Use filter(POSTERIZE, int levels) " +
1170
- "instead of filter(POSTERIZE)");
1143
+ throw new RuntimeException("Use filter(POSTERIZE, int levels) "
1144
+ + "instead of filter(POSTERIZE)");
1171
1145
 
1172
1146
  case OPAQUE:
1173
1147
  for (int i = 0; i < pixels.length; i++) {
@@ -1180,7 +1154,7 @@ public class PImage implements PConstants, Cloneable {
1180
1154
  filter(THRESHOLD, 0.5f);
1181
1155
  break;
1182
1156
 
1183
- // [toxi 050728] added new filters
1157
+ // [toxi 050728] added new filters
1184
1158
  case ERODE:
1185
1159
  erode(); // former dilate(true);
1186
1160
  break;
@@ -1192,15 +1166,14 @@ public class PImage implements PConstants, Cloneable {
1192
1166
  updatePixels(); // mark as modified
1193
1167
  }
1194
1168
 
1195
-
1196
1169
  /**
1197
1170
  * ( begin auto-generated from PImage_filter.xml )
1198
1171
  *
1199
1172
  * Filters an image as defined by one of the following modes:<br /><br
1200
1173
  * />THRESHOLD - converts the image to black and white pixels depending if
1201
- * they are above or below the threshold defined by the level parameter.
1202
- * The level must be between 0.0 (black) and 1.0(white). If no level is
1203
- * specified, 0.5 is used.<br />
1174
+ * they are above or below the threshold defined by the level parameter. The
1175
+ * level must be between 0.0 (black) and 1.0(white). If no level is specified,
1176
+ * 0.5 is used.<br />
1204
1177
  * <br />
1205
1178
  * GRAY - converts any colors in the image to grayscale equivalents<br />
1206
1179
  * <br />
@@ -1218,7 +1191,8 @@ public class PImage implements PConstants, Cloneable {
1218
1191
  * ERODE - reduces the light areas with the amount defined by the level
1219
1192
  * parameter<br />
1220
1193
  * <br />
1221
- * DILATE - increases the light areas with the amount defined by the level parameter
1194
+ * DILATE - increases the light areas with the amount defined by the level
1195
+ * parameter
1222
1196
  *
1223
1197
  * ( end auto-generated )
1224
1198
  *
@@ -1236,14 +1210,15 @@ public class PImage implements PConstants, Cloneable {
1236
1210
  * </UL>
1237
1211
  * Luminance conversion code contributed by
1238
1212
  * <A HREF="http://www.toxi.co.uk">toxi</A>
1239
- * <P/>
1213
+ *
1240
1214
  * Gaussian blur code contributed by
1241
1215
  * <A HREF="http://incubator.quasimondo.com">Mario Klingemann</A>
1242
1216
  *
1243
1217
  * @webref image:pixels
1244
1218
  * @brief Converts the image to grayscale or black and white
1245
1219
  * @usage web_application
1246
- * @param kind Either THRESHOLD, GRAY, OPAQUE, INVERT, POSTERIZE, BLUR, ERODE, or DILATE
1220
+ * @param kind Either THRESHOLD, GRAY, OPAQUE, INVERT, POSTERIZE, BLUR, ERODE,
1221
+ * or DILATE
1247
1222
  * @param param unique for each, see above
1248
1223
  */
1249
1224
  public void filter(int kind, float param) {
@@ -1251,31 +1226,32 @@ public class PImage implements PConstants, Cloneable {
1251
1226
 
1252
1227
  switch (kind) {
1253
1228
  case BLUR:
1254
- if (format == ALPHA)
1229
+ if (format == ALPHA) {
1255
1230
  blurAlpha(param);
1256
- else if (format == ARGB)
1231
+ } else if (format == ARGB) {
1257
1232
  blurARGB(param);
1258
- else
1233
+ } else {
1259
1234
  blurRGB(param);
1235
+ }
1260
1236
  break;
1261
1237
 
1262
1238
  case GRAY:
1263
- throw new RuntimeException("Use filter(GRAY) instead of " +
1264
- "filter(GRAY, param)");
1239
+ throw new RuntimeException("Use filter(GRAY) instead of "
1240
+ + "filter(GRAY, param)");
1265
1241
 
1266
1242
  case INVERT:
1267
- throw new RuntimeException("Use filter(INVERT) instead of " +
1268
- "filter(INVERT, param)");
1243
+ throw new RuntimeException("Use filter(INVERT) instead of "
1244
+ + "filter(INVERT, param)");
1269
1245
 
1270
1246
  case OPAQUE:
1271
- throw new RuntimeException("Use filter(OPAQUE) instead of " +
1272
- "filter(OPAQUE, param)");
1247
+ throw new RuntimeException("Use filter(OPAQUE) instead of "
1248
+ + "filter(OPAQUE, param)");
1273
1249
 
1274
1250
  case POSTERIZE:
1275
- int levels = (int)param;
1251
+ int levels = (int) param;
1276
1252
  if ((levels < 2) || (levels > 255)) {
1277
- throw new RuntimeException("Levels must be between 2 and 255 for " +
1278
- "filter(POSTERIZE, levels)");
1253
+ throw new RuntimeException("Levels must be between 2 and 255 for "
1254
+ + "filter(POSTERIZE, levels)");
1279
1255
  }
1280
1256
  int levels1 = levels - 1;
1281
1257
  for (int i = 0; i < pixels.length; i++) {
@@ -1285,10 +1261,10 @@ public class PImage implements PConstants, Cloneable {
1285
1261
  rlevel = (((rlevel * levels) >> 8) * 255) / levels1;
1286
1262
  glevel = (((glevel * levels) >> 8) * 255) / levels1;
1287
1263
  blevel = (((blevel * levels) >> 8) * 255) / levels1;
1288
- pixels[i] = ((0xff000000 & pixels[i]) |
1289
- (rlevel << 16) |
1290
- (glevel << 8) |
1291
- blevel);
1264
+ pixels[i] = ((0xff000000 & pixels[i])
1265
+ | (rlevel << 16)
1266
+ | (glevel << 8)
1267
+ | blevel);
1292
1268
  }
1293
1269
  break;
1294
1270
 
@@ -1296,72 +1272,73 @@ public class PImage implements PConstants, Cloneable {
1296
1272
  int thresh = (int) (param * 255);
1297
1273
  for (int i = 0; i < pixels.length; i++) {
1298
1274
  int max = Math.max((pixels[i] & RED_MASK) >> 16,
1299
- Math.max((pixels[i] & GREEN_MASK) >> 8,
1300
- (pixels[i] & BLUE_MASK)));
1301
- pixels[i] = (pixels[i] & ALPHA_MASK) |
1302
- ((max < thresh) ? 0x000000 : 0xffffff);
1275
+ Math.max((pixels[i] & GREEN_MASK) >> 8,
1276
+ (pixels[i] & BLUE_MASK)));
1277
+ pixels[i] = (pixels[i] & ALPHA_MASK)
1278
+ | ((max < thresh) ? 0x000000 : 0xffffff);
1303
1279
  }
1304
1280
  break;
1305
1281
 
1306
- // [toxi20050728] added new filters
1307
- case ERODE:
1308
- throw new RuntimeException("Use filter(ERODE) instead of " +
1309
- "filter(ERODE, param)");
1310
- case DILATE:
1311
- throw new RuntimeException("Use filter(DILATE) instead of " +
1312
- "filter(DILATE, param)");
1282
+ // [toxi20050728] added new filters
1283
+ case ERODE:
1284
+ throw new RuntimeException("Use filter(ERODE) instead of "
1285
+ + "filter(ERODE, param)");
1286
+ case DILATE:
1287
+ throw new RuntimeException("Use filter(DILATE) instead of "
1288
+ + "filter(DILATE, param)");
1313
1289
  }
1314
1290
  updatePixels(); // mark as modified
1315
1291
  }
1316
1292
 
1317
-
1318
- /** Set the high bits of all pixels to opaque. */
1293
+ /**
1294
+ * Set the high bits of all pixels to opaque.
1295
+ */
1319
1296
  protected void opaque() {
1320
1297
  for (int i = 0; i < pixels.length; i++) {
1321
1298
  pixels[i] = 0xFF000000 | pixels[i];
1322
1299
  }
1323
1300
  }
1324
1301
 
1325
-
1326
1302
  /**
1327
- * Optimized code for building the blur kernel.
1328
- * further optimized blur code (approx. 15% for radius=20)
1329
- * bigger speed gains for larger radii (~30%)
1330
- * added support for various image types (ALPHA, RGB, ARGB)
1331
- * [toxi 050728]
1332
- * @param r
1303
+ * Optimized code for building the blur kernel. further optimized blur code
1304
+ * (approx. 15% for radius=20) bigger speed gains for larger radii (~30%)
1305
+ * added support for various image types (ALPHA, RGB, ARGB) [toxi 050728]
1306
+ *
1307
+ * @param r
1333
1308
  */
1334
1309
  protected void buildBlurKernel(float r) {
1335
1310
  int radius = (int) (r * 3.5f);
1336
1311
  radius = (radius < 1) ? 1 : ((radius < 248) ? radius : 248);
1337
1312
  if (blurRadius != radius) {
1338
1313
  blurRadius = radius;
1339
- blurKernelSize = 1 + blurRadius<<1;
1314
+ blurKernelSize = 1 + blurRadius << 1;
1340
1315
  blurKernel = new int[blurKernelSize];
1341
1316
  blurMult = new int[blurKernelSize][256];
1342
1317
 
1343
- int bk,bki;
1344
- int[] bm,bmi;
1318
+ int bk, bki;
1319
+ int[] bm, bmi;
1345
1320
 
1346
1321
  for (int i = 1, radiusi = radius - 1; i < radius; i++) {
1347
- blurKernel[radius+i] = blurKernel[radiusi] = bki = radiusi * radiusi;
1348
- bm=blurMult[radius+i];
1349
- bmi=blurMult[radiusi--];
1350
- for (int j = 0; j < 256; j++)
1351
- bm[j] = bmi[j] = bki*j;
1322
+ blurKernel[radius + i] = blurKernel[radiusi] = bki = radiusi * radiusi;
1323
+ bm = blurMult[radius + i];
1324
+ bmi = blurMult[radiusi--];
1325
+ for (int j = 0; j < 256; j++) {
1326
+ bm[j] = bmi[j] = bki * j;
1327
+ }
1352
1328
  }
1353
1329
  bk = blurKernel[radius] = radius * radius;
1354
1330
  bm = blurMult[radius];
1355
- for (int j = 0; j < 256; j++)
1356
- bm[j] = bk*j;
1331
+ for (int j = 0; j < 256; j++) {
1332
+ bm[j] = bk * j;
1333
+ }
1357
1334
  }
1358
1335
  }
1359
1336
 
1360
- /**
1361
- *
1362
- * @param r
1363
- */
1364
- protected void blurAlpha(float r) {
1337
+ /**
1338
+ *
1339
+ * @param r
1340
+ */
1341
+ protected void blurAlpha(float r) {
1365
1342
  int sum, cb;
1366
1343
  int read, ri, ym, ymi, bk0;
1367
1344
  int b2[] = new int[pixels.length];
@@ -1374,17 +1351,19 @@ public class PImage implements PConstants, Cloneable {
1374
1351
  //cb = cg = cr = sum = 0;
1375
1352
  cb = sum = 0;
1376
1353
  read = x - blurRadius;
1377
- if (read<0) {
1378
- bk0=-read;
1379
- read=0;
1354
+ if (read < 0) {
1355
+ bk0 = -read;
1356
+ read = 0;
1380
1357
  } else {
1381
- if (read >= pixelWidth)
1358
+ if (read >= pixelWidth) {
1382
1359
  break;
1383
- bk0=0;
1360
+ }
1361
+ bk0 = 0;
1384
1362
  }
1385
1363
  for (int i = bk0; i < blurKernelSize; i++) {
1386
- if (read >= pixelWidth)
1364
+ if (read >= pixelWidth) {
1387
1365
  break;
1366
+ }
1388
1367
  int c = pixels[read + yi];
1389
1368
  int[] bm = blurMult[i];
1390
1369
  cb += bm[c & BLUE_MASK];
@@ -1408,22 +1387,24 @@ public class PImage implements PConstants, Cloneable {
1408
1387
  bk0 = ri = -ym;
1409
1388
  read = x;
1410
1389
  } else {
1411
- if (ym >= pixelHeight)
1390
+ if (ym >= pixelHeight) {
1412
1391
  break;
1392
+ }
1413
1393
  bk0 = 0;
1414
1394
  ri = ym;
1415
1395
  read = x + ymi;
1416
1396
  }
1417
1397
  for (int i = bk0; i < blurKernelSize; i++) {
1418
- if (ri >= pixelHeight)
1398
+ if (ri >= pixelHeight) {
1419
1399
  break;
1400
+ }
1420
1401
  int[] bm = blurMult[i];
1421
1402
  cb += bm[b2[read]];
1422
1403
  sum += blurKernel[i];
1423
1404
  ri++;
1424
1405
  read += pixelWidth;
1425
1406
  }
1426
- pixels[x+yi] = (cb/sum);
1407
+ pixels[x + yi] = (cb / sum);
1427
1408
  }
1428
1409
  yi += pixelWidth;
1429
1410
  ymi += pixelWidth;
@@ -1431,11 +1412,11 @@ public class PImage implements PConstants, Cloneable {
1431
1412
  }
1432
1413
  }
1433
1414
 
1434
- /**
1435
- *
1436
- * @param r
1437
- */
1438
- protected void blurRGB(float r) {
1415
+ /**
1416
+ *
1417
+ * @param r
1418
+ */
1419
+ protected void blurRGB(float r) {
1439
1420
  int sum, cr, cg, cb; //, k;
1440
1421
  int /*pixel,*/ read, ri, /*roff,*/ ym, ymi, /*riw,*/ bk0;
1441
1422
  int r2[] = new int[pixels.length];
@@ -1508,7 +1489,7 @@ public class PImage implements PConstants, Cloneable {
1508
1489
  ri++;
1509
1490
  read += pixelWidth;
1510
1491
  }
1511
- pixels[x+yi] = 0xff000000 | (cr/sum)<<16 | (cg/sum)<<8 | (cb/sum);
1492
+ pixels[x + yi] = 0xff000000 | (cr / sum) << 16 | (cg / sum) << 8 | (cb / sum);
1512
1493
  }
1513
1494
  yi += pixelWidth;
1514
1495
  ymi += pixelWidth;
@@ -1516,11 +1497,11 @@ public class PImage implements PConstants, Cloneable {
1516
1497
  }
1517
1498
  }
1518
1499
 
1519
- /**
1520
- *
1521
- * @param r
1522
- */
1523
- protected void blurARGB(float r) {
1500
+ /**
1501
+ *
1502
+ * @param r
1503
+ */
1504
+ protected void blurARGB(float r) {
1524
1505
  int sum, cr, cg, cb, ca;
1525
1506
  int /*pixel,*/ read, ri, /*roff,*/ ym, ymi, /*riw,*/ bk0;
1526
1507
  int wh = pixels.length;
@@ -1543,14 +1524,14 @@ public class PImage implements PConstants, Cloneable {
1543
1524
  if (read >= pixelWidth) {
1544
1525
  break;
1545
1526
  }
1546
- bk0=0;
1527
+ bk0 = 0;
1547
1528
  }
1548
1529
  for (int i = bk0; i < blurKernelSize; i++) {
1549
1530
  if (read >= pixelWidth) {
1550
1531
  break;
1551
1532
  }
1552
1533
  int c = pixels[read + yi];
1553
- int[] bm=blurMult[i];
1534
+ int[] bm = blurMult[i];
1554
1535
  ca += bm[(c & ALPHA_MASK) >>> 24];
1555
1536
  cr += bm[(c & RED_MASK) >> 16];
1556
1537
  cg += bm[(c & GREEN_MASK) >> 8];
@@ -1589,7 +1570,7 @@ public class PImage implements PConstants, Cloneable {
1589
1570
  if (ri >= pixelHeight) {
1590
1571
  break;
1591
1572
  }
1592
- int[] bm=blurMult[i];
1573
+ int[] bm = blurMult[i];
1593
1574
  ca += bm[a2[read]];
1594
1575
  cr += bm[r2[read]];
1595
1576
  cg += bm[g2[read]];
@@ -1598,7 +1579,7 @@ public class PImage implements PConstants, Cloneable {
1598
1579
  ri++;
1599
1580
  read += pixelWidth;
1600
1581
  }
1601
- pixels[x+yi] = (ca/sum)<<24 | (cr/sum)<<16 | (cg/sum)<<8 | (cb/sum);
1582
+ pixels[x + yi] = (ca / sum) << 24 | (cr / sum) << 16 | (cg / sum) << 8 | (cb / sum);
1602
1583
  }
1603
1584
  yi += pixelWidth;
1604
1585
  ymi += pixelWidth;
@@ -1606,10 +1587,9 @@ public class PImage implements PConstants, Cloneable {
1606
1587
  }
1607
1588
  }
1608
1589
 
1609
-
1610
1590
  /**
1611
- * Generic dilate/erode filter using luminance values
1612
- * as decision factor. [toxi 050728]
1591
+ * Generic dilate/erode filter using luminance values as decision factor.
1592
+ * [toxi 050728]
1613
1593
  */
1614
1594
  protected void dilate() { // formerly dilate(false)
1615
1595
  int index = 0;
@@ -1646,16 +1626,16 @@ public class PImage implements PConstants, Cloneable {
1646
1626
  int colRight = pixels[idxRight];
1647
1627
 
1648
1628
  // compute luminance
1649
- int currLum =
1650
- 77*(orig>>16&0xff) + 151*(orig>>8&0xff) + 28*(orig&0xff);
1651
- int lumLeft =
1652
- 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
1653
- int lumRight =
1654
- 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
1655
- int lumUp =
1656
- 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
1657
- int lumDown =
1658
- 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
1629
+ int currLum
1630
+ = 77 * (orig >> 16 & 0xff) + 151 * (orig >> 8 & 0xff) + 28 * (orig & 0xff);
1631
+ int lumLeft
1632
+ = 77 * (colLeft >> 16 & 0xff) + 151 * (colLeft >> 8 & 0xff) + 28 * (colLeft & 0xff);
1633
+ int lumRight
1634
+ = 77 * (colRight >> 16 & 0xff) + 151 * (colRight >> 8 & 0xff) + 28 * (colRight & 0xff);
1635
+ int lumUp
1636
+ = 77 * (colUp >> 16 & 0xff) + 151 * (colUp >> 8 & 0xff) + 28 * (colUp & 0xff);
1637
+ int lumDown
1638
+ = 77 * (colDown >> 16 & 0xff) + 151 * (colDown >> 8 & 0xff) + 28 * (colDown & 0xff);
1659
1639
 
1660
1640
  if (lumLeft > currLum) {
1661
1641
  result = colLeft;
@@ -1679,10 +1659,10 @@ public class PImage implements PConstants, Cloneable {
1679
1659
  System.arraycopy(outgoing, 0, pixels, 0, maxIndex);
1680
1660
  }
1681
1661
 
1682
- /**
1683
- *
1684
- */
1685
- protected void erode() { // formerly dilate(true)
1662
+ /**
1663
+ *
1664
+ */
1665
+ protected void erode() { // formerly dilate(true)
1686
1666
  int index = 0;
1687
1667
  int maxIndex = pixels.length;
1688
1668
  int[] outgoing = new int[maxIndex];
@@ -1717,16 +1697,16 @@ public class PImage implements PConstants, Cloneable {
1717
1697
  int colRight = pixels[idxRight];
1718
1698
 
1719
1699
  // compute luminance
1720
- int currLum =
1721
- 77*(orig>>16&0xff) + 151*(orig>>8&0xff) + 28*(orig&0xff);
1722
- int lumLeft =
1723
- 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
1724
- int lumRight =
1725
- 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
1726
- int lumUp =
1727
- 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
1728
- int lumDown =
1729
- 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
1700
+ int currLum
1701
+ = 77 * (orig >> 16 & 0xff) + 151 * (orig >> 8 & 0xff) + 28 * (orig & 0xff);
1702
+ int lumLeft
1703
+ = 77 * (colLeft >> 16 & 0xff) + 151 * (colLeft >> 8 & 0xff) + 28 * (colLeft & 0xff);
1704
+ int lumRight
1705
+ = 77 * (colRight >> 16 & 0xff) + 151 * (colRight >> 8 & 0xff) + 28 * (colRight & 0xff);
1706
+ int lumUp
1707
+ = 77 * (colUp >> 16 & 0xff) + 151 * (colUp >> 8 & 0xff) + 28 * (colUp & 0xff);
1708
+ int lumDown
1709
+ = 77 * (colDown >> 16 & 0xff) + 151 * (colDown >> 8 & 0xff) + 28 * (colDown & 0xff);
1730
1710
 
1731
1711
  if (lumLeft < currLum) {
1732
1712
  result = colLeft;
@@ -1750,22 +1730,17 @@ public class PImage implements PConstants, Cloneable {
1750
1730
  System.arraycopy(outgoing, 0, pixels, 0, maxIndex);
1751
1731
  }
1752
1732
 
1753
-
1754
-
1755
1733
  //////////////////////////////////////////////////////////////
1756
-
1757
1734
  // COPY
1758
-
1759
-
1760
1735
  /**
1761
1736
  * ( begin auto-generated from PImage_copy.xml )
1762
1737
  *
1763
1738
  * Copies a region of pixels from one image into another. If the source and
1764
1739
  * destination regions aren't the same size, it will automatically resize
1765
- * source pixels to fit the specified target region. No alpha information
1766
- * is used in the process, however if the source image has an alpha channel
1767
- * set, it will be copied as well.
1768
- * <br /><br />
1740
+ * source pixels to fit the specified target region. No alpha information is
1741
+ * used in the process, however if the source image has an alpha channel set,
1742
+ * it will be copied as well.
1743
+ *
1769
1744
  * As of release 0149, this function ignores <b>imageMode()</b>.
1770
1745
  *
1771
1746
  * ( end auto-generated )
@@ -1785,35 +1760,29 @@ public class PImage implements PConstants, Cloneable {
1785
1760
  * @see PImage#blend(PImage, int, int, int, int, int, int, int, int, int)
1786
1761
  */
1787
1762
  public void copy(int sx, int sy, int sw, int sh,
1788
- int dx, int dy, int dw, int dh) {
1763
+ int dx, int dy, int dw, int dh) {
1789
1764
  blend(this, sx, sy, sw, sh, dx, dy, dw, dh, REPLACE);
1790
1765
  }
1791
1766
 
1792
-
1793
- /**
1794
- * @param src an image variable referring to the source image.
1795
- * @param sx
1796
- * @param sy
1797
- * @param dh
1798
- * @param sw
1799
- * @param dx
1800
- * @param sh
1801
- * @param dy
1802
- * @param dw
1803
- */
1767
+ /**
1768
+ * @param src an image variable referring to the source image.
1769
+ * @param sx
1770
+ * @param sy
1771
+ * @param dh
1772
+ * @param sw
1773
+ * @param dx
1774
+ * @param sh
1775
+ * @param dy
1776
+ * @param dw
1777
+ */
1804
1778
  public void copy(PImage src,
1805
- int sx, int sy, int sw, int sh,
1806
- int dx, int dy, int dw, int dh) {
1779
+ int sx, int sy, int sw, int sh,
1780
+ int dx, int dy, int dw, int dh) {
1807
1781
  blend(src, sx, sy, sw, sh, dx, dy, dw, dh, REPLACE);
1808
1782
  }
1809
1783
 
1810
-
1811
-
1812
1784
  //////////////////////////////////////////////////////////////
1813
-
1814
1785
  // BLEND
1815
-
1816
-
1817
1786
  /**
1818
1787
  * ( begin auto-generated from blendColor.xml )
1819
1788
  *
@@ -1825,28 +1794,24 @@ public class PImage implements PConstants, Cloneable {
1825
1794
  * <h3>Advanced</h3>
1826
1795
  * <UL>
1827
1796
  * <LI>REPLACE - destination colour equals colour of source pixel: C = A.
1828
- * Sometimes called "Normal" or "Copy" in other software.
1797
+ * Sometimes called "Normal" or "Copy" in other software.
1829
1798
  *
1830
1799
  * <LI>BLEND - linear interpolation of colours:
1831
- * <TT>C = A*factor + B</TT>
1800
+ * <TT>C = A*factor + B</TT>
1832
1801
  *
1833
1802
  * <LI>ADD - additive blending with white clip:
1834
- * <TT>C = min(A*factor + B, 255)</TT>.
1835
- * Clipped to 0..255, Photoshop calls this "Linear Burn",
1836
- * and Director calls it "Add Pin".
1803
+ * <TT>C = min(A*factor + B, 255)</TT>. Clipped to 0..255, Photoshop calls
1804
+ * this "Linear Burn", and Director calls it "Add Pin".
1837
1805
  *
1838
1806
  * <LI>SUBTRACT - substractive blend with black clip:
1839
- * <TT>C = max(B - A*factor, 0)</TT>.
1840
- * Clipped to 0..255, Photoshop calls this "Linear Dodge",
1841
- * and Director calls it "Subtract Pin".
1807
+ * <TT>C = max(B - A*factor, 0)</TT>. Clipped to 0..255, Photoshop calls this
1808
+ * "Linear Dodge", and Director calls it "Subtract Pin".
1842
1809
  *
1843
1810
  * <LI>DARKEST - only the darkest colour succeeds:
1844
- * <TT>C = min(A*factor, B)</TT>.
1845
- * Illustrator calls this "Darken".
1811
+ * <TT>C = min(A*factor, B)</TT>. Illustrator calls this "Darken".
1846
1812
  *
1847
1813
  * <LI>LIGHTEST - only the lightest colour succeeds:
1848
- * <TT>C = max(A*factor, B)</TT>.
1849
- * Illustrator calls this "Lighten".
1814
+ * <TT>C = max(A*factor, B)</TT>. Illustrator calls this "Lighten".
1850
1815
  *
1851
1816
  * <LI>DIFFERENCE - subtract colors from underlying image.
1852
1817
  *
@@ -1856,96 +1821,115 @@ public class PImage implements PConstants, Cloneable {
1856
1821
  *
1857
1822
  * <LI>SCREEN - Opposite multiply, uses inverse values of the colors.
1858
1823
  *
1859
- * <LI>OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values,
1860
- * and screens light values.
1824
+ * <LI>OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and
1825
+ * screens light values.
1861
1826
  *
1862
1827
  * <LI>HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.
1863
1828
  *
1864
- * <LI>SOFT_LIGHT - Mix of DARKEST and LIGHTEST.
1865
- * Works like OVERLAY, but not as harsh.
1829
+ * <LI>SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not
1830
+ * as harsh.
1866
1831
  *
1867
1832
  * <LI>DODGE - Lightens light tones and increases contrast, ignores darks.
1868
- * Called "Color Dodge" in Illustrator and Photoshop.
1833
+ * Called "Color Dodge" in Illustrator and Photoshop.
1869
1834
  *
1870
1835
  * <LI>BURN - Darker areas are applied, increasing contrast, ignores lights.
1871
- * Called "Color Burn" in Illustrator and Photoshop.
1836
+ * Called "Color Burn" in Illustrator and Photoshop.
1872
1837
  * </UL>
1873
- * <P>A useful reference for blending modes and their algorithms can be
1874
- * found in the <A HREF="http://www.w3.org/TR/SVG12/rendering.html">SVG</A>
1838
+ * <P>
1839
+ * A useful reference for blending modes and their algorithms can be found in
1840
+ * the <A HREF="http://www.w3.org/TR/SVG12/rendering.html">SVG</A>
1875
1841
  * specification.</P>
1876
- * <P>It is important to note that Processing uses "fast" code, not
1877
- * necessarily "correct" code. No biggie, most software does. A nitpicker
1878
- * can find numerous "off by 1 division" problems in the blend code where
1842
+ * <P>
1843
+ * It is important to note that Processing uses "fast" code, not necessarily
1844
+ * "correct" code. No biggie, most software does. A nitpicker can find
1845
+ * numerous "off by 1 division" problems in the blend code where
1879
1846
  * <TT>&gt;&gt;8</TT> or <TT>&gt;&gt;7</TT> is used when strictly speaking
1880
1847
  * <TT>/255.0</T> or <TT>/127.0</TT> should have been used.</P>
1881
- * <P>For instance, exclusion (not intended for real-time use) reads
1848
+ * <P>
1849
+ * For instance, exclusion (not intended for real-time use) reads
1882
1850
  * <TT>r1 + r2 - ((2 * r1 * r2) / 255)</TT> because <TT>255 == 1.0</TT>
1883
- * not <TT>256 == 1.0</TT>. In other words, <TT>(255*255)>>8</TT> is not
1884
- * the same as <TT>(255*255)/255</TT>. But for real-time use the shifts
1885
- * are preferrable, and the difference is insignificant for applications
1886
- * built with Processing.</P>
1851
+ * not <TT>256 == 1.0</TT>. In other words, <TT>(255*255)>>8</TT> is not the
1852
+ * same as <TT>(255*255)/255</TT>. But for real-time use the shifts are
1853
+ * preferrable, and the difference is insignificant for applications built
1854
+ * with Processing.</P>
1887
1855
  *
1888
- * @return
1856
+ * @return
1889
1857
  * @webref color:creating_reading
1890
1858
  * @usage web_application
1891
1859
  * @param c1 the first color to blend
1892
1860
  * @param c2 the second color to blend
1893
- * @param mode either BLEND, ADD, SUBTRACT, DARKEST, LIGHTEST, DIFFERENCE, EXCLUSION, MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, or BURN
1861
+ * @param mode either BLEND, ADD, SUBTRACT, DARKEST, LIGHTEST, DIFFERENCE,
1862
+ * EXCLUSION, MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, or
1863
+ * BURN
1894
1864
  * @see PImage#blend(PImage, int, int, int, int, int, int, int, int, int)
1895
1865
  * @see PApplet#color(float, float, float, float)
1896
1866
  */
1897
1867
  static public int blendColor(int c1, int c2, int mode) { // ignore
1898
1868
  switch (mode) {
1899
- case REPLACE: return c2;
1900
- case BLEND: return blend_blend(c1, c2);
1869
+ case REPLACE:
1870
+ return c2;
1871
+ case BLEND:
1872
+ return blend_blend(c1, c2);
1901
1873
 
1902
- case ADD: return blend_add_pin(c1, c2);
1903
- case SUBTRACT: return blend_sub_pin(c1, c2);
1874
+ case ADD:
1875
+ return blend_add_pin(c1, c2);
1876
+ case SUBTRACT:
1877
+ return blend_sub_pin(c1, c2);
1904
1878
 
1905
- case LIGHTEST: return blend_lightest(c1, c2);
1906
- case DARKEST: return blend_darkest(c1, c2);
1879
+ case LIGHTEST:
1880
+ return blend_lightest(c1, c2);
1881
+ case DARKEST:
1882
+ return blend_darkest(c1, c2);
1907
1883
 
1908
- case DIFFERENCE: return blend_difference(c1, c2);
1909
- case EXCLUSION: return blend_exclusion(c1, c2);
1884
+ case DIFFERENCE:
1885
+ return blend_difference(c1, c2);
1886
+ case EXCLUSION:
1887
+ return blend_exclusion(c1, c2);
1910
1888
 
1911
- case MULTIPLY: return blend_multiply(c1, c2);
1912
- case SCREEN: return blend_screen(c1, c2);
1889
+ case MULTIPLY:
1890
+ return blend_multiply(c1, c2);
1891
+ case SCREEN:
1892
+ return blend_screen(c1, c2);
1913
1893
 
1914
- case HARD_LIGHT: return blend_hard_light(c1, c2);
1915
- case SOFT_LIGHT: return blend_soft_light(c1, c2);
1916
- case OVERLAY: return blend_overlay(c1, c2);
1894
+ case HARD_LIGHT:
1895
+ return blend_hard_light(c1, c2);
1896
+ case SOFT_LIGHT:
1897
+ return blend_soft_light(c1, c2);
1898
+ case OVERLAY:
1899
+ return blend_overlay(c1, c2);
1917
1900
 
1918
- case DODGE: return blend_dodge(c1, c2);
1919
- case BURN: return blend_burn(c1, c2);
1901
+ case DODGE:
1902
+ return blend_dodge(c1, c2);
1903
+ case BURN:
1904
+ return blend_burn(c1, c2);
1920
1905
  }
1921
1906
  return 0;
1922
1907
  }
1923
1908
 
1924
- /**
1925
- *
1926
- * @param sx
1927
- * @param sy
1928
- * @param sw
1929
- * @param sh
1930
- * @param dx
1931
- * @param dy
1932
- * @param dw
1933
- * @param dh
1934
- * @param mode
1935
- */
1936
- public void blend(int sx, int sy, int sw, int sh,
1937
- int dx, int dy, int dw, int dh, int mode) {
1909
+ /**
1910
+ *
1911
+ * @param sx
1912
+ * @param sy
1913
+ * @param sw
1914
+ * @param sh
1915
+ * @param dx
1916
+ * @param dy
1917
+ * @param dw
1918
+ * @param dh
1919
+ * @param mode
1920
+ */
1921
+ public void blend(int sx, int sy, int sw, int sh,
1922
+ int dx, int dy, int dw, int dh, int mode) {
1938
1923
  blend(this, sx, sy, sw, sh, dx, dy, dw, dh, mode);
1939
1924
  }
1940
1925
 
1941
-
1942
1926
  /**
1943
1927
  * ( begin auto-generated from PImage_blend.xml )
1944
1928
  *
1945
1929
  * Blends a region of pixels into the image specified by the <b>img</b>
1946
- * parameter. These copies utilize full alpha channel support and a choice
1947
- * of the following modes to blend the colors of source pixels (A) with the
1948
- * ones of pixels in the destination image (B):<br />
1930
+ * parameter. These copies utilize full alpha channel support and a choice of
1931
+ * the following modes to blend the colors of source pixels (A) with the ones
1932
+ * of pixels in the destination image (B):<br />
1949
1933
  * <br />
1950
1934
  * BLEND - linear interpolation of colours: C = A*factor + B<br />
1951
1935
  * <br />
@@ -1966,32 +1950,32 @@ public class PImage implements PConstants, Cloneable {
1966
1950
  * <br />
1967
1951
  * SCREEN - Opposite multiply, uses inverse values of the colors.<br />
1968
1952
  * <br />
1969
- * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values,
1970
- * and screens light values.<br />
1953
+ * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and screens
1954
+ * light values.<br />
1971
1955
  * <br />
1972
1956
  * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.<br />
1973
1957
  * <br />
1974
- * SOFT_LIGHT - Mix of DARKEST and LIGHTEST.
1975
- * Works like OVERLAY, but not as harsh.<br />
1958
+ * SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not as
1959
+ * harsh.<br />
1976
1960
  * <br />
1977
- * DODGE - Lightens light tones and increases contrast, ignores darks.
1978
- * Called "Color Dodge" in Illustrator and Photoshop.<br />
1961
+ * DODGE - Lightens light tones and increases contrast, ignores darks. Called
1962
+ * "Color Dodge" in Illustrator and Photoshop.<br />
1979
1963
  * <br />
1980
1964
  * BURN - Darker areas are applied, increasing contrast, ignores lights.
1981
1965
  * Called "Color Burn" in Illustrator and Photoshop.<br />
1982
1966
  * <br />
1983
- * All modes use the alpha information (highest byte) of source image
1984
- * pixels as the blending factor. If the source and destination regions are
1985
- * different sizes, the image will be automatically resized to match the
1986
- * destination size. If the <b>srcImg</b> parameter is not used, the
1987
- * display window is used as the source image.<br />
1967
+ * All modes use the alpha information (highest byte) of source image pixels
1968
+ * as the blending factor. If the source and destination regions are different
1969
+ * sizes, the image will be automatically resized to match the destination
1970
+ * size. If the <b>srcImg</b> parameter is not used, the display window is
1971
+ * used as the source image.<br />
1988
1972
  * <br />
1989
1973
  * As of release 0149, this function ignores <b>imageMode()</b>.
1990
1974
  *
1991
1975
  * ( end auto-generated )
1992
1976
  *
1993
1977
  * @webref image:pixels
1994
- * @brief Copies a pixel or rectangle of pixels using different blending modes
1978
+ * @brief Copies a pixel or rectangle of pixels using different blending modes
1995
1979
  * @param src an image variable referring to the source image
1996
1980
  * @param sx X coordinate of the source's upper left corner
1997
1981
  * @param sy Y coordinate of the source's upper left corner
@@ -2001,15 +1985,16 @@ public class PImage implements PConstants, Cloneable {
2001
1985
  * @param dy Y coordinate of the destinations's upper left corner
2002
1986
  * @param dw destination image width
2003
1987
  * @param dh destination image height
2004
- * @param mode Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION, MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
1988
+ * @param mode Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE,
1989
+ * EXCLUSION, MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
2005
1990
  *
2006
1991
  * @see PApplet#alpha(int)
2007
1992
  * @see PImage#copy(PImage, int, int, int, int, int, int, int, int)
2008
1993
  * @see PImage#blendColor(int,int,int)
2009
1994
  */
2010
1995
  public void blend(PImage src,
2011
- int sx, int sy, int sw, int sh,
2012
- int dx, int dy, int dw, int dh, int mode) {
1996
+ int sx, int sy, int sw, int sh,
1997
+ int dx, int dy, int dw, int dh, int mode) {
2013
1998
  int sx2 = sx + sw;
2014
1999
  int sy2 = sy + sh;
2015
2000
  int dx2 = dx + dw;
@@ -2019,28 +2004,27 @@ public class PImage implements PConstants, Cloneable {
2019
2004
  if (src == this) {
2020
2005
  if (intersect(sx, sy, sx2, sy2, dx, dy, dx2, dy2)) {
2021
2006
  blit_resize(get(sx, sy, sw, sh),
2022
- 0, 0, sw, sh,
2023
- pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2007
+ 0, 0, sw, sh,
2008
+ pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2024
2009
  } else {
2025
2010
  // same as below, except skip the loadPixels() because it'd be redundant
2026
2011
  blit_resize(src, sx, sy, sx2, sy2,
2027
- pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2012
+ pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2028
2013
  }
2029
2014
  } else {
2030
2015
  src.loadPixels();
2031
2016
  blit_resize(src, sx, sy, sx2, sy2,
2032
- pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2017
+ pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
2033
2018
  //src.updatePixels();
2034
2019
  }
2035
2020
  updatePixels();
2036
2021
  }
2037
2022
 
2038
-
2039
2023
  /**
2040
2024
  * Check to see if two rectangles intersect one another
2041
2025
  */
2042
2026
  private boolean intersect(int sx1, int sy1, int sx2, int sy2,
2043
- int dx1, int dy1, int dx2, int dy2) {
2027
+ int dx1, int dy1, int dx2, int dy2) {
2044
2028
  int sw = sx2 - sx1 + 1;
2045
2029
  int sh = sy2 - sy1 + 1;
2046
2030
  int dw = dx2 - dx1 + 1;
@@ -2071,24 +2055,29 @@ public class PImage implements PConstants, Cloneable {
2071
2055
  return !(dw <= 0 || dh <= 0);
2072
2056
  }
2073
2057
 
2074
-
2075
2058
  //////////////////////////////////////////////////////////////
2076
-
2077
-
2078
2059
  /**
2079
- * Internal blitter/resizer/copier from toxi.
2080
- * Uses bilinear filtering if smooth() has been enabled
2081
- * 'mode' determines the blending mode used in the process.
2060
+ * Internal blitter/resizer/copier from toxi. Uses bilinear filtering if
2061
+ * smooth() has been enabled 'mode' determines the blending mode used in the
2062
+ * process.
2082
2063
  */
2083
2064
  private void blit_resize(PImage img,
2084
- int srcX1, int srcY1, int srcX2, int srcY2,
2085
- int[] destPixels, int screenW, int screenH,
2086
- int destX1, int destY1, int destX2, int destY2,
2087
- int mode) {
2088
- if (srcX1 < 0) srcX1 = 0;
2089
- if (srcY1 < 0) srcY1 = 0;
2090
- if (srcX2 > img.pixelWidth) srcX2 = img.pixelWidth;
2091
- if (srcY2 > img.pixelHeight) srcY2 = img.pixelHeight;
2065
+ int srcX1, int srcY1, int srcX2, int srcY2,
2066
+ int[] destPixels, int screenW, int screenH,
2067
+ int destX1, int destY1, int destX2, int destY2,
2068
+ int mode) {
2069
+ if (srcX1 < 0) {
2070
+ srcX1 = 0;
2071
+ }
2072
+ if (srcY1 < 0) {
2073
+ srcY1 = 0;
2074
+ }
2075
+ if (srcX2 > img.pixelWidth) {
2076
+ srcX2 = img.pixelWidth;
2077
+ }
2078
+ if (srcY2 > img.pixelHeight) {
2079
+ srcY2 = img.pixelHeight;
2080
+ }
2092
2081
 
2093
2082
  int srcW = srcX2 - srcX1;
2094
2083
  int srcH = srcY2 - srcY1;
@@ -2098,13 +2087,14 @@ public class PImage implements PConstants, Cloneable {
2098
2087
  boolean smooth = true; // may as well go with the smoothing these days
2099
2088
 
2100
2089
  if (!smooth) {
2101
- srcW++; srcH++;
2090
+ srcW++;
2091
+ srcH++;
2102
2092
  }
2103
2093
 
2104
- if (destW <= 0 || destH <= 0 ||
2105
- srcW <= 0 || srcH <= 0 ||
2106
- destX1 >= screenW || destY1 >= screenH ||
2107
- srcX1 >= img.pixelWidth || srcY1 >= img.pixelHeight) {
2094
+ if (destW <= 0 || destH <= 0
2095
+ || srcW <= 0 || srcH <= 0
2096
+ || destX1 >= screenW || destY1 >= screenH
2097
+ || srcX1 >= img.pixelWidth || srcY1 >= img.pixelHeight) {
2108
2098
  return;
2109
2099
  }
2110
2100
 
@@ -2137,201 +2127,201 @@ public class PImage implements PConstants, Cloneable {
2137
2127
 
2138
2128
  switch (mode) {
2139
2129
 
2140
- case BLEND:
2141
- for (int y = 0; y < destH; y++) {
2142
- filter_new_scanline();
2143
- for (int x = 0; x < destW; x++) {
2144
- // davbol - renamed old blend_multiply to blend_blend
2145
- destPixels[destOffset + x] =
2146
- blend_blend(destPixels[destOffset + x], filter_bilinear());
2147
- sX += dx;
2130
+ case BLEND:
2131
+ for (int y = 0; y < destH; y++) {
2132
+ filter_new_scanline();
2133
+ for (int x = 0; x < destW; x++) {
2134
+ // davbol - renamed old blend_multiply to blend_blend
2135
+ destPixels[destOffset + x]
2136
+ = blend_blend(destPixels[destOffset + x], filter_bilinear());
2137
+ sX += dx;
2138
+ }
2139
+ destOffset += screenW;
2140
+ srcYOffset += dy;
2148
2141
  }
2149
- destOffset += screenW;
2150
- srcYOffset += dy;
2151
- }
2152
- break;
2153
-
2154
- case ADD:
2155
- for (int y = 0; y < destH; y++) {
2156
- filter_new_scanline();
2157
- for (int x = 0; x < destW; x++) {
2158
- destPixels[destOffset + x] =
2159
- blend_add_pin(destPixels[destOffset + x], filter_bilinear());
2160
- sX += dx;
2142
+ break;
2143
+
2144
+ case ADD:
2145
+ for (int y = 0; y < destH; y++) {
2146
+ filter_new_scanline();
2147
+ for (int x = 0; x < destW; x++) {
2148
+ destPixels[destOffset + x]
2149
+ = blend_add_pin(destPixels[destOffset + x], filter_bilinear());
2150
+ sX += dx;
2151
+ }
2152
+ destOffset += screenW;
2153
+ srcYOffset += dy;
2161
2154
  }
2162
- destOffset += screenW;
2163
- srcYOffset += dy;
2164
- }
2165
- break;
2166
-
2167
- case SUBTRACT:
2168
- for (int y = 0; y < destH; y++) {
2169
- filter_new_scanline();
2170
- for (int x = 0; x < destW; x++) {
2171
- destPixels[destOffset + x] =
2172
- blend_sub_pin(destPixels[destOffset + x], filter_bilinear());
2173
- sX += dx;
2155
+ break;
2156
+
2157
+ case SUBTRACT:
2158
+ for (int y = 0; y < destH; y++) {
2159
+ filter_new_scanline();
2160
+ for (int x = 0; x < destW; x++) {
2161
+ destPixels[destOffset + x]
2162
+ = blend_sub_pin(destPixels[destOffset + x], filter_bilinear());
2163
+ sX += dx;
2164
+ }
2165
+ destOffset += screenW;
2166
+ srcYOffset += dy;
2174
2167
  }
2175
- destOffset += screenW;
2176
- srcYOffset += dy;
2177
- }
2178
- break;
2179
-
2180
- case LIGHTEST:
2181
- for (int y = 0; y < destH; y++) {
2182
- filter_new_scanline();
2183
- for (int x = 0; x < destW; x++) {
2184
- destPixels[destOffset + x] =
2185
- blend_lightest(destPixels[destOffset + x], filter_bilinear());
2186
- sX += dx;
2168
+ break;
2169
+
2170
+ case LIGHTEST:
2171
+ for (int y = 0; y < destH; y++) {
2172
+ filter_new_scanline();
2173
+ for (int x = 0; x < destW; x++) {
2174
+ destPixels[destOffset + x]
2175
+ = blend_lightest(destPixels[destOffset + x], filter_bilinear());
2176
+ sX += dx;
2177
+ }
2178
+ destOffset += screenW;
2179
+ srcYOffset += dy;
2187
2180
  }
2188
- destOffset += screenW;
2189
- srcYOffset += dy;
2190
- }
2191
- break;
2192
-
2193
- case DARKEST:
2194
- for (int y = 0; y < destH; y++) {
2195
- filter_new_scanline();
2196
- for (int x = 0; x < destW; x++) {
2197
- destPixels[destOffset + x] =
2198
- blend_darkest(destPixels[destOffset + x], filter_bilinear());
2199
- sX += dx;
2181
+ break;
2182
+
2183
+ case DARKEST:
2184
+ for (int y = 0; y < destH; y++) {
2185
+ filter_new_scanline();
2186
+ for (int x = 0; x < destW; x++) {
2187
+ destPixels[destOffset + x]
2188
+ = blend_darkest(destPixels[destOffset + x], filter_bilinear());
2189
+ sX += dx;
2190
+ }
2191
+ destOffset += screenW;
2192
+ srcYOffset += dy;
2200
2193
  }
2201
- destOffset += screenW;
2202
- srcYOffset += dy;
2203
- }
2204
- break;
2205
-
2206
- case REPLACE:
2207
- for (int y = 0; y < destH; y++) {
2208
- filter_new_scanline();
2209
- for (int x = 0; x < destW; x++) {
2210
- destPixels[destOffset + x] = filter_bilinear();
2211
- sX += dx;
2194
+ break;
2195
+
2196
+ case REPLACE:
2197
+ for (int y = 0; y < destH; y++) {
2198
+ filter_new_scanline();
2199
+ for (int x = 0; x < destW; x++) {
2200
+ destPixels[destOffset + x] = filter_bilinear();
2201
+ sX += dx;
2202
+ }
2203
+ destOffset += screenW;
2204
+ srcYOffset += dy;
2212
2205
  }
2213
- destOffset += screenW;
2214
- srcYOffset += dy;
2215
- }
2216
- break;
2217
-
2218
- case DIFFERENCE:
2219
- for (int y = 0; y < destH; y++) {
2220
- filter_new_scanline();
2221
- for (int x = 0; x < destW; x++) {
2222
- destPixels[destOffset + x] =
2223
- blend_difference(destPixels[destOffset + x], filter_bilinear());
2224
- sX += dx;
2206
+ break;
2207
+
2208
+ case DIFFERENCE:
2209
+ for (int y = 0; y < destH; y++) {
2210
+ filter_new_scanline();
2211
+ for (int x = 0; x < destW; x++) {
2212
+ destPixels[destOffset + x]
2213
+ = blend_difference(destPixels[destOffset + x], filter_bilinear());
2214
+ sX += dx;
2215
+ }
2216
+ destOffset += screenW;
2217
+ srcYOffset += dy;
2225
2218
  }
2226
- destOffset += screenW;
2227
- srcYOffset += dy;
2228
- }
2229
- break;
2230
-
2231
- case EXCLUSION:
2232
- for (int y = 0; y < destH; y++) {
2233
- filter_new_scanline();
2234
- for (int x = 0; x < destW; x++) {
2235
- destPixels[destOffset + x] =
2236
- blend_exclusion(destPixels[destOffset + x], filter_bilinear());
2237
- sX += dx;
2219
+ break;
2220
+
2221
+ case EXCLUSION:
2222
+ for (int y = 0; y < destH; y++) {
2223
+ filter_new_scanline();
2224
+ for (int x = 0; x < destW; x++) {
2225
+ destPixels[destOffset + x]
2226
+ = blend_exclusion(destPixels[destOffset + x], filter_bilinear());
2227
+ sX += dx;
2228
+ }
2229
+ destOffset += screenW;
2230
+ srcYOffset += dy;
2238
2231
  }
2239
- destOffset += screenW;
2240
- srcYOffset += dy;
2241
- }
2242
- break;
2243
-
2244
- case MULTIPLY:
2245
- for (int y = 0; y < destH; y++) {
2246
- filter_new_scanline();
2247
- for (int x = 0; x < destW; x++) {
2248
- destPixels[destOffset + x] =
2249
- blend_multiply(destPixels[destOffset + x], filter_bilinear());
2250
- sX += dx;
2232
+ break;
2233
+
2234
+ case MULTIPLY:
2235
+ for (int y = 0; y < destH; y++) {
2236
+ filter_new_scanline();
2237
+ for (int x = 0; x < destW; x++) {
2238
+ destPixels[destOffset + x]
2239
+ = blend_multiply(destPixels[destOffset + x], filter_bilinear());
2240
+ sX += dx;
2241
+ }
2242
+ destOffset += screenW;
2243
+ srcYOffset += dy;
2251
2244
  }
2252
- destOffset += screenW;
2253
- srcYOffset += dy;
2254
- }
2255
- break;
2256
-
2257
- case SCREEN:
2258
- for (int y = 0; y < destH; y++) {
2259
- filter_new_scanline();
2260
- for (int x = 0; x < destW; x++) {
2261
- destPixels[destOffset + x] =
2262
- blend_screen(destPixels[destOffset + x], filter_bilinear());
2263
- sX += dx;
2245
+ break;
2246
+
2247
+ case SCREEN:
2248
+ for (int y = 0; y < destH; y++) {
2249
+ filter_new_scanline();
2250
+ for (int x = 0; x < destW; x++) {
2251
+ destPixels[destOffset + x]
2252
+ = blend_screen(destPixels[destOffset + x], filter_bilinear());
2253
+ sX += dx;
2254
+ }
2255
+ destOffset += screenW;
2256
+ srcYOffset += dy;
2264
2257
  }
2265
- destOffset += screenW;
2266
- srcYOffset += dy;
2267
- }
2268
- break;
2269
-
2270
- case OVERLAY:
2271
- for (int y = 0; y < destH; y++) {
2272
- filter_new_scanline();
2273
- for (int x = 0; x < destW; x++) {
2274
- destPixels[destOffset + x] =
2275
- blend_overlay(destPixels[destOffset + x], filter_bilinear());
2276
- sX += dx;
2258
+ break;
2259
+
2260
+ case OVERLAY:
2261
+ for (int y = 0; y < destH; y++) {
2262
+ filter_new_scanline();
2263
+ for (int x = 0; x < destW; x++) {
2264
+ destPixels[destOffset + x]
2265
+ = blend_overlay(destPixels[destOffset + x], filter_bilinear());
2266
+ sX += dx;
2267
+ }
2268
+ destOffset += screenW;
2269
+ srcYOffset += dy;
2277
2270
  }
2278
- destOffset += screenW;
2279
- srcYOffset += dy;
2280
- }
2281
- break;
2282
-
2283
- case HARD_LIGHT:
2284
- for (int y = 0; y < destH; y++) {
2285
- filter_new_scanline();
2286
- for (int x = 0; x < destW; x++) {
2287
- destPixels[destOffset + x] =
2288
- blend_hard_light(destPixels[destOffset + x], filter_bilinear());
2289
- sX += dx;
2271
+ break;
2272
+
2273
+ case HARD_LIGHT:
2274
+ for (int y = 0; y < destH; y++) {
2275
+ filter_new_scanline();
2276
+ for (int x = 0; x < destW; x++) {
2277
+ destPixels[destOffset + x]
2278
+ = blend_hard_light(destPixels[destOffset + x], filter_bilinear());
2279
+ sX += dx;
2280
+ }
2281
+ destOffset += screenW;
2282
+ srcYOffset += dy;
2290
2283
  }
2291
- destOffset += screenW;
2292
- srcYOffset += dy;
2293
- }
2294
- break;
2295
-
2296
- case SOFT_LIGHT:
2297
- for (int y = 0; y < destH; y++) {
2298
- filter_new_scanline();
2299
- for (int x = 0; x < destW; x++) {
2300
- destPixels[destOffset + x] =
2301
- blend_soft_light(destPixels[destOffset + x], filter_bilinear());
2302
- sX += dx;
2284
+ break;
2285
+
2286
+ case SOFT_LIGHT:
2287
+ for (int y = 0; y < destH; y++) {
2288
+ filter_new_scanline();
2289
+ for (int x = 0; x < destW; x++) {
2290
+ destPixels[destOffset + x]
2291
+ = blend_soft_light(destPixels[destOffset + x], filter_bilinear());
2292
+ sX += dx;
2293
+ }
2294
+ destOffset += screenW;
2295
+ srcYOffset += dy;
2303
2296
  }
2304
- destOffset += screenW;
2305
- srcYOffset += dy;
2306
- }
2307
- break;
2308
-
2309
- // davbol - proposed 2007-01-09
2310
- case DODGE:
2311
- for (int y = 0; y < destH; y++) {
2312
- filter_new_scanline();
2313
- for (int x = 0; x < destW; x++) {
2314
- destPixels[destOffset + x] =
2315
- blend_dodge(destPixels[destOffset + x], filter_bilinear());
2316
- sX += dx;
2297
+ break;
2298
+
2299
+ // davbol - proposed 2007-01-09
2300
+ case DODGE:
2301
+ for (int y = 0; y < destH; y++) {
2302
+ filter_new_scanline();
2303
+ for (int x = 0; x < destW; x++) {
2304
+ destPixels[destOffset + x]
2305
+ = blend_dodge(destPixels[destOffset + x], filter_bilinear());
2306
+ sX += dx;
2307
+ }
2308
+ destOffset += screenW;
2309
+ srcYOffset += dy;
2317
2310
  }
2318
- destOffset += screenW;
2319
- srcYOffset += dy;
2320
- }
2321
- break;
2322
-
2323
- case BURN:
2324
- for (int y = 0; y < destH; y++) {
2325
- filter_new_scanline();
2326
- for (int x = 0; x < destW; x++) {
2327
- destPixels[destOffset + x] =
2328
- blend_burn(destPixels[destOffset + x], filter_bilinear());
2329
- sX += dx;
2311
+ break;
2312
+
2313
+ case BURN:
2314
+ for (int y = 0; y < destH; y++) {
2315
+ filter_new_scanline();
2316
+ for (int x = 0; x < destW; x++) {
2317
+ destPixels[destOffset + x]
2318
+ = blend_burn(destPixels[destOffset + x], filter_bilinear());
2319
+ sX += dx;
2320
+ }
2321
+ destOffset += screenW;
2322
+ srcYOffset += dy;
2330
2323
  }
2331
- destOffset += screenW;
2332
- srcYOffset += dy;
2333
- }
2334
- break;
2324
+ break;
2335
2325
 
2336
2326
  }
2337
2327
 
@@ -2339,236 +2329,235 @@ public class PImage implements PConstants, Cloneable {
2339
2329
  // nearest neighbour scaling (++fast!)
2340
2330
  switch (mode) {
2341
2331
 
2342
- case BLEND:
2343
- for (int y = 0; y < destH; y++) {
2344
- sX = srcXOffset;
2345
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2346
- for (int x = 0; x < destW; x++) {
2347
- // davbol - renamed old blend_multiply to blend_blend
2348
- destPixels[destOffset + x] =
2349
- blend_blend(destPixels[destOffset + x],
2350
- srcBuffer[sY + (sX >> PRECISIONB)]);
2351
- sX += dx;
2332
+ case BLEND:
2333
+ for (int y = 0; y < destH; y++) {
2334
+ sX = srcXOffset;
2335
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2336
+ for (int x = 0; x < destW; x++) {
2337
+ // davbol - renamed old blend_multiply to blend_blend
2338
+ destPixels[destOffset + x]
2339
+ = blend_blend(destPixels[destOffset + x],
2340
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2341
+ sX += dx;
2342
+ }
2343
+ destOffset += screenW;
2344
+ srcYOffset += dy;
2352
2345
  }
2353
- destOffset += screenW;
2354
- srcYOffset += dy;
2355
- }
2356
- break;
2357
-
2358
- case ADD:
2359
- for (int y = 0; y < destH; y++) {
2360
- sX = srcXOffset;
2361
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2362
- for (int x = 0; x < destW; x++) {
2363
- destPixels[destOffset + x] =
2364
- blend_add_pin(destPixels[destOffset + x],
2365
- srcBuffer[sY + (sX >> PRECISIONB)]);
2366
- sX += dx;
2346
+ break;
2347
+
2348
+ case ADD:
2349
+ for (int y = 0; y < destH; y++) {
2350
+ sX = srcXOffset;
2351
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2352
+ for (int x = 0; x < destW; x++) {
2353
+ destPixels[destOffset + x]
2354
+ = blend_add_pin(destPixels[destOffset + x],
2355
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2356
+ sX += dx;
2357
+ }
2358
+ destOffset += screenW;
2359
+ srcYOffset += dy;
2367
2360
  }
2368
- destOffset += screenW;
2369
- srcYOffset += dy;
2370
- }
2371
- break;
2372
-
2373
- case SUBTRACT:
2374
- for (int y = 0; y < destH; y++) {
2375
- sX = srcXOffset;
2376
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2377
- for (int x = 0; x < destW; x++) {
2378
- destPixels[destOffset + x] =
2379
- blend_sub_pin(destPixels[destOffset + x],
2380
- srcBuffer[sY + (sX >> PRECISIONB)]);
2381
- sX += dx;
2361
+ break;
2362
+
2363
+ case SUBTRACT:
2364
+ for (int y = 0; y < destH; y++) {
2365
+ sX = srcXOffset;
2366
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2367
+ for (int x = 0; x < destW; x++) {
2368
+ destPixels[destOffset + x]
2369
+ = blend_sub_pin(destPixels[destOffset + x],
2370
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2371
+ sX += dx;
2372
+ }
2373
+ destOffset += screenW;
2374
+ srcYOffset += dy;
2382
2375
  }
2383
- destOffset += screenW;
2384
- srcYOffset += dy;
2385
- }
2386
- break;
2387
-
2388
- case LIGHTEST:
2389
- for (int y = 0; y < destH; y++) {
2390
- sX = srcXOffset;
2391
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2392
- for (int x = 0; x < destW; x++) {
2393
- destPixels[destOffset + x] =
2394
- blend_lightest(destPixels[destOffset + x],
2395
- srcBuffer[sY + (sX >> PRECISIONB)]);
2396
- sX += dx;
2376
+ break;
2377
+
2378
+ case LIGHTEST:
2379
+ for (int y = 0; y < destH; y++) {
2380
+ sX = srcXOffset;
2381
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2382
+ for (int x = 0; x < destW; x++) {
2383
+ destPixels[destOffset + x]
2384
+ = blend_lightest(destPixels[destOffset + x],
2385
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2386
+ sX += dx;
2387
+ }
2388
+ destOffset += screenW;
2389
+ srcYOffset += dy;
2397
2390
  }
2398
- destOffset += screenW;
2399
- srcYOffset += dy;
2400
- }
2401
- break;
2402
-
2403
- case DARKEST:
2404
- for (int y = 0; y < destH; y++) {
2405
- sX = srcXOffset;
2406
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2407
- for (int x = 0; x < destW; x++) {
2408
- destPixels[destOffset + x] =
2409
- blend_darkest(destPixels[destOffset + x],
2410
- srcBuffer[sY + (sX >> PRECISIONB)]);
2411
- sX += dx;
2391
+ break;
2392
+
2393
+ case DARKEST:
2394
+ for (int y = 0; y < destH; y++) {
2395
+ sX = srcXOffset;
2396
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2397
+ for (int x = 0; x < destW; x++) {
2398
+ destPixels[destOffset + x]
2399
+ = blend_darkest(destPixels[destOffset + x],
2400
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2401
+ sX += dx;
2402
+ }
2403
+ destOffset += screenW;
2404
+ srcYOffset += dy;
2412
2405
  }
2413
- destOffset += screenW;
2414
- srcYOffset += dy;
2415
- }
2416
- break;
2417
-
2418
- case REPLACE:
2419
- for (int y = 0; y < destH; y++) {
2420
- sX = srcXOffset;
2421
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2422
- for (int x = 0; x < destW; x++) {
2423
- destPixels[destOffset + x] = srcBuffer[sY + (sX >> PRECISIONB)];
2424
- sX += dx;
2406
+ break;
2407
+
2408
+ case REPLACE:
2409
+ for (int y = 0; y < destH; y++) {
2410
+ sX = srcXOffset;
2411
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2412
+ for (int x = 0; x < destW; x++) {
2413
+ destPixels[destOffset + x] = srcBuffer[sY + (sX >> PRECISIONB)];
2414
+ sX += dx;
2415
+ }
2416
+ destOffset += screenW;
2417
+ srcYOffset += dy;
2425
2418
  }
2426
- destOffset += screenW;
2427
- srcYOffset += dy;
2428
- }
2429
- break;
2430
-
2431
- case DIFFERENCE:
2432
- for (int y = 0; y < destH; y++) {
2433
- sX = srcXOffset;
2434
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2435
- for (int x = 0; x < destW; x++) {
2436
- destPixels[destOffset + x] =
2437
- blend_difference(destPixels[destOffset + x],
2438
- srcBuffer[sY + (sX >> PRECISIONB)]);
2439
- sX += dx;
2419
+ break;
2420
+
2421
+ case DIFFERENCE:
2422
+ for (int y = 0; y < destH; y++) {
2423
+ sX = srcXOffset;
2424
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2425
+ for (int x = 0; x < destW; x++) {
2426
+ destPixels[destOffset + x]
2427
+ = blend_difference(destPixels[destOffset + x],
2428
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2429
+ sX += dx;
2430
+ }
2431
+ destOffset += screenW;
2432
+ srcYOffset += dy;
2440
2433
  }
2441
- destOffset += screenW;
2442
- srcYOffset += dy;
2443
- }
2444
- break;
2445
-
2446
- case EXCLUSION:
2447
- for (int y = 0; y < destH; y++) {
2448
- sX = srcXOffset;
2449
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2450
- for (int x = 0; x < destW; x++) {
2451
- destPixels[destOffset + x] =
2452
- blend_exclusion(destPixels[destOffset + x],
2453
- srcBuffer[sY + (sX >> PRECISIONB)]);
2454
- sX += dx;
2434
+ break;
2435
+
2436
+ case EXCLUSION:
2437
+ for (int y = 0; y < destH; y++) {
2438
+ sX = srcXOffset;
2439
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2440
+ for (int x = 0; x < destW; x++) {
2441
+ destPixels[destOffset + x]
2442
+ = blend_exclusion(destPixels[destOffset + x],
2443
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2444
+ sX += dx;
2445
+ }
2446
+ destOffset += screenW;
2447
+ srcYOffset += dy;
2455
2448
  }
2456
- destOffset += screenW;
2457
- srcYOffset += dy;
2458
- }
2459
- break;
2460
-
2461
- case MULTIPLY:
2462
- for (int y = 0; y < destH; y++) {
2463
- sX = srcXOffset;
2464
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2465
- for (int x = 0; x < destW; x++) {
2466
- destPixels[destOffset + x] =
2467
- blend_multiply(destPixels[destOffset + x],
2468
- srcBuffer[sY + (sX >> PRECISIONB)]);
2469
- sX += dx;
2449
+ break;
2450
+
2451
+ case MULTIPLY:
2452
+ for (int y = 0; y < destH; y++) {
2453
+ sX = srcXOffset;
2454
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2455
+ for (int x = 0; x < destW; x++) {
2456
+ destPixels[destOffset + x]
2457
+ = blend_multiply(destPixels[destOffset + x],
2458
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2459
+ sX += dx;
2460
+ }
2461
+ destOffset += screenW;
2462
+ srcYOffset += dy;
2470
2463
  }
2471
- destOffset += screenW;
2472
- srcYOffset += dy;
2473
- }
2474
- break;
2475
-
2476
- case SCREEN:
2477
- for (int y = 0; y < destH; y++) {
2478
- sX = srcXOffset;
2479
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2480
- for (int x = 0; x < destW; x++) {
2481
- destPixels[destOffset + x] =
2482
- blend_screen(destPixels[destOffset + x],
2483
- srcBuffer[sY + (sX >> PRECISIONB)]);
2484
- sX += dx;
2464
+ break;
2465
+
2466
+ case SCREEN:
2467
+ for (int y = 0; y < destH; y++) {
2468
+ sX = srcXOffset;
2469
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2470
+ for (int x = 0; x < destW; x++) {
2471
+ destPixels[destOffset + x]
2472
+ = blend_screen(destPixels[destOffset + x],
2473
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2474
+ sX += dx;
2475
+ }
2476
+ destOffset += screenW;
2477
+ srcYOffset += dy;
2485
2478
  }
2486
- destOffset += screenW;
2487
- srcYOffset += dy;
2488
- }
2489
- break;
2490
-
2491
- case OVERLAY:
2492
- for (int y = 0; y < destH; y++) {
2493
- sX = srcXOffset;
2494
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2495
- for (int x = 0; x < destW; x++) {
2496
- destPixels[destOffset + x] =
2497
- blend_overlay(destPixels[destOffset + x],
2498
- srcBuffer[sY + (sX >> PRECISIONB)]);
2499
- sX += dx;
2479
+ break;
2480
+
2481
+ case OVERLAY:
2482
+ for (int y = 0; y < destH; y++) {
2483
+ sX = srcXOffset;
2484
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2485
+ for (int x = 0; x < destW; x++) {
2486
+ destPixels[destOffset + x]
2487
+ = blend_overlay(destPixels[destOffset + x],
2488
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2489
+ sX += dx;
2490
+ }
2491
+ destOffset += screenW;
2492
+ srcYOffset += dy;
2500
2493
  }
2501
- destOffset += screenW;
2502
- srcYOffset += dy;
2503
- }
2504
- break;
2505
-
2506
- case HARD_LIGHT:
2507
- for (int y = 0; y < destH; y++) {
2508
- sX = srcXOffset;
2509
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2510
- for (int x = 0; x < destW; x++) {
2511
- destPixels[destOffset + x] =
2512
- blend_hard_light(destPixels[destOffset + x],
2513
- srcBuffer[sY + (sX >> PRECISIONB)]);
2514
- sX += dx;
2494
+ break;
2495
+
2496
+ case HARD_LIGHT:
2497
+ for (int y = 0; y < destH; y++) {
2498
+ sX = srcXOffset;
2499
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2500
+ for (int x = 0; x < destW; x++) {
2501
+ destPixels[destOffset + x]
2502
+ = blend_hard_light(destPixels[destOffset + x],
2503
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2504
+ sX += dx;
2505
+ }
2506
+ destOffset += screenW;
2507
+ srcYOffset += dy;
2515
2508
  }
2516
- destOffset += screenW;
2517
- srcYOffset += dy;
2518
- }
2519
- break;
2520
-
2521
- case SOFT_LIGHT:
2522
- for (int y = 0; y < destH; y++) {
2523
- sX = srcXOffset;
2524
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2525
- for (int x = 0; x < destW; x++) {
2526
- destPixels[destOffset + x] =
2527
- blend_soft_light(destPixels[destOffset + x],
2528
- srcBuffer[sY + (sX >> PRECISIONB)]);
2529
- sX += dx;
2509
+ break;
2510
+
2511
+ case SOFT_LIGHT:
2512
+ for (int y = 0; y < destH; y++) {
2513
+ sX = srcXOffset;
2514
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2515
+ for (int x = 0; x < destW; x++) {
2516
+ destPixels[destOffset + x]
2517
+ = blend_soft_light(destPixels[destOffset + x],
2518
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2519
+ sX += dx;
2520
+ }
2521
+ destOffset += screenW;
2522
+ srcYOffset += dy;
2530
2523
  }
2531
- destOffset += screenW;
2532
- srcYOffset += dy;
2533
- }
2534
- break;
2535
-
2536
- // davbol - proposed 2007-01-09
2537
- case DODGE:
2538
- for (int y = 0; y < destH; y++) {
2539
- sX = srcXOffset;
2540
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2541
- for (int x = 0; x < destW; x++) {
2542
- destPixels[destOffset + x] =
2543
- blend_dodge(destPixels[destOffset + x],
2544
- srcBuffer[sY + (sX >> PRECISIONB)]);
2545
- sX += dx;
2524
+ break;
2525
+
2526
+ // davbol - proposed 2007-01-09
2527
+ case DODGE:
2528
+ for (int y = 0; y < destH; y++) {
2529
+ sX = srcXOffset;
2530
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2531
+ for (int x = 0; x < destW; x++) {
2532
+ destPixels[destOffset + x]
2533
+ = blend_dodge(destPixels[destOffset + x],
2534
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2535
+ sX += dx;
2536
+ }
2537
+ destOffset += screenW;
2538
+ srcYOffset += dy;
2546
2539
  }
2547
- destOffset += screenW;
2548
- srcYOffset += dy;
2549
- }
2550
- break;
2551
-
2552
- case BURN:
2553
- for (int y = 0; y < destH; y++) {
2554
- sX = srcXOffset;
2555
- sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2556
- for (int x = 0; x < destW; x++) {
2557
- destPixels[destOffset + x] =
2558
- blend_burn(destPixels[destOffset + x],
2559
- srcBuffer[sY + (sX >> PRECISIONB)]);
2560
- sX += dx;
2540
+ break;
2541
+
2542
+ case BURN:
2543
+ for (int y = 0; y < destH; y++) {
2544
+ sX = srcXOffset;
2545
+ sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
2546
+ for (int x = 0; x < destW; x++) {
2547
+ destPixels[destOffset + x]
2548
+ = blend_burn(destPixels[destOffset + x],
2549
+ srcBuffer[sY + (sX >> PRECISIONB)]);
2550
+ sX += dx;
2551
+ }
2552
+ destOffset += screenW;
2553
+ srcYOffset += dy;
2561
2554
  }
2562
- destOffset += screenW;
2563
- srcYOffset += dy;
2564
- }
2565
- break;
2555
+ break;
2566
2556
 
2567
2557
  }
2568
2558
  }
2569
2559
  }
2570
2560
 
2571
-
2572
2561
  private void filter_new_scanline() {
2573
2562
  sX = srcXOffset;
2574
2563
  fracV = srcYOffset & PREC_MAXVAL;
@@ -2577,7 +2566,6 @@ public class PImage implements PConstants, Cloneable {
2577
2566
  v2 = min((srcYOffset >> PRECISIONB) + 1, ih1) * iw;
2578
2567
  }
2579
2568
 
2580
-
2581
2569
  private int filter_bilinear() {
2582
2570
  fracU = sX & PREC_MAXVAL;
2583
2571
  ifU = PREC_MAXVAL - fracU + 1;
@@ -2594,44 +2582,36 @@ public class PImage implements PConstants, Cloneable {
2594
2582
  cLL = srcBuffer[v2 + u1];
2595
2583
  cLR = srcBuffer[v2 + u2];
2596
2584
 
2597
- r = ((ul*((cUL&RED_MASK)>>16) + ll*((cLL&RED_MASK)>>16) +
2598
- ur*((cUR&RED_MASK)>>16) + lr*((cLR&RED_MASK)>>16))
2599
- << PREC_RED_SHIFT) & RED_MASK;
2585
+ r = ((ul * ((cUL & RED_MASK) >> 16) + ll * ((cLL & RED_MASK) >> 16)
2586
+ + ur * ((cUR & RED_MASK) >> 16) + lr * ((cLR & RED_MASK) >> 16))
2587
+ << PREC_RED_SHIFT) & RED_MASK;
2600
2588
 
2601
- g = ((ul*(cUL&GREEN_MASK) + ll*(cLL&GREEN_MASK) +
2602
- ur*(cUR&GREEN_MASK) + lr*(cLR&GREEN_MASK))
2603
- >>> PRECISIONB) & GREEN_MASK;
2589
+ g = ((ul * (cUL & GREEN_MASK) + ll * (cLL & GREEN_MASK)
2590
+ + ur * (cUR & GREEN_MASK) + lr * (cLR & GREEN_MASK))
2591
+ >>> PRECISIONB) & GREEN_MASK;
2604
2592
 
2605
- b = (ul*(cUL&BLUE_MASK) + ll*(cLL&BLUE_MASK) +
2606
- ur*(cUR&BLUE_MASK) + lr*(cLR&BLUE_MASK))
2607
- >>> PRECISIONB;
2593
+ b = (ul * (cUL & BLUE_MASK) + ll * (cLL & BLUE_MASK)
2594
+ + ur * (cUR & BLUE_MASK) + lr * (cLR & BLUE_MASK))
2595
+ >>> PRECISIONB;
2608
2596
 
2609
- a = ((ul*((cUL&ALPHA_MASK)>>>24) + ll*((cLL&ALPHA_MASK)>>>24) +
2610
- ur*((cUR&ALPHA_MASK)>>>24) + lr*((cLR&ALPHA_MASK)>>>24))
2611
- << PREC_ALPHA_SHIFT) & ALPHA_MASK;
2597
+ a = ((ul * ((cUL & ALPHA_MASK) >>> 24) + ll * ((cLL & ALPHA_MASK) >>> 24)
2598
+ + ur * ((cUR & ALPHA_MASK) >>> 24) + lr * ((cLR & ALPHA_MASK) >>> 24))
2599
+ << PREC_ALPHA_SHIFT) & ALPHA_MASK;
2612
2600
 
2613
2601
  return a | r | g | b;
2614
2602
  }
2615
2603
 
2616
-
2617
-
2618
2604
  //////////////////////////////////////////////////////////////
2619
-
2620
2605
  // internal blending methods
2621
-
2622
-
2623
2606
  private static int min(int a, int b) {
2624
2607
  return (a < b) ? a : b;
2625
2608
  }
2626
2609
 
2627
-
2628
2610
  private static int max(int a, int b) {
2629
2611
  return (a > b) ? a : b;
2630
2612
  }
2631
2613
 
2632
-
2633
2614
  /////////////////////////////////////////////////////////////
2634
-
2635
2615
  // BLEND MODE IMPLEMENTATIONS
2636
2616
 
2637
2617
  /*
@@ -2720,13 +2700,11 @@ int testFunction(int dst, int src) {
2720
2700
  *
2721
2701
  *
2722
2702
  */
2723
-
2724
2703
  private static final int RB_MASK = 0x00FF00FF;
2725
2704
  private static final int GN_MASK = 0x0000FF00;
2726
2705
 
2727
2706
  /**
2728
- * Blend
2729
- * O = S
2707
+ * Blend O = S
2730
2708
  */
2731
2709
  private static int blend_blend(int dst, int src) {
2732
2710
  int a = src >>> 24;
@@ -2734,15 +2712,13 @@ int testFunction(int dst, int src) {
2734
2712
  int s_a = a + (a >= 0x7F ? 1 : 0);
2735
2713
  int d_a = 0x100 - s_a;
2736
2714
 
2737
- return min((dst >>> 24) + a, 0xFF) << 24 |
2738
- ((dst & RB_MASK) * d_a + (src & RB_MASK) * s_a) >>> 8 & RB_MASK |
2739
- ((dst & GN_MASK) * d_a + (src & GN_MASK) * s_a) >>> 8 & GN_MASK;
2715
+ return min((dst >>> 24) + a, 0xFF) << 24
2716
+ | ((dst & RB_MASK) * d_a + (src & RB_MASK) * s_a) >>> 8 & RB_MASK
2717
+ | ((dst & GN_MASK) * d_a + (src & GN_MASK) * s_a) >>> 8 & GN_MASK;
2740
2718
  }
2741
2719
 
2742
-
2743
2720
  /**
2744
- * Add
2745
- * O = MIN(D + S, 1)
2721
+ * Add O = MIN(D + S, 1)
2746
2722
  */
2747
2723
  private static int blend_add_pin(int dst, int src) {
2748
2724
  int a = src >>> 24;
@@ -2752,35 +2728,31 @@ int testFunction(int dst, int src) {
2752
2728
  int rb = (dst & RB_MASK) + ((src & RB_MASK) * s_a >>> 8 & RB_MASK);
2753
2729
  int gn = (dst & GN_MASK) + ((src & GN_MASK) * s_a >>> 8);
2754
2730
 
2755
- return min((dst >>> 24) + a, 0xFF) << 24 |
2756
- min(rb & 0xFFFF0000, RED_MASK) |
2757
- min(gn & 0x00FFFF00, GREEN_MASK) |
2758
- min(rb & 0x0000FFFF, BLUE_MASK);
2731
+ return min((dst >>> 24) + a, 0xFF) << 24
2732
+ | min(rb & 0xFFFF0000, RED_MASK)
2733
+ | min(gn & 0x00FFFF00, GREEN_MASK)
2734
+ | min(rb & 0x0000FFFF, BLUE_MASK);
2759
2735
  }
2760
2736
 
2761
-
2762
2737
  /**
2763
- * Subtract
2764
- * O = MAX(0, D - S)
2738
+ * Subtract O = MAX(0, D - S)
2765
2739
  */
2766
2740
  private static int blend_sub_pin(int dst, int src) {
2767
2741
  int a = src >>> 24;
2768
2742
 
2769
2743
  int s_a = a + (a >= 0x7F ? 1 : 0);
2770
2744
 
2771
- int rb = ((src & RB_MASK) * s_a >>> 8);
2745
+ int rb = ((src & RB_MASK) * s_a >>> 8);
2772
2746
  int gn = ((src & GREEN_MASK) * s_a >>> 8);
2773
2747
 
2774
- return min((dst >>> 24) + a, 0xFF) << 24 |
2775
- max((dst & RED_MASK) - (rb & RED_MASK), 0) |
2776
- max((dst & GREEN_MASK) - (gn & GREEN_MASK), 0) |
2777
- max((dst & BLUE_MASK) - (rb & BLUE_MASK), 0);
2748
+ return min((dst >>> 24) + a, 0xFF) << 24
2749
+ | max((dst & RED_MASK) - (rb & RED_MASK), 0)
2750
+ | max((dst & GREEN_MASK) - (gn & GREEN_MASK), 0)
2751
+ | max((dst & BLUE_MASK) - (rb & BLUE_MASK), 0);
2778
2752
  }
2779
2753
 
2780
-
2781
2754
  /**
2782
- * Lightest
2783
- * O = MAX(D, S)
2755
+ * Lightest O = MAX(D, S)
2784
2756
  */
2785
2757
  private static int blend_lightest(int dst, int src) {
2786
2758
  int a = src >>> 24;
@@ -2788,19 +2760,17 @@ int testFunction(int dst, int src) {
2788
2760
  int s_a = a + (a >= 0x7F ? 1 : 0);
2789
2761
  int d_a = 0x100 - s_a;
2790
2762
 
2791
- int rb = max(src & RED_MASK, dst & RED_MASK) |
2792
- max(src & BLUE_MASK, dst & BLUE_MASK);
2763
+ int rb = max(src & RED_MASK, dst & RED_MASK)
2764
+ | max(src & BLUE_MASK, dst & BLUE_MASK);
2793
2765
  int gn = max(src & GREEN_MASK, dst & GREEN_MASK);
2794
2766
 
2795
- return min((dst >>> 24) + a, 0xFF) << 24 |
2796
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
2797
- ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2767
+ return min((dst >>> 24) + a, 0xFF) << 24
2768
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
2769
+ | ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2798
2770
  }
2799
2771
 
2800
-
2801
2772
  /**
2802
- * Darkest
2803
- * O = MIN(D, S)
2773
+ * Darkest O = MIN(D, S)
2804
2774
  */
2805
2775
  private static int blend_darkest(int dst, int src) {
2806
2776
  int a = src >>> 24;
@@ -2808,19 +2778,17 @@ int testFunction(int dst, int src) {
2808
2778
  int s_a = a + (a >= 0x7F ? 1 : 0);
2809
2779
  int d_a = 0x100 - s_a;
2810
2780
 
2811
- int rb = min(src & RED_MASK, dst & RED_MASK) |
2812
- min(src & BLUE_MASK, dst & BLUE_MASK);
2781
+ int rb = min(src & RED_MASK, dst & RED_MASK)
2782
+ | min(src & BLUE_MASK, dst & BLUE_MASK);
2813
2783
  int gn = min(src & GREEN_MASK, dst & GREEN_MASK);
2814
2784
 
2815
- return min((dst >>> 24) + a, 0xFF) << 24 |
2816
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
2817
- ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2785
+ return min((dst >>> 24) + a, 0xFF) << 24
2786
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
2787
+ | ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2818
2788
  }
2819
2789
 
2820
-
2821
2790
  /**
2822
- * Difference
2823
- * O = ABS(D - S)
2791
+ * Difference O = ABS(D - S)
2824
2792
  */
2825
2793
  private static int blend_difference(int dst, int src) {
2826
2794
  int a = src >>> 24;
@@ -2828,24 +2796,21 @@ int testFunction(int dst, int src) {
2828
2796
  int s_a = a + (a >= 0x7F ? 1 : 0);
2829
2797
  int d_a = 0x100 - s_a;
2830
2798
 
2831
- int r = (dst & RED_MASK) - (src & RED_MASK);
2832
- int b = (dst & BLUE_MASK) - (src & BLUE_MASK);
2799
+ int r = (dst & RED_MASK) - (src & RED_MASK);
2800
+ int b = (dst & BLUE_MASK) - (src & BLUE_MASK);
2833
2801
  int g = (dst & GREEN_MASK) - (src & GREEN_MASK);
2834
2802
 
2835
- int rb = (r < 0 ? -r : r) |
2836
- (b < 0 ? -b : b);
2803
+ int rb = (r < 0 ? -r : r)
2804
+ | (b < 0 ? -b : b);
2837
2805
  int gn = (g < 0 ? -g : g);
2838
2806
 
2839
- return min((dst >>> 24) + a, 0xFF) << 24 |
2840
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
2841
- ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2807
+ return min((dst >>> 24) + a, 0xFF) << 24
2808
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
2809
+ | ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
2842
2810
  }
2843
2811
 
2844
-
2845
2812
  /**
2846
- * Exclusion
2847
- * O = (1 - S)D + S(1 - D)
2848
- * O = D + S - 2DS
2813
+ * Exclusion O = (1 - S)D + S(1 - D) O = D + S - 2DS
2849
2814
  */
2850
2815
  private static int blend_exclusion(int dst, int src) {
2851
2816
  int a = src >>> 24;
@@ -2861,16 +2826,16 @@ int testFunction(int dst, int src) {
2861
2826
  int f_r = (dst & RED_MASK) >> 16;
2862
2827
  int f_b = (dst & BLUE_MASK);
2863
2828
 
2864
- int rb_sub =
2865
- ((src & RED_MASK) * (f_r + (f_r >= 0x7F ? 1 : 0)) |
2866
- (src & BLUE_MASK) * (f_b + (f_b >= 0x7F ? 1 : 0)))
2867
- >>> 7 & 0x01FF01FF;
2829
+ int rb_sub
2830
+ = ((src & RED_MASK) * (f_r + (f_r >= 0x7F ? 1 : 0))
2831
+ | (src & BLUE_MASK) * (f_b + (f_b >= 0x7F ? 1 : 0)))
2832
+ >>> 7 & 0x01FF01FF;
2868
2833
  int gn_sub = s_gn * (d_gn + (d_gn >= 0x7F00 ? 0x100 : 0))
2869
- >>> 15 & 0x0001FF00;
2834
+ >>> 15 & 0x0001FF00;
2870
2835
 
2871
- return min((dst >>> 24) + a, 0xFF) << 24 |
2872
- (d_rb * d_a + (d_rb + (src & RB_MASK) - rb_sub) * s_a) >>> 8 & RB_MASK |
2873
- (d_gn * d_a + (d_gn + s_gn - gn_sub) * s_a) >>> 8 & GN_MASK;
2836
+ return min((dst >>> 24) + a, 0xFF) << 24
2837
+ | (d_rb * d_a + (d_rb + (src & RB_MASK) - rb_sub) * s_a) >>> 8 & RB_MASK
2838
+ | (d_gn * d_a + (d_gn + s_gn - gn_sub) * s_a) >>> 8 & GN_MASK;
2874
2839
  }
2875
2840
 
2876
2841
 
@@ -2889,24 +2854,21 @@ int testFunction(int dst, int src) {
2889
2854
  int f_r = (dst & RED_MASK) >> 16;
2890
2855
  int f_b = (dst & BLUE_MASK);
2891
2856
 
2892
- int rb =
2893
- ((src & RED_MASK) * (f_r + 1) |
2894
- (src & BLUE_MASK) * (f_b + 1))
2895
- >>> 8 & RB_MASK;
2896
- int gn =
2897
- (src & GREEN_MASK) * (d_gn + 0x100)
2898
- >>> 16 & GN_MASK;
2857
+ int rb
2858
+ = ((src & RED_MASK) * (f_r + 1)
2859
+ | (src & BLUE_MASK) * (f_b + 1))
2860
+ >>> 8 & RB_MASK;
2861
+ int gn
2862
+ = (src & GREEN_MASK) * (d_gn + 0x100)
2863
+ >>> 16 & GN_MASK;
2899
2864
 
2900
- return min((dst >>> 24) + a, 0xFF) << 24 |
2901
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
2902
- (d_gn * d_a + gn * s_a) >>> 8 & GN_MASK;
2865
+ return min((dst >>> 24) + a, 0xFF) << 24
2866
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
2867
+ | (d_gn * d_a + gn * s_a) >>> 8 & GN_MASK;
2903
2868
  }
2904
2869
 
2905
-
2906
2870
  /**
2907
- * Screen
2908
- * O = 1 - (1 - D)(1 - S)
2909
- * O = D + S - DS
2871
+ * Screen O = 1 - (1 - D)(1 - S) O = D + S - DS
2910
2872
  */
2911
2873
  private static int blend_screen(int dst, int src) {
2912
2874
  int a = src >>> 24;
@@ -2922,23 +2884,21 @@ int testFunction(int dst, int src) {
2922
2884
  int f_r = (dst & RED_MASK) >> 16;
2923
2885
  int f_b = (dst & BLUE_MASK);
2924
2886
 
2925
- int rb_sub =
2926
- ((src & RED_MASK) * (f_r + 1) |
2927
- (src & BLUE_MASK) * (f_b + 1))
2928
- >>> 8 & RB_MASK;
2887
+ int rb_sub
2888
+ = ((src & RED_MASK) * (f_r + 1)
2889
+ | (src & BLUE_MASK) * (f_b + 1))
2890
+ >>> 8 & RB_MASK;
2929
2891
  int gn_sub = s_gn * (d_gn + 0x100)
2930
- >>> 16 & GN_MASK;
2892
+ >>> 16 & GN_MASK;
2931
2893
 
2932
- return min((dst >>> 24) + a, 0xFF) << 24 |
2933
- (d_rb * d_a + (d_rb + (src & RB_MASK) - rb_sub) * s_a) >>> 8 & RB_MASK |
2934
- (d_gn * d_a + (d_gn + s_gn - gn_sub) * s_a) >>> 8 & GN_MASK;
2894
+ return min((dst >>> 24) + a, 0xFF) << 24
2895
+ | (d_rb * d_a + (d_rb + (src & RB_MASK) - rb_sub) * s_a) >>> 8 & RB_MASK
2896
+ | (d_gn * d_a + (d_gn + s_gn - gn_sub) * s_a) >>> 8 & GN_MASK;
2935
2897
  }
2936
2898
 
2937
-
2938
2899
  /**
2939
- * Overlay
2940
- * O = 2 * MULTIPLY(D, S) = 2DS for D < 0.5
2941
- * O = 2 * SCREEN(D, S) - 1 = 2(S + D - DS) - 1 otherwise
2900
+ * Overlay O = 2 * MULTIPLY(D, S) = 2DS for D < 0.5 O = 2 * SCREEN(D, S) - 1 =
2901
+ * 2(S + D - DS) - 1 otherwise
2942
2902
  */
2943
2903
  private static int blend_overlay(int dst, int src) {
2944
2904
  int a = src >>> 24;
@@ -2954,28 +2914,26 @@ int testFunction(int dst, int src) {
2954
2914
  int s_g = src & GREEN_MASK;
2955
2915
  int s_b = src & BLUE_MASK;
2956
2916
 
2957
- int r = (d_r < 0x800000) ?
2958
- d_r * ((s_r >>> 16) + 1) >>> 7 :
2959
- 0xFF0000 - ((0x100 - (s_r >>> 16)) * (RED_MASK - d_r) >>> 7);
2960
- int g = (d_g < 0x8000) ?
2961
- d_g * (s_g + 0x100) >>> 15 :
2962
- (0xFF00 - ((0x10000 - s_g) * (GREEN_MASK - d_g) >>> 15));
2963
- int b = (d_b < 0x80) ?
2964
- d_b * (s_b + 1) >>> 7 :
2965
- (0xFF00 - ((0x100 - s_b) * (BLUE_MASK - d_b) << 1)) >>> 8;
2917
+ int r = (d_r < 0x800000)
2918
+ ? d_r * ((s_r >>> 16) + 1) >>> 7
2919
+ : 0xFF0000 - ((0x100 - (s_r >>> 16)) * (RED_MASK - d_r) >>> 7);
2920
+ int g = (d_g < 0x8000)
2921
+ ? d_g * (s_g + 0x100) >>> 15
2922
+ : (0xFF00 - ((0x10000 - s_g) * (GREEN_MASK - d_g) >>> 15));
2923
+ int b = (d_b < 0x80)
2924
+ ? d_b * (s_b + 1) >>> 7
2925
+ : (0xFF00 - ((0x100 - s_b) * (BLUE_MASK - d_b) << 1)) >>> 8;
2966
2926
 
2967
- return min((dst >>> 24) + a, 0xFF) << 24 |
2968
- ((dst & RB_MASK) * d_a + ((r | b) & RB_MASK) * s_a) >>> 8 & RB_MASK |
2969
- ((dst & GN_MASK) * d_a + (g & GN_MASK) * s_a) >>> 8 & GN_MASK;
2927
+ return min((dst >>> 24) + a, 0xFF) << 24
2928
+ | ((dst & RB_MASK) * d_a + ((r | b) & RB_MASK) * s_a) >>> 8 & RB_MASK
2929
+ | ((dst & GN_MASK) * d_a + (g & GN_MASK) * s_a) >>> 8 & GN_MASK;
2970
2930
  }
2971
2931
 
2972
-
2973
2932
  /**
2974
- * Hard Light
2975
- * O = OVERLAY(S, D)
2933
+ * Hard Light O = OVERLAY(S, D)
2976
2934
  *
2977
- * O = 2 * MULTIPLY(D, S) = 2DS for S < 0.5
2978
- * O = 2 * SCREEN(D, S) - 1 = 2(S + D - DS) - 1 otherwise
2935
+ * O = 2 * MULTIPLY(D, S) = 2DS for S < 0.5 O = 2 * SCREEN(D, S) - 1 = 2(S + D
2936
+ * - DS) - 1 otherwise
2979
2937
  */
2980
2938
  private static int blend_hard_light(int dst, int src) {
2981
2939
  int a = src >>> 24;
@@ -2991,27 +2949,24 @@ int testFunction(int dst, int src) {
2991
2949
  int s_g = src & GREEN_MASK;
2992
2950
  int s_b = src & BLUE_MASK;
2993
2951
 
2994
- int r = (s_r < 0x800000) ?
2995
- s_r * ((d_r >>> 16) + 1) >>> 7 :
2996
- 0xFF0000 - ((0x100 - (d_r >>> 16)) * (RED_MASK - s_r) >>> 7);
2997
- int g = (s_g < 0x8000) ?
2998
- s_g * (d_g + 0x100) >>> 15 :
2999
- (0xFF00 - ((0x10000 - d_g) * (GREEN_MASK - s_g) >>> 15));
3000
- int b = (s_b < 0x80) ?
3001
- s_b * (d_b + 1) >>> 7 :
3002
- (0xFF00 - ((0x100 - d_b) * (BLUE_MASK - s_b) << 1)) >>> 8;
2952
+ int r = (s_r < 0x800000)
2953
+ ? s_r * ((d_r >>> 16) + 1) >>> 7
2954
+ : 0xFF0000 - ((0x100 - (d_r >>> 16)) * (RED_MASK - s_r) >>> 7);
2955
+ int g = (s_g < 0x8000)
2956
+ ? s_g * (d_g + 0x100) >>> 15
2957
+ : (0xFF00 - ((0x10000 - d_g) * (GREEN_MASK - s_g) >>> 15));
2958
+ int b = (s_b < 0x80)
2959
+ ? s_b * (d_b + 1) >>> 7
2960
+ : (0xFF00 - ((0x100 - d_b) * (BLUE_MASK - s_b) << 1)) >>> 8;
3003
2961
 
3004
- return min((dst >>> 24) + a, 0xFF) << 24 |
3005
- ((dst & RB_MASK) * d_a + ((r | b) & RB_MASK) * s_a) >>> 8 & RB_MASK |
3006
- ((dst & GN_MASK) * d_a + (g & GN_MASK) * s_a) >>> 8 & GN_MASK;
2962
+ return min((dst >>> 24) + a, 0xFF) << 24
2963
+ | ((dst & RB_MASK) * d_a + ((r | b) & RB_MASK) * s_a) >>> 8 & RB_MASK
2964
+ | ((dst & GN_MASK) * d_a + (g & GN_MASK) * s_a) >>> 8 & GN_MASK;
3007
2965
  }
3008
2966
 
3009
-
3010
2967
  /**
3011
- * Soft Light (Pegtop)
3012
- * O = (1 - D) * MULTIPLY(D, S) + D * SCREEN(D, S)
3013
- * O = (1 - D) * DS + D * (1 - (1 - D)(1 - S))
3014
- * O = 2DS + DD - 2DDS
2968
+ * Soft Light (Pegtop) O = (1 - D) * MULTIPLY(D, S) + D * SCREEN(D, S) O = (1
2969
+ * - D) * DS + D * (1 - (1 - D)(1 - S)) O = 2DS + DD - 2DDS
3015
2970
  */
3016
2971
  private static int blend_soft_light(int dst, int src) {
3017
2972
  int a = src >>> 24;
@@ -3028,25 +2983,23 @@ int testFunction(int dst, int src) {
3028
2983
  int s_b1 = src & BLUE_MASK;
3029
2984
 
3030
2985
  int d_r1 = (d_r >> 16) + (s_r1 < 7F ? 1 : 0);
3031
- int d_g1 = (d_g >> 8) + (s_g1 < 7F ? 1 : 0);
3032
- int d_b1 = d_b + (s_b1 < 7F ? 1 : 0);
2986
+ int d_g1 = (d_g >> 8) + (s_g1 < 7F ? 1 : 0);
2987
+ int d_b1 = d_b + (s_b1 < 7F ? 1 : 0);
3033
2988
 
3034
- int r = (s_r1 * d_r >> 7) + 0xFF * d_r1 * (d_r1 + 1) -
3035
- ((s_r1 * d_r1 * d_r1) << 1) & RED_MASK;
3036
- int g = (s_g1 * d_g << 1) + 0xFF * d_g1 * (d_g1 + 1) -
3037
- ((s_g1 * d_g1 * d_g1) << 1) >>> 8 & GREEN_MASK;
3038
- int b = (s_b1 * d_b << 9) + 0xFF * d_b1 * (d_b1 + 1) -
3039
- ((s_b1 * d_b1 * d_b1) << 1) >>> 16;
2989
+ int r = (s_r1 * d_r >> 7) + 0xFF * d_r1 * (d_r1 + 1)
2990
+ - ((s_r1 * d_r1 * d_r1) << 1) & RED_MASK;
2991
+ int g = (s_g1 * d_g << 1) + 0xFF * d_g1 * (d_g1 + 1)
2992
+ - ((s_g1 * d_g1 * d_g1) << 1) >>> 8 & GREEN_MASK;
2993
+ int b = (s_b1 * d_b << 9) + 0xFF * d_b1 * (d_b1 + 1)
2994
+ - ((s_b1 * d_b1 * d_b1) << 1) >>> 16;
3040
2995
 
3041
- return min((dst >>> 24) + a, 0xFF) << 24 |
3042
- ((dst & RB_MASK) * d_a + (r | b) * s_a) >>> 8 & RB_MASK |
3043
- ((dst & GN_MASK) * d_a + g * s_a) >>> 8 & GN_MASK;
2996
+ return min((dst >>> 24) + a, 0xFF) << 24
2997
+ | ((dst & RB_MASK) * d_a + (r | b) * s_a) >>> 8 & RB_MASK
2998
+ | ((dst & GN_MASK) * d_a + g * s_a) >>> 8 & GN_MASK;
3044
2999
  }
3045
3000
 
3046
-
3047
3001
  /**
3048
- * Dodge
3049
- * O = D / (1 - S)
3002
+ * Dodge O = D / (1 - S)
3050
3003
  */
3051
3004
  private static int blend_dodge(int dst, int src) {
3052
3005
  int a = src >>> 24;
@@ -3054,25 +3007,23 @@ int testFunction(int dst, int src) {
3054
3007
  int s_a = a + (a >= 0x7F ? 1 : 0);
3055
3008
  int d_a = 0x100 - s_a;
3056
3009
 
3057
- int r = (dst & RED_MASK) / (256 - ((src & RED_MASK) >> 16));
3010
+ int r = (dst & RED_MASK) / (256 - ((src & RED_MASK) >> 16));
3058
3011
  int g = ((dst & GREEN_MASK) << 8) / (256 - ((src & GREEN_MASK) >> 8));
3059
- int b = ((dst & BLUE_MASK) << 8) / (256 - (src & BLUE_MASK));
3012
+ int b = ((dst & BLUE_MASK) << 8) / (256 - (src & BLUE_MASK));
3060
3013
 
3061
- int rb =
3062
- (r > 0xFF00 ? 0xFF0000 : ((r << 8) & RED_MASK)) |
3063
- (b > 0x00FF ? 0x0000FF : b);
3064
- int gn =
3065
- (g > 0xFF00 ? 0x00FF00 : (g & GREEN_MASK));
3014
+ int rb
3015
+ = (r > 0xFF00 ? 0xFF0000 : ((r << 8) & RED_MASK))
3016
+ | (b > 0x00FF ? 0x0000FF : b);
3017
+ int gn
3018
+ = (g > 0xFF00 ? 0x00FF00 : (g & GREEN_MASK));
3066
3019
 
3067
- return min((dst >>> 24) + a, 0xFF) << 24 |
3068
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
3069
- ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
3020
+ return min((dst >>> 24) + a, 0xFF) << 24
3021
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
3022
+ | ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
3070
3023
  }
3071
3024
 
3072
-
3073
3025
  /**
3074
- * Burn
3075
- * O = 1 - (1 - A) / B
3026
+ * Burn O = 1 - (1 - A) / B
3076
3027
  */
3077
3028
  private static int blend_burn(int dst, int src) {
3078
3029
  int a = src >>> 24;
@@ -3080,27 +3031,23 @@ int testFunction(int dst, int src) {
3080
3031
  int s_a = a + (a >= 0x7F ? 1 : 0);
3081
3032
  int d_a = 0x100 - s_a;
3082
3033
 
3083
- int r = ((0xFF0000 - (dst & RED_MASK))) / (1 + (src & RED_MASK >> 16));
3034
+ int r = ((0xFF0000 - (dst & RED_MASK))) / (1 + (src & RED_MASK >> 16));
3084
3035
  int g = ((0x00FF00 - (dst & GREEN_MASK)) << 8) / (1 + (src & GREEN_MASK >> 8));
3085
- int b = ((0x0000FF - (dst & BLUE_MASK)) << 8) / (1 + (src & BLUE_MASK));
3036
+ int b = ((0x0000FF - (dst & BLUE_MASK)) << 8) / (1 + (src & BLUE_MASK));
3086
3037
 
3087
- int rb = RB_MASK -
3088
- (r > 0xFF00 ? 0xFF0000 : ((r << 8) & RED_MASK)) -
3089
- (b > 0x00FF ? 0x0000FF : b);
3090
- int gn = GN_MASK -
3091
- (g > 0xFF00 ? 0x00FF00 : (g & GREEN_MASK));
3038
+ int rb = RB_MASK
3039
+ - (r > 0xFF00 ? 0xFF0000 : ((r << 8) & RED_MASK))
3040
+ - (b > 0x00FF ? 0x0000FF : b);
3041
+ int gn = GN_MASK
3042
+ - (g > 0xFF00 ? 0x00FF00 : (g & GREEN_MASK));
3092
3043
 
3093
- return min((dst >>> 24) + a, 0xFF) << 24 |
3094
- ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK |
3095
- ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
3044
+ return min((dst >>> 24) + a, 0xFF) << 24
3045
+ | ((dst & RB_MASK) * d_a + rb * s_a) >>> 8 & RB_MASK
3046
+ | ((dst & GN_MASK) * d_a + gn * s_a) >>> 8 & GN_MASK;
3096
3047
  }
3097
3048
 
3098
-
3099
3049
  //////////////////////////////////////////////////////////////
3100
-
3101
3050
  // FILE I/O
3102
-
3103
-
3104
3051
  static byte TIFF_HEADER[] = {
3105
3052
  77, 77, 0, 42, 0, 0, 0, 8, 0, 9, 0, -2, 0, 4, 0, 0, 0, 1, 0, 0,
3106
3053
  0, 0, 1, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 3, 0, 0, 0, 1,
@@ -3110,42 +3057,44 @@ int testFunction(int dst, int src) {
3110
3057
  1, 23, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8
3111
3058
  };
3112
3059
 
3060
+ static final String TIFF_ERROR
3061
+ = "Error: Processing can only read its own TIFF files.";
3113
3062
 
3114
- static final String TIFF_ERROR =
3115
- "Error: Processing can only read its own TIFF files.";
3116
-
3117
- /**
3118
- *
3119
- * @param tiff
3120
- * @return
3121
- */
3122
- static protected PImage loadTIFF(byte tiff[]) {
3123
- if ((tiff[42] != tiff[102]) || // width/height in both places
3124
- (tiff[43] != tiff[103])) {
3063
+ /**
3064
+ *
3065
+ * @param tiff
3066
+ * @return
3067
+ */
3068
+ static protected PImage loadTIFF(byte tiff[]) {
3069
+ if ((tiff[42] != tiff[102])
3070
+ || // width/height in both places
3071
+ (tiff[43] != tiff[103])) {
3125
3072
  System.err.println(TIFF_ERROR);
3126
3073
  return null;
3127
3074
  }
3128
3075
 
3129
- int width =
3130
- ((tiff[30] & 0xff) << 8) | (tiff[31] & 0xff);
3131
- int height =
3132
- ((tiff[42] & 0xff) << 8) | (tiff[43] & 0xff);
3076
+ int width
3077
+ = ((tiff[30] & 0xff) << 8) | (tiff[31] & 0xff);
3078
+ int height
3079
+ = ((tiff[42] & 0xff) << 8) | (tiff[43] & 0xff);
3133
3080
 
3134
- int count =
3135
- ((tiff[114] & 0xff) << 24) |
3136
- ((tiff[115] & 0xff) << 16) |
3137
- ((tiff[116] & 0xff) << 8) |
3138
- (tiff[117] & 0xff);
3081
+ int count
3082
+ = ((tiff[114] & 0xff) << 24)
3083
+ | ((tiff[115] & 0xff) << 16)
3084
+ | ((tiff[116] & 0xff) << 8)
3085
+ | (tiff[117] & 0xff);
3139
3086
  if (count != width * height * 3) {
3140
- System.err.println(TIFF_ERROR + " (" + width + ", " + height +")");
3087
+ System.err.println(TIFF_ERROR + " (" + width + ", " + height + ")");
3141
3088
  return null;
3142
3089
  }
3143
3090
 
3144
3091
  // check the rest of the header
3145
3092
  for (int i = 0; i < TIFF_HEADER.length; i++) {
3146
- if ((i == 30) || (i == 31) || (i == 42) || (i == 43) ||
3147
- (i == 102) || (i == 103) ||
3148
- (i == 114) || (i == 115) || (i == 116) || (i == 117)) continue;
3093
+ if ((i == 30) || (i == 31) || (i == 42) || (i == 43)
3094
+ || (i == 102) || (i == 103)
3095
+ || (i == 114) || (i == 115) || (i == 116) || (i == 117)) {
3096
+ continue;
3097
+ }
3149
3098
 
3150
3099
  if (tiff[i] != TIFF_HEADER[i]) {
3151
3100
  System.err.println(TIFF_ERROR + " (" + i + ")");
@@ -3157,28 +3106,28 @@ int testFunction(int dst, int src) {
3157
3106
  int index = 768;
3158
3107
  count /= 3;
3159
3108
  for (int i = 0; i < count; i++) {
3160
- outgoing.pixels[i] =
3161
- 0xFF000000 |
3162
- (tiff[index++] & 0xff) << 16 |
3163
- (tiff[index++] & 0xff) << 8 |
3164
- (tiff[index++] & 0xff);
3109
+ outgoing.pixels[i]
3110
+ = 0xFF000000
3111
+ | (tiff[index++] & 0xff) << 16
3112
+ | (tiff[index++] & 0xff) << 8
3113
+ | (tiff[index++] & 0xff);
3165
3114
  }
3166
3115
  return outgoing;
3167
3116
  }
3168
3117
 
3169
- /**
3170
- *
3171
- * @param output
3172
- * @return
3173
- */
3174
- protected boolean saveTIFF(OutputStream output) {
3118
+ /**
3119
+ *
3120
+ * @param output
3121
+ * @return
3122
+ */
3123
+ protected boolean saveTIFF(OutputStream output) {
3175
3124
  // shutting off the warning, people can figure this out themselves
3176
3125
  /*
3177
3126
  if (format != RGB) {
3178
3127
  System.err.println("Warning: only RGB information is saved with " +
3179
3128
  ".tif files. Use .tga or .png for ARGB images and others.");
3180
3129
  }
3181
- */
3130
+ */
3182
3131
  try {
3183
3132
  byte tiff[] = new byte[768];
3184
3133
  System.arraycopy(TIFF_HEADER, 0, tiff, 0, TIFF_HEADER.length);
@@ -3188,7 +3137,7 @@ int testFunction(int dst, int src) {
3188
3137
  tiff[42] = tiff[102] = (byte) ((pixelHeight >> 8) & 0xff);
3189
3138
  tiff[43] = tiff[103] = (byte) ((pixelHeight) & 0xff);
3190
3139
 
3191
- int count = pixelWidth*pixelHeight*3;
3140
+ int count = pixelWidth * pixelHeight * 3;
3192
3141
  tiff[114] = (byte) ((count >> 24) & 0xff);
3193
3142
  tiff[115] = (byte) ((count >> 16) & 0xff);
3194
3143
  tiff[116] = (byte) ((count >> 8) & 0xff);
@@ -3211,13 +3160,12 @@ int testFunction(int dst, int src) {
3211
3160
  return false;
3212
3161
  }
3213
3162
 
3214
-
3215
3163
  /**
3216
- * Creates a Targa32 formatted byte sequence of specified
3217
- * pixel buffer using RLE compression.
3164
+ * Creates a Targa32 formatted byte sequence of specified pixel buffer using
3165
+ * RLE compression.
3218
3166
  * </p>
3219
- * Also figured out how to avoid parsing the image upside-down
3220
- * (there's a header flag to set the image origin to top-left)
3167
+ * Also figured out how to avoid parsing the image upside-down (there's a
3168
+ * header flag to set the image origin to top-left)
3221
3169
  * </p>
3222
3170
  * Starting with revision 0092, the format setting is taken into account:
3223
3171
  * <UL>
@@ -3229,161 +3177,170 @@ int testFunction(int dst, int src) {
3229
3177
  * </p>
3230
3178
  * Contributed by toxi 8-10 May 2005, based on this RLE
3231
3179
  * <A HREF="http://www.wotsit.org/download.asp?f=tga">specification</A>
3232
- * @param output
3233
- * @return
3180
+ *
3181
+ * @param output
3182
+ * @return
3234
3183
  */
3235
3184
  protected boolean saveTGA(OutputStream output) {
3236
3185
  byte header[] = new byte[18];
3237
3186
 
3238
- if (format == ALPHA) { // save ALPHA images as 8bit grayscale
3239
- header[2] = 0x0B;
3240
- header[16] = 0x08;
3241
- header[17] = 0x28;
3242
-
3243
- } else if (format == RGB) {
3244
- header[2] = 0x0A;
3245
- header[16] = 24;
3246
- header[17] = 0x20;
3247
-
3248
- } else if (format == ARGB) {
3249
- header[2] = 0x0A;
3250
- header[16] = 32;
3251
- header[17] = 0x28;
3252
-
3253
- } else {
3254
- throw new RuntimeException("Image format not recognized inside save()");
3255
- }
3256
- // set image dimensions lo-hi byte order
3257
- header[12] = (byte) (pixelWidth & 0xff);
3258
- header[13] = (byte) (pixelWidth >> 8);
3259
- header[14] = (byte) (pixelHeight & 0xff);
3260
- header[15] = (byte) (pixelHeight >> 8);
3261
-
3262
- try {
3263
- output.write(header);
3264
-
3265
- int maxLen = pixelHeight * pixelWidth;
3266
- int index = 0;
3267
- int col; //, prevCol;
3268
- int[] currChunk = new int[128];
3269
-
3270
- // 8bit image exporter is in separate loop
3271
- // to avoid excessive conditionals...
3272
- if (format == ALPHA) {
3273
- while (index < maxLen) {
3274
- boolean isRLE = false;
3275
- int rle = 1;
3276
- currChunk[0] = col = pixels[index] & 0xff;
3277
- while (index + rle < maxLen) {
3278
- if (col != (pixels[index + rle]&0xff) || rle == 128) {
3279
- isRLE = (rle > 1);
3280
- break;
3281
- }
3282
- rle++;
3283
- }
3284
- if (isRLE) {
3285
- output.write(0x80 | (rle - 1));
3286
- output.write(col);
3287
-
3288
- } else {
3289
- rle = 1;
3290
- while (index + rle < maxLen) {
3291
- int cscan = pixels[index + rle] & 0xff;
3292
- if ((col != cscan && rle < 128) || rle < 3) {
3293
- currChunk[rle] = col = cscan;
3294
- } else {
3295
- if (col == cscan) rle -= 2;
3296
- break;
3297
- }
3298
- rle++;
3299
- }
3300
- output.write(rle - 1);
3301
- for (int i = 0; i < rle; i++) output.write(currChunk[i]);
3302
- }
3303
- index += rle;
3304
- }
3305
- } else { // export 24/32 bit TARGA
3306
- while (index < maxLen) {
3307
- boolean isRLE = false;
3308
- currChunk[0] = col = pixels[index];
3309
- int rle = 1;
3310
- // try to find repeating bytes (min. len = 2 pixels)
3311
- // maximum chunk size is 128 pixels
3312
- while (index + rle < maxLen) {
3313
- if (col != pixels[index + rle] || rle == 128) {
3314
- isRLE = (rle > 1); // set flag for RLE chunk
3315
- break;
3316
- }
3317
- rle++;
3318
- }
3319
- if (isRLE) {
3320
- output.write(128 | (rle - 1));
3321
- output.write(col & 0xff);
3322
- output.write(col >> 8 & 0xff);
3323
- output.write(col >> 16 & 0xff);
3324
- if (format == ARGB) output.write(col >>> 24 & 0xff);
3325
-
3326
- } else { // not RLE
3327
- rle = 1;
3328
- while (index + rle < maxLen) {
3329
- if ((col != pixels[index + rle] && rle < 128) || rle < 3) {
3330
- currChunk[rle] = col = pixels[index + rle];
3331
- } else {
3332
- // check if the exit condition was the start of
3333
- // a repeating colour
3334
- if (col == pixels[index + rle]) rle -= 2;
3335
- break;
3336
- }
3337
- rle++;
3338
- }
3339
- // write uncompressed chunk
3340
- output.write(rle - 1);
3341
- if (format == ARGB) {
3342
- for (int i = 0; i < rle; i++) {
3343
- col = currChunk[i];
3344
- output.write(col & 0xff);
3345
- output.write(col >> 8 & 0xff);
3346
- output.write(col >> 16 & 0xff);
3347
- output.write(col >>> 24 & 0xff);
3348
- }
3349
- } else {
3350
- for (int i = 0; i < rle; i++) {
3351
- col = currChunk[i];
3352
- output.write(col & 0xff);
3353
- output.write(col >> 8 & 0xff);
3354
- output.write(col >> 16 & 0xff);
3355
- }
3356
- }
3357
- }
3358
- index += rle;
3359
- }
3360
- }
3361
- output.flush();
3362
- return true;
3363
-
3364
- } catch (IOException e) {
3365
- e.printStackTrace();
3366
- return false;
3367
- }
3368
- }
3369
-
3370
-
3371
- /**
3372
- * Use ImageIO functions from Java 1.4 and later to handle image save.
3373
- * Various formats are supported, typically jpeg, png, bmp, and wbmp.
3374
- * To get a list of the supported formats for writing, use: <BR>
3187
+ if (format == ALPHA) { // save ALPHA images as 8bit grayscale
3188
+ header[2] = 0x0B;
3189
+ header[16] = 0x08;
3190
+ header[17] = 0x28;
3191
+
3192
+ } else if (format == RGB) {
3193
+ header[2] = 0x0A;
3194
+ header[16] = 24;
3195
+ header[17] = 0x20;
3196
+
3197
+ } else if (format == ARGB) {
3198
+ header[2] = 0x0A;
3199
+ header[16] = 32;
3200
+ header[17] = 0x28;
3201
+
3202
+ } else {
3203
+ throw new RuntimeException("Image format not recognized inside save()");
3204
+ }
3205
+ // set image dimensions lo-hi byte order
3206
+ header[12] = (byte) (pixelWidth & 0xff);
3207
+ header[13] = (byte) (pixelWidth >> 8);
3208
+ header[14] = (byte) (pixelHeight & 0xff);
3209
+ header[15] = (byte) (pixelHeight >> 8);
3210
+
3211
+ try {
3212
+ output.write(header);
3213
+
3214
+ int maxLen = pixelHeight * pixelWidth;
3215
+ int index = 0;
3216
+ int col; //, prevCol;
3217
+ int[] currChunk = new int[128];
3218
+
3219
+ // 8bit image exporter is in separate loop
3220
+ // to avoid excessive conditionals...
3221
+ if (format == ALPHA) {
3222
+ while (index < maxLen) {
3223
+ boolean isRLE = false;
3224
+ int rle = 1;
3225
+ currChunk[0] = col = pixels[index] & 0xff;
3226
+ while (index + rle < maxLen) {
3227
+ if (col != (pixels[index + rle] & 0xff) || rle == 128) {
3228
+ isRLE = (rle > 1);
3229
+ break;
3230
+ }
3231
+ rle++;
3232
+ }
3233
+ if (isRLE) {
3234
+ output.write(0x80 | (rle - 1));
3235
+ output.write(col);
3236
+
3237
+ } else {
3238
+ rle = 1;
3239
+ while (index + rle < maxLen) {
3240
+ int cscan = pixels[index + rle] & 0xff;
3241
+ if ((col != cscan && rle < 128) || rle < 3) {
3242
+ currChunk[rle] = col = cscan;
3243
+ } else {
3244
+ if (col == cscan) {
3245
+ rle -= 2;
3246
+ }
3247
+ break;
3248
+ }
3249
+ rle++;
3250
+ }
3251
+ output.write(rle - 1);
3252
+ for (int i = 0; i < rle; i++) {
3253
+ output.write(currChunk[i]);
3254
+ }
3255
+ }
3256
+ index += rle;
3257
+ }
3258
+ } else { // export 24/32 bit TARGA
3259
+ while (index < maxLen) {
3260
+ boolean isRLE = false;
3261
+ currChunk[0] = col = pixels[index];
3262
+ int rle = 1;
3263
+ // try to find repeating bytes (min. len = 2 pixels)
3264
+ // maximum chunk size is 128 pixels
3265
+ while (index + rle < maxLen) {
3266
+ if (col != pixels[index + rle] || rle == 128) {
3267
+ isRLE = (rle > 1); // set flag for RLE chunk
3268
+ break;
3269
+ }
3270
+ rle++;
3271
+ }
3272
+ if (isRLE) {
3273
+ output.write(128 | (rle - 1));
3274
+ output.write(col & 0xff);
3275
+ output.write(col >> 8 & 0xff);
3276
+ output.write(col >> 16 & 0xff);
3277
+ if (format == ARGB) {
3278
+ output.write(col >>> 24 & 0xff);
3279
+ }
3280
+
3281
+ } else { // not RLE
3282
+ rle = 1;
3283
+ while (index + rle < maxLen) {
3284
+ if ((col != pixels[index + rle] && rle < 128) || rle < 3) {
3285
+ currChunk[rle] = col = pixels[index + rle];
3286
+ } else {
3287
+ // check if the exit condition was the start of
3288
+ // a repeating colour
3289
+ if (col == pixels[index + rle]) {
3290
+ rle -= 2;
3291
+ }
3292
+ break;
3293
+ }
3294
+ rle++;
3295
+ }
3296
+ // write uncompressed chunk
3297
+ output.write(rle - 1);
3298
+ if (format == ARGB) {
3299
+ for (int i = 0; i < rle; i++) {
3300
+ col = currChunk[i];
3301
+ output.write(col & 0xff);
3302
+ output.write(col >> 8 & 0xff);
3303
+ output.write(col >> 16 & 0xff);
3304
+ output.write(col >>> 24 & 0xff);
3305
+ }
3306
+ } else {
3307
+ for (int i = 0; i < rle; i++) {
3308
+ col = currChunk[i];
3309
+ output.write(col & 0xff);
3310
+ output.write(col >> 8 & 0xff);
3311
+ output.write(col >> 16 & 0xff);
3312
+ }
3313
+ }
3314
+ }
3315
+ index += rle;
3316
+ }
3317
+ }
3318
+ output.flush();
3319
+ return true;
3320
+
3321
+ } catch (IOException e) {
3322
+ e.printStackTrace();
3323
+ return false;
3324
+ }
3325
+ }
3326
+
3327
+ /**
3328
+ * Use ImageIO functions from Java 1.4 and later to handle image save. Various
3329
+ * formats are supported, typically jpeg, png, bmp, and wbmp. To get a list of
3330
+ * the supported formats for writing, use: <BR>
3375
3331
  * <TT>println(javax.imageio.ImageIO.getReaderFormatNames())</TT>
3376
- * @param path
3377
- * @return
3378
- * @throws java.io.IOException
3332
+ *
3333
+ * @param path
3334
+ * @return
3335
+ * @throws java.io.IOException
3379
3336
  */
3380
3337
  protected boolean saveImageIO(String path) throws IOException {
3381
3338
  try {
3382
- int outputFormat = (format == ARGB) ?
3383
- BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
3339
+ int outputFormat = (format == ARGB)
3340
+ ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
3384
3341
 
3385
- String extension =
3386
- path.substring(path.lastIndexOf('.') + 1).toLowerCase();
3342
+ String extension
3343
+ = path.substring(path.lastIndexOf('.') + 1).toLowerCase();
3387
3344
 
3388
3345
  // JPEG and BMP images that have an alpha channel set get pretty unhappy.
3389
3346
  // BMP just doesn't write, and JPEG writes it as a CMYK image.
@@ -3423,8 +3380,8 @@ int testFunction(int dst, int src) {
3423
3380
  }
3424
3381
 
3425
3382
  if (writer != null) {
3426
- BufferedOutputStream output =
3427
- new BufferedOutputStream(PApplet.createOutput(file));
3383
+ BufferedOutputStream output
3384
+ = new BufferedOutputStream(PApplet.createOutput(file));
3428
3385
  writer.setOutput(ImageIO.createImageOutputStream(output));
3429
3386
  // writer.write(null, new IIOImage(bimage, null, null), param);
3430
3387
  writer.write(metadata, new IIOImage(bimage, null, metadata), param);
@@ -3443,7 +3400,6 @@ int testFunction(int dst, int src) {
3443
3400
  }
3444
3401
  }
3445
3402
 
3446
-
3447
3403
  private ImageWriter imageioWriter(String extension) {
3448
3404
  Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(extension);
3449
3405
  if (iter.hasNext()) {
@@ -3452,13 +3408,12 @@ int testFunction(int dst, int src) {
3452
3408
  return null;
3453
3409
  }
3454
3410
 
3455
-
3456
3411
  private IIOMetadata imageioDPI(ImageWriter writer, ImageWriteParam param, double dpi) {
3457
3412
  // http://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image
3458
- ImageTypeSpecifier typeSpecifier =
3459
- ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
3460
- IIOMetadata metadata =
3461
- writer.getDefaultImageMetadata(typeSpecifier, param);
3413
+ ImageTypeSpecifier typeSpecifier
3414
+ = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
3415
+ IIOMetadata metadata
3416
+ = writer.getDefaultImageMetadata(typeSpecifier, param);
3462
3417
 
3463
3418
  if (!metadata.isReadOnly() && metadata.isStandardMetadataFormatSupported()) {
3464
3419
  // for PNG, it's dots per millimeter
@@ -3489,53 +3444,52 @@ int testFunction(int dst, int src) {
3489
3444
  return null;
3490
3445
  }
3491
3446
 
3492
- /**
3493
- *
3494
- */
3495
- protected String[] saveImageFormats;
3447
+ /**
3448
+ *
3449
+ */
3450
+ protected String[] saveImageFormats;
3496
3451
 
3497
3452
  /**
3498
3453
  * ( begin auto-generated from PImage_save.xml )
3499
3454
  *
3500
- * Saves the image into a file. Append a file extension to the name of
3501
- * the file, to indicate the file format to be used: either TIFF (.tif),
3502
- * TARGA (.tga), JPEG (.jpg), or PNG (.png). If no extension is included
3503
- * in the filename, the image will save in TIFF format and .tif will be
3504
- * added to the name. These files are saved to the sketch's folder, which
3505
- * may be opened by selecting "Show sketch folder" from the "Sketch" menu.
3506
- * <br /><br />To save an image created within the code, rather
3507
- * than through loading, it's necessary to make the image with the
3508
- * <b>createImage()</b> function so it is aware of the location of the
3509
- * program and can therefore save the file to the right place. See the
3455
+ * Saves the image into a file. Append a file extension to the name of the
3456
+ * file, to indicate the file format to be used: either TIFF (.tif), TARGA
3457
+ * (.tga), JPEG (.jpg), or PNG (.png). If no extension is included in the
3458
+ * filename, the image will save in TIFF format and .tif will be added to the
3459
+ * name. These files are saved to the sketch's folder, which may be opened by
3460
+ * selecting "Show sketch folder" from the "Sketch" menu.
3461
+ * To save an image created within the code, rather than through
3462
+ * loading, it's necessary to make the image with the
3463
+ * <b>createImage()</b> function so it is aware of the location of the program
3464
+ * and can therefore save the file to the right place. See the
3510
3465
  * <b>createImage()</b> reference for more information.
3511
3466
  *
3512
3467
  * ( end auto-generated )
3513
3468
  * <h3>Advanced</h3>
3514
3469
  * Save this image to disk.
3515
3470
  * <p>
3516
- * As of revision 0100, this function requires an absolute path,
3517
- * in order to avoid confusion. To save inside the sketch folder,
3518
- * use the function savePath() from PApplet, or use saveFrame() instead.
3519
- * As of revision 0116, savePath() is not needed if this object has been
3520
- * created (as recommended) via createImage() or createGraphics() or
3521
- * one of its neighbors.
3471
+ * As of revision 0100, this function requires an absolute path, in order to
3472
+ * avoid confusion. To save inside the sketch folder, use the function
3473
+ * savePath() from PApplet, or use saveFrame() instead. As of revision 0116,
3474
+ * savePath() is not needed if this object has been created (as recommended)
3475
+ * via createImage() or createGraphics() or one of its neighbors.
3522
3476
  * <p>
3523
- * As of revision 0115, when using Java 1.4 and later, you can write
3524
- * to several formats besides tga and tiff. If Java 1.4 is installed
3525
- * and the extension used is supported (usually png, jpg, jpeg, bmp,
3526
- * and tiff), then those methods will be used to write the image.
3527
- * To get a list of the supported formats for writing, use: <BR>
3477
+ * As of revision 0115, when using Java 1.4 and later, you can write to
3478
+ * several formats besides tga and tiff. If Java 1.4 is installed and the
3479
+ * extension used is supported (usually png, jpg, jpeg, bmp, and tiff), then
3480
+ * those methods will be used to write the image. To get a list of the
3481
+ * supported formats for writing, use: <BR>
3528
3482
  * <TT>println(javax.imageio.ImageIO.getReaderFormatNames())</TT>
3529
3483
  * <p>
3530
3484
  * To use the original built-in image writers, use .tga or .tif as the
3531
- * extension, or don't include an extension. When no extension is used,
3532
- * the extension .tif will be added to the file name.
3485
+ * extension, or don't include an extension. When no extension is used, the
3486
+ * extension .tif will be added to the file name.
3533
3487
  * <p>
3534
- * The ImageIO API claims to support wbmp files, however they probably
3535
- * require a black and white image. Basic testing produced a zero-length
3536
- * file with no error.
3488
+ * The ImageIO API claims to support wbmp files, however they probably require
3489
+ * a black and white image. Basic testing produced a zero-length file with no
3490
+ * error.
3537
3491
  *
3538
- * @return
3492
+ * @return
3539
3493
  * @webref pimage:method
3540
3494
  * @brief Saves the image to a TIFF, TARGA, PNG, or JPEG file
3541
3495
  * @usage application
@@ -3554,9 +3508,9 @@ int testFunction(int dst, int src) {
3554
3508
  // make sure that the intermediate folders have been created
3555
3509
  PApplet.createPath(file);
3556
3510
  } else {
3557
- String msg =
3558
- "PImage.save() requires an absolute path. " +
3559
- "Use createImage(), or pass savePath() to save().";
3511
+ String msg
3512
+ = "PImage.save() requires an absolute path. "
3513
+ + "Use createImage(), or pass savePath() to save().";
3560
3514
  PGraphics.showException(msg);
3561
3515
  }
3562
3516
  }
@@ -3587,8 +3541,8 @@ int testFunction(int dst, int src) {
3587
3541
  success = saveTGA(os); //, pixels, width, height, format);
3588
3542
 
3589
3543
  } else {
3590
- if (!filename.toLowerCase().endsWith(".tif") &&
3591
- !filename.toLowerCase().endsWith(".tiff")) {
3544
+ if (!filename.toLowerCase().endsWith(".tif")
3545
+ && !filename.toLowerCase().endsWith(".tiff")) {
3592
3546
  // if no .tif extension, add it..
3593
3547
  filename += ".tif";
3594
3548
  }