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