Frames | No Frames |
1: /* Graphics.java -- Abstract Java drawing class 2: Copyright (C) 1999, 2000, 2002, 2004, 2005 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package java.awt; 40: 41: import java.awt.image.ImageObserver; 42: import java.text.AttributedCharacterIterator; 43: 44: /** 45: * This is the abstract superclass of classes for drawing to graphics 46: * devices such as the screen or printers. 47: * 48: * @author Aaron M. Renn (arenn@urbanophile.com) 49: * @author Warren Levy (warrenl@cygnus.com) 50: */ 51: public abstract class Graphics 52: { 53: 54: /** 55: * Default constructor for subclasses. 56: */ 57: protected 58: Graphics() 59: { 60: } 61: 62: /** 63: * Returns a copy of this <code>Graphics</code> object. 64: * 65: * @return A copy of this object. 66: */ 67: public abstract Graphics create(); 68: 69: /** 70: * Returns a copy of this <code>Graphics</code> object. The origin point 71: * will be translated to the point (x, y) and the cliping rectangle set 72: * to the intersection of the clipping rectangle in this object and the 73: * rectangle specified by the parameters to this method. 74: * 75: * @param x The new X coordinate of the clipping region rect. 76: * @param y The new Y coordinate of the clipping region rect. 77: * @param width The width of the clipping region intersect rectangle. 78: * @param height The height of the clipping region intersect rectangle. 79: * 80: * @return A copy of this object, modified as specified. 81: */ 82: public Graphics create(int x, int y, int width, int height) 83: { 84: Graphics g = create(); 85: 86: g.translate(x, y); 87: // FIXME: I'm not sure if this will work. Are the old clip rect bounds 88: // translated above? 89: g.clipRect(0, 0, width, height); 90: 91: return(g); 92: } 93: 94: /** 95: * Translates this context so that its new origin point is the point 96: * (x, y). 97: * 98: * @param x The new X coordinate of the origin. 99: * @param y The new Y coordinate of the origin. 100: */ 101: public abstract void translate(int x, int y); 102: 103: /** 104: * Returns the current color for this object. 105: * 106: * @return The color for this object. 107: */ 108: public abstract Color getColor(); 109: 110: /** 111: * Sets the current color for this object. 112: * 113: * @param color The new color. 114: */ 115: public abstract void setColor(Color color); 116: 117: /** 118: * Sets this context into "paint" mode, where the target pixels are 119: * completely overwritten when drawn on. 120: */ 121: public abstract void setPaintMode(); 122: 123: /** 124: * Sets this context info "XOR" mode, where the targe pixles are 125: * XOR-ed when drawn on. 126: * 127: * @param color The color to XOR against. 128: */ 129: public abstract void setXORMode(Color color); 130: 131: /** 132: * Returns the current font for this graphics context. 133: * 134: * @return The current font. 135: */ 136: public abstract Font getFont(); 137: 138: /** 139: * Sets the font for this graphics context to the specified value. 140: * 141: * @param font The new font. 142: */ 143: public abstract void setFont(Font font); 144: 145: /** 146: * Returns the font metrics for the current font. 147: * 148: * @return The font metrics for the current font. 149: */ 150: public FontMetrics getFontMetrics() 151: { 152: return getFontMetrics(getFont()); 153: } 154: 155: /** 156: * Returns the font metrics for the specified font. 157: * 158: * @param font The font to return metrics for. 159: * 160: * @return The requested font metrics. 161: */ 162: public abstract FontMetrics getFontMetrics(Font font); 163: 164: /** 165: * Returns the bounding rectangle of the clipping region for this 166: * graphics context. 167: * 168: * @return The bounding rectangle for the clipping region. 169: */ 170: public abstract Rectangle getClipBounds(); 171: 172: /** 173: * Returns the bounding rectangle of the clipping region for this 174: * graphics context. 175: * 176: * @return The bounding rectangle for the clipping region. 177: * 178: * @deprecated This method is deprecated in favor of 179: * <code>getClipBounds()</code>. 180: */ 181: public Rectangle getClipRect() 182: { 183: return getClipBounds(); 184: } 185: 186: /** 187: * Sets the clipping region to the intersection of the current clipping 188: * region and the rectangle determined by the specified parameters. 189: * 190: * @param x The X coordinate of the upper left corner of the intersect rect. 191: * @param y The Y coordinate of the upper left corner of the intersect rect. 192: * @param width The width of the intersect rect. 193: * @param height The height of the intersect rect. 194: */ 195: public abstract void clipRect(int x, int y, int width, int height); 196: 197: /** 198: * Sets the clipping region to the rectangle determined by the specified 199: * parameters. 200: * 201: * @param x The X coordinate of the upper left corner of the rect. 202: * @param y The Y coordinate of the upper left corner of the rect. 203: * @param width The width of the rect. 204: * @param height The height of the rect. 205: */ 206: public abstract void setClip(int x, int y, int width, int height); 207: 208: /** 209: * Returns the current clipping region as a <code>Shape</code> object. 210: * 211: * @return The clipping region as a <code>Shape</code>. 212: */ 213: public abstract Shape getClip(); 214: 215: /** 216: * Sets the clipping region to the specified <code>Shape</code>. 217: * 218: * @param clip The new clipping region. 219: */ 220: public abstract void setClip(Shape clip); 221: 222: /** 223: * Copies the specified rectangle to the specified offset location. 224: * 225: * @param x The X coordinate of the upper left corner of the copy rect. 226: * @param y The Y coordinate of the upper left corner of the copy rect. 227: * @param width The width of the copy rect. 228: * @param height The height of the copy rect. 229: * @param dx The offset from the X value to start drawing. 230: * @param dy The offset from the Y value to start drawing. 231: */ 232: public abstract void copyArea(int x, int y, int width, int height, int dx, 233: int dy); 234: 235: /** 236: * Draws a line between the two specified points. 237: * 238: * @param x1 The X coordinate of the first point. 239: * @param y1 The Y coordinate of the first point. 240: * @param x2 The X coordinate of the second point. 241: * @param y2 The Y coordinate of the second point. 242: */ 243: public abstract void drawLine(int x1, int y1, int x2, int y2); 244: 245: /** 246: * Fills the area bounded by the specified rectangle. 247: * 248: * @param x The X coordinate of the upper left corner of the fill rect. 249: * @param y The Y coordinate of the upper left corner of the fill rect. 250: * @param width The width of the fill rect. 251: * @param height The height of the fill rect. 252: */ 253: public abstract void fillRect(int x, int y, int width, int height); 254: 255: /** 256: * Draws the outline of the specified rectangle. 257: * 258: * @param x The X coordinate of the upper left corner of the draw rect. 259: * @param y The Y coordinate of the upper left corner of the draw rect. 260: * @param width The width of the draw rect. 261: * @param height The height of the draw rect. 262: */ 263: public void drawRect(int x, int y, int width, int height) 264: { 265: int x1 = x; 266: int y1 = y; 267: int x2 = x + width; 268: int y2 = y + height; 269: drawLine(x1, y1, x2, y1); 270: drawLine(x2, y1, x2, y2); 271: drawLine(x2, y2, x1, y2); 272: drawLine(x1, y2, x1, y1); 273: } 274: 275: /** 276: * Clears the specified rectangle. 277: * 278: * @param x The X coordinate of the upper left corner of the clear rect. 279: * @param y The Y coordinate of the upper left corner of the clear rect. 280: * @param width The width of the clear rect. 281: * @param height The height of the clear rect. 282: */ 283: public abstract void clearRect(int x, int y, int width, int height); 284: 285: /** 286: * Draws the outline of the specified rectangle with rounded cornders. 287: * 288: * @param x The X coordinate of the upper left corner of the draw rect. 289: * @param y The Y coordinate of the upper left corner of the draw rect. 290: * @param width The width of the draw rect. 291: * @param height The height of the draw rect. 292: * @param arcWidth The width of the corner arcs. 293: * @param arcHeight The height of the corner arcs. 294: */ 295: public abstract void drawRoundRect(int x, int y, int width, int height, 296: int arcWidth, int arcHeight); 297: 298: /** 299: * Fills the specified rectangle with rounded cornders. 300: * 301: * @param x The X coordinate of the upper left corner of the fill rect. 302: * @param y The Y coordinate of the upper left corner of the fill rect. 303: * @param width The width of the fill rect. 304: * @param height The height of the fill rect. 305: * @param arcWidth The width of the corner arcs. 306: * @param arcHeight The height of the corner arcs. 307: */ 308: public abstract void fillRoundRect(int x, int y, int width, int height, 309: int arcWidth, int arcHeight); 310: 311: public void draw3DRect(int x, int y, int width, int height, boolean raised) 312: { 313: Color color = getColor(); 314: Color tl = color.brighter(); 315: Color br = color.darker(); 316: 317: if (!raised) 318: { 319: Color tmp = tl; 320: tl = br; 321: br = tmp; 322: } 323: 324: int x1 = x; 325: int y1 = y; 326: int x2 = x + width; 327: int y2 = y + height; 328: 329: setColor(tl); 330: drawLine(x1, y1, x2, y1); 331: drawLine(x1, y2, x1, y1); 332: setColor(br); 333: drawLine(x2, y1, x2, y2); 334: drawLine(x2, y2, x1, y2); 335: setColor(color); 336: } 337: 338: /** 339: * Fills the specified rectangle with a 3D effect 340: * 341: * @param x The X coordinate of the upper left corner of the fill rect. 342: * @param y The Y coordinate of the upper left corner of the fill rect. 343: * @param width The width of the fill rect. 344: * @param height The height of the fill rect. 345: * @param raised <code>true</code> if the rectangle appears raised, 346: * <code>false</code> if it should appear etched. 347: */ 348: public void fill3DRect(int x, int y, int width, int height, boolean raised) 349: { 350: fillRect(x, y, width, height); 351: draw3DRect(x, y, width-1, height-1, raised); 352: } 353: 354: /** 355: * Draws an oval that just fits within the specified rectangle. 356: * 357: * @param x The X coordinate of the upper left corner of the rect. 358: * @param y The Y coordinate of the upper left corner of the rect. 359: * @param width The width of the rect. 360: * @param height The height of the rect. 361: */ 362: public abstract void drawOval(int x, int y, int width, int height); 363: 364: /** 365: * Fills an oval that just fits within the specified rectangle. 366: * 367: * @param x The X coordinate of the upper left corner of the rect. 368: * @param y The Y coordinate of the upper left corner of the rect. 369: * @param width The width of the rect. 370: * @param height The height of the rect. 371: */ 372: public abstract void fillOval(int x, int y, int width, int height); 373: 374: /** 375: * Draws an arc using the specified bounding rectangle and the specified 376: * angle parameter. The arc is centered at the center of the rectangle. 377: * The arc starts at the arcAngle position and extend for arcAngle 378: * degrees. The degree origin is at the 3 o'clock position. 379: * 380: * @param x The X coordinate of the upper left corner of the rect. 381: * @param y The Y coordinate of the upper left corner of the rect. 382: * @param width The width of the rect. 383: * @param height The height of the rect. 384: * @param arcStart The beginning angle of the arc. 385: * @param arcAngle The extent of the arc. 386: */ 387: public abstract void drawArc(int x, int y, int width, int height, 388: int arcStart, int arcAngle); 389: 390: /** 391: * Fills the arc define by the specified bounding rectangle and the specified 392: * angle parameter. The arc is centered at the center of the rectangle. 393: * The arc starts at the arcAngle position and extend for arcAngle 394: * degrees. The degree origin is at the 3 o'clock position. 395: * 396: * @param x The X coordinate of the upper left corner of the rect. 397: * @param y The Y coordinate of the upper left corner of the rect. 398: * @param width The width of the rect. 399: * @param height The height of the rect. 400: * @param arcStart The beginning angle of the arc. 401: * @param arcAngle The extent of the arc. 402: */ 403: public abstract void fillArc(int x, int y, int width, int height, 404: int arcStart, int arcAngle); 405: 406: /** 407: * Draws a series of interconnected lines determined by the arrays 408: * of corresponding x and y coordinates. 409: * 410: * @param xPoints The X coordinate array. 411: * @param yPoints The Y coordinate array. 412: * @param npoints The number of points to draw. 413: */ 414: public abstract void drawPolyline(int xPoints[], int yPoints[], int npoints); 415: 416: /** 417: * Draws a series of interconnected lines determined by the arrays 418: * of corresponding x and y coordinates. The figure is closed if necessary 419: * by connecting the first and last points. 420: * 421: * @param xPoints The X coordinate array. 422: * @param yPoints The Y coordinate array. 423: * @param npoints The number of points to draw. 424: */ 425: public abstract void drawPolygon(int xPoints[], int yPoints[], int npoints); 426: 427: /** 428: * Draws the specified polygon. 429: * 430: * @param polygon The polygon to draw. 431: */ 432: public void drawPolygon(Polygon polygon) 433: { 434: drawPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); 435: } 436: 437: /** 438: * Fills the polygon determined by the arrays 439: * of corresponding x and y coordinates. 440: * 441: * @param xPoints The X coordinate array. 442: * @param yPoints The Y coordinate array. 443: * @param npoints The number of points to draw. 444: */ 445: public abstract void fillPolygon(int xPoints[], int yPoints[], int npoints); 446: 447: /** 448: * Fills the specified polygon 449: * 450: * @param polygon The polygon to fill. 451: */ 452: public void fillPolygon(Polygon polygon) 453: { 454: fillPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); 455: } 456: 457: /** 458: * Draws the specified string starting at the specified point. 459: * 460: * @param string The string to draw. 461: * @param x The X coordinate of the point to draw at. 462: * @param y The Y coordinate of the point to draw at. 463: */ 464: public abstract void drawString(String string, int x, int y); 465: 466: public abstract void drawString (AttributedCharacterIterator ci, int x, 467: int y); 468: 469: /** 470: * Draws the specified characters starting at the specified point. 471: * 472: * @param data The array of characters to draw. 473: * @param offset The offset into the array to start drawing characters from. 474: * @param length The number of characters to draw. 475: * @param x The X coordinate of the point to draw at. 476: * @param y The Y coordinate of the point to draw at. 477: */ 478: public void drawChars(char data[], int offset, int length, int x, int y) 479: { 480: drawString(new String(data, offset, length), x, y); 481: } 482: 483: public void drawBytes(byte[] data, int offset, int length, int x, int y) 484: { 485: String str = new String(data, offset, length); 486: drawString(str, x, y); 487: } 488: 489: /** 490: * Draws all of the image that is available and returns. If the image 491: * is not completely loaded, <code>false</code> is returned and 492: * the specified iamge observer is notified as more data becomes 493: * available. 494: * 495: * @param image The image to draw. 496: * @param x The X coordinate of the point to draw at. 497: * @param y The Y coordinate of the point to draw at. 498: * @param observer The image observer to notify as data becomes available. 499: * 500: * @return <code>true</code> if all the image data is available, 501: * <code>false</code> otherwise. 502: */ 503: public abstract boolean drawImage(Image image, int x, int y, 504: ImageObserver observer); 505: 506: /** 507: * Draws all of the image that is available and returns. The image 508: * is scaled to fit in the specified rectangle. If the image 509: * is not completely loaded, <code>false</code> is returned and 510: * the specified iamge observer is notified as more data becomes 511: * available. 512: * 513: * @param image The image to draw. 514: * @param x The X coordinate of the point to draw at. 515: * @param y The Y coordinate of the point to draw at. 516: * @param width The width of the rectangle to draw in. 517: * @param height The height of the rectangle to draw in. 518: * @param observer The image observer to notify as data becomes available. 519: * 520: * @return <code>true</code> if all the image data is available, 521: * <code>false</code> otherwise. 522: */ 523: public abstract boolean drawImage(Image image, int x, int y, int width, 524: int height, ImageObserver observer); 525: 526: /** 527: * Draws all of the image that is available and returns. If the image 528: * is not completely loaded, <code>false</code> is returned and 529: * the specified iamge observer is notified as more data becomes 530: * available. 531: * 532: * @param image The image to draw. 533: * @param x The X coordinate of the point to draw at. 534: * @param y The Y coordinate of the point to draw at. 535: * @param bgcolor The background color to use for the image. 536: * @param observer The image observer to notify as data becomes available. 537: * 538: * @return <code>true</code> if all the image data is available, 539: * <code>false</code> otherwise. 540: */ 541: public abstract boolean drawImage(Image image, int x, int y, Color bgcolor, 542: ImageObserver observer); 543: 544: /** 545: * Draws all of the image that is available and returns. The image 546: * is scaled to fit in the specified rectangle. If the image 547: * is not completely loaded, <code>false</code> is returned and 548: * the specified iamge observer is notified as more data becomes 549: * available. 550: * 551: * @param image The image to draw. 552: * @param x The X coordinate of the point to draw at. 553: * @param y The Y coordinate of the point to draw at. 554: * @param width The width of the rectangle to draw in. 555: * @param height The height of the rectangle to draw in. 556: * @param bgcolor The background color to use for the image. 557: * @param observer The image observer to notify as data becomes available. 558: * 559: * @return <code>true</code> if all the image data is available, 560: * <code>false</code> otherwise. 561: */ 562: public abstract boolean drawImage(Image image, int x, int y, int width, 563: int height, Color bgcolor, 564: ImageObserver observer); 565: 566: /** 567: * FIXME: Write Javadocs for this when you understand it. 568: */ 569: public abstract boolean drawImage(Image image, int dx1, int dy1, int dx2, 570: int dy2, int sx1, int sy1, int sx2, 571: int sy2, ImageObserver observer); 572: 573: /** 574: * FIXME: Write Javadocs for this when you understand it. 575: */ 576: public abstract boolean drawImage(Image image, int dx1, int dy1, int dx2, 577: int dy2, int sx1, int sy1, int sx2, 578: int sy2, Color bgcolor, 579: ImageObserver observer); 580: 581: /** 582: * Free any resources held by this graphics context immediately instead 583: * of waiting for the object to be garbage collected and finalized. 584: */ 585: public abstract void dispose(); 586: 587: /** 588: * Frees the resources held by this graphics context when it is 589: * garbage collected. 590: */ 591: public void finalize() 592: { 593: dispose(); 594: } 595: 596: /** 597: * Returns a string representation of this object. 598: * 599: * @return A string representation of this object. 600: */ 601: public String toString() 602: { 603: return getClass ().getName () + "[font=" + getFont () + ",color=" 604: + getColor () + "]"; 605: } 606: 607: /** 608: * Returns <code>true</code> if the specified rectangle intersects with the 609: * current clip, <code>false</code> otherwise. 610: * 611: * @param x the X coordinate of the upper left corner of the test rectangle 612: * @param y the Y coordinate of the upper left corner of the test rectangle 613: * @param width the width of the upper left corner of the test rectangle 614: * @param height the height of the upper left corner of the test rectangle 615: * @return <code>true</code> if the specified rectangle intersects with the 616: * current clip, <code>false</code> otherwise 617: */ 618: public boolean hitClip(int x, int y, int width, int height) 619: { 620: Shape clip = getClip(); 621: if (clip == null) 622: return true; 623: return getClip().intersects(x, y, width, height); 624: } 625: 626: public Rectangle getClipBounds(Rectangle r) 627: { 628: Rectangle clipBounds = getClipBounds(); 629: 630: if (r == null) 631: return clipBounds; 632: 633: r.x = clipBounds.x; 634: r.y = clipBounds.y; 635: r.width = clipBounds.width; 636: r.height = clipBounds.height; 637: return r; 638: } 639: }