picrate 2.1.2-java → 2.4.2-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.
- checksums.yaml +4 -4
- data/.mvn/extensions.xml +1 -1
- data/CHANGELOG.md +8 -0
- data/README.md +3 -2
- data/Rakefile +2 -1
- data/docs/_includes/footer.html +1 -1
- data/docs/_layouts/post.html +1 -1
- data/docs/_methods/noise_mode.md +88 -0
- data/docs/_posts/2018-05-06-install_jruby.md +1 -1
- data/docs/_posts/2018-11-18-building-gem.md +3 -1
- data/docs/classes.md +2 -2
- data/docs/editors.md +2 -2
- data/docs/gems.md +3 -3
- data/docs/index.html +1 -1
- data/docs/libraries.md +2 -2
- data/docs/live.md +2 -2
- data/docs/magic.md +2 -2
- data/docs/methods.md +2 -2
- data/docs/modules.md +3 -3
- data/docs/objects.md +2 -2
- data/lib/picrate/app.rb +7 -6
- data/lib/picrate/native_folder.rb +1 -3
- data/lib/picrate/version.rb +1 -1
- data/library/pdf/pdf.rb +7 -0
- data/library/svg/svg.rb +7 -0
- data/picrate.gemspec +5 -3
- data/pom.rb +25 -4
- data/pom.xml +39 -4
- data/src/main/java/monkstone/FastNoiseModuleJava.java +127 -0
- data/src/main/java/monkstone/PicrateLibrary.java +3 -1
- data/src/main/java/monkstone/SmoothNoiseModuleJava.java +127 -0
- data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
- data/src/main/java/monkstone/fastmath/Deglut.java +41 -93
- data/src/main/java/monkstone/noise/OpenSimplex2F.java +914 -0
- data/src/main/java/monkstone/noise/OpenSimplex2S.java +1138 -0
- data/src/main/java/monkstone/vecmath/package-info.java +1 -1
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
- data/src/main/java/monkstone/videoevent/package-info.java +1 -1
- data/src/main/java/processing/awt/ShimAWT.java +260 -94
- data/src/main/java/processing/core/PApplet.java +14664 -13450
- data/src/main/java/processing/core/PConstants.java +5 -5
- data/src/main/java/processing/core/PFont.java +1 -1
- data/src/main/java/processing/core/PGraphics.java +200 -201
- data/src/main/java/processing/core/PImage.java +539 -549
- data/src/main/java/processing/core/PShape.java +18 -18
- data/src/main/java/processing/core/PVector.java +23 -23
- data/src/main/java/processing/data/Table.java +4 -4
- data/src/main/java/processing/net/Client.java +13 -13
- data/src/main/java/processing/net/Server.java +5 -5
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +4 -4
- data/src/main/java/processing/pdf/PGraphicsPDF.java +529 -0
- data/src/main/java/processing/svg/PGraphicsSVG.java +378 -0
- data/test/deglut_spec_test.rb +2 -2
- data/test/respond_to_test.rb +0 -2
- data/test/test_helper.rb +1 -1
- data/vendors/Rakefile +1 -1
- metadata +26 -15
- data/src/main/java/monkstone/noise/SimplexNoise.java +0 -465
| @@ -31,27 +31,30 @@ import java.io.IOException; | |
| 31 31 | 
             
            import java.io.InputStream;
         | 
| 32 32 | 
             
            import java.io.OutputStream;
         | 
| 33 33 |  | 
| 34 | 
            +
            import processing.awt.ShimAWT;
         | 
| 35 | 
            +
             | 
| 34 36 |  | 
| 35 37 | 
             
            /**
         | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 38 | 
            +
             *
         | 
| 39 | 
            +
             * Datatype for storing images. Processing can display <b>.gif</b>, <b>.jpg</b>,
         | 
| 40 | 
            +
             * <b>.tga</b>, and <b>.png</b> images. Images may be displayed in 2D and 3D
         | 
| 41 | 
            +
             * space. Before an image is used, it must be loaded with the <b>loadImage()</b>
         | 
| 42 | 
            +
             * function. The <b>PImage</b> class contains fields for the <b>width</b> and
         | 
| 43 | 
            +
             * <b>height</b> of the image, as well as an array called <b>pixels[]</b> that
         | 
| 44 | 
            +
             * contains the values for every pixel in the image. The methods described below
         | 
| 45 | 
            +
             * allow easy access to the image's pixels and alpha channel and simplify the
         | 
| 46 | 
            +
             * process of compositing.<br />
         | 
| 47 | 
            +
             * <br />
         | 
| 48 | 
            +
             * Before using the <b>pixels[]</b> array, be sure to use the
         | 
| 49 | 
            +
             * <b>loadPixels()</b> method on the image to make sure that the pixel data is
         | 
| 50 | 
            +
             * properly loaded.<br />
         | 
| 51 | 
            +
             * <br />
         | 
| 52 | 
            +
             * To create a new image, use the <b>createImage()</b> function. Do not use the
         | 
| 53 | 
            +
             * syntax <b>new PImage()</b>.
         | 
| 54 | 
            +
             *
         | 
| 55 | 
            +
             *
         | 
| 54 56 | 
             
             * @webref image
         | 
| 57 | 
            +
             * @webBrief Datatype for storing images.
         | 
| 55 58 | 
             
             * @usage Web & Application
         | 
| 56 59 | 
             
             * @instanceName pimg any object of type PImage
         | 
| 57 60 | 
             
             * @see PApplet#loadImage(String)
         | 
| @@ -60,7 +63,7 @@ import java.io.OutputStream; | |
| 60 63 | 
             
             */
         | 
