home *** CD-ROM | disk | FTP | other *** search
- package sun.java2d.pipe;
-
- import java.awt.BasicStroke;
- import java.awt.Rectangle;
- import java.awt.Shape;
- import java.awt.geom.AffineTransform;
- import java.awt.geom.PathIterator;
- import java.awt.geom.Rectangle2D;
- import java.awt.geom.RectangularShape;
- import sun.dc.path.PathConsumer;
- import sun.dc.path.PathException;
- import sun.java2d.SunGraphics2D;
-
- public abstract class SpanShapeRenderer implements ShapeDrawPipe {
- public static final int NON_RECTILINEAR_TRANSFORM_MASK = 48;
-
- public void draw(SunGraphics2D var1, Shape var2) {
- if (var1.stroke instanceof BasicStroke) {
- ShapeSpanIterator var3 = new ShapeSpanIterator();
-
- try {
- this.drawBasicStroke(var1, var2, var3);
- } finally {
- var3.dispose();
- }
- } else {
- this.renderPath(var1, var1.stroke.createStrokedShape(var2));
- }
-
- }
-
- public void drawBasicStroke(SunGraphics2D var1, Shape var2, ShapeSpanIterator var3) {
- Rectangle var4 = var1.getCompBounds();
- var3.setOutputArea(var4);
- var3.setRule(1);
- BasicStroke var5 = (BasicStroke)var1.stroke;
- AffineTransform var6 = var1.transformState == 2 ? var1.transform : null;
- PathConsumer var7 = DuctusRenderer.createStroker(var3, var5, var6);
- var6 = var1.transformState != 0 ? var1.transform : null;
- PathIterator var8 = var2.getPathIterator(var6);
-
- try {
- boolean var9 = var1.strokeHint != 2;
- DuctusRenderer.feedConsumer(var8, var7, var9, 0.25F);
- } catch (PathException var10) {
- throw new InternalError("Unable to Stroke shape (" + ((Throwable)var10).getMessage() + ")");
- }
-
- this.renderSpans(var1, var4, var2, var3);
- }
-
- public void fill(SunGraphics2D var1, Shape var2) {
- if (var2 instanceof Rectangle2D && (var1.transform.getType() & 48) == 0) {
- this.renderRect(var1, (Rectangle2D)var2);
- } else {
- this.renderPath(var1, var2);
- }
- }
-
- public abstract Object startSequence(SunGraphics2D var1, Shape var2, Rectangle var3, int[] var4);
-
- public abstract void renderSpan(Object var1, int var2, int var3, int var4);
-
- public abstract void renderBox(Object var1, int var2, int var3, int var4, int var5);
-
- public abstract void endSequence(Object var1);
-
- public void renderRect(SunGraphics2D var1, Rectangle2D var2) {
- double[] var3 = new double[]{((RectangularShape)var2).getX(), ((RectangularShape)var2).getY(), ((RectangularShape)var2).getWidth(), ((RectangularShape)var2).getHeight()};
- var3[2] += var3[0];
- var3[3] += var3[1];
- if (!(var3[2] <= var3[0]) && !(var3[3] <= var3[1])) {
- var1.transform.transform(var3, 0, var3, 0, 2);
- if (var3[2] < var3[0]) {
- double var4 = var3[2];
- var3[2] = var3[0];
- var3[0] = var4;
- }
-
- if (var3[3] < var3[1]) {
- double var13 = var3[3];
- var3[3] = var3[1];
- var3[1] = var13;
- }
-
- int[] var14 = new int[]{(int)var3[0], (int)var3[1], (int)var3[2], (int)var3[3]};
- Rectangle var5 = new Rectangle(var14[0], var14[1], var14[2] - var14[0], var14[3] - var14[1]);
- Rectangle var6 = var1.getCompBounds();
- var14[0] = Math.max(var14[0], var6.x);
- var14[1] = Math.max(var14[1], var6.y);
- var14[2] = Math.min(var14[2], var6.x + var6.width);
- var14[3] = Math.min(var14[3], var6.y + var6.height);
- if (var14[0] < var14[2] && var14[1] < var14[3]) {
- Object var7 = this.startSequence(var1, var2, var5, var14);
- if (var1.clipRegion == null) {
- this.renderBox(var7, var14[0], var14[1], var14[2] - var14[0], var14[3] - var14[1]);
- } else {
- RegionIterator var8 = var1.clipRegion.getIterator();
- int var9 = var14[0];
- int var10 = var14[1];
- int var11 = var14[2];
- int var12 = var14[3];
-
- while(var8.nextYRange(var14)) {
- if (var14[0] < var10) {
- var14[0] = var10;
- }
-
- if (var14[1] > var12) {
- if (var14[0] >= var12) {
- break;
- }
-
- var14[1] = var12;
- }
-
- if (var14[0] < var14[1]) {
- while(var8.nextXBand(var14)) {
- if (var14[2] < var9) {
- var14[2] = var9;
- }
-
- if (var14[3] > var11) {
- if (var14[2] >= var11) {
- break;
- }
-
- var14[3] = var11;
- }
-
- if (var14[2] < var14[3]) {
- this.renderBox(var7, var14[2], var14[0], var14[3] - var14[2], var14[1] - var14[0]);
- }
- }
- }
- }
- }
-
- this.endSequence(var7);
- }
- }
- }
-
- public void renderPath(SunGraphics2D var1, Shape var2) {
- Rectangle var3 = var1.getCompBounds();
- ShapeSpanIterator var4 = new ShapeSpanIterator();
-
- try {
- var4.setOutputArea(var3);
- var4.appendPath(var2.getPathIterator(var1.transform));
- this.renderSpans(var1, var3, var2, var4);
- } finally {
- var4.dispose();
- }
-
- }
-
- public void renderSpans(SunGraphics2D var1, Rectangle var2, Shape var3, ShapeSpanIterator var4) {
- Object var5 = null;
- int[] var6 = new int[4];
-
- try {
- var4.getPathBox(var6);
- Rectangle var7 = new Rectangle(var6[0], var6[1], var6[2] - var6[0], var6[3] - var6[1]);
- var6[0] = Math.max(var6[0], var2.x);
- var6[1] = Math.max(var6[1], var2.y);
- var6[2] = Math.min(var6[2], var2.x + var2.width);
- var6[3] = Math.min(var6[3], var2.y + var2.height);
- if (var6[0] < var6[2] && var6[1] < var6[3]) {
- var5 = this.startSequence(var1, var3, var7, var6);
- if (var1.clipRegion == null) {
- this.spanLoop(var5, var4, var6);
- } else {
- this.spanClipLoop(var5, var4, var1.clipRegion, var6);
- }
-
- return;
- }
- } finally {
- if (var5 != null) {
- this.endSequence(var5);
- }
-
- }
-
- }
-
- public void spanLoop(Object var1, ShapeSpanIterator var2, int[] var3) {
- while(var2.nextSpan(var3)) {
- this.renderSpan(var1, var3[1], var3[0], var3[2]);
- }
-
- }
-
- public void spanClipLoop(Object var1, ShapeSpanIterator var2, Region var3, int[] var4) {
- int[] var5 = new int[4];
- if (var2.nextSpan(var4)) {
- int var6 = var4[1];
- int var7 = var4[0];
- int var8 = var4[2];
- RegionIterator var9 = var3.getIterator();
- if (var9.nextYRange(var5)) {
- int var10 = var5[0];
- int var11 = var5[1];
- RegionIterator var12 = var9.createCopy();
- int var13 = Integer.MIN_VALUE;
- int var14 = Integer.MIN_VALUE;
-
- while(true) {
- if (var6 < var10) {
- if (!var2.nextSpan(var4)) {
- break;
- }
-
- if (var6 != var4[1]) {
- var6 = var4[1];
- var12.copyStateFrom(var9);
- var14 = Integer.MIN_VALUE;
- var13 = Integer.MIN_VALUE;
- }
-
- var7 = var4[0];
- var8 = var4[2];
- } else if (var6 >= var11) {
- if (!var9.nextYRange(var5)) {
- break;
- }
-
- var12.copyStateFrom(var9);
- var10 = var5[0];
- var11 = var5[1];
- var14 = Integer.MIN_VALUE;
- var13 = Integer.MIN_VALUE;
- } else if (var8 <= var13) {
- if (!var2.nextSpan(var4)) {
- break;
- }
-
- if (var6 != var4[1]) {
- var6 = var4[1];
- var12.copyStateFrom(var9);
- var14 = Integer.MIN_VALUE;
- var13 = Integer.MIN_VALUE;
- }
-
- var7 = var4[0];
- var8 = var4[2];
- } else if (var7 >= var14) {
- if (!var12.nextXBand(var5)) {
- var12.copyStateFrom(var9);
- var10 = var6 + 1;
- var14 = Integer.MIN_VALUE;
- var13 = Integer.MIN_VALUE;
- } else {
- var13 = var5[2];
- var14 = var5[3];
- }
- } else {
- if (var7 < var13) {
- var7 = var13;
- }
-
- if (var8 < var14) {
- this.renderSpan(var1, var6, var7, var8);
- var13 = var8;
- } else {
- this.renderSpan(var1, var6, var7, var14);
- var7 = var14;
- }
- }
- }
-
- }
- }
- }
- }
-