1 /* 2 * Copyright (c) 1998, 2002, 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 import java.awt.Rectangle; 29 30 import javax.tools.annotation.GenerateNativeHeader; 31 32 /** 33 * This class defines the API for iterating through the bands 34 * of a region object. 35 */ 36 /* No native methods here, but the constants are needed in the supporting JNI code */ 37 @GenerateNativeHeader 38 public class RegionIterator { 39 Region region; 40 int curIndex; 41 int numXbands; 42 43 RegionIterator(Region r) { 44 region = r; 45 } 46 47 /** 48 * Returns a new RegionIterator object representing the same 49 * iteration state as this object to allow multiple iteration 50 * branches from the current position. 51 */ 52 public RegionIterator createCopy() { 53 RegionIterator r = new RegionIterator(region); 54 r.curIndex = this.curIndex; 55 r.numXbands = this.numXbands; 56 return r; 57 } 58 59 /** 60 * Copies the iteration state from this RegionIterator object 61 * into another RegionIterator object to allow multiple iteration 62 * branches from the current position. 63 */ 64 public void copyStateFrom(RegionIterator ri) { 65 if (this.region != ri.region) { 66 throw new InternalError("region mismatch"); 67 } 68 this.curIndex = ri.curIndex; 69 this.numXbands = ri.numXbands; 70 } 71 72 /** 73 * Moves the iteration state to the beginning of the next 74 * Y range in the region returning true if one is found 75 * and recording the low and high Y coordinates of the 76 * range in the array at locations 1 and 3 respectively. 77 */ 78 public boolean nextYRange(int range[]) { 79 curIndex += numXbands * 2; 80 numXbands = 0; 81 if (curIndex >= region.endIndex) { 82 return false; 83 } 84 range[1] = region.bands[curIndex++]; 85 range[3] = region.bands[curIndex++]; 86 numXbands = region.bands[curIndex++]; 87 return true; 88 } 89 90 /** 91 * Moves the iteration state to the beginning of the next 92 * X band in the current Y range returning true if one is 93 * found and recording the low and high X coordinates of 94 * the range in the array at locations 0 and 2 respectively. 95 */ 96 public boolean nextXBand(int range[]) { 97 if (numXbands <= 0) { 98 return false; 99 } 100 numXbands--; 101 range[0] = region.bands[curIndex++]; 102 range[2] = region.bands[curIndex++]; 103 return true; 104 } 105 }