home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / java2d / SunGraphics2D.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  31.6 KB  |  2,103 lines

  1. package sun.java2d;
  2.  
  3. import java.awt.AlphaComposite;
  4. import java.awt.BasicStroke;
  5. import java.awt.Color;
  6. import java.awt.Composite;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.GradientPaint;
  10. import java.awt.Graphics;
  11. import java.awt.Graphics2D;
  12. import java.awt.GraphicsConfiguration;
  13. import java.awt.Image;
  14. import java.awt.Paint;
  15. import java.awt.Point;
  16. import java.awt.Rectangle;
  17. import java.awt.RenderingHints;
  18. import java.awt.Shape;
  19. import java.awt.Stroke;
  20. import java.awt.TexturePaint;
  21. import java.awt.font.FontRenderContext;
  22. import java.awt.font.GlyphVector;
  23. import java.awt.font.TextLayout;
  24. import java.awt.geom.AffineTransform;
  25. import java.awt.geom.Area;
  26. import java.awt.geom.GeneralPath;
  27. import java.awt.geom.NoninvertibleTransformException;
  28. import java.awt.geom.PathIterator;
  29. import java.awt.geom.Rectangle2D;
  30. import java.awt.image.BufferedImage;
  31. import java.awt.image.BufferedImageOp;
  32. import java.awt.image.ColorModel;
  33. import java.awt.image.ImageObserver;
  34. import java.awt.image.Raster;
  35. import java.awt.image.RenderedImage;
  36. import java.awt.image.WritableRaster;
  37. import java.awt.image.renderable.RenderContext;
  38. import java.awt.image.renderable.RenderableImage;
  39. import java.text.AttributedCharacterIterator;
  40. import java.util.Hashtable;
  41. import java.util.Map;
  42. import sun.awt.ConstrainableGraphics;
  43. import sun.awt.SunHints;
  44. import sun.awt.SunHints.Value;
  45. import sun.font.FontDesignMetrics;
  46. import sun.font.FontManager;
  47. import sun.java2d.loops.Blit;
  48. import sun.java2d.loops.CompositeType;
  49. import sun.java2d.loops.FontInfo;
  50. import sun.java2d.loops.MaskFill;
  51. import sun.java2d.loops.RenderLoops;
  52. import sun.java2d.loops.SurfaceType;
  53. import sun.java2d.loops.XORComposite;
  54. import sun.java2d.pipe.DrawImagePipe;
  55. import sun.java2d.pipe.PixelDrawPipe;
  56. import sun.java2d.pipe.PixelFillPipe;
  57. import sun.java2d.pipe.Region;
  58. import sun.java2d.pipe.ShapeDrawPipe;
  59. import sun.java2d.pipe.ShapeSpanIterator;
  60. import sun.java2d.pipe.TextPipe;
  61. import sun.java2d.pipe.ValidatePipe;
  62. import sun.misc.PerformanceLogger;
  63.  
  64. public final class SunGraphics2D extends Graphics2D implements ConstrainableGraphics, Cloneable {
  65.    public static final int PAINT_CUSTOM = 4;
  66.    public static final int PAINT_TEXTURE = 3;
  67.    public static final int PAINT_GRADIENT = 2;
  68.    public static final int PAINT_ALPHACOLOR = 1;
  69.    public static final int PAINT_OPAQUECOLOR = 0;
  70.    public static final int COMP_CUSTOM = 3;
  71.    public static final int COMP_XOR = 2;
  72.    public static final int COMP_ALPHA = 1;
  73.    public static final int COMP_ISCOPY = 0;
  74.    public static final int STROKE_CUSTOM = 3;
  75.    public static final int STROKE_WIDE = 2;
  76.    public static final int STROKE_THINDASHED = 1;
  77.    public static final int STROKE_THIN = 0;
  78.    public static final int TRANSFORM_GENERIC = 4;
  79.    public static final int TRANSFORM_TRANSLATESCALE = 3;
  80.    public static final int TRANSFORM_ANY_TRANSLATE = 2;
  81.    public static final int TRANSFORM_INT_TRANSLATE = 1;
  82.    public static final int TRANSFORM_ISIDENT = 0;
  83.    public static final int CLIP_SHAPE = 2;
  84.    public static final int CLIP_RECTANGULAR = 1;
  85.    public static final int CLIP_DEVICE = 0;
  86.    public int eargb;
  87.    public int pixel;
  88.    public SurfaceData surfaceData;
  89.    public PixelDrawPipe drawpipe;
  90.    public PixelFillPipe fillpipe;
  91.    public DrawImagePipe imagepipe;
  92.    public ShapeDrawPipe shapepipe;
  93.    public TextPipe textpipe;
  94.    public MaskFill alphafill;
  95.    public RenderLoops loops;
  96.    public CompositeType imageComp;
  97.    public int paintState;
  98.    public int compositeState;
  99.    public int strokeState;
  100.    public int transformState;
  101.    public int clipState;
  102.    public Color foregroundColor;
  103.    public Color backgroundColor;
  104.    public AffineTransform transform;
  105.    public int transX;
  106.    public int transY;
  107.    protected static final Stroke defaultStroke = new BasicStroke();
  108.    protected static final Composite defaultComposite;
  109.    private static final Font defaultFont;
  110.    public Paint paint;
  111.    public Stroke stroke;
  112.    public Composite composite;
  113.    protected Font font;
  114.    protected FontMetrics fontMetrics;
  115.    public int renderHint;
  116.    public int antialiasHint;
  117.    public int textAntialiasHint;
  118.    private int fractionalMetricsHint;
  119.    public int lcdTextContrast;
  120.    private static int lcdTextContrastDefaultValue;
  121.    private int interpolationHint;
  122.    public int strokeHint;
  123.    public int interpolationType;
  124.    public RenderingHints hints;
  125.    public Region constrainClip;
  126.    public int constrainX;
  127.    public int constrainY;
  128.    public Region clipRegion;
  129.    public Shape usrClip;
  130.    protected Region devClip;
  131.    private boolean validFontInfo;
  132.    private FontInfo fontInfo;
  133.    private FontInfo glyphVectorFontInfo;
  134.    private FontRenderContext glyphVectorFRC;
  135.    private static final int slowTextTransformMask = 120;
  136.    protected static ValidatePipe invalidpipe;
  137.    private static final double[] IDENT_MATRIX;
  138.    private static final AffineTransform IDENT_ATX;
  139.    private static final int MINALLOCATED = 8;
  140.    private static final int TEXTARRSIZE = 17;
  141.    private static double[][] textTxArr;
  142.    private static AffineTransform[] textAtArr;
  143.    static final int NON_UNIFORM_SCALE_MASK = 36;
  144.    public static final double MinPenSizeAASquared = (double)0.039999995F;
  145.    public static final double MinPenSizeSquared = 1.000000001;
  146.    static final int NON_RECTILINEAR_TRANSFORM_MASK = 48;
  147.    Blit lastCAblit;
  148.    Composite lastCAcomp;
  149.    private FontRenderContext cachedFRC;
  150.  
  151.    public SunGraphics2D(SurfaceData var1, Color var2, Color var3, Font var4) {
  152.       this.surfaceData = var1;
  153.       this.foregroundColor = var2;
  154.       this.backgroundColor = var3;
  155.       this.transform = new AffineTransform();
  156.       this.stroke = defaultStroke;
  157.       this.composite = defaultComposite;
  158.       this.paint = this.foregroundColor;
  159.       this.imageComp = CompositeType.SrcOverNoEa;
  160.       this.renderHint = 0;
  161.       this.antialiasHint = 1;
  162.       this.textAntialiasHint = 0;
  163.       this.fractionalMetricsHint = 1;
  164.       this.lcdTextContrast = lcdTextContrastDefaultValue;
  165.       this.interpolationHint = -1;
  166.       this.strokeHint = 0;
  167.       this.interpolationType = 1;
  168.       this.validateColor();
  169.       this.font = var4;
  170.       if (this.font == null) {
  171.          this.font = defaultFont;
  172.       }
  173.  
  174.       this.loops = var1.getRenderLoops(this);
  175.       this.setDevClip(var1.getBounds());
  176.       this.invalidatePipe();
  177.    }
  178.  
  179.    protected Object clone() {
  180.       try {
  181.          SunGraphics2D var1 = (SunGraphics2D)super.clone();
  182.          var1.transform = new AffineTransform(this.transform);
  183.          if (this.hints != null) {
  184.             var1.hints = (RenderingHints)this.hints.clone();
  185.          }
  186.  
  187.          if (this.fontInfo != null) {
  188.             if (this.validFontInfo) {
  189.                var1.fontInfo = (FontInfo)this.fontInfo.clone();
  190.             } else {
  191.                var1.fontInfo = null;
  192.             }
  193.          }
  194.  
  195.          if (this.glyphVectorFontInfo != null) {
  196.             var1.glyphVectorFontInfo = (FontInfo)this.glyphVectorFontInfo.clone();
  197.             var1.glyphVectorFRC = this.glyphVectorFRC;
  198.          }
  199.  
  200.          return var1;
  201.       } catch (CloneNotSupportedException var2) {
  202.          return null;
  203.       }
  204.    }
  205.  
  206.    public Graphics create() {
  207.       return (Graphics)this.clone();
  208.    }
  209.  
  210.    public void setDevClip(int var1, int var2, int var3, int var4) {
  211.       Region var5 = this.constrainClip;
  212.       if (var5 == null) {
  213.          this.devClip = Region.getInstanceXYWH(var1, var2, var3, var4);
  214.       } else {
  215.          this.devClip = var5.getIntersectionXYWH(var1, var2, var3, var4);
  216.       }
  217.  
  218.       this.validateCompClip();
  219.    }
  220.  
  221.    public void setDevClip(Rectangle var1) {
  222.       this.setDevClip(var1.x, var1.y, var1.width, var1.height);
  223.    }
  224.  
  225.    public void constrain(int var1, int var2, int var3, int var4) {
  226.       if ((var1 | var2) != 0) {
  227.          this.translate(var1, var2);
  228.       }
  229.  
  230.       if (this.transformState >= 3) {
  231.          this.clipRect(0, 0, var3, var4);
  232.       } else {
  233.          var1 = this.constrainX = this.transX;
  234.          var2 = this.constrainY = this.transY;
  235.          var3 = Region.dimAdd(var1, var3);
  236.          var4 = Region.dimAdd(var2, var4);
  237.          Region var5 = this.constrainClip;
  238.          if (var5 == null) {
  239.             var5 = Region.getInstanceXYXY(var1, var2, var3, var4);
  240.          } else {
  241.             var5 = var5.getIntersectionXYXY(var1, var2, var3, var4);
  242.             if (var5 == this.constrainClip) {
  243.                return;
  244.             }
  245.          }
  246.  
  247.          this.constrainClip = var5;
  248.          if (!this.devClip.isInsideQuickCheck(var5)) {
  249.             this.devClip = this.devClip.getIntersection(var5);
  250.             this.validateCompClip();
  251.          }
  252.  
  253.       }
  254.    }
  255.  
  256.    protected void invalidatePipe() {
  257.       this.drawpipe = invalidpipe;
  258.       this.fillpipe = invalidpipe;
  259.       this.shapepipe = invalidpipe;
  260.       this.textpipe = invalidpipe;
  261.       this.imagepipe = invalidpipe;
  262.    }
  263.  
  264.    public void validatePipe() {
  265.       this.surfaceData.validatePipe(this);
  266.    }
  267.  
  268.    Shape intersectShapes(Shape var1, Shape var2, boolean var3, boolean var4) {
  269.       if (var1 instanceof Rectangle && var2 instanceof Rectangle) {
  270.          return ((Rectangle)var1).intersection((Rectangle)var2);
  271.       } else if (var1 instanceof Rectangle2D) {
  272.          return this.intersectRectShape((Rectangle2D)var1, var2, var3, var4);
  273.       } else {
  274.          return var2 instanceof Rectangle2D ? this.intersectRectShape((Rectangle2D)var2, var1, var4, var3) : this.intersectByArea(var1, var2, var3, var4);
  275.       }
  276.    }
  277.  
  278.    Shape intersectRectShape(Rectangle2D var1, Shape var2, boolean var3, boolean var4) {
  279.       if (var2 instanceof Rectangle2D) {
  280.          Rectangle2D var5 = (Rectangle2D)var2;
  281.          Object var6;
  282.          if (!var3) {
  283.             var6 = var1;
  284.          } else if (!var4) {
  285.             var6 = var5;
  286.          } else {
  287.             var6 = new Rectangle2D.Float();
  288.          }
  289.  
  290.          double var7 = Math.max(var1.getX(), var5.getX());
  291.          double var9 = Math.min(var1.getX() + var1.getWidth(), var5.getX() + var5.getWidth());
  292.          double var11 = Math.max(var1.getY(), var5.getY());
  293.          double var13 = Math.min(var1.getY() + var1.getHeight(), var5.getY() + var5.getHeight());
  294.          if (!(var9 - var7 < (double)0.0F) && !(var13 - var11 < (double)0.0F)) {
  295.             ((Rectangle2D)var6).setFrameFromDiagonal(var7, var11, var9, var13);
  296.          } else {
  297.             ((Rectangle2D)var6).setFrameFromDiagonal((double)0.0F, (double)0.0F, (double)0.0F, (double)0.0F);
  298.          }
  299.  
  300.          return (Shape)var6;
  301.       } else if (var1.contains(var2.getBounds2D())) {
  302.          if (var4) {
  303.             var2 = cloneShape(var2);
  304.          }
  305.  
  306.          return var2;
  307.       } else {
  308.          return this.intersectByArea(var1, var2, var3, var4);
  309.       }
  310.    }
  311.  
  312.    protected static Shape cloneShape(Shape var0) {
  313.       return new GeneralPath(var0);
  314.    }
  315.  
  316.    Shape intersectByArea(Shape var1, Shape var2, boolean var3, boolean var4) {
  317.       Area var5;
  318.       if (!var3 && var1 instanceof Area) {
  319.          var5 = (Area)var1;
  320.       } else if (!var4 && var2 instanceof Area) {
  321.          var5 = (Area)var2;
  322.          var2 = var1;
  323.       } else {
  324.          var5 = new Area(var1);
  325.       }
  326.  
  327.       Area var6;
  328.       if (var2 instanceof Area) {
  329.          var6 = (Area)var2;
  330.       } else {
  331.          var6 = new Area(var2);
  332.       }
  333.  
  334.       var5.intersect(var6);
  335.       return (Shape)(var5.isRectangular() ? var5.getBounds() : var5);
  336.    }
  337.  
  338.    public Region getCompClip() {
  339.       if (!this.surfaceData.isValid()) {
  340.          this.revalidateAll();
  341.       }
  342.  
  343.       return this.clipRegion;
  344.    }
  345.  
  346.    public Font getFont() {
  347.       if (this.font == null) {
  348.          this.font = defaultFont;
  349.       }
  350.  
  351.       return this.font;
  352.    }
  353.  
  354.    public FontInfo checkFontInfo(FontInfo var1, Font var2, FontRenderContext var3) {
  355.       if (var1 == null) {
  356.          var1 = new FontInfo();
  357.       }
  358.  
  359.       float var4 = var2.getSize2D();
  360.       AffineTransform var7 = null;
  361.       AffineTransform var6;
  362.       if (var2.isTransformed()) {
  363.          var7 = var2.getTransform();
  364.          var7.scale((double)var4, (double)var4);
  365.          int var5 = var7.getType();
  366.          var1.originX = (float)var7.getTranslateX();
  367.          var1.originY = (float)var7.getTranslateY();
  368.          var7.translate((double)(-var1.originX), (double)(-var1.originY));
  369.          if (this.transformState >= 3) {
  370.             this.transform.getMatrix(var1.devTx = new double[4]);
  371.             var6 = new AffineTransform(var1.devTx);
  372.             var7.preConcatenate(var6);
  373.          } else {
  374.             var1.devTx = IDENT_MATRIX;
  375.             var6 = IDENT_ATX;
  376.          }
  377.  
  378.          var7.getMatrix(var1.glyphTx = new double[4]);
  379.          double var8 = var7.getShearX();
  380.          double var10 = var7.getScaleY();
  381.          if (var8 != (double)0.0F) {
  382.             var10 = Math.sqrt(var8 * var8 + var10 * var10);
  383.          }
  384.  
  385.          var1.pixelHeight = (int)(Math.abs(var10) + (double)0.5F);
  386.       } else {
  387.          boolean var12 = false;
  388.          var1.originX = var1.originY = 0.0F;
  389.          if (this.transformState >= 3) {
  390.             this.transform.getMatrix(var1.devTx = new double[4]);
  391.             var6 = new AffineTransform(var1.devTx);
  392.             var1.glyphTx = new double[4];
  393.  
  394.             for(int var13 = 0; var13 < 4; ++var13) {
  395.                var1.glyphTx[var13] = var1.devTx[var13] * (double)var4;
  396.             }
  397.  
  398.             var7 = new AffineTransform(var1.glyphTx);
  399.             double var14 = this.transform.getShearX();
  400.             double var17 = this.transform.getScaleY();
  401.             if (var14 != (double)0.0F) {
  402.                var17 = Math.sqrt(var14 * var14 + var17 * var17);
  403.             }
  404.  
  405.             var1.pixelHeight = (int)(Math.abs(var17 * (double)var4) + (double)0.5F);
  406.          } else {
  407.             int var15 = (int)var4;
  408.             if (var4 == (float)var15 && var15 >= 8 && var15 < 17) {
  409.                var1.glyphTx = textTxArr[var15];
  410.                var7 = textAtArr[var15];
  411.                var1.pixelHeight = var15;
  412.             } else {
  413.                var1.pixelHeight = (int)((double)var4 + (double)0.5F);
  414.             }
  415.  
  416.             if (var7 == null) {
  417.                var1.glyphTx = new double[]{(double)var4, (double)0.0F, (double)0.0F, (double)var4};
  418.                var7 = new AffineTransform(var1.glyphTx);
  419.             }
  420.  
  421.             var1.devTx = IDENT_MATRIX;
  422.             var6 = IDENT_ATX;
  423.          }
  424.       }
  425.  
  426.       var1.font2D = FontManager.getFont2D(var2);
  427.       int var16 = this.fractionalMetricsHint;
  428.       if (var16 == 0) {
  429.          var16 = 1;
  430.       }
  431.  
  432.       var1.lcdSubPixPos = false;
  433.       int var9;
  434.       if (var3 == null) {
  435.          var9 = this.textAntialiasHint;
  436.       } else {
  437.          var9 = ((SunHints.Value)var3.getAntiAliasingHint()).getIndex();
  438.       }
  439.  
  440.       if (var9 == 0) {
  441.          if (this.antialiasHint == 2) {
  442.             var9 = 2;
  443.          } else {
  444.             var9 = 1;
  445.          }
  446.       } else if (var9 == 3) {
  447.          if (var1.font2D.useAAForPtSize(var1.pixelHeight)) {
  448.             var9 = 2;
  449.          } else {
  450.             var9 = 1;
  451.          }
  452.       } else if (var9 >= 4) {
  453.          if (!this.surfaceData.canRenderLCDText(this)) {
  454.             var9 = 2;
  455.          } else {
  456.             var1.lcdRGBOrder = true;
  457.             if (var9 == 5) {
  458.                var9 = 4;
  459.                var1.lcdRGBOrder = false;
  460.             } else if (var9 == 7) {
  461.                var9 = 6;
  462.                var1.lcdRGBOrder = false;
  463.             }
  464.  
  465.             var1.lcdSubPixPos = var16 == 2 && var9 == 4;
  466.          }
  467.       }
  468.  
  469.       var1.aaHint = var9;
  470.       var1.fontStrike = var1.font2D.getStrike(var2, var6, var7, var9, var16);
  471.       return var1;
  472.    }
  473.  
  474.    public static boolean isRotated(double[] var0) {
  475.       return var0[0] != var0[3] || var0[1] != (double)0.0F || var0[2] != (double)0.0F || !(var0[0] > (double)0.0F);
  476.    }
  477.  
  478.    public void setFont(Font var1) {
  479.       if (var1 != null && var1 != this.font) {
  480.          if (this.textAntialiasHint == 3 && this.textpipe != invalidpipe && (this.transformState > 2 || var1.isTransformed() || this.fontInfo == null || this.fontInfo.aaHint == 2 != FontManager.getFont2D(var1).useAAForPtSize(var1.getSize()))) {
  481.             this.textpipe = invalidpipe;
  482.          }
  483.  
  484.          this.font = var1;
  485.          this.fontMetrics = null;
  486.          this.validFontInfo = false;
  487.       }
  488.  
  489.    }
  490.  
  491.    public FontInfo getFontInfo() {
  492.       if (!this.validFontInfo) {
  493.          this.fontInfo = this.checkFontInfo(this.fontInfo, this.font, (FontRenderContext)null);
  494.          this.validFontInfo = true;
  495.       }
  496.  
  497.       return this.fontInfo;
  498.    }
  499.  
  500.    public FontInfo getGVFontInfo(Font var1, FontRenderContext var2) {
  501.       if (this.glyphVectorFontInfo != null && this.glyphVectorFontInfo.font == var1 && this.glyphVectorFRC == var2) {
  502.          return this.glyphVectorFontInfo;
  503.       } else {
  504.          this.glyphVectorFRC = var2;
  505.          return this.glyphVectorFontInfo = this.checkFontInfo(this.glyphVectorFontInfo, var1, var2);
  506.       }
  507.    }
  508.  
  509.    public FontMetrics getFontMetrics() {
  510.       return this.fontMetrics != null ? this.fontMetrics : (this.fontMetrics = FontDesignMetrics.getMetrics(this.font, this.getFontRenderContext()));
  511.    }
  512.  
  513.    public FontMetrics getFontMetrics(Font var1) {
  514.       if (this.fontMetrics != null && var1 == this.font) {
  515.          return this.fontMetrics;
  516.       } else {
  517.          FontDesignMetrics var2 = FontDesignMetrics.getMetrics(var1, this.getFontRenderContext());
  518.          if (this.font == var1) {
  519.             this.fontMetrics = var2;
  520.          }
  521.  
  522.          return var2;
  523.       }
  524.    }
  525.  
  526.    public boolean hit(Rectangle var1, Shape var2, boolean var3) {
  527.       if (var3) {
  528.          var2 = this.stroke.createStrokedShape(var2);
  529.       }
  530.  
  531.       var2 = this.transformShape(var2);
  532.       if ((this.constrainX | this.constrainY) != 0) {
  533.          var1 = new Rectangle(var1);
  534.          var1.translate(this.constrainX, this.constrainY);
  535.       }
  536.  
  537.       return var2.intersects(var1);
  538.    }
  539.  
  540.    public ColorModel getDeviceColorModel() {
  541.       return this.surfaceData.getColorModel();
  542.    }
  543.  
  544.    public GraphicsConfiguration getDeviceConfiguration() {
  545.       return this.surfaceData.getDeviceConfiguration();
  546.    }
  547.  
  548.    public final SurfaceData getSurfaceData() {
  549.       return this.surfaceData;
  550.    }
  551.  
  552.    public void setComposite(Composite var1) {
  553.       if (this.composite != var1) {
  554.          byte var2;
  555.          CompositeType var3;
  556.          if (var1 instanceof AlphaComposite) {
  557.             AlphaComposite var4 = (AlphaComposite)var1;
  558.             var3 = CompositeType.forAlphaComposite(var4);
  559.             if (var3 == CompositeType.SrcOverNoEa) {
  560.                if (this.paintState != 0 && (this.paintState <= 1 || this.paint.getTransparency() != 1)) {
  561.                   var2 = 1;
  562.                } else {
  563.                   var2 = 0;
  564.                }
  565.             } else if (var3 != CompositeType.SrcNoEa && var3 != CompositeType.Src && var3 != CompositeType.Clear) {
  566.                if (this.surfaceData.getTransparency() == 1 && var3 == CompositeType.SrcIn) {
  567.                   var2 = 0;
  568.                } else {
  569.                   var2 = 1;
  570.                }
  571.             } else {
  572.                var2 = 0;
  573.             }
  574.          } else if (var1 instanceof XORComposite) {
  575.             var2 = 2;
  576.             var3 = CompositeType.Xor;
  577.          } else {
  578.             if (var1 == null) {
  579.                throw new IllegalArgumentException("null Composite");
  580.             }
  581.  
  582.             this.surfaceData.checkCustomComposite();
  583.             var2 = 3;
  584.             var3 = CompositeType.General;
  585.          }
  586.  
  587.          if (this.compositeState != var2 || this.imageComp != var3) {
  588.             this.compositeState = var2;
  589.             this.imageComp = var3;
  590.             this.invalidatePipe();
  591.          }
  592.  
  593.          this.composite = var1;
  594.          if (this.paintState <= 1) {
  595.             this.validateColor();
  596.          }
  597.  
  598.       }
  599.    }
  600.  
  601.    public void setPaint(Paint var1) {
  602.       if (var1 instanceof Color) {
  603.          this.setColor((Color)var1);
  604.       } else if (var1 != null && this.paint != var1) {
  605.          this.paint = var1;
  606.          if (this.imageComp == CompositeType.SrcOverNoEa) {
  607.             if (var1.getTransparency() == 1) {
  608.                if (this.compositeState != 0) {
  609.                   this.compositeState = 0;
  610.                }
  611.             } else if (this.compositeState == 0) {
  612.                this.compositeState = 1;
  613.             }
  614.          }
  615.  
  616.          if (var1.getClass() == GradientPaint.class) {
  617.             this.paintState = 2;
  618.          } else if (var1.getClass() == TexturePaint.class) {
  619.             this.paintState = 3;
  620.          } else {
  621.             this.paintState = 4;
  622.          }
  623.  
  624.          this.invalidatePipe();
  625.       }
  626.    }
  627.  
  628.    private void validateBasicStroke(BasicStroke var1) {
  629.       boolean var2 = this.antialiasHint == 2;
  630.       if (this.transformState < 3) {
  631.          if (var2) {
  632.             if (var1.getLineWidth() <= 0.19999999F) {
  633.                if (var1.getDashArray() == null) {
  634.                   this.strokeState = 0;
  635.                } else {
  636.                   this.strokeState = 1;
  637.                }
  638.             } else {
  639.                this.strokeState = 2;
  640.             }
  641.          } else if (var1 == defaultStroke) {
  642.             this.strokeState = 0;
  643.          } else if (var1.getLineWidth() <= 1.0F) {
  644.             if (var1.getDashArray() == null) {
  645.                this.strokeState = 0;
  646.             } else {
  647.                this.strokeState = 1;
  648.             }
  649.          } else {
  650.             this.strokeState = 2;
  651.          }
  652.       } else {
  653.          double var3;
  654.          if ((this.transform.getType() & 36) == 0) {
  655.             var3 = Math.abs(this.transform.getDeterminant());
  656.          } else {
  657.             double var5 = this.transform.getScaleX();
  658.             double var7 = this.transform.getShearX();
  659.             double var9 = this.transform.getShearY();
  660.             double var11 = this.transform.getScaleY();
  661.             double var13 = var5 * var5 + var9 * var9;
  662.             double var15 = (double)2.0F * (var5 * var7 + var9 * var11);
  663.             double var17 = var7 * var7 + var11 * var11;
  664.             double var19 = Math.sqrt(var15 * var15 + (var13 - var17) * (var13 - var17));
  665.             var3 = (var13 + var17 + var19) / (double)2.0F;
  666.          }
  667.  
  668.          if (var1 != defaultStroke) {
  669.             var3 *= (double)(var1.getLineWidth() * var1.getLineWidth());
  670.          }
  671.  
  672.          if (var3 <= (var2 ? (double)0.039999995F : 1.000000001)) {
  673.             if (var1.getDashArray() == null) {
  674.                this.strokeState = 0;
  675.             } else {
  676.                this.strokeState = 1;
  677.             }
  678.          } else {
  679.             this.strokeState = 2;
  680.          }
  681.       }
  682.  
  683.    }
  684.  
  685.    public void setStroke(Stroke var1) {
  686.       if (var1 == null) {
  687.          throw new IllegalArgumentException("null Stroke");
  688.       } else {
  689.          int var2 = this.strokeState;
  690.          this.stroke = var1;
  691.          if (var1 instanceof BasicStroke) {
  692.             this.validateBasicStroke((BasicStroke)var1);
  693.          } else {
  694.             this.strokeState = 3;
  695.          }
  696.  
  697.          if (this.strokeState != var2) {
  698.             this.invalidatePipe();
  699.          }
  700.  
  701.       }
  702.    }
  703.  
  704.    public void setRenderingHint(RenderingHints.Key var1, Object var2) {
  705.       if (!var1.isCompatibleValue(var2)) {
  706.          throw new IllegalArgumentException(var2 + " is not compatible with " + var1);
  707.       } else {
  708.          if (var1 instanceof SunHints.Key) {
  709.             boolean var4 = false;
  710.             boolean var5 = true;
  711.             SunHints.Key var6 = (SunHints.Key)var1;
  712.             int var7;
  713.             if (var6 == SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST) {
  714.                var7 = (Integer)var2;
  715.             } else {
  716.                var7 = ((SunHints.Value)var2).getIndex();
  717.             }
  718.  
  719.             boolean var3;
  720.             switch (var6.getIndex()) {
  721.                case 0:
  722.                   var3 = this.renderHint != var7;
  723.                   if (var3) {
  724.                      this.renderHint = var7;
  725.                      if (this.interpolationHint == -1) {
  726.                         this.interpolationType = var7 == 2 ? 2 : 1;
  727.                      }
  728.                   }
  729.                   break;
  730.                case 1:
  731.                   var3 = this.antialiasHint != var7;
  732.                   this.antialiasHint = var7;
  733.                   if (!var3) {
  734.                      break;
  735.                   }
  736.  
  737.                   var4 = this.textAntialiasHint == 0 || this.textAntialiasHint >= 4;
  738.                   if (this.strokeState != 3) {
  739.                      this.validateBasicStroke((BasicStroke)this.stroke);
  740.                   }
  741.                   break;
  742.                case 2:
  743.                   var3 = this.textAntialiasHint != var7;
  744.                   var4 = var3;
  745.                   this.textAntialiasHint = var7;
  746.                   break;
  747.                case 3:
  748.                   var3 = this.fractionalMetricsHint != var7;
  749.                   var4 = var3;
  750.                   this.fractionalMetricsHint = var7;
  751.                   break;
  752.                case 5:
  753.                   this.interpolationHint = var7;
  754.                   switch (var7) {
  755.                      case 0:
  756.                      default:
  757.                         var7 = 1;
  758.                         break;
  759.                      case 1:
  760.                         var7 = 2;
  761.                         break;
  762.                      case 2:
  763.                         var7 = 3;
  764.                   }
  765.  
  766.                   var3 = this.interpolationType != var7;
  767.                   this.interpolationType = var7;
  768.                   break;
  769.                case 8:
  770.                   var3 = this.strokeHint != var7;
  771.                   this.strokeHint = var7;
  772.                   break;
  773.                case 100:
  774.                   var3 = false;
  775.                   this.lcdTextContrast = var7;
  776.                   break;
  777.                default:
  778.                   var5 = false;
  779.                   var3 = false;
  780.             }
  781.  
  782.             if (var5) {
  783.                if (var3) {
  784.                   this.invalidatePipe();
  785.                   if (var4) {
  786.                      this.fontMetrics = null;
  787.                      this.cachedFRC = null;
  788.                      this.validFontInfo = false;
  789.                      this.glyphVectorFontInfo = null;
  790.                   }
  791.                }
  792.  
  793.                if (this.hints != null) {
  794.                   this.hints.put(var1, var2);
  795.                }
  796.  
  797.                return;
  798.             }
  799.          }
  800.  
  801.          if (this.hints == null) {
  802.             this.hints = this.makeHints((Map)null);
  803.          }
  804.  
  805.          this.hints.put(var1, var2);
  806.       }
  807.    }
  808.  
  809.    public Object getRenderingHint(RenderingHints.Key var1) {
  810.       if (this.hints != null) {
  811.          return this.hints.get(var1);
  812.       } else if (!(var1 instanceof SunHints.Key)) {
  813.          return null;
  814.       } else {
  815.          int var2 = ((SunHints.Key)var1).getIndex();
  816.          switch (var2) {
  817.             case 0:
  818.                return Value.get(0, this.renderHint);
  819.             case 1:
  820.                return Value.get(1, this.antialiasHint);
  821.             case 2:
  822.                return Value.get(2, this.textAntialiasHint);
  823.             case 3:
  824.                return Value.get(3, this.fractionalMetricsHint);
  825.             case 5:
  826.                switch (this.interpolationHint) {
  827.                   case 0:
  828.                      return SunHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
  829.                   case 1:
  830.                      return SunHints.VALUE_INTERPOLATION_BILINEAR;
  831.                   case 2:
  832.                      return SunHints.VALUE_INTERPOLATION_BICUBIC;
  833.                   default:
  834.                      return null;
  835.                }
  836.             case 8:
  837.                return Value.get(8, this.strokeHint);
  838.             case 100:
  839.                return new Integer(this.lcdTextContrast);
  840.             default:
  841.                return null;
  842.          }
  843.       }
  844.    }
  845.  
  846.    public void setRenderingHints(Map<?, ?> var1) {
  847.       this.hints = null;
  848.       this.renderHint = 0;
  849.       this.antialiasHint = 1;
  850.       this.textAntialiasHint = 0;
  851.       this.fractionalMetricsHint = 1;
  852.       this.lcdTextContrast = lcdTextContrastDefaultValue;
  853.       this.interpolationHint = -1;
  854.       this.interpolationType = 1;
  855.       boolean var2 = false;
  856.  
  857.       for(Object var4 : var1.keySet()) {
  858.          if (var4 != SunHints.KEY_RENDERING && var4 != SunHints.KEY_ANTIALIASING && var4 != SunHints.KEY_TEXT_ANTIALIASING && var4 != SunHints.KEY_FRACTIONALMETRICS && var4 != SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST && var4 != SunHints.KEY_STROKE_CONTROL && var4 != SunHints.KEY_INTERPOLATION) {
  859.             var2 = true;
  860.          } else {
  861.             this.setRenderingHint((RenderingHints.Key)var4, var1.get(var4));
  862.          }
  863.       }
  864.  
  865.       if (var2) {
  866.          this.hints = this.makeHints(var1);
  867.       }
  868.  
  869.       this.invalidatePipe();
  870.    }
  871.  
  872.    public void addRenderingHints(Map<?, ?> var1) {
  873.       boolean var2 = false;
  874.  
  875.       for(Object var4 : var1.keySet()) {
  876.          if (var4 != SunHints.KEY_RENDERING && var4 != SunHints.KEY_ANTIALIASING && var4 != SunHints.KEY_TEXT_ANTIALIASING && var4 != SunHints.KEY_FRACTIONALMETRICS && var4 != SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST && var4 != SunHints.KEY_STROKE_CONTROL && var4 != SunHints.KEY_INTERPOLATION) {
  877.             var2 = true;
  878.          } else {
  879.             this.setRenderingHint((RenderingHints.Key)var4, var1.get(var4));
  880.          }
  881.       }
  882.  
  883.       if (var2) {
  884.          if (this.hints == null) {
  885.             this.hints = this.makeHints(var1);
  886.          } else {
  887.             this.hints.putAll(var1);
  888.          }
  889.       }
  890.  
  891.    }
  892.  
  893.    public RenderingHints getRenderingHints() {
  894.       return this.hints == null ? this.makeHints((Map)null) : (RenderingHints)this.hints.clone();
  895.    }
  896.  
  897.    RenderingHints makeHints(Map var1) {
  898.       RenderingHints var2 = new RenderingHints(var1);
  899.       var2.put(SunHints.KEY_RENDERING, Value.get(0, this.renderHint));
  900.       var2.put(SunHints.KEY_ANTIALIASING, Value.get(1, this.antialiasHint));
  901.       var2.put(SunHints.KEY_TEXT_ANTIALIASING, Value.get(2, this.textAntialiasHint));
  902.       var2.put(SunHints.KEY_FRACTIONALMETRICS, Value.get(3, this.fractionalMetricsHint));
  903.       var2.put(SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST, new Integer(this.lcdTextContrast));
  904.       Object var3;
  905.       switch (this.interpolationHint) {
  906.          case 0:
  907.             var3 = SunHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
  908.             break;
  909.          case 1:
  910.             var3 = SunHints.VALUE_INTERPOLATION_BILINEAR;
  911.             break;
  912.          case 2:
  913.             var3 = SunHints.VALUE_INTERPOLATION_BICUBIC;
  914.             break;
  915.          default:
  916.             var3 = null;
  917.       }
  918.  
  919.       if (var3 != null) {
  920.          var2.put(SunHints.KEY_INTERPOLATION, var3);
  921.       }
  922.  
  923.       var2.put(SunHints.KEY_STROKE_CONTROL, Value.get(8, this.strokeHint));
  924.       return var2;
  925.    }
  926.  
  927.    public void translate(double var1, double var3) {
  928.       this.transform.translate(var1, var3);
  929.       this.invalidateTransform();
  930.    }
  931.  
  932.    public void rotate(double var1) {
  933.       this.transform.rotate(var1);
  934.       this.invalidateTransform();
  935.    }
  936.  
  937.    public void rotate(double var1, double var3, double var5) {
  938.       this.transform.rotate(var1, var3, var5);
  939.       this.invalidateTransform();
  940.    }
  941.  
  942.    public void scale(double var1, double var3) {
  943.       this.transform.scale(var1, var3);
  944.       this.invalidateTransform();
  945.    }
  946.  
  947.    public void shear(double var1, double var3) {
  948.       this.transform.shear(var1, var3);
  949.       this.invalidateTransform();
  950.    }
  951.  
  952.    public void transform(AffineTransform var1) {
  953.       this.transform.concatenate(var1);
  954.       this.invalidateTransform();
  955.    }
  956.  
  957.    public void translate(int var1, int var2) {
  958.       this.transform.translate((double)var1, (double)var2);
  959.       if (this.transformState <= 1) {
  960.          this.transX += var1;
  961.          this.transY += var2;
  962.          this.transformState = (this.transX | this.transY) == 0 ? 0 : 1;
  963.       } else {
  964.          this.invalidateTransform();
  965.       }
  966.  
  967.    }
  968.  
  969.    public void setTransform(AffineTransform var1) {
  970.       if ((this.constrainX | this.constrainY) == 0) {
  971.          this.transform.setTransform(var1);
  972.       } else {
  973.          this.transform.setToTranslation((double)this.constrainX, (double)this.constrainY);
  974.          this.transform.concatenate(var1);
  975.       }
  976.  
  977.       this.invalidateTransform();
  978.    }
  979.  
  980.    protected void invalidateTransform() {
  981.       int var1 = this.transform.getType();
  982.       int var2 = this.transformState;
  983.       if (var1 == 0) {
  984.          this.transformState = 0;
  985.          this.transX = this.transY = 0;
  986.       } else if (var1 == 1) {
  987.          double var3 = this.transform.getTranslateX();
  988.          double var5 = this.transform.getTranslateY();
  989.          this.transX = (int)Math.floor(var3 + (double)0.5F);
  990.          this.transY = (int)Math.floor(var5 + (double)0.5F);
  991.          if (var3 == (double)this.transX && var5 == (double)this.transY) {
  992.             this.transformState = 1;
  993.          } else {
  994.             this.transformState = 2;
  995.          }
  996.       } else if ((var1 & 120) == 0) {
  997.          this.transformState = 3;
  998.          this.transX = this.transY = 0;
  999.       } else {
  1000.          this.transformState = 4;
  1001.          this.transX = this.transY = 0;
  1002.       }
  1003.  
  1004.       if (this.transformState >= 3 || var2 >= 3) {
  1005.          this.cachedFRC = null;
  1006.          this.validFontInfo = false;
  1007.          this.fontMetrics = null;
  1008.          this.glyphVectorFontInfo = null;
  1009.          if (this.transformState != var2) {
  1010.             this.invalidatePipe();
  1011.          }
  1012.       }
  1013.  
  1014.       if (this.strokeState != 3) {
  1015.          this.validateBasicStroke((BasicStroke)this.stroke);
  1016.       }
  1017.  
  1018.    }
  1019.  
  1020.    public AffineTransform getTransform() {
  1021.       if ((this.constrainX | this.constrainY) == 0) {
  1022.          return new AffineTransform(this.transform);
  1023.       } else {
  1024.          AffineTransform var1 = AffineTransform.getTranslateInstance((double)(-this.constrainX), (double)(-this.constrainY));
  1025.          var1.concatenate(this.transform);
  1026.          return var1;
  1027.       }
  1028.    }
  1029.  
  1030.    public AffineTransform cloneTransform() {
  1031.       return new AffineTransform(this.transform);
  1032.    }
  1033.  
  1034.    public Paint getPaint() {
  1035.       return this.paint;
  1036.    }
  1037.  
  1038.    public Composite getComposite() {
  1039.       return this.composite;
  1040.    }
  1041.  
  1042.    public Color getColor() {
  1043.       return this.foregroundColor;
  1044.    }
  1045.  
  1046.    final void validateColor() {
  1047.       int var1;
  1048.       if (this.imageComp == CompositeType.Clear) {
  1049.          var1 = 0;
  1050.       } else {
  1051.          var1 = this.foregroundColor.getRGB();
  1052.          if (this.compositeState <= 1 && this.imageComp != CompositeType.SrcNoEa && this.imageComp != CompositeType.SrcOverNoEa) {
  1053.             AlphaComposite var2 = (AlphaComposite)this.composite;
  1054.             int var3 = Math.round(var2.getAlpha() * (float)(var1 >>> 24));
  1055.             var1 = var1 & 16777215 | var3 << 24;
  1056.          }
  1057.       }
  1058.  
  1059.       this.eargb = var1;
  1060.       this.pixel = this.surfaceData.pixelFor(var1);
  1061.    }
  1062.  
  1063.    public void setColor(Color var1) {
  1064.       if (var1 != null && var1 != this.paint) {
  1065.          this.paint = this.foregroundColor = var1;
  1066.          this.validateColor();
  1067.          if (this.eargb >> 24 == -1) {
  1068.             if (this.paintState == 0) {
  1069.                return;
  1070.             }
  1071.  
  1072.             this.paintState = 0;
  1073.             if (this.imageComp == CompositeType.SrcOverNoEa) {
  1074.                this.compositeState = 0;
  1075.             }
  1076.          } else {
  1077.             if (this.paintState == 1) {
  1078.                return;
  1079.             }
  1080.  
  1081.             this.paintState = 1;
  1082.             if (this.imageComp == CompositeType.SrcOverNoEa) {
  1083.                this.compositeState = 1;
  1084.             }
  1085.          }
  1086.  
  1087.          this.invalidatePipe();
  1088.       }
  1089.    }
  1090.  
  1091.    public void setBackground(Color var1) {
  1092.       this.backgroundColor = var1;
  1093.    }
  1094.  
  1095.    public Color getBackground() {
  1096.       return this.backgroundColor;
  1097.    }
  1098.  
  1099.    public Stroke getStroke() {
  1100.       return this.stroke;
  1101.    }
  1102.  
  1103.    public Rectangle getClipBounds() {
  1104.       Rectangle var1;
  1105.       if (this.clipState == 0) {
  1106.          var1 = null;
  1107.       } else if (this.transformState <= 1) {
  1108.          if (this.usrClip instanceof Rectangle) {
  1109.             var1 = new Rectangle((Rectangle)this.usrClip);
  1110.          } else {
  1111.             var1 = this.usrClip.getBounds();
  1112.          }
  1113.  
  1114.          var1.translate(-this.transX, -this.transY);
  1115.       } else {
  1116.          var1 = this.getClip().getBounds();
  1117.       }
  1118.  
  1119.       return var1;
  1120.    }
  1121.  
  1122.    public Rectangle getClipBounds(Rectangle var1) {
  1123.       if (this.clipState != 0) {
  1124.          if (this.transformState <= 1) {
  1125.             if (this.usrClip instanceof Rectangle) {
  1126.                var1.setBounds((Rectangle)this.usrClip);
  1127.             } else {
  1128.                var1.setBounds(this.usrClip.getBounds());
  1129.             }
  1130.  
  1131.             var1.translate(-this.transX, -this.transY);
  1132.          } else {
  1133.             var1.setBounds(this.getClip().getBounds());
  1134.          }
  1135.       } else if (var1 == null) {
  1136.          throw new NullPointerException("null rectangle parameter");
  1137.       }
  1138.  
  1139.       return var1;
  1140.    }
  1141.  
  1142.    public boolean hitClip(int var1, int var2, int var3, int var4) {
  1143.       if (var3 > 0 && var4 > 0) {
  1144.          if (this.transformState > 1) {
  1145.             double[] var5 = new double[]{(double)var1, (double)var2, (double)(var1 + var3), (double)var2, (double)var1, (double)(var2 + var4), (double)(var1 + var3), (double)(var2 + var4)};
  1146.             this.transform.transform(var5, 0, var5, 0, 4);
  1147.             var1 = (int)Math.floor(Math.min(Math.min(var5[0], var5[2]), Math.min(var5[4], var5[6])));
  1148.             var2 = (int)Math.floor(Math.min(Math.min(var5[1], var5[3]), Math.min(var5[5], var5[7])));
  1149.             var3 = (int)Math.ceil(Math.max(Math.max(var5[0], var5[2]), Math.max(var5[4], var5[6])));
  1150.             var4 = (int)Math.ceil(Math.max(Math.max(var5[1], var5[3]), Math.max(var5[5], var5[7])));
  1151.          } else {
  1152.             var1 += this.transX;
  1153.             var2 += this.transY;
  1154.             var3 += var1;
  1155.             var4 += var2;
  1156.          }
  1157.  
  1158.          return this.getCompClip().intersectsQuickCheckXYXY(var1, var2, var3, var4);
  1159.       } else {
  1160.          return false;
  1161.       }
  1162.    }
  1163.  
  1164.    protected void validateCompClip() {
  1165.       int var1 = this.clipState;
  1166.       if (this.usrClip == null) {
  1167.          this.clipState = 0;
  1168.          this.clipRegion = this.devClip;
  1169.       } else if (this.usrClip instanceof Rectangle2D) {
  1170.          this.clipState = 1;
  1171.          if (this.usrClip instanceof Rectangle) {
  1172.             this.clipRegion = this.devClip.getIntersection((Rectangle)this.usrClip);
  1173.          } else {
  1174.             this.clipRegion = this.devClip.getIntersection(this.usrClip.getBounds());
  1175.          }
  1176.       } else {
  1177.          PathIterator var2 = this.usrClip.getPathIterator((AffineTransform)null);
  1178.          int[] var3 = new int[4];
  1179.          ShapeSpanIterator var4 = new ShapeSpanIterator(this, false);
  1180.  
  1181.          try {
  1182.             var4.setOutputArea(this.devClip);
  1183.             var4.appendPath(var2);
  1184.             var4.getPathBox(var3);
  1185.             Region var5 = Region.getInstance(var3);
  1186.             var5.appendSpans(var4);
  1187.             this.clipRegion = var5;
  1188.             this.clipState = var5.isRectangular() ? 1 : 2;
  1189.          } finally {
  1190.             var4.dispose();
  1191.          }
  1192.       }
  1193.  
  1194.       if (var1 != this.clipState && (this.clipState == 2 || var1 == 2)) {
  1195.          this.invalidatePipe();
  1196.       }
  1197.  
  1198.    }
  1199.  
  1200.    protected Shape transformShape(Shape var1) {
  1201.       if (var1 == null) {
  1202.          return null;
  1203.       } else {
  1204.          return this.transformState > 1 ? transformShape(this.transform, var1) : transformShape(this.transX, this.transY, var1);
  1205.       }
  1206.    }
  1207.  
  1208.    public Shape untransformShape(Shape var1) {
  1209.       if (var1 == null) {
  1210.          return null;
  1211.       } else if (this.transformState > 1) {
  1212.          try {
  1213.             return transformShape(this.transform.createInverse(), var1);
  1214.          } catch (NoninvertibleTransformException var3) {
  1215.             return null;
  1216.          }
  1217.       } else {
  1218.          return transformShape(-this.transX, -this.transY, var1);
  1219.       }
  1220.    }
  1221.  
  1222.    protected static Shape transformShape(int var0, int var1, Shape var2) {
  1223.       if (var2 == null) {
  1224.          return null;
  1225.       } else if (var2 instanceof Rectangle) {
  1226.          Rectangle var5 = var2.getBounds();
  1227.          var5.translate(var0, var1);
  1228.          return var5;
  1229.       } else if (var2 instanceof Rectangle2D) {
  1230.          Rectangle2D var4 = (Rectangle2D)var2;
  1231.          return new Rectangle2D.Double(var4.getX() + (double)var0, var4.getY() + (double)var1, var4.getWidth(), var4.getHeight());
  1232.       } else if (var0 == 0 && var1 == 0) {
  1233.          return cloneShape(var2);
  1234.       } else {
  1235.          AffineTransform var3 = AffineTransform.getTranslateInstance((double)var0, (double)var1);
  1236.          return var3.createTransformedShape(var2);
  1237.       }
  1238.    }
  1239.  
  1240.    protected static Shape transformShape(AffineTransform var0, Shape var1) {
  1241.       if (var1 == null) {
  1242.          return null;
  1243.       } else if (var1 instanceof Rectangle2D && (var0.getType() & 48) == 0) {
  1244.          Rectangle2D var2 = (Rectangle2D)var1;
  1245.          double[] var3 = new double[]{var2.getX(), var2.getY(), (double)0.0F, (double)0.0F};
  1246.          var3[2] = var3[0] + var2.getWidth();
  1247.          var3[3] = var3[1] + var2.getHeight();
  1248.          var0.transform(var3, 0, var3, 0, 2);
  1249.          var2 = new Rectangle2D.Float();
  1250.          var2.setFrameFromDiagonal(var3[0], var3[1], var3[2], var3[3]);
  1251.          return var2;
  1252.       } else {
  1253.          return var0.isIdentity() ? cloneShape(var1) : var0.createTransformedShape(var1);
  1254.       }
  1255.    }
  1256.  
  1257.    public void clipRect(int var1, int var2, int var3, int var4) {
  1258.       this.clip(new Rectangle(var1, var2, var3, var4));
  1259.    }
  1260.  
  1261.    public void setClip(int var1, int var2, int var3, int var4) {
  1262.       this.setClip(new Rectangle(var1, var2, var3, var4));
  1263.    }
  1264.  
  1265.    public Shape getClip() {
  1266.       return this.untransformShape(this.usrClip);
  1267.    }
  1268.  
  1269.    public void setClip(Shape var1) {
  1270.       this.usrClip = this.transformShape(var1);
  1271.       this.validateCompClip();
  1272.    }
  1273.  
  1274.    public void clip(Shape var1) {
  1275.       var1 = this.transformShape(var1);
  1276.       if (this.usrClip != null) {
  1277.          var1 = this.intersectShapes(this.usrClip, var1, true, true);
  1278.       }
  1279.  
  1280.       this.usrClip = var1;
  1281.       this.validateCompClip();
  1282.    }
  1283.  
  1284.    public void setPaintMode() {
  1285.       this.setComposite(AlphaComposite.SrcOver);
  1286.    }
  1287.  
  1288.    public void setXORMode(Color var1) {
  1289.       if (var1 == null) {
  1290.          throw new IllegalArgumentException("null XORColor");
  1291.       } else {
  1292.          this.setComposite(new XORComposite(var1, this.surfaceData));
  1293.       }
  1294.    }
  1295.  
  1296.    public void copyArea(int var1, int var2, int var3, int var4, int var5, int var6) {
  1297.       try {
  1298.          this.doCopyArea(var1, var2, var3, var4, var5, var6);
  1299.       } catch (InvalidPipeException var10) {
  1300.          this.revalidateAll();
  1301.  
  1302.          try {
  1303.             this.doCopyArea(var1, var2, var3, var4, var5, var6);
  1304.          } catch (InvalidPipeException var9) {
  1305.          }
  1306.       }
  1307.  
  1308.    }
  1309.  
  1310.    private void doCopyArea(int var1, int var2, int var3, int var4, int var5, int var6) {
  1311.       if (var3 > 0 && var4 > 0) {
  1312.          SurfaceData var7 = this.surfaceData;
  1313.          if (!var7.copyArea(this, var1, var2, var3, var4, var5, var6)) {
  1314.             if (this.transformState >= 3) {
  1315.                throw new InternalError("transformed copyArea not implemented yet");
  1316.             } else {
  1317.                Region var8 = this.getCompClip();
  1318.                Composite var9 = this.composite;
  1319.                if (this.lastCAcomp != var9) {
  1320.                   SurfaceType var10 = var7.getSurfaceType();
  1321.                   CompositeType var11 = this.imageComp;
  1322.                   if (CompositeType.SrcOverNoEa.equals(var11) && var7.getTransparency() == 1) {
  1323.                      var11 = CompositeType.SrcNoEa;
  1324.                   }
  1325.  
  1326.                   this.lastCAblit = Blit.locate(var10, var11, var10);
  1327.                   this.lastCAcomp = var9;
  1328.                }
  1329.  
  1330.                var1 += this.transX;
  1331.                var2 += this.transY;
  1332.                Blit var15 = this.lastCAblit;
  1333.                if (var6 == 0 && var5 > 0 && var5 < var3) {
  1334.                   while(var3 > 0) {
  1335.                      int var17 = Math.min(var3, var5);
  1336.                      var3 -= var17;
  1337.                      int var18 = var1 + var3;
  1338.                      var15.Blit(var7, var7, var9, var8, var18, var2, var18 + var5, var2 + var6, var17, var4);
  1339.                   }
  1340.  
  1341.                } else if (var6 > 0 && var6 < var4 && var5 > -var3 && var5 < var3) {
  1342.                   while(var4 > 0) {
  1343.                      int var16 = Math.min(var4, var6);
  1344.                      var4 -= var16;
  1345.                      int var12 = var2 + var4;
  1346.                      var15.Blit(var7, var7, var9, var8, var1, var12, var1 + var5, var12 + var6, var3, var16);
  1347.                   }
  1348.  
  1349.                } else {
  1350.                   var15.Blit(var7, var7, var9, var8, var1, var2, var1 + var5, var2 + var6, var3, var4);
  1351.                }
  1352.             }
  1353.          }
  1354.       }
  1355.    }
  1356.  
  1357.    public void drawLine(int var1, int var2, int var3, int var4) {
  1358.       try {
  1359.          this.drawpipe.drawLine(this, var1, var2, var3, var4);
  1360.       } catch (InvalidPipeException var8) {
  1361.          this.revalidateAll();
  1362.  
  1363.          try {
  1364.             this.drawpipe.drawLine(this, var1, var2, var3, var4);
  1365.          } catch (InvalidPipeException var7) {
  1366.          }
  1367.       }
  1368.  
  1369.    }
  1370.  
  1371.    public void drawRoundRect(int var1, int var2, int var3, int var4, int var5, int var6) {
  1372.       try {
  1373.          this.drawpipe.drawRoundRect(this, var1, var2, var3, var4, var5, var6);
  1374.       } catch (InvalidPipeException var10) {
  1375.          this.revalidateAll();
  1376.  
  1377.          try {
  1378.             this.drawpipe.drawRoundRect(this, var1, var2, var3, var4, var5, var6);
  1379.          } catch (InvalidPipeException var9) {
  1380.          }
  1381.       }
  1382.  
  1383.    }
  1384.  
  1385.    public void fillRoundRect(int var1, int var2, int var3, int var4, int var5, int var6) {
  1386.       try {
  1387.          this.fillpipe.fillRoundRect(this, var1, var2, var3, var4, var5, var6);
  1388.       } catch (InvalidPipeException var10) {
  1389.          this.revalidateAll();
  1390.  
  1391.          try {
  1392.             this.fillpipe.fillRoundRect(this, var1, var2, var3, var4, var5, var6);
  1393.          } catch (InvalidPipeException var9) {
  1394.          }
  1395.       }
  1396.  
  1397.    }
  1398.  
  1399.    public void drawOval(int var1, int var2, int var3, int var4) {
  1400.       try {
  1401.          this.drawpipe.drawOval(this, var1, var2, var3, var4);
  1402.       } catch (InvalidPipeException var8) {
  1403.          this.revalidateAll();
  1404.  
  1405.          try {
  1406.             this.drawpipe.drawOval(this, var1, var2, var3, var4);
  1407.          } catch (InvalidPipeException var7) {
  1408.          }
  1409.       }
  1410.  
  1411.    }
  1412.  
  1413.    public void fillOval(int var1, int var2, int var3, int var4) {
  1414.       try {
  1415.          this.fillpipe.fillOval(this, var1, var2, var3, var4);
  1416.       } catch (InvalidPipeException var8) {
  1417.          this.revalidateAll();
  1418.  
  1419.          try {
  1420.             this.fillpipe.fillOval(this, var1, var2, var3, var4);
  1421.          } catch (InvalidPipeException var7) {
  1422.          }
  1423.       }
  1424.  
  1425.    }
  1426.  
  1427.    public void drawArc(int var1, int var2, int var3, int var4, int var5, int var6) {
  1428.       try {
  1429.          this.drawpipe.drawArc(this, var1, var2, var3, var4, var5, var6);
  1430.       } catch (InvalidPipeException var10) {
  1431.          this.revalidateAll();
  1432.  
  1433.          try {
  1434.             this.drawpipe.drawArc(this, var1, var2, var3, var4, var5, var6);
  1435.          } catch (InvalidPipeException var9) {
  1436.          }
  1437.       }
  1438.  
  1439.    }
  1440.  
  1441.    public void fillArc(int var1, int var2, int var3, int var4, int var5, int var6) {
  1442.       try {
  1443.          this.fillpipe.fillArc(this, var1, var2, var3, var4, var5, var6);
  1444.       } catch (InvalidPipeException var10) {
  1445.          this.revalidateAll();
  1446.  
  1447.          try {
  1448.             this.fillpipe.fillArc(this, var1, var2, var3, var4, var5, var6);
  1449.          } catch (InvalidPipeException var9) {
  1450.          }
  1451.       }
  1452.  
  1453.    }
  1454.  
  1455.    public void drawPolyline(int[] var1, int[] var2, int var3) {
  1456.       try {
  1457.          this.drawpipe.drawPolyline(this, var1, var2, var3);
  1458.       } catch (InvalidPipeException var7) {
  1459.          this.revalidateAll();
  1460.  
  1461.          try {
  1462.             this.drawpipe.drawPolyline(this, var1, var2, var3);
  1463.          } catch (InvalidPipeException var6) {
  1464.          }
  1465.       }
  1466.  
  1467.    }
  1468.  
  1469.    public void drawPolygon(int[] var1, int[] var2, int var3) {
  1470.       try {
  1471.          this.drawpipe.drawPolygon(this, var1, var2, var3);
  1472.       } catch (InvalidPipeException var7) {
  1473.          this.revalidateAll();
  1474.  
  1475.          try {
  1476.             this.drawpipe.drawPolygon(this, var1, var2, var3);
  1477.          } catch (InvalidPipeException var6) {
  1478.          }
  1479.       }
  1480.  
  1481.    }
  1482.  
  1483.    public void fillPolygon(int[] var1, int[] var2, int var3) {
  1484.       try {
  1485.          this.fillpipe.fillPolygon(this, var1, var2, var3);
  1486.       } catch (InvalidPipeException var7) {
  1487.          this.revalidateAll();
  1488.  
  1489.          try {
  1490.             this.fillpipe.fillPolygon(this, var1, var2, var3);
  1491.          } catch (InvalidPipeException var6) {
  1492.          }
  1493.       }
  1494.  
  1495.    }
  1496.  
  1497.    public void drawRect(int var1, int var2, int var3, int var4) {
  1498.       try {
  1499.          this.drawpipe.drawRect(this, var1, var2, var3, var4);
  1500.       } catch (InvalidPipeException var8) {
  1501.          this.revalidateAll();
  1502.  
  1503.          try {
  1504.             this.drawpipe.drawRect(this, var1, var2, var3, var4);
  1505.          } catch (InvalidPipeException var7) {
  1506.          }
  1507.       }
  1508.  
  1509.    }
  1510.  
  1511.    public void fillRect(int var1, int var2, int var3, int var4) {
  1512.       try {
  1513.          this.fillpipe.fillRect(this, var1, var2, var3, var4);
  1514.       } catch (InvalidPipeException var8) {
  1515.          this.revalidateAll();
  1516.  
  1517.          try {
  1518.             this.fillpipe.fillRect(this, var1, var2, var3, var4);
  1519.          } catch (InvalidPipeException var7) {
  1520.          }
  1521.       }
  1522.  
  1523.    }
  1524.  
  1525.    private void revalidateAll() {
  1526.       try {
  1527.          this.surfaceData = this.surfaceData.getReplacement();
  1528.          if (this.surfaceData == null) {
  1529.             this.surfaceData = NullSurfaceData.theInstance;
  1530.          }
  1531.  
  1532.          this.setDevClip(this.surfaceData.getBounds());
  1533.          if (this.paintState <= 1) {
  1534.             this.validateColor();
  1535.          }
  1536.  
  1537.          if (this.composite instanceof XORComposite) {
  1538.             Color var1 = ((XORComposite)this.composite).getXorColor();
  1539.             this.setComposite(new XORComposite(var1, this.surfaceData));
  1540.          }
  1541.  
  1542.          this.validatePipe();
  1543.       } finally {
  1544.          ;
  1545.       }
  1546.    }
  1547.  
  1548.    public void clearRect(int var1, int var2, int var3, int var4) {
  1549.       Composite var5 = this.composite;
  1550.       Paint var6 = this.paint;
  1551.       this.setComposite(AlphaComposite.Src);
  1552.       this.setColor(this.getBackground());
  1553.       this.validatePipe();
  1554.       this.fillRect(var1, var2, var3, var4);
  1555.       this.setPaint(var6);
  1556.       this.setComposite(var5);
  1557.    }
  1558.  
  1559.    public void draw(Shape var1) {
  1560.       try {
  1561.          this.shapepipe.draw(this, var1);
  1562.       } catch (InvalidPipeException var5) {
  1563.          this.revalidateAll();
  1564.  
  1565.          try {
  1566.             this.shapepipe.draw(this, var1);
  1567.          } catch (InvalidPipeException var4) {
  1568.          }
  1569.       }
  1570.  
  1571.    }
  1572.  
  1573.    public void fill(Shape var1) {
  1574.       try {
  1575.          this.shapepipe.fill(this, var1);
  1576.       } catch (InvalidPipeException var5) {
  1577.          this.revalidateAll();
  1578.  
  1579.          try {
  1580.             this.shapepipe.fill(this, var1);
  1581.          } catch (InvalidPipeException var4) {
  1582.          }
  1583.       }
  1584.  
  1585.    }
  1586.  
  1587.    private static boolean isIntegerTranslation(AffineTransform var0) {
  1588.       if (var0.isIdentity()) {
  1589.          return true;
  1590.       } else if (var0.getType() != 1) {
  1591.          return false;
  1592.       } else {
  1593.          double var1 = var0.getTranslateX();
  1594.          double var3 = var0.getTranslateY();
  1595.          return var1 == (double)((int)var1) && var3 == (double)((int)var3);
  1596.       }
  1597.    }
  1598.  
  1599.    private static int getTileIndex(int var0, int var1, int var2) {
  1600.       var0 -= var1;
  1601.       if (var0 < 0) {
  1602.          var0 += 1 - var2;
  1603.       }
  1604.  
  1605.       return var0 / var2;
  1606.    }
  1607.  
  1608.    private static Rectangle getImageRegion(RenderedImage var0, Region var1, AffineTransform var2, AffineTransform var3, int var4, int var5) {
  1609.       Rectangle var6 = new Rectangle(var0.getMinX(), var0.getMinY(), var0.getWidth(), var0.getHeight());
  1610.       Object var7 = null;
  1611.  
  1612.       try {
  1613.          double[] var8 = new double[8];
  1614.          var8[0] = var8[2] = (double)var1.getLoX();
  1615.          var8[4] = var8[6] = (double)var1.getHiX();
  1616.          var8[1] = var8[5] = (double)var1.getLoY();
  1617.          var8[3] = var8[7] = (double)var1.getHiY();
  1618.          var2.inverseTransform(var8, 0, var8, 0, 4);
  1619.          var3.inverseTransform(var8, 0, var8, 0, 4);
  1620.          double var11;
  1621.          double var9 = var11 = var8[0];
  1622.          double var15;
  1623.          double var13 = var15 = var8[1];
  1624.          int var17 = 2;
  1625.  
  1626.          while(var17 < 8) {
  1627.             double var18 = var8[var17++];
  1628.             if (var18 < var9) {
  1629.                var9 = var18;
  1630.             } else if (var18 > var11) {
  1631.                var11 = var18;
  1632.             }
  1633.  
  1634.             var18 = var8[var17++];
  1635.             if (var18 < var13) {
  1636.                var13 = var18;
  1637.             } else if (var18 > var15) {
  1638.                var15 = var18;
  1639.             }
  1640.          }
  1641.  
  1642.          var17 = (int)var9 - var4;
  1643.          int var27 = (int)(var11 - var9 + (double)(2 * var4));
  1644.          int var19 = (int)var13 - var5;
  1645.          int var20 = (int)(var15 - var13 + (double)(2 * var5));
  1646.          Rectangle var21 = new Rectangle(var17, var19, var27, var20);
  1647.          var23 = var21.intersection(var6);
  1648.       } catch (NoninvertibleTransformException var22) {
  1649.          var23 = var6;
  1650.       }
  1651.  
  1652.       return var23;
  1653.    }
  1654.  
  1655.    public void drawRenderedImage(RenderedImage var1, AffineTransform var2) {
  1656.       if (var1 != null) {
  1657.          if (var1 instanceof BufferedImage) {
  1658.             BufferedImage var17 = (BufferedImage)var1;
  1659.             this.drawImage(var17, var2, (ImageObserver)null);
  1660.          } else {
  1661.             boolean var3 = this.transformState <= 1 && isIntegerTranslation(var2);
  1662.             int var4 = var3 ? 0 : 3;
  1663.             Rectangle var5 = getImageRegion(var1, this.getCompClip(), this.transform, var2, var4, var4);
  1664.             if (var5.width > 0 && var5.height > 0) {
  1665.                if (var3) {
  1666.                   this.drawTranslatedRenderedImage(var1, var5, (int)var2.getTranslateX(), (int)var2.getTranslateY());
  1667.                } else {
  1668.                   Raster var6 = var1.getData(var5);
  1669.                   WritableRaster var7 = Raster.createWritableRaster(var6.getSampleModel(), var6.getDataBuffer(), (Point)null);
  1670.                   int var8 = var6.getMinX();
  1671.                   int var9 = var6.getMinY();
  1672.                   int var10 = var6.getWidth();
  1673.                   int var11 = var6.getHeight();
  1674.                   int var12 = var8 - var6.getSampleModelTranslateX();
  1675.                   int var13 = var9 - var6.getSampleModelTranslateY();
  1676.                   if (var12 != 0 || var13 != 0 || var10 != var7.getWidth() || var11 != var7.getHeight()) {
  1677.                      var7 = var7.createWritableChild(var12, var13, var10, var11, 0, 0, (int[])null);
  1678.                   }
  1679.  
  1680.                   AffineTransform var14 = (AffineTransform)var2.clone();
  1681.                   var14.translate((double)var8, (double)var9);
  1682.                   ColorModel var15 = var1.getColorModel();
  1683.                   BufferedImage var16 = new BufferedImage(var15, var7, var15.isAlphaPremultiplied(), (Hashtable)null);
  1684.                   this.drawImage(var16, var14, (ImageObserver)null);
  1685.                }
  1686.             }
  1687.          }
  1688.       }
  1689.    }
  1690.  
  1691.    private boolean clipTo(Rectangle var1, Rectangle var2) {
  1692.       int var3 = Math.max(var1.x, var2.x);
  1693.       int var4 = Math.min(var1.x + var1.width, var2.x + var2.width);
  1694.       int var5 = Math.max(var1.y, var2.y);
  1695.       int var6 = Math.min(var1.y + var1.height, var2.y + var2.height);
  1696.       if (var4 - var3 >= 0 && var6 - var5 >= 0) {
  1697.          var1.x = var3;
  1698.          var1.y = var5;
  1699.          var1.width = var4 - var3;
  1700.          var1.height = var6 - var5;
  1701.          return true;
  1702.       } else {
  1703.          var1.width = -1;
  1704.          var1.height = -1;
  1705.          return false;
  1706.       }
  1707.    }
  1708.  
  1709.    private void drawTranslatedRenderedImage(RenderedImage var1, Rectangle var2, int var3, int var4) {
  1710.       int var5 = var1.getTileGridXOffset();
  1711.       int var6 = var1.getTileGridYOffset();
  1712.       int var7 = var1.getTileWidth();
  1713.       int var8 = var1.getTileHeight();
  1714.       int var9 = getTileIndex(var2.x, var5, var7);
  1715.       int var10 = getTileIndex(var2.y, var6, var8);
  1716.       int var11 = getTileIndex(var2.x + var2.width - 1, var5, var7);
  1717.       int var12 = getTileIndex(var2.y + var2.height - 1, var6, var8);
  1718.       ColorModel var13 = var1.getColorModel();
  1719.       Rectangle var14 = new Rectangle();
  1720.  
  1721.       for(int var15 = var10; var15 <= var12; ++var15) {
  1722.          for(int var16 = var9; var16 <= var11; ++var16) {
  1723.             Raster var17 = var1.getTile(var16, var15);
  1724.             var14.x = var16 * var7 + var5;
  1725.             var14.y = var15 * var8 + var6;
  1726.             var14.width = var7;
  1727.             var14.height = var8;
  1728.             this.clipTo(var14, var2);
  1729.             Object var18 = null;
  1730.             WritableRaster var20;
  1731.             if (var17 instanceof WritableRaster) {
  1732.                var20 = (WritableRaster)var17;
  1733.             } else {
  1734.                var20 = Raster.createWritableRaster(var17.getSampleModel(), var17.getDataBuffer(), (Point)null);
  1735.             }
  1736.  
  1737.             var20 = var20.createWritableChild(var14.x, var14.y, var14.width, var14.height, 0, 0, (int[])null);
  1738.             BufferedImage var19 = new BufferedImage(var13, var20, var13.isAlphaPremultiplied(), (Hashtable)null);
  1739.             this.copyImage(var19, var14.x + var3, var14.y + var4, 0, 0, var14.width, var14.height, (Color)null, (ImageObserver)null);
  1740.          }
  1741.       }
  1742.  
  1743.    }
  1744.  
  1745.    public void drawRenderableImage(RenderableImage var1, AffineTransform var2) {
  1746.       if (var1 != null) {
  1747.          AffineTransform var3 = this.transform;
  1748.          AffineTransform var4 = new AffineTransform(var2);
  1749.          var4.concatenate(var3);
  1750.          RenderContext var6 = new RenderContext(var4);
  1751.  
  1752.          AffineTransform var5;
  1753.          try {
  1754.             var5 = var3.createInverse();
  1755.          } catch (NoninvertibleTransformException var8) {
  1756.             var6 = new RenderContext(var3);
  1757.             var5 = new AffineTransform();
  1758.          }
  1759.  
  1760.          RenderedImage var7 = var1.createRendering(var6);
  1761.          this.drawRenderedImage(var7, var5);
  1762.       }
  1763.    }
  1764.  
  1765.    protected Rectangle transformBounds(Rectangle var1, AffineTransform var2) {
  1766.       if (var2.isIdentity()) {
  1767.          return var1;
  1768.       } else {
  1769.          Shape var3 = transformShape(var2, var1);
  1770.          return var3.getBounds();
  1771.       }
  1772.    }
  1773.  
  1774.    public void drawString(String var1, int var2, int var3) {
  1775.       if (var1 == null) {
  1776.          throw new NullPointerException("String is null");
  1777.       } else if (this.font.hasLayoutAttributes()) {
  1778.          (new TextLayout(var1, this.font, this.getFontRenderContext())).draw(this, (float)var2, (float)var3);
  1779.       } else {
  1780.          try {
  1781.             this.textpipe.drawString(this, var1, (double)var2, (double)var3);
  1782.          } catch (InvalidPipeException var7) {
  1783.             this.revalidateAll();
  1784.  
  1785.             try {
  1786.                this.textpipe.drawString(this, var1, (double)var2, (double)var3);
  1787.             } catch (InvalidPipeException var6) {
  1788.             }
  1789.          }
  1790.  
  1791.       }
  1792.    }
  1793.  
  1794.    public void drawString(String var1, float var2, float var3) {
  1795.       if (var1 == null) {
  1796.          throw new NullPointerException("String is null");
  1797.       } else if (this.font.hasLayoutAttributes()) {
  1798.          (new TextLayout(var1, this.font, this.getFontRenderContext())).draw(this, var2, var3);
  1799.       } else {
  1800.          try {
  1801.             this.textpipe.drawString(this, var1, (double)var2, (double)var3);
  1802.          } catch (InvalidPipeException var7) {
  1803.             this.revalidateAll();
  1804.  
  1805.             try {
  1806.                this.textpipe.drawString(this, var1, (double)var2, (double)var3);
  1807.             } catch (InvalidPipeException var6) {
  1808.             }
  1809.          }
  1810.  
  1811.       }
  1812.    }
  1813.  
  1814.    public void drawString(AttributedCharacterIterator var1, int var2, int var3) {
  1815.       if (var1 == null) {
  1816.          throw new NullPointerException("AttributedCharacterIterator is null");
  1817.       } else {
  1818.          TextLayout var4 = new TextLayout(var1, this.getFontRenderContext());
  1819.          var4.draw(this, (float)var2, (float)var3);
  1820.       }
  1821.    }
  1822.  
  1823.    public void drawString(AttributedCharacterIterator var1, float var2, float var3) {
  1824.       if (var1 == null) {
  1825.          throw new NullPointerException("AttributedCharacterIterator is null");
  1826.       } else {
  1827.          TextLayout var4 = new TextLayout(var1, this.getFontRenderContext());
  1828.          var4.draw(this, var2, var3);
  1829.       }
  1830.    }
  1831.  
  1832.    public void drawGlyphVector(GlyphVector var1, float var2, float var3) {
  1833.       if (var1 == null) {
  1834.          throw new NullPointerException("GlyphVector is null");
  1835.       } else {
  1836.          try {
  1837.             this.textpipe.drawGlyphVector(this, var1, var2, var3);
  1838.          } catch (InvalidPipeException var7) {
  1839.             this.revalidateAll();
  1840.  
  1841.             try {
  1842.                this.textpipe.drawGlyphVector(this, var1, var2, var3);
  1843.             } catch (InvalidPipeException var6) {
  1844.             }
  1845.          }
  1846.  
  1847.       }
  1848.    }
  1849.  
  1850.    public void drawChars(char[] var1, int var2, int var3, int var4, int var5) {
  1851.       if (var1 == null) {
  1852.          throw new NullPointerException("char data is null");
  1853.       } else if (var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length) {
  1854.          if (this.font.hasLayoutAttributes()) {
  1855.             (new TextLayout(new String(var1, var2, var3), this.font, this.getFontRenderContext())).draw(this, (float)var4, (float)var5);
  1856.          } else {
  1857.             try {
  1858.                this.textpipe.drawChars(this, var1, var2, var3, var4, var5);
  1859.             } catch (InvalidPipeException var9) {
  1860.                this.revalidateAll();
  1861.  
  1862.                try {
  1863.                   this.textpipe.drawChars(this, var1, var2, var3, var4, var5);
  1864.                } catch (InvalidPipeException var8) {
  1865.                }
  1866.             }
  1867.  
  1868.          }
  1869.       } else {
  1870.          throw new ArrayIndexOutOfBoundsException("bad offset/length");
  1871.       }
  1872.    }
  1873.  
  1874.    public void drawBytes(byte[] var1, int var2, int var3, int var4, int var5) {
  1875.       if (var1 == null) {
  1876.          throw new NullPointerException("byte data is null");
  1877.       } else if (var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length) {
  1878.          char[] var6 = new char[var3];
  1879.  
  1880.          for(int var7 = var3; var7-- > 0; var6[var7] = (char)(var1[var7 + var2] & 255)) {
  1881.          }
  1882.  
  1883.          if (this.font.hasLayoutAttributes()) {
  1884.             (new TextLayout(new String(var6), this.font, this.getFontRenderContext())).draw(this, (float)var4, (float)var5);
  1885.          } else {
  1886.             try {
  1887.                this.textpipe.drawChars(this, var6, 0, var3, var4, var5);
  1888.             } catch (InvalidPipeException var10) {
  1889.                this.revalidateAll();
  1890.  
  1891.                try {
  1892.                   this.textpipe.drawChars(this, var6, 0, var3, var4, var5);
  1893.                } catch (InvalidPipeException var9) {
  1894.                }
  1895.             }
  1896.  
  1897.          }
  1898.       } else {
  1899.          throw new ArrayIndexOutOfBoundsException("bad offset/length");
  1900.       }
  1901.    }
  1902.  
  1903.    public boolean drawImage(Image var1, int var2, int var3, int var4, int var5, ImageObserver var6) {
  1904.       return this.drawImage(var1, var2, var3, var4, var5, (Color)null, var6);
  1905.    }
  1906.  
  1907.    public boolean copyImage(Image var1, int var2, int var3, int var4, int var5, int var6, int var7, Color var8, ImageObserver var9) {
  1908.       try {
  1909.          return this.imagepipe.copyImage(this, var1, var2, var3, var4, var5, var6, var7, var8, var9);
  1910.       } catch (InvalidPipeException var13) {
  1911.          this.revalidateAll();
  1912.  
  1913.          try {
  1914.             return this.imagepipe.copyImage(this, var1, var2, var3, var4, var5, var6, var7, var8, var9);
  1915.          } catch (InvalidPipeException var12) {
  1916.             return false;
  1917.          }
  1918.       }
  1919.    }
  1920.  
  1921.    public boolean drawImage(Image var1, int var2, int var3, int var4, int var5, Color var6, ImageObserver var7) {
  1922.       if (var1 == null) {
  1923.          return true;
  1924.       } else if (var4 != 0 && var5 != 0) {
  1925.          if (var4 == var1.getWidth((ImageObserver)null) && var5 == var1.getHeight((ImageObserver)null)) {
  1926.             return this.copyImage(var1, var2, var3, 0, 0, var4, var5, var6, var7);
  1927.          } else {
  1928.             try {
  1929.                return this.imagepipe.scaleImage(this, var1, var2, var3, var4, var5, var6, var7);
  1930.             } catch (InvalidPipeException var11) {
  1931.                this.revalidateAll();
  1932.  
  1933.                try {
  1934.                   return this.imagepipe.scaleImage(this, var1, var2, var3, var4, var5, var6, var7);
  1935.                } catch (InvalidPipeException var10) {
  1936.                   return false;
  1937.                }
  1938.             }
  1939.          }
  1940.       } else {
  1941.          return true;
  1942.       }
  1943.    }
  1944.  
  1945.    public boolean drawImage(Image var1, int var2, int var3, ImageObserver var4) {
  1946.       return this.drawImage(var1, var2, var3, (Color)null, var4);
  1947.    }
  1948.  
  1949.    public boolean drawImage(Image var1, int var2, int var3, Color var4, ImageObserver var5) {
  1950.       if (var1 == null) {
  1951.          return true;
  1952.       } else {
  1953.          try {
  1954.             return this.imagepipe.copyImage(this, var1, var2, var3, var4, var5);
  1955.          } catch (InvalidPipeException var9) {
  1956.             this.revalidateAll();
  1957.  
  1958.             try {
  1959.                return this.imagepipe.copyImage(this, var1, var2, var3, var4, var5);
  1960.             } catch (InvalidPipeException var8) {
  1961.                return false;
  1962.             }
  1963.          }
  1964.       }
  1965.    }
  1966.  
  1967.    public boolean drawImage(Image var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, ImageObserver var10) {
  1968.       return this.drawImage(var1, var2, var3, var4, var5, var6, var7, var8, var9, (Color)null, var10);
  1969.    }
  1970.  
  1971.    public boolean drawImage(Image var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, Color var10, ImageObserver var11) {
  1972.       if (var1 == null) {
  1973.          return true;
  1974.       } else if (var2 != var4 && var3 != var5 && var6 != var8 && var7 != var9) {
  1975.          if (var8 - var6 == var4 - var2 && var9 - var7 == var5 - var3) {
  1976.             int var12;
  1977.             int var14;
  1978.             int var16;
  1979.             if (var8 > var6) {
  1980.                var16 = var8 - var6;
  1981.                var12 = var6;
  1982.                var14 = var2;
  1983.             } else {
  1984.                var16 = var6 - var8;
  1985.                var12 = var8;
  1986.                var14 = var4;
  1987.             }
  1988.  
  1989.             int var13;
  1990.             int var15;
  1991.             int var17;
  1992.             if (var9 > var7) {
  1993.                var17 = var9 - var7;
  1994.                var13 = var7;
  1995.                var15 = var3;
  1996.             } else {
  1997.                var17 = var7 - var9;
  1998.                var13 = var9;
  1999.                var15 = var5;
  2000.             }
  2001.  
  2002.             return this.copyImage(var1, var14, var15, var12, var13, var16, var17, var10, var11);
  2003.          } else {
  2004.             try {
  2005.                return this.imagepipe.scaleImage(this, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11);
  2006.             } catch (InvalidPipeException var19) {
  2007.                this.revalidateAll();
  2008.  
  2009.                try {
  2010.                   return this.imagepipe.scaleImage(this, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11);
  2011.                } catch (InvalidPipeException var18) {
  2012.                   return false;
  2013.                }
  2014.             }
  2015.          }
  2016.       } else {
  2017.          return true;
  2018.       }
  2019.    }
  2020.  
  2021.    public boolean drawImage(Image var1, AffineTransform var2, ImageObserver var3) {
  2022.       if (var1 == null) {
  2023.          return true;
  2024.       } else if (var2 != null && !var2.isIdentity()) {
  2025.          try {
  2026.             return this.imagepipe.transformImage(this, var1, var2, var3);
  2027.          } catch (InvalidPipeException var7) {
  2028.             this.revalidateAll();
  2029.  
  2030.             try {
  2031.                return this.imagepipe.transformImage(this, var1, var2, var3);
  2032.             } catch (InvalidPipeException var6) {
  2033.                return false;
  2034.             }
  2035.          }
  2036.       } else {
  2037.          return this.drawImage(var1, 0, 0, (Color)null, var3);
  2038.       }
  2039.    }
  2040.  
  2041.    public void drawImage(BufferedImage var1, BufferedImageOp var2, int var3, int var4) {
  2042.       if (var1 != null) {
  2043.          try {
  2044.             this.imagepipe.transformImage(this, var1, var2, var3, var4);
  2045.          } catch (InvalidPipeException var8) {
  2046.             this.revalidateAll();
  2047.  
  2048.             try {
  2049.                this.imagepipe.transformImage(this, var1, var2, var3, var4);
  2050.             } catch (InvalidPipeException var7) {
  2051.             }
  2052.          }
  2053.  
  2054.       }
  2055.    }
  2056.  
  2057.    public FontRenderContext getFontRenderContext() {
  2058.       if (this.cachedFRC == null) {
  2059.          int var1 = this.textAntialiasHint;
  2060.          if (var1 == 0 && this.antialiasHint == 2) {
  2061.             var1 = 2;
  2062.          }
  2063.  
  2064.          this.cachedFRC = new FontRenderContext(this.transformState < 3 ? null : this.transform, Value.get(2, var1), Value.get(3, this.fractionalMetricsHint));
  2065.       }
  2066.  
  2067.       return this.cachedFRC;
  2068.    }
  2069.  
  2070.    public void dispose() {
  2071.       this.surfaceData = NullSurfaceData.theInstance;
  2072.       this.invalidatePipe();
  2073.    }
  2074.  
  2075.    public void finalize() {
  2076.    }
  2077.  
  2078.    public Object getDestination() {
  2079.       return this.surfaceData.getDestination();
  2080.    }
  2081.  
  2082.    static {
  2083.       defaultComposite = AlphaComposite.SrcOver;
  2084.       defaultFont = new Font("Dialog", 0, 12);
  2085.       lcdTextContrastDefaultValue = 140;
  2086.       if (PerformanceLogger.loggingEnabled()) {
  2087.          PerformanceLogger.setTime("SunGraphics2D static initialization");
  2088.       }
  2089.  
  2090.       invalidpipe = new ValidatePipe();
  2091.       IDENT_MATRIX = new double[]{(double)1.0F, (double)0.0F, (double)0.0F, (double)1.0F};
  2092.       IDENT_ATX = new AffineTransform();
  2093.       textTxArr = new double[17][];
  2094.       textAtArr = new AffineTransform[17];
  2095.  
  2096.       for(int var0 = 8; var0 < 17; ++var0) {
  2097.          textTxArr[var0] = new double[]{(double)var0, (double)0.0F, (double)0.0F, (double)var0};
  2098.          textAtArr[var0] = new AffineTransform(textTxArr[var0]);
  2099.       }
  2100.  
  2101.    }
  2102. }
  2103.