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.awt.geom; 27 28 final class Edge { 29 static final int INIT_PARTS = 4; 30 static final int GROW_PARTS = 10; 31 32 Curve curve; 33 int ctag; 34 int etag; 35 double activey; 36 int equivalence; 37 38 public Edge(Curve c, int ctag) { 39 this(c, ctag, AreaOp.ETAG_IGNORE); 40 } 41 42 public Edge(Curve c, int ctag, int etag) { 43 this.curve = c; 44 this.ctag = ctag; 45 this.etag = etag; 46 } 47 48 public Curve getCurve() { 49 return curve; 50 } 51 52 public int getCurveTag() { 53 return ctag; 54 } 55 56 public int getEdgeTag() { 57 return etag; 58 } 59 60 public void setEdgeTag(int etag) { 61 this.etag = etag; 62 } 63 64 public int getEquivalence() { 65 return equivalence; 66 } 67 68 public void setEquivalence(int eq) { 69 equivalence = eq; 70 } 71 72 private Edge lastEdge; 73 private int lastResult; 74 private double lastLimit; 75 76 public int compareTo(Edge other, double[] yrange) { 77 if (other == lastEdge && yrange[0] < lastLimit) { 78 if (yrange[1] > lastLimit) { 79 yrange[1] = lastLimit; 80 } 81 return lastResult; 82 } 83 if (this == other.lastEdge && yrange[0] < other.lastLimit) { 84 if (yrange[1] > other.lastLimit) { 85 yrange[1] = other.lastLimit; 86 } 87 return 0-other.lastResult; 88 } 89 //long start = System.currentTimeMillis(); 90 int ret = curve.compareTo(other.curve, yrange); 91 //long end = System.currentTimeMillis(); 92 /* 93 System.out.println("compare: "+ 94 ((System.identityHashCode(this) < 95 System.identityHashCode(other)) 96 ? this+" to "+other 97 : other+" to "+this)+ 98 " == "+ret+" at "+yrange[1]+ 99 " in "+(end-start)+"ms"); 100 */ 101 lastEdge = other; 102 lastLimit = yrange[1]; 103 lastResult = ret; 104 return ret; 105 } 106 107 public void record(double yend, int etag) { 108 this.activey = yend; 109 this.etag = etag; 110 } 111 112 public boolean isActiveFor(double y, int etag) { 113 return (this.etag == etag && this.activey >= y); 114 } 115 116 public String toString() { 117 return ("Edge["+curve+ 118 ", "+ 119 (ctag == AreaOp.CTAG_LEFT ? "L" : "R")+ 120 ", "+ 121 (etag == AreaOp.ETAG_ENTER ? "I" : 122 (etag == AreaOp.ETAG_EXIT ? "O" : "N"))+ 123 "]"); 124 } 125 }