home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / sun / java2d / loops / EdgeCollection.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  3.9 KB  |  282 lines

  1. package sun.java2d.loops;
  2.  
  3. import java.util.Comparator;
  4.  
  5. class EdgeCollection {
  6.    private int remainingEdges = 0;
  7.    private int activeEdges = 0;
  8.    private int firstActive = 0;
  9.    private Comparator leftComparator;
  10.    private Comparator topLeftComparator;
  11.    private EdgeEntry[] edges;
  12.  
  13.    EdgeCollection(int[] var1, int[] var2, int[] var3, int var4) {
  14.       int var5 = var4;
  15.       int var6 = 0;
  16.       int var7 = 0;
  17.  
  18.       for(int var8 = 0; var8 < var4; ++var8) {
  19.          var5 += var3[var8];
  20.       }
  21.  
  22.       this.edges = new EdgeEntry[var5];
  23.  
  24.       for(int var9 = 0; var9 < var4; ++var9) {
  25.          int var10 = var3[var9];
  26.          int var11 = var1[var6];
  27.          int var12 = var2[var6];
  28.          int var13 = var1[var6 + var10 - 1];
  29.          int var14 = var2[var6 + var10 - 1];
  30.          if (var11 != var13 || var12 != var14) {
  31.             this.edges[var7] = new EdgeEntry(this, var13, var14, var11, var12);
  32.             if (this.edges[var7].initialized()) {
  33.                ++this.remainingEdges;
  34.                ++var7;
  35.             }
  36.          }
  37.  
  38.          while(var10-- > 1) {
  39.             var13 = var1[var6 + 1];
  40.             var14 = var2[var6 + 1];
  41.             this.edges[var7] = new EdgeEntry(this, var11, var12, var13, var14);
  42.             if (this.edges[var7].initialized()) {
  43.                ++this.remainingEdges;
  44.                ++var7;
  45.             }
  46.  
  47.             ++var6;
  48.             var11 = var13;
  49.             var12 = var14;
  50.          }
  51.  
  52.          ++var6;
  53.       }
  54.  
  55.       this.topLeftComparator = new TopLeftComparator(this, (1)null);
  56.       this.leftComparator = new LeftComparator(this, (1)null);
  57.    }
  58.  
  59.    int countUnfinished() {
  60.       return this.remainingEdges;
  61.    }
  62.  
  63.    void sortByHighestVertex() {
  64.       if (this.remainingEdges > 0) {
  65.          this.sort(this.edges, this.firstActive, this.remainingEdges, this.topLeftComparator);
  66.       }
  67.  
  68.    }
  69.  
  70.    void sortByLeftMostVertex() {
  71.       if (this.activeEdges > 0) {
  72.          this.sort(this.edges, this.firstActive, this.activeEdges, this.leftComparator);
  73.       }
  74.  
  75.    }
  76.  
  77.    void removeDuplicateEdges() {
  78.       if (this.remainingEdges > 0) {
  79.          int var1 = this.firstActive;
  80.          int var2 = this.firstActive + this.remainingEdges - 1;
  81.          int var3 = this.firstActive;
  82.  
  83.          while(var1 < var2) {
  84.             if (this.edges[var1].mirrors(this.edges[var1 + 1])) {
  85.                var1 += 2;
  86.                this.remainingEdges -= 2;
  87.             } else {
  88.                if (var3 != var1) {
  89.                   this.edges[var3] = this.edges[var1];
  90.                }
  91.  
  92.                ++var3;
  93.                ++var1;
  94.             }
  95.          }
  96.  
  97.       }
  98.    }
  99.  
  100.    void drawEvenOddFromActiveEdges(ImageData var1, Object var2) {
  101.       int var3 = this.activeEdges;
  102.  
  103.       for(int var4 = this.firstActive; var3 >= 2; var3 -= 2) {
  104.          int var5 = this.edges[var4].getY1();
  105.          int var6 = this.edges[var4].getX1();
  106.          ++var4;
  107.          int var7 = this.edges[var4].getX1();
  108.          ++var4;
  109.          if (var7 > var6) {
  110.             GeneralRenderer.doDrawLine(var1, var2, var6, var5, var7 - 1, var5);
  111.          }
  112.       }
  113.  
  114.    }
  115.  
  116.    void drawWindingFromActiveEdges(ImageData var1, Object var2) {
  117.       int var3 = 0;
  118.       int var4 = -1;
  119.       int var5 = -1;
  120.       int var6 = this.activeEdges;
  121.  
  122.       for(int var7 = this.firstActive; var6 > 0; ++var7) {
  123.          EdgeEntry var8 = this.edges[var7];
  124.          if (0 == var3) {
  125.             var4 = var8.getX1();
  126.             var5 = var8.getY1();
  127.          }
  128.  
  129.          var3 += var8.isFlipped() ? -1 : 1;
  130.          if (0 == var3) {
  131.             int var9 = var8.getX1();
  132.             if (var9 > var4) {
  133.                GeneralRenderer.doDrawLine(var1, var2, var4, var5, var9 - 1, var5);
  134.             }
  135.          }
  136.  
  137.          --var6;
  138.       }
  139.  
  140.    }
  141.  
  142.    void drawActiveEdges(ImageData var1, Object var2, boolean var3) {
  143.       if (var3) {
  144.          this.drawEvenOddFromActiveEdges(var1, var2);
  145.       } else {
  146.          this.drawWindingFromActiveEdges(var1, var2);
  147.       }
  148.  
  149.    }
  150.  
  151.    void advanceActiveEdges() {
  152.       int var1 = this.firstActive;
  153.  
  154.       for(int var2 = this.firstActive + this.activeEdges; var1 < var2; ++var1) {
  155.          EdgeEntry var3 = this.edges[var1];
  156.          var3.bumpY1(1);
  157.          if (var3.getErrY() != 0) {
  158.             var3.bumpError(var3.getErrX());
  159.  
  160.             while(var3.getError() > 0) {
  161.                var3.bumpX1(var3.getBumpX());
  162.                var3.bumpError(-var3.getErrY());
  163.             }
  164.          }
  165.       }
  166.  
  167.    }
  168.  
  169.    void activateNewEdges() {
  170.       if (this.remainingEdges > 0) {
  171.          for(int var1 = this.edges[this.firstActive].getY1(); this.activeEdges < this.remainingEdges && this.edges[this.firstActive + this.activeEdges].getY1() == var1; ++this.activeEdges) {
  172.          }
  173.       }
  174.  
  175.    }
  176.  
  177.    void purgeUsedEdges() {
  178.       if (this.activeEdges > 0) {
  179.          int var1 = this.activeEdges;
  180.  
  181.          for(int var2 = this.firstActive; var1-- > 0; ++var2) {
  182.             if (this.edges[var2].getY1() >= this.edges[var2].getY2()) {
  183.                if (var2 != this.firstActive) {
  184.                   this.edges[var2] = this.edges[this.firstActive];
  185.                }
  186.  
  187.                ++this.firstActive;
  188.                --this.remainingEdges;
  189.                --this.activeEdges;
  190.             }
  191.          }
  192.       }
  193.  
  194.    }
  195.  
  196.    private void sort(EdgeEntry[] var1, int var2, int var3, Comparator var4) {
  197.       if (var3 < 7) {
  198.          for(int var13 = var2; var13 < var3 + var2; ++var13) {
  199.             for(int var15 = var13; var15 > var2 && var4.compare(var1[var15 - 1], var1[var15]) > 0; --var15) {
  200.                this.swap(var1, var15, var15 - 1);
  201.             }
  202.          }
  203.  
  204.       } else {
  205.          int var5 = var2 + var3 / 2;
  206.          if (var3 > 7) {
  207.             int var6 = var2;
  208.             int var7 = var2 + var3 - 1;
  209.             if (var3 > 40) {
  210.                int var8 = var3 / 8;
  211.                var6 = this.med3(var1, var2, var2 + var8, var2 + 2 * var8, var4);
  212.                var5 = this.med3(var1, var5 - var8, var5, var5 + var8, var4);
  213.                var7 = this.med3(var1, var7 - 2 * var8, var7 - var8, var7, var4);
  214.             }
  215.  
  216.             var5 = this.med3(var1, var6, var5, var7, var4);
  217.          }
  218.  
  219.          EdgeEntry var14 = var1[var5];
  220.          int var16 = var2;
  221.          int var17 = var2;
  222.          int var9 = var2 + var3 - 1;
  223.          int var10 = var9;
  224.  
  225.          while(true) {
  226.             int var11;
  227.             while(var17 > var9 || (var11 = var4.compare(var1[var17], var14)) > 0) {
  228.                for(; var9 >= var17 && var4.compare(var1[var9], var14) >= 0; --var9) {
  229.                   if (var1[var9] == var14) {
  230.                      this.swap(var1, var9, var10--);
  231.                   }
  232.                }
  233.  
  234.                if (var17 > var9) {
  235.                   int var12 = var2 + var3;
  236.                   var11 = Math.min(var16 - var2, var17 - var16);
  237.                   this.vecswap(var1, var2, var17 - var11, var11);
  238.                   var11 = Math.min(var10 - var9, var12 - var10 - 1);
  239.                   this.vecswap(var1, var17, var12 - var11, var11);
  240.                   if ((var11 = var17 - var16) > 1) {
  241.                      this.sort(var1, var2, var11, var4);
  242.                   }
  243.  
  244.                   if ((var11 = var10 - var9) > 1) {
  245.                      this.sort(var1, var12 - var11, var11, var4);
  246.                   }
  247.  
  248.                   return;
  249.                }
  250.  
  251.                this.swap(var1, var17++, var9--);
  252.             }
  253.  
  254.             if (var11 == 0) {
  255.                this.swap(var1, var16++, var17);
  256.             }
  257.  
  258.             ++var17;
  259.          }
  260.       }
  261.    }
  262.  
  263.    private int med3(EdgeEntry[] var1, int var2, int var3, int var4, Comparator var5) {
  264.       return var5.compare(var1[var2], var1[var3]) < 0 ? (var5.compare(var1[var3], var1[var4]) < 0 ? var3 : (var5.compare(var1[var2], var1[var4]) < 0 ? var4 : var2)) : (var5.compare(var1[var3], var1[var4]) > 0 ? var3 : (var5.compare(var1[var2], var1[var4]) > 0 ? var4 : var2));
  265.    }
  266.  
  267.    private void swap(EdgeEntry[] var1, int var2, int var3) {
  268.       EdgeEntry var4 = var1[var2];
  269.       var1[var2] = var1[var3];
  270.       var1[var3] = var4;
  271.    }
  272.  
  273.    private void vecswap(EdgeEntry[] var1, int var2, int var3, int var4) {
  274.       for(int var5 = 0; var5 < var4; ++var3) {
  275.          this.swap(var1, var2, var3);
  276.          ++var5;
  277.          ++var2;
  278.       }
  279.  
  280.    }
  281. }
  282.