1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2013 Eric Lafortune (eric@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 */
21package proguard.gui.splash;
22
23import java.awt.*;
24import java.awt.RenderingHints.Key;
25import java.awt.font.*;
26import java.awt.geom.AffineTransform;
27import java.awt.image.*;
28import java.awt.image.renderable.RenderableImage;
29import java.text.AttributedCharacterIterator;
30import 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 */
40final 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