Home | History | Annotate | Download | only in splash
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2009 Eric Lafortune (eric (at) graphics.cornell.edu)
      6  *
      7  * This program is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by the Free
      9  * Software Foundation; either version 2 of the License, or (at your option)
     10  * any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     15  * more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, write to the Free Software Foundation, Inc.,
     19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20  */
     21 package proguard.gui.splash;
     22 
     23 import java.awt.*;
     24 import java.awt.RenderingHints.Key;
     25 import java.awt.font.*;
     26 import java.awt.geom.AffineTransform;
     27 import java.awt.image.*;
     28 import java.awt.image.renderable.RenderableImage;
     29 import java.text.AttributedCharacterIterator;
     30 import java.util.Map;
     31 
     32 /**
     33  * This Graphics2D allows to fix some basic settings (Color, Font, Paint, Stroke,
     34  * XORMode) of a delegate Graphics2D, overriding any subsequent attempts to
     35  * change those settings.
     36  *
     37  * @author Eric Lafortune
     38  * @noinspection deprecation
     39  */
     40 final class OverrideGraphics2D extends Graphics2D
     41 {
     42     private final Graphics2D graphics;
     43 
     44     private Color  overrideColor;
     45     private Font   overrideFont;
     46     private Paint  overridePaint;
     47     private Stroke overrideStroke;
     48     private Color  overrideXORMode;
     49 
     50     private Color  color;
     51     private Font   font;
     52     private Paint  paint;
     53     private Stroke stroke;
     54 
     55 
     56     /**
     57      * Creates a new OverrideGraphics2D.
     58      * @param graphics the delegate Graphics2D.
     59      */
     60     public OverrideGraphics2D(Graphics2D graphics)
     61     {
     62         this.graphics = graphics;
     63         this.color    = graphics.getColor();
     64         this.font     = graphics.getFont();
     65         this.paint    = graphics.getPaint();
     66         this.stroke   = graphics.getStroke();
     67     }
     68 
     69 
     70     /**
     71      * Fixes the Color of the Graphics2D.
     72      *
     73      * @param color the fixed Color, or <code>null</code> to undo the fixing.
     74      */
     75     public void setOverrideColor(Color color)
     76     {
     77         this.overrideColor = color;
     78         graphics.setColor(color != null ? color : this.color);
     79     }
     80 
     81     /**
     82      * Fixes the Font of the Graphics2D.
     83      *
     84      * @param font the fixed Font, or <code>null</code> to undo the fixing.
     85      */
     86     public void setOverrideFont(Font font)
     87     {
     88         this.overrideFont = font;
     89         graphics.setFont(font != null ? font : this.font);
     90     }
     91 
     92     /**
     93      * Fixes the Paint of the Graphics2D.
     94      *
     95      * @param paint the fixed Paint, or <code>null</code> to undo the fixing.
     96      */
     97     public void setOverridePaint(Paint paint)
     98     {
     99         this.overridePaint = paint;
    100         graphics.setPaint(paint != null ? paint : this.paint);
    101     }
    102 
    103     /**
    104      * Fixes the Stroke of the Graphics2D.
    105      *
    106      * @param stroke the fixed Stroke, or <code>null</code> to undo the fixing.
    107      */
    108     public void setOverrideStroke(Stroke stroke)
    109     {
    110         this.overrideStroke = stroke;
    111         graphics.setStroke(stroke != null ? stroke : this.stroke);
    112     }
    113 
    114     /**
    115      * Fixes the XORMode of the Graphics2D.
    116      *
    117      * @param color the fixed XORMode Color, or <code>null</code> to undo the fixing.
    118      */
    119     public void setOverrideXORMode(Color color)
    120     {
    121         this.overrideXORMode = color;
    122         if (color != null)
    123         {
    124             graphics.setXORMode(color);
    125         }
    126         else
    127         {
    128             graphics.setPaintMode();
    129         }
    130     }
    131 
    132 
    133     // Implementations for Graphics2D.
    134 
    135     public void setColor(Color color)
    136     {
    137         this.color = color;
    138         if (overrideColor == null)
    139         {
    140             graphics.setColor(color);
    141         }
    142     }
    143 
    144     public void setFont(Font font)
    145     {
    146         this.font = font;
    147         if (overrideFont == null)
    148         {
    149             graphics.setFont(font);
    150         }
    151     }
    152 
    153     public void setPaint(Paint paint)
    154     {
    155         this.paint = paint;
    156         if (overridePaint == null)
    157         {
    158             graphics.setPaint(paint);
    159         }
    160     }
    161 
    162     public void setStroke(Stroke stroke)
    163     {
    164         this.stroke = stroke;
    165         if (overrideStroke == null)
    166         {
    167             graphics.setStroke(stroke);
    168         }
    169     }
    170 
    171     public void setXORMode(Color color)
    172     {
    173         if (overrideXORMode == null)
    174         {
    175             graphics.setXORMode(color);
    176         }
    177     }
    178 
    179     public void setPaintMode()
    180     {
    181         if (overrideXORMode == null)
    182         {
    183             graphics.setPaintMode();
    184         }
    185     }
    186 
    187 
    188     public Color getColor()
    189     {
    190         return overrideColor != null ? color : graphics.getColor();
    191     }
    192 
    193     public Font getFont()
    194     {
    195         return overrideFont != null ? font : graphics.getFont();
    196     }
    197 
    198     public Paint getPaint()
    199     {
    200         return overridePaint != null ? paint : graphics.getPaint();
    201     }
    202 
    203     public Stroke getStroke()
    204     {
    205         return overrideStroke != null ? stroke : graphics.getStroke();
    206     }
    207 
    208 
    209     public Graphics create()
    210     {
    211         OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics.create());
    212         g.setOverrideColor(overrideColor);
    213         g.setOverrideFont(overrideFont);
    214         g.setOverridePaint(overridePaint);
    215         g.setOverrideStroke(overrideStroke);
    216 
    217         return g;
    218     }
    219 
    220     public Graphics create(int x, int y, int width, int height)
    221     {
    222         OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics.create(x, y, width, height));
    223         g.setOverrideColor(overrideColor);
    224         g.setOverrideFont(overrideFont);
    225         g.setOverridePaint(overridePaint);
    226         g.setOverrideStroke(overrideStroke);
    227 
    228         return g;
    229     }
    230 
    231 
    232     // Delegation for Graphics2D
    233 
    234     public void addRenderingHints(Map hints)
    235     {
    236         graphics.addRenderingHints(hints);
    237     }
    238 
    239     public void clearRect(int x, int y, int width, int height)
    240     {
    241         graphics.clearRect(x, y, width, height);
    242     }
    243 
    244     public void clip(Shape s)
    245     {
    246         graphics.clip(s);
    247     }
    248 
    249     public void clipRect(int x, int y, int width, int height)
    250     {
    251         graphics.clipRect(x, y, width, height);
    252     }
    253 
    254     public void copyArea(int x, int y, int width, int height, int dx, int dy)
    255     {
    256         graphics.copyArea(x, y, width, height, dx, dy);
    257     }
    258 
    259     public void dispose()
    260     {
    261         graphics.dispose();
    262     }
    263 
    264     public void draw(Shape s)
    265     {
    266         graphics.draw(s);
    267     }
    268 
    269     public void draw3DRect(int x, int y, int width, int height, boolean raised)
    270     {
    271         graphics.draw3DRect(x, y, width, height, raised);
    272     }
    273 
    274     public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
    275     {
    276         graphics.drawArc(x, y, width, height, startAngle, arcAngle);
    277     }
    278 
    279     public void drawBytes(byte[] data, int offset, int length, int x, int y)
    280     {
    281         graphics.drawBytes(data, offset, length, x, y);
    282     }
    283 
    284     public void drawChars(char[] data, int offset, int length, int x, int y)
    285     {
    286         graphics.drawChars(data, offset, length, x, y);
    287     }
    288 
    289     public void drawGlyphVector(GlyphVector g, float x, float y)
    290     {
    291         graphics.drawGlyphVector(g, x, y);
    292     }
    293 
    294     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
    295     {
    296         return graphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer);
    297     }
    298 
    299     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
    300     {
    301         return graphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer);
    302     }
    303 
    304     public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
    305     {
    306         return graphics.drawImage(img, x, y, width, height, bgcolor, observer);
    307     }
    308 
    309     public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
    310     {
    311         return graphics.drawImage(img, x, y, width, height, observer);
    312     }
    313 
    314     public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
    315     {
    316         return graphics.drawImage(img, x, y, bgcolor, observer);
    317     }
    318 
    319     public boolean drawImage(Image img, int x, int y, ImageObserver observer)
    320     {
    321         return graphics.drawImage(img, x, y, observer);
    322     }
    323 
    324     public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
    325     {
    326         return graphics.drawImage(img, xform, obs);
    327     }
    328 
    329     public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
    330     {
    331         graphics.drawImage(img, op, x, y);
    332     }
    333 
    334     public void drawLine(int x1, int y1, int x2, int y2)
    335     {
    336         graphics.drawLine(x1, y1, x2, y2);
    337     }
    338 
    339     public void drawOval(int x, int y, int width, int height)
    340     {
    341         graphics.drawOval(x, y, width, height);
    342     }
    343 
    344     public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
    345     {
    346         graphics.drawPolygon(xPoints, yPoints, nPoints);
    347     }
    348 
    349     public void drawPolygon(Polygon p)
    350     {
    351         graphics.drawPolygon(p);
    352     }
    353 
    354     public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
    355     {
    356         graphics.drawPolyline(xPoints, yPoints, nPoints);
    357     }
    358 
    359     public void drawRect(int x, int y, int width, int height)
    360     {
    361         graphics.drawRect(x, y, width, height);
    362     }
    363 
    364     public void drawRenderableImage(RenderableImage img, AffineTransform xform)
    365     {
    366         graphics.drawRenderableImage(img, xform);
    367     }
    368 
    369     public void drawRenderedImage(RenderedImage img, AffineTransform xform)
    370     {
    371         graphics.drawRenderedImage(img, xform);
    372     }
    373 
    374     public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
    375     {
    376         graphics.drawRoundRect(x, y, width, height, arcWidth, arcHeight);
    377     }
    378 
    379     public void drawString(String s, float x, float y)
    380     {
    381         graphics.drawString(s, x, y);
    382     }
    383 
    384     public void drawString(String str, int x, int y)
    385     {
    386         graphics.drawString(str, x, y);
    387     }
    388 
    389     public void drawString(AttributedCharacterIterator iterator, float x, float y)
    390     {
    391         graphics.drawString(iterator, x, y);
    392     }
    393 
    394     public void drawString(AttributedCharacterIterator iterator, int x, int y)
    395     {
    396         graphics.drawString(iterator, x, y);
    397     }
    398 
    399     public boolean equals(Object obj)
    400     {
    401         return graphics.equals(obj);
    402     }
    403 
    404     public void fill(Shape s)
    405     {
    406         graphics.fill(s);
    407     }
    408 
    409     public void fill3DRect(int x, int y, int width, int height, boolean raised)
    410     {
    411         graphics.fill3DRect(x, y, width, height, raised);
    412     }
    413 
    414     public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
    415     {
    416         graphics.fillArc(x, y, width, height, startAngle, arcAngle);
    417     }
    418 
    419     public void fillOval(int x, int y, int width, int height)
    420     {
    421         graphics.fillOval(x, y, width, height);
    422     }
    423 
    424     public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
    425     {
    426         graphics.fillPolygon(xPoints, yPoints, nPoints);
    427     }
    428 
    429     public void fillPolygon(Polygon p)
    430     {
    431         graphics.fillPolygon(p);
    432     }
    433 
    434     public void fillRect(int x, int y, int width, int height)
    435     {
    436         graphics.fillRect(x, y, width, height);
    437     }
    438 
    439     public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
    440     {
    441         graphics.fillRoundRect(x, y, width, height, arcWidth, arcHeight);
    442     }
    443 
    444     public Color getBackground()
    445     {
    446         return graphics.getBackground();
    447     }
    448 
    449     public Shape getClip()
    450     {
    451         return graphics.getClip();
    452     }
    453 
    454     public Rectangle getClipBounds()
    455     {
    456         return graphics.getClipBounds();
    457     }
    458 
    459     public Rectangle getClipBounds(Rectangle r)
    460     {
    461         return graphics.getClipBounds(r);
    462     }
    463 
    464     public Rectangle getClipRect()
    465     {
    466         return graphics.getClipRect();
    467     }
    468 
    469     public Composite getComposite()
    470     {
    471         return graphics.getComposite();
    472     }
    473 
    474     public GraphicsConfiguration getDeviceConfiguration()
    475     {
    476         return graphics.getDeviceConfiguration();
    477     }
    478 
    479     public FontMetrics getFontMetrics()
    480     {
    481         return graphics.getFontMetrics();
    482     }
    483 
    484     public FontMetrics getFontMetrics(Font f)
    485     {
    486         return graphics.getFontMetrics(f);
    487     }
    488 
    489     public FontRenderContext getFontRenderContext()
    490     {
    491         return graphics.getFontRenderContext();
    492     }
    493 
    494     public Object getRenderingHint(Key hintKey)
    495     {
    496         return graphics.getRenderingHint(hintKey);
    497     }
    498 
    499     public RenderingHints getRenderingHints()
    500     {
    501         return graphics.getRenderingHints();
    502     }
    503 
    504     public AffineTransform getTransform()
    505     {
    506         return graphics.getTransform();
    507     }
    508 
    509     public int hashCode()
    510     {
    511         return graphics.hashCode();
    512     }
    513 
    514     public boolean hit(Rectangle rect, Shape s, boolean onStroke)
    515     {
    516         return graphics.hit(rect, s, onStroke);
    517     }
    518 
    519     public boolean hitClip(int x, int y, int width, int height)
    520     {
    521         return graphics.hitClip(x, y, width, height);
    522     }
    523 
    524     public void rotate(double theta)
    525     {
    526         graphics.rotate(theta);
    527     }
    528 
    529     public void rotate(double theta, double x, double y)
    530     {
    531         graphics.rotate(theta, x, y);
    532     }
    533 
    534     public void scale(double sx, double sy)
    535     {
    536         graphics.scale(sx, sy);
    537     }
    538 
    539     public void setBackground(Color color)
    540     {
    541         graphics.setBackground(color);
    542     }
    543 
    544     public void setClip(int x, int y, int width, int height)
    545     {
    546         graphics.setClip(x, y, width, height);
    547     }
    548 
    549     public void setClip(Shape clip)
    550     {
    551         graphics.setClip(clip);
    552     }
    553 
    554     public void setComposite(Composite comp)
    555     {
    556         graphics.setComposite(comp);
    557     }
    558 
    559     public void setRenderingHint(Key hintKey, Object hintValue)
    560     {
    561         graphics.setRenderingHint(hintKey, hintValue);
    562     }
    563 
    564     public void setRenderingHints(Map hints)
    565     {
    566         graphics.setRenderingHints(hints);
    567     }
    568 
    569     public void setTransform(AffineTransform Tx)
    570     {
    571         graphics.setTransform(Tx);
    572     }
    573 
    574     public void shear(double shx, double shy)
    575     {
    576         graphics.shear(shx, shy);
    577     }
    578 
    579     public String toString()
    580     {
    581         return graphics.toString();
    582     }
    583 
    584     public void transform(AffineTransform Tx)
    585     {
    586         graphics.transform(Tx);
    587     }
    588 
    589     public void translate(double tx, double ty)
    590     {
    591         graphics.translate(tx, ty);
    592     }
    593 
    594     public void translate(int x, int y)
    595     {
    596         graphics.translate(x, y);
    597     }
    598 }
    599