/******************************************************************************* * Copyright (c) 2000, 2011, 2012 IBM Corporation, Gerhardt Informatics Kft. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Gerhardt Informatics Kft. - GEFGWT port *******************************************************************************/ package org.eclipse.swt.graphics; //Test comment. import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.SWTException; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.CanvasGradient; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.canvas.dom.client.FillStrokeStyle; import com.google.gwt.dom.client.CanvasElement; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.dom.client.Style; /** * Class <code>GC</code> is where all of the drawing capabilities that are * supported by SWT are located. Instances are used to draw on either an * <code>Image</code>, a <code>Control</code>, or directly on a * <code>Display</code>. * <dl> * <dt><b>Styles:</b></dt> * <dd>LEFT_TO_RIGHT, RIGHT_TO_LEFT</dd> * </dl> * * <p> * The SWT drawing coordinate system is the two-dimensional space with the * origin (0,0) at the top left corner of the drawing area and with (x,y) values * increasing to the right and downward respectively. * </p> * * <p> * The result of drawing on an image that was created with an indexed palette * using a color that is not in the palette is platform specific. Some platforms * will match to the nearest color while other will draw the color itself. This * happens because the allocated image might use a direct palette on platforms * that do not support indexed palette. * </p> * * <p> * Application code must explicitly invoke the <code>GC.dispose()</code> method * to release the operating system resources managed by each instance when those * instances are no longer required. This is <em>particularly</em> important on * Windows95 and Windows98 where the operating system has a limited number of * device contexts available. * </p> * * <p> * Note: Only one of LEFT_TO_RIGHT and RIGHT_TO_LEFT may be specified. * </p> * * @see org.eclipse.swt.events.PaintEvent * @see <a href="http://www.eclipse.org/swt/snippets/#gc">GC snippets</a> * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Examples: * GraphicsExample, PaintExample</a> * @see <a href="http://www.eclipse.org/swt/">Sample code and further * information</a> */ public final class GC extends Resource { /** * the handle to the OS device context (Warning: This field is platform * dependent) * <p> * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT public API. * It is marked public only so that it can be shared within the packages * provided by SWT. It is not available on all platforms and should never be * accessed from application code. * </p> * * @noreference This field is not intended to be referenced by clients. */ public long /* int */handle; public static boolean CLIP = true; Drawable drawable; GCData data; private int fontSize; private Context2d context2d; private Color background; private Color foreground; private Rectangle clipRect; private LineAttributes lineAttributes = new LineAttributes(1); private Transform transform = new Transform(null); private Font font = new Font(null); private FillStrokeStyle fillStyle; private double alpha = 1.0; private int alphaInt = 255; private boolean advanced = false; private int antialias = 0; private boolean xorMode; final static int FOREGROUND = 1 << 0; final static int BACKGROUND = 1 << 1; final static int FONT = 1 << 2; final static int LINE_STYLE = 1 << 3; final static int LINE_CAP = 1 << 4; final static int LINE_JOIN = 1 << 5; final static int LINE_WIDTH = 1 << 6; final static int LINE_MITERLIMIT = 1 << 7; final static int BACKGROUND_BG = 1 << 8; final static int DRAW_OFFSET = 1 << 9; final static int DRAW = FOREGROUND | LINE_WIDTH | LINE_STYLE | LINE_CAP | LINE_JOIN | LINE_MITERLIMIT | DRAW_OFFSET; final static int FILL = BACKGROUND; static final float[] LINE_DOT = new float[] { 1, 1 }; static final float[] LINE_DASH = new float[] { 3, 1 }; static final float[] LINE_DASHDOT = new float[] { 3, 1, 1, 1 }; static final float[] LINE_DASHDOTDOT = new float[] { 3, 1, 1, 1, 1, 1 }; static final float[] LINE_DOT_ZERO = new float[] { 3, 3 }; static final float[] LINE_DASH_ZERO = new float[] { 18, 6 }; static final float[] LINE_DASHDOT_ZERO = new float[] { 9, 6, 3, 6 }; static final float[] LINE_DASHDOTDOT_ZERO = new float[] { 9, 3, 3, 3, 3, 3 }; GC() { } /** * Constructs a new instance of this class which has been configured to draw * on the specified drawable. Sets the foreground color, background color * and font in the GC to match those in the drawable. * <p> * You must dispose the graphics context when it is no longer required. * </p> * * @param drawable * the drawable to draw on * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the drawable is null</li> * <li>ERROR_NULL_ARGUMENT - if there is no current device</li> * <li>ERROR_INVALID_ARGUMENT - if the drawable is an image * that is not a bitmap or an icon - if the drawable is an * image or printer that is already selected into another * graphics context</li> * </ul> * @exception SWTError * <ul> * <li>ERROR_NO_HANDLES if a handle could not be obtained for * GC creation</li> * <li>ERROR_THREAD_INVALID_ACCESS if not called from the * thread that created the drawable</li> * </ul> */ public GC(Drawable drawable) { // this(drawable, 0); if (drawable instanceof GWTDrawable) { context2d = ((GWTDrawable) drawable).internal_getContext(); } else { context2d = Canvas.createIfSupported().getContext2d(); } background = new Color(null, 255, 255, 255); foreground = new Color(null, 0, 0, 0); context2d.setFillStyle("white"); context2d.setStrokeStyle("black"); context2d.save(); } /** * Constructs a new instance of this class which has been configured to draw * on the specified drawable. Sets the foreground color, background color * and font in the GC to match those in the drawable. * <p> * You must dispose the graphics context when it is no longer required. * </p> * * @param drawable * the drawable to draw on * @param style * the style of GC to construct * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the drawable is null</li> * <li>ERROR_NULL_ARGUMENT - if there is no current device</li> * <li>ERROR_INVALID_ARGUMENT - if the drawable is an image * that is not a bitmap or an icon - if the drawable is an * image or printer that is already selected into another * graphics context</li> * </ul> * @exception SWTError * <ul> * <li>ERROR_NO_HANDLES if a handle could not be obtained for * GC creation</li> * <li>ERROR_THREAD_INVALID_ACCESS if not called from the * thread that created the drawable</li> * </ul> * * @since 2.1.2 */ public GC(Drawable drawable, int style) { this(drawable); } static int checkStyle(int style) { if ((style & SWT.LEFT_TO_RIGHT) != 0) style &= ~SWT.RIGHT_TO_LEFT; return style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT); } void checkGC(int mask) { } long /* int */convertRgn(long /* int */rgn, double[] matrix) { return rgn; } /** * Copies a rectangular area of the receiver at the specified position into * the image, which must be of type <code>SWT.BITMAP</code>. * * @param image * the image to copy into * @param x * the x coordinate in the receiver of the area to be copied * @param y * the y coordinate in the receiver of the area to be copied * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the image is null</li> * <li>ERROR_INVALID_ARGUMENT - if the image is not a bitmap * or has been disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void copyArea(Image image, int x, int y) { } /** * Copies a rectangular area of the receiver at the source position onto the * receiver at the destination position. * * @param srcX * the x coordinate in the receiver of the area to be copied * @param srcY * the y coordinate in the receiver of the area to be copied * @param width * the width of the area to copy * @param height * the height of the area to copy * @param destX * the x coordinate in the receiver of the area to copy to * @param destY * the y coordinate in the receiver of the area to copy to * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void copyArea(int srcX, int srcY, int width, int height, int destX, int destY) { } /** * Copies a rectangular area of the receiver at the source position onto the * receiver at the destination position. * * @param srcX * the x coordinate in the receiver of the area to be copied * @param srcY * the y coordinate in the receiver of the area to be copied * @param width * the width of the area to copy * @param height * the height of the area to copy * @param destX * the x coordinate in the receiver of the area to copy to * @param destY * the y coordinate in the receiver of the area to copy to * @param paint * if <code>true</code> paint events will be generated for old * and obscured areas * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public void copyArea(int srcX, int srcY, int width, int height, int destX, int destY, boolean paint) { } void createLayout() { } void disposeLayout() { } void destroy() { } /** * Draws the outline of a circular or elliptical arc within the specified * rectangular area. * <p> * The resulting arc begins at <code>startAngle</code> and extends for * <code>arcAngle</code> degrees, using the current color. Angles are * interpreted such that 0 degrees is at the 3 o'clock position. A positive * value indicates a counter-clockwise rotation while a negative value * indicates a clockwise rotation. * </p> * <p> * The center of the arc is the center of the rectangle whose origin is ( * <code>x</code>, <code>y</code>) and whose size is specified by the * <code>width</code> and <code>height</code> arguments. * </p> * <p> * The resulting arc covers an area <code>width + 1</code> pixels wide by * <code>height + 1</code> pixels tall. * </p> * * @param x * the x coordinate of the upper-left corner of the arc to be * drawn * @param y * the y coordinate of the upper-left corner of the arc to be * drawn * @param width * the width of the arc to be drawn * @param height * the height of the arc to be drawn * @param startAngle * the beginning angle * @param arcAngle * the angular extent of the arc, relative to the start angle * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { context2d.save(); reInitContext2d(); context2d.translate(x + width / 2.0, y + height / 2.0); context2d.scale(1, height / (double) width); context2d.beginPath(); context2d.arc(0, 0, width / 2, -Math.toRadians(startAngle), -Math.toRadians(startAngle + arcAngle), true); context2d.stroke(); context2d.restore(); } /** * Draws a rectangle, based on the specified arguments, which has the * appearance of the platform's <em>focus rectangle</em> if the platform * supports such a notion, and otherwise draws a simple rectangle in the * receiver's foreground 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 * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawRectangle(int, int, int, int) */ public void drawFocus(int x, int y, int width, int height) { drawRectangle(x, y, width, height); } /** * Draws the given image in the receiver at the specified coordinates. * * @param image * the image to draw * @param x * the x coordinate of where to draw * @param y * the y coordinate of where to draw * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the image is null</li> * <li>ERROR_INVALID_ARGUMENT - if the image has been * disposed</li> * <li>ERROR_INVALID_ARGUMENT - if the given coordinates are * outside the bounds of the image</li> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * @exception SWTError * <ul> * <li>ERROR_NO_HANDLES - if no handles are available to * perform the operation</li> * </ul> */ public void drawImage(Image image, int x, int y) { if (image.gwtImage == null) { System.err.println("drawImage failed: image.gwtImage is null"); return; } final ImageElement imageElement = ImageElement.as(image.gwtImage .getElement()); imageElement.setSrc(image.gwtImage.getUrl()); context2d.save(); reInitContext2d(); context2d.drawImage(imageElement, x, y); context2d.restore(); } /** * Copies a rectangular area from the source image into a (potentially * different sized) rectangular area in the receiver. If the source and * destination areas are of differing sizes, then the source area will be * stretched or shrunk to fit the destination area as it is copied. The copy * fails if any part of the source rectangle lies outside the bounds of the * source image, or if any of the width or height arguments are negative. * * @param image * the source image * @param srcX * the x coordinate in the source image to copy from * @param srcY * the y coordinate in the source image to copy from * @param srcWidth * the width in pixels to copy from the source * @param srcHeight * the height in pixels to copy from the source * @param destX * the x coordinate in the destination to copy to * @param destY * the y coordinate in the destination to copy to * @param destWidth * the width in pixels of the destination rectangle * @param destHeight * the height in pixels of the destination rectangle * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the image is null</li> * <li>ERROR_INVALID_ARGUMENT - if the image has been * disposed</li> * <li>ERROR_INVALID_ARGUMENT - if any of the width or height * arguments are negative. * <li>ERROR_INVALID_ARGUMENT - if the source rectangle is * not contained within the bounds of the source image</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * @exception SWTError * <ul> * <li>ERROR_NO_HANDLES - if no handles are available to * perform the operation</li> * </ul> */ public void drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight) { } void drawImage(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple) { } void drawImage(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple, int imgWidth, int imgHeight) { } void drawImageAlpha(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple, int imgWidth, int imgHeight) { } void drawImageMask(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple, int imgWidth, int imgHeight) { } void drawImageXRender(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple, int imgWidth, int imgHeight, long /* int */maskPixmap, int maskType) { } long /* int */scale(long /* int */src, int srcX, int srcY, int srcWidth, int srcHeight, int destWidth, int destHeight) { return 1l; } /** * Draws a line, using the foreground color, between the points ( * <code>x1</code>, <code>y1</code>) and (<code>x2</code>, <code>y2</code>). * * @param x1 * the first point's x coordinate * @param y1 * the first point's y coordinate * @param x2 * the second point's x coordinate * @param y2 * the second point's y coordinate * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawLine(int x1, int y1, int x2, int y2) { context2d.save(); reInitContext2d(); double xDouble1 = x1; double yDouble1 = y1; double xDouble2 = x2; double yDouble2 = y2; double[] matrix = transform.getMatrix(); // if it's a vertical or horizontal line if (x1 == x2 || y1 == y2) { // if the line isn't rotated: if (matrix[1] == 0 && matrix[2] == 0) { // calculate the real position of the line double xReal1 = matrix[0] * x1 + matrix[4]; double yReal1 = matrix[3] * y1 + matrix[5]; // if the line width is odd we must translate the // coordinates to the middle of the pixel if (getLineWidth() % 2 == 1) { double dx1 = Math.floor(xReal1) + 0.5; double dy1 = Math.floor(yReal1) + 0.5; double e; e = (dx1 - matrix[4]) / matrix[0] - xDouble1; xDouble1 += e; xDouble2 += e; e = (dy1 - matrix[5]) / matrix[3] - yDouble1; yDouble1 += e; yDouble2 += e; } else { // if it's even we must translate it to the top // left corner of the pixel double dx1 = Math.floor(xReal1); double dy1 = Math.floor(yReal1); double e; e = (dx1 - matrix[4]) / matrix[0] - xDouble1; xDouble1 += e; xDouble2 += e; e = (dy1 - matrix[5]) / matrix[3] - yDouble1; yDouble1 += e; yDouble2 += e; } } } context2d.beginPath(); context2d.moveTo(xDouble1, yDouble1); context2d.lineTo(xDouble2, yDouble2); context2d.closePath(); context2d.stroke(); context2d.restore(); } /** * Draws the outline of an oval, using the foreground color, within the * specified rectangular area. * <p> * The result is a circle or ellipse that fits within the rectangle * specified by the <code>x</code>, <code>y</code>, <code>width</code>, and * <code>height</code> arguments. * </p> * <p> * The oval covers an area that is <code>width + 1</code> pixels wide and * <code>height + 1</code> pixels tall. * </p> * * @param x * the x coordinate of the upper left corner of the oval to be * drawn * @param y * the y coordinate of the upper left corner of the oval to be * drawn * @param width * the width of the oval to be drawn * @param height * the height of the oval to be drawn * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawOval(int x, int y, int width, int height) { x += 1; y += 1; width -= 2; height -= 2; context2d.save(); reInitContext2d(); double kappa = 0.5522848; double ox = (width / 2) * kappa; double oy = (height / 2) * kappa; double xe = x + width; double ye = y + height; double xm = x + width / 2; double ym = y + height / 2; context2d.beginPath(); context2d.moveTo(x, ym); context2d.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context2d.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); context2d.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); context2d.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); context2d.closePath(); context2d.stroke(); context2d.restore(); } /** * Draws the path described by the parameter. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param path * the path to draw * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Path * * @since 3.1 */ public void drawPath(Path path) { } /** * Draws a pixel, using the foreground color, at the specified point ( * <code>x</code>, <code>y</code>). * <p> * Note that the receiver's line attributes do not affect this operation. * </p> * * @param x * the point's x coordinate * @param y * the point's y coordinate * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.0 */ public void drawPoint(int x, int y) { context2d.save(); reInitContext2d(); context2d.strokeRect(x, y, 1, 1); context2d.restore(); } /** * Draws the closed polygon which is defined by the specified array of * integer coordinates, using the receiver's foreground color. The array * contains alternating x and y values which are considered to represent * points which are the vertices of the polygon. Lines are drawn between * each consecutive pair, and between the first pair and last pair in the * array. * * @param pointArray * an array of alternating x and y values which are the vertices * of the polygon * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT if pointArray is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawPolygon(int[] pointArray) { context2d.save(); reInitContext2d(); context2d.beginPath(); context2d.moveTo(pointArray[0], pointArray[1]); for (int i = 2; i < pointArray.length; i += 2) { context2d.lineTo(pointArray[i], pointArray[i + 1]); } context2d.closePath(); context2d.stroke(); context2d.restore(); } /** * Draws the polyline which is defined by the specified array of integer * coordinates, using the receiver's foreground color. The array contains * alternating x and y values which are considered to represent points which * are the corners of the polyline. Lines are drawn between each consecutive * pair, but not between the first pair and last pair in the array. * * @param pointArray * an array of alternating x and y values which are the corners * of the polyline * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the point array is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawPolyline(int[] pointArray) { context2d.save(); reInitContext2d(); context2d.beginPath(); context2d.moveTo(pointArray[0], pointArray[1]); for (int i = 2; i < pointArray.length; i += 2) { context2d.lineTo(pointArray[i], pointArray[i + 1]); } context2d.stroke(); context2d.restore(); } void drawPolyline(long /* int */cairo, int[] pointArray, boolean close) { } /** * Draws the outline of the rectangle specified by the arguments, using the * receiver's foreground color. The left and right edges of the rectangle * are at <code>x</code> and <code>x + width</code>. The top and bottom * edges are at <code>y</code> and <code>y + height</code>. * * @param x * the x coordinate of the rectangle to be drawn * @param y * the y coordinate of the rectangle to be drawn * @param width * the width of the rectangle to be drawn * @param height * the height of the rectangle to be drawn * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawRectangle(int x, int y, int width, int height) { if (width < 0) { x += width; width *= -1; } if (height < 0) { y += height; height *= -1; } context2d.save(); reInitContext2d(); float preciseX = x; float preciseY = y; if (getLineWidth() % 2 == 1) { preciseX += 0.5; preciseY += 0.5; width -= 1; height -= 1; } context2d.strokeRect(preciseX, preciseY, width, height); context2d.restore(); } /** * Draws the outline of the specified rectangle, using the receiver's * foreground color. The left and right edges of the rectangle are at * <code>rect.x</code> and <code>rect.x + rect.width</code>. The top and * bottom edges are at <code>rect.y</code> and * <code>rect.y + rect.height</code>. * * @param rect * the rectangle to draw * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawRectangle(Rectangle rect) { if (rect == null) { throw new IllegalArgumentException(); } if (isDisposed()) { throw new SWTException(SWT.ERROR_GRAPHIC_DISPOSED); } drawRectangle(rect.x, rect.y, rect.width, rect.height); } /** * Draws the outline of the round-cornered rectangle specified by the * arguments, using the receiver's foreground color. The left and right * edges of the rectangle are at <code>x</code> and <code>x + width</code>. * The top and bottom edges are at <code>y</code> and * <code>y + height</code>. The <em>roundness</em> of the corners is * specified by the <code>arcWidth</code> and <code>arcHeight</code> * arguments, which are respectively the width and height of the ellipse * used to draw the corners. * * @param x * the x coordinate of the rectangle to be drawn * @param y * the y coordinate of the rectangle to be drawn * @param width * the width of the rectangle to be drawn * @param height * the height of the rectangle to be drawn * @param arcWidth * the width of the arc * @param arcHeight * the height of the arc * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) { double kappa = 0.5522848; double ox = (arcWidth) * kappa; double oy = (arcHeight) * kappa; double xe = x + arcWidth * 2; double ye = y + arcHeight * 2; double xm = x + arcWidth; double ym = y + arcHeight; context2d.save(); reInitContext2d(); context2d.beginPath(); context2d.moveTo(x + arcWidth, y); context2d.lineTo(x + width - arcWidth, y); context2d.bezierCurveTo(xm + ox + width - 2 * arcWidth, y, xe + width - 2 * arcWidth, ym - oy, xe + width - 2 * arcWidth, ym); context2d.lineTo(x + width, y + height - arcHeight); context2d.bezierCurveTo(xe + width - 2 * arcWidth, ym + oy + height - 2 * arcHeight, xm + ox + width - 2 * arcWidth, ye + height - 2 * arcHeight, xm + width - 2 * arcWidth, ye + height - 2 * arcHeight); context2d.lineTo(x + arcWidth, y + height); context2d.bezierCurveTo(xm - ox, ye + height - 2 * arcHeight, x, ym + oy + height - 2 * arcHeight, x, ym + height - 2 * arcHeight); context2d.lineTo(x, y + arcHeight); context2d.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context2d.stroke(); context2d.restore(); } /** * Draws the given string, using the receiver's current font and foreground * color. No tab expansion or carriage return processing will be performed. * The background of the rectangular area where the string is being drawn * will be filled with the receiver's background color. * * @param string * the string to be drawn * @param x * the x coordinate of the top left corner of the rectangular * area where the string is to be drawn * @param y * the y coordinate of the top left corner of the rectangular * area where the string is to be drawn * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawString(String string, int x, int y) { drawString(string, x, y, false); } /** * Draws the given string, using the receiver's current font and foreground * color. No tab expansion or carriage return processing will be performed. * If <code>isTransparent</code> is <code>true</code>, then the background * of the rectangular area where the string is being drawn will not be * modified, otherwise it will be filled with the receiver's background * color. * * @param string * the string to be drawn * @param x * the x coordinate of the top left corner of the rectangular * area where the string is to be drawn * @param y * the y coordinate of the top left corner of the rectangular * area where the string is to be drawn * @param isTransparent * if <code>true</code> the background will be transparent, * otherwise it will be opaque * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawString(String string, int x, int y, boolean isTransparent) { drawText(string, x, y, isTransparent ? SWT.DRAW_TRANSPARENT : 0); } /** * Draws the given string, using the receiver's current font and foreground * color. Tab expansion and carriage return processing are performed. The * background of the rectangular area where the text is being drawn will be * filled with the receiver's background color. * * @param string * the string to be drawn * @param x * the x coordinate of the top left corner of the rectangular * area where the text is to be drawn * @param y * the y coordinate of the top left corner of the rectangular * area where the text is to be drawn * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawText(String string, int x, int y) { drawText(string, x, y, SWT.DRAW_DELIMITER | SWT.DRAW_TAB); } /** * Draws the given string, using the receiver's current font and foreground * color. Tab expansion and carriage return processing are performed. If * <code>isTransparent</code> is <code>true</code>, then the background of * the rectangular area where the text is being drawn will not be modified, * otherwise it will be filled with the receiver's background color. * * @param string * the string to be drawn * @param x * the x coordinate of the top left corner of the rectangular * area where the text is to be drawn * @param y * the y coordinate of the top left corner of the rectangular * area where the text is to be drawn * @param isTransparent * if <code>true</code> the background will be transparent, * otherwise it will be opaque * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawText(String string, int x, int y, boolean isTransparent) { int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB; if (isTransparent) flags |= SWT.DRAW_TRANSPARENT; drawText(string, x, y, flags); } /** * Draws the given string, using the receiver's current font and foreground * color. Tab expansion, line delimiter and mnemonic processing are * performed according to the specified flags. If <code>flags</code> * includes <code>DRAW_TRANSPARENT</code>, then the background of the * rectangular area where the text is being drawn will not be modified, * otherwise it will be filled with the receiver's background color. * <p> * The parameter <code>flags</code> may be a combination of: * <dl> * <dt><b>DRAW_DELIMITER</b></dt> * <dd>draw multiple lines</dd> * <dt><b>DRAW_TAB</b></dt> * <dd>expand tabs</dd> * <dt><b>DRAW_MNEMONIC</b></dt> * <dd>underline the mnemonic character</dd> * <dt><b>DRAW_TRANSPARENT</b></dt> * <dd>transparent background</dd> * </dl> * </p> * * @param string * the string to be drawn * @param x * the x coordinate of the top left corner of the rectangular * area where the text is to be drawn * @param y * the y coordinate of the top left corner of the rectangular * area where the text is to be drawn * @param flags * the flags specifying how to process the text * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void drawText(String string, int x, int y, int flags) { /** * TODO When transparent is turned off and using mnemonic, it wont * underscore the 1st letter, or does it? */ double textWidth; double mnemonicWidth; String mnemonic; String[] parts; // String[] splitted = context2d.getFont().split(" "); // for (String string2 : splitted) { // if (string2.endsWith("px")) { // fontSize = Integer.parseInt(string2.split("px")[0]); // } // } if (font == null) { font = new Font(null, new FontData()); } fontSize = font.getFD().getHeight(); if ((flags & SWT.DRAW_DELIMITER) != 0) { parts = string.split("\n"); for (String string2 : parts) { drawText(string2, x, y, (flags ^ SWT.DRAW_DELIMITER)); y += fontSize + 1; } } else if ((flags & SWT.DRAW_TAB) != 0) { parts = string.split("\t"); for (String string2 : parts) { drawText(string2, x, y, (flags ^ SWT.DRAW_TAB)); x = (((int) Math.ceil(x + context2d.measureText(string2).getWidth()) / 100) + 1) * 100; } // } else if ((flags & SWT.TRANSPARENT) == 0) { // textWidth = context2d.measureText(string).getWidth(); // context2d.fillRect(x - 1, y - fontSize - 1, textWidth + 2, // fontSize + 3); // drawText(string, x, y, (flags | SWT.TRANSPARENT)); } else if ((flags & SWT.DRAW_MNEMONIC) != 0) { if (string.contains("&")) { parts = string.split("&"); if (parts[0].length() > 0) { drawText(parts[0], x, y, (flags ^ SWT.DRAW_MNEMONIC)); x = (int) Math.ceil(x + context2d.measureText(parts[0]).getWidth()); } for (int j = 1; j < parts.length; j++) { int xWidth = (int) Math.ceil(x + context2d.measureText(parts[j]).getWidth()); char[] charArray = parts[j].toCharArray(); mnemonic = String.valueOf(charArray[0]); parts[j] = ""; if (charArray.length > 1) { for (int i = 1; i < charArray.length; i++) { parts[j] = parts[j].concat(String .valueOf(charArray[i])); } } mnemonicWidth = context2d.measureText(mnemonic).getWidth(); drawText(mnemonic, x, y, (flags ^ SWT.DRAW_MNEMONIC)); int x2 = (int) Math.ceil(x + mnemonicWidth); drawText(parts[j], x2, y, (flags ^ SWT.DRAW_MNEMONIC)); drawLine(x, y + 2, x2, y + 2); x = xWidth; } } else { drawText(string, x, y, (flags ^ SWT.DRAW_MNEMONIC)); } } else { FontData fd = font.getFD(); if (foreground == null) { setForeground(new Color(null, 0, 0, 0)); } y += fd.getHeight() - 2; context2d.save(); reInitContext2d(); context2d.setFillStyle(toColorString(foreground)); context2d.fillText(string, x, y); context2d.restore(); } } /** * Compares the argument to the receiver, and returns true if they represent * the <em>same</em> object using a class specific comparison. * * @param object * the object to compare with this object * @return <code>true</code> if the object is the same as this object and * <code>false</code> otherwise * * @see #hashCode */ public boolean equals(Object object) { return false; } /** * Fills the interior of a circular or elliptical arc within the specified * rectangular area, with the receiver's background color. * <p> * The resulting arc begins at <code>startAngle</code> and extends for * <code>arcAngle</code> degrees, using the current color. Angles are * interpreted such that 0 degrees is at the 3 o'clock position. A positive * value indicates a counter-clockwise rotation while a negative value * indicates a clockwise rotation. * </p> * <p> * The center of the arc is the center of the rectangle whose origin is ( * <code>x</code>, <code>y</code>) and whose size is specified by the * <code>width</code> and <code>height</code> arguments. * </p> * <p> * The resulting arc covers an area <code>width + 1</code> pixels wide by * <code>height + 1</code> pixels tall. * </p> * * @param x * the x coordinate of the upper-left corner of the arc to be * filled * @param y * the y coordinate of the upper-left corner of the arc to be * filled * @param width * the width of the arc to be filled * @param height * the height of the arc to be filled * @param startAngle * the beginning angle * @param arcAngle * the angular extent of the arc, relative to the start angle * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawArc */ public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { context2d.save(); reInitContext2d(); context2d.translate(x + width / 2.0, y + height / 2.0); context2d.scale(1, height / (double) width); context2d.beginPath(); context2d.arc(0, 0, width / 2, -Math.toRadians(startAngle), -Math.toRadians(startAngle + arcAngle), true); context2d.fill(); context2d.restore(); } /** * Fills the interior of the specified rectangle with a gradient sweeping * from left to right or top to bottom progressing from the receiver's * foreground color to its background color. * * @param x * the x coordinate of the rectangle to be filled * @param y * the y coordinate of the rectangle to be filled * @param width * the width of the rectangle to be filled, may be negative * (inverts direction of gradient if horizontal) * @param height * the height of the rectangle to be filled, may be negative * (inverts direction of gradient if vertical) * @param vertical * if true sweeps from top to bottom, else sweeps from left to * right * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawRectangle(int, int, int, int) */ public void fillGradientRectangle(int x, int y, int width, int height, boolean vertical) { System.err.println("fillGradientRectangle() draws a normal rectangle"); fillRectangle(x, y, width, height); } /** * Fills the interior of an oval, within the specified rectangular area, * with the receiver's background color. * * @param x * the x coordinate of the upper left corner of the oval to be * filled * @param y * the y coordinate of the upper left corner of the oval to be * filled * @param width * the width of the oval to be filled * @param height * the height of the oval to be filled * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawOval */ public void fillOval(int x, int y, int width, int height) { x += 1; y += 1; width -= 2; height -= 2; context2d.save(); reInitContext2d(); if (false) { context2d.translate(x, y); context2d.translate(width / 2.0, height / 2.0); context2d.beginPath(); if (width != height) { context2d.scale(1, height / (double) width); } context2d.arc(0, 0, width / 2.0, 0, Math.PI * 2, true); } else { double kappa = 0.5522848; double ox = (width / 2) * kappa; double oy = (height / 2) * kappa; double xe = x + width; double ye = y + height; double xm = x + width / 2; double ym = y + height / 2; context2d.beginPath(); context2d.moveTo(x, ym); context2d.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context2d.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); context2d.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); context2d.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); } context2d.closePath(); context2d.fill(); context2d.restore(); } /** * Fills the path described by the parameter. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param path * the path to fill * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Path * * @since 3.1 */ public void fillPath(Path path) { } /** * Fills the interior of the closed polygon which is defined by the * specified array of integer coordinates, using the receiver's background * color. The array contains alternating x and y values which are considered * to represent points which are the vertices of the polygon. Lines are * drawn between each consecutive pair, and between the first pair and last * pair in the array. * * @param pointArray * an array of alternating x and y values which are the vertices * of the polygon * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT if pointArray is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawPolygon */ public void fillPolygon(int[] pointArray) { context2d.save(); reInitContext2d(); context2d.beginPath(); context2d.moveTo(pointArray[0], pointArray[1]); for (int i = 2; i < pointArray.length; i += 2) { context2d.lineTo(pointArray[i], pointArray[i + 1]); } context2d.closePath(); context2d.fill(); context2d.restore(); } /** * Fills the interior of the rectangle specified by the arguments, using the * receiver's background color. * * @param x * the x coordinate of the rectangle to be filled * @param y * the y coordinate of the rectangle to be filled * @param width * the width of the rectangle to be filled * @param height * the height of the rectangle to be filled * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawRectangle(int, int, int, int) */ public void fillRectangle(int x, int y, int width, int height) { if (width < 0) { x = x + width; width = -width; } if (height < 0) { y = y + height; height = -height; } context2d.save(); reInitContext2d(); context2d.fillRect(x, y, width, height); context2d.restore(); } /** * Fills the interior of the specified rectangle, using the receiver's * background color. * * @param rect * the rectangle to be filled * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawRectangle(int, int, int, int) */ public void fillRectangle(Rectangle rect) { fillRectangle(rect.x, rect.y, rect.width, rect.height); } /** * Fills the interior of the round-cornered rectangle specified by the * arguments, using the receiver's background color. * * @param x * the x coordinate of the rectangle to be filled * @param y * the y coordinate of the rectangle to be filled * @param width * the width of the rectangle to be filled * @param height * the height of the rectangle to be filled * @param arcWidth * the width of the arc * @param arcHeight * the height of the arc * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #drawRoundRectangle */ public void fillRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) { double kappa = 0.5522848; double ox = (arcWidth) * kappa; double oy = (arcHeight) * kappa; double xe = x + arcWidth * 2; double ye = y + arcHeight * 2; double xm = x + arcWidth; double ym = y + arcHeight; context2d.save(); reInitContext2d(); context2d.beginPath(); context2d.moveTo(x + arcWidth, y); context2d.lineTo(x + width - arcWidth, y); context2d.bezierCurveTo(xm + ox + width - 2 * arcWidth, y, xe + width - 2 * arcWidth, ym - oy, xe + width - 2 * arcWidth, ym); context2d.lineTo(x + width, y + height - arcHeight); context2d.bezierCurveTo(xe + width - 2 * arcWidth, ym + oy + height - 2 * arcHeight, xm + ox + width - 2 * arcWidth, ye + height - 2 * arcHeight, xm + width - 2 * arcWidth, ye + height - 2 * arcHeight); context2d.lineTo(x + arcWidth, y + height); context2d.bezierCurveTo(xm - ox, ye + height - 2 * arcHeight, x, ym + oy + height - 2 * arcHeight, x, ym + height - 2 * arcHeight); context2d.lineTo(x, y + arcHeight); context2d.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context2d.fill(); context2d.restore(); } int fixMnemonic(char[] buffer) { return 0; } /** * Returns the <em>advance width</em> of the specified character in the font * which is currently selected into the receiver. * <p> * The advance width is defined as the horizontal distance the cursor should * move after printing the character in the selected font. * </p> * * @param ch * the character to measure * @return the distance in the x direction to move past the character before * painting the next * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public int getAdvanceWidth(char ch) { return 0; } /** * Returns <code>true</code> if receiver is using the operating system's * advanced graphics subsystem. Otherwise, <code>false</code> is returned to * indicate that normal graphics are in use. * <p> * Advanced graphics may not be installed for the operating system. In this * case, <code>false</code> is always returned. Some operating system have * only one graphics subsystem. If this subsystem supports advanced * graphics, then <code>true</code> is always returned. If any graphics * operation such as alpha, antialias, patterns, interpolation, paths, * clipping or transformation has caused the receiver to switch from regular * to advanced graphics mode, <code>true</code> is returned. If the receiver * has been explicitly switched to advanced mode and this mode is supported, * <code>true</code> is returned. * </p> * * @return the advanced value * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #setAdvanced * * @since 3.1 */ public boolean getAdvanced() { return this.advanced; } /** * Returns the receiver's alpha value. The alpha value is between 0 * (transparent) and 255 (opaque). * * @return the alpha value * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int getAlpha() { return this.alphaInt; } /** * Returns the receiver's anti-aliasing setting value, which will be one of * <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or <code>SWT.ON</code>. * Note that this controls anti-aliasing for all <em>non-text drawing</em> * operations. * * @return the anti-aliasing setting * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #getTextAntialias * * @since 3.1 */ public int getAntialias() { return this.antialias; } /** * Returns the background color. * * @return the receiver's background color * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Color getBackground() { if (background == null) { return new Color(null, 255, 255, 255); } return background; } /** * Returns the background pattern. The default value is <code>null</code>. * * @return the receiver's background pattern * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see Pattern * * @since 3.1 */ public Pattern getBackgroundPattern() { return null; } /** * Returns the width of the specified character in the font selected into * the receiver. * <p> * The width is defined as the space taken up by the actual character, not * including the leading and tailing whitespace or overhang. * </p> * * @param ch * the character to measure * @return the width of the character * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public int getCharWidth(char ch) { return 0; } /** * Returns the bounding rectangle of the receiver's clipping region. If no * clipping region is set, the return value will be a rectangle which covers * the entire bounds of the object the receiver is drawing on. * * @return the bounding rectangle of the clipping region * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Rectangle getClipping() { if (clipRect == null) { // System.err.println("GC Uninitalized clipping rectangle," // + " returns (0,0,750,750)"); // clipRect = new Rectangle(0, 0, 750, 750); CanvasElement canvas = context2d.getCanvas(); // clipRect = new Rectangle(0, 0, canvas.getClientWidth(), // canvas.getClientHeight()); clipRect = new Rectangle(0, 0, 2000, 2000); } return clipRect; } /** * Sets the region managed by the argument to the current clipping region of * the receiver. * * @param region * the region to fill with the clipping region * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the region is null</li> * <li>ERROR_INVALID_ARGUMENT - if the region is disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void getClipping(Region region) { } /** * Returns the receiver's fill rule, which will be one of * <code>SWT.FILL_EVEN_ODD</code> or <code>SWT.FILL_WINDING</code>. * * @return the receiver's fill rule * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int getFillRule() { return 0; } /** * Returns the font currently being used by the receiver to draw and measure * text. * * @return the receiver's font * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Font getFont() { if (this.font != null) { return this.font; } return new Font(null); } /** * Returns a FontMetrics which contains information about the font currently * being used by the receiver to draw and measure text. * * @return font metrics for the receiver's font * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public FontMetrics getFontMetrics() { FontMetrics fm = new FontMetrics(); fm.averageCharWidth = (int) context2d.measureText("_").getWidth(); fm.height = (int) font.getFD().height; fm.ascent = fm.height - 3; fm.descent = 3; return fm; } /** * Returns the receiver's foreground color. * * @return the color used for drawing foreground things * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Color getForeground() { if (foreground == null) { return new Color(null, 0, 0, 0); } return foreground; } /** * Returns the foreground pattern. The default value is <code>null</code>. * * @return the receiver's foreground pattern * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see Pattern * * @since 3.1 */ public Pattern getForegroundPattern() { return null; } /** * Returns the GCData. * <p> * <b>IMPORTANT:</b> This method is <em>not</em> part of the public API for * <code>GC</code>. It is marked public only so that it can be shared within * the packages provided by SWT. It is not available on all platforms, and * should never be called from application code. * </p> * * @return the receiver's GCData * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see GCData * * @noreference This method is not intended to be referenced by clients. * * @since 3.2 */ public GCData getGCData() { return null; } /** * Returns the receiver's interpolation setting, which will be one of * <code>SWT.DEFAULT</code>, <code>SWT.NONE</code>, <code>SWT.LOW</code> or * <code>SWT.HIGH</code>. * * @return the receiver's interpolation setting * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int getInterpolation() { return 0; } /** * Returns the receiver's line attributes. * * @return the line attributes used for drawing lines * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.3 */ public LineAttributes getLineAttributes() { if (lineAttributes == null) { lineAttributes = new LineAttributes(0); } return lineAttributes; } /** * Returns the receiver's line cap style, which will be one of the constants * <code>SWT.CAP_FLAT</code>, <code>SWT.CAP_ROUND</code>, or * <code>SWT.CAP_SQUARE</code>. * * @return the cap style used for drawing lines * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int getLineCap() { return lineAttributes.cap; } /** * Returns the receiver's line dash style. The default value is * <code>null</code>. * * @return the line dash style used for drawing lines * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int[] getLineDash() { return null; } /** * Returns the receiver's line join style, which will be one of the * constants <code>SWT.JOIN_MITER</code>, <code>SWT.JOIN_ROUND</code>, or * <code>SWT.JOIN_BEVEL</code>. * * @return the join style used for drawing lines * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public int getLineJoin() { return lineAttributes.join; } /** * Returns the receiver's line style, which will be one of the constants * <code>SWT.LINE_SOLID</code>, <code>SWT.LINE_DASH</code>, * <code>SWT.LINE_DOT</code>, <code>SWT.LINE_DASHDOT</code> or * <code>SWT.LINE_DASHDOTDOT</code>. * * @return the style used for drawing lines * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public int getLineStyle() { return lineAttributes.style; } /** * Returns the width that will be used when drawing lines for all of the * figure drawing operations (that is, <code>drawLine</code>, * <code>drawRectangle</code>, <code>drawPolyline</code>, and so forth. * * @return the receiver's line width * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public int getLineWidth() { return (int) Math.ceil(this.lineAttributes.width); } /** * Returns the receiver's style information. * <p> * Note that the value which is returned by this method <em>may * not match</em> the value which was provided to the constructor when the * receiver was created. This can occur when the underlying operating system * does not support a particular combination of requested styles. * </p> * * @return the style bits * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 2.1.2 */ public int getStyle() { return 0; } /** * Returns the receiver's text drawing anti-aliasing setting value, which * will be one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or * <code>SWT.ON</code>. Note that this controls anti-aliasing <em>only</em> * for text drawing operations. * * @return the anti-aliasing setting * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #getAntialias * * @since 3.1 */ public int getTextAntialias() { return 0; } /** * Sets the parameter to the transform that is currently being used by the * receiver. * * @param transform * the destination to copy the transform into * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see Transform * * @since 3.1 */ public void getTransform(Transform transform) { } /** * Returns <code>true</code> if this GC is drawing in the mode where the * resulting color in the destination is the <em>exclusive or</em> of the * color values in the source and the destination, and <code>false</code> if * it is drawing in the mode where the destination color is being replaced * with the source color value. * * @return <code>true</code> true if the receiver is in XOR mode, and false * otherwise * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public boolean getXORMode() { return xorMode; } /** * Returns an integer hash code for the receiver. Any two objects that * return <code>true</code> when passed to <code>equals</code> must return * the same value for this method. * * @return the receiver's hash * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #equals */ public int hashCode() { return 0; } /** * Returns <code>true</code> if the receiver has a clipping region set into * it, and <code>false</code> otherwise. If this method returns false, the * receiver will draw on all available space in the destination. If it * returns true, it will draw only in the area that is covered by the region * that can be accessed with <code>getClipping(region)</code>. * * @return <code>true</code> if the GC has a clipping region, and * <code>false</code> otherwise * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public boolean isClipped() { return false; } /** * Returns <code>true</code> if the GC has been disposed, and * <code>false</code> otherwise. * <p> * This method gets the dispose state for the GC. When a GC has been * disposed, it is an error to invoke any other method (except * {@link #dispose()}) using the GC. * * @return <code>true</code> when the GC is disposed and <code>false</code> * otherwise */ public boolean isDisposed() { return false; } /** * Sets the receiver to always use the operating system's advanced graphics * subsystem for all graphics operations if the argument is * <code>true</code>. If the argument is <code>false</code>, the advanced * graphics subsystem is no longer used, advanced graphics state is cleared * and the normal graphics subsystem is used from now on. * <p> * Normally, the advanced graphics subsystem is invoked automatically when * any one of the alpha, antialias, patterns, interpolation, paths, clipping * or transformation operations in the receiver is requested. When the * receiver is switched into advanced mode, the advanced graphics subsystem * performs both advanced and normal graphics operations. Because the two * subsystems are different, their output may differ. Switching to advanced * graphics before any graphics operations are performed ensures that the * output is consistent. * </p> * <p> * Advanced graphics may not be installed for the operating system. In this * case, this operation does nothing. Some operating system have only one * graphics subsystem, so switching from normal to advanced graphics does * nothing. However, switching from advanced to normal graphics will always * clear the advanced graphics state, even for operating systems that have * only one graphics subsystem. * </p> * * @param advanced * the new advanced graphics state * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @see #setAlpha * @see #setAntialias * @see #setBackgroundPattern * @see #setClipping(Path) * @see #setForegroundPattern * @see #setLineAttributes * @see #setInterpolation * @see #setTextAntialias * @see #setTransform * @see #getAdvanced * * @since 3.1 */ public void setAdvanced(boolean advanced) { this.advanced = advanced; } /** * Sets the receiver's alpha value which must be between 0 (transparent) and * 255 (opaque). * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param alpha * the alpha value * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setAlpha(int alpha) { this.alphaInt = alpha; this.alpha = alpha / 255.0; setBackground(this.background); setForeground(this.foreground); } /** * Sets the receiver's anti-aliasing value to the parameter, which must be * one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or * <code>SWT.ON</code>. Note that this controls anti-aliasing for all * <em>non-text drawing</em> operations. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param antialias * the anti-aliasing setting * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the parameter is not one * of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or * <code>SWT.ON</code></li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see #getAdvanced * @see #setAdvanced * @see #setTextAntialias * * @since 3.1 */ public void setAntialias(int antialias) { this.antialias = antialias; } /** * Sets the background color. The background color is used for fill * operations and as the background color when text is drawn. * * @param color * the new background color for the receiver * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the color is null</li> * <li>ERROR_INVALID_ARGUMENT - if the color has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setBackground(Color color) { this.background = color; context2d.setFillStyle(toColorString(color)); fillStyle = context2d.getFillStyle(); } /** * Sets the background pattern. The default value is <code>null</code>. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param pattern * the new background pattern * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Pattern * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setBackgroundPattern(Pattern pattern) { } private boolean isClipped = false; /** * Sets the area of the receiver which can be changed by drawing operations * to the rectangular area specified by the arguments. * * @param x * the x coordinate of the clipping rectangle * @param y * the y coordinate of the clipping rectangle * @param width * the width of the clipping rectangle * @param height * the height of the clipping rectangle * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setClipping(int x, int y, int width, int height) { clipRect = new Rectangle(x, y, width, height); } /** * Sets the area of the receiver which can be changed by drawing operations * to the path specified by the argument. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param path * the clipping path. * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the path has been disposed * </li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Path * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setClipping(Path path) { } /** * Sets the area of the receiver which can be changed by drawing operations * to the rectangular area specified by the argument. Specifying * <code>null</code> for the rectangle reverts the receiver's clipping area * to its original value. * * @param rect * the clipping rectangle or <code>null</code> * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setClipping(Rectangle rect) { setClipping(rect.x, rect.y, rect.width, rect.height); } /** * Sets the area of the receiver which can be changed by drawing operations * to the region specified by the argument. Specifying <code>null</code> for * the region reverts the receiver's clipping area to its original value. * * @param region * the clipping region or <code>null</code> * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the region has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setClipping(Region region) { } /** * Sets the font which will be used by the receiver to draw and measure text * to the argument. If the argument is null, then a default font appropriate * for the platform will be used instead. * * @param font * the new font for the receiver, or null to indicate a default * font * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the font has been disposed * </li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setFont(Font font) { this.font = font; context2d.setFont(this.font.getFD().toString()); } /** * Sets the receiver's fill rule to the parameter, which must be one of * <code>SWT.FILL_EVEN_ODD</code> or <code>SWT.FILL_WINDING</code>. * * @param rule * the new fill rule * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the rule is not one of * <code>SWT.FILL_EVEN_ODD</code> or * <code>SWT.FILL_WINDING</code></li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public void setFillRule(int rule) { } /** * Sets the foreground color. The foreground color is used for drawing * operations including when text is drawn. * * @param color * the new foreground color for the receiver * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the color is null</li> * <li>ERROR_INVALID_ARGUMENT - if the color has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setForeground(Color color) { foreground = color; context2d.setStrokeStyle(toColorString(color)); } /** * Sets the foreground pattern. The default value is <code>null</code>. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param pattern * the new foreground pattern * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Pattern * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setForegroundPattern(Pattern pattern) { } /** * Sets the receiver's interpolation setting to the parameter, which must be * one of <code>SWT.DEFAULT</code>, <code>SWT.NONE</code>, * <code>SWT.LOW</code> or <code>SWT.HIGH</code>. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param interpolation * the new interpolation setting * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the rule is not one of * <code>SWT.DEFAULT</code>, <code>SWT.NONE</code>, * <code>SWT.LOW</code> or <code>SWT.HIGH</code> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setInterpolation(int interpolation) { } /** * Sets the receiver's line attributes. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param attributes * the line attributes * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the attributes is null</li> * <li>ERROR_INVALID_ARGUMENT - if any of the line attributes * is not valid</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see LineAttributes * @see #getAdvanced * @see #setAdvanced * * @since 3.3 */ public void setLineAttributes(LineAttributes attributes) { setLineWidth((int) attributes.width); } /** * Sets the receiver's line cap style to the argument, which must be one of * the constants <code>SWT.CAP_FLAT</code>, <code>SWT.CAP_ROUND</code>, or * <code>SWT.CAP_SQUARE</code>. * * @param cap * the cap style to be used for drawing lines * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public void setLineCap(int cap) { this.lineAttributes.cap = cap; } /** * Sets the receiver's line dash style to the argument. The default value is * <code>null</code>. If the argument is not <code>null</code>, the * receiver's line style is set to <code>SWT.LINE_CUSTOM</code>, otherwise * it is set to <code>SWT.LINE_SOLID</code>. * * @param dashes * the dash style to be used for drawing lines * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if any of the values in the * array is less than or equal 0</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public void setLineDash(int[] dashes) { } /** * Sets the receiver's line join style to the argument, which must be one of * the constants <code>SWT.JOIN_MITER</code>, <code>SWT.JOIN_ROUND</code>, * or <code>SWT.JOIN_BEVEL</code>. * * @param join * the join style to be used for drawing lines * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @since 3.1 */ public void setLineJoin(int join) { this.lineAttributes.join = join; } /** * Sets the receiver's line style to the argument, which must be one of the * constants <code>SWT.LINE_SOLID</code>, <code>SWT.LINE_DASH</code>, * <code>SWT.LINE_DOT</code>, <code>SWT.LINE_DASHDOT</code> or * <code>SWT.LINE_DASHDOTDOT</code>. * * @param lineStyle * the style to be used for drawing lines * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setLineStyle(int lineStyle) { this.lineAttributes.style = lineStyle; } /** * Sets the width that will be used when drawing lines for all of the figure * drawing operations (that is, <code>drawLine</code>, * <code>drawRectangle</code>, <code>drawPolyline</code>, and so forth. * <p> * Note that line width of zero is used as a hint to indicate that the * fastest possible line drawing algorithms should be used. This means that * the output may be different from line width one. * </p> * * @param lineWidth * the width of a line * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public void setLineWidth(int lineWidth) { this.lineAttributes.width = lineWidth; context2d.setLineWidth(lineWidth); } /** * Sets the receiver's text anti-aliasing value to the parameter, which must * be one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or * <code>SWT.ON</code>. Note that this controls anti-aliasing only for all * <em>text drawing</em> operations. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param antialias * the anti-aliasing setting * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the parameter is not one * of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or * <code>SWT.ON</code></li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see #getAdvanced * @see #setAdvanced * @see #setAntialias * * @since 3.1 */ public void setTextAntialias(int antialias) { } /** * Sets the transform that is currently being used by the receiver. If the * argument is <code>null</code>, the current transform is set to the * identity transform. * <p> * This operation requires the operating system's advanced graphics * subsystem which may not be available on some platforms. * </p> * * @param transform * the transform to set * * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the parameter has been * disposed</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are * not available</li> * </ul> * * @see Transform * @see #getAdvanced * @see #setAdvanced * * @since 3.1 */ public void setTransform(Transform transform) { if (transform != null) { double[] matrix = transform.getMatrix(); double m11 = matrix[0]; double m12 = matrix[2]; double m21 = matrix[1]; double m22 = matrix[3]; double dx = matrix[4]; double dy = matrix[5]; context2d.setTransform(m11, m12, m21, m22, dx, dy); this.transform = transform; } else { context2d.setTransform(1, 0, 0, 1, 0, 0); this.transform = new Transform(null); } // if (transform != null) { // if(transform.getMatrix() ! = null) // for (int i = 0; i < 6; i++) { // System.out.print(transform.getMatrix()[i] + ", "); // } // } // transform.getElements(new) // for (int i = 0; i < 6; i++) { // System.out.print(transform.getMatrix()[i] + ", "); // } } /** * If the argument is <code>true</code>, puts the receiver in a drawing mode * where the resulting color in the destination is the <em>exclusive or</em> * of the color values in the source and the destination, and if the * argument is <code>false</code>, puts the receiver in a drawing mode where * the destination color is replaced with the source color value. * <p> * Note that this mode in fundamentally unsupportable on certain platforms, * notably Carbon (Mac OS X). Clients that want their code to run on all * platforms need to avoid this method. * </p> * * @param xor * if <code>true</code>, then <em>xor</em> mode is used, * otherwise <em>source copy</em> mode is used * * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> * * @deprecated this functionality is not supported on some platforms */ public void setXORMode(boolean xor) { this.xorMode = xor; if (xorMode) { setAlpha(127); } else { setAlpha(255); } } /** * Returns the extent of the given string. No tab expansion or carriage * return processing will be performed. * <p> * The <em>extent</em> of a string is the width and height of the * rectangular area it would cover if drawn in a particular font (in this * case, the current font in the receiver). * </p> * * @param string * the string to measure * @return a point containing the extent of the string * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Point stringExtent(String string) { return new Point((int) Math.ceil(context2d.measureText(string) .getWidth()), getFont().getFD().getHeight()); } /** * Returns the extent of the given string. Tab expansion and carriage return * processing are performed. * <p> * The <em>extent</em> of a string is the width and height of the * rectangular area it would cover if drawn in a particular font (in this * case, the current font in the receiver). * </p> * * @param string * the string to measure * @return a point containing the extent of the string * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Point textExtent(String string) { return textExtent(string, SWT.DRAW_DELIMITER | SWT.DRAW_TAB); } /** * Returns the extent of the given string. Tab expansion, line delimiter and * mnemonic processing are performed according to the specified flags, which * can be a combination of: * <dl> * <dt><b>DRAW_DELIMITER</b></dt> * <dd>draw multiple lines</dd> * <dt><b>DRAW_TAB</b></dt> * <dd>expand tabs</dd> * <dt><b>DRAW_MNEMONIC</b></dt> * <dd>underline the mnemonic character</dd> * <dt><b>DRAW_TRANSPARENT</b></dt> * <dd>transparent background</dd> * </dl> * <p> * The <em>extent</em> of a string is the width and height of the * rectangular area it would cover if drawn in a particular font (in this * case, the current font in the receiver). * </p> * * @param string * the string to measure * @param flags * the flags specifying how to process the text * @return a point containing the extent of the string * * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the string is null</li> * </ul> * @exception SWTException * <ul> * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been * disposed</li> * </ul> */ public Point textExtent(String string, int flags) { String font = context2d.getFont(); int textWidth; if (font != null) { String[] fontSplit = font.split(" "); for (String string2 : fontSplit) { if (string2.endsWith("px")) { fontSize = Integer.parseInt(string2.split("px")[0]); } } } else { fontSize = 10; } if (true) { textWidth = (int) Math.ceil(context2d.measureText(string) .getWidth()); } return new Point(textWidth, fontSize); } private String toColorString(Color c) { return "rgba(" + c.getRed() + "," + c.getGreen() + "," + c.getBlue() + "," + (this.alpha * c.getAlpha()) + ")"; } /** * Returns a string containing a concise, human-readable description of the * receiver. * * @return a string representation of the receiver */ public String toString() { return "GC"; } private void reInitContext2d() { if (CLIP) { if (clipRect != null) { context2d.beginPath(); context2d.rect(clipRect.x, clipRect.y, clipRect.width, clipRect.height); context2d.closePath(); context2d.clip(); } } Style canvasStyle = context2d.getCanvas().getStyle(); String isDirty = canvasStyle.getProperty("DIRTY"); if (isDirty != null && isDirty.equals("dirty")) { if (fillStyle != null) { context2d.setFillStyle(fillStyle); } context2d.setFont(font.getFD().toString()); context2d.setStrokeStyle(toColorString(foreground)); context2d.setLineWidth(this.lineAttributes.width); if (transform != null) { double[] matrix = transform.getMatrix(); double m11 = matrix[0]; double m21 = matrix[1]; double m12 = matrix[2]; double m22 = matrix[3]; double dx = matrix[4]; double dy = matrix[5]; context2d.setTransform(m11, m12, m21, m22, dx, dy); } canvasStyle.setProperty("DIRTY", "clean"); context2d.save(); } } public Context2d getContext2d() { return context2d; } private void debugContext2d() { System.out.println("FillStyle = " + context2d.getFillStyle()); System.out.println("StrokeStyle = " + context2d.getStrokeStyle()); System.out.println("LineWidth = " + context2d.getLineWidth()); } public void setFillStyle(int x, int y, Color bgc, int width, int height, Color transformColor) { CanvasGradient grad = context2d.createLinearGradient(x, y, width, height); grad.addColorStop(0, toColorString(bgc)); grad.addColorStop(1, toColorString(transformColor)); context2d.setFillStyle(grad); fillStyle = grad; } private void testPaint() { context2d.save(); CanvasGradient grad = context2d.createLinearGradient(0, 500, 0, 600); grad.addColorStop(0, toColorString(background)); grad.addColorStop(1, toColorString(foreground)); context2d.setFillStyle(grad); context2d.fillRect(100, 500, 100, 100); context2d.restore(); } public static void addCairoString(long handle2, String string, float x, float y, Font font2) { } }