117 lines · 3.7 KB · Java
RawDownload
/* * 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 ChainEnd {    CurveLink head;    CurveLink tail;    ChainEnd partner;    int etag;     public ChainEnd(CurveLink first, ChainEnd partner) {        this.head = first;        this.tail = first;        this.partner = partner;        this.etag = first.getEdgeTag();    }     public CurveLink getChain() {        return head;    }     public void setOtherEnd(ChainEnd partner) {        this.partner = partner;    }     public ChainEnd getPartner() {        return partner;    }     /*     * Returns head of a complete chain to be added to subcurves     * or null if the links did not complete such a chain.     */    public CurveLink linkTo(ChainEnd that) {        if (etag == AreaOp.ETAG_IGNORE ||            that.etag == AreaOp.ETAG_IGNORE)        {            throw new InternalError("ChainEnd linked more than once!");        }        if (etag == that.etag) {            throw new InternalError("Linking chains of the same type!");        }        ChainEnd enter, exit;        // assert(partner.etag != that.partner.etag);        if (etag == AreaOp.ETAG_ENTER) {            enter = this;            exit = that;        } else {            enter = that;            exit = this;        }        // Now make sure these ChainEnds are not linked to any others...        etag = AreaOp.ETAG_IGNORE;        that.etag = AreaOp.ETAG_IGNORE;        // Now link everything up...        enter.tail.setNext(exit.head);        enter.tail = exit.tail;        if (partner == that) {            // Curve has closed on itself...            return enter.head;        }        // Link this chain into one end of the chain formed by the partners        ChainEnd otherenter = exit.partner;        ChainEnd otherexit = enter.partner;        otherenter.partner = otherexit;        otherexit.partner = otherenter;        if (enter.head.getYTop() < otherenter.head.getYTop()) {            enter.tail.setNext(otherenter.head);            otherenter.head = enter.head;        } else {            otherexit.tail.setNext(enter.head);            otherexit.tail = enter.tail;        }        return null;    }     public void addLink(CurveLink newlink) {        if (etag == AreaOp.ETAG_ENTER) {            tail.setNext(newlink);            tail = newlink;        } else {            newlink.setNext(head);            head = newlink;        }    }     public double getX() {        if (etag == AreaOp.ETAG_ENTER) {            return tail.getXBot();        } else {            return head.getXBot();        }    }}