home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &… the Search for Life CD 3 / 0_CD-ROM.iso / install / jre1_3 / lib / rt.jar / sun / awt / geom / AreaOp.class (.txt) next >
Encoding:
Java Class File  |  1979-12-31  |  5.5 KB  |  357 lines

  1. package sun.awt.geom;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Comparator;
  5. import java.util.Enumeration;
  6. import java.util.Vector;
  7.  
  8. public abstract class AreaOp {
  9.    public static final int CTAG_LEFT = 0;
  10.    public static final int CTAG_RIGHT = 1;
  11.    public static final int ETAG_IGNORE = 0;
  12.    public static final int ETAG_ENTER = 1;
  13.    public static final int ETAG_EXIT = -1;
  14.    public static final int RSTAG_INSIDE = 1;
  15.    public static final int RSTAG_OUTSIDE = -1;
  16.    private static Comparator YXTopComparator = new 1();
  17.    private static CurveLink[] EmptyLinkList = new CurveLink[2];
  18.    private static ChainEnd[] EmptyChainList = new ChainEnd[2];
  19.  
  20.    private AreaOp() {
  21.    }
  22.  
  23.    public abstract void newRow();
  24.  
  25.    public abstract int classify(Edge var1);
  26.  
  27.    public abstract int getState();
  28.  
  29.    public Vector calculate(Vector var1, Vector var2) {
  30.       Vector var3 = new Vector();
  31.       addEdges(var3, var1, 0);
  32.       addEdges(var3, var2, 1);
  33.       var3 = this.pruneEdges(var3);
  34.       return var3;
  35.    }
  36.  
  37.    private static void addEdges(Vector var0, Vector var1, int var2) {
  38.       Enumeration var3 = var1.elements();
  39.  
  40.       while(var3.hasMoreElements()) {
  41.          Curve var4 = (Curve)var3.nextElement();
  42.          if (var4.getOrder() > 0) {
  43.             var0.add(new Edge(var4, var2));
  44.          }
  45.       }
  46.  
  47.    }
  48.  
  49.    private Vector pruneEdges(Vector var1) {
  50.       int var2 = var1.size();
  51.       if (var2 < 2) {
  52.          return var1;
  53.       } else {
  54.          Edge[] var3 = (Edge[])var1.toArray(new Edge[var2]);
  55.          Arrays.sort(var3, YXTopComparator);
  56.          int var5 = 0;
  57.          int var6 = 0;
  58.          boolean var7 = false;
  59.          int var8 = 0;
  60.          double[] var9 = new double[2];
  61.          Vector var10 = new Vector();
  62.          Vector var11 = new Vector();
  63.  
  64.          double var43;
  65.          for(Vector var12 = new Vector(); var5 < var2; var9[0] = var43) {
  66.             double var13 = var9[0];
  67.  
  68.             for(int var31 = var8 = var6 - 1; var31 >= var5; --var31) {
  69.                Edge var4 = var3[var31];
  70.                if (var4.getCurve().getYBot() > var13) {
  71.                   if (var8 > var31) {
  72.                      var3[var8] = var4;
  73.                   }
  74.  
  75.                   --var8;
  76.                }
  77.             }
  78.  
  79.             var5 = var8 + 1;
  80.             if (var5 >= var6) {
  81.                if (var6 >= var2) {
  82.                   break;
  83.                }
  84.  
  85.                var13 = var3[var6].getCurve().getYTop();
  86.                if (var13 > var9[0]) {
  87.                   finalizeSubCurves(var10, var11);
  88.                }
  89.  
  90.                var9[0] = var13;
  91.             }
  92.  
  93.             while(var6 < var2) {
  94.                Edge var27 = var3[var6];
  95.                if (var27.getCurve().getYTop() > var13) {
  96.                   break;
  97.                }
  98.  
  99.                ++var6;
  100.             }
  101.  
  102.             var9[1] = var3[var5].getCurve().getYBot();
  103.             if (var6 < var2) {
  104.                var13 = var3[var6].getCurve().getYTop();
  105.                if (var9[1] > var13) {
  106.                   var9[1] = var13;
  107.                }
  108.             }
  109.  
  110.             int var15 = 1;
  111.  
  112.             for(int var32 = var5; var32 < var6; ++var32) {
  113.                Edge var28 = var3[var32];
  114.                var28.setEquivalence(0);
  115.  
  116.                for(var8 = var32; var8 > var5; --var8) {
  117.                   Edge var16 = var3[var8 - 1];
  118.                   int var17 = var28.compareTo(var16, var9);
  119.                   if (var9[1] <= var9[0]) {
  120.                      throw new InternalError("backstepping to " + var9[1] + " from " + var9[0]);
  121.                   }
  122.  
  123.                   if (var17 >= 0) {
  124.                      if (var17 == 0) {
  125.                         int var18 = var16.getEquivalence();
  126.                         if (var18 == 0) {
  127.                            var18 = var15++;
  128.                            var16.setEquivalence(var18);
  129.                         }
  130.  
  131.                         var28.setEquivalence(var18);
  132.                      }
  133.                      break;
  134.                   }
  135.  
  136.                   var3[var8] = var16;
  137.                }
  138.  
  139.                var3[var8] = var28;
  140.             }
  141.  
  142.             this.newRow();
  143.             double var41 = var9[0];
  144.             var43 = var9[1];
  145.  
  146.             for(int var33 = var5; var33 < var6; ++var33) {
  147.                Edge var29 = var3[var33];
  148.                int var21 = var29.getEquivalence();
  149.                int var20;
  150.                if (var21 == 0) {
  151.                   var20 = this.classify(var29);
  152.                } else {
  153.                   int var22 = this.getState();
  154.                   var20 = var22 == 1 ? -1 : 1;
  155.                   Edge var23 = null;
  156.                   Edge var24 = var29;
  157.                   double var25 = var43;
  158.  
  159.                   do {
  160.                      this.classify(var29);
  161.                      if (var23 == null && var29.isActiveFor(var41, var20)) {
  162.                         var23 = var29;
  163.                      }
  164.  
  165.                      var13 = var29.getCurve().getYBot();
  166.                      if (var13 > var25) {
  167.                         var24 = var29;
  168.                         var25 = var13;
  169.                      }
  170.  
  171.                      ++var33;
  172.                   } while(var33 < var6 && (var29 = var3[var33]).getEquivalence() == var21);
  173.  
  174.                   --var33;
  175.                   if (this.getState() == var22) {
  176.                      var20 = 0;
  177.                   } else {
  178.                      var29 = var23 != null ? var23 : var24;
  179.                   }
  180.                }
  181.  
  182.                if (var20 != 0) {
  183.                   var29.record(var43, var20);
  184.                   var12.add(new CurveLink(var29.getCurve(), var41, var43, var20));
  185.                }
  186.             }
  187.  
  188.             if (this.getState() != -1) {
  189.                System.out.println("Still inside at end of active edge list!");
  190.                System.out.println("num curves = " + (var6 - var5));
  191.                System.out.println("num links = " + var12.size());
  192.                System.out.println("y top = " + var9[0]);
  193.                if (var6 < var2) {
  194.                   System.out.println("y top of next curve = " + var3[var6].getCurve().getYTop());
  195.                } else {
  196.                   System.out.println("no more curves");
  197.                }
  198.  
  199.                for(int var34 = var5; var34 < var6; ++var34) {
  200.                   Edge var30 = var3[var34];
  201.                   System.out.println(var30);
  202.                   int var44 = var30.getEquivalence();
  203.                   if (var44 != 0) {
  204.                      System.out.println("  was equal to " + var44 + "...");
  205.                   }
  206.                }
  207.             }
  208.  
  209.             resolveLinks(var10, var11, var12);
  210.             var12.clear();
  211.          }
  212.  
  213.          finalizeSubCurves(var10, var11);
  214.          Vector var39 = new Vector();
  215.          Enumeration var14 = var10.elements();
  216.  
  217.          while(var14.hasMoreElements()) {
  218.             CurveLink var40 = (CurveLink)var14.nextElement();
  219.             var39.add(var40.getMoveto());
  220.             CurveLink var42 = var40;
  221.  
  222.             while((var42 = var42.getNext()) != null) {
  223.                if (!var40.absorb(var42)) {
  224.                   var39.add(var40.getSubCurve());
  225.                   var40 = var42;
  226.                }
  227.             }
  228.  
  229.             var39.add(var40.getSubCurve());
  230.          }
  231.  
  232.          return var39;
  233.       }
  234.    }
  235.  
  236.    public static void finalizeSubCurves(Vector var0, Vector var1) {
  237.       int var2 = var1.size();
  238.       if (var2 != 0) {
  239.          if ((var2 & 1) != 0) {
  240.             throw new InternalError("Odd number of chains!");
  241.          } else {
  242.             ChainEnd[] var3 = new ChainEnd[var2];
  243.             var1.toArray(var3);
  244.  
  245.             for(int var4 = 1; var4 < var2; var4 += 2) {
  246.                ChainEnd var5 = var3[var4 - 1];
  247.                ChainEnd var6 = var3[var4];
  248.                CurveLink var7 = var5.linkTo(var6);
  249.                if (var7 != null) {
  250.                   var0.add(var7);
  251.                }
  252.             }
  253.  
  254.             var1.clear();
  255.          }
  256.       }
  257.    }
  258.  
  259.    public static void resolveLinks(Vector var0, Vector var1, Vector var2) {
  260.       int var3 = var2.size();
  261.       CurveLink[] var4;
  262.       if (var3 == 0) {
  263.          var4 = EmptyLinkList;
  264.       } else {
  265.          if ((var3 & 1) != 0) {
  266.             throw new InternalError("Odd number of new curves!");
  267.          }
  268.  
  269.          var4 = new CurveLink[var3 + 2];
  270.          var2.toArray(var4);
  271.       }
  272.  
  273.       int var5 = var1.size();
  274.       ChainEnd[] var6;
  275.       if (var5 == 0) {
  276.          var6 = EmptyChainList;
  277.       } else {
  278.          if ((var5 & 1) != 0) {
  279.             throw new InternalError("Odd number of chains!");
  280.          }
  281.  
  282.          var6 = new ChainEnd[var5 + 2];
  283.          var1.toArray(var6);
  284.       }
  285.  
  286.       int var7 = 0;
  287.       int var8 = 0;
  288.       var1.clear();
  289.       ChainEnd var9 = var6[0];
  290.       ChainEnd var10 = var6[1];
  291.       CurveLink var11 = var4[0];
  292.       CurveLink var12 = var4[1];
  293.  
  294.       while(var9 != null || var11 != null) {
  295.          boolean var13 = var11 == null;
  296.          boolean var14 = var9 == null;
  297.          if (!var13 && !var14) {
  298.             var13 = (var7 & 1) == 0 && var9.getX() == var10.getX();
  299.             var14 = (var8 & 1) == 0 && var11.getX() == var12.getX();
  300.             if (!var13 && !var14) {
  301.                double var15 = var9.getX();
  302.                double var17 = var11.getX();
  303.                var13 = var10 != null && var15 < var17 && obstructs(var10.getX(), var17, var7);
  304.                var14 = var12 != null && var17 < var15 && obstructs(var12.getX(), var15, var8);
  305.             }
  306.          }
  307.  
  308.          if (var13) {
  309.             CurveLink var19 = var9.linkTo(var10);
  310.             if (var19 != null) {
  311.                var0.add(var19);
  312.             }
  313.  
  314.             var7 += 2;
  315.             var9 = var6[var7];
  316.             var10 = var6[var7 + 1];
  317.          }
  318.  
  319.          if (var14) {
  320.             ChainEnd var20 = new ChainEnd(var11, (ChainEnd)null);
  321.             ChainEnd var16 = new ChainEnd(var12, var20);
  322.             var20.setOtherEnd(var16);
  323.             var1.add(var20);
  324.             var1.add(var16);
  325.             var8 += 2;
  326.             var11 = var4[var8];
  327.             var12 = var4[var8 + 1];
  328.          }
  329.  
  330.          if (!var13 && !var14) {
  331.             var9.addLink(var11);
  332.             var1.add(var9);
  333.             ++var7;
  334.             var9 = var10;
  335.             var10 = var6[var7 + 1];
  336.             ++var8;
  337.             var11 = var12;
  338.             var12 = var4[var8 + 1];
  339.          }
  340.       }
  341.  
  342.       if ((var1.size() & 1) != 0) {
  343.          System.out.println("Odd number of chains!");
  344.       }
  345.  
  346.    }
  347.  
  348.    public static boolean obstructs(double var0, double var2, int var4) {
  349.       return (var4 & 1) == 0 ? var0 <= var2 : var0 < var2;
  350.    }
  351.  
  352.    // $FF: synthetic method
  353.    AreaOp(1 var1) {
  354.       this();
  355.    }
  356. }
  357.