src/java.desktop/share/classes/sun/java2d/pipe/Region.java

Print this page

        

@@ -28,10 +28,12 @@
 import java.awt.Rectangle;
 import java.awt.Shape;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.RectangularShape;
 
+import sun.java2d.loops.TransformHelper;
+
 /**
  * This class encapsulates a definition of a two dimensional region which
  * consists of a number of Y ranges each containing multiple X bands.
  * <p>
  * A rectangular Region is allowed to have a null band list in which

@@ -158,10 +160,19 @@
         this.loy = loy;
         this.hix = hix;
         this.hiy = hiy;
     }
 
+    private Region(int lox, int loy, int hix, int hiy, int[] bands, int end) {
+        this.lox = lox;
+        this.loy = loy;
+        this.hix = hix;
+        this.hiy = hiy;
+        this.bands = bands;
+        this.endIndex = end;
+    }
+
     /**
      * Returns a Region object covering the pixels which would be
      * touched by a fill or clip operation on a Graphics implementation
      * on the specified Shape object under the optionally specified
      * AffineTransform object.

@@ -254,10 +265,42 @@
             sr.dispose();
         }
     }
 
     /**
+     * Returns a Region object with a rectangle of interest specified by the
+     * indicated rectangular area in lox, loy, hix, hiy and edges array, which
+     * is located relative to the rectangular area. Edges array - 0,1 are y
+     * range, 2N,2N+1 are x ranges, 1 per y range.
+     * <p>
+     * Note that we trust to the edges array, which means that edges should be:
+     * {@code edges + (lox, loy) < (hix, hiy)}, otherwise result is undefined
+     *
+     * @see TransformHelper
+     */
+    static Region getInstance(final int lox, final int loy, final int hix,
+                              final int hiy, final int edges[]) {
+        // rowsNum * (3 + 1 * 2), plus one byte for endIndex
+        final int[] bands = new int[(edges[1] - edges[0]) * 5 + 1];
+        int end = 0;
+        int index = 2;
+        for (int y = edges[0]; end < bands.length && y < edges[1]; ++y) {
+            final int x1 = edges[index++];
+            final int x2 = edges[index++];
+            if (x1 < x2) {
+                bands[end++] = loy + y;     // spanloy
+                bands[end++] = loy + y + 1; // spanhiy
+                bands[end++] = 1;           // 1 span per row
+                bands[end++] = lox + x1;    // spanlox
+                bands[end++] = lox + x2;    // spanhix
+            }
+        }
+        return end != 0 ? new Region(lox, loy, hix, hiy, bands, end)
+                        : EMPTY_REGION;
+    }
+
+    /**
      * Returns a Region object with a rectangle of interest specified
      * by the indicated Rectangle object.
      * <p>
      * This method can also be used to create a simple rectangular
      * region.