/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Alexey A. Petrenko * @version $Revision$ */ package java.awt; import java.awt.image.ImageObserver; import java.text.AttributedCharacterIterator; /** * The abstract Graphics class allows applications to draw on a screen or other * rendering target. There are several properties which define rendering * options: origin point, clipping area, color, font. <br> * <br> * The origin point specifies the beginning of the clipping area coordinate * system. All coordinates used in rendering operations are computed with * respect to this point. The clipping area defines the boundaries where * rendering operations can be performed. Rendering operations can't modify * pixels outside of the clipping area. <br> * <br> * The draw and fill methods allow applications to drawing shapes, text, images * with specified font and color options in the specified part of the screen. * * @since Android 1.0 */ public abstract class Graphics { // Constructors /** * Instantiates a new Graphics. This constructor is default for Graphics and * can not be called directly. */ protected Graphics() { } // Public methods /** * Creates a copy of the Graphics object with a new origin and a new * specified clip area. The new clip area is the rectangle defined by the * origin point with coordinates X,Y and the given width and height. The * coordinates of all subsequent rendering operations will be computed with * respect to the new origin and can be performed only within the range of * the clipping area dimensions. * * @param x * the X coordinate of the original point. * @param y * the Y coordinate of the original point. * @param width * the width of clipping area. * @param height * the height of clipping area. * @return the Graphics object with new origin point and clipping area. */ public Graphics create(int x, int y, int width, int height) { Graphics res = create(); res.translate(x, y); res.clipRect(0, 0, width, height); return res; } /** * Draws the highlighted outline of a rectangle. * * @param x * the X coordinate of the rectangle's top left corner. * @param y * the Y coordinate of the rectangle's top left corner. * @param width * the width of rectangle. * @param height * the height of rectangle. * @param raised * a boolean value that determines whether the rectangle is drawn * as raised or indented. */ public void draw3DRect(int x, int y, int width, int height, boolean raised) { // Note: lighter/darker colors should be used to draw 3d rect. // The resulting rect is (width+1)x(height+1). Stroke and paint // attributes of // the Graphics2D should be reset to the default values. // fillRect is used instead of drawLine to bypass stroke // reset/set and rasterization. Color color = getColor(); Color colorUp, colorDown; if (raised) { colorUp = color.brighter(); colorDown = color.darker(); } else { colorUp = color.darker(); colorDown = color.brighter(); } setColor(colorUp); fillRect(x, y, width, 1); fillRect(x, y + 1, 1, height); setColor(colorDown); fillRect(x + width, y, 1, height); fillRect(x + 1, y + height, width, 1); } /** * Draws the text represented by byte array. This method uses the current * font and color for rendering. * * @param bytes * the byte array which contains the text to be drawn. * @param off * the offset within the byte array of the text to be drawn. * @param len * the number of bytes of text to draw. * @param x * the X coordinate where the text is to be drawn. * @param y * the Y coordinate where the text is to be drawn. */ public void drawBytes(byte[] bytes, int off, int len, int x, int y) { drawString(new String(bytes, off, len), x, y); } /** * Draws the text represented by character array. This method uses the * current font and color for rendering. * * @param chars * the character array. * @param off * the offset within the character array of the text to be drawn. * @param len * the number of characters which will be drawn. * @param x * the X coordinate where the text is to be drawn. * @param y * the Y coordinate where the text is to be drawn. */ public void drawChars(char[] chars, int off, int len, int x, int y) { drawString(new String(chars, off, len), x, y); } /** * Draws the outline of a polygon which is defined by Polygon object. * * @param p * the Polygon object. */ public void drawPolygon(Polygon p) { drawPolygon(p.xpoints, p.ypoints, p.npoints); } /** * Draws the rectangle with the specified width and length and top left * corner coordinates. * * @param x * the X coordinate of the rectangle's top left corner. * @param y * the Y coordinate of the rectangle's top left corner. * @param width * the width of the rectangle. * @param height * the height of the rectangle. */ public void drawRect(int x, int y, int width, int height) { int[] xpoints = { x, x, x + width, x + width }; int[] ypoints = { y, y + height, y + height, y }; drawPolygon(xpoints, ypoints, 4); } /** * Fills the highlighted outline of a rectangle. * * @param x * the X coordinate of the rectangle's top left corner. * @param y * the Y coordinate of the rectangle's top left corner. * @param width * the width of the rectangle. * @param height * the height of the rectangle. * @param raised * a boolean value that determines whether the rectangle is drawn * as raised or indented. */ public void fill3DRect(int x, int y, int width, int height, boolean raised) { // Note: lighter/darker colors should be used to draw 3d rect. // The resulting rect is (width)x(height), same as fillRect. // Stroke and paint attributes of the Graphics2D should be reset // to the default values. fillRect is used instead of drawLine to // bypass stroke reset/set and line rasterization. Color color = getColor(); Color colorUp, colorDown; if (raised) { colorUp = color.brighter(); colorDown = color.darker(); setColor(color); } else { colorUp = color.darker(); colorDown = color.brighter(); setColor(colorUp); } width--; height--; fillRect(x + 1, y + 1, width - 1, height - 1); setColor(colorUp); fillRect(x, y, width, 1); fillRect(x, y + 1, 1, height); setColor(colorDown); fillRect(x + width, y, 1, height); fillRect(x + 1, y + height, width, 1); } /** * Fills the polygon with the current color. * * @param p * the Polygon object. */ public void fillPolygon(Polygon p) { fillPolygon(p.xpoints, p.ypoints, p.npoints); } /** * Disposes of the Graphics. */ @Override public void finalize() { } /** * Gets the bounds of the current clipping area as a rectangle and copies it * to an existing rectangle. * * @param r * a Rectangle object where the current clipping area bounds are * to be copied. * @return the bounds of the current clipping area. */ public Rectangle getClipBounds(Rectangle r) { Shape clip = getClip(); if (clip != null) { // TODO: Can we get shape bounds without creating Rectangle object? Rectangle b = clip.getBounds(); r.x = b.x; r.y = b.y; r.width = b.width; r.height = b.height; } return r; } /** * Gets the bounds of the current clipping area as a rectangle. * * @return a Rectangle object. * @deprecated Use {@link #getClipBounds()} */ @Deprecated public Rectangle getClipRect() { return getClipBounds(); } /** * Gets the font metrics of the current font. The font metrics object * contains information about the rendering of a particular font. * * @return the font metrics of current font. */ public FontMetrics getFontMetrics() { return getFontMetrics(getFont()); } /** * Determines whether or not the specified rectangle intersects the current * clipping area. * * @param x * the X coordinate of the rectangle. * @param y * the Y coordinate of the rectangle. * @param width * the width of the rectangle. * @param height * the height of the rectangle. * @return true, if the specified rectangle intersects the current clipping * area, false otherwise. */ public boolean hitClip(int x, int y, int width, int height) { // TODO: Create package private method Rectangle.intersects(int, int, // int, int); return getClipBounds().intersects(new Rectangle(x, y, width, height)); } /** * Returns string which represents this Graphics object. * * @return the string which represents this Graphics object. */ @Override public String toString() { // TODO: Think about string representation of Graphics. return "Graphics"; //$NON-NLS-1$ } // Abstract methods /** * Clears the specified rectangle. This method fills specified rectangle * with background color. * * @param x * the X coordinate of the rectangle. * @param y * the Y coordinate of the rectangle. * @param width * the width of the rectangle. * @param height * the height of the rectangle. */ public abstract void clearRect(int x, int y, int width, int height); /** * Intersects the current clipping area with a new rectangle. If the current * clipping area is not defined, the rectangle becomes a new clipping area. * Rendering operations are only allowed within the new the clipping area. * * @param x * the X coordinate of the rectangle for intersection. * @param y * the Y coordinate of the rectangle for intersection. * @param width * the width of the rectangle for intersection. * @param height * the height of the rectangle for intersection. */ public abstract void clipRect(int x, int y, int width, int height); /** * Copies the rectangle area to another area specified by a distance (dx, * dy) from the original rectangle's location. Positive dx and dy values * give a new location defined by translation to the right and down from the * original location, negative dx and dy values - to the left and up. * * @param sx * the X coordinate of the rectangle which will be copied. * @param sy * the Y coordinate of the rectangle which will be copied. * @param width * the width of the rectangle which will be copied. * @param height * the height of the rectangle which will be copied. * @param dx * the horizontal distance from the source rectangle's location * to the copy's location. * @param dy * the vertical distance from the source rectangle's location to * the copy's location. */ public abstract void copyArea(int sx, int sy, int width, int height, int dx, int dy); /** * Creates a new copy of this Graphics. * * @return a new Graphics context which is a copy of this Graphics. */ public abstract Graphics create(); /** * Disposes of the Graphics. This Graphics object can not be used after * calling this method. */ public abstract void dispose(); /** * Draws the arc covering the specified rectangle and using the current * color. The rectangle is defined by the origin point (X, Y) and dimensions * (width and height). The arc center is the the center of specified * rectangle. The angle origin is 3 o'clock position, the positive angle is * counted as a counter-clockwise rotation, the negative angle is counted as * clockwise rotation. * * @param x * the X origin coordinate of the rectangle which scales the arc. * @param y * the Y origin coordinate of the rectangle which scales the arc. * @param width * the width of the rectangle which scales the arc. * @param height * the height of the rectangle which scales the arc. * @param sa * start angle - the origin angle of arc. * @param ea * arc angle - the angular arc value relative to the start angle. */ public abstract void drawArc(int x, int y, int width, int height, int sa, int ea); /** * Draws the specified image with the defined background color. The top left * corner of image will be drawn at point (x, y) in current coordinate * system. The image loading process notifies the specified Image Observer. * This method returns true if the image has loaded, otherwise it returns * false. * * @param img * the image which will be drawn. * @param x * the X coordinate of the image top left corner. * @param y * the Y coordinate of the image top left corner. * @param bgcolor * the background color. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, false * otherwise. */ public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer); /** * Draws the specified image. The top left corner of image will be drawn at * point (x, y) in current coordinate system. The image loading process * notifies the specified Image Observer. This method returns true if the * image has loaded, otherwise it returns false. * * @param img * the image which will be drawn. * @param x * the X coordinate of the image top left corner. * @param y * the Y coordinate of the image top left corner. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, otherwise * false. */ public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer); /** * Scales the specified image to fit in the specified rectangle and draws it * with the defined background color. The top left corner of the image will * be drawn at the point (x, y) in current coordinate system. The non-opaque * pixels will be drawn in the background color. The image loading process * notifies the specified Image Observer. This method returns true if the * image has loaded, otherwise it returns false. * * @param img * the image which will be drawn. * @param x * the X coordinate of the image's top left corner. * @param y * the Y coordinate of the image's top left corner. * @param width * the width of rectangle which scales the image. * @param height * the height of rectangle which scales the image. * @param bgcolor * the background color. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, otherwise * false. */ public abstract boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer); /** * Scales the specified image to fit in the specified rectangle and draws * it. The top left corner of the image will be drawn at the point (x, y) in * current coordinate system. The image loading process notifies the * specified Image Observer. This method returns true if the image has * loaded, otherwise it returns false. * * @param img * the image which will be drawn. * @param x * the X coordinate of the image top left corner. * @param y * the Y coordinate of the image top left corner. * @param width * the width of rectangle which scales the image. * @param height * the height of rectangle which scales the image. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, otherwise * false. */ public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer); /** * Scales the specified area of the specified image to fit in the rectangle * area defined by its corners coordinates and draws the sub-image with the * specified background color. The sub-image to be drawn is defined by its * top left corner coordinates (sx1, sy1) and bottom right corner * coordinates (sx2, sy2) computed with respect to the origin (top left * corner) of the source image. The non opaque pixels will be drawn in the * background color. The image loading process notifies specified Image * Observer. This method returns true if the image has loaded, otherwise it * returns false. * * @param img * the image which will be drawn. * @param dx1 * the X top left corner coordinate of the destination rectangle * area. * @param dy1 * the Y top left corner coordinate of the destination rectangle * area. * @param dx2 * the X bottom right corner coordinate of the destination * rectangle area. * @param dy2 * the Y bottom right corner coordinate of the destination * rectangle area. * @param sx1 * the X top left corner coordinate of the area to be drawn * within the source image. * @param sy1 * the Y top left corner coordinate of the area to be drawn * within the source image. * @param sx2 * the X bottom right corner coordinate of the area to be drawn * within the source image. * @param sy2 * the Y bottom right corner coordinate of the area to be drawn * within the source image. * @param bgcolor * the background color. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, false * otherwise. */ public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer); /** * Scales the specified area of the specified image to fit in the rectangle * area defined by its corners coordinates and draws the sub-image. The * sub-image to be drawn is defined by its top left corner coordinates (sx1, * sy1) and bottom right corner coordinates (sx2, sy2) computed with respect * to the origin (top left corner) of the source image. The image loading * process notifies specified Image Observer. This method returns true if * the image has loaded, otherwise it returns false. * * @param img * the image which will be drawn. * @param dx1 * the X top left corner coordinate of the destination rectangle * area. * @param dy1 * the Y top left corner coordinate of the destination rectangle * area. * @param dx2 * the X bottom right corner coordinate of the destination * rectangle area. * @param dy2 * the Y bottom right corner coordinate of the destination * rectangle area. * @param sx1 * the X top left corner coordinate of the area to be drawn * within the source image. * @param sy1 * the Y top left corner coordinate of the area to be drawn * within the source image. * @param sx2 * the X bottom right corner coordinate of the area to be drawn * within the source image. * @param sy2 * the Y bottom right corner coordinate of the area to be drawn * within the source image. * @param observer * the ImageObserver object which should be notified about image * loading process. * @return true, if loading image is successful or image is null, false * otherwise. */ public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer); /** * Draws a line from the point (x1, y1) to the point (x2, y2). This method * draws the line with current color which can be changed by setColor(Color * c) method. * * @param x1 * the X coordinate of the first point. * @param y1 * the Y coordinate of the first point. * @param x2 * the X coordinate of the second point. * @param y2 * the Y coordinate of the second point. */ public abstract void drawLine(int x1, int y1, int x2, int y2); /** * Draws the outline of an oval to fit in the rectangle defined by the given * width, height, and top left corner. * * @param x * the X top left corner oval coordinate. * @param y * the Y top left corner oval coordinate. * @param width * the oval width. * @param height * the oval height. */ public abstract void drawOval(int x, int y, int width, int height); /** * Draws the outline of a polygon. The polygon vertices are defined by * points with xpoints[i], ypoints[i] as coordinates. The polygon edges are * the lines from the points with (xpoints[i-1], ypoints[i-1]) coordinates * to the points with (xpoints[i], ypoints[i]) coordinates, for 0 < i < * npoints +1. * * @param xpoints * the array of X coordinates of the polygon vertices. * @param ypoints * the array of Y coordinates of the polygon vertices. * @param npoints * the number of polygon vertices/points. */ public abstract void drawPolygon(int[] xpoints, int[] ypoints, int npoints); /** * Draws a set of connected lines which are defined by the x and y * coordinate arrays. The polyline is closed if coordinates of the first * point are the same as coordinates of the last point. * * @param xpoints * the array of X point coordinates. * @param ypoints * the array of Y point coordinates. * @param npoints * the number of points. */ public abstract void drawPolyline(int[] xpoints, int[] ypoints, int npoints); /** * Draws the outline of a rectangle with round corners. * * @param x * the X coordinate of the rectangle's top left corner. * @param y * the Y coordinate of the rectangle's top left corner. * @param width * the width of the rectangle. * @param height * the height of the rectangle. * @param arcWidth * the arc width for the corners. * @param arcHeight * the arc height for the corners. */ public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); /** * Draws a text defined by an iterator. The iterator should specify the font * for every character. * * @param iterator * the iterator. * @param x * the X coordinate of the first character. * @param y * the Y coordinate of the first character. */ public abstract void drawString(AttributedCharacterIterator iterator, int x, int y); /** * Draws a text defined by a string. This method draws the text with current * font and color. * * @param str * the string. * @param x * the X coordinate of the first character. * @param y * the Y coordinate of the first character. */ public abstract void drawString(String str, int x, int y); /** * Fills the arc covering the rectangle and using the current color. The * rectangle is defined by the origin point (X, Y) and dimensions (width and * height). The arc center is the the center of specified rectangle. The * angle origin is at the 3 o'clock position, and a positive angle gives * counter-clockwise rotation, a negative angle gives clockwise rotation. * * @param x * the X origin coordinate of the rectangle which scales the arc. * @param y * the Y origin coordinate of the rectangle which scales the arc. * @param width * the width of the rectangle which scales the arc. * @param height * the height of the rectangle which scales the arc. * @param sa * start angle - the origin angle of arc. * @param ea * arc angle - the angular arc value relative to the start angle. */ public abstract void fillArc(int x, int y, int width, int height, int sa, int ea); /** * Fills an oval with the current color where the oval is defined by the * bounding rectangle with the given width, height, and top left corner. * * @param x * the X top left corner oval coordinate. * @param y * the Y top left corner oval coordinate. * @param width * the oval width. * @param height * the oval height. */ public abstract void fillOval(int x, int y, int width, int height); /** * Fills a polygon with the current color. The polygon vertices are defined * by the points with xpoints[i], ypoints[i] as coordinates. The polygon * edges are the lines from the points with (xpoints[i-1], ypoints[i-1]) * coordinates to the points with (xpoints[i], ypoints[i]) coordinates, for * 0 < i < npoints +1. * * @param xpoints * the array of X coordinates of the polygon vertices. * @param ypoints * the array of Y coordinates of the polygon vertices. * @param npoints * the number of polygon vertices/points. */ public abstract void fillPolygon(int[] xpoints, int[] ypoints, int npoints); /** * Fills a rectangle with the current color. The rectangle is defined by its * width and length and top left corner coordinates. * * @param x * the X coordinate of the rectangle's top left corner. * @param y * the Y coordinate of the rectangle's top left corner. * @param width * the width of rectangle. * @param height * the height of rectangle. */ public abstract void fillRect(int x, int y, int width, int height); /** * Fills a round cornered rectangle with the current color. * * @param x * the X coordinate of the top left corner of the bounding * rectangle. * @param y * the Y coordinate of the top left corner of the bounding * rectangle. * @param width * the width of the bounding rectangle. * @param height * the height of the bounding rectangle. * @param arcWidth * the arc width at the corners. * @param arcHeight * the arc height at the corners. */ public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); /** * Gets the clipping area. <br> * <br> * * @return a Shape object of the clipping area or null if it is not set. */ public abstract Shape getClip(); /** * Gets the bounds of the current clipping area as a rectangle. * * @return a Rectangle object which represents the bounds of the current * clipping area. */ public abstract Rectangle getClipBounds(); /** * Gets the current color of Graphics. * * @return the current color. */ public abstract Color getColor(); /** * Gets the current font of Graphics. * * @return the current font. */ public abstract Font getFont(); /** * Gets the font metrics of the specified font. The font metrics object * contains information about the rendering of a particular font. * * @param font * the specified font. * @return the font metrics for the specified font. */ public abstract FontMetrics getFontMetrics(Font font); /** * Sets the new clipping area specified by rectangle. The new clipping area * doesn't depend on the window's visibility. Rendering operations can't be * performed outside new clipping area. * * @param x * the X coordinate of the new clipping rectangle. * @param y * the Y coordinate of the new clipping rectangle. * @param width * the width of the new clipping rectangle. * @param height * the height of the new clipping rectangle. */ public abstract void setClip(int x, int y, int width, int height); /** * Sets the new clipping area to be the area specified by Shape object. The * new clipping area doesn't depend on the window's visibility. Rendering * operations can't be performed outside new clipping area. * * @param clip * the Shape object which represents new clipping area. */ public abstract void setClip(Shape clip); /** * Sets the current Graphics color. All rendering operations with this * Graphics will use this color. * * @param c * the new color. */ public abstract void setColor(Color c); /** * Sets the current Graphics font. All rendering operations with this * Graphics will use this font. * * @param font * the new font. */ public abstract void setFont(Font font); /** * Sets the paint mode for the Graphics which overwrites all rendering * operations with the current color. */ public abstract void setPaintMode(); /** * Sets the XOR mode for the Graphics which changes a pixel from the current * color to the specified XOR color. <br> * <br> * * @param color * the new XOR mode. */ public abstract void setXORMode(Color color); /** * Translates the origin of Graphics current coordinate system to the point * with X, Y coordinates in the current coordinate system. All rendering * operation in this Graphics will be related to the new origin. * * @param x * the X coordinate of the origin. * @param y * the Y coordinate of the origin. */ public abstract void translate(int x, int y); }