home *** CD-ROM | disk | FTP | other *** search
- package sun.java2d.loops;
-
- import java.util.Comparator;
-
- class EdgeCollection {
- private int remainingEdges = 0;
- private int activeEdges = 0;
- private int firstActive = 0;
- private Comparator leftComparator;
- private Comparator topLeftComparator;
- private EdgeEntry[] edges;
-
- EdgeCollection(int[] var1, int[] var2, int[] var3, int var4) {
- int var5 = var4;
- int var6 = 0;
- int var7 = 0;
-
- for(int var8 = 0; var8 < var4; ++var8) {
- var5 += var3[var8];
- }
-
- this.edges = new EdgeEntry[var5];
-
- for(int var9 = 0; var9 < var4; ++var9) {
- int var10 = var3[var9];
- int var11 = var1[var6];
- int var12 = var2[var6];
- int var13 = var1[var6 + var10 - 1];
- int var14 = var2[var6 + var10 - 1];
- if (var11 != var13 || var12 != var14) {
- this.edges[var7] = new EdgeEntry(this, var13, var14, var11, var12);
- if (this.edges[var7].initialized()) {
- ++this.remainingEdges;
- ++var7;
- }
- }
-
- while(var10-- > 1) {
- var13 = var1[var6 + 1];
- var14 = var2[var6 + 1];
- this.edges[var7] = new EdgeEntry(this, var11, var12, var13, var14);
- if (this.edges[var7].initialized()) {
- ++this.remainingEdges;
- ++var7;
- }
-
- ++var6;
- var11 = var13;
- var12 = var14;
- }
-
- ++var6;
- }
-
- this.topLeftComparator = new TopLeftComparator(this, (1)null);
- this.leftComparator = new LeftComparator(this, (1)null);
- }
-
- int countUnfinished() {
- return this.remainingEdges;
- }
-
- void sortByHighestVertex() {
- if (this.remainingEdges > 0) {
- this.sort(this.edges, this.firstActive, this.remainingEdges, this.topLeftComparator);
- }
-
- }
-
- void sortByLeftMostVertex() {
- if (this.activeEdges > 0) {
- this.sort(this.edges, this.firstActive, this.activeEdges, this.leftComparator);
- }
-
- }
-
- void removeDuplicateEdges() {
- if (this.remainingEdges > 0) {
- int var1 = this.firstActive;
- int var2 = this.firstActive + this.remainingEdges - 1;
- int var3 = this.firstActive;
-
- while(var1 < var2) {
- if (this.edges[var1].mirrors(this.edges[var1 + 1])) {
- var1 += 2;
- this.remainingEdges -= 2;
- } else {
- if (var3 != var1) {
- this.edges[var3] = this.edges[var1];
- }
-
- ++var3;
- ++var1;
- }
- }
-
- }
- }
-
- void drawEvenOddFromActiveEdges(ImageData var1, Object var2) {
- int var3 = this.activeEdges;
-
- for(int var4 = this.firstActive; var3 >= 2; var3 -= 2) {
- int var5 = this.edges[var4].getY1();
- int var6 = this.edges[var4].getX1();
- ++var4;
- int var7 = this.edges[var4].getX1();
- ++var4;
- if (var7 > var6) {
- GeneralRenderer.doDrawLine(var1, var2, var6, var5, var7 - 1, var5);
- }
- }
-
- }
-
- void drawWindingFromActiveEdges(ImageData var1, Object var2) {
- int var3 = 0;
- int var4 = -1;
- int var5 = -1;
- int var6 = this.activeEdges;
-
- for(int var7 = this.firstActive; var6 > 0; ++var7) {
- EdgeEntry var8 = this.edges[var7];
- if (0 == var3) {
- var4 = var8.getX1();
- var5 = var8.getY1();
- }
-
- var3 += var8.isFlipped() ? -1 : 1;
- if (0 == var3) {
- int var9 = var8.getX1();
- if (var9 > var4) {
- GeneralRenderer.doDrawLine(var1, var2, var4, var5, var9 - 1, var5);
- }
- }
-
- --var6;
- }
-
- }
-
- void drawActiveEdges(ImageData var1, Object var2, boolean var3) {
- if (var3) {
- this.drawEvenOddFromActiveEdges(var1, var2);
- } else {
- this.drawWindingFromActiveEdges(var1, var2);
- }
-
- }
-
- void advanceActiveEdges() {
- int var1 = this.firstActive;
-
- for(int var2 = this.firstActive + this.activeEdges; var1 < var2; ++var1) {
- EdgeEntry var3 = this.edges[var1];
- var3.bumpY1(1);
- if (var3.getErrY() != 0) {
- var3.bumpError(var3.getErrX());
-
- while(var3.getError() > 0) {
- var3.bumpX1(var3.getBumpX());
- var3.bumpError(-var3.getErrY());
- }
- }
- }
-
- }
-
- void activateNewEdges() {
- if (this.remainingEdges > 0) {
- for(int var1 = this.edges[this.firstActive].getY1(); this.activeEdges < this.remainingEdges && this.edges[this.firstActive + this.activeEdges].getY1() == var1; ++this.activeEdges) {
- }
- }
-
- }
-
- void purgeUsedEdges() {
- if (this.activeEdges > 0) {
- int var1 = this.activeEdges;
-
- for(int var2 = this.firstActive; var1-- > 0; ++var2) {
- if (this.edges[var2].getY1() >= this.edges[var2].getY2()) {
- if (var2 != this.firstActive) {
- this.edges[var2] = this.edges[this.firstActive];
- }
-
- ++this.firstActive;
- --this.remainingEdges;
- --this.activeEdges;
- }
- }
- }
-
- }
-
- private void sort(EdgeEntry[] var1, int var2, int var3, Comparator var4) {
- if (var3 < 7) {
- for(int var13 = var2; var13 < var3 + var2; ++var13) {
- for(int var15 = var13; var15 > var2 && var4.compare(var1[var15 - 1], var1[var15]) > 0; --var15) {
- this.swap(var1, var15, var15 - 1);
- }
- }
-
- } else {
- int var5 = var2 + var3 / 2;
- if (var3 > 7) {
- int var6 = var2;
- int var7 = var2 + var3 - 1;
- if (var3 > 40) {
- int var8 = var3 / 8;
- var6 = this.med3(var1, var2, var2 + var8, var2 + 2 * var8, var4);
- var5 = this.med3(var1, var5 - var8, var5, var5 + var8, var4);
- var7 = this.med3(var1, var7 - 2 * var8, var7 - var8, var7, var4);
- }
-
- var5 = this.med3(var1, var6, var5, var7, var4);
- }
-
- EdgeEntry var14 = var1[var5];
- int var16 = var2;
- int var17 = var2;
- int var9 = var2 + var3 - 1;
- int var10 = var9;
-
- while(true) {
- int var11;
- while(var17 > var9 || (var11 = var4.compare(var1[var17], var14)) > 0) {
- for(; var9 >= var17 && var4.compare(var1[var9], var14) >= 0; --var9) {
- if (var1[var9] == var14) {
- this.swap(var1, var9, var10--);
- }
- }
-
- if (var17 > var9) {
- int var12 = var2 + var3;
- var11 = Math.min(var16 - var2, var17 - var16);
- this.vecswap(var1, var2, var17 - var11, var11);
- var11 = Math.min(var10 - var9, var12 - var10 - 1);
- this.vecswap(var1, var17, var12 - var11, var11);
- if ((var11 = var17 - var16) > 1) {
- this.sort(var1, var2, var11, var4);
- }
-
- if ((var11 = var10 - var9) > 1) {
- this.sort(var1, var12 - var11, var11, var4);
- }
-
- return;
- }
-
- this.swap(var1, var17++, var9--);
- }
-
- if (var11 == 0) {
- this.swap(var1, var16++, var17);
- }
-
- ++var17;
- }
- }
- }
-
- private int med3(EdgeEntry[] var1, int var2, int var3, int var4, Comparator var5) {
- 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));
- }
-
- private void swap(EdgeEntry[] var1, int var2, int var3) {
- EdgeEntry var4 = var1[var2];
- var1[var2] = var1[var3];
- var1[var3] = var4;
- }
-
- private void vecswap(EdgeEntry[] var1, int var2, int var3, int var4) {
- for(int var5 = 0; var5 < var4; ++var3) {
- this.swap(var1, var2, var3);
- ++var5;
- ++var2;
- }
-
- }
- }
-