src/java.desktop/share/classes/sun/awt/geom/Edge.java
changeset 47216 71c04702a3d5
parent 25859 3317bb8137f4
child 52248 2e330da7cbf4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/share/classes/sun/awt/geom/Edge.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.geom;
+
+final class Edge {
+    static final int INIT_PARTS = 4;
+    static final int GROW_PARTS = 10;
+
+    Curve curve;
+    int ctag;
+    int etag;
+    double activey;
+    int equivalence;
+
+    public Edge(Curve c, int ctag) {
+        this(c, ctag, AreaOp.ETAG_IGNORE);
+    }
+
+    public Edge(Curve c, int ctag, int etag) {
+        this.curve = c;
+        this.ctag = ctag;
+        this.etag = etag;
+    }
+
+    public Curve getCurve() {
+        return curve;
+    }
+
+    public int getCurveTag() {
+        return ctag;
+    }
+
+    public int getEdgeTag() {
+        return etag;
+    }
+
+    public void setEdgeTag(int etag) {
+        this.etag = etag;
+    }
+
+    public int getEquivalence() {
+        return equivalence;
+    }
+
+    public void setEquivalence(int eq) {
+        equivalence = eq;
+    }
+
+    private Edge lastEdge;
+    private int lastResult;
+    private double lastLimit;
+
+    public int compareTo(Edge other, double yrange[]) {
+        if (other == lastEdge && yrange[0] < lastLimit) {
+            if (yrange[1] > lastLimit) {
+                yrange[1] = lastLimit;
+            }
+            return lastResult;
+        }
+        if (this == other.lastEdge && yrange[0] < other.lastLimit) {
+            if (yrange[1] > other.lastLimit) {
+                yrange[1] = other.lastLimit;
+            }
+            return 0-other.lastResult;
+        }
+        //long start = System.currentTimeMillis();
+        int ret = curve.compareTo(other.curve, yrange);
+        //long end = System.currentTimeMillis();
+        /*
+        System.out.println("compare: "+
+                           ((System.identityHashCode(this) <
+                             System.identityHashCode(other))
+                            ? this+" to "+other
+                            : other+" to "+this)+
+                           " == "+ret+" at "+yrange[1]+
+                           " in "+(end-start)+"ms");
+         */
+        lastEdge = other;
+        lastLimit = yrange[1];
+        lastResult = ret;
+        return ret;
+    }
+
+    public void record(double yend, int etag) {
+        this.activey = yend;
+        this.etag = etag;
+    }
+
+    public boolean isActiveFor(double y, int etag) {
+        return (this.etag == etag && this.activey >= y);
+    }
+
+    public String toString() {
+        return ("Edge["+curve+
+                ", "+
+                (ctag == AreaOp.CTAG_LEFT ? "L" : "R")+
+                ", "+
+                (etag == AreaOp.ETAG_ENTER ? "I" :
+                 (etag == AreaOp.ETAG_EXIT ? "O" : "N"))+
+                "]");
+    }
+}