1 /*
   2  * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.java2d.pipe;
  27 
  28 
  29 /**
  30  * This class defines the API for iterating through the bands
  31  * of a region object.
  32  */
  33 public class RegionIterator {
  34     Region region;
  35     int curIndex;
  36     int numXbands;
  37 
  38     RegionIterator(Region r) {
  39         region = r;
  40     }
  41 
  42     /**
  43      * Returns a new RegionIterator object representing the same
  44      * iteration state as this object to allow multiple iteration
  45      * branches from the current position.
  46      */
  47     public RegionIterator createCopy() {
  48         RegionIterator r = new RegionIterator(region);
  49         r.curIndex = this.curIndex;
  50         r.numXbands = this.numXbands;
  51         return r;
  52     }
  53 
  54     /**
  55      * Copies the iteration state from this RegionIterator object
  56      * into another RegionIterator object to allow multiple iteration
  57      * branches from the current position.
  58      */
  59     public void copyStateFrom(RegionIterator ri) {
  60         if (this.region != ri.region) {
  61             throw new InternalError("region mismatch");
  62         }
  63         this.curIndex = ri.curIndex;
  64         this.numXbands = ri.numXbands;
  65     }
  66 
  67     /**
  68      * Moves the iteration state to the beginning of the next
  69      * Y range in the region returning true if one is found
  70      * and recording the low and high Y coordinates of the
  71      * range in the array at locations 1 and 3 respectively.
  72      */
  73     public boolean nextYRange(int[] range) {
  74         curIndex += numXbands * 2;
  75         numXbands = 0;
  76         if (curIndex >= region.endIndex) {
  77             return false;
  78         }
  79         range[1] = region.bands[curIndex++];
  80         range[3] = region.bands[curIndex++];
  81         numXbands = region.bands[curIndex++];
  82         return true;
  83     }
  84 
  85     /**
  86      * Moves the iteration state to the beginning of the next
  87      * X band in the current Y range returning true if one is
  88      * found and recording the low and high X coordinates of
  89      * the range in the array at locations 0 and 2 respectively.
  90      */
  91     public boolean nextXBand(int[] range) {
  92         if (numXbands <= 0) {
  93             return false;
  94         }
  95         numXbands--;
  96         range[0] = region.bands[curIndex++];
  97         range[2] = region.bands[curIndex++];
  98         return true;
  99     }
 100 }