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 / java2d / pipe / SpanShapeRenderer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  5.0 KB  |  277 lines

  1. package sun.java2d.pipe;
  2.  
  3. import java.awt.BasicStroke;
  4. import java.awt.Rectangle;
  5. import java.awt.Shape;
  6. import java.awt.geom.AffineTransform;
  7. import java.awt.geom.PathIterator;
  8. import java.awt.geom.Rectangle2D;
  9. import java.awt.geom.RectangularShape;
  10. import sun.dc.path.PathConsumer;
  11. import sun.dc.path.PathException;
  12. import sun.java2d.SunGraphics2D;
  13.  
  14. public abstract class SpanShapeRenderer implements ShapeDrawPipe {
  15.    public static final int NON_RECTILINEAR_TRANSFORM_MASK = 48;
  16.  
  17.    public void draw(SunGraphics2D var1, Shape var2) {
  18.       if (var1.stroke instanceof BasicStroke) {
  19.          ShapeSpanIterator var3 = new ShapeSpanIterator();
  20.  
  21.          try {
  22.             this.drawBasicStroke(var1, var2, var3);
  23.          } finally {
  24.             var3.dispose();
  25.          }
  26.       } else {
  27.          this.renderPath(var1, var1.stroke.createStrokedShape(var2));
  28.       }
  29.  
  30.    }
  31.  
  32.    public void drawBasicStroke(SunGraphics2D var1, Shape var2, ShapeSpanIterator var3) {
  33.       Rectangle var4 = var1.getCompBounds();
  34.       var3.setOutputArea(var4);
  35.       var3.setRule(1);
  36.       BasicStroke var5 = (BasicStroke)var1.stroke;
  37.       AffineTransform var6 = var1.transformState == 2 ? var1.transform : null;
  38.       PathConsumer var7 = DuctusRenderer.createStroker(var3, var5, var6);
  39.       var6 = var1.transformState != 0 ? var1.transform : null;
  40.       PathIterator var8 = var2.getPathIterator(var6);
  41.  
  42.       try {
  43.          boolean var9 = var1.strokeHint != 2;
  44.          DuctusRenderer.feedConsumer(var8, var7, var9, 0.25F);
  45.       } catch (PathException var10) {
  46.          throw new InternalError("Unable to Stroke shape (" + ((Throwable)var10).getMessage() + ")");
  47.       }
  48.  
  49.       this.renderSpans(var1, var4, var2, var3);
  50.    }
  51.  
  52.    public void fill(SunGraphics2D var1, Shape var2) {
  53.       if (var2 instanceof Rectangle2D && (var1.transform.getType() & 48) == 0) {
  54.          this.renderRect(var1, (Rectangle2D)var2);
  55.       } else {
  56.          this.renderPath(var1, var2);
  57.       }
  58.    }
  59.  
  60.    public abstract Object startSequence(SunGraphics2D var1, Shape var2, Rectangle var3, int[] var4);
  61.  
  62.    public abstract void renderSpan(Object var1, int var2, int var3, int var4);
  63.  
  64.    public abstract void renderBox(Object var1, int var2, int var3, int var4, int var5);
  65.  
  66.    public abstract void endSequence(Object var1);
  67.  
  68.    public void renderRect(SunGraphics2D var1, Rectangle2D var2) {
  69.       double[] var3 = new double[]{((RectangularShape)var2).getX(), ((RectangularShape)var2).getY(), ((RectangularShape)var2).getWidth(), ((RectangularShape)var2).getHeight()};
  70.       var3[2] += var3[0];
  71.       var3[3] += var3[1];
  72.       if (!(var3[2] <= var3[0]) && !(var3[3] <= var3[1])) {
  73.          var1.transform.transform(var3, 0, var3, 0, 2);
  74.          if (var3[2] < var3[0]) {
  75.             double var4 = var3[2];
  76.             var3[2] = var3[0];
  77.             var3[0] = var4;
  78.          }
  79.  
  80.          if (var3[3] < var3[1]) {
  81.             double var13 = var3[3];
  82.             var3[3] = var3[1];
  83.             var3[1] = var13;
  84.          }
  85.  
  86.          int[] var14 = new int[]{(int)var3[0], (int)var3[1], (int)var3[2], (int)var3[3]};
  87.          Rectangle var5 = new Rectangle(var14[0], var14[1], var14[2] - var14[0], var14[3] - var14[1]);
  88.          Rectangle var6 = var1.getCompBounds();
  89.          var14[0] = Math.max(var14[0], var6.x);
  90.          var14[1] = Math.max(var14[1], var6.y);
  91.          var14[2] = Math.min(var14[2], var6.x + var6.width);
  92.          var14[3] = Math.min(var14[3], var6.y + var6.height);
  93.          if (var14[0] < var14[2] && var14[1] < var14[3]) {
  94.             Object var7 = this.startSequence(var1, var2, var5, var14);
  95.             if (var1.clipRegion == null) {
  96.                this.renderBox(var7, var14[0], var14[1], var14[2] - var14[0], var14[3] - var14[1]);
  97.             } else {
  98.                RegionIterator var8 = var1.clipRegion.getIterator();
  99.                int var9 = var14[0];
  100.                int var10 = var14[1];
  101.                int var11 = var14[2];
  102.                int var12 = var14[3];
  103.  
  104.                while(var8.nextYRange(var14)) {
  105.                   if (var14[0] < var10) {
  106.                      var14[0] = var10;
  107.                   }
  108.  
  109.                   if (var14[1] > var12) {
  110.                      if (var14[0] >= var12) {
  111.                         break;
  112.                      }
  113.  
  114.                      var14[1] = var12;
  115.                   }
  116.  
  117.                   if (var14[0] < var14[1]) {
  118.                      while(var8.nextXBand(var14)) {
  119.                         if (var14[2] < var9) {
  120.                            var14[2] = var9;
  121.                         }
  122.  
  123.                         if (var14[3] > var11) {
  124.                            if (var14[2] >= var11) {
  125.                               break;
  126.                            }
  127.  
  128.                            var14[3] = var11;
  129.                         }
  130.  
  131.                         if (var14[2] < var14[3]) {
  132.                            this.renderBox(var7, var14[2], var14[0], var14[3] - var14[2], var14[1] - var14[0]);
  133.                         }
  134.                      }
  135.                   }
  136.                }
  137.             }
  138.  
  139.             this.endSequence(var7);
  140.          }
  141.       }
  142.    }
  143.  
  144.    public void renderPath(SunGraphics2D var1, Shape var2) {
  145.       Rectangle var3 = var1.getCompBounds();
  146.       ShapeSpanIterator var4 = new ShapeSpanIterator();
  147.  
  148.       try {
  149.          var4.setOutputArea(var3);
  150.          var4.appendPath(var2.getPathIterator(var1.transform));
  151.          this.renderSpans(var1, var3, var2, var4);
  152.       } finally {
  153.          var4.dispose();
  154.       }
  155.  
  156.    }
  157.  
  158.    public void renderSpans(SunGraphics2D var1, Rectangle var2, Shape var3, ShapeSpanIterator var4) {
  159.       Object var5 = null;
  160.       int[] var6 = new int[4];
  161.  
  162.       try {
  163.          var4.getPathBox(var6);
  164.          Rectangle var7 = new Rectangle(var6[0], var6[1], var6[2] - var6[0], var6[3] - var6[1]);
  165.          var6[0] = Math.max(var6[0], var2.x);
  166.          var6[1] = Math.max(var6[1], var2.y);
  167.          var6[2] = Math.min(var6[2], var2.x + var2.width);
  168.          var6[3] = Math.min(var6[3], var2.y + var2.height);
  169.          if (var6[0] < var6[2] && var6[1] < var6[3]) {
  170.             var5 = this.startSequence(var1, var3, var7, var6);
  171.             if (var1.clipRegion == null) {
  172.                this.spanLoop(var5, var4, var6);
  173.             } else {
  174.                this.spanClipLoop(var5, var4, var1.clipRegion, var6);
  175.             }
  176.  
  177.             return;
  178.          }
  179.       } finally {
  180.          if (var5 != null) {
  181.             this.endSequence(var5);
  182.          }
  183.  
  184.       }
  185.  
  186.    }
  187.  
  188.    public void spanLoop(Object var1, ShapeSpanIterator var2, int[] var3) {
  189.       while(var2.nextSpan(var3)) {
  190.          this.renderSpan(var1, var3[1], var3[0], var3[2]);
  191.       }
  192.  
  193.    }
  194.  
  195.    public void spanClipLoop(Object var1, ShapeSpanIterator var2, Region var3, int[] var4) {
  196.       int[] var5 = new int[4];
  197.       if (var2.nextSpan(var4)) {
  198.          int var6 = var4[1];
  199.          int var7 = var4[0];
  200.          int var8 = var4[2];
  201.          RegionIterator var9 = var3.getIterator();
  202.          if (var9.nextYRange(var5)) {
  203.             int var10 = var5[0];
  204.             int var11 = var5[1];
  205.             RegionIterator var12 = var9.createCopy();
  206.             int var13 = Integer.MIN_VALUE;
  207.             int var14 = Integer.MIN_VALUE;
  208.  
  209.             while(true) {
  210.                if (var6 < var10) {
  211.                   if (!var2.nextSpan(var4)) {
  212.                      break;
  213.                   }
  214.  
  215.                   if (var6 != var4[1]) {
  216.                      var6 = var4[1];
  217.                      var12.copyStateFrom(var9);
  218.                      var14 = Integer.MIN_VALUE;
  219.                      var13 = Integer.MIN_VALUE;
  220.                   }
  221.  
  222.                   var7 = var4[0];
  223.                   var8 = var4[2];
  224.                } else if (var6 >= var11) {
  225.                   if (!var9.nextYRange(var5)) {
  226.                      break;
  227.                   }
  228.  
  229.                   var12.copyStateFrom(var9);
  230.                   var10 = var5[0];
  231.                   var11 = var5[1];
  232.                   var14 = Integer.MIN_VALUE;
  233.                   var13 = Integer.MIN_VALUE;
  234.                } else if (var8 <= var13) {
  235.                   if (!var2.nextSpan(var4)) {
  236.                      break;
  237.                   }
  238.  
  239.                   if (var6 != var4[1]) {
  240.                      var6 = var4[1];
  241.                      var12.copyStateFrom(var9);
  242.                      var14 = Integer.MIN_VALUE;
  243.                      var13 = Integer.MIN_VALUE;
  244.                   }
  245.  
  246.                   var7 = var4[0];
  247.                   var8 = var4[2];
  248.                } else if (var7 >= var14) {
  249.                   if (!var12.nextXBand(var5)) {
  250.                      var12.copyStateFrom(var9);
  251.                      var10 = var6 + 1;
  252.                      var14 = Integer.MIN_VALUE;
  253.                      var13 = Integer.MIN_VALUE;
  254.                   } else {
  255.                      var13 = var5[2];
  256.                      var14 = var5[3];
  257.                   }
  258.                } else {
  259.                   if (var7 < var13) {
  260.                      var7 = var13;
  261.                   }
  262.  
  263.                   if (var8 < var14) {
  264.                      this.renderSpan(var1, var6, var7, var8);
  265.                      var13 = var8;
  266.                   } else {
  267.                      this.renderSpan(var1, var6, var7, var14);
  268.                      var7 = var14;
  269.                   }
  270.                }
  271.             }
  272.  
  273.          }
  274.       }
  275.    }
  276. }
  277.