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 / SunGraphics2D.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  26.8 KB  |  1,638 lines

  1. package sun.java2d;
  2.  
  3. import java.awt.AWTPermission;
  4. import java.awt.AlphaComposite;
  5. import java.awt.BasicStroke;
  6. import java.awt.Color;
  7. import java.awt.Composite;
  8. import java.awt.Font;
  9. import java.awt.FontMetrics;
  10. import java.awt.Graphics;
  11. import java.awt.Graphics2D;
  12. import java.awt.GraphicsConfiguration;
  13. import java.awt.Paint;
  14. import java.awt.Point;
  15. import java.awt.Rectangle;
  16. import java.awt.RenderingHints;
  17. import java.awt.Shape;
  18. import java.awt.Stroke;
  19. import java.awt.font.FontRenderContext;
  20. import java.awt.font.GlyphVector;
  21. import java.awt.font.TextLayout;
  22. import java.awt.geom.AffineTransform;
  23. import java.awt.geom.Area;
  24. import java.awt.geom.GeneralPath;
  25. import java.awt.geom.NoninvertibleTransformException;
  26. import java.awt.geom.PathIterator;
  27. import java.awt.geom.Point2D;
  28. import java.awt.geom.Rectangle2D;
  29. import java.awt.geom.RectangularShape;
  30. import java.awt.image.AffineTransformOp;
  31. import java.awt.image.BufferedImage;
  32. import java.awt.image.BufferedImageOp;
  33. import java.awt.image.ColorModel;
  34. import java.awt.image.DirectColorModel;
  35. import java.awt.image.ImageObserver;
  36. import java.awt.image.IndexColorModel;
  37. import java.awt.image.Raster;
  38. import java.awt.image.RenderedImage;
  39. import java.awt.image.WritableRaster;
  40. import java.awt.image.renderable.RenderContext;
  41. import java.awt.image.renderable.RenderableImage;
  42. import java.security.Permission;
  43. import java.text.AttributedCharacterIterator;
  44. import java.util.Hashtable;
  45. import java.util.Map;
  46. import sun.awt.ConstrainableGraphics;
  47. import sun.awt.SunHints;
  48. import sun.awt.SunHints.Value;
  49. import sun.awt.font.FontDesignMetrics;
  50. import sun.awt.font.ShapingException;
  51. import sun.awt.image.BytePackedRaster;
  52. import sun.java2d.loops.DrawString;
  53. import sun.java2d.loops.ImageData;
  54. import sun.java2d.loops.RasterOutputManager;
  55. import sun.java2d.loops.XORComposite;
  56. import sun.java2d.pipe.CompositePipe;
  57. import sun.java2d.pipe.PixelDrawPipe;
  58. import sun.java2d.pipe.PixelFillPipe;
  59. import sun.java2d.pipe.Region;
  60. import sun.java2d.pipe.RegionIterator;
  61. import sun.java2d.pipe.ShapeDrawPipe;
  62. import sun.java2d.pipe.ShapeSpanIterator;
  63. import sun.java2d.pipe.TextPipe;
  64. import sun.java2d.pipe.ValidatePipe;
  65.  
  66. public abstract class SunGraphics2D extends Graphics2D implements ConstrainableGraphics, Cloneable {
  67.    public static final ColorModel XRGBModel = new DirectColorModel(24, 16711680, 65280, 255);
  68.    public static final int LOCK_OK = 1;
  69.    public static final int UNLOCK_OK = 2;
  70.    public static final int LOCK_FORMAT_PROBLEM = 3;
  71.    public static final int LOCK_GEOMETRY_PROBLEM = 4;
  72.    public static final int LOCK_DATA_STRUCT_PROBLEM = 5;
  73.    public static final int LOCK_NOT_LOCKED = 6;
  74.    public static final int LOCK_ALREADY_LOCKED = 7;
  75.    public static final int LOCK_FASTEST_UNAVAILABLE = 8;
  76.    public static final int PAINT_TILE = 2;
  77.    public static final int PAINT_SINGLECOLOR = 1;
  78.    public static final int PAINT_SOLIDCOLOR = 0;
  79.    public static final int COMP_CUSTOM = 3;
  80.    public static final int COMP_XOR = 2;
  81.    public static final int COMP_ALPHA = 1;
  82.    public static final int COMP_ISCOPY = 0;
  83.    public static final int STROKE_CUSTOM = 1;
  84.    public static final int STROKE_BASIC = 0;
  85.    public static final int TRANSFORM_GENERIC = 2;
  86.    public static final int TRANSFORM_TRANSLATEONLY = 1;
  87.    public static final int TRANSFORM_ISIDENT = 0;
  88.    public static final int CLIP_SHAPE = 2;
  89.    public static final int CLIP_RECTANGULAR = 1;
  90.    public static final int CLIP_DEVICE = 0;
  91.    public static final int XOR_MODE = 1;
  92.    public static final int PAINT_MODE = 0;
  93.    public int paintState;
  94.    public int compositeState;
  95.    public int strokeState;
  96.    public int transformState;
  97.    public int clipState;
  98.    public int modeState;
  99.    protected static final Color nullXORColor = new Color(0, 0, 0, 0);
  100.    public Color foregroundColor;
  101.    public Color backgroundColor;
  102.    public Color xorColor;
  103.    public AffineTransform transform;
  104.    public int transX;
  105.    public int transY;
  106.    public boolean complexTransform;
  107.    protected static final Stroke defaultStroke = new BasicStroke();
  108.    protected static final Composite defaultComposite;
  109.    public Stroke stroke;
  110.    public Composite composite;
  111.    public Paint paint;
  112.    public int renderHint;
  113.    public int antialiasHint;
  114.    private int textAntialiasHint;
  115.    private int fractionalMetricsHint;
  116.    private int interpolationHint;
  117.    public int strokeHint;
  118.    protected Font font;
  119.    protected FontMetrics fontMetrics;
  120.    public RenderingHints hints;
  121.    public Rectangle constrainClip;
  122.    public int constrainX;
  123.    public int constrainY;
  124.    public Region clipRegion;
  125.    public Shape usrClip;
  126.    protected Rectangle devClip;
  127.    protected Rectangle compBounds;
  128.    protected static ValidatePipe invalidpipe;
  129.    public PixelDrawPipe drawpipe;
  130.    public PixelFillPipe fillpipe;
  131.    public ShapeDrawPipe shapepipe;
  132.    public TextPipe textpipe;
  133.    public CompositePipe alphapipe;
  134.    private Object copyAreaStateCache;
  135.    private Object rpics;
  136.    public boolean simpleText = true;
  137.    private Object dscc;
  138.    private Object dvcc;
  139.    private Object dccc;
  140.    private Object dbcc;
  141.    public DrawString drawStringClass = null;
  142.    public static CachedMetrics[] metricscache;
  143.    static Permission compPermission;
  144.    static final int NON_RECTILINEAR_TRANSFORM_MASK = 48;
  145.  
  146.    protected SunGraphics2D() {
  147.       this.foregroundColor = Color.white;
  148.       this.backgroundColor = Color.black;
  149.       this.xorColor = nullXORColor;
  150.       this.transform = new AffineTransform();
  151.       this.stroke = defaultStroke;
  152.       this.composite = defaultComposite;
  153.       this.paint = this.foregroundColor;
  154.       this.renderHint = 0;
  155.       this.antialiasHint = 1;
  156.       this.textAntialiasHint = 0;
  157.       this.fractionalMetricsHint = 1;
  158.       this.interpolationHint = -1;
  159.       this.strokeHint = 0;
  160.       this.invalidatePipe();
  161.    }
  162.  
  163.    protected Object clone() {
  164.       try {
  165.          SunGraphics2D var1 = (SunGraphics2D)super.clone();
  166.          var1.transform = new AffineTransform(this.transform);
  167.          if (this.hints != null) {
  168.             var1.hints = (RenderingHints)this.hints.clone();
  169.          }
  170.  
  171.          var1.invalidatePipe();
  172.          return var1;
  173.       } catch (CloneNotSupportedException var2) {
  174.          return null;
  175.       }
  176.    }
  177.  
  178.    public Graphics create() {
  179.       return (Graphics)this.clone();
  180.    }
  181.  
  182.    public void setDevClip(int var1, int var2, int var3, int var4) {
  183.       Rectangle var5 = new Rectangle(var1, var2, var3, var4);
  184.       Rectangle var6 = this.constrainClip;
  185.       if (var6 == null) {
  186.          this.devClip = var5;
  187.       } else {
  188.          this.devClip = var5.intersection(var6);
  189.       }
  190.  
  191.       this.invalidateClip();
  192.    }
  193.  
  194.    public void constrain(int var1, int var2, int var3, int var4) {
  195.       Rectangle var5 = this.constrainClip;
  196.       if (var5 == null || (var1 | var2) != 0 || var5.x < this.constrainX || var5.y < this.constrainY || this.constrainX + var3 < var5.x + var5.width || this.constrainY + var4 < var5.y + var5.height) {
  197.          if ((var1 | var2) != 0) {
  198.             this.constrainX += var1;
  199.             this.constrainY += var2;
  200.             if (this.transformState == 2) {
  201.                AffineTransform var6 = AffineTransform.getTranslateInstance((double)var1, (double)var2);
  202.                this.transform.preConcatenate(var6);
  203.                this.invalidateTransform();
  204.             } else {
  205.                this.translate(var1, var2);
  206.             }
  207.          }
  208.  
  209.          Rectangle var7 = new Rectangle(this.constrainX, this.constrainY, var3, var4);
  210.          if (var5 != null) {
  211.             if (var7.contains(var5)) {
  212.                return;
  213.             }
  214.  
  215.             var7 = var7.intersection(var5);
  216.          }
  217.  
  218.          this.constrainClip = var7;
  219.          if (!var7.contains(this.devClip)) {
  220.             this.devClip = this.devClip.intersection(var7);
  221.             this.invalidateClip();
  222.          }
  223.  
  224.       }
  225.    }
  226.  
  227.    protected void invalidatePipe() {
  228.       this.drawpipe = invalidpipe;
  229.       this.fillpipe = invalidpipe;
  230.       this.shapepipe = invalidpipe;
  231.       this.textpipe = invalidpipe;
  232.       this.alphapipe = null;
  233.       this.dscc = null;
  234.       this.dbcc = null;
  235.       this.dccc = null;
  236.       this.dvcc = null;
  237.    }
  238.  
  239.    public void validatePipe() {
  240.       this.getOutputManager().validatePipe(this);
  241.    }
  242.  
  243.    Shape intersectShapes(Shape var1, Shape var2, boolean var3, boolean var4) {
  244.       if (var1 instanceof Rectangle && var2 instanceof Rectangle) {
  245.          return ((Rectangle)var1).intersection((Rectangle)var2);
  246.       } else if (var1 instanceof Rectangle2D) {
  247.          return this.intersectRectShape((Rectangle2D)var1, var2, var3, var4);
  248.       } else {
  249.          return var2 instanceof Rectangle2D ? this.intersectRectShape((Rectangle2D)var2, var1, var4, var3) : this.intersectByArea(var1, var2, var3, var4);
  250.       }
  251.    }
  252.  
  253.    Shape intersectRectShape(Rectangle2D var1, Shape var2, boolean var3, boolean var4) {
  254.       if (var2 instanceof Rectangle2D) {
  255.          Rectangle2D var5 = (Rectangle2D)var2;
  256.          Object var6;
  257.          if (!var3) {
  258.             var6 = var1;
  259.          } else if (!var4) {
  260.             var6 = var5;
  261.          } else {
  262.             var6 = new Rectangle2D.Float();
  263.          }
  264.  
  265.          double var7 = Math.max(((RectangularShape)var1).getX(), ((RectangularShape)var5).getX());
  266.          double var9 = Math.min(((RectangularShape)var1).getX() + ((RectangularShape)var1).getWidth(), ((RectangularShape)var5).getX() + ((RectangularShape)var5).getWidth());
  267.          double var11 = Math.max(((RectangularShape)var1).getY(), ((RectangularShape)var5).getY());
  268.          double var13 = Math.min(((RectangularShape)var1).getY() + ((RectangularShape)var1).getHeight(), ((RectangularShape)var5).getY() + ((RectangularShape)var5).getHeight());
  269.          if (!(var9 - var7 < (double)0.0F) && !(var13 - var11 < (double)0.0F)) {
  270.             ((RectangularShape)var6).setFrameFromDiagonal(var7, var11, var9, var13);
  271.          } else {
  272.             ((RectangularShape)var6).setFrameFromDiagonal((double)0.0F, (double)0.0F, (double)0.0F, (double)0.0F);
  273.          }
  274.  
  275.          return (Shape)var6;
  276.       } else if (((RectangularShape)var1).contains(var2.getBounds2D())) {
  277.          if (var4) {
  278.             var2 = cloneShape(var2);
  279.          }
  280.  
  281.          return var2;
  282.       } else {
  283.          return this.intersectByArea(var1, var2, var3, var4);
  284.       }
  285.    }
  286.  
  287.    protected static Shape cloneShape(Shape var0) {
  288.       return new GeneralPath(var0);
  289.    }
  290.  
  291.    Shape intersectByArea(Shape var1, Shape var2, boolean var3, boolean var4) {
  292.       Area var5;
  293.       if (!var3 && var1 instanceof Area) {
  294.          var5 = (Area)var1;
  295.       } else if (!var4 && var2 instanceof Area) {
  296.          var5 = (Area)var2;
  297.          var2 = var1;
  298.       } else {
  299.          var5 = new Area(var1);
  300.       }
  301.  
  302.       Area var6;
  303.       if (var2 instanceof Area) {
  304.          var6 = (Area)var2;
  305.       } else {
  306.          var6 = new Area(var2);
  307.       }
  308.  
  309.       var5.intersect(var6);
  310.       return (Shape)(var5.isRectangular() ? var5.getBounds() : var5);
  311.    }
  312.  
  313.    public Rectangle getCompBounds() {
  314.       Rectangle var1;
  315.       if ((var1 = this.compBounds) == null) {
  316.          switch (this.clipState) {
  317.             case 0:
  318.                var1 = this.devClip;
  319.                break;
  320.             case 1:
  321.                if (this.usrClip instanceof Rectangle) {
  322.                   var1 = this.devClip.intersection((Rectangle)this.usrClip);
  323.                } else {
  324.                   var1 = this.devClip.intersection(this.usrClip.getBounds());
  325.                }
  326.                break;
  327.             case 2:
  328.                PathIterator var2 = this.usrClip.getPathIterator((AffineTransform)null);
  329.                int[] var3 = new int[4];
  330.                ShapeSpanIterator var4 = new ShapeSpanIterator();
  331.                var4.setOutputArea(this.devClip);
  332.                var4.appendPath(var2);
  333.                var4.getPathBox(var3);
  334.                Rectangle var6 = new Rectangle(var3[0], var3[1], var3[2] - var3[0], var3[3] - var3[1]);
  335.                var1 = var6.intersection(this.devClip);
  336.                Region var5 = new Region();
  337.                var5.setOutputArea(var1);
  338.                var5.appendSpans(var4);
  339.                this.clipRegion = var5;
  340.          }
  341.  
  342.          this.compBounds = var1;
  343.       }
  344.  
  345.       return var1;
  346.    }
  347.  
  348.    protected BufferedImage convertCM(BufferedImage var1, ColorModel var2) {
  349.       WritableRaster var3 = var2.createCompatibleWritableRaster(var1.getWidth(), var1.getHeight());
  350.       BufferedImage var4 = new BufferedImage(var2, var3, var1.isAlphaPremultiplied(), (Hashtable)null);
  351.  
  352.       for(int var5 = 0; var5 < var1.getHeight(); ++var5) {
  353.          for(int var6 = 0; var6 < var1.getWidth(); ++var6) {
  354.             var4.setRGB(var6, var5, var1.getRGB(var6, var5));
  355.          }
  356.       }
  357.  
  358.       return var4;
  359.    }
  360.  
  361.    public WritableRaster convertRaster(Raster var1, ColorModel var2, ColorModel var3) {
  362.       if (!(var2 instanceof IndexColorModel) || !var3.equals(ColorModel.getRGBdefault()) && !var3.equals(XRGBModel)) {
  363.          BufferedImage var8 = new BufferedImage(var3, var3.createCompatibleWritableRaster(var1.getWidth(), var1.getHeight()), var3.isAlphaPremultiplied(), (Hashtable)null);
  364.          Object var9 = var1.getDataElements(0, 0, (Object)null);
  365.  
  366.          for(int var6 = 0; var6 < var8.getHeight(); ++var6) {
  367.             for(int var7 = 0; var7 < var8.getWidth(); ++var7) {
  368.                var8.setRGB(var7, var6, var2.getRGB(var1.getDataElements(var7, var6, var9)));
  369.             }
  370.          }
  371.  
  372.          return var8.getRaster();
  373.       } else {
  374.          IndexColorModel var4 = (IndexColorModel)var2;
  375.          BufferedImage var5 = var4.convertToIntDiscrete(var1, false);
  376.          return var5.getRaster();
  377.       }
  378.    }
  379.  
  380.    private static float veclength(float var0, float var1) {
  381.       return (float)Math.sqrt((double)(var0 * var0 + var1 * var1));
  382.    }
  383.  
  384.    public Font getFont() {
  385.       if (this.font == null) {
  386.          this.font = new Font("Dialog", 10, 0);
  387.       }
  388.  
  389.       return this.font;
  390.    }
  391.  
  392.    public void setFont(Font var1) {
  393.       if (var1 != null && var1 != this.font) {
  394.          this.font = var1;
  395.          this.fontMetrics = null;
  396.          this.dscc = null;
  397.          this.dbcc = null;
  398.          this.dccc = null;
  399.          this.dvcc = null;
  400.       }
  401.  
  402.    }
  403.  
  404.    public static synchronized FontMetrics makeFontMetrics(Font var0, FontRenderContext var1) {
  405.       boolean var2 = var1.isAntiAliased();
  406.       boolean var3 = var1.usesFractionalMetrics();
  407.  
  408.       int var4;
  409.       for(var4 = 0; var4 < metricscache.length; ++var4) {
  410.          CachedMetrics var5 = metricscache[var4];
  411.          if (var5 == null) {
  412.             break;
  413.          }
  414.  
  415.          if (var5.matches(var0, var2, var3)) {
  416.             if (var4 > 1) {
  417.                System.arraycopy(metricscache, 0, metricscache, 1, var4);
  418.                metricscache[0] = var5;
  419.             }
  420.  
  421.             return var5.fm;
  422.          }
  423.       }
  424.  
  425.       FontDesignMetrics var6 = new FontDesignMetrics(var0, var1);
  426.       if (var4 == metricscache.length) {
  427.          System.arraycopy(metricscache, 0, metricscache, 1, var4 - 1);
  428.          var4 = 0;
  429.       }
  430.  
  431.       metricscache[var4] = new CachedMetrics(var0, var2, var3, var6);
  432.       return var6;
  433.    }
  434.  
  435.    public FontMetrics getFontMetrics(Font var1) {
  436.       if (this.fontMetrics != null && var1 == this.font) {
  437.          return this.fontMetrics;
  438.       } else {
  439.          FontMetrics var2 = makeFontMetrics(var1, this.getFontRenderContext());
  440.          if (this.font == var1) {
  441.             this.fontMetrics = var2;
  442.          }
  443.  
  444.          return var2;
  445.       }
  446.    }
  447.  
  448.    public boolean hit(Rectangle var1, Shape var2, boolean var3) {
  449.       if (var3) {
  450.          var2 = this.stroke.createStrokedShape(var2);
  451.       }
  452.  
  453.       var2 = this.transformShape(var2);
  454.       if ((this.constrainX | this.constrainY) != 0) {
  455.          var1 = new Rectangle(var1);
  456.          var1.translate(this.constrainX, this.constrainY);
  457.       }
  458.  
  459.       return var2.intersects(var1);
  460.    }
  461.  
  462.    public abstract ColorModel getDeviceColorModel();
  463.  
  464.    public abstract GraphicsConfiguration getDeviceConfiguration();
  465.  
  466.    public abstract OutputManager getOutputManager();
  467.  
  468.    public void setComposite(Composite var1) {
  469.       if (var1 == null) {
  470.          throw new IllegalArgumentException("null Composite");
  471.       } else {
  472.          byte var2;
  473.          byte var3;
  474.          if (var1 instanceof AlphaComposite) {
  475.             var3 = 0;
  476.             AlphaComposite var4 = (AlphaComposite)var1;
  477.             if (!(var4.getAlpha() >= 1.0F) || var4.getRule() != 2 && var4.getRule() != 3) {
  478.                var2 = 1;
  479.             } else {
  480.                var2 = 0;
  481.             }
  482.          } else if (var1 instanceof XORComposite) {
  483.             var3 = 1;
  484.             var2 = 2;
  485.          } else {
  486.             this.checkCustomComposite();
  487.             var3 = 0;
  488.             var2 = 3;
  489.          }
  490.  
  491.          if (this.compositeState == var2 && this.modeState == var3) {
  492.             this.dscc = null;
  493.             this.dbcc = null;
  494.             this.dccc = null;
  495.             this.dvcc = null;
  496.          } else {
  497.             this.compositeState = var2;
  498.             this.modeState = var3;
  499.             this.invalidatePipe();
  500.          }
  501.  
  502.          this.composite = var1;
  503.       }
  504.    }
  505.  
  506.    protected void checkCustomComposite() {
  507.       SecurityManager var1 = System.getSecurityManager();
  508.       if (var1 != null) {
  509.          if (compPermission == null) {
  510.             compPermission = new AWTPermission("readDisplayPixels");
  511.          }
  512.  
  513.          var1.checkPermission(compPermission);
  514.       }
  515.  
  516.    }
  517.  
  518.    public void setPaint(Paint var1) {
  519.       if (var1 != null) {
  520.          int var2 = this.paintState;
  521.          this.paint = var1;
  522.          if (var1 instanceof Color) {
  523.             this.foregroundColor = (Color)var1;
  524.             if (this.foregroundColor.getAlpha() == 255) {
  525.                this.paintState = 0;
  526.             } else {
  527.                this.paintState = 1;
  528.             }
  529.          } else {
  530.             this.paintState = 2;
  531.          }
  532.  
  533.          if (this.paintState != var2) {
  534.             this.invalidatePipe();
  535.          } else {
  536.             this.dscc = null;
  537.             this.dbcc = null;
  538.             this.dccc = null;
  539.             this.dvcc = null;
  540.          }
  541.  
  542.       }
  543.    }
  544.  
  545.    public void setStroke(Stroke var1) {
  546.       if (var1 == null) {
  547.          throw new IllegalArgumentException("null Stroke");
  548.       } else {
  549.          int var2 = this.strokeState;
  550.          boolean var3 = !this.stroke.equals(var1);
  551.          this.stroke = var1;
  552.          if (var1 instanceof BasicStroke) {
  553.             this.strokeState = 0;
  554.          } else {
  555.             var3 = true;
  556.             this.strokeState = 1;
  557.          }
  558.  
  559.          if (var3) {
  560.             this.invalidatePipe();
  561.          }
  562.  
  563.       }
  564.    }
  565.  
  566.    public void setRenderingHint(RenderingHints.Key var1, Object var2) {
  567.       if (!var1.isCompatibleValue(var2)) {
  568.          throw new IllegalArgumentException(var2 + " is not compatible with " + var1);
  569.       } else {
  570.          if (var1 instanceof SunHints.Key) {
  571.             boolean var4 = true;
  572.             SunHints.Key var5 = (SunHints.Key)var1;
  573.             int var6 = ((SunHints.Value)var2).getIndex();
  574.             boolean var3;
  575.             switch (var5.getIndex()) {
  576.                case 0:
  577.                   var3 = this.renderHint != var6;
  578.                   this.renderHint = var6;
  579.                   break;
  580.                case 1:
  581.                   var3 = this.antialiasHint != var6;
  582.                   this.antialiasHint = var6;
  583.                   break;
  584.                case 2:
  585.                   var3 = this.textAntialiasHint != var6;
  586.                   if (var3) {
  587.                      this.fontMetrics = null;
  588.                   }
  589.  
  590.                   this.textAntialiasHint = var6;
  591.                   break;
  592.                case 3:
  593.                   var3 = this.fractionalMetricsHint != var6;
  594.                   if (var3) {
  595.                      this.fontMetrics = null;
  596.                   }
  597.  
  598.                   this.fractionalMetricsHint = var6;
  599.                   break;
  600.                case 4:
  601.                case 6:
  602.                case 7:
  603.                default:
  604.                   var4 = false;
  605.                   var3 = false;
  606.                   break;
  607.                case 5:
  608.                   switch (var6) {
  609.                      case 0:
  610.                      default:
  611.                         var6 = 1;
  612.                         break;
  613.                      case 1:
  614.                      case 2:
  615.                         var6 = 2;
  616.                   }
  617.  
  618.                   var3 = this.interpolationHint != var6;
  619.                   this.interpolationHint = var6;
  620.                   break;
  621.                case 8:
  622.                   var3 = this.strokeHint != var6;
  623.                   this.strokeHint = var6;
  624.             }
  625.  
  626.             if (var4) {
  627.                if (var3) {
  628.                   this.invalidatePipe();
  629.                }
  630.  
  631.                if (this.hints != null) {
  632.                   this.hints.put(var1, var2);
  633.                }
  634.  
  635.                return;
  636.             }
  637.          }
  638.  
  639.          if (this.hints == null) {
  640.             this.hints = this.makeHints((Map)null);
  641.          }
  642.  
  643.          this.hints.put(var1, var2);
  644.       }
  645.    }
  646.  
  647.    public Object getRenderingHint(RenderingHints.Key var1) {
  648.       if (this.hints != null) {
  649.          return this.hints.get(var1);
  650.       } else if (!(var1 instanceof SunHints.Key)) {
  651.          return null;
  652.       } else {
  653.          int var2 = ((SunHints.Key)var1).getIndex();
  654.          switch (var2) {
  655.             case 0:
  656.                return Value.get(0, this.renderHint);
  657.             case 1:
  658.                return Value.get(1, this.antialiasHint);
  659.             case 2:
  660.                return Value.get(2, this.textAntialiasHint);
  661.             case 3:
  662.                return Value.get(3, this.fractionalMetricsHint);
  663.             case 4:
  664.             case 6:
  665.             case 7:
  666.             default:
  667.                return null;
  668.             case 5:
  669.                switch (this.interpolationHint) {
  670.                   case 1:
  671.                      return SunHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
  672.                   case 2:
  673.                      return SunHints.VALUE_INTERPOLATION_BILINEAR;
  674.                   default:
  675.                      return null;
  676.                }
  677.             case 8:
  678.                return Value.get(8, this.strokeHint);
  679.          }
  680.       }
  681.    }
  682.  
  683.    public void setRenderingHints(Map var1) {
  684.       this.hints = null;
  685.       this.renderHint = 0;
  686.       this.antialiasHint = 1;
  687.       this.textAntialiasHint = 0;
  688.       this.fractionalMetricsHint = 1;
  689.       this.interpolationHint = -1;
  690.       boolean var2 = false;
  691.  
  692.       for(Object var4 : var1.keySet()) {
  693.          if (var4 != SunHints.KEY_RENDERING && var4 != SunHints.KEY_ANTIALIASING && var4 != SunHints.KEY_TEXT_ANTIALIASING && var4 != SunHints.KEY_FRACTIONALMETRICS && var4 != SunHints.KEY_STROKE_CONTROL && var4 != SunHints.KEY_INTERPOLATION) {
  694.             var2 = true;
  695.          } else {
  696.             this.setRenderingHint((RenderingHints.Key)var4, var1.get(var4));
  697.          }
  698.       }
  699.  
  700.       if (var2) {
  701.          this.hints = this.makeHints(var1);
  702.       }
  703.  
  704.       this.invalidatePipe();
  705.    }
  706.  
  707.    public void addRenderingHints(Map var1) {
  708.       boolean var2 = false;
  709.  
  710.       for(Object var4 : var1.keySet()) {
  711.          if (var4 != SunHints.KEY_RENDERING && var4 != SunHints.KEY_ANTIALIASING && var4 != SunHints.KEY_TEXT_ANTIALIASING && var4 != SunHints.KEY_FRACTIONALMETRICS && var4 != SunHints.KEY_STROKE_CONTROL && var4 != SunHints.KEY_INTERPOLATION) {
  712.             var2 = true;
  713.          } else {
  714.             this.setRenderingHint((RenderingHints.Key)var4, var1.get(var4));
  715.          }
  716.       }
  717.  
  718.       if (var2) {
  719.          if (this.hints == null) {
  720.             this.hints = this.makeHints(var1);
  721.          } else {
  722.             this.hints.putAll(var1);
  723.          }
  724.       }
  725.  
  726.    }
  727.  
  728.    public RenderingHints getRenderingHints() {
  729.       return this.hints == null ? this.makeHints((Map)null) : (RenderingHints)this.hints.clone();
  730.    }
  731.  
  732.    RenderingHints makeHints(Map var1) {
  733.       RenderingHints var2 = new RenderingHints(var1);
  734.       var2.put(SunHints.KEY_RENDERING, Value.get(0, this.renderHint));
  735.       var2.put(SunHints.KEY_ANTIALIASING, Value.get(1, this.antialiasHint));
  736.       var2.put(SunHints.KEY_TEXT_ANTIALIASING, Value.get(2, this.textAntialiasHint));
  737.       var2.put(SunHints.KEY_FRACTIONALMETRICS, Value.get(3, this.fractionalMetricsHint));
  738.       Object var3;
  739.       switch (this.interpolationHint) {
  740.          case 1:
  741.             var3 = SunHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
  742.             break;
  743.          case 2:
  744.             var3 = SunHints.VALUE_INTERPOLATION_BILINEAR;
  745.             break;
  746.          default:
  747.             return var2;
  748.       }
  749.  
  750.       var2.put(SunHints.KEY_INTERPOLATION, var3);
  751.       var2.put(SunHints.KEY_STROKE_CONTROL, Value.get(8, this.strokeHint));
  752.       return var2;
  753.    }
  754.  
  755.    public void translate(double var1, double var3) {
  756.       this.transform.translate(var1, var3);
  757.       this.invalidateTransform();
  758.    }
  759.  
  760.    public void rotate(double var1) {
  761.       this.transform.rotate(var1);
  762.       this.invalidateTransform();
  763.    }
  764.  
  765.    public void rotate(double var1, double var3, double var5) {
  766.       this.transform.rotate(var1, var3, var5);
  767.       this.invalidateTransform();
  768.    }
  769.  
  770.    public void scale(double var1, double var3) {
  771.       this.transform.scale(var1, var3);
  772.       this.invalidateTransform();
  773.    }
  774.  
  775.    public void shear(double var1, double var3) {
  776.       this.transform.shear(var1, var3);
  777.       this.invalidateTransform();
  778.    }
  779.  
  780.    public void transform(AffineTransform var1) {
  781.       this.transform.concatenate(var1);
  782.       this.invalidateTransform();
  783.    }
  784.  
  785.    public void translate(int var1, int var2) {
  786.       this.transform.translate((double)var1, (double)var2);
  787.       if (!this.complexTransform) {
  788.          this.transX += var1;
  789.          this.transY += var2;
  790.          this.transformState = this.transX == 0 && this.transY == 0 ? 0 : 1;
  791.          this.invalidatePipe();
  792.       } else {
  793.          this.invalidateTransform();
  794.       }
  795.  
  796.    }
  797.  
  798.    public void setTransform(AffineTransform var1) {
  799.       if ((this.constrainX | this.constrainY) == 0) {
  800.          this.transform.setTransform(var1);
  801.       } else {
  802.          this.transform.setToTranslation((double)this.constrainX, (double)this.constrainY);
  803.          this.transform.concatenate(var1);
  804.       }
  805.  
  806.       this.invalidateTransform();
  807.    }
  808.  
  809.    protected void invalidateTransform() {
  810.       this.complexTransform = true;
  811.       int var1 = this.transform.getType();
  812.       if (var1 == 0) {
  813.          this.transformState = 0;
  814.          this.complexTransform = false;
  815.          this.transX = this.transY = 0;
  816.       } else if (var1 == 1) {
  817.          this.transformState = 1;
  818.          this.transX = (int)this.transform.getTranslateX();
  819.          this.transY = (int)this.transform.getTranslateY();
  820.       } else {
  821.          this.transformState = 2;
  822.          this.transX = this.transY = 0;
  823.       }
  824.  
  825.       this.invalidatePipe();
  826.    }
  827.  
  828.    public AffineTransform getTransform() {
  829.       if ((this.constrainX | this.constrainY) == 0) {
  830.          return new AffineTransform(this.transform);
  831.       } else {
  832.          AffineTransform var1 = AffineTransform.getTranslateInstance((double)(-this.constrainX), (double)(-this.constrainY));
  833.          var1.concatenate(this.transform);
  834.          return var1;
  835.       }
  836.    }
  837.  
  838.    public AffineTransform cloneTransform() {
  839.       return new AffineTransform(this.transform);
  840.    }
  841.  
  842.    public Paint getPaint() {
  843.       return this.paint;
  844.    }
  845.  
  846.    public Composite getComposite() {
  847.       return this.composite;
  848.    }
  849.  
  850.    public Color getColor() {
  851.       return this.foregroundColor;
  852.    }
  853.  
  854.    public void setColor(Color var1) {
  855.       if (this.paint != var1) {
  856.          this.setPaint(var1);
  857.       }
  858.  
  859.    }
  860.  
  861.    public void setBackground(Color var1) {
  862.       this.backgroundColor = var1;
  863.    }
  864.  
  865.    public Color getBackground() {
  866.       return this.backgroundColor;
  867.    }
  868.  
  869.    public Stroke getStroke() {
  870.       return this.stroke;
  871.    }
  872.  
  873.    public Rectangle getClipBounds() {
  874.       Shape var1 = this.getClip();
  875.       return var1 != null ? var1.getBounds() : null;
  876.    }
  877.  
  878.    protected void invalidateClip() {
  879.       this.compBounds = null;
  880.       this.clipRegion = null;
  881.       if (this.usrClip == null) {
  882.          this.clipState = 0;
  883.       } else if (this.usrClip instanceof Rectangle2D) {
  884.          this.clipState = 1;
  885.       } else {
  886.          this.clipState = 2;
  887.       }
  888.  
  889.       this.invalidatePipe();
  890.    }
  891.  
  892.    protected Shape transformShape(Shape var1) {
  893.       if (var1 == null) {
  894.          return null;
  895.       } else {
  896.          return this.complexTransform ? transformShape(this.transform, var1) : transformShape(this.transX, this.transY, var1);
  897.       }
  898.    }
  899.  
  900.    protected Shape untransformShape(Shape var1) {
  901.       if (var1 == null) {
  902.          return null;
  903.       } else if (this.complexTransform) {
  904.          try {
  905.             return transformShape(this.transform.createInverse(), var1);
  906.          } catch (NoninvertibleTransformException var3) {
  907.             return null;
  908.          }
  909.       } else {
  910.          return transformShape(-this.transX, -this.transY, var1);
  911.       }
  912.    }
  913.  
  914.    protected static Shape transformShape(int var0, int var1, Shape var2) {
  915.       if (var2 == null) {
  916.          return null;
  917.       } else if (var2 instanceof Rectangle) {
  918.          Rectangle var5 = var2.getBounds();
  919.          var5.translate(var0, var1);
  920.          return var5;
  921.       } else if (var2 instanceof Rectangle2D) {
  922.          Rectangle2D var4 = (Rectangle2D)var2;
  923.          return new Rectangle2D.Double(((RectangularShape)var4).getX() + (double)var0, ((RectangularShape)var4).getY() + (double)var1, ((RectangularShape)var4).getWidth(), ((RectangularShape)var4).getHeight());
  924.       } else if (var0 == 0 && var1 == 0) {
  925.          return cloneShape(var2);
  926.       } else {
  927.          AffineTransform var3 = AffineTransform.getTranslateInstance((double)var0, (double)var1);
  928.          return var3.createTransformedShape(var2);
  929.       }
  930.    }
  931.  
  932.    protected static Shape transformShape(AffineTransform var0, Shape var1) {
  933.       if (var1 == null) {
  934.          return null;
  935.       } else if (var1 instanceof Rectangle2D && (var0.getType() & 48) == 0) {
  936.          RectangularShape var2 = (Rectangle2D)var1;
  937.          double[] var3 = new double[]{var2.getX(), var2.getY(), (double)0.0F, (double)0.0F};
  938.          var3[2] = var3[0] + var2.getWidth();
  939.          var3[3] = var3[1] + var2.getHeight();
  940.          var0.transform(var3, 0, var3, 0, 2);
  941.          var2 = new Rectangle2D.Float();
  942.          var2.setFrameFromDiagonal(var3[0], var3[1], var3[2], var3[3]);
  943.          return var2;
  944.       } else {
  945.          return var0.isIdentity() ? cloneShape(var1) : var0.createTransformedShape(var1);
  946.       }
  947.    }
  948.  
  949.    public void clipRect(int var1, int var2, int var3, int var4) {
  950.       this.clip(new Rectangle(var1, var2, var3, var4));
  951.    }
  952.  
  953.    public void setClip(int var1, int var2, int var3, int var4) {
  954.       this.setClip(new Rectangle(var1, var2, var3, var4));
  955.    }
  956.  
  957.    public Shape getClip() {
  958.       return this.untransformShape(this.usrClip);
  959.    }
  960.  
  961.    public void setClip(Shape var1) {
  962.       this.usrClip = this.transformShape(var1);
  963.       this.invalidateClip();
  964.    }
  965.  
  966.    public void clip(Shape var1) {
  967.       var1 = this.transformShape(var1);
  968.       if (this.usrClip != null) {
  969.          var1 = this.intersectShapes(this.usrClip, var1, true, true);
  970.       }
  971.  
  972.       this.usrClip = var1;
  973.       this.invalidateClip();
  974.    }
  975.  
  976.    public void setPaintMode() {
  977.       this.modeState = 0;
  978.       this.xorColor = nullXORColor;
  979.       this.setComposite(AlphaComposite.SrcOver);
  980.    }
  981.  
  982.    public void setXORMode(Color var1) {
  983.       if (var1 == null) {
  984.          throw new IllegalArgumentException("null XORColor");
  985.       } else {
  986.          this.modeState = 1;
  987.          this.xorColor = var1;
  988.          this.setComposite(new XORComposite(var1));
  989.       }
  990.    }
  991.  
  992.    public void copyArea(int var1, int var2, int var3, int var4, int var5, int var6) {
  993.       Rectangle var7 = new Rectangle(var1, var2, var3, var4);
  994.       var7 = this.transformBounds(var7, this.transform);
  995.       Point2D.Float var8 = new Point2D.Float((float)var5, (float)var6);
  996.       Point2D.Float var9 = new Point2D.Float(0.0F, 0.0F);
  997.       Point2D var24 = this.transform.transform(var8, var8);
  998.       Point2D var25 = this.transform.transform(var9, var9);
  999.       int var10 = (int)(var24.getX() - var25.getX());
  1000.       int var11 = (int)(var24.getY() - var25.getY());
  1001.       Rectangle var12 = this.getCompBounds().intersection(var7.getBounds());
  1002.       if (!var12.isEmpty()) {
  1003.          boolean var13 = true;
  1004.          Object var14 = null;
  1005.          if (this.clipState != 2) {
  1006.             this.copyAreaStateCache = this.getOutputManager().copyArea(this, (byte[])null, var12.width, 0, var12.x, var12.y, var12.width, var12.height, var10, var11, this.copyAreaStateCache);
  1007.          } else {
  1008.             int[] var15 = new int[4];
  1009.             this.clipRegion.getBounds(var15);
  1010.             Rectangle var16 = new Rectangle(var15[0], var15[1], var15[2] - var15[0], var15[3] - var15[1]);
  1011.             if (!var16.isEmpty()) {
  1012.                OutputManager var17 = this.getOutputManager();
  1013.                RegionIterator var18 = this.clipRegion.getIterator();
  1014.  
  1015.                while(var18.nextYRange(var15)) {
  1016.                   int var19 = var15[0];
  1017.  
  1018.                   int var21;
  1019.                   int var22;
  1020.                   for(int var20 = var15[1] - var19; var18.nextXBand(var15); this.copyAreaStateCache = var17.copyArea(this, (byte[])null, var22, 0, var21, var19, var22, var20, var10, var11, this.copyAreaStateCache)) {
  1021.                      var21 = var15[2];
  1022.                      var22 = var15[3] - var21;
  1023.                   }
  1024.                }
  1025.             }
  1026.  
  1027.          }
  1028.       }
  1029.    }
  1030.  
  1031.    public void drawLine(int var1, int var2, int var3, int var4) {
  1032.       this.drawpipe.drawLine(this, var1, var2, var3, var4);
  1033.    }
  1034.  
  1035.    public void drawRoundRect(int var1, int var2, int var3, int var4, int var5, int var6) {
  1036.       this.drawpipe.drawRoundRect(this, var1, var2, var3, var4, var5, var6);
  1037.    }
  1038.  
  1039.    public void fillRoundRect(int var1, int var2, int var3, int var4, int var5, int var6) {
  1040.       this.fillpipe.fillRoundRect(this, var1, var2, var3, var4, var5, var6);
  1041.    }
  1042.  
  1043.    public void drawOval(int var1, int var2, int var3, int var4) {
  1044.       this.drawpipe.drawOval(this, var1, var2, var3, var4);
  1045.    }
  1046.  
  1047.    public void fillOval(int var1, int var2, int var3, int var4) {
  1048.       this.fillpipe.fillOval(this, var1, var2, var3, var4);
  1049.    }
  1050.  
  1051.    public void drawArc(int var1, int var2, int var3, int var4, int var5, int var6) {
  1052.       this.drawpipe.drawArc(this, var1, var2, var3, var4, var5, var6);
  1053.    }
  1054.  
  1055.    public void fillArc(int var1, int var2, int var3, int var4, int var5, int var6) {
  1056.       this.fillpipe.fillArc(this, var1, var2, var3, var4, var5, var6);
  1057.    }
  1058.  
  1059.    public void drawPolyline(int[] var1, int[] var2, int var3) {
  1060.       this.drawpipe.drawPolyline(this, var1, var2, var3);
  1061.    }
  1062.  
  1063.    public void drawPolygon(int[] var1, int[] var2, int var3) {
  1064.       this.drawpipe.drawPolygon(this, var1, var2, var3);
  1065.    }
  1066.  
  1067.    public void fillPolygon(int[] var1, int[] var2, int var3) {
  1068.       this.fillpipe.fillPolygon(this, var1, var2, var3);
  1069.    }
  1070.  
  1071.    public void drawRect(int var1, int var2, int var3, int var4) {
  1072.       this.drawpipe.drawRect(this, var1, var2, var3, var4);
  1073.    }
  1074.  
  1075.    public void fillRect(int var1, int var2, int var3, int var4) {
  1076.       this.fillpipe.fillRect(this, var1, var2, var3, var4);
  1077.    }
  1078.  
  1079.    public void clearRect(int var1, int var2, int var3, int var4) {
  1080.       Composite var5 = this.composite;
  1081.       Paint var6 = this.paint;
  1082.       Color var7 = this.xorColor;
  1083.       boolean var8 = this.modeState == 1;
  1084.       this.setComposite(AlphaComposite.Src);
  1085.       this.setColor(this.getBackground());
  1086.       if (var8) {
  1087.          this.setPaintMode();
  1088.       }
  1089.  
  1090.       this.validatePipe();
  1091.       this.fillRect(var1, var2, var3, var4);
  1092.       if (var8) {
  1093.          this.setXORMode(var7);
  1094.       }
  1095.  
  1096.       this.setPaint(var6);
  1097.       this.setComposite(var5);
  1098.    }
  1099.  
  1100.    public void draw(Shape var1) {
  1101.       this.shapepipe.draw(this, var1);
  1102.    }
  1103.  
  1104.    public void fill(Shape var1) {
  1105.       this.shapepipe.fill(this, var1);
  1106.    }
  1107.  
  1108.    protected boolean drawImage(BufferedImage var1, int var2, int var3, Color var4, ImageObserver var5) {
  1109.       this.renderingPipeImage(var1, var2, var3, (BufferedImageOp)null, (AffineTransform)null, var4);
  1110.       return true;
  1111.    }
  1112.  
  1113.    protected boolean drawImage(BufferedImage var1, int var2, int var3, int var4, int var5, Color var6, ImageObserver var7) {
  1114.       if (var4 != 0 && var5 != 0) {
  1115.          AffineTransform var8 = null;
  1116.          if (var4 != var1.getWidth() || var5 != var1.getHeight()) {
  1117.             var8 = new AffineTransform();
  1118.             var8.scale((double)var4 / (double)var1.getWidth(), (double)var5 / (double)var1.getHeight());
  1119.          }
  1120.  
  1121.          return this.drawImage(var1, var8, var2, var3, var6, var7);
  1122.       } else {
  1123.          return true;
  1124.       }
  1125.    }
  1126.  
  1127.    protected boolean drawImage(BufferedImage var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, Color var10, ImageObserver var11) {
  1128.       if (var2 != var4 && var3 != var5) {
  1129.          if (var6 != var8 && var7 != var9) {
  1130.             int var13;
  1131.             int var15;
  1132.             if (var9 > var7) {
  1133.                var13 = var9 - var7;
  1134.                var15 = var7;
  1135.             } else {
  1136.                var13 = var7 - var9;
  1137.                var15 = var9;
  1138.             }
  1139.  
  1140.             int var12;
  1141.             int var14;
  1142.             if (var8 > var6) {
  1143.                var12 = var8 - var6;
  1144.                var14 = var6;
  1145.             } else {
  1146.                var12 = var6 - var8;
  1147.                var14 = var8;
  1148.             }
  1149.  
  1150.             if (var4 <= var2) {
  1151.                ;
  1152.             }
  1153.  
  1154.             if (var5 <= var3) {
  1155.                ;
  1156.             }
  1157.  
  1158.             if (var12 > 0 && var13 > 0) {
  1159.                if (var14 >= 0 && var15 >= 0) {
  1160.                   WritableRaster var18 = var1.getRaster();
  1161.                   int var19 = ((Raster)var18).getWidth();
  1162.                   int var20 = ((Raster)var18).getHeight();
  1163.                   if (var14 + var12 > var19) {
  1164.                      var12 = var19 - var14;
  1165.                   }
  1166.  
  1167.                   if (var15 + var13 > var20) {
  1168.                      var13 = var20 - var15;
  1169.                   }
  1170.  
  1171.                   var1 = var1.getSubimage(var14 + var1.getMinX(), var15 + var1.getMinY(), var12, var13);
  1172.                }
  1173.  
  1174.                AffineTransform var23 = new AffineTransform();
  1175.                var23.translate((double)var2, (double)var3);
  1176.                if (var4 - var2 != var8 - var6 || var5 - var3 != var9 - var7) {
  1177.                   double var24 = (double)(var4 - var2) / (double)(var8 - var6);
  1178.                   double var21 = (double)(var5 - var3) / (double)(var9 - var7);
  1179.                   var23.scale(var24, var21);
  1180.                }
  1181.  
  1182.                var23.translate((double)(var14 - var6), (double)(var15 - var7));
  1183.                return this.drawImage(var1, var23, 0, 0, var10, var11);
  1184.             } else {
  1185.                return true;
  1186.             }
  1187.          } else {
  1188.             return true;
  1189.          }
  1190.       } else {
  1191.          return true;
  1192.       }
  1193.    }
  1194.  
  1195.    protected boolean drawImage(BufferedImage var1, AffineTransform var2, int var3, int var4, Color var5, ImageObserver var6) {
  1196.       this.renderingPipeImage(var1, var3, var4, (BufferedImageOp)null, var2, var5);
  1197.       return true;
  1198.    }
  1199.  
  1200.    public void drawImage(BufferedImage var1, BufferedImageOp var2, int var3, int var4) {
  1201.       this.renderingPipeImage(var1, var3, var4, var2, (AffineTransform)null, (Color)null);
  1202.    }
  1203.  
  1204.    public void drawRenderedImage(RenderedImage var1, AffineTransform var2) {
  1205.       if (var1 instanceof BufferedImage) {
  1206.          BufferedImage var23 = (BufferedImage)var1;
  1207.          ((Graphics2D)this).drawImage(var23, var2, (ImageObserver)null);
  1208.       } else {
  1209.          Rectangle var4 = this.getCompBounds();
  1210.  
  1211.          Raster var3;
  1212.          try {
  1213.             double[] var5 = new double[8];
  1214.             var5[0] = var5[2] = (double)var4.x;
  1215.             var5[4] = var5[6] = (double)(var4.x + var4.width);
  1216.             var5[1] = var5[5] = (double)var4.y;
  1217.             var5[3] = var5[7] = (double)(var4.y + var4.height);
  1218.             this.transform.inverseTransform(var5, 0, var5, 0, 4);
  1219.             var2.inverseTransform(var5, 0, var5, 0, 4);
  1220.             double var8;
  1221.             double var6 = var8 = var5[0];
  1222.             double var12;
  1223.             double var10 = var12 = var5[1];
  1224.             int var14 = 2;
  1225.  
  1226.             while(var14 < 8) {
  1227.                double var15 = var5[var14++];
  1228.                if (var15 < var6) {
  1229.                   var6 = var15;
  1230.                } else if (var15 > var8) {
  1231.                   var8 = var15;
  1232.                }
  1233.  
  1234.                var15 = var5[var14++];
  1235.                if (var15 < var10) {
  1236.                   var10 = var15;
  1237.                } else if (var15 > var12) {
  1238.                   var12 = var15;
  1239.                }
  1240.             }
  1241.  
  1242.             int var30 = (int)var6 - 3;
  1243.             int var16 = (int)(var8 - var6 + (double)6.0F);
  1244.             int var17 = (int)var10 - 3;
  1245.             int var18 = (int)(var12 - var10 + (double)6.0F);
  1246.             Rectangle var19 = new Rectangle(var30, var17, var16, var18);
  1247.             Rectangle var20 = new Rectangle(var1.getMinX(), var1.getMinY(), var1.getWidth(), var1.getHeight());
  1248.             Rectangle var21 = var19.intersection(var20);
  1249.             if (var21.width <= 0 || var21.height <= 0) {
  1250.                return;
  1251.             }
  1252.  
  1253.             var3 = var1.getData(var21);
  1254.          } catch (NoninvertibleTransformException var22) {
  1255.             var3 = var1.getData();
  1256.          }
  1257.  
  1258.          WritableRaster var24 = Raster.createWritableRaster(var3.getSampleModel(), var3.getDataBuffer(), (Point)null);
  1259.          int var25 = var3.getMinX();
  1260.          int var7 = var3.getMinY();
  1261.          int var26 = var25 - var3.getSampleModelTranslateX();
  1262.          int var9 = var7 - var3.getSampleModelTranslateY();
  1263.          if (var26 != 0 || var9 != 0) {
  1264.             var24 = var24.createWritableChild(var26, var9, var3.getWidth(), var3.getHeight(), 0, 0, (int[])null);
  1265.          }
  1266.  
  1267.          AffineTransform var27 = (AffineTransform)var2.clone();
  1268.          var27.translate((double)var25, (double)var7);
  1269.          BufferedImage var11 = new BufferedImage(var1.getColorModel(), var24, false, (Hashtable)null);
  1270.          ((Graphics2D)this).drawImage(var11, var27, (ImageObserver)null);
  1271.       }
  1272.    }
  1273.  
  1274.    public void drawRenderableImage(RenderableImage var1, AffineTransform var2) {
  1275.       AffineTransform var3 = this.transform;
  1276.       AffineTransform var4 = new AffineTransform(var2);
  1277.       var4.concatenate(var3);
  1278.       RenderContext var6 = new RenderContext(var4);
  1279.  
  1280.       AffineTransform var5;
  1281.       try {
  1282.          var5 = var3.createInverse();
  1283.       } catch (NoninvertibleTransformException var8) {
  1284.          var6 = new RenderContext(var3);
  1285.          var5 = new AffineTransform();
  1286.       }
  1287.  
  1288.       RenderedImage var7 = var1.createRendering(var6);
  1289.       this.drawRenderedImage(var7, var5);
  1290.    }
  1291.  
  1292.    private ColorModel getTransformColorModel(BufferedImage var1, AffineTransform var2) {
  1293.       ColorModel var3 = var1.getColorModel();
  1294.       Object var4 = var3;
  1295.       if (var2.isIdentity()) {
  1296.          return var3;
  1297.       } else {
  1298.          int var5 = var2.getType();
  1299.          boolean var6 = (var5 & (24 | 32)) != 0;
  1300.          if (!var6 && var5 != 1 && var5 != 0) {
  1301.             double[] var7 = new double[4];
  1302.             var2.getMatrix(var7);
  1303.             var6 = var7[0] != (double)((int)var7[0]) || var7[3] != (double)((int)var7[3]);
  1304.          }
  1305.  
  1306.          if (this.renderHint != 2) {
  1307.             if (var3 instanceof IndexColorModel) {
  1308.                WritableRaster var12 = var1.getRaster();
  1309.                IndexColorModel var8 = (IndexColorModel)var3;
  1310.                if (var6 && var3.getTransparency() == 1) {
  1311.                   if (var12 instanceof BytePackedRaster) {
  1312.                      var4 = ColorModel.getRGBdefault();
  1313.                   } else {
  1314.                      double[] var9 = new double[6];
  1315.                      var2.getMatrix(var9);
  1316.                      if (var9[1] != (double)0.0F || var9[2] != (double)0.0F || var9[4] != (double)0.0F || var9[5] != (double)0.0F) {
  1317.                         int var10 = var8.getMapSize();
  1318.                         if (var10 < 256) {
  1319.                            int[] var11 = new int[var10 + 1];
  1320.                            var8.getRGBs(var11);
  1321.                            var11[var10] = 0;
  1322.                            var4 = new IndexColorModel(((ColorModel)var8).getPixelSize(), var10 + 1, var11, 0, true, var10, 0);
  1323.                         } else {
  1324.                            var4 = ColorModel.getRGBdefault();
  1325.                         }
  1326.                      }
  1327.                   }
  1328.                }
  1329.             } else if (var6 && var3.getTransparency() == 1) {
  1330.                var4 = ColorModel.getRGBdefault();
  1331.             }
  1332.          } else if (var3 instanceof IndexColorModel || var6 && var3.getTransparency() == 1) {
  1333.             var4 = ColorModel.getRGBdefault();
  1334.          }
  1335.  
  1336.          return (ColorModel)var4;
  1337.       }
  1338.    }
  1339.  
  1340.    protected Rectangle transformBounds(Rectangle var1, AffineTransform var2) {
  1341.       if (var2.isIdentity()) {
  1342.          return var1;
  1343.       } else {
  1344.          Shape var3 = transformShape(var2, var1);
  1345.          return var3.getBounds();
  1346.       }
  1347.    }
  1348.  
  1349.    private void renderingPipeImage(BufferedImage var1, int var2, int var3, BufferedImageOp var4, AffineTransform var5, Color var6) {
  1350.       Rectangle var7 = this.getCompBounds();
  1351.       int var8 = this.interpolationHint;
  1352.       if (var4 == null && (var5 == null || var5.isIdentity()) && this.clipState != 2 && this.transformState != 2) {
  1353.          int var34 = var7.x;
  1354.          int var38 = var7.y;
  1355.          int var41 = var7.width;
  1356.          int var42 = var7.height;
  1357.          float var43 = (float)var2;
  1358.          float var46 = (float)var3;
  1359.          if (this.transformState == 1) {
  1360.             var43 = (float)((double)var43 + this.transform.getTranslateX());
  1361.             var46 = (float)((double)var46 + this.transform.getTranslateY());
  1362.          }
  1363.  
  1364.          float var49 = var43 + (float)var1.getWidth();
  1365.          float var51 = var46 + (float)var1.getHeight();
  1366.          if (var43 > (float)var34) {
  1367.             var41 = var41 + var34 - (int)var43;
  1368.             var34 = (int)var43;
  1369.          }
  1370.  
  1371.          if (var46 > (float)var38) {
  1372.             var42 = var42 + var38 - (int)var46;
  1373.             var38 = (int)var46;
  1374.          }
  1375.  
  1376.          if (var49 < (float)(var34 + var41)) {
  1377.             var41 = (int)var49 - var34;
  1378.          }
  1379.  
  1380.          if (var51 < (float)(var38 + var42)) {
  1381.             var42 = (int)var51 - var38;
  1382.          }
  1383.  
  1384.          if (var41 > 0 && var42 > 0) {
  1385.             if ((float)var34 > var43 || (float)var38 > var46) {
  1386.                var1 = var1.getSubimage(var1.getMinX() + (var34 - (int)var43), var1.getMinY() + (var38 - (int)var46), var41, var42);
  1387.             }
  1388.  
  1389.             this.rpics = RasterOutputManager.getManager().renderImage(this, var1, var6, var34, var38, var41, var42, (byte[])null, var41, this.rpics);
  1390.          }
  1391.       } else {
  1392.          AffineTransform var9 = null;
  1393.          if (var4 != null) {
  1394.             if (var4 instanceof AffineTransformOp) {
  1395.                AffineTransformOp var10 = (AffineTransformOp)var4;
  1396.                var9 = var10.getTransform();
  1397.                var8 = var10.getInterpolationType();
  1398.             } else {
  1399.                var1 = var4.filter(var1, (BufferedImage)null);
  1400.             }
  1401.          }
  1402.  
  1403.          int var35 = var1.getWidth();
  1404.          int var11 = var1.getHeight();
  1405.          AffineTransform var12 = new AffineTransform(this.transform);
  1406.          var12.translate((double)var2, (double)var3);
  1407.          if (var5 != null && !var5.isIdentity()) {
  1408.             var12.concatenate(var5);
  1409.          }
  1410.  
  1411.          if (var9 != null && !var9.isIdentity()) {
  1412.             var12.concatenate(var9);
  1413.          }
  1414.  
  1415.          double[] var13 = new double[6];
  1416.          var12.getMatrix(var13);
  1417.          if (var13[0] == (double)1.0F && var13[1] == (double)0.0F && var13[2] == (double)0.0F && var13[3] == (double)1.0F) {
  1418.             var2 = (int)Math.round(var13[4]);
  1419.             var3 = (int)Math.round(var13[5]);
  1420.             Rectangle var44 = new Rectangle(var2, var3, var35, var11);
  1421.             var7 = var7.intersection(var44);
  1422.             if (var7.isEmpty()) {
  1423.                return;
  1424.             }
  1425.  
  1426.             if (!var7.equals(var44)) {
  1427.                var1 = var1.getSubimage(var7.x - var2, var7.y - var3, var7.width, var7.height);
  1428.                var35 = var7.width;
  1429.                var11 = var7.height;
  1430.             }
  1431.          } else {
  1432.             ColorModel var14 = this.getTransformColorModel(var1, var12);
  1433.             int var15 = var8;
  1434.             if (var8 == -1) {
  1435.                var15 = this.renderHint == 2 ? 2 : 1;
  1436.             }
  1437.  
  1438.             AffineTransformOp var16 = new AffineTransformOp(var12, var15);
  1439.             Rectangle var17 = var16.getBounds2D(var1).getBounds();
  1440.             var7 = var7.intersection(var17);
  1441.             if (var7.isEmpty()) {
  1442.                return;
  1443.             }
  1444.  
  1445.             var2 = var7.x;
  1446.             var3 = var7.y;
  1447.             var35 = var7.width;
  1448.             var11 = var7.height;
  1449.             if (var2 != 0 || var3 != 0) {
  1450.                var12.preConcatenate(new AffineTransform((double)1.0F, (double)0.0F, (double)0.0F, (double)1.0F, (double)(-var2), (double)(-var3)));
  1451.                var16 = new AffineTransformOp(var12, var15);
  1452.             }
  1453.  
  1454.             BufferedImage var18;
  1455.             if (var14 == var1.getColorModel()) {
  1456.                var18 = new BufferedImage(var14, var1.getRaster().createCompatibleWritableRaster(var35, var11), var14.isAlphaPremultiplied(), (Hashtable)null);
  1457.             } else {
  1458.                var18 = new BufferedImage(var14, var14.createCompatibleWritableRaster(var35, var11), var14.isAlphaPremultiplied(), (Hashtable)null);
  1459.             }
  1460.  
  1461.             var1 = var16.filter(var1, var18);
  1462.             if (var1 == null) {
  1463.                return;
  1464.             }
  1465.          }
  1466.  
  1467.          if (this.clipState != 2) {
  1468.             this.getOutputManager().renderImage(this, var1, var6, var7.x, var7.y, var7.width, var7.height, (byte[])null, var7.width, (Object)null);
  1469.          } else {
  1470.             int[] var45 = new int[4];
  1471.             this.clipRegion.getBounds(var45);
  1472.             Rectangle var47 = new Rectangle(var45[0], var45[1], var45[2] - var45[0], var45[3] - var45[1]);
  1473.             var47 = var47.intersection(var7);
  1474.             if (!var47.isEmpty()) {
  1475.                OutputManager var50 = this.getOutputManager();
  1476.                RegionIterator var52 = this.clipRegion.getIterator();
  1477.                int var19 = var7.x;
  1478.                int var20 = var7.y;
  1479.                int var21 = var19 + var7.width;
  1480.                int var22 = var20 + var7.height;
  1481.  
  1482.                int var23;
  1483.                while(var52.nextYRange(var45) && (var23 = var45[0]) <= var22) {
  1484.                   int var24;
  1485.                   if ((var24 = var45[1]) >= var20) {
  1486.                      if (var23 < var20) {
  1487.                         var23 = var20;
  1488.                      }
  1489.  
  1490.                      if (var24 > var22) {
  1491.                         var24 = var22;
  1492.                      }
  1493.  
  1494.                      int var25 = var24 - var23;
  1495.  
  1496.                      int var26;
  1497.                      while(var52.nextXBand(var45) && (var26 = var45[2]) <= var21) {
  1498.                         int var27;
  1499.                         if ((var27 = var45[3]) >= var19) {
  1500.                            if (var26 < var19) {
  1501.                               var26 = var19;
  1502.                            }
  1503.  
  1504.                            if (var27 > var21) {
  1505.                               var27 = var21;
  1506.                            }
  1507.  
  1508.                            int var28 = var27 - var26;
  1509.                            BufferedImage var53 = var1.getSubimage(var26 - var19, var23 - var20, var28, var25);
  1510.                            var50.renderImage(this, var53, var6, var26, var23, var28, var25, (byte[])null, var28, (Object)null);
  1511.                         }
  1512.                      }
  1513.                   }
  1514.                }
  1515.             }
  1516.  
  1517.          }
  1518.       }
  1519.    }
  1520.  
  1521.    public void drawString(String var1, int var2, int var3) {
  1522.       if (var1 == null) {
  1523.          throw new NullPointerException("string is null");
  1524.       } else {
  1525.          try {
  1526.             this.dscc = this.textpipe.drawString(this, var1, (float)var2, (float)var3, this.dscc);
  1527.          } catch (ShapingException var6) {
  1528.             TextLayout var5 = new TextLayout(var1, this.getFont(), this.getFontRenderContext());
  1529.             var5.draw(this, (float)var2, (float)var3);
  1530.          }
  1531.  
  1532.       }
  1533.    }
  1534.  
  1535.    public void drawString(String var1, float var2, float var3) {
  1536.       if (var1 == null) {
  1537.          throw new NullPointerException("string is null");
  1538.       } else {
  1539.          try {
  1540.             this.dscc = this.textpipe.drawString(this, var1, var2, var3, this.dscc);
  1541.          } catch (ShapingException var6) {
  1542.             TextLayout var5 = new TextLayout(var1, this.getFont(), this.getFontRenderContext());
  1543.             var5.draw(this, var2, var3);
  1544.          }
  1545.  
  1546.       }
  1547.    }
  1548.  
  1549.    public void drawString(AttributedCharacterIterator var1, int var2, int var3) {
  1550.       if (var1 == null) {
  1551.          throw new NullPointerException("attributedcharacteriterator is null");
  1552.       } else {
  1553.          TextLayout var4 = new TextLayout(var1, this.getFontRenderContext());
  1554.          var4.draw(this, (float)var2, (float)var3);
  1555.       }
  1556.    }
  1557.  
  1558.    public void drawString(AttributedCharacterIterator var1, float var2, float var3) {
  1559.       if (var1 == null) {
  1560.          throw new NullPointerException("attributedcharacteriterator is null");
  1561.       } else {
  1562.          TextLayout var4 = new TextLayout(var1, this.getFontRenderContext());
  1563.          var4.draw(this, var2, var3);
  1564.       }
  1565.    }
  1566.  
  1567.    public void drawGlyphVector(GlyphVector var1, float var2, float var3) {
  1568.       if (var1 == null) {
  1569.          throw new NullPointerException("glyphvector is null");
  1570.       } else {
  1571.          this.dvcc = this.textpipe.drawGlyphVector(this, var1, var2, var3, this.dvcc);
  1572.       }
  1573.    }
  1574.  
  1575.    public void drawChars(char[] var1, int var2, int var3, int var4, int var5) {
  1576.       if (var1 == null) {
  1577.          throw new NullPointerException("char data is null");
  1578.       } else {
  1579.          try {
  1580.             this.dccc = this.textpipe.drawChars(this, var1, var2, var3, var4, var5, this.dccc);
  1581.          } catch (ShapingException var8) {
  1582.             TextLayout var7 = new TextLayout(new String(var1, var2, var3), this.getFont(), this.getFontRenderContext());
  1583.             var7.draw(this, (float)var4, (float)var5);
  1584.          }
  1585.  
  1586.       }
  1587.    }
  1588.  
  1589.    public void drawBytes(byte[] var1, int var2, int var3, int var4, int var5) {
  1590.       if (var1 == null) {
  1591.          throw new NullPointerException("byte data is null");
  1592.       } else {
  1593.          try {
  1594.             this.dbcc = this.textpipe.drawBytes(this, var1, var2, var3, var4, var5, this.dbcc);
  1595.          } catch (ShapingException var8) {
  1596.             TextLayout var7 = new TextLayout(new String(var1, 0, var2, var3), this.getFont(), this.getFontRenderContext());
  1597.             var7.draw(this, (float)var4, (float)var5);
  1598.          }
  1599.  
  1600.       }
  1601.    }
  1602.  
  1603.    public Object drawString(SunGraphics2D var1, String var2, float var3, float var4, Object var5) {
  1604.       return RasterOutputManager.getManager().drawString(var1, var2, var3, var4, var5);
  1605.    }
  1606.  
  1607.    public Object drawGlyphVector(SunGraphics2D var1, GlyphVector var2, float var3, float var4, Object var5) {
  1608.       return RasterOutputManager.getManager().drawGlyphVector(var1, var2, var3, var4, var5);
  1609.    }
  1610.  
  1611.    public Object drawChars(SunGraphics2D var1, char[] var2, int var3, int var4, int var5, int var6, Object var7) {
  1612.       return RasterOutputManager.getManager().drawChars(var1, var2, var3, var4, var5, var6, var7);
  1613.    }
  1614.  
  1615.    public Object drawBytes(SunGraphics2D var1, byte[] var2, int var3, int var4, int var5, int var6, Object var7) {
  1616.       return RasterOutputManager.getManager().drawBytes(var1, var2, var3, var4, var5, var6, var7);
  1617.    }
  1618.  
  1619.    public FontRenderContext getFontRenderContext() {
  1620.       int var1 = this.textAntialiasHint == 0 ? this.antialiasHint : this.textAntialiasHint;
  1621.       return new FontRenderContext(this.getDeviceConfiguration().getDefaultTransform(), var1 == 2, this.fractionalMetricsHint == 2);
  1622.    }
  1623.  
  1624.    public String getDevID() {
  1625.       return null;
  1626.    }
  1627.  
  1628.    public abstract ImageData lock(int var1, int var2, int var3, int var4, int var5);
  1629.  
  1630.    public abstract int unlock(ImageData var1);
  1631.  
  1632.    static {
  1633.       defaultComposite = AlphaComposite.SrcOver;
  1634.       invalidpipe = new ValidatePipe();
  1635.       metricscache = new CachedMetrics[5];
  1636.    }
  1637. }
  1638.