| 61 64 | 
             
            public class PImage implements PConstants, Cloneable {
         | 
| 62 65 |  | 
| 63 | 
            -
              private static final byte | 
| 66 | 
            +
              private static final byte[] TIFF_HEADER = {
         | 
| 64 67 | 
             
                77, 77, 0, 42, 0, 0, 0, 8, 0, 9, 0, -2, 0, 4, 0, 0, 0, 1, 0, 0,
         | 
| 65 68 | 
             
                0, 0, 1, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 3, 0, 0, 0, 1,
         | 
| 66 69 | 
             
                0, 0, 0, 0, 1, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 122, 1, 6, 0, 3, 0,
         | 
| @@ -79,28 +82,22 @@ public class PImage implements PConstants, Cloneable { | |
| 79 82 | 
             
              public int format;
         | 
| 80 83 |  | 
| 81 84 | 
             
              /**
         | 
| 82 | 
            -
               * ( begin auto-generated from pixels.xml )
         | 
| 83 | 
            -
               *
         | 
| 84 | 
            -
               * Array containing the values for all the pixels in the display window.
         | 
| 85 | 
            -
               * These values are of the color datatype. This array is the size of the
         | 
| 86 | 
            -
               * display window. For example, if the image is 100x100 pixels, there will
         | 
| 87 | 
            -
               * be 10000 values and if the window is 200x300 pixels, there will be 60000
         | 
| 88 | 
            -
               * values. The <b>index</b> value defines the position of a value within
         | 
| 89 | 
            -
               * the array. For example, the statement <b>color b = pixels[230]</b> will
         | 
| 90 | 
            -
               * set the variable <b>b</b> to be equal to the value at that location in
         | 
| 91 | 
            -
               * the array.
         | 
| 92 85 | 
             
               *
         | 
| 86 | 
            +
               * The pixels[] array contains the values for all the pixels in the image. These
         | 
| 87 | 
            +
               * values are of the color datatype. This array is the size of the image,
         | 
| 88 | 
            +
               * meaning if the image is 100 x 100 pixels, there will be 10,000 values and if
         | 
| 89 | 
            +
               * the window is 200 x 300 pixels, there will be 60,000 values. <br />
         | 
| 90 | 
            +
               * <br />
         | 
| 93 91 | 
             
               * Before accessing this array, the data must loaded with the
         | 
| 94 | 
            -
               * <b>loadPixels()</b>  | 
| 95 | 
            -
               *  | 
| 96 | 
            -
               *  | 
| 97 | 
            -
               *  | 
| 92 | 
            +
               * <b>loadPixels()</b> method. Failure to do so may result in a
         | 
| 93 | 
            +
               * NullPointerException. After the array data has been modified, the
         | 
| 94 | 
            +
               * <b>updatePixels()</b> method must be run to update the content of the display
         | 
| 95 | 
            +
               * window.
         | 
| 98 96 | 
             
               *
         | 
| 99 | 
            -
               * ( end auto-generated )
         | 
| 100 97 | 
             
               *
         | 
| 101 98 | 
             
               * @webref image:pixels
         | 
| 99 | 
            +
               * @webBrief Array containing the color of every pixel in the image.
         | 
| 102 100 | 
             
               * @usage web_application
         | 
| 103 | 
            -
               * @brief     Array containing the color of every pixel in the image
         | 
| 104 101 | 
             
               */
         | 
| 105 102 | 
             
              public int[] pixels;
         | 
| 106 103 |  | 
| @@ -112,26 +109,22 @@ public class PImage implements PConstants, Cloneable { | |
| 112 109 | 
             
              public int pixelHeight;
         | 
| 113 110 |  | 
| 114 111 | 
             
              /**
         | 
| 115 | 
            -
               * ( begin auto-generated from PImage_width.xml )
         | 
| 116 112 | 
             
               *
         | 
| 117 113 | 
             
               * The width of the image in units of pixels.
         | 
| 118 114 | 
             
               *
         | 
| 119 | 
            -
               * ( end auto-generated )
         | 
| 120 115 | 
             
               * @webref pimage:field
         | 
| 116 | 
            +
               * @webBrief The width of the image in units of pixels.
         | 
| 121 117 | 
             
               * @usage web_application
         | 
| 122 | 
            -
               * @brief     Image width
         | 
| 123 118 | 
             
               */
         | 
| 124 119 | 
             
              public int width;
         | 
| 125 120 |  | 
| 126 121 | 
             
              /**
         | 
| 127 | 
            -
               * ( begin auto-generated from PImage_height.xml )
         | 
| 128 122 | 
             
               *
         | 
| 129 123 | 
             
               * The height of the image in units of pixels.
         | 
| 130 124 | 
             
               *
         | 
| 131 | 
            -
               * ( end auto-generated )
         | 
| 132 125 | 
             
               * @webref pimage:field
         | 
| 126 | 
            +
               * @webBrief The height of the image in units of pixels.
         | 
| 133 127 | 
             
               * @usage web_application
         | 
| 134 | 
            -
               * @brief     Image height
         | 
| 135 128 | 
             
               */
         | 
| 136 129 | 
             
              public int height;
         | 
| 137 130 |  | 
| @@ -155,14 +148,11 @@ public class PImage implements PConstants, Cloneable { | |
| 155 148 | 
             
              // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
         | 
| 156 149 |  | 
| 157 150 |  | 
| 158 | 
            -
               | 
| 159 | 
            -
              private int fracU, ifU, fracV, ifV, u1, u2, v1, v2, sX, sY, iw, iw1, ih1;
         | 
| 160 | 
            -
              private int ul, ll, ur, lr, cUL, cLL, cUR, cLR;
         | 
| 151 | 
            +
              private int ifV, sX, v1, v2, iw, iw1, ih1;
         | 
| 161 152 | 
             
              private int srcXOffset, srcYOffset;
         | 
| 162 | 
            -
              private int r, g, b, a;
         | 
| 163 153 | 
             
              private int[] srcBuffer;
         | 
| 164 154 |  | 
| 165 | 
            -
              // fixed point precision is limited to 15 bits | 
| 155 | 
            +
              // fixed point precision is limited to 15 bits
         | 
| 166 156 | 
             
              static final int PRECISIONB = 15;
         | 
| 167 157 | 
             
              static final int PRECISIONF = 1 << PRECISIONB;
         | 
| 168 158 | 
             
              static final int PREC_MAXVAL = PRECISIONF-1;
         | 
| @@ -197,14 +187,13 @@ public class PImage implements PConstants, Cloneable { | |
| 197 187 | 
             
               * pixel in the image. A group of methods, described below, allow easy
         | 
| 198 188 | 
             
               * access to the image's pixels and alpha channel and simplify the process
         | 
| 199 189 | 
             
               * of compositing.
         | 
| 200 | 
            -
               *
         | 
| 190 | 
            +
               * <br/> <br/>
         | 
| 201 191 | 
             
               * Before using the <b>pixels[]</b> array, be sure to use the
         | 
| 202 192 | 
             
               * <b>loadPixels()</b> method on the image to make sure that the pixel data
         | 
| 203 193 | 
             
               * is properly loaded.
         | 
| 204 | 
            -
               *
         | 
| 194 | 
            +
               * <br/> <br/>
         | 
| 205 195 | 
             
               * To create a new image, use the <b>createImage()</b> function (do not use
         | 
| 206 196 | 
             
               * <b>new PImage()</b>).
         | 
| 207 | 
            -
               * ( end auto-generated )
         | 
| 208 197 | 
             
               * @nowebref
         | 
| 209 198 | 
             
               * @usage web_application
         | 
| 210 199 | 
             
               * @see PApplet#loadImage(String, String)
         | 
| @@ -213,7 +202,6 @@ public class PImage implements PConstants, Cloneable { | |
| 213 202 | 
             
               */
         | 
| 214 203 | 
             
              public PImage() {
         | 
| 215 204 | 
             
                format = ARGB;  // default to ARGB images for release 0116
         | 
| 216 | 
            -
                pixelDensity = 1;
         | 
| 217 205 | 
             
              }
         | 
| 218 206 |  | 
| 219 207 |  | 
| @@ -228,7 +216,7 @@ public class PImage implements PConstants, Cloneable { | |
| 228 216 | 
             
                // toxi: is it maybe better to init the image with max alpha enabled?
         | 
| 229 217 | 
             
                //for(int i=0; i<pixels.length; i++) pixels[i]=0xffffffff;
         | 
| 230 218 | 
             
                // fry: i'm opting for the full transparent image, which is how
         | 
| 231 | 
            -
                // photoshop works, and our audience  | 
| 219 | 
            +
                // photoshop works, and our audience will likely be familiar with.
         | 
| 232 220 | 
             
                // also, i want to avoid having to set all those pixels since
         | 
| 233 221 | 
             
                // in java it's super slow, and most using this fxn will be
         | 
| 234 222 | 
             
                // setting all the pixels anyway.
         | 
| @@ -296,15 +284,10 @@ public class PImage implements PConstants, Cloneable { | |
| 296 284 |  | 
| 297 285 | 
             
              //////////////////////////////////////////////////////////////
         | 
| 298 286 |  | 
| 299 | 
            -
              public PImage(int width, int height, int[] pixels, boolean requiresCheckAlpha, PApplet parent) {
         | 
| 300 | 
            -
                initFromPixels(
         | 
| 301 | 
            -
                    width,
         | 
| 302 | 
            -
                    height,
         | 
| 303 | 
            -
                    pixels,
         | 
| 304 | 
            -
                    RGB,
         | 
| 305 | 
            -
                    1
         | 
| 306 | 
            -
                );
         | 
| 307 287 |  | 
| 288 | 
            +
              public PImage(int width, int height, int[] pixels,
         | 
| 289 | 
            +
                            boolean requiresCheckAlpha, PApplet parent) {
         | 
| 290 | 
            +
                initFromPixels(width, height, pixels, RGB,1);
         | 
| 308 291 | 
             
                this.parent = parent;
         | 
| 309 292 |  | 
| 310 293 | 
             
                if (requiresCheckAlpha) {
         | 
| @@ -312,7 +295,8 @@ public class PImage implements PConstants, Cloneable { | |
| 312 295 | 
             
                }
         | 
| 313 296 | 
             
              }
         | 
| 314 297 |  | 
| 315 | 
            -
              public PImage(int width, int height, int[] pixels, | 
| 298 | 
            +
              public PImage(int width, int height, int[] pixels,
         | 
| 299 | 
            +
                            boolean requiresCheckAlpha, PApplet parent,
         | 
| 316 300 | 
             
                            int format, int factor) {
         | 
| 317 301 |  | 
| 318 302 | 
             
                initFromPixels(width, height, pixels, format, factor);
         | 
| @@ -382,28 +366,20 @@ public class PImage implements PConstants, Cloneable { | |
| 382 366 |  | 
| 383 367 |  | 
| 384 368 | 
             
              /**
         | 
| 385 | 
            -
               * ( begin auto-generated from PImage_loadPixels.xml )
         | 
| 386 | 
            -
               *
         | 
| 387 | 
            -
               * Loads the pixel data for the image into its <b>pixels[]</b> array. This
         | 
| 388 | 
            -
               * function must always be called before reading from or writing to <b>pixels[]</b>.
         | 
| 389 | 
            -
               *  renderers may or may not seem to require <b>loadPixels()</b>
         | 
| 390 | 
            -
               * or <b>updatePixels()</b>. However, the rule is that any time you want to
         | 
| 391 | 
            -
               * manipulate the <b>pixels[]</b> array, you must first call
         | 
| 392 | 
            -
               * <b>loadPixels()</b>, and after changes have been made, call
         | 
| 393 | 
            -
               * <b>updatePixels()</b>. Even if the renderer may not seem to use this
         | 
| 394 | 
            -
               * function in the current Processing release, this will always be subject
         | 
| 395 | 
            -
               * to change.
         | 
| 396 369 | 
             
               *
         | 
| 397 | 
            -
               *  | 
| 370 | 
            +
               * Loads the pixel data of the current display window into the <b>pixels[]</b>
         | 
| 371 | 
            +
               * array. This function must always be called before reading from or writing to
         | 
| 372 | 
            +
               * <b>pixels[]</b>. Subsequent changes to the display window will not be
         | 
| 373 | 
            +
               * reflected in <b>pixels</b> until <b>loadPixels()</b> is called again.
         | 
| 398 374 | 
             
               *
         | 
| 399 | 
            -
               * <h3>Advanced</h3>
         | 
| 400 | 
            -
               * Call this when you want to mess with the pixels[] array.
         | 
| 401 375 | 
             
               *
         | 
| 402 | 
            -
               *  | 
| 403 | 
            -
               *  | 
| 376 | 
            +
               * <h3>Advanced</h3> Call this when you want to mess with the pixels[] array.
         | 
| 377 | 
            +
               * <p/>
         | 
| 378 | 
            +
               * For subclasses where the pixels[] buffer isn't set by default, this should
         | 
| 379 | 
            +
               * copy all data into the pixels[] array
         | 
| 404 380 | 
             
               *
         | 
| 405 381 | 
             
               * @webref pimage:pixels
         | 
| 406 | 
            -
               * @ | 
| 382 | 
            +
               * @webBrief Loads the pixel data for the image into its <b>pixels[]</b> array.
         | 
| 407 383 | 
             
               * @usage web_application
         | 
| 408 384 | 
             
               */
         | 
| 409 385 | 
             
              public void loadPixels() {  // ignore
         | 
| @@ -420,30 +396,19 @@ public class PImage implements PConstants, Cloneable { | |
| 420 396 |  | 
| 421 397 |  | 
| 422 398 | 
             
              /**
         | 
| 423 | 
            -
               * | 
| 424 | 
            -
               *
         | 
| 425 | 
            -
               *  | 
| 426 | 
            -
               *  | 
| 427 | 
            -
               *  | 
| 428 | 
            -
               * | 
| 429 | 
            -
               *  | 
| 430 | 
            -
               *  | 
| 431 | 
            -
               *  | 
| 432 | 
            -
               *  | 
| 433 | 
            -
               * | 
| 434 | 
            -
               * to change.
         | 
| 435 | 
            -
               *
         | 
| 436 | 
            -
               * Currently, none of the renderers use the additional parameters to
         | 
| 437 | 
            -
               * <b>updatePixels()</b>, however this may be implemented in the future.
         | 
| 438 | 
            -
               *
         | 
| 439 | 
            -
               * ( end auto-generated )
         | 
| 440 | 
            -
               * <h3>Advanced</h3>
         | 
| 441 | 
            -
               * Mark the pixels in this region as needing an update.
         | 
| 442 | 
            -
               * This is not currently used by any of the renderers, however the api
         | 
| 443 | 
            -
               * is structured this way in the hope of being able to use this to
         | 
| 444 | 
            -
               * speed things up in the future.
         | 
| 399 | 
            +
               *
         | 
| 400 | 
            +
               * Updates the display window with the data in the <b>pixels[]</b> array. Use in
         | 
| 401 | 
            +
               * conjunction with <b>loadPixels()</b>. If you're only reading pixels from the
         | 
| 402 | 
            +
               * array, there's no need to call <b>updatePixels()</b> — updating is only
         | 
| 403 | 
            +
               * necessary to apply changes.
         | 
| 404 | 
            +
               *
         | 
| 405 | 
            +
               * <h3>Advanced</h3> Mark the pixels in this region as needing an update. This
         | 
| 406 | 
            +
               * is not currently used by any of the renderers, however the api is structured
         | 
| 407 | 
            +
               * this way in the hope of being able to use this to speed things up in the
         | 
| 408 | 
            +
               * future.
         | 
| 409 | 
            +
               *
         | 
| 445 410 | 
             
               * @webref pimage:pixels
         | 
| 446 | 
            -
               * @ | 
| 411 | 
            +
               * @webBrief Updates the image with the data in its <b>pixels[]</b> array.
         | 
| 447 412 | 
             
               * @usage web_application
         | 
| 448 413 | 
             
               * @param x x-coordinate of the upper-left corner
         | 
| 449 414 | 
             
               * @param y y-coordinate of the upper-left corner
         | 
| @@ -495,13 +460,12 @@ public class PImage implements PConstants, Cloneable { | |
| 495 460 |  | 
| 496 461 |  | 
| 497 462 | 
             
              /**
         | 
| 498 | 
            -
               * ( begin auto-generated from PImage_resize.xml )
         | 
| 499 463 | 
             
               *
         | 
| 500 464 | 
             
               * Resize the image to a new width and height. To make the image scale
         | 
| 501 465 | 
             
               * proportionally, use 0 as the value for the <b>wide</b> or <b>high</b>
         | 
| 502 466 | 
             
               * parameter. For instance, to make the width of an image 150 pixels, and
         | 
| 503 | 
            -
               * change the height using the same proportion, use resize(150, 0) | 
| 504 | 
            -
               *
         | 
| 467 | 
            +
               * change the height using the same proportion, use resize(150, 0).<br />
         | 
| 468 | 
            +
               * <br />
         | 
| 505 469 | 
             
               * Even though a PGraphics is technically a PImage, it is not possible to
         | 
| 506 470 | 
             
               * rescale the image data found in a PGraphics. (It's simply not possible
         | 
| 507 471 | 
             
               * to do this consistently across renderers: technically infeasible with
         | 
| @@ -509,9 +473,8 @@ public class PImage implements PConstants, Cloneable { | |
| 509 473 | 
             
               * content, first get a copy of its image data using the <b>get()</b>
         | 
| 510 474 | 
             
               * method, and call <b>resize()</b> on the PImage that is returned.
         | 
| 511 475 | 
             
               *
         | 
| 512 | 
            -
               * ( end auto-generated )
         | 
| 513 476 | 
             
               * @webref pimage:method
         | 
| 514 | 
            -
               * @ | 
| 477 | 
            +
               * @webBrief Resize the image to a new width and height.
         | 
| 515 478 | 
             
               * @usage web_application
         | 
| 516 479 | 
             
               * @param w the resized image width
         | 
| 517 480 | 
             
               * @param h the resized image height
         | 
| @@ -548,7 +511,6 @@ public class PImage implements PConstants, Cloneable { | |
| 548 511 |  | 
| 549 512 |  | 
| 550 513 | 
             
              /**
         | 
| 551 | 
            -
               * ( begin auto-generated from PImage_get.xml )
         | 
| 552 514 | 
             
               *
         | 
| 553 515 | 
             
               * Reads the color of any pixel or grabs a section of an image. If no
         | 
| 554 516 | 
             
               * parameters are specified, the entire image is returned. Use the <b>x</b>
         | 
| @@ -556,20 +518,19 @@ public class PImage implements PConstants, Cloneable { | |
| 556 518 | 
             
               * the display window by specifying an additional <b>width</b> and
         | 
| 557 519 | 
             
               * <b>height</b> parameter. When getting an image, the <b>x</b> and
         | 
| 558 520 | 
             
               * <b>y</b> parameters define the coordinates for the upper-left corner of
         | 
| 559 | 
            -
               * the image, regardless of the current <b>imageMode()</b | 
| 560 | 
            -
               *
         | 
| 521 | 
            +
               * the image, regardless of the current <b>imageMode()</b>.<br />
         | 
| 522 | 
            +
               * <br />
         | 
| 561 523 | 
             
               * If the pixel requested is outside of the image window, black is
         | 
| 562 524 | 
             
               * returned. The numbers returned are scaled according to the current color
         | 
| 563 525 | 
             
               * ranges, but only RGB values are returned by this function. For example,
         | 
| 564 526 | 
             
               * even though you may have drawn a shape with <b>colorMode(HSB)</b>, the
         | 
| 565 | 
            -
               * numbers returned will be in RGB format | 
| 566 | 
            -
               *
         | 
| 527 | 
            +
               * numbers returned will be in RGB format.<br />
         | 
| 528 | 
            +
               * <br />
         | 
| 567 529 | 
             
               * Getting the color of a single pixel with <b>get(x, y)</b> is easy, but
         | 
| 568 530 | 
             
               * not as fast as grabbing the data directly from <b>pixels[]</b>. The
         | 
| 569 531 | 
             
               * equivalent statement to <b>get(x, y)</b> using <b>pixels[]</b> is
         | 
| 570 532 | 
             
               * <b>pixels[y*width+x]</b>. See the reference for <b>pixels[]</b> for more information.
         | 
| 571 533 | 
             
               *
         | 
| 572 | 
            -
               * ( end auto-generated )
         | 
| 573 534 | 
             
               *
         | 
| 574 535 | 
             
               * <h3>Advanced</h3>
         | 
| 575 536 | 
             
               * Returns an ARGB "color" type (a packed 32 bit int with the color.
         | 
| @@ -590,7 +551,7 @@ public class PImage implements PConstants, Cloneable { | |
| 590 551 | 
             
               * pixels[] array directly.
         | 
| 591 552 | 
             
               *
         | 
| 592 553 | 
             
               * @webref image:pixels
         | 
| 593 | 
            -
               * @ | 
| 554 | 
            +
               * @webBrief Reads the color of any pixel or grabs a rectangle of pixels.
         | 
| 594 555 | 
             
               * @usage web_application
         | 
| 595 556 | 
             
               * @param x x-coordinate of the pixel
         | 
| 596 557 | 
             
               * @param y y-coordinate of the pixel
         | 
| @@ -707,28 +668,26 @@ public class PImage implements PConstants, Cloneable { | |
| 707 668 |  | 
| 708 669 |  | 
| 709 670 | 
             
              /**
         | 
| 710 | 
            -
               * ( begin auto-generated from PImage_set.xml )
         | 
| 711 671 | 
             
               *
         | 
| 712 672 | 
             
               * Changes the color of any pixel or writes an image directly into the
         | 
| 713 | 
            -
               * display window | 
| 714 | 
            -
               *
         | 
| 673 | 
            +
               * display window.<br />
         | 
| 674 | 
            +
               * <br />
         | 
| 715 675 | 
             
               * The <b>x</b> and <b>y</b> parameters specify the pixel to change and the
         | 
| 716 676 | 
             
               * <b>color</b> parameter specifies the color value. The color parameter is
         | 
| 717 677 | 
             
               * affected by the current color mode (the default is RGB values from 0 to
         | 
| 718 678 | 
             
               * 255). When setting an image, the <b>x</b> and <b>y</b> parameters define
         | 
| 719 679 | 
             
               * the coordinates for the upper-left corner of the image, regardless of
         | 
| 720 680 | 
             
               * the current <b>imageMode()</b>.
         | 
| 721 | 
            -
               *
         | 
| 681 | 
            +
               * <br /><br />
         | 
| 722 682 | 
             
               * Setting the color of a single pixel with <b>set(x, y)</b> is easy, but
         | 
| 723 683 | 
             
               * not as fast as putting the data directly into <b>pixels[]</b>. The
         | 
| 724 684 | 
             
               * equivalent statement to <b>set(x, y, #000000)</b> using <b>pixels[]</b>
         | 
| 725 685 | 
             
               * is <b>pixels[y*width+x] = #000000</b>. See the reference for
         | 
| 726 686 | 
             
               * <b>pixels[]</b> for more information.
         | 
| 727 687 | 
             
               *
         | 
| 728 | 
            -
               * ( end auto-generated )
         | 
| 729 688 | 
             
               *
         | 
| 730 689 | 
             
               * @webref image:pixels
         | 
| 731 | 
            -
               * @ | 
| 690 | 
            +
               * @webBrief Writes a color to any pixel or writes an image into another
         | 
| 732 691 | 
             
               * @usage web_application
         | 
| 733 692 | 
             
               * @param x x-coordinate of the pixel
         | 
| 734 693 | 
             
               * @param y y-coordinate of the pixel
         | 
| @@ -829,20 +788,18 @@ public class PImage implements PConstants, Cloneable { | |
| 829 788 |  | 
| 830 789 |  | 
| 831 790 | 
             
              /**
         | 
| 832 | 
            -
               * ( begin auto-generated from PImage_mask.xml )
         | 
| 833 791 | 
             
               *
         | 
| 834 792 | 
             
               * Masks part of an image from displaying by loading another image and
         | 
| 835 793 | 
             
               * using it as an alpha channel. This mask image should only contain
         | 
| 836 794 | 
             
               * grayscale data, but only the blue color channel is used. The mask image
         | 
| 837 | 
            -
               * needs to be the same size as the image to which it is applied | 
| 838 | 
            -
               *
         | 
| 795 | 
            +
               * needs to be the same size as the image to which it is applied.<br />
         | 
| 796 | 
            +
               * <br />
         | 
| 839 797 | 
             
               * In addition to using a mask image, an integer array containing the alpha
         | 
| 840 798 | 
             
               * channel data can be specified directly. This method is useful for
         | 
| 841 799 | 
             
               * creating dynamically generated alpha masks. This array must be of the
         | 
| 842 800 | 
             
               * same length as the target image's pixels array and should contain only
         | 
| 843 801 | 
             
               * grayscale data of values between 0-255.
         | 
| 844 802 | 
             
               *
         | 
| 845 | 
            -
               * ( end auto-generated )
         | 
| 846 803 | 
             
               *
         | 
| 847 804 | 
             
               * <h3>Advanced</h3>
         | 
| 848 805 | 
             
               *
         | 
| @@ -859,9 +816,9 @@ public class PImage implements PConstants, Cloneable { | |
| 859 816 | 
             
               * performing a proper luminance-based conversion.
         | 
| 860 817 | 
             
               *
         | 
| 861 818 | 
             
               * @webref pimage:method
         | 
| 819 | 
            +
               * @webBrief Masks part of an image with another image as an alpha channel
         | 
| 862 820 | 
             
               * @usage web_application
         | 
| 863 821 | 
             
               * @param img image to use as the mask
         | 
| 864 | 
            -
               * @brief Masks part of an image with another image as an alpha channel
         | 
| 865 822 | 
             
               */
         | 
| 866 823 | 
             
              public void mask(PImage img) {
         | 
| 867 824 | 
             
                img.loadPixels();
         | 
| @@ -947,36 +904,43 @@ public class PImage implements PConstants, Cloneable { | |
| 947 904 |  | 
| 948 905 |  | 
| 949 906 | 
             
              /**
         | 
| 950 | 
            -
               * ( begin auto-generated from PImage_filter.xml )
         | 
| 951 | 
            -
               *
         | 
| 952 | 
            -
               * Filters an image as defined by one of the following modes:
         | 
| 953 | 
            -
               * THRESHOLD - converts the image to black and white pixels depending if
         | 
| 954 | 
            -
               * they are above or below the threshold defined by the level parameter.
         | 
| 955 | 
            -
               * The level must be between 0.0 (black) and 1.0(white). If no level is
         | 
| 956 | 
            -
               * specified, 0.5 is used.
         | 
| 957 | 
            -
               *
         | 
| 958 | 
            -
               * GRAY - converts any colors in the image to grayscale equivalents
         | 
| 959 | 
            -
               *
         | 
| 960 | 
            -
               * INVERT - sets each pixel to its inverse value
         | 
| 961 | 
            -
               *
         | 
| 962 | 
            -
               * POSTERIZE - limits each channel of the image to the number of colors
         | 
| 963 | 
            -
               * specified as the level parameter
         | 
| 964 907 | 
             
               *
         | 
| 965 | 
            -
               *  | 
| 966 | 
            -
               *  | 
| 967 | 
            -
               *  | 
| 968 | 
            -
               *
         | 
| 969 | 
            -
               *  | 
| 970 | 
            -
               *
         | 
| 971 | 
            -
               *  | 
| 972 | 
            -
               *  | 
| 973 | 
            -
               *
         | 
| 974 | 
            -
               *  | 
| 975 | 
            -
               *
         | 
| 976 | 
            -
               *  | 
| 977 | 
            -
               *
         | 
| 978 | 
            -
               *  | 
| 979 | 
            -
               *  | 
| 908 | 
            +
               * Filters the image as defined by one of the following modes:<br />
         | 
| 909 | 
            +
               * <br />
         | 
| 910 | 
            +
               * THRESHOLD<br />
         | 
| 911 | 
            +
               * Converts the image to black and white pixels depending if they are above or
         | 
| 912 | 
            +
               * below the threshold defined by the level parameter. The parameter must be
         | 
| 913 | 
            +
               * between 0.0 (black) and 1.0 (white). If no level is specified, 0.5 is
         | 
| 914 | 
            +
               * used.<br />
         | 
| 915 | 
            +
               * <br />
         | 
| 916 | 
            +
               * GRAY<br />
         | 
| 917 | 
            +
               * Converts any colors in the image to grayscale equivalents. No parameter is
         | 
| 918 | 
            +
               * used.<br />
         | 
| 919 | 
            +
               * <br />
         | 
| 920 | 
            +
               * OPAQUE<br />
         | 
| 921 | 
            +
               * Sets the alpha channel to entirely opaque. No parameter is used.<br />
         | 
| 922 | 
            +
               * <br />
         | 
| 923 | 
            +
               * INVERT<br />
         | 
| 924 | 
            +
               * Sets each pixel to its inverse value. No parameter is used.<br />
         | 
| 925 | 
            +
               * <br />
         | 
| 926 | 
            +
               * POSTERIZE<br />
         | 
| 927 | 
            +
               * Limits each channel of the image to the number of colors specified as the
         | 
| 928 | 
            +
               * parameter. The parameter can be set to values between 2 and 255, but results
         | 
| 929 | 
            +
               * are most noticeable in the lower ranges.<br />
         | 
| 930 | 
            +
               * <br />
         | 
| 931 | 
            +
               * BLUR<br />
         | 
| 932 | 
            +
               * Executes a Gaussian blur with the level parameter specifying the extent of
         | 
| 933 | 
            +
               * the blurring. If no parameter is used, the blur is equivalent to Gaussian
         | 
| 934 | 
            +
               * blur of radius 1. Larger values increase the blur.<br />
         | 
| 935 | 
            +
               * <br />
         | 
| 936 | 
            +
               * ERODE<br />
         | 
| 937 | 
            +
               * Reduces the light areas. No parameter is used.<br />
         | 
| 938 | 
            +
               * <br />
         | 
| 939 | 
            +
               * DILATE<br />
         | 
| 940 | 
            +
               * Increases the light areas. No parameter is used.
         | 
| 941 | 
            +
               *
         | 
| 942 | 
            +
               *
         | 
| 943 | 
            +
               * <h3>Advanced</h3> Method to apply a variety of basic filters to this image.
         | 
| 980 944 | 
             
               * <P>
         | 
| 981 945 | 
             
               * <UL>
         | 
| 982 946 | 
             
               * <LI>filter(BLUR) provides a basic blur.
         | 
| @@ -989,14 +953,15 @@ public class PImage implements PConstants, Cloneable { | |
| 989 953 | 
             
               * </UL>
         | 
| 990 954 | 
             
               * Luminance conversion code contributed by
         | 
| 991 955 | 
             
               * <A HREF="http://www.toxi.co.uk">toxi</A>
         | 
| 992 | 
            -
               *
         | 
| 956 | 
            +
               * <P/>
         | 
| 993 957 | 
             
               * Gaussian blur code contributed by
         | 
| 994 958 | 
             
               * <A HREF="http://incubator.quasimondo.com">Mario Klingemann</A>
         | 
| 995 959 | 
             
               *
         | 
| 996 960 | 
             
               * @webref image:pixels
         | 
| 997 | 
            -
               * @ | 
| 961 | 
            +
               * @webBrief Converts the image to grayscale or black and white
         | 
| 998 962 | 
             
               * @usage web_application
         | 
| 999 | 
            -
               * @param kind | 
| 963 | 
            +
               * @param kind  Either THRESHOLD, GRAY, OPAQUE, INVERT, POSTERIZE, BLUR, ERODE,
         | 
| 964 | 
            +
               *              or DILATE
         | 
| 1000 965 | 
             
               * @param param unique for each, see above
         | 
| 1001 966 | 
             
               */
         | 
| 1002 967 | 
             
              public void filter(int kind, float param) {
         | 
| @@ -1004,20 +969,14 @@ public class PImage implements PConstants, Cloneable { | |
| 1004 969 |  | 
| 1005 970 | 
             
                switch (kind) {
         | 
| 1006 971 | 
             
                  case BLUR:
         | 
| 1007 | 
            -
             | 
| 1008 | 
            -
                    case ALPHA:
         | 
| 972 | 
            +
                    if (format == ALPHA)
         | 
| 1009 973 | 
             
                      blurAlpha(param);
         | 
| 1010 | 
            -
             | 
| 1011 | 
            -
                    case ARGB:
         | 
| 974 | 
            +
                    else if (format == ARGB)
         | 
| 1012 975 | 
             
                      blurARGB(param);
         | 
| 1013 | 
            -
             | 
| 1014 | 
            -
                    default:
         | 
| 976 | 
            +
                    else
         | 
| 1015 977 | 
             
                      blurRGB(param);
         | 
| 1016 | 
            -
                      break;
         | 
| 1017 | 
            -
                  }
         | 
| 1018 978 | 
             
                    break;
         | 
| 1019 979 |  | 
| 1020 | 
            -
             | 
| 1021 980 | 
             
                  case GRAY:
         | 
| 1022 981 | 
             
                    throw new RuntimeException("Use filter(GRAY) instead of " +
         | 
| 1023 982 | 
             
                                               "filter(GRAY, param)");
         | 
| @@ -1091,7 +1050,8 @@ public class PImage implements PConstants, Cloneable { | |
| 1091 1050 | 
             
               */
         | 
| 1092 1051 | 
             
              protected void buildBlurKernel(float r) {
         | 
| 1093 1052 | 
             
                int radius = (int) (r * 3.5f);
         | 
| 1094 | 
            -
                 | 
| 1053 | 
            +
                if (radius < 1) radius = 1;
         | 
| 1054 | 
            +
                if (radius > 248) radius = 248;
         | 
| 1095 1055 | 
             
                if (blurRadius != radius) {
         | 
| 1096 1056 | 
             
                  blurRadius = radius;
         | 
| 1097 1057 | 
             
                  blurKernelSize = 1 + blurRadius<<1;
         | 
| @@ -1188,8 +1148,8 @@ public class PImage implements PConstants, Cloneable { | |
| 1188 1148 |  | 
| 1189 1149 |  | 
| 1190 1150 | 
             
              protected void blurRGB(float r) {
         | 
| 1191 | 
            -
                int sum, cr, cg, cb; | 
| 1192 | 
            -
                int  | 
| 1151 | 
            +
                int sum, cr, cg, cb;
         | 
| 1152 | 
            +
                int read, ri, ym, ymi, bk0;
         | 
| 1193 1153 | 
             
                int[] r2 = new int[pixels.length];
         | 
| 1194 1154 | 
             
                int[] g2 = new int[pixels.length];
         | 
| 1195 1155 | 
             
                int[] b2 = new int[pixels.length];
         | 
| @@ -1420,7 +1380,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1420 1380 | 
             
                    }
         | 
| 1421 1381 | 
             
                    if (lumDown > currLum) {
         | 
| 1422 1382 | 
             
                      result = colDown;
         | 
| 1423 | 
            -
                      currLum = lumDown;
         | 
| 1383 | 
            +
            //          currLum = lumDown;  // removed, unused assignment
         | 
| 1424 1384 | 
             
                    }
         | 
| 1425 1385 | 
             
                    outgoing[index++] = result;
         | 
| 1426 1386 | 
             
                  }
         | 
| @@ -1489,7 +1449,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1489 1449 | 
             
                    }
         | 
| 1490 1450 | 
             
                    if (lumDown < currLum) {
         | 
| 1491 1451 | 
             
                      result = colDown;
         | 
| 1492 | 
            -
                      currLum = lumDown;
         | 
| 1452 | 
            +
            //          currLum = lumDown;  // removed, unused assignment
         | 
| 1493 1453 | 
             
                    }
         | 
| 1494 1454 | 
             
                    outgoing[index++] = result;
         | 
| 1495 1455 | 
             
                  }
         | 
| @@ -1505,20 +1465,18 @@ public class PImage implements PConstants, Cloneable { | |
| 1505 1465 |  | 
| 1506 1466 |  | 
| 1507 1467 | 
             
              /**
         | 
| 1508 | 
            -
               * ( begin auto-generated from PImage_copy.xml )
         | 
| 1509 1468 | 
             
               *
         | 
| 1510 1469 | 
             
               * Copies a region of pixels from one image into another. If the source and
         | 
| 1511 1470 | 
             
               * destination regions aren't the same size, it will automatically resize
         | 
| 1512 1471 | 
             
               * source pixels to fit the specified target region. No alpha information
         | 
| 1513 1472 | 
             
               * is used in the process, however if the source image has an alpha channel
         | 
| 1514 1473 | 
             
               * set, it will be copied as well.
         | 
| 1515 | 
            -
               *
         | 
| 1474 | 
            +
               * <br /><br />
         | 
| 1516 1475 | 
             
               * As of release 0149, this function ignores <b>imageMode()</b>.
         | 
| 1517 1476 | 
             
               *
         | 
| 1518 | 
            -
               * ( end auto-generated )
         | 
| 1519 1477 | 
             
               *
         | 
| 1520 1478 | 
             
               * @webref image:pixels
         | 
| 1521 | 
            -
               * @ | 
| 1479 | 
            +
               * @webBrief Copies the entire image
         | 
| 1522 1480 | 
             
               * @usage web_application
         | 
| 1523 1481 | 
             
               * @param sx X coordinate of the source's upper left corner
         | 
| 1524 1482 | 
             
               * @param sy Y coordinate of the source's upper left corner
         | 
| @@ -1554,13 +1512,11 @@ public class PImage implements PConstants, Cloneable { | |
| 1554 1512 |  | 
| 1555 1513 |  | 
| 1556 1514 | 
             
              /**
         | 
| 1557 | 
            -
               * ( begin auto-generated from blendColor.xml )
         | 
| 1558 1515 | 
             
               *
         | 
| 1559 1516 | 
             
               * Blends two color values together based on the blending mode given as the
         | 
| 1560 1517 | 
             
               * <b>MODE</b> parameter. The possible modes are described in the reference
         | 
| 1561 1518 | 
             
               * for the <b>blend()</b> function.
         | 
| 1562 1519 | 
             
               *
         | 
| 1563 | 
            -
               * ( end auto-generated )
         | 
| 1564 1520 | 
             
               * <h3>Advanced</h3>
         | 
| 1565 1521 | 
             
               * <UL>
         | 
| 1566 1522 | 
             
               * <LI>REPLACE - destination colour equals colour of source pixel: C = A.
         | 
| @@ -1574,7 +1530,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1574 1530 | 
             
               *     Clipped to 0..255, Photoshop calls this "Linear Burn",
         | 
| 1575 1531 | 
             
               *     and Director calls it "Add Pin".
         | 
| 1576 1532 | 
             
               *
         | 
| 1577 | 
            -
               * <LI>SUBTRACT -  | 
| 1533 | 
            +
               * <LI>SUBTRACT - subtractive blend with black clip:
         | 
| 1578 1534 | 
             
               *     <TT>C = max(B - A*factor, 0)</TT>.
         | 
| 1579 1535 | 
             
               *     Clipped to 0..255, Photoshop calls this "Linear Dodge",
         | 
| 1580 1536 | 
             
               *     and Director calls it "Subtract Pin".
         | 
| @@ -1616,15 +1572,17 @@ public class PImage implements PConstants, Cloneable { | |
| 1616 1572 | 
             
               * necessarily "correct" code. No biggie, most software does. A nitpicker
         | 
| 1617 1573 | 
             
               * can find numerous "off by 1 division" problems in the blend code where
         | 
| 1618 1574 | 
             
               * <TT>>>8</TT> or <TT>>>7</TT> is used when strictly speaking
         | 
| 1619 | 
            -
               * <TT>/255.0</ | 
| 1575 | 
            +
               * <TT>/255.0</T> or <TT>/127.0</TT> should have been used.</P>
         | 
| 1620 1576 | 
             
               * <P>For instance, exclusion (not intended for real-time use) reads
         | 
| 1621 1577 | 
             
               * <TT>r1 + r2 - ((2 * r1 * r2) / 255)</TT> because <TT>255 == 1.0</TT>
         | 
| 1622 1578 | 
             
               * not <TT>256 == 1.0</TT>. In other words, <TT>(255*255)>>8</TT> is not
         | 
| 1623 1579 | 
             
               * the same as <TT>(255*255)/255</TT>. But for real-time use the shifts
         | 
| 1624 | 
            -
               * are  | 
| 1580 | 
            +
               * are preferable, and the difference is insignificant for applications
         | 
| 1625 1581 | 
             
               * built with Processing.</P>
         | 
| 1626 1582 | 
             
               *
         | 
| 1627 1583 | 
             
               * @webref color:creating_reading
         | 
| 1584 | 
            +
               * @webBrief Blends two color values together based on the blending mode given as the
         | 
| 1585 | 
            +
               * <b>MODE</b> parameter.
         | 
| 1628 1586 | 
             
               * @usage web_application
         | 
| 1629 1587 | 
             
               * @param c1 the first color to blend
         | 
| 1630 1588 | 
             
               * @param c2 the second color to blend
         | 
| @@ -1667,65 +1625,63 @@ public class PImage implements PConstants, Cloneable { | |
| 1667 1625 |  | 
| 1668 1626 |  | 
| 1669 1627 | 
             
              /**
         | 
| 1670 | 
            -
               * ( begin auto-generated from PImage_blend.xml )
         | 
| 1671 1628 | 
             
               *
         | 
| 1672 1629 | 
             
               * Blends a region of pixels into the image specified by the <b>img</b>
         | 
| 1673 1630 | 
             
               * parameter. These copies utilize full alpha channel support and a choice
         | 
| 1674 1631 | 
             
               * of the following modes to blend the colors of source pixels (A) with the
         | 
| 1675 | 
            -
               * ones of pixels in the destination image (B) | 
| 1676 | 
            -
               *
         | 
| 1677 | 
            -
               * BLEND - linear interpolation of colours: C = A*factor + B
         | 
| 1678 | 
            -
               *
         | 
| 1679 | 
            -
               * ADD - additive blending with white clip: C = min(A*factor + B, 255)
         | 
| 1680 | 
            -
               *
         | 
| 1632 | 
            +
               * ones of pixels in the destination image (B):<br />
         | 
| 1633 | 
            +
               * <br />
         | 
| 1634 | 
            +
               * BLEND - linear interpolation of colours: C = A*factor + B<br />
         | 
| 1635 | 
            +
               * <br />
         | 
| 1636 | 
            +
               * ADD - additive blending with white clip: C = min(A*factor + B, 255)<br />
         | 
| 1637 | 
            +
               * <br />
         | 
| 1681 1638 | 
             
               * SUBTRACT - subtractive blending with black clip: C = max(B - A*factor,
         | 
| 1682 | 
            -
               * 0)
         | 
| 1683 | 
            -
               *
         | 
| 1684 | 
            -
               * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
         | 
| 1685 | 
            -
               *
         | 
| 1686 | 
            -
               * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
         | 
| 1687 | 
            -
               *
         | 
| 1688 | 
            -
               * DIFFERENCE - subtract colors from underlying image | 
| 1689 | 
            -
               *
         | 
| 1690 | 
            -
               * EXCLUSION - similar to DIFFERENCE, but less extreme | 
| 1691 | 
            -
               *
         | 
| 1692 | 
            -
               * MULTIPLY - Multiply the colors, result will always be darker | 
| 1693 | 
            -
               *
         | 
| 1694 | 
            -
               * SCREEN - Opposite multiply, uses inverse values of the colors | 
| 1695 | 
            -
               *
         | 
| 1639 | 
            +
               * 0)<br />
         | 
| 1640 | 
            +
               * <br />
         | 
| 1641 | 
            +
               * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)<br />
         | 
| 1642 | 
            +
               * <br />
         | 
| 1643 | 
            +
               * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)<br />
         | 
| 1644 | 
            +
               * <br />
         | 
| 1645 | 
            +
               * DIFFERENCE - subtract colors from underlying image.<br />
         | 
| 1646 | 
            +
               * <br />
         | 
| 1647 | 
            +
               * EXCLUSION - similar to DIFFERENCE, but less extreme.<br />
         | 
| 1648 | 
            +
               * <br />
         | 
| 1649 | 
            +
               * MULTIPLY - Multiply the colors, result will always be darker.<br />
         | 
| 1650 | 
            +
               * <br />
         | 
| 1651 | 
            +
               * SCREEN - Opposite multiply, uses inverse values of the colors.<br />
         | 
| 1652 | 
            +
               * <br />
         | 
| 1696 1653 | 
             
               * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values,
         | 
| 1697 | 
            -
               * and screens light values | 
| 1698 | 
            -
               *
         | 
| 1699 | 
            -
               * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower | 
| 1700 | 
            -
               *
         | 
| 1654 | 
            +
               * and screens light values.<br />
         | 
| 1655 | 
            +
               * <br />
         | 
| 1656 | 
            +
               * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.<br />
         | 
| 1657 | 
            +
               * <br />
         | 
| 1701 1658 | 
             
               * SOFT_LIGHT - Mix of DARKEST and LIGHTEST.
         | 
| 1702 | 
            -
               * Works like OVERLAY, but not as harsh | 
| 1703 | 
            -
               *
         | 
| 1659 | 
            +
               * Works like OVERLAY, but not as harsh.<br />
         | 
| 1660 | 
            +
               * <br />
         | 
| 1704 1661 | 
             
               * DODGE - Lightens light tones and increases contrast, ignores darks.
         | 
| 1705 | 
            -
               * Called "Color Dodge" in Illustrator and Photoshop | 
| 1706 | 
            -
               *
         | 
| 1662 | 
            +
               * Called "Color Dodge" in Illustrator and Photoshop.<br />
         | 
| 1663 | 
            +
               * <br />
         | 
| 1707 1664 | 
             
               * BURN - Darker areas are applied, increasing contrast, ignores lights.
         | 
| 1708 | 
            -
               * Called "Color Burn" in Illustrator and Photoshop | 
| 1709 | 
            -
               *
         | 
| 1665 | 
            +
               * Called "Color Burn" in Illustrator and Photoshop.<br />
         | 
| 1666 | 
            +
               * <br />
         | 
| 1710 1667 | 
             
               * All modes use the alpha information (highest byte) of source image
         | 
| 1711 1668 | 
             
               * pixels as the blending factor. If the source and destination regions are
         | 
| 1712 1669 | 
             
               * different sizes, the image will be automatically resized to match the
         | 
| 1713 1670 | 
             
               * destination size. If the <b>srcImg</b> parameter is not used, the
         | 
| 1714 | 
            -
               * display window is used as the source image | 
| 1715 | 
            -
               *
         | 
| 1671 | 
            +
               * display window is used as the source image.<br />
         | 
| 1672 | 
            +
               * <br />
         | 
| 1716 1673 | 
             
               * As of release 0149, this function ignores <b>imageMode()</b>.
         | 
| 1717 1674 | 
             
               *
         | 
| 1718 | 
            -
               * ( end auto-generated )
         | 
| 1719 1675 | 
             
               *
         | 
| 1720 1676 | 
             
               * @webref image:pixels
         | 
| 1721 | 
            -
               * @ | 
| 1677 | 
            +
               * @webBrief Copies a pixel or rectangle of pixels using different blending modes.
         | 
| 1722 1678 | 
             
               * @param src an image variable referring to the source image
         | 
| 1723 1679 | 
             
               * @param sx X coordinate of the source's upper left corner
         | 
| 1724 1680 | 
             
               * @param sy Y coordinate of the source's upper left corner
         | 
| 1725 1681 | 
             
               * @param sw source image width
         | 
| 1726 1682 | 
             
               * @param sh source image height
         | 
| 1727 | 
            -
               * @param dx X coordinate of the  | 
| 1728 | 
            -
               * @param dy Y coordinate of the  | 
| 1683 | 
            +
               * @param dx X coordinate of the destination's upper left corner
         | 
| 1684 | 
            +
               * @param dy Y coordinate of the destination's upper left corner
         | 
| 1729 1685 | 
             
               * @param dw destination image width
         | 
| 1730 1686 | 
             
               * @param dh destination image height
         | 
| 1731 1687 | 
             
               * @param mode Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION, MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
         | 
| @@ -1745,18 +1701,18 @@ public class PImage implements PConstants, Cloneable { | |
| 1745 1701 | 
             
                loadPixels();
         | 
| 1746 1702 | 
             
                if (src == this) {
         | 
| 1747 1703 | 
             
                  if (intersect(sx, sy, sx2, sy2, dx, dy, dx2, dy2)) {
         | 
| 1748 | 
            -
                     | 
| 1704 | 
            +
                    blitResize(get(sx, sy, sw, sh),
         | 
| 1749 1705 | 
             
                                0, 0, sw, sh,
         | 
| 1750 | 
            -
                                pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
         | 
| 1706 | 
            +
                                pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode, true);
         | 
| 1751 1707 | 
             
                  } else {
         | 
| 1752 1708 | 
             
                    // same as below, except skip the loadPixels() because it'd be redundant
         | 
| 1753 | 
            -
                     | 
| 1754 | 
            -
                                pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
         | 
| 1709 | 
            +
                    blitResize(src, sx, sy, sx2, sy2,
         | 
| 1710 | 
            +
                                pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode, true);
         | 
| 1755 1711 | 
             
                  }
         | 
| 1756 1712 | 
             
                } else {
         | 
| 1757 1713 | 
             
                  src.loadPixels();
         | 
| 1758 | 
            -
                   | 
| 1759 | 
            -
                              pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode);
         | 
| 1714 | 
            +
                  blitResize(src, sx, sy, sx2, sy2,
         | 
| 1715 | 
            +
                              pixels, pixelWidth, pixelHeight, dx, dy, dx2, dy2, mode, true);
         | 
| 1760 1716 | 
             
                  //src.updatePixels();
         | 
| 1761 1717 | 
             
                }
         | 
| 1762 1718 | 
             
                updatePixels();
         | 
| @@ -1807,11 +1763,11 @@ public class PImage implements PConstants, Cloneable { | |
| 1807 1763 | 
             
               * Uses bilinear filtering if smooth() has been enabled
         | 
| 1808 1764 | 
             
               * 'mode' determines the blending mode used in the process.
         | 
| 1809 1765 | 
             
               */
         | 
| 1810 | 
            -
              private void  | 
| 1811 | 
            -
             | 
| 1812 | 
            -
             | 
| 1813 | 
            -
             | 
| 1814 | 
            -
             | 
| 1766 | 
            +
              private void blitResize(PImage img,
         | 
| 1767 | 
            +
                                      int srcX1, int srcY1, int srcX2, int srcY2,
         | 
| 1768 | 
            +
                                      int[] destPixels, int screenW, int screenH,
         | 
| 1769 | 
            +
                                      int destX1, int destY1, int destX2, int destY2,
         | 
| 1770 | 
            +
                                      int mode, boolean smooth) {
         | 
| 1815 1771 | 
             
                if (srcX1 < 0) srcX1 = 0;
         | 
| 1816 1772 | 
             
                if (srcY1 < 0) srcY1 = 0;
         | 
| 1817 1773 | 
             
                if (srcX2 > img.pixelWidth) srcX2 = img.pixelWidth;
         | 
| @@ -1822,10 +1778,9 @@ public class PImage implements PConstants, Cloneable { | |
| 1822 1778 | 
             
                int destW = destX2 - destX1;
         | 
| 1823 1779 | 
             
                int destH = destY2 - destY1;
         | 
| 1824 1780 |  | 
| 1825 | 
            -
                boolean smooth = true;  // may as well go with the smoothing these days
         | 
| 1826 | 
            -
             | 
| 1827 1781 | 
             
                if (!smooth) {
         | 
| 1828 | 
            -
                  srcW++; | 
| 1782 | 
            +
                  srcW++;
         | 
| 1783 | 
            +
                  srcH++;
         | 
| 1829 1784 | 
             
                }
         | 
| 1830 1785 |  | 
| 1831 1786 | 
             
                if (destW <= 0 || destH <= 0 ||
         | 
| @@ -1857,12 +1812,23 @@ public class PImage implements PConstants, Cloneable { | |
| 1857 1812 | 
             
                srcBuffer = img.pixels;
         | 
| 1858 1813 |  | 
| 1859 1814 | 
             
                if (smooth) {
         | 
| 1860 | 
            -
                   | 
| 1861 | 
            -
             | 
| 1862 | 
            -
                   | 
| 1863 | 
            -
             | 
| 1815 | 
            +
                  blitResizeBilinear(img, destPixels, destOffset, screenW, destW, destH, dx, dy, mode);
         | 
| 1816 | 
            +
                } else {
         | 
| 1817 | 
            +
                  blitResizeNearest(img, destPixels, destOffset, screenW, destW, destH, dx, dy, mode);
         | 
| 1818 | 
            +
                }
         | 
| 1819 | 
            +
              }
         | 
| 1864 1820 |  | 
| 1865 | 
            -
             | 
| 1821 | 
            +
              private void blitResizeBilinear(PImage img,
         | 
| 1822 | 
            +
                                              int[] destPixels, int destOffset, int screenW,
         | 
| 1823 | 
            +
                                              int destW, int destH,
         | 
| 1824 | 
            +
                                              int dx, int dy,
         | 
| 1825 | 
            +
                                              int mode) {
         | 
| 1826 | 
            +
                // use bilinear filtering
         | 
| 1827 | 
            +
                iw = img.pixelWidth;
         | 
| 1828 | 
            +
                iw1 = img.pixelWidth - 1;
         | 
| 1829 | 
            +
                ih1 = img.pixelHeight - 1;
         | 
| 1830 | 
            +
             | 
| 1831 | 
            +
                switch (mode) {
         | 
| 1866 1832 |  | 
| 1867 1833 | 
             
                  case BLEND:
         | 
| 1868 1834 | 
             
                    for (int y = 0; y < destH; y++) {
         | 
| @@ -1870,7 +1836,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1870 1836 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1871 1837 | 
             
                        // davbol  - renamed old blend_multiply to blend_blend
         | 
| 1872 1838 | 
             
                        destPixels[destOffset + x] =
         | 
| 1873 | 
            -
             | 
| 1839 | 
            +
                                blend_blend(destPixels[destOffset + x], filter_bilinear());
         | 
| 1874 1840 | 
             
                        sX += dx;
         | 
| 1875 1841 | 
             
                      }
         | 
| 1876 1842 | 
             
                      destOffset += screenW;
         | 
| @@ -1883,7 +1849,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1883 1849 | 
             
                      filter_new_scanline();
         | 
| 1884 1850 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1885 1851 | 
             
                        destPixels[destOffset + x] =
         | 
| 1886 | 
            -
             | 
| 1852 | 
            +
                                blend_add_pin(destPixels[destOffset + x], filter_bilinear());
         | 
| 1887 1853 | 
             
                        sX += dx;
         | 
| 1888 1854 | 
             
                      }
         | 
| 1889 1855 | 
             
                      destOffset += screenW;
         | 
| @@ -1896,7 +1862,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1896 1862 | 
             
                      filter_new_scanline();
         | 
| 1897 1863 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1898 1864 | 
             
                        destPixels[destOffset + x] =
         | 
| 1899 | 
            -
             | 
| 1865 | 
            +
                                blend_sub_pin(destPixels[destOffset + x], filter_bilinear());
         | 
| 1900 1866 | 
             
                        sX += dx;
         | 
| 1901 1867 | 
             
                      }
         | 
| 1902 1868 | 
             
                      destOffset += screenW;
         | 
| @@ -1909,7 +1875,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1909 1875 | 
             
                      filter_new_scanline();
         | 
| 1910 1876 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1911 1877 | 
             
                        destPixels[destOffset + x] =
         | 
| 1912 | 
            -
             | 
| 1878 | 
            +
                                blend_lightest(destPixels[destOffset + x], filter_bilinear());
         | 
| 1913 1879 | 
             
                        sX += dx;
         | 
| 1914 1880 | 
             
                      }
         | 
| 1915 1881 | 
             
                      destOffset += screenW;
         | 
| @@ -1922,7 +1888,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1922 1888 | 
             
                      filter_new_scanline();
         | 
| 1923 1889 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1924 1890 | 
             
                        destPixels[destOffset + x] =
         | 
| 1925 | 
            -
             | 
| 1891 | 
            +
                                blend_darkest(destPixels[destOffset + x], filter_bilinear());
         | 
| 1926 1892 | 
             
                        sX += dx;
         | 
| 1927 1893 | 
             
                      }
         | 
| 1928 1894 | 
             
                      destOffset += screenW;
         | 
| @@ -1947,7 +1913,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1947 1913 | 
             
                      filter_new_scanline();
         | 
| 1948 1914 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1949 1915 | 
             
                        destPixels[destOffset + x] =
         | 
| 1950 | 
            -
             | 
| 1916 | 
            +
                                blend_difference(destPixels[destOffset + x], filter_bilinear());
         | 
| 1951 1917 | 
             
                        sX += dx;
         | 
| 1952 1918 | 
             
                      }
         | 
| 1953 1919 | 
             
                      destOffset += screenW;
         | 
| @@ -1960,7 +1926,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1960 1926 | 
             
                      filter_new_scanline();
         | 
| 1961 1927 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1962 1928 | 
             
                        destPixels[destOffset + x] =
         | 
| 1963 | 
            -
             | 
| 1929 | 
            +
                                blend_exclusion(destPixels[destOffset + x], filter_bilinear());
         | 
| 1964 1930 | 
             
                        sX += dx;
         | 
| 1965 1931 | 
             
                      }
         | 
| 1966 1932 | 
             
                      destOffset += screenW;
         | 
| @@ -1973,7 +1939,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1973 1939 | 
             
                      filter_new_scanline();
         | 
| 1974 1940 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1975 1941 | 
             
                        destPixels[destOffset + x] =
         | 
| 1976 | 
            -
             | 
| 1942 | 
            +
                                blend_multiply(destPixels[destOffset + x], filter_bilinear());
         | 
| 1977 1943 | 
             
                        sX += dx;
         | 
| 1978 1944 | 
             
                      }
         | 
| 1979 1945 | 
             
                      destOffset += screenW;
         | 
| @@ -1986,7 +1952,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1986 1952 | 
             
                      filter_new_scanline();
         | 
| 1987 1953 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 1988 1954 | 
             
                        destPixels[destOffset + x] =
         | 
| 1989 | 
            -
             | 
| 1955 | 
            +
                                blend_screen(destPixels[destOffset + x], filter_bilinear());
         | 
| 1990 1956 | 
             
                        sX += dx;
         | 
| 1991 1957 | 
             
                      }
         | 
| 1992 1958 | 
             
                      destOffset += screenW;
         | 
| @@ -1999,7 +1965,7 @@ public class PImage implements PConstants, Cloneable { | |
| 1999 1965 | 
             
                      filter_new_scanline();
         | 
| 2000 1966 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 2001 1967 | 
             
                        destPixels[destOffset + x] =
         | 
| 2002 | 
            -
             | 
| 1968 | 
            +
                                blend_overlay(destPixels[destOffset + x], filter_bilinear());
         | 
| 2003 1969 | 
             
                        sX += dx;
         | 
| 2004 1970 | 
             
                      }
         | 
| 2005 1971 | 
             
                      destOffset += screenW;
         | 
| @@ -2012,7 +1978,7 @@ public class PImage implements PConstants, Cloneable { | |
| 2012 1978 | 
             
                      filter_new_scanline();
         | 
| 2013 1979 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 2014 1980 | 
             
                        destPixels[destOffset + x] =
         | 
| 2015 | 
            -
             | 
| 1981 | 
            +
                                blend_hard_light(destPixels[destOffset + x], filter_bilinear());
         | 
| 2016 1982 | 
             
                        sX += dx;
         | 
| 2017 1983 | 
             
                      }
         | 
| 2018 1984 | 
             
                      destOffset += screenW;
         | 
| @@ -2025,7 +1991,7 @@ public class PImage implements PConstants, Cloneable { | |
| 2025 1991 | 
             
                      filter_new_scanline();
         | 
| 2026 1992 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 2027 1993 | 
             
                        destPixels[destOffset + x] =
         | 
| 2028 | 
            -
             | 
| 1994 | 
            +
                                blend_soft_light(destPixels[destOffset + x], filter_bilinear());
         | 
| 2029 1995 | 
             
                        sX += dx;
         | 
| 2030 1996 | 
             
                      }
         | 
| 2031 1997 | 
             
                      destOffset += screenW;
         | 
| @@ -2039,7 +2005,7 @@ public class PImage implements PConstants, Cloneable { | |
| 2039 2005 | 
             
                      filter_new_scanline();
         | 
| 2040 2006 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 2041 2007 | 
             
                        destPixels[destOffset + x] =
         | 
| 2042 | 
            -
             | 
| 2008 | 
            +
                                blend_dodge(destPixels[destOffset + x], filter_bilinear());
         | 
| 2043 2009 | 
             
                        sX += dx;
         | 
| 2044 2010 | 
             
                      }
         | 
| 2045 2011 | 
             
                      destOffset += screenW;
         | 
| @@ -2052,7 +2018,7 @@ public class PImage implements PConstants, Cloneable { | |
| 2052 2018 | 
             
                      filter_new_scanline();
         | 
| 2053 2019 | 
             
                      for (int x = 0; x < destW; x++) {
         | 
| 2054 2020 | 
             
                        destPixels[destOffset + x] =
         | 
| 2055 | 
            -
             | 
| 2021 | 
            +
                                blend_burn(destPixels[destOffset + x], filter_bilinear());
         | 
| 2056 2022 | 
             
                        sX += dx;
         | 
| 2057 2023 | 
             
                      }
         | 
| 2058 2024 | 
             
                      destOffset += screenW;
         | 
| @@ -2060,245 +2026,249 @@ public class PImage implements PConstants, Cloneable { | |
| 2060 2026 | 
             
                    }
         | 
| 2061 2027 | 
             
                    break;
         | 
| 2062 2028 |  | 
| 2063 | 
            -
             | 
| 2029 | 
            +
                }
         | 
| 2030 | 
            +
              }
         | 
| 2064 2031 |  | 
| 2065 | 
            -
             | 
| 2066 | 
            -
             | 
| 2067 | 
            -
             | 
| 2032 | 
            +
              private void blitResizeNearest(PImage img,
         | 
| 2033 | 
            +
                                             int[] destPixels, int destOffset, int screenW,
         | 
| 2034 | 
            +
                                             int destW, int destH,
         | 
| 2035 | 
            +
                                             int dx, int dy,
         | 
| 2036 | 
            +
                                             int mode) {
         | 
| 2037 | 
            +
                // nearest neighbour scaling (++fast!)
         | 
| 2038 | 
            +
                int sY;
         | 
| 2039 | 
            +
                switch (mode) {
         | 
| 2068 2040 |  | 
| 2069 | 
            -
             | 
| 2070 | 
            -
             | 
| 2071 | 
            -
             | 
| 2072 | 
            -
             | 
| 2073 | 
            -
             | 
| 2074 | 
            -
             | 
| 2075 | 
            -
             | 
| 2076 | 
            -
             | 
| 2041 | 
            +
                case BLEND:
         | 
| 2042 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2043 | 
            +
                    sX = srcXOffset;
         | 
| 2044 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2045 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2046 | 
            +
                      // davbol - renamed old blend_multiply to blend_blend
         | 
| 2047 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2048 | 
            +
                        blend_blend(destPixels[destOffset + x],
         | 
| 2049 | 
            +
                                    srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2050 | 
            +
                      sX += dx;
         | 
| 2051 | 
            +
                    }
         | 
| 2052 | 
            +
                    destOffset += screenW;
         | 
| 2053 | 
            +
                    srcYOffset += dy;
         | 
| 2054 | 
            +
                  }
         | 
| 2055 | 
            +
                  break;
         | 
| 2056 | 
            +
             | 
| 2057 | 
            +
                case ADD:
         | 
| 2058 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2059 | 
            +
                    sX = srcXOffset;
         | 
| 2060 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2061 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2062 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2063 | 
            +
                        blend_add_pin(destPixels[destOffset + x],
         | 
| 2077 2064 | 
             
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2078 | 
            -
             | 
| 2079 | 
            -
                      }
         | 
| 2080 | 
            -
                      destOffset += screenW;
         | 
| 2081 | 
            -
                      srcYOffset += dy;
         | 
| 2065 | 
            +
                      sX += dx;
         | 
| 2082 2066 | 
             
                    }
         | 
| 2083 | 
            -
                     | 
| 2084 | 
            -
             | 
| 2085 | 
            -
                   | 
| 2086 | 
            -
             | 
| 2087 | 
            -
             | 
| 2088 | 
            -
             | 
| 2089 | 
            -
             | 
| 2090 | 
            -
             | 
| 2091 | 
            -
             | 
| 2092 | 
            -
             | 
| 2093 | 
            -
             | 
| 2094 | 
            -
             | 
| 2095 | 
            -
             | 
| 2096 | 
            -
                       | 
| 2067 | 
            +
                    destOffset += screenW;
         | 
| 2068 | 
            +
                    srcYOffset += dy;
         | 
| 2069 | 
            +
                  }
         | 
| 2070 | 
            +
                  break;
         | 
| 2071 | 
            +
             | 
| 2072 | 
            +
                case SUBTRACT:
         | 
| 2073 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2074 | 
            +
                    sX = srcXOffset;
         | 
| 2075 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2076 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2077 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2078 | 
            +
                        blend_sub_pin(destPixels[destOffset + x],
         | 
| 2079 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2080 | 
            +
                      sX += dx;
         | 
| 2097 2081 | 
             
                    }
         | 
| 2098 | 
            -
                     | 
| 2099 | 
            -
             | 
| 2100 | 
            -
                   | 
| 2101 | 
            -
             | 
| 2102 | 
            -
             | 
| 2103 | 
            -
             | 
| 2104 | 
            -
             | 
| 2105 | 
            -
             | 
| 2106 | 
            -
             | 
| 2107 | 
            -
             | 
| 2108 | 
            -
             | 
| 2109 | 
            -
             | 
| 2110 | 
            -
             | 
| 2111 | 
            -
                       | 
| 2082 | 
            +
                    destOffset += screenW;
         | 
| 2083 | 
            +
                    srcYOffset += dy;
         | 
| 2084 | 
            +
                  }
         | 
| 2085 | 
            +
                  break;
         | 
| 2086 | 
            +
             | 
| 2087 | 
            +
                case LIGHTEST:
         | 
| 2088 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2089 | 
            +
                    sX = srcXOffset;
         | 
| 2090 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2091 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2092 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2093 | 
            +
                        blend_lightest(destPixels[destOffset + x],
         | 
| 2094 | 
            +
                                       srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2095 | 
            +
                      sX += dx;
         | 
| 2096 | 
            +
                    }
         | 
| 2097 | 
            +
                    destOffset += screenW;
         | 
| 2098 | 
            +
                    srcYOffset += dy;
         | 
| 2099 | 
            +
                  }
         | 
| 2100 | 
            +
                  break;
         | 
| 2101 | 
            +
             | 
| 2102 | 
            +
                case DARKEST:
         | 
| 2103 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2104 | 
            +
                    sX = srcXOffset;
         | 
| 2105 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2106 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2107 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2108 | 
            +
                        blend_darkest(destPixels[destOffset + x],
         | 
| 2109 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2110 | 
            +
                      sX += dx;
         | 
| 2112 2111 | 
             
                    }
         | 
| 2113 | 
            -
                     | 
| 2114 | 
            -
             | 
| 2115 | 
            -
                   | 
| 2116 | 
            -
             | 
| 2117 | 
            -
             | 
| 2118 | 
            -
             | 
| 2119 | 
            -
             | 
| 2120 | 
            -
             | 
| 2121 | 
            -
             | 
| 2112 | 
            +
                    destOffset += screenW;
         | 
| 2113 | 
            +
                    srcYOffset += dy;
         | 
| 2114 | 
            +
                  }
         | 
| 2115 | 
            +
                  break;
         | 
| 2116 | 
            +
             | 
| 2117 | 
            +
                case REPLACE:
         | 
| 2118 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2119 | 
            +
                    sX = srcXOffset;
         | 
| 2120 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2121 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2122 | 
            +
                      destPixels[destOffset + x] = srcBuffer[sY + (sX >> PRECISIONB)];
         | 
| 2123 | 
            +
                      sX += dx;
         | 
| 2124 | 
            +
                    }
         | 
| 2125 | 
            +
                    destOffset += screenW;
         | 
| 2126 | 
            +
                    srcYOffset += dy;
         | 
| 2127 | 
            +
                  }
         | 
| 2128 | 
            +
                  break;
         | 
| 2129 | 
            +
             | 
| 2130 | 
            +
                case DIFFERENCE:
         | 
| 2131 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2132 | 
            +
                    sX = srcXOffset;
         | 
| 2133 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2134 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2135 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2136 | 
            +
                        blend_difference(destPixels[destOffset + x],
         | 
| 2122 2137 | 
             
                                         srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2123 | 
            -
             | 
| 2124 | 
            -
                      }
         | 
| 2125 | 
            -
                      destOffset += screenW;
         | 
| 2126 | 
            -
                      srcYOffset += dy;
         | 
| 2138 | 
            +
                      sX += dx;
         | 
| 2127 2139 | 
             
                    }
         | 
| 2128 | 
            -
                     | 
| 2129 | 
            -
             | 
| 2130 | 
            -
                   | 
| 2131 | 
            -
             | 
| 2132 | 
            -
             | 
| 2133 | 
            -
             | 
| 2134 | 
            -
             | 
| 2135 | 
            -
             | 
| 2136 | 
            -
             | 
| 2140 | 
            +
                    destOffset += screenW;
         | 
| 2141 | 
            +
                    srcYOffset += dy;
         | 
| 2142 | 
            +
                  }
         | 
| 2143 | 
            +
                  break;
         | 
| 2144 | 
            +
             | 
| 2145 | 
            +
                case EXCLUSION:
         | 
| 2146 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2147 | 
            +
                    sX = srcXOffset;
         | 
| 2148 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2149 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2150 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2151 | 
            +
                        blend_exclusion(destPixels[destOffset + x],
         | 
| 2137 2152 | 
             
                                        srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2138 | 
            -
             | 
| 2139 | 
            -
                      }
         | 
| 2140 | 
            -
                      destOffset += screenW;
         | 
| 2141 | 
            -
                      srcYOffset += dy;
         | 
| 2142 | 
            -
                    }
         | 
| 2143 | 
            -
                    break;
         | 
| 2144 | 
            -
             | 
| 2145 | 
            -
                  case REPLACE:
         | 
| 2146 | 
            -
                    for (int y = 0; y < destH; y++) {
         | 
| 2147 | 
            -
                      sX = srcXOffset;
         | 
| 2148 | 
            -
                      sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2149 | 
            -
                      for (int x = 0; x < destW; x++) {
         | 
| 2150 | 
            -
                        destPixels[destOffset + x] = srcBuffer[sY + (sX >> PRECISIONB)];
         | 
| 2151 | 
            -
                        sX += dx;
         | 
| 2152 | 
            -
                      }
         | 
| 2153 | 
            -
                      destOffset += screenW;
         | 
| 2154 | 
            -
                      srcYOffset += dy;
         | 
| 2155 | 
            -
                    }
         | 
| 2156 | 
            -
                    break;
         | 
| 2157 | 
            -
             | 
| 2158 | 
            -
                  case DIFFERENCE:
         | 
| 2159 | 
            -
                    for (int y = 0; y < destH; y++) {
         | 
| 2160 | 
            -
                      sX = srcXOffset;
         | 
| 2161 | 
            -
                      sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2162 | 
            -
                      for (int x = 0; x < destW; x++) {
         | 
| 2163 | 
            -
                        destPixels[destOffset + x] =
         | 
| 2164 | 
            -
                          blend_difference(destPixels[destOffset + x],
         | 
| 2165 | 
            -
                                           srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2166 | 
            -
                        sX += dx;
         | 
| 2167 | 
            -
                      }
         | 
| 2168 | 
            -
                      destOffset += screenW;
         | 
| 2169 | 
            -
                      srcYOffset += dy;
         | 
| 2153 | 
            +
                      sX += dx;
         | 
| 2170 2154 | 
             
                    }
         | 
| 2171 | 
            -
                     | 
| 2172 | 
            -
             | 
| 2173 | 
            -
                   | 
| 2174 | 
            -
             | 
| 2175 | 
            -
             | 
| 2176 | 
            -
             | 
| 2177 | 
            -
             | 
| 2178 | 
            -
             | 
| 2179 | 
            -
             | 
| 2180 | 
            -
             | 
| 2181 | 
            -
             | 
| 2182 | 
            -
             | 
| 2183 | 
            -
             | 
| 2184 | 
            -
                       | 
| 2185 | 
            -
                    }
         | 
| 2186 | 
            -
                    break;
         | 
| 2187 | 
            -
             | 
| 2188 | 
            -
                  case MULTIPLY:
         | 
| 2189 | 
            -
                    for (int y = 0; y < destH; y++) {
         | 
| 2190 | 
            -
                      sX = srcXOffset;
         | 
| 2191 | 
            -
                      sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2192 | 
            -
                      for (int x = 0; x < destW; x++) {
         | 
| 2193 | 
            -
                        destPixels[destOffset + x] =
         | 
| 2194 | 
            -
                          blend_multiply(destPixels[destOffset + x],
         | 
| 2195 | 
            -
                                        srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2196 | 
            -
                        sX += dx;
         | 
| 2197 | 
            -
                      }
         | 
| 2198 | 
            -
                      destOffset += screenW;
         | 
| 2199 | 
            -
                      srcYOffset += dy;
         | 
| 2155 | 
            +
                    destOffset += screenW;
         | 
| 2156 | 
            +
                    srcYOffset += dy;
         | 
| 2157 | 
            +
                  }
         | 
| 2158 | 
            +
                  break;
         | 
| 2159 | 
            +
             | 
| 2160 | 
            +
                case MULTIPLY:
         | 
| 2161 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2162 | 
            +
                    sX = srcXOffset;
         | 
| 2163 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2164 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2165 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2166 | 
            +
                        blend_multiply(destPixels[destOffset + x],
         | 
| 2167 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2168 | 
            +
                      sX += dx;
         | 
| 2200 2169 | 
             
                    }
         | 
| 2201 | 
            -
                     | 
| 2202 | 
            -
             | 
| 2203 | 
            -
                   | 
| 2204 | 
            -
             | 
| 2205 | 
            -
             | 
| 2206 | 
            -
             | 
| 2207 | 
            -
             | 
| 2208 | 
            -
             | 
| 2209 | 
            -
             | 
| 2210 | 
            -
             | 
| 2211 | 
            -
             | 
| 2212 | 
            -
             | 
| 2213 | 
            -
             | 
| 2214 | 
            -
                       | 
| 2170 | 
            +
                    destOffset += screenW;
         | 
| 2171 | 
            +
                    srcYOffset += dy;
         | 
| 2172 | 
            +
                  }
         | 
| 2173 | 
            +
                  break;
         | 
| 2174 | 
            +
             | 
| 2175 | 
            +
                case SCREEN:
         | 
| 2176 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2177 | 
            +
                    sX = srcXOffset;
         | 
| 2178 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2179 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2180 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2181 | 
            +
                        blend_screen(destPixels[destOffset + x],
         | 
| 2182 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2183 | 
            +
                      sX += dx;
         | 
| 2215 2184 | 
             
                    }
         | 
| 2216 | 
            -
                     | 
| 2217 | 
            -
             | 
| 2218 | 
            -
                   | 
| 2219 | 
            -
             | 
| 2220 | 
            -
             | 
| 2221 | 
            -
             | 
| 2222 | 
            -
             | 
| 2223 | 
            -
             | 
| 2224 | 
            -
             | 
| 2225 | 
            -
             | 
| 2226 | 
            -
             | 
| 2227 | 
            -
             | 
| 2228 | 
            -
             | 
| 2229 | 
            -
                       | 
| 2185 | 
            +
                    destOffset += screenW;
         | 
| 2186 | 
            +
                    srcYOffset += dy;
         | 
| 2187 | 
            +
                  }
         | 
| 2188 | 
            +
                  break;
         | 
| 2189 | 
            +
             | 
| 2190 | 
            +
                case OVERLAY:
         | 
| 2191 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2192 | 
            +
                    sX = srcXOffset;
         | 
| 2193 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2194 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2195 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2196 | 
            +
                        blend_overlay(destPixels[destOffset + x],
         | 
| 2197 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2198 | 
            +
                      sX += dx;
         | 
| 2230 2199 | 
             
                    }
         | 
| 2231 | 
            -
                     | 
| 2232 | 
            -
             | 
| 2233 | 
            -
                   | 
| 2234 | 
            -
             | 
| 2235 | 
            -
             | 
| 2236 | 
            -
             | 
| 2237 | 
            -
             | 
| 2238 | 
            -
             | 
| 2239 | 
            -
             | 
| 2240 | 
            -
             | 
| 2241 | 
            -
             | 
| 2242 | 
            -
             | 
| 2243 | 
            -
             | 
| 2244 | 
            -
                       | 
| 2200 | 
            +
                    destOffset += screenW;
         | 
| 2201 | 
            +
                    srcYOffset += dy;
         | 
| 2202 | 
            +
                  }
         | 
| 2203 | 
            +
                  break;
         | 
| 2204 | 
            +
             | 
| 2205 | 
            +
                case HARD_LIGHT:
         | 
| 2206 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2207 | 
            +
                    sX = srcXOffset;
         | 
| 2208 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2209 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2210 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2211 | 
            +
                        blend_hard_light(destPixels[destOffset + x],
         | 
| 2212 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2213 | 
            +
                      sX += dx;
         | 
| 2245 2214 | 
             
                    }
         | 
| 2246 | 
            -
                     | 
| 2247 | 
            -
             | 
| 2248 | 
            -
                   | 
| 2249 | 
            -
             | 
| 2250 | 
            -
             | 
| 2251 | 
            -
             | 
| 2252 | 
            -
             | 
| 2253 | 
            -
             | 
| 2254 | 
            -
             | 
| 2255 | 
            -
             | 
| 2256 | 
            -
             | 
| 2257 | 
            -
             | 
| 2258 | 
            -
             | 
| 2259 | 
            -
                       | 
| 2215 | 
            +
                    destOffset += screenW;
         | 
| 2216 | 
            +
                    srcYOffset += dy;
         | 
| 2217 | 
            +
                  }
         | 
| 2218 | 
            +
                  break;
         | 
| 2219 | 
            +
             | 
| 2220 | 
            +
                case SOFT_LIGHT:
         | 
| 2221 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2222 | 
            +
                    sX = srcXOffset;
         | 
| 2223 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2224 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2225 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2226 | 
            +
                        blend_soft_light(destPixels[destOffset + x],
         | 
| 2227 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2228 | 
            +
                      sX += dx;
         | 
| 2260 2229 | 
             
                    }
         | 
| 2261 | 
            -
                     | 
| 2262 | 
            -
             | 
| 2263 | 
            -
                   | 
| 2264 | 
            -
                   | 
| 2265 | 
            -
             | 
| 2266 | 
            -
             | 
| 2267 | 
            -
             | 
| 2268 | 
            -
             | 
| 2269 | 
            -
             | 
| 2270 | 
            -
             | 
| 2271 | 
            -
             | 
| 2272 | 
            -
             | 
| 2273 | 
            -
             | 
| 2274 | 
            -
             | 
| 2275 | 
            -
                       | 
| 2230 | 
            +
                    destOffset += screenW;
         | 
| 2231 | 
            +
                    srcYOffset += dy;
         | 
| 2232 | 
            +
                  }
         | 
| 2233 | 
            +
                  break;
         | 
| 2234 | 
            +
             | 
| 2235 | 
            +
                // davbol - proposed 2007-01-09
         | 
| 2236 | 
            +
                case DODGE:
         | 
| 2237 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2238 | 
            +
                    sX = srcXOffset;
         | 
| 2239 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2240 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2241 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2242 | 
            +
                        blend_dodge(destPixels[destOffset + x],
         | 
| 2243 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2244 | 
            +
                      sX += dx;
         | 
| 2276 2245 | 
             
                    }
         | 
| 2277 | 
            -
                     | 
| 2278 | 
            -
             | 
| 2279 | 
            -
                   | 
| 2280 | 
            -
             | 
| 2281 | 
            -
             | 
| 2282 | 
            -
             | 
| 2283 | 
            -
             | 
| 2284 | 
            -
             | 
| 2285 | 
            -
             | 
| 2286 | 
            -
             | 
| 2287 | 
            -
             | 
| 2288 | 
            -
             | 
| 2289 | 
            -
             | 
| 2290 | 
            -
                       | 
| 2246 | 
            +
                    destOffset += screenW;
         | 
| 2247 | 
            +
                    srcYOffset += dy;
         | 
| 2248 | 
            +
                  }
         | 
| 2249 | 
            +
                  break;
         | 
| 2250 | 
            +
             | 
| 2251 | 
            +
                case BURN:
         | 
| 2252 | 
            +
                  for (int y = 0; y < destH; y++) {
         | 
| 2253 | 
            +
                    sX = srcXOffset;
         | 
| 2254 | 
            +
                    sY = (srcYOffset >> PRECISIONB) * img.pixelWidth;
         | 
| 2255 | 
            +
                    for (int x = 0; x < destW; x++) {
         | 
| 2256 | 
            +
                      destPixels[destOffset + x] =
         | 
| 2257 | 
            +
                        blend_burn(destPixels[destOffset + x],
         | 
| 2258 | 
            +
                                      srcBuffer[sY + (sX >> PRECISIONB)]);
         | 
| 2259 | 
            +
                      sX += dx;
         | 
| 2291 2260 | 
             
                    }
         | 
| 2292 | 
            -
                     | 
| 2293 | 
            -
             | 
| 2261 | 
            +
                    destOffset += screenW;
         | 
| 2262 | 
            +
                    srcYOffset += dy;
         | 
| 2294 2263 | 
             
                  }
         | 
| 2264 | 
            +
                  break;
         | 
| 2295 2265 | 
             
                }
         | 
| 2296 2266 | 
             
              }
         | 
| 2297 2267 |  | 
| 2298 2268 |  | 
| 2299 2269 | 
             
              private void filter_new_scanline() {
         | 
| 2300 2270 | 
             
                sX = srcXOffset;
         | 
| 2301 | 
            -
                fracV = srcYOffset & PREC_MAXVAL;
         | 
| 2271 | 
            +
                int fracV = srcYOffset & PREC_MAXVAL;
         | 
| 2302 2272 | 
             
                ifV = PREC_MAXVAL - fracV + 1;
         | 
| 2303 2273 | 
             
                v1 = (srcYOffset >> PRECISIONB) * iw;
         | 
| 2304 2274 | 
             
                v2 = min((srcYOffset >> PRECISIONB) + 1, ih1) * iw;
         | 
| @@ -2306,14 +2276,18 @@ public class PImage implements PConstants, Cloneable { | |
| 2306 2276 |  | 
| 2307 2277 |  | 
| 2308 2278 | 
             
              private int filter_bilinear() {
         | 
| 2309 | 
            -
                 | 
| 2310 | 
            -
                 | 
| 2311 | 
            -
             | 
| 2312 | 
            -
                 | 
| 2313 | 
            -
                 | 
| 2314 | 
            -
                 | 
| 2315 | 
            -
                 | 
| 2316 | 
            -
                 | 
| 2279 | 
            +
                int cUL, cLL, cUR, cLR;
         | 
| 2280 | 
            +
                int r, g, b, a;
         | 
| 2281 | 
            +
             | 
| 2282 | 
            +
                // private fields
         | 
| 2283 | 
            +
                int fracU = sX & PREC_MAXVAL;
         | 
| 2284 | 
            +
                int ifU = PREC_MAXVAL - fracU + 1;
         | 
| 2285 | 
            +
                int ul = (ifU * ifV) >> PRECISIONB;
         | 
| 2286 | 
            +
                int ll = ifU - ul;
         | 
| 2287 | 
            +
                int ur = ifV - ul;
         | 
| 2288 | 
            +
                int lr = PREC_MAXVAL + 1 - ul - ll - ur;
         | 
| 2289 | 
            +
                int u1 = (sX >> PRECISIONB);
         | 
| 2290 | 
            +
                int u2 = min(u1 + 1, iw1);
         | 
| 2317 2291 |  | 
| 2318 2292 | 
             
                // get color values of the 4 neighbouring texels
         | 
| 2319 2293 | 
             
                cUL = srcBuffer[v1 + u1];
         | 
| @@ -2735,7 +2709,7 @@ int testFunction(int dst, int src) { | |
| 2735 2709 |  | 
| 2736 2710 |  | 
| 2737 2711 | 
             
              /**
         | 
| 2738 | 
            -
               * Soft Light ( | 
| 2712 | 
            +
               * Soft Light (peg top)
         | 
| 2739 2713 | 
             
               * O = (1 - D) * MULTIPLY(D, S) + D * SCREEN(D, S)
         | 
| 2740 2714 | 
             
               * O = (1 - D) * DS + D * (1 - (1 - D)(1 - S))
         | 
| 2741 2715 | 
             
               * O = 2DS + DD - 2DDS
         | 
| @@ -2823,18 +2797,17 @@ int testFunction(int dst, int src) { | |
| 2823 2797 | 
             
              }
         | 
| 2824 2798 |  | 
| 2825 2799 |  | 
| 2800 | 
            +
             | 
| 2826 2801 | 
             
              //////////////////////////////////////////////////////////////
         | 
| 2827 2802 |  | 
| 2828 2803 | 
             
              // FILE I/O
         | 
| 2829 2804 |  | 
| 2830 2805 |  | 
| 2831 | 
            -
              protected boolean saveImpl(String filename) {
         | 
| 2832 | 
            -
                return false;
         | 
| 2833 | 
            -
              }
         | 
| 2834 | 
            -
             | 
| 2835 | 
            -
             | 
| 2836 2806 | 
             
              static public PImage loadTIFF(InputStream input) {  // ignore
         | 
| 2837 | 
            -
                byte | 
| 2807 | 
            +
                byte[] tiff = PApplet.loadBytes(input);
         | 
| 2808 | 
            +
                if (tiff == null) {
         | 
| 2809 | 
            +
                  return null;
         | 
| 2810 | 
            +
                }
         | 
| 2838 2811 |  | 
| 2839 2812 | 
             
                if ((tiff[42] != tiff[102]) ||  // width/height in both places
         | 
| 2840 2813 | 
             
                    (tiff[43] != tiff[103])) {
         | 
| @@ -2883,8 +2856,8 @@ int testFunction(int dst, int src) { | |
| 2883 2856 | 
             
              }
         | 
| 2884 2857 |  | 
| 2885 2858 | 
             
              protected boolean saveTIFF(OutputStream output) {
         | 
| 2886 | 
            -
                // shutting off the warning, people can figure this out themselves
         | 
| 2887 2859 | 
             
                /*
         | 
| 2860 | 
            +
                // shutting off this warning, people can figure this out themselves
         | 
| 2888 2861 | 
             
                if (format != RGB) {
         | 
| 2889 2862 | 
             
                  System.err.println("Warning: only RGB information is saved with " +
         | 
| 2890 2863 | 
             
                                     ".tif files. Use .tga or .png for ARGB images and others.");
         | 
| @@ -2917,6 +2890,7 @@ int testFunction(int dst, int src) { | |
| 2917 2890 | 
             
                  return true;
         | 
| 2918 2891 |  | 
| 2919 2892 | 
             
                } catch (IOException e) {
         | 
| 2893 | 
            +
                  e.printStackTrace();
         | 
| 2920 2894 | 
             
                }
         | 
| 2921 2895 | 
             
                return false;
         | 
| 2922 2896 | 
             
              }
         | 
| @@ -3124,7 +3098,7 @@ int testFunction(int dst, int src) { | |
| 3124 3098 | 
             
              /**
         | 
| 3125 3099 | 
             
               * Creates a Targa32 formatted byte sequence of specified
         | 
| 3126 3100 | 
             
               * pixel buffer using RLE compression.
         | 
| 3127 | 
            -
               *  | 
| 3101 | 
            +
               * </p>
         | 
| 3128 3102 | 
             
               * Also figured out how to avoid parsing the image upside-down
         | 
| 3129 3103 | 
             
               * (there's a header flag to set the image origin to top-left)
         | 
| 3130 3104 | 
             
               * </p>
         | 
| @@ -3135,33 +3109,31 @@ int testFunction(int dst, int src) { | |
| 3135 3109 | 
             
               * <LI><TT>ARGB</TT> → 32 bits
         | 
| 3136 3110 | 
             
               * </UL>
         | 
| 3137 3111 | 
             
               * All versions are RLE compressed.
         | 
| 3138 | 
            -
               *
         | 
| 3112 | 
            +
               * </p>
         | 
| 3139 3113 | 
             
               * Contributed by toxi 8-10 May 2005, based on this RLE
         | 
| 3140 3114 | 
             
               * <A HREF="http://www.wotsit.org/download.asp?f=tga">specification</A>
         | 
| 3141 3115 | 
             
               */
         | 
| 3142 3116 | 
             
              protected boolean saveTGA(OutputStream output) {
         | 
| 3143 3117 | 
             
                byte[] header = new byte[18];
         | 
| 3144 3118 |  | 
| 3145 | 
            -
             | 
| 3146 | 
            -
             | 
| 3147 | 
            -
             | 
| 3148 | 
            -
             | 
| 3149 | 
            -
             | 
| 3150 | 
            -
             | 
| 3151 | 
            -
             | 
| 3152 | 
            -
             | 
| 3153 | 
            -
             | 
| 3154 | 
            -
             | 
| 3155 | 
            -
             | 
| 3156 | 
            -
             | 
| 3157 | 
            -
             | 
| 3158 | 
            -
             | 
| 3159 | 
            -
             | 
| 3160 | 
            -
             | 
| 3161 | 
            -
             | 
| 3162 | 
            -
             | 
| 3163 | 
            -
                    throw new RuntimeException("Image format not recognized inside save()");
         | 
| 3164 | 
            -
                }
         | 
| 3119 | 
            +
                 if (format == ALPHA) {  // save ALPHA images as 8bit grayscale
         | 
| 3120 | 
            +
                   header[2] = 0x0B;
         | 
| 3121 | 
            +
                   header[16] = 0x08;
         | 
| 3122 | 
            +
                   header[17] = 0x28;
         | 
| 3123 | 
            +
             | 
| 3124 | 
            +
                 } else if (format == RGB) {
         | 
| 3125 | 
            +
                   header[2] = 0x0A;
         | 
| 3126 | 
            +
                   header[16] = 24;
         | 
| 3127 | 
            +
                   header[17] = 0x20;
         | 
| 3128 | 
            +
             | 
| 3129 | 
            +
                 } else if (format == ARGB) {
         | 
| 3130 | 
            +
                   header[2] = 0x0A;
         | 
| 3131 | 
            +
                   header[16] = 32;
         | 
| 3132 | 
            +
                   header[17] = 0x28;
         | 
| 3133 | 
            +
             | 
| 3134 | 
            +
                 } else {
         | 
| 3135 | 
            +
                   throw new RuntimeException("Image format not recognized inside save()");
         | 
| 3136 | 
            +
                 }
         | 
| 3165 3137 | 
             
                 // set image dimensions lo-hi byte order
         | 
| 3166 3138 | 
             
                 header[12] = (byte) (pixelWidth & 0xff);
         | 
| 3167 3139 | 
             
                 header[13] = (byte) (pixelWidth >> 8);
         | 
| @@ -3271,13 +3243,13 @@ int testFunction(int dst, int src) { | |
| 3271 3243 | 
             
                   return true;
         | 
| 3272 3244 |  | 
| 3273 3245 | 
             
                 } catch (IOException e) {
         | 
| 3246 | 
            +
                   e.printStackTrace();
         | 
| 3274 3247 | 
             
                   return false;
         | 
| 3275 3248 | 
             
                 }
         | 
| 3276 3249 | 
             
              }
         | 
| 3277 3250 |  | 
| 3278 3251 |  | 
| 3279 3252 | 
             
              /**
         | 
| 3280 | 
            -
               * ( begin auto-generated from PImage_save.xml )
         | 
| 3281 3253 | 
             
               *
         | 
| 3282 3254 | 
             
               * Saves the image into a file. Append a file extension to the name of
         | 
| 3283 3255 | 
             
               * the file, to indicate the file format to be used: either TIFF (.tif),
         | 
| @@ -3285,13 +3257,12 @@ int testFunction(int dst, int src) { | |
| 3285 3257 | 
             
               * in the filename, the image will save in TIFF format and .tif will be
         | 
| 3286 3258 | 
             
               * added to the name.  These files are saved to the sketch's folder, which
         | 
| 3287 3259 | 
             
               * may be opened by selecting "Show sketch folder" from the "Sketch" menu.
         | 
| 3288 | 
            -
               * To save an image created within the code, rather
         | 
| 3260 | 
            +
               * <br /><br />To save an image created within the code, rather
         | 
| 3289 3261 | 
             
               * than through loading, it's necessary to make the image with the
         | 
| 3290 3262 | 
             
               * <b>createImage()</b> function so it is aware of the location of the
         | 
| 3291 3263 | 
             
               * program and can therefore save the file to the right place. See the
         | 
| 3292 3264 | 
             
               * <b>createImage()</b> reference for more information.
         | 
| 3293 3265 | 
             
               *
         | 
| 3294 | 
            -
               * ( end auto-generated )
         | 
| 3295 3266 | 
             
               * <h3>Advanced</h3>
         | 
| 3296 3267 | 
             
               * Save this image to disk.
         | 
| 3297 3268 | 
             
               * <p>
         | 
| @@ -3318,60 +3289,79 @@ int testFunction(int dst, int src) { | |
| 3318 3289 | 
             
               * file with no error.
         | 
| 3319 3290 | 
             
               *
         | 
| 3320 3291 | 
             
               * @webref pimage:method
         | 
| 3321 | 
            -
               * @ | 
| 3292 | 
            +
               * @webBrief Saves the image to a TIFF, TARGA, PNG, or JPEG file.
         | 
| 3322 3293 | 
             
               * @usage application
         | 
| 3323 3294 | 
             
               * @param filename a sequence of letters and numbers
         | 
| 3324 3295 | 
             
               */
         | 
| 3325 | 
            -
             | 
| 3326 | 
            -
             | 
| 3296 | 
            +
              public boolean save(String filename) {  // ignore
         | 
| 3297 | 
            +
                boolean success;
         | 
| 3327 3298 |  | 
| 3328 | 
            -
             | 
| 3329 | 
            -
             | 
| 3330 | 
            -
             | 
| 3299 | 
            +
                if (parent != null) {
         | 
| 3300 | 
            +
                  // use savePath(), so that the intermediate directories are created
         | 
| 3301 | 
            +
                  filename = parent.savePath(filename);
         | 
| 3331 3302 |  | 
| 3332 | 
            -
             | 
| 3333 | 
            -
             | 
| 3334 | 
            -
             | 
| 3335 | 
            -
             | 
| 3336 | 
            -
             | 
| 3337 | 
            -
             | 
| 3338 | 
            -
             | 
| 3339 | 
            -
             | 
| 3340 | 
            -
             | 
| 3341 | 
            -
             | 
| 3342 | 
            -
             | 
| 3343 | 
            -
             | 
| 3303 | 
            +
                } else {
         | 
| 3304 | 
            +
                  File file = new File(filename);
         | 
| 3305 | 
            +
                  if (file.isAbsolute()) {
         | 
| 3306 | 
            +
                    // make sure that the intermediate folders have been created
         | 
| 3307 | 
            +
                    PApplet.createPath(file);
         | 
| 3308 | 
            +
                  } else {
         | 
| 3309 | 
            +
                    String msg =
         | 
| 3310 | 
            +
                        "PImage.save() requires an absolute path. " +
         | 
| 3311 | 
            +
                            "Use createImage(), or pass savePath() to save().";
         | 
| 3312 | 
            +
                    PGraphics.showException(msg);
         | 
| 3313 | 
            +
                  }
         | 
| 3314 | 
            +
                }
         | 
| 3344 3315 |  | 
| 3345 | 
            -
             | 
| 3346 | 
            -
             | 
| 3316 | 
            +
                // Make sure the pixel data is ready to go
         | 
| 3317 | 
            +
                loadPixels();
         | 
| 3347 3318 |  | 
| 3348 | 
            -
             | 
| 3349 | 
            -
             | 
| 3319 | 
            +
                try {
         | 
| 3320 | 
            +
                  final String lower = filename.toLowerCase();
         | 
| 3350 3321 |  | 
| 3351 | 
            -
             | 
| 3352 | 
            -
             | 
| 3353 | 
            -
             | 
| 3322 | 
            +
                  if (saveImpl(filename)) {
         | 
| 3323 | 
            +
                    return true;
         | 
| 3324 | 
            +
                  }
         | 
| 3354 3325 |  | 
| 3355 | 
            -
             | 
| 3356 | 
            -
             | 
| 3357 | 
            -
             | 
| 3326 | 
            +
                  if (lower.endsWith(".tga")) {
         | 
| 3327 | 
            +
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(filename), 32768);
         | 
| 3328 | 
            +
                    success = saveTGA(os); //, pixels, width, height, format);
         | 
| 3329 | 
            +
                    os.close();
         | 
| 3330 | 
            +
             | 
| 3331 | 
            +
                  } else {  // fall-through case is TIFF
         | 
| 3332 | 
            +
                    // add a default extension and save uncompressed
         | 
| 3333 | 
            +
                    // TODO this is the only place in the api that we mess w/ file names,
         | 
| 3334 | 
            +
                    // and while arguably useful, seems like a weird precedent [fry 200816]
         | 
| 3335 | 
            +
                    if (!lower.endsWith(".tif") && !lower.endsWith(".tiff")) {
         | 
| 3336 | 
            +
                      filename += ".tif";
         | 
| 3337 | 
            +
                    }
         | 
| 3338 | 
            +
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(filename), 32768);
         | 
| 3339 | 
            +
                    success = saveTIFF(os); //, pixels, width, height);
         | 
| 3340 | 
            +
                    os.close();
         | 
| 3341 | 
            +
                  }
         | 
| 3358 3342 |  | 
| 3359 | 
            -
             | 
| 3360 | 
            -
             | 
| 3361 | 
            -
             | 
| 3362 | 
            -
             | 
| 3363 | 
            -
             | 
| 3364 | 
            -
             | 
| 3365 | 
            -
             | 
| 3366 | 
            -
                     success = saveTIFF(os); //, pixels, width, height);
         | 
| 3367 | 
            -
                   }
         | 
| 3368 | 
            -
                   os.flush();
         | 
| 3369 | 
            -
                   os.close();
         | 
| 3343 | 
            +
                } catch (IOException e) {
         | 
| 3344 | 
            +
                  System.err.println("Error while saving image.");
         | 
| 3345 | 
            +
                  e.printStackTrace();
         | 
| 3346 | 
            +
                  success = false;
         | 
| 3347 | 
            +
                }
         | 
| 3348 | 
            +
                return success;
         | 
| 3349 | 
            +
              }
         | 
| 3370 3350 |  | 
| 3371 | 
            -
             | 
| 3372 | 
            -
             | 
| 3373 | 
            -
             | 
| 3374 | 
            -
             | 
| 3375 | 
            -
             | 
| 3376 | 
            -
                | 
| 3351 | 
            +
             | 
| 3352 | 
            +
              /**
         | 
| 3353 | 
            +
               * Override this in subclasses to intercept save calls for other formats
         | 
| 3354 | 
            +
               * or higher-performance implementations. When reaching this code, pixels
         | 
| 3355 | 
            +
               * must be loaded and that path should be absolute.
         | 
| 3356 | 
            +
               *
         | 
| 3357 | 
            +
               * @param path must be a full path (not relative or simply a filename)
         | 
| 3358 | 
            +
               */
         | 
| 3359 | 
            +
              protected boolean saveImpl(String path) {
         | 
| 3360 | 
            +
                // TODO Imperfect/temporary solution for alpha 2.
         | 
| 3361 | 
            +
                // https://github.com/processing/processing4/wiki/Exorcising-AWT
         | 
| 3362 | 
            +
                if (!PApplet.disableAWT) {
         | 
| 3363 | 
            +
                  return ShimAWT.saveImage(this, path);
         | 
| 3364 | 
            +
                }
         | 
| 3365 | 
            +
                return false;
         | 
| 3366 | 
            +
              }
         | 
| 3377 3367 | 
             
            }
         |