1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  *             of Java bytecode.
4  *
5  * Copyright (c) 2002-2014 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  */
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      */
OverrideGraphics2D(Graphics2D graphics)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      */
setOverrideColor(Color color)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      */
setOverrideFont(Font font)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      */
setOverridePaint(Paint paint)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      */
setOverrideStroke(Stroke stroke)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      */
setOverrideXORMode(Color color)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 
setColor(Color color)135     public void setColor(Color color)
136     {
137         this.color = color;
138         if (overrideColor == null)
139         {
140             graphics.setColor(color);
141         }
142     }
143 
setFont(Font font)144     public void setFont(Font font)
145     {
146         this.font = font;
147         if (overrideFont == null)
148         {
149             graphics.setFont(font);
150         }
151     }
152 
setPaint(Paint paint)153     public void setPaint(Paint paint)
154     {
155         this.paint = paint;
156         if (overridePaint == null)
157         {
158             graphics.setPaint(paint);
159         }
160     }
161 
setStroke(Stroke stroke)162     public void setStroke(Stroke stroke)
163     {
164         this.stroke = stroke;
165         if (overrideStroke == null)
166         {
167             graphics.setStroke(stroke);
168         }
169     }
170 
setXORMode(Color color)171     public void setXORMode(Color color)
172     {
173         if (overrideXORMode == null)
174         {
175             graphics.setXORMode(color);
176         }
177     }
178 
setPaintMode()179     public void setPaintMode()
180     {
181         if (overrideXORMode == null)
182         {
183             graphics.setPaintMode();
184         }
185     }
186 
187 
getColor()188     public Color getColor()
189     {
190         return overrideColor != null ? color : graphics.getColor();
191     }
192 
getFont()193     public Font getFont()
194     {
195         return overrideFont != null ? font : graphics.getFont();
196     }
197 
getPaint()198     public Paint getPaint()
199     {
200         return overridePaint != null ? paint : graphics.getPaint();
201     }
202 
getStroke()203     public Stroke getStroke()
204     {
205         return overrideStroke != null ? stroke : graphics.getStroke();
206     }
207 
208 
create()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 
create(int x, int y, int width, int height)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 
addRenderingHints(Map hints)234     public void addRenderingHints(Map hints)
235     {
236         graphics.addRenderingHints(hints);
237     }
238 
clearRect(int x, int y, int width, int height)239     public void clearRect(int x, int y, int width, int height)
240     {
241         graphics.clearRect(x, y, width, height);
242     }
243 
clip(Shape s)244     public void clip(Shape s)
245     {
246         graphics.clip(s);
247     }
248 
clipRect(int x, int y, int width, int height)249     public void clipRect(int x, int y, int width, int height)
250     {
251         graphics.clipRect(x, y, width, height);
252     }
253 
copyArea(int x, int y, int width, int height, int dx, int dy)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 
dispose()259     public void dispose()
260     {
261         graphics.dispose();
262     }
263 
draw(Shape s)264     public void draw(Shape s)
265     {
266         graphics.draw(s);
267     }
268 
draw3DRect(int x, int y, int width, int height, boolean raised)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 
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)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 
drawBytes(byte[] data, int offset, int length, int x, int y)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 
drawChars(char[] data, int offset, int length, int x, int y)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 
drawGlyphVector(GlyphVector g, float x, float y)289     public void drawGlyphVector(GlyphVector g, float x, float y)
290     {
291         graphics.drawGlyphVector(g, x, y);
292     }
293 
drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)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 
drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)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 
drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)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 
drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)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 
drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)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 
drawImage(Image img, int x, int y, ImageObserver observer)319     public boolean drawImage(Image img, int x, int y, ImageObserver observer)
320     {
321         return graphics.drawImage(img, x, y, observer);
322     }
323 
drawImage(Image img, AffineTransform xform, ImageObserver obs)324     public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
325     {
326         return graphics.drawImage(img, xform, obs);
327     }
328 
drawImage(BufferedImage img, BufferedImageOp op, int x, int y)329     public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
330     {
331         graphics.drawImage(img, op, x, y);
332     }
333 
drawLine(int x1, int y1, int x2, int y2)334     public void drawLine(int x1, int y1, int x2, int y2)
335     {
336         graphics.drawLine(x1, y1, x2, y2);
337     }
338 
drawOval(int x, int y, int width, int height)339     public void drawOval(int x, int y, int width, int height)
340     {
341         graphics.drawOval(x, y, width, height);
342     }
343 
drawPolygon(int[] xPoints, int[] yPoints, int nPoints)344     public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
345     {
346         graphics.drawPolygon(xPoints, yPoints, nPoints);
347     }
348 
drawPolygon(Polygon p)349     public void drawPolygon(Polygon p)
350     {
351         graphics.drawPolygon(p);
352     }
353 
drawPolyline(int[] xPoints, int[] yPoints, int nPoints)354     public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
355     {
356         graphics.drawPolyline(xPoints, yPoints, nPoints);
357     }
358 
drawRect(int x, int y, int width, int height)359     public void drawRect(int x, int y, int width, int height)
360     {
361         graphics.drawRect(x, y, width, height);
362     }
363 
drawRenderableImage(RenderableImage img, AffineTransform xform)364     public void drawRenderableImage(RenderableImage img, AffineTransform xform)
365     {
366         graphics.drawRenderableImage(img, xform);
367     }
368 
drawRenderedImage(RenderedImage img, AffineTransform xform)369     public void drawRenderedImage(RenderedImage img, AffineTransform xform)
370     {
371         graphics.drawRenderedImage(img, xform);
372     }
373 
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)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 
drawString(String s, float x, float y)379     public void drawString(String s, float x, float y)
380     {
381         graphics.drawString(s, x, y);
382     }
383 
drawString(String str, int x, int y)384     public void drawString(String str, int x, int y)
385     {
386         graphics.drawString(str, x, y);
387     }
388 
drawString(AttributedCharacterIterator iterator, float x, float y)389     public void drawString(AttributedCharacterIterator iterator, float x, float y)
390     {
391         graphics.drawString(iterator, x, y);
392     }
393 
drawString(AttributedCharacterIterator iterator, int x, int y)394     public void drawString(AttributedCharacterIterator iterator, int x, int y)
395     {
396         graphics.drawString(iterator, x, y);
397     }
398 
equals(Object obj)399     public boolean equals(Object obj)
400     {
401         return graphics.equals(obj);
402     }
403 
fill(Shape s)404     public void fill(Shape s)
405     {
406         graphics.fill(s);
407     }
408 
fill3DRect(int x, int y, int width, int height, boolean raised)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 
fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)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 
fillOval(int x, int y, int width, int height)419     public void fillOval(int x, int y, int width, int height)
420     {
421         graphics.fillOval(x, y, width, height);
422     }
423 
fillPolygon(int[] xPoints, int[] yPoints, int nPoints)424     public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
425     {
426         graphics.fillPolygon(xPoints, yPoints, nPoints);
427     }
428 
fillPolygon(Polygon p)429     public void fillPolygon(Polygon p)
430     {
431         graphics.fillPolygon(p);
432     }
433 
fillRect(int x, int y, int width, int height)434     public void fillRect(int x, int y, int width, int height)
435     {
436         graphics.fillRect(x, y, width, height);
437     }
438 
fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)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 
getBackground()444     public Color getBackground()
445     {
446         return graphics.getBackground();
447     }
448 
getClip()449     public Shape getClip()
450     {
451         return graphics.getClip();
452     }
453 
getClipBounds()454     public Rectangle getClipBounds()
455     {
456         return graphics.getClipBounds();
457     }
458 
getClipBounds(Rectangle r)459     public Rectangle getClipBounds(Rectangle r)
460     {
461         return graphics.getClipBounds(r);
462     }
463 
getClipRect()464     public Rectangle getClipRect()
465     {
466         return graphics.getClipRect();
467     }
468 
getComposite()469     public Composite getComposite()
470     {
471         return graphics.getComposite();
472     }
473 
getDeviceConfiguration()474     public GraphicsConfiguration getDeviceConfiguration()
475     {
476         return graphics.getDeviceConfiguration();
477     }
478 
getFontMetrics()479     public FontMetrics getFontMetrics()
480     {
481         return graphics.getFontMetrics();
482     }
483 
getFontMetrics(Font f)484     public FontMetrics getFontMetrics(Font f)
485     {
486         return graphics.getFontMetrics(f);
487     }
488 
getFontRenderContext()489     public FontRenderContext getFontRenderContext()
490     {
491         return graphics.getFontRenderContext();
492     }
493 
getRenderingHint(Key hintKey)494     public Object getRenderingHint(Key hintKey)
495     {
496         return graphics.getRenderingHint(hintKey);
497     }
498 
getRenderingHints()499     public RenderingHints getRenderingHints()
500     {
501         return graphics.getRenderingHints();
502     }
503 
getTransform()504     public AffineTransform getTransform()
505     {
506         return graphics.getTransform();
507     }
508 
hashCode()509     public int hashCode()
510     {
511         return graphics.hashCode();
512     }
513 
hit(Rectangle rect, Shape s, boolean onStroke)514     public boolean hit(Rectangle rect, Shape s, boolean onStroke)
515     {
516         return graphics.hit(rect, s, onStroke);
517     }
518 
hitClip(int x, int y, int width, int height)519     public boolean hitClip(int x, int y, int width, int height)
520     {
521         return graphics.hitClip(x, y, width, height);
522     }
523 
rotate(double theta)524     public void rotate(double theta)
525     {
526         graphics.rotate(theta);
527     }
528 
rotate(double theta, double x, double y)529     public void rotate(double theta, double x, double y)
530     {
531         graphics.rotate(theta, x, y);
532     }
533 
scale(double sx, double sy)534     public void scale(double sx, double sy)
535     {
536         graphics.scale(sx, sy);
537     }
538 
setBackground(Color color)539     public void setBackground(Color color)
540     {
541         graphics.setBackground(color);
542     }
543 
setClip(int x, int y, int width, int height)544     public void setClip(int x, int y, int width, int height)
545     {
546         graphics.setClip(x, y, width, height);
547     }
548 
setClip(Shape clip)549     public void setClip(Shape clip)
550     {
551         graphics.setClip(clip);
552     }
553 
setComposite(Composite comp)554     public void setComposite(Composite comp)
555     {
556         graphics.setComposite(comp);
557     }
558 
setRenderingHint(Key hintKey, Object hintValue)559     public void setRenderingHint(Key hintKey, Object hintValue)
560     {
561         graphics.setRenderingHint(hintKey, hintValue);
562     }
563 
setRenderingHints(Map hints)564     public void setRenderingHints(Map hints)
565     {
566         graphics.setRenderingHints(hints);
567     }
568 
setTransform(AffineTransform Tx)569     public void setTransform(AffineTransform Tx)
570     {
571         graphics.setTransform(Tx);
572     }
573 
shear(double shx, double shy)574     public void shear(double shx, double shy)
575     {
576         graphics.shear(shx, shy);
577     }
578 
toString()579     public String toString()
580     {
581         return graphics.toString();
582     }
583 
transform(AffineTransform Tx)584     public void transform(AffineTransform Tx)
585     {
586         graphics.transform(Tx);
587     }
588 
translate(double tx, double ty)589     public void translate(double tx, double ty)
590     {
591         graphics.translate(tx, ty);
592     }
593 
translate(int x, int y)594     public void translate(int x, int y)
595     {
596         graphics.translate(x, y);
597     }
598 }
599