summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics
diff options
context:
space:
mode:
authorFelipe Heidrich <fheidric>2009-06-30 22:00:12 +0000
committerFelipe Heidrich <fheidric>2009-06-30 22:00:12 +0000
commitf664d297f7bb009784868bf3fcf0b3e3bb9a646b (patch)
tree54012fe4929893eef4891c88cbbf5841272ff433 /bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics
parentbc18a5e014088ce811f09c603b88361094486062 (diff)
downloadeclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.tar.gz
eclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.tar.xz
eclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.zip
*** empty log message ***
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics')
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java266
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java467
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java748
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java23
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java370
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java447
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java133
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java3918
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java63
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java1192
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java759
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java217
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java839
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java1980
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java477
15 files changed, 0 insertions, 11899 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java
deleted file mode 100755
index dc1823530d..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.*;
-
-/**
- * Instances of this class manage the operating system resources that
- * implement SWT's RGB color model. To create a color you can either
- * specify the individual color components as integers in the range
- * 0 to 255 or provide an instance of an <code>RGB</code>.
- * <p>
- * Application code must explicitly invoke the <code>Color.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- *
- * @see RGB
- * @see Device#getSystemColor
- * @see <a href="http://www.eclipse.org/swt/snippets/#color">Color and RGB snippets</a>
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: PaintExample</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public final class Color extends Resource {
- /**
- * the handle to the OS color resource
- * (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>
- */
- public float /*double*/ [] handle;
-
-Color(Device device) {
- super(device);
-}
-
-/**
- * Constructs a new instance of this class given a device and the
- * desired red, green and blue values expressed as ints in the range
- * 0 to 255 (where 0 is black and 255 is full brightness). On limited
- * color devices, the color instance created by this call may not have
- * the same RGB values as the ones specified by the arguments. The
- * RGB values on the returned instance will be the color values of
- * the operating system color.
- * <p>
- * You must dispose the color when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the color
- * @param red the amount of red in the color
- * @param green the amount of green in the color
- * @param blue the amount of blue in the color
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_INVALID_ARGUMENT - if the red, green or blue argument is not between 0 and 255</li>
- * </ul>
- *
- * @see #dispose
- */
-public Color(Device device, int red, int green, int blue) {
- super(device);
- init(red, green, blue);
- init();
-}
-
-/**
- * Constructs a new instance of this class given a device and an
- * <code>RGB</code> describing the desired red, green and blue values.
- * On limited color devices, the color instance created by this call
- * may not have the same RGB values as the ones specified by the
- * argument. The RGB values on the returned instance will be the color
- * values of the operating system color.
- * <p>
- * You must dispose the color when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the color
- * @param rgb the RGB values of the desired color
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the rgb argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the red, green or blue components of the argument are not between 0 and 255</li>
- * </ul>
- *
- * @see #dispose
- */
-public Color(Device device, RGB rgb) {
- super(device);
- if (rgb == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- init(rgb.red, rgb.green, rgb.blue);
- init();
-}
-
-void destroy() {
- handle = null;
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof Color)) return false;
- Color color = (Color)object;
- float /*double*/ [] rgbColor = color.handle;
- if (handle == rgbColor) return true;
- return device == color.device &&
- (int)(handle[0] * 255) == (int)(rgbColor[0] * 255) &&
- (int)(handle[1] * 255) == (int)(rgbColor[1] * 255) &&
- (int)(handle[2] * 255) == (int)(rgbColor[2] * 255);
-}
-
-/**
- * Returns the amount of blue in the color, from 0 to 255.
- *
- * @return the blue component of the color
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getBlue() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return (int)(handle[2] * 255);
-}
-
-/**
- * Returns the amount of green in the color, from 0 to 255.
- *
- * @return the green component of the color
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getGreen() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return (int)(handle[1] * 255);
-}
-
-/**
- * Returns the amount of red in the color, from 0 to 255.
- *
- * @return the red component of the color
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getRed() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return (int)(handle[0] * 255);
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode() {
- if (isDisposed()) return 0;
- return (int)(handle[0] * 255) ^ (int)(handle[1] * 255) ^ (int)(handle[2] * 255);
-}
-
-/**
- * Returns an <code>RGB</code> representing the receiver.
- *
- * @return the RGB for the color
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public RGB getRGB () {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return new RGB(getRed(), getGreen(), getBlue());
-}
-
-/**
- * Invokes platform specific functionality to allocate a new color.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Color</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>
- *
- * @param device the device on which to allocate the color
- * @param handle the handle for the color
- *
- * @private
- */
-public static Color cocoa_new(Device device, float /*double*/ [] rgbColor) {
- Color color = new Color(device);
- color.handle = rgbColor;
- return color;
-}
-
-void init(int red, int green, int blue) {
- if ((red > 255) || (red < 0) ||
- (green > 255) || (green < 0) ||
- (blue > 255) || (blue < 0)) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- float /*double*/ [] rgbColor = new float /*double*/ [4];
- rgbColor[0] = red / 255f;
- rgbColor[1] = green / 255f;
- rgbColor[2] = blue / 255f;
- rgbColor[3] = 1;
- handle = rgbColor;
-}
-
-/**
- * Returns <code>true</code> if the color has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the color.
- * When a color has been disposed, it is an error to
- * invoke any other method using the color.
- *
- * @return <code>true</code> when the color is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Color {*DISPOSED*}";
- return "Color {" + getRed() + ", " + getGreen() + ", " + getBlue() + "}";
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java
deleted file mode 100755
index 64e4531750..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.*;
-
-/**
- * Instances of this class manage operating system resources that
- * specify the appearance of the on-screen pointer. To create a
- * cursor you specify the device and either a simple cursor style
- * describing one of the standard operating system provided cursors
- * or the image and mask data for the desired appearance.
- * <p>
- * Application code must explicitly invoke the <code>Cursor.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>
- * CURSOR_ARROW, CURSOR_WAIT, CURSOR_CROSS, CURSOR_APPSTARTING, CURSOR_HELP,
- * CURSOR_SIZEALL, CURSOR_SIZENESW, CURSOR_SIZENS, CURSOR_SIZENWSE, CURSOR_SIZEWE,
- * CURSOR_SIZEN, CURSOR_SIZES, CURSOR_SIZEE, CURSOR_SIZEW, CURSOR_SIZENE, CURSOR_SIZESE,
- * CURSOR_SIZESW, CURSOR_SIZENW, CURSOR_UPARROW, CURSOR_IBEAM, CURSOR_NO, CURSOR_HAND
- * </dd>
- * </dl>
- * <p>
- * Note: Only one of the above styles may be specified.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/snippets/#cursor">Cursor snippets</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-
-public final class Cursor extends Resource {
-
- static final byte[] WAIT_SOURCE = new byte[] {
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
- };
-
- /**
- * the handle to the OS cursor resource
- * (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>
- */
- public NSCursor handle;
-
-/**
- * Prevents uninitialized instances from being created outside the package.
- */
-Cursor(Device device) {
- super(device);
-}
-
-/**
- * Constructs a new cursor given a device and a style
- * constant describing the desired cursor appearance.
- * <p>
- * You must dispose the cursor when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the cursor
- * @param style the style of cursor to allocate
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_INVALID_ARGUMENT - when an unknown style is specified</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li>
- * </ul>
- *
- * @see SWT#CURSOR_ARROW
- * @see SWT#CURSOR_WAIT
- * @see SWT#CURSOR_CROSS
- * @see SWT#CURSOR_APPSTARTING
- * @see SWT#CURSOR_HELP
- * @see SWT#CURSOR_SIZEALL
- * @see SWT#CURSOR_SIZENESW
- * @see SWT#CURSOR_SIZENS
- * @see SWT#CURSOR_SIZENWSE
- * @see SWT#CURSOR_SIZEWE
- * @see SWT#CURSOR_SIZEN
- * @see SWT#CURSOR_SIZES
- * @see SWT#CURSOR_SIZEE
- * @see SWT#CURSOR_SIZEW
- * @see SWT#CURSOR_SIZENE
- * @see SWT#CURSOR_SIZESE
- * @see SWT#CURSOR_SIZESW
- * @see SWT#CURSOR_SIZENW
- * @see SWT#CURSOR_UPARROW
- * @see SWT#CURSOR_IBEAM
- * @see SWT#CURSOR_NO
- * @see SWT#CURSOR_HAND
- */
-public Cursor(Device device, int style) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- switch (style) {
- case SWT.CURSOR_HAND: handle = NSCursor.pointingHandCursor(); break;
- case SWT.CURSOR_ARROW: handle = NSCursor.arrowCursor(); break;
- case SWT.CURSOR_WAIT: break;
- case SWT.CURSOR_CROSS: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_APPSTARTING: handle = NSCursor.arrowCursor(); break;
- case SWT.CURSOR_HELP: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZEALL: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZENESW: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZENS: handle = NSCursor.resizeUpDownCursor(); break;
- case SWT.CURSOR_SIZENWSE: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZEWE: handle = NSCursor.resizeLeftRightCursor(); break;
- case SWT.CURSOR_SIZEN: handle = NSCursor.resizeUpCursor(); break;
- case SWT.CURSOR_SIZES: handle = NSCursor.resizeDownCursor(); break;
- case SWT.CURSOR_SIZEE: handle = NSCursor.resizeRightCursor(); break;
- case SWT.CURSOR_SIZEW: handle = NSCursor.resizeLeftCursor(); break;
- case SWT.CURSOR_SIZENE: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZESE: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZESW: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_SIZENW: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_UPARROW: handle = NSCursor.crosshairCursor(); break;
- case SWT.CURSOR_IBEAM: handle = NSCursor.IBeamCursor(); break;
- case SWT.CURSOR_NO: handle = NSCursor.crosshairCursor(); break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- if (handle == null && style == SWT.CURSOR_WAIT) {
- NSImage nsImage = (NSImage)new NSImage().alloc();
- NSBitmapImageRep nsImageRep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- handle = (NSCursor)new NSCursor().alloc();
- int width = 16, height = 16;
- NSSize size = new NSSize();
- size.width = width;
- size.height = height;
- nsImage = nsImage.initWithSize(size);
- nsImageRep = nsImageRep.initWithBitmapDataPlanes(0, width, height, 8, 4, true, false, OS.NSDeviceRGBColorSpace,
- OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width*4, 32);
- OS.memmove(nsImageRep.bitmapData(), WAIT_SOURCE, WAIT_SOURCE.length);
- nsImage.addRepresentation(nsImageRep);
- NSPoint point = new NSPoint();
- point.x = 0;
- point.y = 0;
- handle = handle.initWithImage(nsImage, point);
- nsImageRep.release();
- nsImage.release();
- } else {
- handle.retain();
- }
- handle.setOnMouseEntered(true);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new cursor given a device, image and mask
- * data describing the desired cursor appearance, and the x
- * and y coordinates of the <em>hotspot</em> (that is, the point
- * within the area covered by the cursor which is considered
- * to be where the on-screen pointer is "pointing").
- * <p>
- * The mask data is allowed to be null, but in this case the source
- * must be an ImageData representing an icon that specifies both
- * color data and mask data.
- * <p>
- * You must dispose the cursor when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the cursor
- * @param source the color data for the cursor
- * @param mask the mask data for the cursor (or null)
- * @param hotspotX the x coordinate of the cursor's hotspot
- * @param hotspotY the y coordinate of the cursor's hotspot
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the source is null</li>
- * <li>ERROR_NULL_ARGUMENT - if the mask is null and the source does not have a mask</li>
- * <li>ERROR_INVALID_ARGUMENT - if the source and the mask are not the same
- * size, or if the hotspot is outside the bounds of the image</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li>
- * </ul>
- */
-public Cursor(Device device, ImageData source, ImageData mask, int hotspotX, int hotspotY) {
- super(device);
- if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (mask == null) {
- if (source.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
- SWT.error(SWT.ERROR_NULL_ARGUMENT);
- }
- mask = source.getTransparencyMask();
- }
- /* Check the bounds. Mask must be the same size as source */
- if (mask.width != source.width || mask.height != source.height) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- /* Check the hotspots */
- if (hotspotX >= source.width || hotspotX < 0 ||
- hotspotY >= source.height || hotspotY < 0) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- byte[] data = new byte[source.width * source.height * 4];
- for (int y = 0; y < source.height; y++) {
- int offset = y * source.width * 4;
- for (int x = 0; x < source.width; x++) {
- int pixel = source.getPixel(x, y);
- int maskPixel = mask.getPixel(x, y);
- if (pixel == 0 && maskPixel == 0) {
- // BLACK
- data[offset] = (byte)0xFF;
- } else if (pixel == 0 && maskPixel == 1) {
- // WHITE - cursor color
- data[offset] = data[offset + 1] = data[offset + 2] = data[offset + 3] = (byte)0xFF;
- } else if (pixel == 1 && maskPixel == 0) {
- // SCREEN
- } else {
- /*
- * Feature in the Macintosh. It is not possible to have
- * the reverse screen case using NSCursor.
- * Reverse screen will be the same as screen.
- */
- // REVERSE SCREEN -> SCREEN
- }
- offset += 4;
- }
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- createNSCursor(hotspotX, hotspotY, data, source.width, source.height);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void createNSCursor(int hotspotX, int hotspotY, byte[] buffer, int width, int height) {
- NSImage nsImage = (NSImage)new NSImage().alloc();
- NSBitmapImageRep nsImageRep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- handle = (NSCursor)new NSCursor().alloc();
- NSSize size = new NSSize();
- size.width = width;
- size.height = height;
- nsImage = nsImage.initWithSize(size);
- nsImageRep = nsImageRep.initWithBitmapDataPlanes(0, width, height,
- 8, 4, true, false, new NSString(OS.NSDeviceRGBColorSpace()),
- OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width * 4, 32);
- OS.memmove(nsImageRep.bitmapData(), buffer, buffer.length);
- nsImage.addRepresentation(nsImageRep);
- NSPoint point = new NSPoint();
- point.x = hotspotX;
- point.y = hotspotY;
- handle = handle.initWithImage(nsImage, point);
- nsImageRep.release();
- nsImage.release();
-}
-
-/**
- * Constructs a new cursor given a device, image data describing
- * the desired cursor appearance, and the x and y coordinates of
- * the <em>hotspot</em> (that is, the point within the area
- * covered by the cursor which is considered to be where the
- * on-screen pointer is "pointing").
- * <p>
- * You must dispose the cursor when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the cursor
- * @param source the image data for the cursor
- * @param hotspotX the x coordinate of the cursor's hotspot
- * @param hotspotY the y coordinate of the cursor's hotspot
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the image is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the hotspot is outside the bounds of the
- * image</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li>
- * </ul>
- *
- * @since 3.0
- */
-public Cursor(Device device, ImageData source, int hotspotX, int hotspotY) {
- super(device);
- if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (hotspotX >= source.width || hotspotX < 0 ||
- hotspotY >= source.height || hotspotY < 0) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- byte[] data = new byte[source.width * source.height * 4];
- PaletteData palette = source.palette;
- if (palette.isDirect) {
- ImageData.blit(ImageData.BLIT_SRC,
- source.data, source.depth, source.bytesPerLine, source.getByteOrder(), 0, 0, source.width, source.height, palette.redMask, palette.greenMask, palette.blueMask,
- ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
- data, 32, source.width * 4, ImageData.MSB_FIRST, 0, 0, source.width, source.height, 0xFF0000, 0xFF00, 0xFF,
- false, false);
- } else {
- RGB[] rgbs = palette.getRGBs();
- int length = rgbs.length;
- byte[] srcReds = new byte[length];
- byte[] srcGreens = new byte[length];
- byte[] srcBlues = new byte[length];
- for (int i = 0; i < rgbs.length; i++) {
- RGB rgb = rgbs[i];
- if (rgb == null) continue;
- srcReds[i] = (byte)rgb.red;
- srcGreens[i] = (byte)rgb.green;
- srcBlues[i] = (byte)rgb.blue;
- }
- ImageData.blit(ImageData.BLIT_SRC,
- source.data, source.depth, source.bytesPerLine, source.getByteOrder(), 0, 0, source.width, source.height, srcReds, srcGreens, srcBlues,
- ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
- data, 32, source.width * 4, ImageData.MSB_FIRST, 0, 0, source.width, source.height, 0xFF0000, 0xFF00, 0xFF,
- false, false);
- }
- if (source.maskData != null || source.transparentPixel != -1) {
- ImageData mask = source.getTransparencyMask();
- byte[] maskData = mask.data;
- int maskBpl = mask.bytesPerLine;
- int offset = 0, maskOffset = 0;
- for (int y = 0; y<source.height; y++) {
- for (int x = 0; x<source.width; x++) {
- data[offset] = ((maskData[maskOffset + (x >> 3)]) & (1 << (7 - (x & 0x7)))) != 0 ? (byte)0xff : 0;
- offset += 4;
- }
- maskOffset += maskBpl;
- }
- } else if (source.alpha != -1) {
- byte alpha = (byte)source.alpha;
- for (int i=0; i<data.length; i+=4) {
- data[i] = alpha;
- }
- } else if (source.alphaData != null) {
- byte[] alphaData = source.alphaData;
- for (int i=0; i<data.length; i+=4) {
- data[i] = alphaData[i/4];
- }
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- createNSCursor(hotspotX, hotspotY, data, source.width, source.height);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void destroy() {
- handle.release();
- handle = null;
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof Cursor)) return false;
- Cursor cursor = (Cursor) object;
- return device == cursor.device && handle == cursor.handle;
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode () {
- return handle != null ? (int)/*64*/handle.id : 0;
-}
-
-/**
- * Returns <code>true</code> if the cursor has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the cursor.
- * When a cursor has been disposed, it is an error to
- * invoke any other method using the cursor.
- *
- * @return <code>true</code> when the cursor is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Cursor {*DISPOSED*}";
- return "Cursor {" + handle + "}";
-}
-
-/**
- * Invokes platform specific functionality to allocate a new cursor.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Cursor</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>
- *
- * @param device the device on which to allocate the color
- * @param handle the handle for the cursor
- *
- * @private
- */
-public static Cursor cocoa_new(Device device, NSCursor handle) {
- Cursor cursor = new Cursor(device);
- cursor.handle = handle;
- return cursor;
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java
deleted file mode 100755
index 932e1d49f6..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java
+++ /dev/null
@@ -1,748 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.Compatibility;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * This class is the abstract superclass of all device objects,
- * such as the Display device and the Printer device. Devices
- * can have a graphics context (GC) created for them, and they
- * can be drawn on by sending messages to the associated GC.
- *
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public abstract class Device implements Drawable {
-
- /* Debugging */
- public static boolean DEBUG;
- boolean debug = DEBUG;
- boolean tracking = DEBUG;
- Error [] errors;
- Object [] objects;
- Object trackingLock;
-
- /* Disposed flag */
- boolean disposed, warnings;
-
- Color COLOR_BLACK, COLOR_DARK_RED, COLOR_DARK_GREEN, COLOR_DARK_YELLOW, COLOR_DARK_BLUE;
- Color COLOR_DARK_MAGENTA, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY, COLOR_RED;
- Color COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE;
-
- /* System Font */
- Font systemFont;
-
- NSMutableParagraphStyle paragraphStyle;
-
- /* Device DPI */
- Point dpi;
-
- /*
- * TEMPORARY CODE. When a graphics object is
- * created and the device parameter is null,
- * the current Display is used. This presents
- * a problem because SWT graphics does not
- * reference classes in SWT widgets. The correct
- * fix is to remove this feature. Unfortunately,
- * too many application programs rely on this
- * feature.
- */
- protected static Device CurrentDevice;
- protected static Runnable DeviceFinder;
- static {
- try {
- Class.forName ("org.eclipse.swt.widgets.Display");
- } catch (ClassNotFoundException e) {}
- }
-
-/*
-* TEMPORARY CODE.
-*/
-static synchronized Device getDevice () {
- if (DeviceFinder != null) DeviceFinder.run();
- Device device = CurrentDevice;
- CurrentDevice = null;
- return device;
-}
-
-/**
- * Constructs a new instance of this class.
- * <p>
- * You must dispose the device when it is no longer required.
- * </p>
- *
- * @see #create
- * @see #init
- *
- * @since 3.1
- */
-public Device() {
- this(null);
-}
-
-/**
- * Constructs a new instance of this class.
- * <p>
- * You must dispose the device when it is no longer required.
- * </p>
- *
- * @param data the DeviceData which describes the receiver
- *
- * @see #create
- * @see #init
- * @see DeviceData
- */
-public Device(DeviceData data) {
- synchronized (Device.class) {
- if (data != null) {
- debug = data.debug;
- tracking = data.tracking;
- }
- if (tracking) {
- errors = new Error [128];
- objects = new Object [128];
- trackingLock = new Object ();
- }
- if (NSThread.isMainThread()) {
- NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- NSThread nsthread = NSThread.currentThread();
- NSMutableDictionary dictionary = nsthread.threadDictionary();
- NSString key = NSString.stringWith("SWT_NSAutoreleasePool");
- id obj = dictionary.objectForKey(key);
- if (obj == null) {
- NSNumber nsnumber = NSNumber.numberWithInteger(pool.id);
- dictionary.setObject(nsnumber, key);
- } else {
- pool.release();
- }
- }
- //check and create pool
- create (data);
- init ();
- }
-}
-
-/**
- * Throws an <code>SWTException</code> if the receiver can not
- * be accessed by the caller. This may include both checks on
- * the state of the receiver and more generally on the entire
- * execution context. This method <em>should</em> be called by
- * device implementors to enforce the standard SWT invariants.
- * <p>
- * Currently, it is an error to invoke any method (other than
- * <code>isDisposed()</code> and <code>dispose()</code>) on a
- * device that has had its <code>dispose()</code> method called.
- * </p><p>
- * In future releases of SWT, there may be more or fewer error
- * checks and exceptions may be thrown for different reasons.
- * <p>
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-protected void checkDevice () {
- if (disposed) SWT.error(SWT.ERROR_DEVICE_DISPOSED);
-}
-
-/**
- * Creates the device in the operating system. If the device
- * does not have a handle, this method may do nothing depending
- * on the device.
- * <p>
- * This method is called before <code>init</code>.
- * </p><p>
- * Subclasses are supposed to reimplement this method and not
- * call the <code>super</code> implementation.
- * </p>
- *
- * @param data the DeviceData which describes the receiver
- *
- * @see #init
- */
-protected void create (DeviceData data) {
-}
-
-/**
- * Disposes of the operating system resources associated with
- * the receiver. After this method has been invoked, the receiver
- * will answer <code>true</code> when sent the message
- * <code>isDisposed()</code>.
- *
- * @see #release
- * @see #destroy
- * @see #checkDevice
- */
-public void dispose () {
- synchronized (Device.class) {
- if (isDisposed()) return;
- checkDevice ();
- release ();
- destroy ();
- disposed = true;
- if (tracking) {
- synchronized (trackingLock) {
- printErrors ();
- objects = null;
- errors = null;
- trackingLock = null;
- }
- }
- }
-}
-
-void dispose_Object (Object object) {
- synchronized (trackingLock) {
- for (int i=0; i<objects.length; i++) {
- if (objects [i] == object) {
- objects [i] = null;
- errors [i] = null;
- return;
- }
- }
- }
-}
-
-/**
- * Destroys the device in the operating system and releases
- * the device's handle. If the device does not have a handle,
- * this method may do nothing depending on the device.
- * <p>
- * This method is called after <code>release</code>.
- * </p><p>
- * Subclasses are supposed to reimplement this method and not
- * call the <code>super</code> implementation.
- * </p>
- *
- * @see #dispose
- * @see #release
- */
-protected void destroy () {
-}
-
-/**
- * Returns a rectangle describing the receiver's size and location.
- *
- * @return the bounding rectangle
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Rectangle getBounds () {
- checkDevice ();
- NSRect frame = getPrimaryScreen().frame();
- return new Rectangle((int)frame.x, (int)frame.y, (int)frame.width, (int)frame.height);
-}
-
-/**
- * Returns a <code>DeviceData</code> based on the receiver.
- * Modifications made to this <code>DeviceData</code> will not
- * affect the receiver.
- *
- * @return a <code>DeviceData</code> containing the device's data and attributes
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see DeviceData
- */
-public DeviceData getDeviceData () {
- checkDevice();
- DeviceData data = new DeviceData ();
- data.debug = debug;
- data.tracking = tracking;
- if (tracking) {
- synchronized (trackingLock) {
- int count = 0, length = objects.length;
- for (int i=0; i<length; i++) {
- if (objects [i] != null) count++;
- }
- int index = 0;
- data.objects = new Object [count];
- data.errors = new Error [count];
- for (int i=0; i<length; i++) {
- if (objects [i] != null) {
- data.objects [index] = objects [i];
- data.errors [index] = errors [i];
- index++;
- }
- }
- }
- } else {
- data.objects = new Object [0];
- data.errors = new Error [0];
- }
- return data;
-}
-
-/**
- * Returns a rectangle which describes the area of the
- * receiver which is capable of displaying data.
- *
- * @return the client area
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getBounds
- */
-public Rectangle getClientArea () {
- checkDevice ();
- return getBounds ();
-}
-
-/**
- * Returns the bit depth of the screen, which is the number of
- * bits it takes to represent the number of unique colors that
- * the screen is currently capable of displaying. This number
- * will typically be one of 1, 8, 15, 16, 24 or 32.
- *
- * @return the depth of the screen
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getDepth () {
- checkDevice ();
- return (int)/*64*/OS.NSBitsPerPixelFromDepth(getPrimaryScreen().depth());
-}
-
-/**
- * Returns a point whose x coordinate is the horizontal
- * dots per inch of the display, and whose y coordinate
- * is the vertical dots per inch of the display.
- *
- * @return the horizontal and vertical DPI
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Point getDPI () {
- checkDevice ();
- return getScreenDPI();
-}
-
-NSScreen getPrimaryScreen () {
- NSArray screens = NSScreen.screens();
- return new NSScreen(screens.objectAtIndex(0));
-}
-
-/**
- * Returns <code>FontData</code> objects which describe
- * the fonts that match the given arguments. If the
- * <code>faceName</code> is null, all fonts will be returned.
- *
- * @param faceName the name of the font to look for, or null
- * @param scalable if true only scalable fonts are returned, otherwise only non-scalable fonts are returned.
- * @return the matching font data
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public FontData[] getFontList (String faceName, boolean scalable) {
- checkDevice ();
- if (!scalable) return new FontData[0];
- int count = 0;
- NSArray families = NSFontManager.sharedFontManager().availableFontFamilies();
- int /*long*/ familyCount = families.count();
- FontData[] fds = new FontData[100];
- for (int i = 0; i < familyCount; i++) {
- NSString nsFamily = new NSString(families.objectAtIndex(i));
- String name = nsFamily.getString();
- NSArray fonts = NSFontManager.sharedFontManager().availableMembersOfFontFamily(nsFamily);
- int fontCount = (int)/*64*/fonts.count();
- for (int j = 0; j < fontCount; j++) {
- NSArray fontDetails = new NSArray(fonts.objectAtIndex(j));
- String nsName = new NSString(fontDetails.objectAtIndex(0)).getString();
- int /*long*/ weight = new NSNumber(fontDetails.objectAtIndex(2)).integerValue();
- int /*long*/ traits = new NSNumber(fontDetails.objectAtIndex(3)).integerValue();
- int style = SWT.NORMAL;
- if ((traits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC;
- if (weight == 9) style |= SWT.BOLD;
- if (faceName == null || Compatibility.equalsIgnoreCase(faceName, name)) {
- FontData data = new FontData(name, 0, style);
- data.nsName = nsName;
- if (count == fds.length) {
- FontData[] newFds = new FontData[fds.length + 100];
- System.arraycopy(fds, 0, newFds, 0, fds.length);
- fds = newFds;
- }
- fds[count++] = data;
- }
- }
- }
- if (count == fds.length) return fds;
- FontData[] result = new FontData[count];
- System.arraycopy(fds, 0, result, 0, count);
- return result;
-}
-
-Point getScreenDPI () {
- NSDictionary dictionary = getPrimaryScreen().deviceDescription();
- NSValue value = new NSValue(dictionary.objectForKey(new id(OS.NSDeviceResolution())).id);
- NSSize size = value.sizeValue();
- return new Point((int)size.width, (int)size.height);
-}
-
-/**
- * Returns the matching standard color for the given
- * constant, which should be one of the color constants
- * specified in class <code>SWT</code>. Any value other
- * than one of the SWT color constants which is passed
- * in will result in the color black. This color should
- * not be freed because it was allocated by the system,
- * not the application.
- *
- * @param id the color constant
- * @return the matching color
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see SWT
- */
-public Color getSystemColor (int id) {
- checkDevice ();
- switch (id) {
- case SWT.COLOR_BLACK: return COLOR_BLACK;
- case SWT.COLOR_DARK_RED: return COLOR_DARK_RED;
- case SWT.COLOR_DARK_GREEN: return COLOR_DARK_GREEN;
- case SWT.COLOR_DARK_YELLOW: return COLOR_DARK_YELLOW;
- case SWT.COLOR_DARK_BLUE: return COLOR_DARK_BLUE;
- case SWT.COLOR_DARK_MAGENTA: return COLOR_DARK_MAGENTA;
- case SWT.COLOR_DARK_CYAN: return COLOR_DARK_CYAN;
- case SWT.COLOR_GRAY: return COLOR_GRAY;
- case SWT.COLOR_DARK_GRAY: return COLOR_DARK_GRAY;
- case SWT.COLOR_RED: return COLOR_RED;
- case SWT.COLOR_GREEN: return COLOR_GREEN;
- case SWT.COLOR_YELLOW: return COLOR_YELLOW;
- case SWT.COLOR_BLUE: return COLOR_BLUE;
- case SWT.COLOR_MAGENTA: return COLOR_MAGENTA;
- case SWT.COLOR_CYAN: return COLOR_CYAN;
- case SWT.COLOR_WHITE: return COLOR_WHITE;
- }
- return COLOR_BLACK;
-}
-
-/**
- * Returns a reasonable font for applications to use.
- * On some platforms, this will match the "default font"
- * or "system font" if such can be found. This font
- * should not be freed because it was allocated by the
- * system, not the application.
- * <p>
- * Typically, applications which want the default look
- * should simply not set the font on the widgets they
- * create. Widgets are always created with the correct
- * default font for the class of user-interface component
- * they represent.
- * </p>
- *
- * @return a font
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Font getSystemFont () {
- checkDevice ();
- return systemFont;
-}
-
-/**
- * Returns <code>true</code> if the underlying window system prints out
- * warning messages on the console, and <code>setWarnings</code>
- * had previously been called with <code>true</code>.
- *
- * @return <code>true</code>if warnings are being handled, and <code>false</code> otherwise
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public boolean getWarnings () {
- checkDevice ();
- return warnings;
-}
-
-/**
- * Initializes any internal resources needed by the
- * device.
- * <p>
- * This method is called after <code>create</code>.
- * </p><p>
- * If subclasses reimplement this method, they must
- * call the <code>super</code> implementation.
- * </p>
- *
- * @see #create
- */
-protected void init () {
- /* Create the standard colors */
- COLOR_BLACK = new Color (this, 0,0,0);
- COLOR_DARK_RED = new Color (this, 0x80,0,0);
- COLOR_DARK_GREEN = new Color (this, 0,0x80,0);
- COLOR_DARK_YELLOW = new Color (this, 0x80,0x80,0);
- COLOR_DARK_BLUE = new Color (this, 0,0,0x80);
- COLOR_DARK_MAGENTA = new Color (this, 0x80,0,0x80);
- COLOR_DARK_CYAN = new Color (this, 0,0x80,0x80);
- COLOR_GRAY = new Color (this, 0xC0,0xC0,0xC0);
- COLOR_DARK_GRAY = new Color (this, 0x80,0x80,0x80);
- COLOR_RED = new Color (this, 0xFF,0,0);
- COLOR_GREEN = new Color (this, 0,0xFF,0);
- COLOR_YELLOW = new Color (this, 0xFF,0xFF,0);
- COLOR_BLUE = new Color (this, 0,0,0xFF);
- COLOR_MAGENTA = new Color (this, 0xFF,0,0xFF);
- COLOR_CYAN = new Color (this, 0,0xFF,0xFF);
- COLOR_WHITE = new Color (this, 0xFF,0xFF,0xFF);
-
- paragraphStyle = (NSMutableParagraphStyle)new NSMutableParagraphStyle().alloc().init();
- paragraphStyle.setAlignment(OS.NSLeftTextAlignment);
- paragraphStyle.setLineBreakMode(OS.NSLineBreakByClipping);
- NSArray tabs = new NSArray(new NSArray().alloc().init());
- paragraphStyle.setTabStops(tabs);
- tabs.release();
-
- /* Initialize the system font slot */
- boolean smallFonts = System.getProperty("org.eclipse.swt.internal.carbon.smallFonts") != null;
- float /*double*/ systemFontSize = smallFonts ? NSFont.smallSystemFontSize() : NSFont.systemFontSize();
- Point dpi = this.dpi = getDPI(), screenDPI = getScreenDPI();
- NSFont font = NSFont.systemFontOfSize(systemFontSize * dpi.y / screenDPI.y);
- font.retain();
- systemFont = Font.cocoa_new(this, font);
-}
-
-/**
- * Invokes platform specific functionality to allocate a new GC handle.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Device</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>
- *
- * @param data the platform specific GC data
- * @return the platform specific GC handle
- */
-public abstract int /*long*/ internal_new_GC (GCData data);
-
-/**
- * Invokes platform specific functionality to dispose a GC handle.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Device</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>
- *
- * @param hDC the platform specific GC handle
- * @param data the platform specific GC data
- */
-public abstract void internal_dispose_GC (int /*long*/ handle, GCData data);
-
-/**
- * Returns <code>true</code> if the device has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the device.
- * When a device has been disposed, it is an error to
- * invoke any other method using the device.
- *
- * @return <code>true</code> when the device is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed () {
- synchronized (Device.class) {
- return disposed;
- }
-}
-
-/**
- * Loads the font specified by a file. The font will be
- * present in the list of fonts available to the application.
- *
- * @param path the font file path
- * @return whether the font was successfully loaded
- *
- * @exception SWTException <ul>
- * <li>ERROR_NULL_ARGUMENT - if path is null</li>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see Font
- *
- * @since 3.3
- */
-public boolean loadFont (String path) {
- checkDevice();
- if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- boolean result = false;
- NSString nsPath = NSString.stringWith(path);
- int /*long*/ fsRepresentation = nsPath.fileSystemRepresentation();
-
- if (fsRepresentation != 0) {
- byte [] fsRef = new byte [80];
- boolean [] isDirectory = new boolean[1];
- if (OS.FSPathMakeRef (fsRepresentation, fsRef, isDirectory) == OS.noErr) {
- result = OS.ATSFontActivateFromFileReference (fsRef, OS.kATSFontContextLocal, OS.kATSFontFormatUnspecified, 0, OS.kATSOptionFlagsDefault, null) == OS.noErr;
- }
- }
-
- return result;
-}
-
-void new_Object (Object object) {
- synchronized (trackingLock) {
- for (int i=0; i<objects.length; i++) {
- if (objects [i] == null) {
- objects [i] = object;
- errors [i] = new Error ();
- return;
- }
- }
- Object [] newObjects = new Object [objects.length + 128];
- System.arraycopy (objects, 0, newObjects, 0, objects.length);
- newObjects [objects.length] = object;
- objects = newObjects;
- Error [] newErrors = new Error [errors.length + 128];
- System.arraycopy (errors, 0, newErrors, 0, errors.length);
- newErrors [errors.length] = new Error ();
- errors = newErrors;
- }
-}
-
-void printErrors () {
- if (!DEBUG) return;
- if (tracking) {
- synchronized (trackingLock) {
- if (objects == null || errors == null) return;
- int objectCount = 0;
- int colors = 0, cursors = 0, fonts = 0, gcs = 0, images = 0;
- int paths = 0, patterns = 0, regions = 0, textLayouts = 0, transforms = 0;
- for (int i=0; i<objects.length; i++) {
- Object object = objects [i];
- if (object != null) {
- objectCount++;
- if (object instanceof Color) colors++;
- if (object instanceof Cursor) cursors++;
- if (object instanceof Font) fonts++;
- if (object instanceof GC) gcs++;
- if (object instanceof Image) images++;
- if (object instanceof Path) paths++;
- if (object instanceof Pattern) patterns++;
- if (object instanceof Region) regions++;
- if (object instanceof TextLayout) textLayouts++;
- if (object instanceof Transform) transforms++;
- }
- }
- if (objectCount != 0) {
- String string = "Summary: ";
- if (colors != 0) string += colors + " Color(s), ";
- if (cursors != 0) string += cursors + " Cursor(s), ";
- if (fonts != 0) string += fonts + " Font(s), ";
- if (gcs != 0) string += gcs + " GC(s), ";
- if (images != 0) string += images + " Image(s), ";
- if (paths != 0) string += paths + " Path(s), ";
- if (patterns != 0) string += patterns + " Pattern(s), ";
- if (regions != 0) string += regions + " Region(s), ";
- if (textLayouts != 0) string += textLayouts + " TextLayout(s), ";
- if (transforms != 0) string += transforms + " Transforms(s), ";
- if (string.length () != 0) {
- string = string.substring (0, string.length () - 2);
- System.out.println (string);
- }
- for (int i=0; i<errors.length; i++) {
- if (errors [i] != null) errors [i].printStackTrace (System.out);
- }
- }
- }
- }
-}
-
-/**
- * Releases any internal resources back to the operating
- * system and clears all fields except the device handle.
- * <p>
- * When a device is destroyed, resources that were acquired
- * on behalf of the programmer need to be returned to the
- * operating system. For example, if the device allocated a
- * font to be used as the system font, this font would be
- * freed in <code>release</code>. Also,to assist the garbage
- * collector and minimize the amount of memory that is not
- * reclaimed when the programmer keeps a reference to a
- * disposed device, all fields except the handle are zero'd.
- * The handle is needed by <code>destroy</code>.
- * </p>
- * This method is called before <code>destroy</code>.
- * </p><p>
- * If subclasses reimplement this method, they must
- * call the <code>super</code> implementation.
- * </p>
- *
- * @see #dispose
- * @see #destroy
- */
-protected void release () {
- if (paragraphStyle != null) paragraphStyle.release();
- paragraphStyle = null;
-
- if (systemFont != null) systemFont.dispose();
- systemFont = null;
-
- if (COLOR_BLACK != null) COLOR_BLACK.dispose();
- if (COLOR_DARK_RED != null) COLOR_DARK_RED.dispose();
- if (COLOR_DARK_GREEN != null) COLOR_DARK_GREEN.dispose();
- if (COLOR_DARK_YELLOW != null) COLOR_DARK_YELLOW.dispose();
- if (COLOR_DARK_BLUE != null) COLOR_DARK_BLUE.dispose();
- if (COLOR_DARK_MAGENTA != null) COLOR_DARK_MAGENTA.dispose();
- if (COLOR_DARK_CYAN != null) COLOR_DARK_CYAN.dispose();
- if (COLOR_GRAY != null) COLOR_GRAY.dispose();
- if (COLOR_DARK_GRAY != null) COLOR_DARK_GRAY.dispose();
- if (COLOR_RED != null) COLOR_RED.dispose();
- if (COLOR_GREEN != null) COLOR_GREEN.dispose();
- if (COLOR_YELLOW != null) COLOR_YELLOW.dispose();
- if (COLOR_BLUE != null) COLOR_BLUE.dispose();
- if (COLOR_MAGENTA != null) COLOR_MAGENTA.dispose();
- if (COLOR_CYAN != null) COLOR_CYAN.dispose();
- if (COLOR_WHITE != null) COLOR_WHITE.dispose();
- COLOR_BLACK = COLOR_DARK_RED = COLOR_DARK_GREEN = COLOR_DARK_YELLOW = COLOR_DARK_BLUE =
- COLOR_DARK_MAGENTA = COLOR_DARK_CYAN = COLOR_GRAY = COLOR_DARK_GRAY = COLOR_RED =
- COLOR_GREEN = COLOR_YELLOW = COLOR_BLUE = COLOR_MAGENTA = COLOR_CYAN = COLOR_WHITE = null;
-}
-
-/**
- * If the underlying window system supports printing warning messages
- * to the console, setting warnings to <code>false</code> prevents these
- * messages from being printed. If the argument is <code>true</code> then
- * message printing is not blocked.
- *
- * @param warnings <code>true</code>if warnings should be printed, and <code>false</code> otherwise
- *
- * @exception SWTException <ul>
- * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setWarnings (boolean warnings) {
- checkDevice ();
- this.warnings = warnings;
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java
deleted file mode 100755
index ad0c2b2afe..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-public class DeviceData {
- /*
- * Debug fields - may not be honoured
- * on some SWT platforms.
- */
- public boolean debug;
- public boolean tracking;
- public Error [] errors;
- public Object [] objects;
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java
deleted file mode 100755
index b30ab417f2..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.*;
-
-/**
- * Instances of this class manage operating system resources that
- * define how text looks when it is displayed. Fonts may be constructed
- * by providing a device and either name, size and style information
- * or a <code>FontData</code> object which encapsulates this data.
- * <p>
- * Application code must explicitly invoke the <code>Font.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- *
- * @see FontData
- * @see <a href="http://www.eclipse.org/swt/snippets/#font">Font 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 Font extends Resource {
-
- /**
- * the handle to the OS font resource
- * (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>
- */
- public NSFont handle;
-
- /**
- * the traits not supported to the OS font resource
- * (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>
- */
- public int extraTraits;
-
- static final double SYNTHETIC_BOLD = -2.5;
- static final double SYNTHETIC_ITALIC = 0.2;
-
-Font(Device device) {
- super(device);
-}
-
-/**
- * Constructs a new font given a device and font data
- * which describes the desired font's appearance.
- * <p>
- * You must dispose the font when it is no longer required.
- * </p>
- *
- * @param device the device to create the font on
- * @param fd the FontData that describes the desired font (must not be null)
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the fd argument is null</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a font could not be created from the given font data</li>
- * </ul>
- */
-public Font(Device device, FontData fd) {
- super(device);
- if (fd == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(fd.getName(), fd.getHeightF(), fd.getStyle(), fd.nsName);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new font given a device and an array
- * of font data which describes the desired font's
- * appearance.
- * <p>
- * You must dispose the font when it is no longer required.
- * </p>
- *
- * @param device the device to create the font on
- * @param fds the array of FontData that describes the desired font (must not be null)
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the fds argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the length of fds is zero</li>
- * <li>ERROR_NULL_ARGUMENT - if any fd in the array is null</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a font could not be created from the given font data</li>
- * </ul>
- *
- * @since 2.1
- */
-public Font(Device device, FontData[] fds) {
- super(device);
- if (fds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (fds.length == 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- for (int i=0; i<fds.length; i++) {
- if (fds[i] == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- FontData fd = fds[0];
- init(fd.getName(), fd.getHeightF(), fd.getStyle(), fd.nsName);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new font given a device, a font name,
- * the height of the desired font in points, and a font
- * style.
- * <p>
- * You must dispose the font when it is no longer required.
- * </p>
- *
- * @param device the device to create the font on
- * @param name the name of the font (must not be null)
- * @param height the font height in points
- * @param style a bit or combination of NORMAL, BOLD, ITALIC
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the name argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES - if a font could not be created from the given arguments</li>
- * </ul>
- */
-public Font(Device device, String name, int height, int style) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(name, height, style, null);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/*public*/ Font(Device device, String name, float height, int style) {
- super(device);
- init(name, height, style, null);
- init();
-}
-
-void addTraits(NSMutableAttributedString attrStr, NSRange range) {
- if ((extraTraits & OS.NSBoldFontMask) != 0) {
- attrStr.addAttribute(OS.NSStrokeWidthAttributeName, NSNumber.numberWithDouble(SYNTHETIC_BOLD), range);
- }
- if ((extraTraits & OS.NSItalicFontMask) != 0) {
- attrStr.addAttribute(OS.NSObliquenessAttributeName, NSNumber.numberWithDouble(SYNTHETIC_ITALIC), range);
- }
-}
-
-void addTraits(NSMutableDictionary dict) {
- if ((extraTraits & OS.NSBoldFontMask) != 0) {
- dict.setObject(NSNumber.numberWithDouble(SYNTHETIC_BOLD), OS.NSStrokeWidthAttributeName);
- }
- if ((extraTraits & OS.NSItalicFontMask) != 0) {
- dict.setObject(NSNumber.numberWithDouble(SYNTHETIC_ITALIC), OS.NSObliquenessAttributeName);
- }
-}
-
-void destroy() {
- handle.release();
- handle = null;
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof Font)) return false;
- Font font = (Font)object;
- return handle == font.handle;
-}
-
-/**
- * Returns an array of <code>FontData</code>s representing the receiver.
- * On Windows, only one FontData will be returned per font. On X however,
- * a <code>Font</code> object <em>may</em> be composed of multiple X
- * fonts. To support this case, we return an array of font data objects.
- *
- * @return an array of font data objects describing the receiver
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public FontData[] getFontData() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSString family = handle.familyName();
- String name = family.getString();
- NSString str = handle.fontName();
- String nsName = str.getString();
- NSFontManager manager = NSFontManager.sharedFontManager();
- int /*long*/ traits = manager.traitsOfFont(handle);
- int style = SWT.NORMAL;
- if ((traits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC;
- if ((traits & OS.NSBoldFontMask) != 0) style |= SWT.BOLD;
- if ((extraTraits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC;
- if ((extraTraits & OS.NSBoldFontMask) != 0) style |= SWT.BOLD;
- Point dpi = device.dpi, screenDPI = device.getScreenDPI();
- FontData data = new FontData(name, (float)/*64*/handle.pointSize() * screenDPI.y / dpi.y, style);
- data.nsName = nsName;
- return new FontData[]{data};
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Invokes platform specific functionality to allocate a new font.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Font</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>
- *
- * @param device the device on which to allocate the color
- * @param handle the handle for the font
- * @param style the style for the font
- * @param size the size for the font
- *
- * @private
- */
-public static Font cocoa_new(Device device, NSFont handle) {
- Font font = new Font(device);
- font.handle = handle;
- return font;
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode() {
- return handle != null ? (int)/*64*/handle.id : 0;
-}
-
-void init(String name, float height, int style, String nsName) {
- if (name == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- Point dpi = device.dpi, screenDPI = device.getScreenDPI();
- float size = height * dpi.y / screenDPI.y;
- if (nsName != null) {
- handle = NSFont.fontWithName(NSString.stringWith(nsName), size);
- } else {
- NSString family = NSString.stringWith(name);
- NSFont nsFont = NSFont.fontWithName(family, size);
- if (nsFont == null) nsFont = NSFont.systemFontOfSize(size);
- NSFontManager manager = NSFontManager.sharedFontManager();
- if (nsFont != null) {
- if ((style & (SWT.BOLD | SWT.ITALIC)) == 0) {
- handle = nsFont;
- } else {
- int traits = 0;
- if ((style & SWT.ITALIC) != 0) traits |= OS.NSItalicFontMask;
- if ((style & SWT.BOLD) != 0) traits |= OS.NSBoldFontMask;
- handle = manager.convertFont(nsFont, traits);
- if ((style & SWT.ITALIC) != 0 && (handle == null || (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0)) {
- traits &= ~OS.NSItalicFontMask;
- handle = null;
- if ((style & SWT.BOLD) != 0) {
- handle = manager.convertFont(nsFont, traits);
- }
- }
- if ((style & SWT.BOLD) != 0 && handle == null) {
- traits &= ~OS.NSBoldFontMask;
- if ((style & SWT.ITALIC) != 0) {
- traits |= OS.NSItalicFontMask;
- handle = manager.convertFont(nsFont, traits);
- }
- }
- if (handle == null) handle = nsFont;
- }
- }
- if (handle == null) {
- handle = NSFont.systemFontOfSize(size);
- }
- if ((style & SWT.ITALIC) != 0 && (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0) {
- extraTraits |= OS.NSItalicFontMask;
- }
- if ((style & SWT.BOLD) != 0 && (manager.traitsOfFont(handle) & OS.NSBoldFontMask) == 0) {
- extraTraits |= OS.NSBoldFontMask;
- }
- }
- if (handle == null) {
- handle = device.systemFont.handle;
- }
- handle.retain();
-}
-
-/**
- * Returns <code>true</code> if the font has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the font.
- * When a font has been disposed, it is an error to
- * invoke any other method using the font.
- *
- * @return <code>true</code> when the font is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Font {*DISPOSED*}";
- return "Font {" + handle + "}";
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java
deleted file mode 100755
index 589f151ebe..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.*;
-
-/**
- * Instances of this class describe operating system fonts.
- * <p>
- * For platform-independent behaviour, use the get and set methods
- * corresponding to the following properties:
- * <dl>
- * <dt>height</dt><dd>the height of the font in points</dd>
- * <dt>name</dt><dd>the face name of the font, which may include the foundry</dd>
- * <dt>style</dt><dd>A bitwise combination of NORMAL, ITALIC and BOLD</dd>
- * </dl>
- * If extra, platform-dependent functionality is required:
- * <ul>
- * <li>On <em>Windows</em>, the data member of the <code>FontData</code>
- * corresponds to a Windows <code>LOGFONT</code> structure whose fields
- * may be retrieved and modified.</li>
- * <li>On <em>X</em>, the fields of the <code>FontData</code> correspond
- * to the entries in the font's XLFD name and may be retrieved and modified.
- * </ul>
- * Application code does <em>not</em> need to explicitly release the
- * resources managed by each instance when those instances are no longer
- * required, and thus no <code>dispose()</code> method is provided.
- *
- * @see Font
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public final class FontData {
- /**
- * the font name
- * (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>
- */
- public String name;
-
- /**
- * The height of the font data in points
- * (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>
- */
- public float height;
-
- /**
- * the font style
- * (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>
- */
- public int style;
-
- /**
- * the NSFont font name
- * (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>
- */
- public String nsName;
-
- /**
- * The locales of the font
- */
- String lang, country, variant;
-
-/**
- * Constructs a new uninitialized font data.
- */
-public FontData () {
- this("", 12, SWT.NORMAL);
-}
-
-/**
- * Constructs a new FontData given a string representation
- * in the form generated by the <code>FontData.toString</code>
- * method.
- * <p>
- * Note that the representation varies between platforms,
- * and a FontData can only be created from a string that was
- * generated on the same platform.
- * </p>
- *
- * @param string the string representation of a <code>FontData</code> (must not be null)
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the argument does not represent a valid description</li>
- * </ul>
- *
- * @see #toString
- */
-public FontData(String string) {
- if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- int start = 0;
- int end = string.indexOf('|');
- if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- String version1 = string.substring(start, end);
- try {
- if (Integer.parseInt(version1) != 1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- } catch (NumberFormatException e) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
-
- start = end + 1;
- end = string.indexOf('|', start);
- if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- String name = string.substring(start, end);
-
- start = end + 1;
- end = string.indexOf('|', start);
- if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- float height = 0;
- try {
- height = Float.parseFloat(string.substring(start, end));
- } catch (NumberFormatException e) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
-
- start = end + 1;
- end = string.indexOf('|', start);
- if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- int style = 0;
- try {
- style = Integer.parseInt(string.substring(start, end));
- } catch (NumberFormatException e) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
-
- start = end + 1;
- end = string.indexOf('|', start);
- setName(name);
- setHeight(height);
- setStyle(style);
- if (end == -1) return;
- String platform = string.substring(start, end);
-
- start = end + 1;
- end = string.indexOf('|', start);
- if (end == -1) return;
- String version2 = string.substring(start, end);
-
- if (platform.equals("COCOA") && version2.equals("1")) {
- start = end + 1;
- end = string.length();
- if (start < end) nsName = string.substring(start, end);
- }
-}
-
-/**
- * Constructs a new font data given a font name,
- * the height of the desired font in points,
- * and a font style.
- *
- * @param name the name of the font (must not be null)
- * @param height the font height in points
- * @param style a bit or combination of NORMAL, BOLD, ITALIC
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - when the font name is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li>
- * </ul>
- */
-public FontData(String name, int height, int style) {
- setName(name);
- setHeight(height);
- setStyle(style);
-}
-
-/*public*/ FontData(String name, float height, int style) {
- setName(name);
- setHeight(height);
- setStyle(style);
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof FontData)) return false;
- FontData data = (FontData)object;
- return name.equals(data.name) && height == data.height && style == data.style;
-}
-
-/**
- * Returns the height of the receiver in points.
- *
- * @return the height of this FontData
- *
- * @see #setHeight(int)
- */
-public int getHeight() {
- return (int)height;
-}
-
-/*public*/ float getHeightF() {
- return height;
-}
-
-/**
- * Returns the locale of the receiver.
- * <p>
- * The locale determines which platform character set this
- * font is going to use. Widgets and graphics operations that
- * use this font will convert UNICODE strings to the platform
- * character set of the specified locale.
- * </p>
- * <p>
- * On platforms where there are multiple character sets for a
- * given language/country locale, the variant portion of the
- * locale will determine the character set.
- * </p>
- *
- * @return the <code>String</code> representing a Locale object
- * @since 3.0
- */
-public String getLocale () {
- StringBuffer buffer = new StringBuffer ();
- char sep = '_';
- if (lang != null) {
- buffer.append (lang);
- buffer.append (sep);
- }
- if (country != null) {
- buffer.append (country);
- buffer.append (sep);
- }
- if (variant != null) {
- buffer.append (variant);
- }
-
- String result = buffer.toString ();
- int length = result.length ();
- if (length > 0) {
- if (result.charAt (length - 1) == sep) {
- result = result.substring (0, length - 1);
- }
- }
- return result;
-}
-
-/**
- * Returns the name of the receiver.
- * On platforms that support font foundries, the return value will
- * be the foundry followed by a dash ("-") followed by the face name.
- *
- * @return the name of this <code>FontData</code>
- *
- * @see #setName
- */
-public String getName() {
- return name;
-}
-
-/**
- * Returns the style of the receiver which is a bitwise OR of
- * one or more of the <code>SWT</code> constants NORMAL, BOLD
- * and ITALIC.
- *
- * @return the style of this <code>FontData</code>
- *
- * @see #setStyle
- */
-public int getStyle() {
- return style;
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode () {
- return name.hashCode() ^ getHeight() ^ style;
-}
-
-/**
- * Sets the height of the receiver. The parameter is
- * specified in terms of points, where a point is one
- * seventy-second of an inch.
- *
- * @param height the height of the <code>FontData</code>
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li>
- * </ul>
- *
- * @see #getHeight
- */
-public void setHeight(int height) {
- if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- this.height = height;
-}
-
-/*public*/ void setHeight(float height) {
- if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- this.height = height;
-}
-
-/**
- * Sets the locale of the receiver.
- * <p>
- * The locale determines which platform character set this
- * font is going to use. Widgets and graphics operations that
- * use this font will convert UNICODE strings to the platform
- * character set of the specified locale.
- * </p>
- * <p>
- * On platforms where there are multiple character sets for a
- * given language/country locale, the variant portion of the
- * locale will determine the character set.
- * </p>
- *
- * @param locale the <code>String</code> representing a Locale object
- * @see java.util.Locale#toString
- */
-public void setLocale(String locale) {
- lang = country = variant = null;
- if (locale != null) {
- char sep = '_';
- int length = locale.length();
- int firstSep, secondSep;
-
- firstSep = locale.indexOf(sep);
- if (firstSep == -1) {
- firstSep = secondSep = length;
- } else {
- secondSep = locale.indexOf(sep, firstSep + 1);
- if (secondSep == -1) secondSep = length;
- }
- if (firstSep > 0) lang = locale.substring(0, firstSep);
- if (secondSep > firstSep + 1) country = locale.substring(firstSep + 1, secondSep);
- if (length > secondSep + 1) variant = locale.substring(secondSep + 1);
- }
-}
-
-/**
- * Sets the name of the receiver.
- * <p>
- * Some platforms support font foundries. On these platforms, the name
- * of the font specified in setName() may have one of the following forms:
- * <ol>
- * <li>a face name (for example, "courier")</li>
- * <li>a foundry followed by a dash ("-") followed by a face name (for example, "adobe-courier")</li>
- * </ol>
- * In either case, the name returned from getName() will include the
- * foundry.
- * </p>
- * <p>
- * On platforms that do not support font foundries, only the face name
- * (for example, "courier") is used in <code>setName()</code> and
- * <code>getName()</code>.
- * </p>
- *
- * @param name the name of the font data (must not be null)
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - when the font name is null</li>
- * </ul>
- *
- * @see #getName
- */
-public void setName(String name) {
- if (name == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- this.name = name;
- nsName = null;
-}
-
-/**
- * Sets the style of the receiver to the argument which must
- * be a bitwise OR of one or more of the <code>SWT</code>
- * constants NORMAL, BOLD and ITALIC. All other style bits are
- * ignored.
- *
- * @param style the new style for this <code>FontData</code>
- *
- * @see #getStyle
- */
-public void setStyle(int style) {
- this.style = style;
- nsName = null;
-}
-
-/**
- * Returns a string representation of the receiver which is suitable
- * for constructing an equivalent instance using the
- * <code>FontData(String)</code> constructor.
- *
- * @return a string representation of the FontData
- *
- * @see FontData
- */
-public String toString() {
- StringBuffer buffer = new StringBuffer(128);
- buffer.append("1|");
- buffer.append(getName());
- buffer.append("|");
- buffer.append(getHeightF());
- buffer.append("|");
- buffer.append(getStyle());
- buffer.append("|");
- buffer.append("COCOA|1|");
- if (nsName != null) buffer.append(nsName);
- return buffer.toString();
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java
deleted file mode 100755
index 2c0d6a7a3f..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-/**
- * Instances of this class provide measurement information
- * about fonts including ascent, descent, height, leading
- * space between rows, and average character width.
- * <code>FontMetrics</code> are obtained from <code>GC</code>s
- * using the <code>getFontMetrics()</code> method.
- *
- * @see GC#getFontMetrics
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public final class FontMetrics {
- int ascent, descent, averageCharWidth, leading, height;
-
-FontMetrics() {
-}
-
-public static FontMetrics cocoa_new(int ascent, int descent, int averageCharWidth, int leading, int height) {
- FontMetrics fontMetrics = new FontMetrics();
- fontMetrics.ascent = ascent;
- fontMetrics.descent = descent;
- fontMetrics.averageCharWidth = averageCharWidth;
- fontMetrics.leading = leading;
- fontMetrics.height = height;
- return fontMetrics;
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof FontMetrics)) return false;
- FontMetrics metrics = (FontMetrics)object;
- return ascent == metrics.ascent && descent == metrics.descent &&
- averageCharWidth == metrics.averageCharWidth && leading == metrics.leading &&
- height == metrics.height;
-}
-
-/**
- * Returns the ascent of the font described by the receiver. A
- * font's <em>ascent</em> is the distance from the baseline to the
- * top of actual characters, not including any of the leading area,
- * measured in pixels.
- *
- * @return the ascent of the font
- */
-public int getAscent() {
- return ascent;
-}
-
-/**
- * Returns the average character width, measured in pixels,
- * of the font described by the receiver.
- *
- * @return the average character width of the font
- */
-public int getAverageCharWidth() {
- return averageCharWidth;
-}
-
-/**
- * Returns the descent of the font described by the receiver. A
- * font's <em>descent</em> is the distance from the baseline to the
- * bottom of actual characters, not including any of the leading area,
- * measured in pixels.
- *
- * @return the descent of the font
- */
-public int getDescent() {
- return descent;
-}
-
-/**
- * Returns the height of the font described by the receiver,
- * measured in pixels. A font's <em>height</em> is the sum of
- * its ascent, descent and leading area.
- *
- * @return the height of the font
- *
- * @see #getAscent
- * @see #getDescent
- * @see #getLeading
- */
-public int getHeight() {
- return height;
-}
-
-/**
- * Returns the leading area of the font described by the
- * receiver. A font's <em>leading area</em> is the space
- * above its ascent which may include accents or other marks.
- *
- * @return the leading space of the font
- */
-public int getLeading() {
- return leading;
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode() {
- return ascent ^ descent ^ averageCharWidth ^ leading ^ height;
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java
deleted file mode 100755
index 0d34639929..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java
+++ /dev/null
@@ -1,3918 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * 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>
- */
- public NSGraphicsContext handle;
-
- Drawable drawable;
- GCData data;
-
- CGPathElement element;
- int count, typeCount;
- byte[] types;
- float /*double*/[] points;
- float /*double*/ [] point;
-
- static final int TAB_COUNT = 32;
-
- 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 FOREGROUND_FILL = 1 << 8;
- final static int DRAW_OFFSET = 1 << 9;
- final static int CLIPPING = 1 << 10;
- final static int TRANSFORM = 1 << 11;
- final static int VISIBLE_REGION = 1 << 12;
- final static int DRAW = CLIPPING | TRANSFORM | FOREGROUND | LINE_WIDTH | LINE_STYLE | LINE_CAP | LINE_JOIN | LINE_MITERLIMIT | DRAW_OFFSET;
- final static int FILL = CLIPPING | TRANSFORM | 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);
-}
-
-/**
- * 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) {
- if (drawable == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- GCData data = new GCData();
- data.style = checkStyle(style);
- int /*long*/ contextId = drawable.internal_new_GC(data);
- Device device = data.device;
- if (device == null) device = Device.getDevice();
- if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- this.device = data.device = device;
- init(drawable, data, contextId);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-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);
-}
-
-/**
- * Invokes platform specific functionality to allocate a new graphics context.
- * <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>
- *
- * @param drawable the Drawable for the receiver.
- * @param data the data for the receiver.
- *
- * @return a new <code>GC</code>
- *
- * @private
- */
-public static GC cocoa_new(Drawable drawable, GCData data) {
- GC gc = new GC();
- int /*long*/ context = drawable.internal_new_GC(data);
- gc.device = data.device;
- gc.init(drawable, data, context);
- return gc;
-}
-
-int /*long*/ applierFunc(int /*long*/ info, int /*long*/ elementPtr) {
- OS.memmove(element, elementPtr, CGPathElement.sizeof);
- int type = 0, length = 1;
- switch (element.type) {
- case OS.kCGPathElementMoveToPoint: type = SWT.PATH_MOVE_TO; break;
- case OS.kCGPathElementAddLineToPoint: type = SWT.PATH_LINE_TO; break;
- case OS.kCGPathElementAddQuadCurveToPoint: type = SWT.PATH_QUAD_TO; length = 2; break;
- case OS.kCGPathElementAddCurveToPoint: type = SWT.PATH_CUBIC_TO; length = 3; break;
- case OS.kCGPathElementCloseSubpath: type = SWT.PATH_CLOSE; length = 0; break;
- }
- if (types != null) {
- types[typeCount] = (byte)type;
- if (length > 0) {
- OS.memmove(point, element.points, length * CGPoint.sizeof);
- System.arraycopy(point, 0, points, count, length * 2);
- }
- }
- typeCount++;
- count += length * 2;
- return 0;
-}
-
-NSAutoreleasePool checkGC (int mask) {
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- if (data.flippedContext != null && !handle.isEqual(NSGraphicsContext.currentContext())) {
- data.restoreContext = true;
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(handle);
- }
- if ((mask & (CLIPPING | TRANSFORM)) != 0) {
- NSView view = data.view;
- if ((data.state & CLIPPING) == 0 || (data.state & TRANSFORM) == 0 || (data.state & VISIBLE_REGION) == 0) {
- boolean antialias = handle.shouldAntialias();
- handle.restoreGraphicsState();
- handle.saveGraphicsState();
- handle.setShouldAntialias(antialias);
- if (view != null && (data.paintRect == null || !view.isFlipped())) {
- NSAffineTransform transform = NSAffineTransform.transform();
- NSRect rect = view.convertRect_toView_(view.bounds(), null);
- if (data.paintRect == null) {
- transform.translateXBy(rect.x, rect.y + rect.height);
- } else {
- transform.translateXBy(0, rect.height);
- }
- transform.scaleXBy(1, -1);
- transform.concat();
- if (data.visibleRgn != 0) {
- if (data.visiblePath == null || (data.state & VISIBLE_REGION) == 0) {
- if (data.visiblePath != null) data.visiblePath.release();
- data.visiblePath = Region.cocoa_new(device, data.visibleRgn).getPath();
- }
- data.visiblePath.addClip();
- data.state |= VISIBLE_REGION;
- }
- }
- if (data.clipPath != null) data.clipPath.addClip();
- if (data.transform != null) data.transform.concat();
- mask &= ~(TRANSFORM | CLIPPING);
- data.state |= TRANSFORM | CLIPPING;
- data.state &= ~(BACKGROUND | FOREGROUND);
- }
- }
-
- int state = data.state;
- if ((state & mask) == mask) return pool;
- state = (state ^ mask) & mask;
- data.state |= mask;
-
- if ((state & FOREGROUND) != 0) {
- Pattern pattern = data.foregroundPattern;
- if (pattern != null) {
- if (pattern.color != null) pattern.color.setStroke();
- } else {
- float /*double*/ [] color = data.foreground;
- if (data.fg != null) data.fg.release();
- NSColor fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f);
- fg.retain();
- fg.setStroke();
- }
- }
- if ((state & FOREGROUND_FILL) != 0) {
- Pattern pattern = data.foregroundPattern;
- if (pattern != null) {
- if (pattern.color != null) pattern.color.setFill();
- } else {
- float /*double*/ [] color = data.foreground;
- if (data.fg != null) data.fg.release();
- NSColor fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f);
- fg.retain();
- fg.setFill();
- }
- data.state &= ~BACKGROUND;
- }
- if ((state & BACKGROUND) != 0) {
- Pattern pattern = data.backgroundPattern;
- if (pattern != null) {
- if (pattern.color != null) pattern.color.setFill();
- } else {
- float /*double*/ [] color = data.background;
- if (data.bg != null) data.bg.release();
- NSColor bg = data.bg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f);
- bg.retain();
- bg.setFill();
- }
- data.state &= ~FOREGROUND_FILL;
- }
- NSBezierPath path = data.path;
- if ((state & LINE_WIDTH) != 0) {
- path.setLineWidth(data.lineWidth == 0 ? 1 : data.lineWidth);
- switch (data.lineStyle) {
- case SWT.LINE_DOT:
- case SWT.LINE_DASH:
- case SWT.LINE_DASHDOT:
- case SWT.LINE_DASHDOTDOT:
- state |= LINE_STYLE;
- }
- }
- if ((state & LINE_STYLE) != 0) {
- float[] dashes = null;
- float width = data.lineWidth;
- switch (data.lineStyle) {
- case SWT.LINE_SOLID: break;
- case SWT.LINE_DASH: dashes = width != 0 ? LINE_DASH : LINE_DASH_ZERO; break;
- case SWT.LINE_DOT: dashes = width != 0 ? LINE_DOT : LINE_DOT_ZERO; break;
- case SWT.LINE_DASHDOT: dashes = width != 0 ? LINE_DASHDOT : LINE_DASHDOT_ZERO; break;
- case SWT.LINE_DASHDOTDOT: dashes = width != 0 ? LINE_DASHDOTDOT : LINE_DASHDOTDOT_ZERO; break;
- case SWT.LINE_CUSTOM: dashes = data.lineDashes; break;
- }
- if (dashes != null) {
- float /*double*/[] lengths = new float /*double*/[dashes.length];
- for (int i = 0; i < lengths.length; i++) {
- lengths[i] = width == 0 || data.lineStyle == SWT.LINE_CUSTOM ? dashes[i] : dashes[i] * width;
- }
- path.setLineDash(lengths, lengths.length, data.lineDashesOffset);
- } else {
- path.setLineDash(null, 0, 0);
- }
- }
- if ((state & LINE_MITERLIMIT) != 0) {
- path.setMiterLimit(data.lineMiterLimit);
- }
- if ((state & LINE_JOIN) != 0) {
- int joinStyle = 0;
- switch (data.lineJoin) {
- case SWT.JOIN_MITER: joinStyle = OS.NSMiterLineJoinStyle; break;
- case SWT.JOIN_ROUND: joinStyle = OS.NSRoundLineJoinStyle; break;
- case SWT.JOIN_BEVEL: joinStyle = OS.NSBevelLineJoinStyle; break;
- }
- path.setLineJoinStyle(joinStyle);
- }
- if ((state & LINE_CAP) != 0) {
- int capStyle = 0;
- switch (data.lineCap) {
- case SWT.CAP_ROUND: capStyle = OS.NSRoundLineCapStyle; break;
- case SWT.CAP_FLAT: capStyle = OS.NSButtLineCapStyle; break;
- case SWT.CAP_SQUARE: capStyle = OS.NSSquareLineCapStyle; break;
- }
- path.setLineCapStyle(capStyle);
- }
- if ((state & DRAW_OFFSET) != 0) {
- data.drawXOffset = data.drawYOffset = 0;
- NSSize size = new NSSize();
- size.width = size.height = 1;
- if (data.transform != null) {
- size = data.transform.transformSize(size);
- }
- float /*double*/ scaling = size.width;
- if (scaling < 0) scaling = -scaling;
- float /*double*/ strokeWidth = data.lineWidth * scaling;
- if (strokeWidth == 0 || ((int)strokeWidth % 2) == 1) {
- data.drawXOffset = 0.5f / scaling;
- }
- scaling = size.height;
- if (scaling < 0) scaling = -scaling;
- strokeWidth = data.lineWidth * scaling;
- if (strokeWidth == 0 || ((int)strokeWidth % 2) == 1) {
- data.drawYOffset = 0.5f / scaling;
- }
- }
- return pool;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (image.type != SWT.BITMAP || image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = checkGC(TRANSFORM | CLIPPING);
- try {
- if (data.image != null) {
- int srcX = x, srcY = y, destX = 0, destY = 0;
- NSSize srcSize = data.image.handle.size();
- int imgHeight = (int)srcSize.height;
- int destWidth = (int)srcSize.width - x, destHeight = (int)srcSize.height - y;
- int srcWidth = destWidth, srcHeight = destHeight;
- NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(image.getRepresentation());
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(context);
- NSAffineTransform transform = NSAffineTransform.transform();
- NSSize size = image.handle.size();
- transform.translateXBy(0, size.height-(destHeight + 2 * destY));
- transform.concat();
- NSRect srcRect = new NSRect();
- srcRect.x = srcX;
- srcRect.y = imgHeight - (srcY + srcHeight);
- srcRect.width = srcWidth;
- srcRect.height = srcHeight;
- NSRect destRect = new NSRect();
- destRect.x = destX;
- destRect.y = destY;
- destRect.width = destWidth;
- destRect.height = destHeight;
- data.image.handle.drawInRect(destRect, srcRect, OS.NSCompositeCopy, 1);
- NSGraphicsContext.static_restoreGraphicsState();
- return;
- }
- if (data.view != null) {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- NSWindow window = data.view.window();
- pt = data.view.convertPoint_toView_(pt, window.contentView().superview());
- NSRect frame = window.frame();
- pt.y = frame.height - pt.y;
- NSSize size = image.handle.size();
- CGRect destRect = new CGRect();
- destRect.size.width = size.width;
- destRect.size.height = size.height;
- CGRect srcRect = new CGRect();
- srcRect.origin.x = pt.x;
- srcRect.origin.y = pt.y;
- srcRect.size.width = size.width;
- srcRect.size.height = size.height;
- NSBitmapImageRep imageRep = image.getRepresentation();
- NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(imageRep);
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(context);
- int /*long*/ contextID = OS.objc_msgSend(NSApplication.sharedApplication().id, OS.sel_contextID);
- OS.CGContextCopyWindowContentsToRect(context.graphicsPort(), destRect, contextID, window.windowNumber(), srcRect);
- NSGraphicsContext.static_restoreGraphicsState();
- return;
- }
- if (handle.isDrawingToScreen()) {
- NSImage imageHandle = image.handle;
- NSSize size = imageHandle.size();
- CGRect rect = new CGRect();
- rect.origin.x = x;
- rect.origin.y = y;
- rect.size.width = size.width;
- rect.size.height = size.height;
- int displayCount = 16;
- int /*long*/ displays = OS.malloc(4 * displayCount), countPtr = OS.malloc(4);
- if (OS.CGGetDisplaysWithRect(rect, displayCount, displays, countPtr) != 0) return;
- int[] count = new int[1], display = new int[1];
- OS.memmove(count, countPtr, OS.PTR_SIZEOF);
- for (int i = 0; i < count[0]; i++) {
- OS.memmove(display, displays + (i * 4), 4);
- OS.CGDisplayBounds(display[0], rect);
- int /*long*/ address = OS.CGDisplayBaseAddress(display[0]);
- if (address != 0) {
- int /*long*/ width = OS.CGDisplayPixelsWide(display[0]);
- int /*long*/ height = OS.CGDisplayPixelsHigh(display[0]);
- int /*long*/ bpr = OS.CGDisplayBytesPerRow(display[0]);
- int /*long*/ bpp = OS.CGDisplayBitsPerPixel(display[0]);
- int /*long*/ bps = OS.CGDisplayBitsPerSample(display[0]);
- int bitmapInfo = OS.kCGImageAlphaNoneSkipFirst;
- switch ((int)/*63*/bpp) {
- case 16: bitmapInfo |= OS.kCGBitmapByteOrder16Host; break;
- case 32: bitmapInfo |= OS.kCGBitmapByteOrder32Host; break;
- }
- int /*long*/ srcImage = 0;
- if (OS.__BIG_ENDIAN__() && OS.VERSION >= 0x1040) {
- int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- int /*long*/ context = OS.CGBitmapContextCreate(address, width, height, bps, bpr, colorspace, bitmapInfo);
- OS.CGColorSpaceRelease(colorspace);
- srcImage = OS.CGBitmapContextCreateImage(context);
- OS.CGContextRelease(context);
- } else {
- int /*long*/ provider = OS.CGDataProviderCreateWithData(0, address, bpr * height, 0);
- int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- srcImage = OS.CGImageCreate(width, height, bps, bpp, bpr, colorspace, bitmapInfo, provider, 0, true, 0);
- OS.CGColorSpaceRelease(colorspace);
- OS.CGDataProviderRelease(provider);
- }
- copyArea(image, x - (int)rect.origin.x, y - (int)rect.origin.y, srcImage);
- if (srcImage != 0) OS.CGImageRelease(srcImage);
- }
- }
- OS.free(displays);
- OS.free(countPtr);
- }
- } finally {
- uncheckGC(pool);
- }
-}
-
-void copyArea (Image image, int x, int y, int /*long*/ srcImage) {
- if (srcImage == 0) return;
- NSBitmapImageRep rep = image.getRepresentation();
- int /*long*/ bpc = rep.bitsPerSample();
- int /*long*/ width = rep.pixelsWide();
- int /*long*/ height = rep.pixelsHigh();
- int /*long*/ bpr = rep.bytesPerRow();
- int alphaInfo = rep.hasAlpha() ? OS.kCGImageAlphaFirst : OS.kCGImageAlphaNoneSkipFirst;
- int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- int /*long*/ context = OS.CGBitmapContextCreate(rep.bitmapData(), width, height, bpc, bpr, colorspace, alphaInfo);
- OS.CGColorSpaceRelease(colorspace);
- if (context != 0) {
- CGRect rect = new CGRect();
- rect.origin.x = -x;
- rect.origin.y = y;
- rect.size.width = OS.CGImageGetWidth(srcImage);
- rect.size.height = OS.CGImageGetHeight(srcImage);
- OS.CGContextTranslateCTM(context, 0, -(rect.size.height - height));
- OS.CGContextDrawImage(context, rect, srcImage);
- OS.CGContextRelease(context);
- }
-}
-
-/**
- * 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) {
- copyArea(srcX, srcY, width, height, destX, destY, true);
-}
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width <= 0 || height <= 0) return;
- int deltaX = destX - srcX, deltaY = destY - srcY;
- if (deltaX == 0 && deltaY == 0) return;
- NSAutoreleasePool pool = checkGC(TRANSFORM | CLIPPING);
- try {
- Image image = data.image;
- if (image != null) {
- NSImage imageHandle = image.handle;
- NSSize size = imageHandle.size();
- int imgHeight = (int)size.height;
- handle.saveGraphicsState();
- NSAffineTransform transform = NSAffineTransform.transform();
- transform.scaleXBy(1, -1);
- transform.translateXBy(0, -(height + 2 * destY));
- transform.concat();
- NSRect srcRect = new NSRect();
- srcRect.x = srcX;
- srcRect.y = imgHeight - (srcY + height);
- srcRect.width = width;
- srcRect.height = height;
- NSRect destRect = new NSRect();
- destRect.x = destX;
- destRect.y = destY;
- destRect.width = width;
- destRect.height = height;
- imageHandle.drawInRect(destRect, srcRect, OS.NSCompositeCopy, 1);
- handle.restoreGraphicsState();
- return;
- }
- if (data.view != null) {
- NSView view = data.view;
- NSRect visibleRect = view.visibleRect();
- if (visibleRect.width <= 0 || visibleRect.height <= 0) return;
- NSRect damage = new NSRect();
- damage.x = srcX;
- damage.y = srcY;
- damage.width = width;
- damage.height = height;
- NSPoint dest = new NSPoint();
- dest.x = destX;
- dest.y = destY;
-
- view.lockFocus();
- OS.NSCopyBits(0, damage , dest);
- view.unlockFocus();
-
- if (paint) {
- boolean disjoint = (destX + width < srcX) || (srcX + width < destX) || (destY + height < srcY) || (srcY + height < destY);
- if (disjoint) {
- view.setNeedsDisplayInRect(damage);
- } else {
- if (deltaX != 0) {
- int newX = destX - deltaX;
- if (deltaX < 0) newX = destX + width;
- damage.x = newX;
- damage.width = Math.abs(deltaX);
- view.setNeedsDisplayInRect(damage);
- }
- if (deltaY != 0) {
- int newY = destY - deltaY;
- if (deltaY < 0) newY = destY + height;
- damage.x = srcX;
- damage.y = newY;
- damage.width = width;
- damage.height = Math.abs (deltaY);
- view.setNeedsDisplayInRect(damage);
- }
- }
-
- NSRect srcRect = new NSRect();
- srcRect.x = srcX;
- srcRect.y = srcY;
- srcRect.width = width;
- srcRect.height = height;
- OS.NSIntersectionRect(visibleRect, visibleRect, srcRect);
-
- if (!OS.NSEqualRects(visibleRect, srcRect)) {
- if (srcRect.x != visibleRect.x) {
- damage.x = srcRect.x + deltaX;
- damage.y = srcRect.y + deltaY;
- damage.width = visibleRect.x - srcRect.x;
- damage.height = srcRect.height;
- view.setNeedsDisplayInRect(damage);
- }
- if (visibleRect.x + visibleRect.width != srcRect.x + srcRect.width) {
- damage.x = srcRect.x + visibleRect.width + deltaX;
- damage.y = srcRect.y + deltaY;
- damage.width = srcRect.width - visibleRect.width;
- damage.height = srcRect.height;
- view.setNeedsDisplayInRect(damage);
- }
- if (visibleRect.y != srcRect.y) {
- damage.x = visibleRect.x + deltaX;
- damage.y = srcRect.y + deltaY;
- damage.width = visibleRect.width;
- damage.height = visibleRect.y - srcRect.y;
- view.setNeedsDisplayInRect(damage);
- }
- if (visibleRect.y + visibleRect.height != srcRect.y + srcRect.height) {
- damage.x = visibleRect.x + deltaX;
- damage.y = visibleRect.y + visibleRect.height + deltaY;
- damage.width = visibleRect.width;
- damage.height = srcRect.y + srcRect.height - (visibleRect.y + visibleRect.height);
- view.setNeedsDisplayInRect(damage);
- }
- }
- }
- return;
- }
- } finally {
- uncheckGC(pool);
- }
-}
-
-static int /*long*/ createCGPathRef(NSBezierPath nsPath) {
- int /*long*/ count = nsPath.elementCount();
- if (count > 0) {
- int /*long*/ cgPath = OS.CGPathCreateMutable();
- if (cgPath == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- int /*long*/ points = OS.malloc(NSPoint.sizeof * 3);
- if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- float /*double*/ [] pt = new float /*double*/ [6];
- for (int i = 0; i < count; i++) {
- int element = (int)/*64*/nsPath.elementAtIndex(i, points);
- switch (element) {
- case OS.NSMoveToBezierPathElement:
- OS.memmove(pt, points, NSPoint.sizeof);
- OS.CGPathMoveToPoint(cgPath, 0, pt[0], pt[1]);
- break;
- case OS.NSLineToBezierPathElement:
- OS.memmove(pt, points, NSPoint.sizeof);
- OS.CGPathAddLineToPoint(cgPath, 0, pt[0], pt[1]);
- break;
- case OS.NSCurveToBezierPathElement:
- OS.memmove(pt, points, NSPoint.sizeof * 3);
- OS.CGPathAddCurveToPoint(cgPath, 0, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5]);
- break;
- case OS.NSClosePathBezierPathElement:
- OS.CGPathCloseSubpath(cgPath);
- break;
- }
- }
- OS.free(points);
- return cgPath;
- }
- return 0;
-}
-
-
-
-NSBezierPath createNSBezierPath (int /*long*/ cgPath) {
- Callback callback = new Callback(this, "applierFunc", 2);
- int /*long*/ proc = callback.getAddress();
- if (proc == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS);
- count = typeCount = 0;
- element = new CGPathElement();
- OS.CGPathApply(cgPath, 0, proc);
- types = new byte[typeCount];
- points = new float /*double*/ [count];
- point = new float /*double*/ [6];
- count = typeCount = 0;
- OS.CGPathApply(cgPath, 0, proc);
- callback.dispose();
-
- NSBezierPath bezierPath = NSBezierPath.bezierPath();
- NSPoint nsPoint = new NSPoint(), nsPoint2 = new NSPoint(), nsPoint3 = new NSPoint();
- for (int i = 0, j = 0; i < types.length; i++) {
- switch (types[i]) {
- case SWT.PATH_MOVE_TO:
- nsPoint.x = points[j++];
- nsPoint.y = points[j++];
- bezierPath.moveToPoint(nsPoint);
- break;
- case SWT.PATH_LINE_TO:
- nsPoint.x = points[j++];
- nsPoint.y = points[j++];
- bezierPath.lineToPoint(nsPoint);
- break;
- case SWT.PATH_CUBIC_TO:
- nsPoint2.x = points[j++];
- nsPoint2.y = points[j++];
- nsPoint3.x = points[j++];
- nsPoint3.y = points[j++];
- nsPoint.x = points[j++];
- nsPoint.y = points[j++];
- bezierPath.curveToPoint(nsPoint, nsPoint2, nsPoint3);
- break;
- case SWT.PATH_QUAD_TO:
- float /*double*/ currentX = nsPoint.x;
- float /*double*/ currentY = nsPoint.y;
- nsPoint2.x = points[j++];
- nsPoint2.y = points[j++];
- nsPoint.x = points[j++];
- nsPoint.y = points[j++];
- float /*double*/ x0 = currentX;
- float /*double*/ y0 = currentY;
- float /*double*/ cx1 = x0 + 2 * (nsPoint2.x - x0) / 3;
- float /*double*/ cy1 = y0 + 2 * (nsPoint2.y - y0) / 3;
- float /*double*/ cx2 = cx1 + (nsPoint.x - x0) / 3;
- float /*double*/ cy2 = cy1 + (nsPoint.y - y0) / 3;
- nsPoint2.x = cx1;
- nsPoint2.y = cy1;
- nsPoint3.x = cx2;
- nsPoint3.y = cy2;
- bezierPath.curveToPoint(nsPoint, nsPoint2, nsPoint3);
- break;
- case SWT.PATH_CLOSE:
- bezierPath.closePath();
- break;
- default:
- dispose();
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
- element = null;
- types = null;
- points = null;
- nsPoint = null;
- return bezierPath;
-}
-
-NSAttributedString createString(String string, int flags, boolean draw) {
- NSMutableDictionary dict = ((NSMutableDictionary)new NSMutableDictionary().alloc()).initWithCapacity(5);
- Font font = data.font;
- dict.setObject(font.handle, OS.NSFontAttributeName);
- font.addTraits(dict);
- if (draw) {
- Pattern pattern = data.foregroundPattern;
- if (pattern != null) {
- if (pattern.color != null) dict.setObject(pattern.color, OS.NSForegroundColorAttributeName);
- } else {
- NSColor fg = data.fg;
- if (fg == null) {
- float /*double*/ [] color = data.foreground;
- fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f);
- fg.retain();
- }
- dict.setObject(fg, OS.NSForegroundColorAttributeName);
- }
- }
- if ((flags & SWT.DRAW_TAB) == 0) {
- dict.setObject(device.paragraphStyle, OS.NSParagraphStyleAttributeName);
- }
- int length = string.length();
- char[] chars = new char[length];
- string.getChars(0, length, chars, 0);
- int breakCount = 0;
- int[] breaks = null;
- if ((flags & SWT.DRAW_MNEMONIC) !=0 || (flags & SWT.DRAW_DELIMITER) == 0) {
- int i=0, j=0;
- while (i < chars.length) {
- char c = chars [j++] = chars [i++];
- switch (c) {
- case '&': {
- if ((flags & SWT.DRAW_MNEMONIC) != 0) {
- if (i == chars.length) {continue;}
- if (chars [i] == '&') {i++; continue;}
- j--;
- }
- break;
- }
- case '\r':
- case '\n': {
- if ((flags & SWT.DRAW_DELIMITER) == 0) {
- if (c == '\r' && i != chars.length && chars[i] == '\n') i++;
- j--;
- if (breaks == null) {
- breaks = new int[4];
- } else if (breakCount == breaks.length) {
- int[] newBreaks = new int[breaks.length + 4];
- System.arraycopy(breaks, 0, newBreaks, 0, breaks.length);
- breaks = newBreaks;
- }
- breaks[breakCount++] = j;
- }
- break;
- }
- }
- }
- length = j;
- }
- NSString str = ((NSString)new NSString().alloc()).initWithCharacters(chars, length);
- NSAttributedString attribStr = ((NSAttributedString)new NSAttributedString().alloc()).initWithString(str, dict);
- dict.release();
- str.release();
- return attribStr;
-}
-
-void destroy() {
- /* Free resources */
- Image image = data.image;
- if (image != null) {
- image.memGC = null;
- image.createAlpha();
- }
- if (data.fg != null) data.fg.release();
- if (data.bg != null) data.bg.release();
- if (data.path != null) data.path.release();
- if (data.clipPath != null) data.clipPath.release();
- if (data.visiblePath != null) data.visiblePath.release();
- if (data.transform != null) data.transform.release();
- if (data.inverseTransform != null) data.inverseTransform.release();
- data.path = data.clipPath = data.visiblePath = null;
- data.transform = data.inverseTransform = null;
- data.fg = data.bg = null;
-
- /* Dispose the GC */
- if (drawable != null) drawable.internal_dispose_GC(handle.id, data);
- handle.restoreGraphicsState();
- handle.release();
-
- drawable = null;
- data.image = null;
- data = null;
- handle = null;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- if (width == 0 || height == 0 || arcAngle == 0) return;
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- handle.saveGraphicsState();
- NSAffineTransform transform = NSAffineTransform.transform();
- float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset;
- transform.translateXBy(x + xOffset + width / 2f, y + yOffset + height / 2f);
- transform.scaleXBy(width / 2f, height / 2f);
- NSBezierPath path = data.path;
- NSPoint center = new NSPoint();
- float sAngle = -startAngle;
- float eAngle = -(startAngle + arcAngle);
- path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0);
- path.transformUsingAffineTransform(transform);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- handle.restoreGraphicsState();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM);
- try {
- int[] metric = new int[1];
- OS.GetThemeMetric(OS.kThemeMetricFocusRectOutset, metric);
- CGRect rect = new CGRect();
- rect.origin.x = x + metric[0];
- rect.origin.y = y + metric[0];
- rect.size.width = width - metric[0] * 2;
- rect.size.height = height - metric[0] * 2;
- OS.HIThemeDrawFocusRect(rect, true, handle.graphicsPort(), OS.kHIThemeOrientationNormal);
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- drawImage(image, 0, 0, -1, -1, x, y, -1, -1, true);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (srcWidth == 0 || srcHeight == 0 || destWidth == 0 || destHeight == 0) return;
- if (srcX < 0 || srcY < 0 || srcWidth < 0 || srcHeight < 0 || destWidth < 0 || destHeight < 0) {
- SWT.error (SWT.ERROR_INVALID_ARGUMENT);
- }
- if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- drawImage(image, srcX, srcY, srcWidth, srcHeight, destX, destY, destWidth, destHeight, false);
-}
-
-void drawImage(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple) {
- NSImage imageHandle = srcImage.handle;
- NSSize size = imageHandle.size();
- int imgWidth = (int)size.width;
- int imgHeight = (int)size.height;
- if (simple) {
- srcWidth = destWidth = imgWidth;
- srcHeight = destHeight = imgHeight;
- } else {
- simple = srcX == 0 && srcY == 0 &&
- srcWidth == destWidth && destWidth == imgWidth &&
- srcHeight == destHeight && destHeight == imgHeight;
- if (srcX + srcWidth > imgWidth || srcY + srcHeight > imgHeight) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
- NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM);
- try {
- if (srcImage.memGC != null) {
- srcImage.createAlpha();
- }
- handle.saveGraphicsState();
- NSAffineTransform transform = NSAffineTransform.transform();
- transform.scaleXBy(1, -1);
- transform.translateXBy(0, -(destHeight + 2 * destY));
- transform.concat();
- NSRect srcRect = new NSRect();
- srcRect.x = srcX;
- srcRect.y = imgHeight - (srcY + srcHeight);
- srcRect.width = srcWidth;
- srcRect.height = srcHeight;
- NSRect destRect = new NSRect();
- destRect.x = destX;
- destRect.y = destY;
- destRect.width = destWidth;
- destRect.height = destHeight;
- imageHandle.drawInRect(destRect, srcRect, OS.NSCompositeSourceOver, 1);
- handle.restoreGraphicsState();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- NSBezierPath path = data.path;
- NSPoint pt = new NSPoint();
- pt.x = x1 + data.drawXOffset;
- pt.y = y1 + data.drawYOffset;
- path.moveToPoint(pt);
- pt.x = x2 + data.drawXOffset;
- pt.y = y2 + data.drawYOffset;
- path.lineToPoint(pt);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- NSBezierPath path = data.path;
- NSRect rect = new NSRect();
- rect.x = x + data.drawXOffset;
- rect.y = y + data.drawXOffset;
- rect.width = width;
- rect.height = height;
- path.appendBezierPathWithOvalInRect(rect);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (path.handle == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- handle.saveGraphicsState();
- NSAffineTransform transform = NSAffineTransform.transform();
- transform.translateXBy(data.drawXOffset, data.drawYOffset);
- transform.concat();
- NSBezierPath drawPath = data.path;
- drawPath.appendBezierPath(path.handle);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(drawPath, pattern);
- } else {
- drawPath.stroke();
- }
- drawPath.removeAllPoints();
- handle.restoreGraphicsState();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(FOREGROUND_FILL | CLIPPING | TRANSFORM);
- try {
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = 1;
- rect.height = 1;
- NSBezierPath path = data.path;
- path.appendBezierPathWithRect(rect);
- path.fill();
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (pointArray.length < 4) return;
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset;
- NSBezierPath path = data.path;
- NSPoint pt = new NSPoint();
- pt.x = pointArray[0] + xOffset;
- pt.y = pointArray[1] + yOffset;
- path.moveToPoint(pt);
- int end = pointArray.length / 2 * 2;
- for (int i = 2; i < end; i+=2) {
- pt.x = pointArray[i] + xOffset;
- pt.y = pointArray[i+1] + yOffset;
- path.lineToPoint(pt);
- }
- path.closePath();
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (pointArray.length < 4) return;
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset;
- NSBezierPath path = data.path;
- NSPoint pt = new NSPoint();
- pt.x = pointArray[0] + xOffset;
- pt.y = pointArray[1] + yOffset;
- path.moveToPoint(pt);
- int end = pointArray.length / 2 * 2;
- for (int i = 2; i < end; i+=2) {
- pt.x = pointArray[i] + xOffset;
- pt.y = pointArray[i+1] + yOffset;
- path.lineToPoint(pt);
- }
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- NSRect rect = new NSRect();
- rect.x = x + data.drawXOffset;
- rect.y = y + data.drawYOffset;
- rect.width = width;
- rect.height = height;
- NSBezierPath path = data.path;
- path.appendBezierPathWithRect(rect);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (arcWidth == 0 || arcHeight == 0) {
- drawRectangle(x, y, width, height);
- return;
- }
- NSAutoreleasePool pool = checkGC(DRAW);
- try {
- NSBezierPath path = data.path;
- NSRect rect = new NSRect();
- rect.x = x + data.drawXOffset;
- rect.y = y + data.drawYOffset;
- rect.width = width;
- rect.height = height;
- path.appendBezierPathWithRoundedRect(rect, arcWidth / 2f, arcHeight / 2f);
- Pattern pattern = data.foregroundPattern;
- if (pattern != null && pattern.gradient != null) {
- strokePattern(path, pattern);
- } else {
- path.stroke();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM | FONT);
- try {
- handle.saveGraphicsState();
- boolean mode = true;
- switch (data.textAntialias) {
- case SWT.DEFAULT:
- /* Printer is off by default */
- if (!handle.isDrawingToScreen()) mode = false;
- break;
- case SWT.OFF: mode = false; break;
- case SWT.ON: mode = true; break;
- }
- handle.setShouldAntialias(mode);
- NSAttributedString str = createString(string, flags, true);
- if ((flags & SWT.DRAW_TRANSPARENT) == 0) {
- NSSize size = str.size();
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = size.width;
- rect.height = size.height;
- NSColor bg = data.bg;
- if (bg == null) {
- float /*double*/ [] color = data.background;
- bg = data.bg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f);
- bg.retain();
- }
- bg.setFill();
- NSBezierPath.fillRect(rect);
- str.drawInRect(rect);
- } else {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- str.drawAtPoint(pt);
- }
- str.release();
- handle.restoreGraphicsState();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof GC)) return false;
- return handle == ((GC)object).handle;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- if (width == 0 || height == 0 || arcAngle == 0) return;
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- handle.saveGraphicsState();
- NSAffineTransform transform = NSAffineTransform.transform();
- float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset;
- transform.translateXBy(x + xOffset + width / 2f, y + yOffset + height / 2f);
- transform.scaleXBy(width / 2f, height / 2f);
- NSBezierPath path = data.path;
- NSPoint center = new NSPoint();
- path.moveToPoint(center);
- float sAngle = -startAngle;
- float eAngle = -(startAngle + arcAngle);
- path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0);
- path.closePath();
- path.transformUsingAffineTransform(transform);
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(path, pattern);
- } else {
- path.fill();
- }
- path.removeAllPoints();
- handle.restoreGraphicsState();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if ((width == 0) || (height == 0)) return;
- NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM);
- try {
- RGB backgroundRGB, foregroundRGB;
- backgroundRGB = getBackground().getRGB();
- foregroundRGB = getForeground().getRGB();
-
- RGB fromRGB, toRGB;
- fromRGB = foregroundRGB;
- toRGB = backgroundRGB;
- boolean swapColors = false;
- if (width < 0) {
- x += width; width = -width;
- if (! vertical) swapColors = true;
- }
- if (height < 0) {
- y += height; height = -height;
- if (vertical) swapColors = true;
- }
- if (swapColors) {
- fromRGB = backgroundRGB;
- toRGB = foregroundRGB;
- }
- if (fromRGB.equals(toRGB)) {
- fillRectangle(x, y, width, height);
- } else {
- NSColor startingColor = NSColor.colorWithDeviceRed(fromRGB.red / 255f, fromRGB.green / 255f, fromRGB.blue / 255f, data.alpha / 255f);
- NSColor endingColor = NSColor.colorWithDeviceRed(toRGB.red / 255f, toRGB.green / 255f, toRGB.blue / 255f, data.alpha / 255f);
- NSGradient gradient = ((NSGradient)new NSGradient().alloc()).initWithStartingColor(startingColor, endingColor);
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- gradient.drawInRect(rect, vertical ? 90 : 0);
- gradient.release();
- }
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- NSBezierPath path = data.path;
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- path.appendBezierPathWithOvalInRect(rect);
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(path, pattern);
- } else {
- path.fill();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-void fillPattern(NSBezierPath path, Pattern pattern) {
- handle.saveGraphicsState();
- path.addClip();
- NSRect bounds = path.bounds();
- NSPoint start = new NSPoint();
- start.x = pattern.pt1.x;
- start.y = pattern.pt1.y;
- NSPoint end = new NSPoint();
- end.x = pattern.pt2.x;
- end.y = pattern.pt2.y;
- float /*double*/ difx = end.x - start.x;
- float /*double*/ dify = end.y - start.y;
- if (difx == 0 && dify == 0) {
- float /*double*/ [] color = pattern.color1;
- NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f).setFill();
- path.fill();
- handle.restoreGraphicsState();
- return;
- }
- float /*double*/ startx, starty, endx, endy;
- if (difx == 0 || dify == 0) {
- startx = bounds.x;
- starty = bounds.y;
- endx = bounds.x + bounds.width;
- endy = bounds.y + bounds.height;
- if (difx < 0 || dify < 0) {
- startx = endx;
- starty = endy;
- endx = bounds.x;
- endy = bounds.y;
- }
- } else {
- float /*double*/ m = (end.y-start.y)/(end.x - start.x);
- float /*double*/ b = end.y - (m * end.x);
- float /*double*/ m2 = -1/m; //perpendicular slope
- float /*double*/ b2 = bounds.y - (m2 * bounds.x);
- startx = endx = (b - b2) / (m2 - m);
- b2 = (bounds.y + bounds.height) - (m2 * bounds.x);
- float /*double*/ x2 = (b - b2) / (m2 - m);
- startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2);
- endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2);
- b2 = bounds.y - (m2 * (bounds.x + bounds.width));
- x2 = (b - b2) / (m2 - m);
- startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2);
- endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2);
- b2 = (bounds.y + bounds.height) - (m2 * (bounds.x + bounds.width));
- x2 = (b - b2) / (m2 - m);
- startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2);
- endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2);
- starty = (m * startx) + b;
- endy = (m * endx) + b;
- }
- if (difx != 0) {
- while ((difx > 0 && start.x >= startx) || (difx < 0 && start.x <= startx)) {
- start.x -= difx;
- start.y -= dify;
- }
- } else {
- while ((dify > 0 && start.y >= starty) || (dify < 0 && start.y <= starty)) {
- start.x -= difx;
- start.y -= dify;
- }
- }
- end.x = start.x;
- end.y = start.y;
- do {
- end.x += difx;
- end.y += dify;
- pattern.gradient.drawFromPoint(start, end, 0);
- start.x = end.x;
- start.y = end.y;
- } while (
- (difx > 0 && end.x <= endx) ||
- (difx < 0 && end.x >= endx) ||
- (difx == 0 && ((dify > 0 && end.y <= endy) || (dify < 0 && end.y >= endy)))
- );
- handle.restoreGraphicsState();
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (path.handle == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- NSBezierPath drawPath = data.path;
- drawPath.appendBezierPath(path.handle);
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(drawPath, pattern);
- } else {
- drawPath.fill();
- }
- drawPath.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (pointArray.length < 4) return;
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- NSBezierPath path = data.path;
- NSPoint pt = new NSPoint();
- pt.x = pointArray[0];
- pt.y = pointArray[1];
- path.moveToPoint(pt);
- int end = pointArray.length / 2 * 2;
- for (int i = 2; i < end; i+=2) {
- pt.x = pointArray[i];
- pt.y = pointArray[i+1];
- path.lineToPoint(pt);
- }
- path.closePath();
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(path, pattern);
- } else {
- path.fill();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- NSBezierPath path = data.path;
- path.appendBezierPathWithRect(rect);
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(path, pattern);
- } else {
- path.fill();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (arcWidth == 0 || arcHeight == 0) {
- fillRectangle(x, y, width, height);
- return;
- }
- NSAutoreleasePool pool = checkGC(FILL);
- try {
- NSBezierPath path = data.path;
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- path.appendBezierPathWithRoundedRect(rect, arcWidth / 2f, arcHeight / 2f);
- Pattern pattern = data.backgroundPattern;
- if (pattern != null && pattern.gradient != null) {
- fillPattern(path, pattern);
- } else {
- path.fill();
- }
- path.removeAllPoints();
- } finally {
- uncheckGC(pool);
- }
-}
-
-void strokePattern(NSBezierPath path, Pattern pattern) {
- handle.saveGraphicsState();
- int /*long*/ cgPath = createCGPathRef(path);
- int /*long*/ cgContext = handle.graphicsPort();
- OS.CGContextSaveGState(cgContext);
- initCGContext(cgContext);
- OS.CGContextAddPath(cgContext, cgPath);
- OS.CGContextReplacePathWithStrokedPath(cgContext);
- OS.CGPathRelease(cgPath);
- cgPath = 0;
- cgPath = OS.CGContextCopyPath(cgContext);
- if (cgPath == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- OS.CGContextRestoreGState(cgContext);
- NSBezierPath strokePath = createNSBezierPath(cgPath);
- OS.CGPathRelease(cgPath);
- fillPattern(strokePath, pattern);
- handle.restoreGraphicsState();
-}
-
-void flush () {
- handle.flushGraphics();
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- //NOT DONE
- return stringExtent(new String(new char[]{ch})).x;
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return Color.cocoa_new (data.device, data.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() {
- if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED);
- return data.backgroundPattern;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return true;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.alpha;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.antialias;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- //NOT DONE
- return stringExtent(new String(new char[]{ch})).x;
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSRect rect = null;
- if (data.view != null) {
- rect = data.view.visibleRect();
- } else {
- rect = new NSRect();
- if (data.image != null) {
- NSSize size = data.image.handle.size();
- rect.width = size.width;
- rect.height = size.height;
- } else if (data.size != null) {
- rect.width = data.size.width;
- rect.height = data.size.height;
- }
- }
- if (data.paintRect != null || data.clipPath != null || data.inverseTransform != null) {
- if (data.paintRect != null) {
- OS.NSIntersectionRect(rect, rect, data.paintRect);
- }
- if (data.clipPath != null) {
- NSRect clip = data.clipPath.bounds();
- OS.NSIntersectionRect(rect, rect, clip);
- }
- if (data.inverseTransform != null && rect.width > 0 && rect.height > 0) {
- NSPoint pt = new NSPoint();
- pt.x = rect.x;
- pt.y = rect.y;
- NSSize size = new NSSize();
- size.width = rect.width;
- size.height = rect.height;
- pt = data.inverseTransform.transformPoint(pt);
- size = data.inverseTransform.transformSize(size);
- rect.x = pt.x;
- rect.y = pt.y;
- rect.width = size.width;
- rect.height = size.height;
- }
- }
- return new Rectangle((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- region.subtract(region);
- NSRect rect = null;
- if (data.view != null) {
- rect = data.view.visibleRect();
- } else {
- rect = new NSRect();
- if (data.image != null) {
- NSSize size = data.image.handle.size();
- rect.width = size.width;
- rect.height = size.height;
- } else if (data.size != null) {
- rect.width = data.size.width;
- rect.height = data.size.height;
- }
- }
- region.add((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
- NSRect paintRect = data.paintRect;
- if (paintRect != null) {
- region.intersect((int)paintRect.x, (int)paintRect.y, (int)paintRect.width, (int)paintRect.height);
- }
- if (data.clipPath != null) {
- NSBezierPath clip = data.clipPath.bezierPathByFlatteningPath();
- int count = (int)/*64*/clip.elementCount();
- int pointCount = 0;
- Region clipRgn = new Region(device);
- int[] pointArray = new int[count * 2];
- int /*long*/ points = OS.malloc(NSPoint.sizeof);
- if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- NSPoint pt = new NSPoint();
- for (int i = 0; i < count; i++) {
- int element = (int)/*64*/clip.elementAtIndex(i, points);
- switch (element) {
- case OS.NSMoveToBezierPathElement:
- if (pointCount != 0) clipRgn.add(pointArray, pointCount);
- pointCount = 0;
- OS.memmove(pt, points, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- break;
- case OS.NSLineToBezierPathElement:
- OS.memmove(pt, points, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- break;
- case OS.NSClosePathBezierPathElement:
- if (pointCount != 0) clipRgn.add(pointArray, pointCount);
- pointCount = 0;
- break;
- }
- }
- if (pointCount != 0) clipRgn.add(pointArray, pointCount);
- OS.free(points);
- region.intersect(clipRgn);
- clipRgn.dispose();
- }
- if (data.inverseTransform != null) {
- region.convertRgn(data.inverseTransform);
- }
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.fillRule;
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.font;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = checkGC(FONT);
- try {
- NSFont font = data.font.handle;
- int ascent = (int)(0.5f + font.ascender());
- int descent = (int)(0.5f + (-font.descender() + font.leading()));
- String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- int averageCharWidth = stringExtent(s).x / s.length();
- return FontMetrics.cocoa_new(ascent, descent, averageCharWidth, 0, ascent + descent);
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED);
- return Color.cocoa_new(data.device, data.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() {
- if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED);
- return data.foregroundPattern;
-}
-
-/**
- * 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
- *
- * @since 3.2
- * @noreference This method is not intended to be referenced by clients.
- */
-public GCData getGCData() {
- if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED);
- return data;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- int interpolation = (int)/*64*/handle.imageInterpolation();
- switch (interpolation) {
- case OS.NSImageInterpolationDefault: return SWT.DEFAULT;
- case OS.NSImageInterpolationNone: return SWT.NONE;
- case OS.NSImageInterpolationLow: return SWT.LOW;
- case OS.NSImageInterpolationHigh: return SWT.HIGH;
- }
- return SWT.DEFAULT;
-}
-
-/**
- * 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- float[] dashes = null;
- if (data.lineDashes != null) {
- dashes = new float[data.lineDashes.length];
- System.arraycopy(data.lineDashes, 0, dashes, 0, dashes.length);
- }
- return new LineAttributes(data.lineWidth, data.lineCap, data.lineJoin, data.lineStyle, dashes, data.lineDashesOffset, data.lineMiterLimit);
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.lineCap;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (data.lineDashes == null) return null;
- int[] lineDashes = new int[data.lineDashes.length];
- for (int i = 0; i < lineDashes.length; i++) {
- lineDashes[i] = (int)data.lineDashes[i];
- }
- return lineDashes;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.lineJoin;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.lineStyle;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return (int)data.lineWidth;
-}
-
-/**
- * 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 () {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.style;
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.textAntialias;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (transform == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAffineTransform cmt = data.transform;
- if (cmt != null) {
- NSAffineTransformStruct struct = cmt.transformStruct();
- transform.handle.setTransformStruct(struct);
- } else {
- transform.setElements(1, 0, 0, 1, 0, 0);
- }
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.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 handle != null ? (int)/*64*/handle.id : 0;
-}
-
-void init(Drawable drawable, GCData data, int /*long*/ context) {
- if (data.foreground != null) data.state &= ~(FOREGROUND | FOREGROUND_FILL);
- if (data.background != null) data.state &= ~BACKGROUND;
- if (data.font != null) data.state &= ~FONT;
- data.state &= ~DRAW_OFFSET;
-
- Image image = data.image;
- if (image != null) image.memGC = this;
- this.drawable = drawable;
- this.data = data;
- handle = new NSGraphicsContext(context);
- handle.retain();
- handle.saveGraphicsState();
- data.path = NSBezierPath.bezierPath();
- data.path.setWindingRule(data.fillRule == SWT.FILL_WINDING ? OS.NSNonZeroWindingRule : OS.NSEvenOddWindingRule);
- data.path.retain();
-}
-
-void initCGContext(int /*long*/ cgContext) {
- int state = data.state;
- if ((state & LINE_WIDTH) != 0) {
- OS.CGContextSetLineWidth(cgContext, data.lineWidth == 0 ? 1 : data.lineWidth);
- switch (data.lineStyle) {
- case SWT.LINE_DOT:
- case SWT.LINE_DASH:
- case SWT.LINE_DASHDOT:
- case SWT.LINE_DASHDOTDOT:
- state |= LINE_STYLE;
- }
- }
- if ((state & LINE_STYLE) != 0) {
- float[] dashes = null;
- float width = data.lineWidth;
- switch (data.lineStyle) {
- case SWT.LINE_SOLID: break;
- case SWT.LINE_DASH: dashes = width != 0 ? LINE_DASH : LINE_DASH_ZERO; break;
- case SWT.LINE_DOT: dashes = width != 0 ? LINE_DOT : LINE_DOT_ZERO; break;
- case SWT.LINE_DASHDOT: dashes = width != 0 ? LINE_DASHDOT : LINE_DASHDOT_ZERO; break;
- case SWT.LINE_DASHDOTDOT: dashes = width != 0 ? LINE_DASHDOTDOT : LINE_DASHDOTDOT_ZERO; break;
- case SWT.LINE_CUSTOM: dashes = data.lineDashes; break;
- }
- if (dashes != null) {
- float[] lengths = new float[dashes.length];
- for (int i = 0; i < lengths.length; i++) {
- lengths[i] = width == 0 || data.lineStyle == SWT.LINE_CUSTOM ? dashes[i] : dashes[i] * width;
- }
- OS.CGContextSetLineDash(cgContext, data.lineDashesOffset, lengths, lengths.length);
- } else {
- OS.CGContextSetLineDash(cgContext, 0, null, 0);
- }
- }
- if ((state & LINE_MITERLIMIT) != 0) {
- OS.CGContextSetMiterLimit(cgContext, data.lineMiterLimit);
- }
- if ((state & LINE_JOIN) != 0) {
- int joinStyle = 0;
- switch (data.lineJoin) {
- case SWT.JOIN_MITER: joinStyle = OS.kCGLineJoinMiter; break;
- case SWT.JOIN_ROUND: joinStyle = OS.kCGLineJoinRound; break;
- case SWT.JOIN_BEVEL: joinStyle = OS.kCGLineJoinBevel; break;
- }
- OS.CGContextSetLineJoin(cgContext, joinStyle);
- }
- if ((state & LINE_CAP) != 0) {
- int capStyle = 0;
- switch (data.lineCap) {
- case SWT.CAP_ROUND: capStyle = OS.kCGLineCapRound; break;
- case SWT.CAP_FLAT: capStyle = OS.kCGLineCapButt; break;
- case SWT.CAP_SQUARE: capStyle = OS.kCGLineCapSquare; break;
- }
- OS.CGContextSetLineCap(cgContext, capStyle);
- }
-}
-
-/**
- * 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() {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- return data.clipPath != null;
-}
-
-/**
- * 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 using the GC.
- *
- * @return <code>true</code> when the GC is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-boolean isIdentity(float[] transform) {
- return transform[0] == 1 && transform[1] == 0 && transform[2] == 0
- && transform[3] == 1 && transform[4] == 0 && transform[5] == 0;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (!advanced) {
- setAlpha(0xFF);
- setAntialias(SWT.DEFAULT);
- setBackgroundPattern(null);
- setClipping((Rectangle)null);
- setForegroundPattern(null);
- setInterpolation(SWT.DEFAULT);
- setTextAntialias(SWT.DEFAULT);
- setTransform(null);
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- data.alpha = alpha & 0xFF;
- data.state &= ~(BACKGROUND | FOREGROUND | FOREGROUND_FILL);
-
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- boolean mode = true;
- switch (antialias) {
- case SWT.DEFAULT:
- /* Printer is off by default */
- if (!handle.isDrawingToScreen()) mode = false;
- break;
- case SWT.OFF: mode = false; break;
- case SWT.ON: mode = true; break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.antialias = antialias;
- handle.setShouldAntialias(mode);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- data.background = color.handle;
- data.backgroundPattern = null;
- if (data.bg != null) data.bg.release();
- data.bg = null;
- data.state &= ~BACKGROUND;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pattern != null && pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (data.backgroundPattern == pattern) return;
- data.backgroundPattern = pattern;
- data.state &= ~BACKGROUND;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (width < 0) {
- x = x + width;
- width = -width;
- }
- if (height < 0) {
- y = y + height;
- height = -height;
- }
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- NSBezierPath path = NSBezierPath.bezierPathWithRect(rect);
- path.retain();
- setClipping(path);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (path != null && path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- setClipping(new NSBezierPath(path.handle.copy().id));
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) {
- setClipping((NSBezierPath)null);
- } else {
- 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (region != null && region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- setClipping(region != null ? region.getPath() : null);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void setClipping(NSBezierPath path) {
- if (data.clipPath != null) {
- data.clipPath.release();
- data.clipPath = null;
- }
- if (path != null) {
- data.clipPath = path;
- if (data.transform != null) {
- data.clipPath.transformUsingAffineTransform(data.transform);
- }
- }
- data.state &= ~CLIPPING;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- switch (rule) {
- case SWT.FILL_WINDING:
- case SWT.FILL_EVEN_ODD: break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.fillRule = rule;
- data.path.setWindingRule(rule == SWT.FILL_WINDING ? OS.NSNonZeroWindingRule : OS.NSEvenOddWindingRule);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (font != null && font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- data.font = font != null ? font : data.device.systemFont;
- data.state &= ~FONT;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- data.foreground = color.handle;
- data.foregroundPattern = null;
- if (data.fg != null) data.fg.release();
- data.fg = null;
- data.state &= ~(FOREGROUND | FOREGROUND_FILL);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pattern != null && pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (data.foregroundPattern == pattern) return;
- data.foregroundPattern = pattern;
- data.state &= ~(FOREGROUND | FOREGROUND_FILL);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- int quality = 0;
- switch (interpolation) {
- case SWT.DEFAULT: quality = OS.NSImageInterpolationDefault; break;
- case SWT.NONE: quality = OS.NSImageInterpolationNone; break;
- case SWT.LOW: quality = OS.NSImageInterpolationLow; break;
- case SWT.HIGH: quality = OS.NSImageInterpolationHigh; break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- handle.setImageInterpolation(quality);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (attributes == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- int mask = 0;
- float lineWidth = attributes.width;
- if (lineWidth != data.lineWidth) {
- mask |= LINE_WIDTH | DRAW_OFFSET;
- }
- int lineStyle = attributes.style;
- if (lineStyle != data.lineStyle) {
- mask |= LINE_STYLE;
- switch (lineStyle) {
- case SWT.LINE_SOLID:
- case SWT.LINE_DASH:
- case SWT.LINE_DOT:
- case SWT.LINE_DASHDOT:
- case SWT.LINE_DASHDOTDOT:
- break;
- case SWT.LINE_CUSTOM:
- if (attributes.dash == null) lineStyle = SWT.LINE_SOLID;
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
- int join = attributes.join;
- if (join != data.lineJoin) {
- mask |= LINE_JOIN;
- switch (join) {
- case SWT.CAP_ROUND:
- case SWT.CAP_FLAT:
- case SWT.CAP_SQUARE:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
- int cap = attributes.cap;
- if (cap != data.lineCap) {
- mask |= LINE_CAP;
- switch (cap) {
- case SWT.JOIN_MITER:
- case SWT.JOIN_ROUND:
- case SWT.JOIN_BEVEL:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
- float[] dashes = attributes.dash;
- float[] lineDashes = data.lineDashes;
- if (dashes != null && dashes.length > 0) {
- boolean changed = lineDashes == null || lineDashes.length != dashes.length;
- for (int i = 0; i < dashes.length; i++) {
- float dash = dashes[i];
- if (dash <= 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (!changed && lineDashes[i] != dash) changed = true;
- }
- if (changed) {
- float[] newDashes = new float[dashes.length];
- System.arraycopy(dashes, 0, newDashes, 0, dashes.length);
- dashes = newDashes;
- mask |= LINE_STYLE;
- } else {
- dashes = lineDashes;
- }
- } else {
- if (lineDashes != null && lineDashes.length > 0) {
- mask |= LINE_STYLE;
- } else {
- dashes = lineDashes;
- }
- }
- float dashOffset = attributes.dashOffset;
- if (dashOffset != data.lineDashesOffset) {
- mask |= LINE_STYLE;
- }
- float miterLimit = attributes.miterLimit;
- if (miterLimit != data.lineMiterLimit) {
- mask |= LINE_MITERLIMIT;
- }
- if (mask == 0) return;
- data.lineWidth = lineWidth;
- data.lineStyle = lineStyle;
- data.lineCap = cap;
- data.lineJoin = join;
- data.lineDashes = dashes;
- data.lineDashesOffset = dashOffset;
- data.lineMiterLimit = miterLimit;
- data.state &= ~mask;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (data.lineCap == cap) return;
- switch (cap) {
- case SWT.CAP_ROUND:
- case SWT.CAP_FLAT:
- case SWT.CAP_SQUARE:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.lineCap = cap;
- data.state &= ~LINE_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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- float[] lineDashes = data.lineDashes;
- if (dashes != null && dashes.length > 0) {
- boolean changed = data.lineStyle != SWT.LINE_CUSTOM || lineDashes == null || lineDashes.length != dashes.length;
- for (int i = 0; i < dashes.length; i++) {
- int dash = dashes[i];
- if (dash <= 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (!changed && lineDashes[i] != dash) changed = true;
- }
- if (!changed) return;
- data.lineDashes = new float[dashes.length];
- for (int i = 0; i < dashes.length; i++) {
- data.lineDashes[i] = dashes[i];
- }
- data.lineStyle = SWT.LINE_CUSTOM;
- } else {
- if (data.lineStyle == SWT.LINE_SOLID && (lineDashes == null || lineDashes.length == 0)) return;
- data.lineDashes = null;
- data.lineStyle = SWT.LINE_SOLID;
- }
- data.state &= ~LINE_STYLE;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (data.lineJoin == join) return;
- switch (join) {
- case SWT.JOIN_MITER:
- case SWT.JOIN_ROUND:
- case SWT.JOIN_BEVEL:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.lineJoin = join;
- data.state &= ~LINE_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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (data.lineStyle == lineStyle) return;
- switch (lineStyle) {
- case SWT.LINE_SOLID:
- case SWT.LINE_DASH:
- case SWT.LINE_DOT:
- case SWT.LINE_DASHDOT:
- case SWT.LINE_DASHDOTDOT:
- break;
- case SWT.LINE_CUSTOM:
- if (data.lineDashes == null) lineStyle = SWT.LINE_SOLID;
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.lineStyle = lineStyle;
- data.state &= ~LINE_STYLE;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (data.lineWidth == lineWidth) return;
- data.lineWidth = lineWidth;
- data.state &= ~(LINE_WIDTH | DRAW_OFFSET);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- data.xorMode = xor;
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- switch (antialias) {
- case SWT.DEFAULT:
- case SWT.OFF:
- case SWT.ON:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- data.textAntialias = 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 (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (transform != null && transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (transform != null) {
- if (data.transform != null) data.transform.release();
- if (data.inverseTransform != null) data.inverseTransform.release();
- data.transform = ((NSAffineTransform)new NSAffineTransform().alloc()).initWithTransform(transform.handle);
- data.inverseTransform = ((NSAffineTransform)new NSAffineTransform().alloc()).initWithTransform(transform.handle);
- NSAffineTransformStruct struct = data.inverseTransform.transformStruct();
- if ((struct.m11 * struct.m22 - struct.m12 * struct.m21) != 0) {
- data.inverseTransform.invert();
- }
- } else {
- data.transform = data.inverseTransform = null;
- }
- data.state &= ~(TRANSFORM | DRAW_OFFSET);
-}
-
-/**
- * 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 textExtent(string, 0);
-}
-
-/**
- * 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) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = checkGC(FONT);
- try {
- NSAttributedString str = createString(string, flags, false);
- NSSize size = str.size();
- str.release();
- return new Point((int)size.width, (int)size.height);
- } finally {
- uncheckGC(pool);
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "GC {*DISPOSED*}";
- return "GC {" + handle + "}";
-}
-
-void uncheckGC(NSAutoreleasePool pool) {
- if (data.flippedContext != null && data.restoreContext) {
- NSGraphicsContext.static_restoreGraphicsState();
- data.restoreContext = false;
- }
- NSView view = data.view;
- if (view != null && data.paintRect == null) {
- if (data.thread != Thread.currentThread()) flush();
- }
- if (pool != null) pool.release();
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java
deleted file mode 100755
index 9e44658e63..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * Instances of this class are descriptions of GCs in terms
- * of unallocated platform-specific data fields.
- * <p>
- * <b>IMPORTANT:</b> This class is <em>not</em> part of the public
- * API for SWT. 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>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public final class GCData {
- public Device device;
- public int style, state = -1;
- public float /*double*/ [] foreground;
- public float /*double*/ [] background;
- public Pattern foregroundPattern;
- public Pattern backgroundPattern;
- public Font font;
- public int alpha = 0xFF;
- public float lineWidth;
- public int lineStyle = SWT.LINE_SOLID;
- public int lineCap = SWT.CAP_FLAT;
- public int lineJoin = SWT.JOIN_MITER;
- public float lineDashesOffset;
- public float[] lineDashes;
- public float lineMiterLimit = 10;
- public boolean xorMode;
- public int antialias = SWT.DEFAULT;
- public int textAntialias = SWT.DEFAULT;
- public int fillRule = SWT.FILL_EVEN_ODD;
- public Image image;
-
- public NSColor fg, bg;
- public float /*double*/ drawXOffset, drawYOffset;
- public NSRect paintRect;
- public NSBezierPath path;
- public NSAffineTransform transform, inverseTransform;
- public NSBezierPath clipPath, visiblePath;
- public int /*long*/ visibleRgn;
- public NSView view;
- public NSSize size;
- public Thread thread;
- public NSGraphicsContext flippedContext;
- public boolean restoreContext;
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java
deleted file mode 100755
index 646c5de74b..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java
+++ /dev/null
@@ -1,1192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.*;
-import java.io.*;
-
-/**
- * Instances of this class are graphics which have been prepared
- * for display on a specific device. That is, they are ready
- * to paint using methods such as <code>GC.drawImage()</code>
- * and display on widgets with, for example, <code>Button.setImage()</code>.
- * <p>
- * If loaded from a file format that supports it, an
- * <code>Image</code> may have transparency, meaning that certain
- * pixels are specified as being transparent when drawn. Examples
- * of file formats that support transparency are GIF and PNG.
- * </p><p>
- * There are two primary ways to use <code>Images</code>.
- * The first is to load a graphic file from disk and create an
- * <code>Image</code> from it. This is done using an <code>Image</code>
- * constructor, for example:
- * <pre>
- * Image i = new Image(device, "C:\\graphic.bmp");
- * </pre>
- * A graphic file may contain a color table specifying which
- * colors the image was intended to possess. In the above example,
- * these colors will be mapped to the closest available color in
- * SWT. It is possible to get more control over the mapping of
- * colors as the image is being created, using code of the form:
- * <pre>
- * ImageData data = new ImageData("C:\\graphic.bmp");
- * RGB[] rgbs = data.getRGBs();
- * // At this point, rgbs contains specifications of all
- * // the colors contained within this image. You may
- * // allocate as many of these colors as you wish by
- * // using the Color constructor Color(RGB), then
- * // create the image:
- * Image i = new Image(device, data);
- * </pre>
- * <p>
- * Applications which require even greater control over the image
- * loading process should use the support provided in class
- * <code>ImageLoader</code>.
- * </p><p>
- * Application code must explicitly invoke the <code>Image.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- *
- * @see Color
- * @see ImageData
- * @see ImageLoader
- * @see <a href="http://www.eclipse.org/swt/snippets/#image">Image snippets</a>
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Examples: GraphicsExample, ImageAnalyzer</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public final class Image extends Resource implements Drawable {
-
- /**
- * specifies whether the receiver is a bitmap or an icon
- * (one of <code>SWT.BITMAP</code>, <code>SWT.ICON</code>)
- * <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>
- */
- public int type;
-
- /**
- * the handle to the OS image resource
- * (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>
- */
- public NSImage handle;
-
- /**
- * specifies the transparent pixel
- */
- int transparentPixel = -1;
-
- /**
- * The GC the image is currently selected in.
- */
- GC memGC;
-
- /**
- * The alpha data of the image.
- */
- byte[] alphaData;
-
- /**
- * The global alpha value to be used for every pixel.
- */
- int alpha = -1;
-
- /**
- * The width of the image.
- */
- int width = -1;
-
- /**
- * The height of the image.
- */
- int height = -1;
-
- /**
- * Specifies the default scanline padding.
- */
- static final int DEFAULT_SCANLINE_PAD = 4;
-
-Image(Device device) {
- super(device);
-}
-
-/**
- * Constructs an empty instance of this class with the
- * specified width and height. The result may be drawn upon
- * by creating a GC and using any of its drawing operations,
- * as shown in the following example:
- * <pre>
- * Image i = new Image(device, width, height);
- * GC gc = new GC(i);
- * gc.drawRectangle(0, 0, 50, 50);
- * gc.dispose();
- * </pre>
- * <p>
- * Note: Some platforms may have a limitation on the size
- * of image that can be created (size depends on width, height,
- * and depth). For example, Windows 95, 98, and ME do not allow
- * images larger than 16M.
- * </p>
- *
- * @param device the device on which to create the image
- * @param width the width of the new image
- * @param height the height of the new image
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_INVALID_ARGUMENT - if either the width or height is negative or zero</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, int width, int height) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(width, height);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new instance of this class based on the
- * provided image, with an appearance that varies depending
- * on the value of the flag. The possible flag values are:
- * <dl>
- * <dt><b>{@link SWT#IMAGE_COPY}</b></dt>
- * <dd>the result is an identical copy of srcImage</dd>
- * <dt><b>{@link SWT#IMAGE_DISABLE}</b></dt>
- * <dd>the result is a copy of srcImage which has a <em>disabled</em> look</dd>
- * <dt><b>{@link SWT#IMAGE_GRAY}</b></dt>
- * <dd>the result is a copy of srcImage which has a <em>gray scale</em> look</dd>
- * </dl>
- *
- * @param device the device on which to create the image
- * @param srcImage the image to use as the source
- * @param flag the style, either <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code>
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if srcImage is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the flag is not one of <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code></li>
- * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon, or is otherwise in an invalid state</li>
- * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the image is not supported</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, Image srcImage, int flag) {
- super(device);
- if (srcImage == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (srcImage.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- switch (flag) {
- case SWT.IMAGE_COPY:
- case SWT.IMAGE_DISABLE:
- case SWT.IMAGE_GRAY:
- break;
- default:
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
-
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- device = this.device;
- this.type = srcImage.type;
- /* Get source image size */
- NSSize size = srcImage.handle.size();
- int width = (int)size.width;
- int height = (int)size.height;
- NSBitmapImageRep srcRep = srcImage.getRepresentation();
- int /*long*/ bpr = srcRep.bytesPerRow();
-
- /* Copy transparent pixel and alpha data when necessary */
- transparentPixel = srcImage.transparentPixel;
- alpha = srcImage.alpha;
- if (srcImage.alphaData != null) {
- alphaData = new byte[srcImage.alphaData.length];
- System.arraycopy(srcImage.alphaData, 0, alphaData, 0, alphaData.length);
- }
-
- /* Create the image */
- handle = (NSImage)new NSImage().alloc();
- handle = handle.initWithSize(size);
- NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- rep = rep.initWithBitmapDataPlanes(0, width, height, srcRep.bitsPerSample(), srcRep.samplesPerPixel(), srcRep.samplesPerPixel() == 4, srcRep.isPlanar(), OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, srcRep.bytesPerRow(), srcRep.bitsPerPixel());
- handle.addRepresentation(rep);
- rep.release();
- handle.setCacheMode(OS.NSImageCacheNever);
-
- int /*long*/ data = rep.bitmapData();
- OS.memmove(data, srcRep.bitmapData(), width * height * 4);
- if (flag != SWT.IMAGE_COPY) {
-
- /* Apply transformation */
- switch (flag) {
- case SWT.IMAGE_DISABLE: {
- Color zeroColor = device.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
- RGB zeroRGB = zeroColor.getRGB();
- byte zeroRed = (byte)zeroRGB.red;
- byte zeroGreen = (byte)zeroRGB.green;
- byte zeroBlue = (byte)zeroRGB.blue;
- Color oneColor = device.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
- RGB oneRGB = oneColor.getRGB();
- byte oneRed = (byte)oneRGB.red;
- byte oneGreen = (byte)oneRGB.green;
- byte oneBlue = (byte)oneRGB.blue;
- byte[] line = new byte[(int)/*64*/bpr];
- for (int y=0; y<height; y++) {
- OS.memmove(line, data + (y * bpr), bpr);
- int offset = 0;
- for (int x=0; x<width; x++) {
- int red = line[offset+1] & 0xFF;
- int green = line[offset+2] & 0xFF;
- int blue = line[offset+3] & 0xFF;
- int intensity = red * red + green * green + blue * blue;
- if (intensity < 98304) {
- line[offset+1] = zeroRed;
- line[offset+2] = zeroGreen;
- line[offset+3] = zeroBlue;
- } else {
- line[offset+1] = oneRed;
- line[offset+2] = oneGreen;
- line[offset+3] = oneBlue;
- }
- offset += 4;
- }
- OS.memmove(data + (y * bpr), line, bpr);
- }
- break;
- }
- case SWT.IMAGE_GRAY: {
- byte[] line = new byte[(int)/*64*/bpr];
- for (int y=0; y<height; y++) {
- OS.memmove(line, data + (y * bpr), bpr);
- int offset = 0;
- for (int x=0; x<width; x++) {
- int red = line[offset+1] & 0xFF;
- int green = line[offset+2] & 0xFF;
- int blue = line[offset+3] & 0xFF;
- byte intensity = (byte)((red+red+green+green+green+green+green+blue) >> 3);
- line[offset+1] = line[offset+2] = line[offset+3] = intensity;
- offset += 4;
- }
- OS.memmove(data + (y * bpr), line, bpr);
- }
- break;
- }
- }
- }
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs an empty instance of this class with the
- * width and height of the specified rectangle. The result
- * may be drawn upon by creating a GC and using any of its
- * drawing operations, as shown in the following example:
- * <pre>
- * Image i = new Image(device, boundsRectangle);
- * GC gc = new GC(i);
- * gc.drawRectangle(0, 0, 50, 50);
- * gc.dispose();
- * </pre>
- * <p>
- * Note: Some platforms may have a limitation on the size
- * of image that can be created (size depends on width, height,
- * and depth). For example, Windows 95, 98, and ME do not allow
- * images larger than 16M.
- * </p>
- *
- * @param device the device on which to create the image
- * @param bounds a rectangle specifying the image's width and height (must not be null)
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the bounds rectangle is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if either the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, Rectangle bounds) {
- super(device);
- if (bounds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(bounds.width, bounds.height);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs an instance of this class from the given
- * <code>ImageData</code>.
- *
- * @param device the device on which to create the image
- * @param data the image data to create the image from (must not be null)
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the image data is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the ImageData is not supported</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, ImageData data) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(data);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs an instance of this class, whose type is
- * <code>SWT.ICON</code>, from the two given <code>ImageData</code>
- * objects. The two images must be the same size. Pixel transparency
- * in either image will be ignored.
- * <p>
- * The mask image should contain white wherever the icon is to be visible,
- * and black wherever the icon is to be transparent. In addition,
- * the source image should contain black wherever the icon is to be
- * transparent.
- * </p>
- *
- * @param device the device on which to create the icon
- * @param source the color data for the icon
- * @param mask the mask data for the icon
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if either the source or mask is null </li>
- * <li>ERROR_INVALID_ARGUMENT - if source and mask are different sizes</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, ImageData source, ImageData mask) {
- super(device);
- if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (mask == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (source.width != mask.width || source.height != mask.height) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- mask = ImageData.convertMask(mask);
- ImageData image = new ImageData(source.width, source.height, source.depth, source.palette, source.scanlinePad, source.data);
- image.maskPad = mask.scanlinePad;
- image.maskData = mask.data;
- init(image);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs an instance of this class by loading its representation
- * from the specified input stream. Throws an error if an error
- * occurs while loading the image, or if the result is an image
- * of an unsupported type. Application code is still responsible
- * for closing the input stream.
- * <p>
- * This constructor is provided for convenience when loading a single
- * image only. If the stream contains multiple images, only the first
- * one will be loaded. To load multiple images, use
- * <code>ImageLoader.load()</code>.
- * </p><p>
- * This constructor may be used to load a resource as follows:
- * </p>
- * <pre>
- * static Image loadImage (Display display, Class clazz, String string) {
- * InputStream stream = clazz.getResourceAsStream (string);
- * if (stream == null) return null;
- * Image image = null;
- * try {
- * image = new Image (display, stream);
- * } catch (SWTException ex) {
- * } finally {
- * try {
- * stream.close ();
- * } catch (IOException ex) {}
- * }
- * return image;
- * }
- * </pre>
- *
- * @param device the device on which to create the image
- * @param stream the input stream to load the image from
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the stream is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_IO - if an IO error occurs while reading from the stream</li>
- * <li>ERROR_INVALID_IMAGE - if the image stream contains invalid data </li>
- * <li>ERROR_UNSUPPORTED_DEPTH - if the image stream describes an image with an unsupported depth</li>
- * <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, InputStream stream) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- init(new ImageData(stream));
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs an instance of this class by loading its representation
- * from the file with the specified name. Throws an error if an error
- * occurs while loading the image, or if the result is an image
- * of an unsupported type.
- * <p>
- * This constructor is provided for convenience when loading
- * a single image only. If the specified file contains
- * multiple images, only the first one will be used.
- *
- * @param device the device on which to create the image
- * @param filename the name of the file to load the image from
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_IO - if an IO error occurs while reading from the file</li>
- * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data </li>
- * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li>
- * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
- * </ul>
- */
-public Image(Device device, String filename) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (filename == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- initNative(filename);
- if (this.handle == null) init(new ImageData(filename));
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void createAlpha () {
- if (transparentPixel == -1 && alpha == -1 && alphaData == null) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSBitmapImageRep imageRep = getRepresentation();
- int /*long*/ height = imageRep.pixelsHigh();
- int /*long*/ bpr = imageRep.bytesPerRow();
- int /*long*/ dataSize = height * bpr;
- byte[] srcData = new byte[(int)/*64*/dataSize];
- OS.memmove(srcData, imageRep.bitmapData(), dataSize);
- if (transparentPixel != -1) {
- for (int i=0; i<dataSize; i+=4) {
- int pixel = ((srcData[i+1] & 0xFF) << 16) | ((srcData[i+2] & 0xFF) << 8) | (srcData[i+3] & 0xFF);
- srcData[i] = (byte)(pixel == transparentPixel ? 0 : 0xFF);
- }
- } else if (alpha != -1) {
- byte a = (byte)this.alpha;
- for (int i=0; i<dataSize; i+=4) {
- srcData[i] = a;
- }
- } else {
- int /*long*/ width = imageRep.pixelsWide();
- int offset = 0, alphaOffset = 0;
- for (int y = 0; y<height; y++) {
- for (int x = 0; x<width; x++) {
- srcData[offset] = alphaData[alphaOffset];
- offset += 4;
- alphaOffset += 1;
- }
- }
- }
-
- // Since we just calculated alpha for the image rep, tell it that it now has an alpha component.
- imageRep.setAlpha(true);
-
- OS.memmove(imageRep.bitmapData(), srcData, dataSize);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void destroy() {
- if (memGC != null) memGC.dispose();
- handle.release();
- handle = null;
- memGC = null;
-}
-
-/**
- * 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) {
- if (object == this) return true;
- if (!(object instanceof Image)) return false;
- Image image = (Image)object;
- return device == image.device && handle == image.handle &&
- transparentPixel == image.transparentPixel;
-}
-
-/**
- * Returns the color to which to map the transparent pixel, or null if
- * the receiver has no transparent pixel.
- * <p>
- * There are certain uses of Images that do not support transparency
- * (for example, setting an image into a button or label). In these cases,
- * it may be desired to simulate transparency by using the background
- * color of the widget to paint the transparent pixels of the image.
- * Use this method to check which color will be used in these cases
- * in place of transparency. This value may be set with setBackground().
- * <p>
- *
- * @return the background color of the image, or null if there is no transparency in the image
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Color getBackground() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (transparentPixel == -1) return null;
- int red = (transparentPixel >> 16) & 0xFF;
- int green = (transparentPixel >> 8) & 0xFF;
- int blue = (transparentPixel >> 0) & 0xFF;
- return Color.cocoa_new(device, new float /*double*/ []{red / 255f, green / 255f, blue / 255f, 1});
-}
-
-/**
- * Returns the bounds of the receiver. The rectangle will always
- * have x and y values of 0, and the width and height of the
- * image.
- *
- * @return a rectangle specifying the image's bounds
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li>
- * </ul>
- */
-public Rectangle getBounds() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (width != -1 && height != -1) {
- return new Rectangle(0, 0, width, height);
- }
- NSSize size = handle.size();
- return new Rectangle(0, 0, width = (int)size.width, height = (int)size.height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns an <code>ImageData</code> based on the receiver
- * Modifications made to this <code>ImageData</code> will not
- * affect the Image.
- *
- * @return an <code>ImageData</code> containing the image's data and attributes
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li>
- * </ul>
- *
- * @see ImageData
- */
-public ImageData getImageData() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSBitmapImageRep imageRep = getRepresentation();
- int /*long*/ width = imageRep.pixelsWide();
- int /*long*/ height = imageRep.pixelsHigh();
- int /*long*/ bpr = imageRep.bytesPerRow();
- int /*long*/ bpp = imageRep.bitsPerPixel();
- int /*long*/ dataSize = height * bpr;
-
- byte[] srcData = new byte[(int)/*64*/dataSize];
- OS.memmove(srcData, imageRep.bitmapData(), dataSize);
-
- PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF);
- ImageData data = new ImageData((int)/*64*/width, (int)/*64*/height, (int)/*64*/bpp, palette, 4, srcData);
- data.bytesPerLine = (int)/*64*/bpr;
-
- data.transparentPixel = transparentPixel;
- if (transparentPixel == -1 && type == SWT.ICON) {
- /* Get the icon mask data */
- int maskPad = 2;
- int /*long*/ maskBpl = (((width + 7) / 8) + (maskPad - 1)) / maskPad * maskPad;
- byte[] maskData = new byte[(int)/*64*/(height * maskBpl)];
- int offset = 0, maskOffset = 0;
- for (int y = 0; y<height; y++) {
- for (int x = 0; x<width; x++) {
- if (srcData[offset] != 0) {
- maskData[maskOffset + (x >> 3)] |= (1 << (7 - (x & 0x7)));
- } else {
- maskData[maskOffset + (x >> 3)] &= ~(1 << (7 - (x & 0x7)));
- }
- offset += 4;
- }
- maskOffset += maskBpl;
- }
- data.maskData = maskData;
- data.maskPad = maskPad;
- }
- for (int i = 0; i < srcData.length; i+= 4) {
- srcData[i] = 0;
- }
- data.alpha = alpha;
- if (alpha == -1 && alphaData != null) {
- data.alphaData = new byte[alphaData.length];
- System.arraycopy(alphaData, 0, data.alphaData, 0, alphaData.length);
- }
- return data;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Invokes platform specific functionality to allocate a new image.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Image</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>
- *
- * @param device the device on which to allocate the color
- * @param type the type of the image (<code>SWT.BITMAP</code> or <code>SWT.ICON</code>)
- * @param handle the OS handle for the image
- * @param data the OS data for the image
- *
- * @private
- */
-public static Image cocoa_new(Device device, int type, NSImage nsImage) {
- Image image = new Image(device);
- image.type = type;
- image.handle = nsImage;
- return image;
-}
-
-NSBitmapImageRep getRepresentation () {
- NSImageRep rep = handle.bestRepresentationForDevice(null);
- if (!rep.isKindOfClass(OS.class_NSBitmapImageRep)) {
- SWT.error(SWT.ERROR_UNSPECIFIED);
- }
- return new NSBitmapImageRep(rep);
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode () {
- return handle != null ? (int)/*64*/handle.id : 0;
-}
-
-void init(int width, int height) {
- if (width <= 0 || height <= 0) {
- SWT.error (SWT.ERROR_INVALID_ARGUMENT);
- }
- this.type = SWT.BITMAP;
- this.width = width;
- this.height = height;
-
- handle = (NSImage)new NSImage().alloc();
- NSSize size = new NSSize();
- size.width = width;
- size.height = height;
- handle = handle.initWithSize(size);
- NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- rep = rep.initWithBitmapDataPlanes(0, width, height, 8, 3, false, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width * 4, 32);
- OS.memset(rep.bitmapData(), 0xFF, width * height * 4);
- handle.addRepresentation(rep);
- rep.release();
- handle.setCacheMode(OS.NSImageCacheNever);
-}
-
-void init(ImageData image) {
- if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- this.width = image.width;
- this.height = image.height;
- PaletteData palette = image.palette;
- if (!(((image.depth == 1 || image.depth == 2 || image.depth == 4 || image.depth == 8) && !palette.isDirect) ||
- ((image.depth == 8) || (image.depth == 16 || image.depth == 24 || image.depth == 32) && palette.isDirect)))
- SWT.error(SWT.ERROR_UNSUPPORTED_DEPTH);
-
- /* Create the image */
- int dataSize = width * height * 4;
-
- /* Initialize data */
- int bpr = width * 4;
- byte[] buffer = new byte[dataSize];
- if (palette.isDirect) {
- ImageData.blit(ImageData.BLIT_SRC,
- image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, palette.redMask, palette.greenMask, palette.blueMask,
- ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
- buffer, 32, bpr, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF,
- false, false);
- } else {
- RGB[] rgbs = palette.getRGBs();
- int length = rgbs.length;
- byte[] srcReds = new byte[length];
- byte[] srcGreens = new byte[length];
- byte[] srcBlues = new byte[length];
- for (int i = 0; i < rgbs.length; i++) {
- RGB rgb = rgbs[i];
- if (rgb == null) continue;
- srcReds[i] = (byte)rgb.red;
- srcGreens[i] = (byte)rgb.green;
- srcBlues[i] = (byte)rgb.blue;
- }
- ImageData.blit(ImageData.BLIT_SRC,
- image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, srcReds, srcGreens, srcBlues,
- ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
- buffer, 32, bpr, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF,
- false, false);
- }
-
- /* Initialize transparency */
- int transparency = image.getTransparencyType();
- boolean hasAlpha = transparency != SWT.TRANSPARENCY_NONE;
- if (transparency == SWT.TRANSPARENCY_MASK || image.transparentPixel != -1) {
- this.type = image.transparentPixel != -1 ? SWT.BITMAP : SWT.ICON;
- if (image.transparentPixel != -1) {
- int transRed = 0, transGreen = 0, transBlue = 0;
- if (palette.isDirect) {
- RGB rgb = palette.getRGB(image.transparentPixel);
- transRed = rgb.red;
- transGreen = rgb.green;
- transBlue = rgb.blue;
- } else {
- RGB[] rgbs = palette.getRGBs();
- if (image.transparentPixel < rgbs.length) {
- RGB rgb = rgbs[image.transparentPixel];
- transRed = rgb.red;
- transGreen = rgb.green;
- transBlue = rgb.blue;
- }
- }
- transparentPixel = transRed << 16 | transGreen << 8 | transBlue;
- }
- ImageData maskImage = image.getTransparencyMask();
- byte[] maskData = maskImage.data;
- int maskBpl = maskImage.bytesPerLine;
- int offset = 0, maskOffset = 0;
- for (int y = 0; y<height; y++) {
- for (int x = 0; x<width; x++) {
- buffer[offset] = ((maskData[maskOffset + (x >> 3)]) & (1 << (7 - (x & 0x7)))) != 0 ? (byte)0xff : 0;
- offset += 4;
- }
- maskOffset += maskBpl;
- }
- } else {
- this.type = SWT.BITMAP;
- if (image.alpha != -1) {
- hasAlpha = true;
- this.alpha = image.alpha;
- byte a = (byte)this.alpha;
- for (int dataIndex=0; dataIndex<buffer.length; dataIndex+=4) {
- buffer[dataIndex] = a;
- }
- } else if (image.alphaData != null) {
- hasAlpha = true;
- this.alphaData = new byte[image.alphaData.length];
- System.arraycopy(image.alphaData, 0, this.alphaData, 0, alphaData.length);
- int offset = 0, alphaOffset = 0;
- for (int y = 0; y<height; y++) {
- for (int x = 0; x<width; x++) {
- buffer[offset] = alphaData[alphaOffset];
- offset += 4;
- alphaOffset += 1;
- }
- }
- }
- }
-
- if (handle != null) handle.release();
-
- handle = (NSImage)new NSImage().alloc();
- NSSize size = new NSSize();
- size.width = width;
- size.height = height;
- handle = handle.initWithSize(size);
- NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- rep = rep.initWithBitmapDataPlanes(0, width, height, 8, hasAlpha ? 4 : 3, hasAlpha, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, bpr, 32);
- OS.memmove(rep.bitmapData(), buffer, dataSize);
- handle.addRepresentation(rep);
- rep.release();
- handle.setCacheMode(OS.NSImageCacheNever);
-}
-
-void initNative(String filename) {
- NSAutoreleasePool pool = null;
- NSImage nativeImage = null;
-
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- nativeImage = new NSImage();
- nativeImage.alloc();
-
- // initByReferencingFile returns null if the file can't be found or is
- // not an image.
- nativeImage = nativeImage.initWithContentsOfFile(NSString.stringWith(filename));
- if (nativeImage == null) {
- // In order to get the same kind of exception, let the file format try to load and throw
- // the appropriate exception. It is possible file format supports some image formats
- // that is not natively supported as well.
- return;
- }
-
- NSImageRep nativeRep = nativeImage.bestRepresentationForDevice(null);
- if (!nativeRep.isKindOfClass(OS.class_NSBitmapImageRep)) {
- return;
- }
-
- width = (int)/*64*/nativeRep.pixelsWide();
- height = (int)/*64*/nativeRep.pixelsHigh();
-
- boolean hasAlpha = nativeRep.hasAlpha();
- int bpr = width * 4;
- handle = (NSImage)new NSImage().alloc();
- NSSize size = new NSSize();
- size.width = width;
- size.height = height;
- handle = handle.initWithSize(size);
- NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
- rep = rep.initWithBitmapDataPlanes(0, width, height, 8, hasAlpha ? 4 : 3, hasAlpha, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, bpr, 32);
- handle.addRepresentation(rep);
- rep.release();
- handle.setCacheMode(OS.NSImageCacheNever);
- NSRect rect = new NSRect();
- rect.width = width;
- rect.height = height;
-
- /* Compute the pixels */
- int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- int /*long*/ ctx = OS.CGBitmapContextCreate(rep.bitmapData(), width, height, 8, bpr, colorspace, OS.kCGImageAlphaNoneSkipFirst);
- OS.CGColorSpaceRelease(colorspace);
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(NSGraphicsContext.graphicsContextWithGraphicsPort(ctx, false));
- if (hasAlpha) OS.objc_msgSend(nativeRep.id, OS.sel_setAlpha_, 0);
- nativeRep.drawInRect(rect);
- if (hasAlpha) OS.objc_msgSend(nativeRep.id, OS.sel_setAlpha_, 1);
- NSGraphicsContext.static_restoreGraphicsState();
- OS.CGContextRelease(ctx);
-
- if (hasAlpha) {
- /* Compute the alpha values */
- int /*long*/ bitmapBytesPerRow = width;
- int /*long*/ bitmapByteCount = bitmapBytesPerRow * height;
- int /*long*/ alphaBitmapData = OS.malloc(bitmapByteCount);
- int /*long*/ alphaBitmapCtx = OS.CGBitmapContextCreate(alphaBitmapData, width, height, 8, bitmapBytesPerRow, 0, OS.kCGImageAlphaOnly);
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(NSGraphicsContext.graphicsContextWithGraphicsPort(alphaBitmapCtx, false));
- nativeRep.drawInRect(rect);
- NSGraphicsContext.static_restoreGraphicsState();
- byte[] alphaData = new byte[(int)/*64*/bitmapByteCount];
- OS.memmove(alphaData, alphaBitmapData, bitmapByteCount);
- OS.free(alphaBitmapData);
- OS.CGContextRelease(alphaBitmapCtx);
-
- /* Merge the alpha values with the pixels */
- byte[] srcData = new byte[height * bpr];
- OS.memmove(srcData, rep.bitmapData(), srcData.length);
- for (int a = 0, p = 0; a < alphaData.length; a++, p += 4) {
- srcData[p] = alphaData[a];
- }
- OS.memmove(rep.bitmapData(), srcData, srcData.length);
-
- // If the alpha has only 0 or 255 (-1) for alpha values, compute the transparent pixel color instead
- // of a continuous alpha range.
- int transparentOffset = -1, i = 0;
- for (i = 0; i < alphaData.length; i++) {
- int alpha = alphaData[i];
- if (transparentOffset == -1 && alpha == 0) transparentOffset = i;
- if (!(alpha == 0 || alpha == -1)) break;
- }
- this.alpha = -1;
- if (i == alphaData.length && transparentOffset != -1) {
- NSColor color = rep.colorAtX(transparentOffset % width, transparentOffset / width);
- int red = (int) (color.redComponent() * 255);
- int green = (int) (color.greenComponent() * 255);
- int blue = (int) (color.blueComponent() * 255);
- this.transparentPixel = (red << 16) + (green << 8) + blue;
- } else {
- this.alphaData = alphaData;
- }
- }
-
- // For compatibility, images created from .ico files are treated as SWT.ICON format, even though
- // they are no different than other bitmaps in Cocoa.
- if (filename.toLowerCase().endsWith(".ico")) {
- this.type = SWT.ICON;
- } else {
- this.type = SWT.BITMAP;
- }
- } finally {
- if (nativeImage != null) nativeImage.release();
- if (pool != null) pool.release();
- }
-
-}
-
-/**
- * Invokes platform specific functionality to allocate a new GC handle.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Image</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>
- *
- * @param data the platform specific GC data
- * @return the platform specific GC handle
- */
-public int /*long*/ internal_new_GC (GCData data) {
- if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (type != SWT.BITMAP || memGC != null) {
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSBitmapImageRep imageRep = getRepresentation();
-
- // Can't perform transforms on image reps with alpha.
- imageRep.setAlpha(false);
-
- NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(imageRep);
- NSGraphicsContext flippedContext = NSGraphicsContext.graphicsContextWithGraphicsPort(context.graphicsPort(), true);
- context = flippedContext;
- context.retain();
- if (data != null) data.flippedContext = flippedContext;
- NSGraphicsContext.static_saveGraphicsState();
- NSGraphicsContext.setCurrentContext(context);
- NSAffineTransform transform = NSAffineTransform.transform();
- NSSize size = handle.size();
- transform.translateXBy(0, size.height);
- transform.scaleXBy(1, -1);
- transform.set();
- NSGraphicsContext.static_restoreGraphicsState();
- if (data != null) {
- int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
- if ((data.style & mask) == 0) {
- data.style |= SWT.LEFT_TO_RIGHT;
- }
- data.device = device;
- data.background = device.COLOR_WHITE.handle;
- data.foreground = device.COLOR_BLACK.handle;
- data.font = device.systemFont;
- data.image = this;
- }
- return context.id;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Invokes platform specific functionality to dispose a GC handle.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Image</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>
- *
- * @param hDC the platform specific GC handle
- * @param data the platform specific GC data
- */
-public void internal_dispose_GC (int /*long*/ context, GCData data) {
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (context != 0) {
- NSGraphicsContext contextObj = new NSGraphicsContext(context);
- contextObj.release();
- }
-// handle.setCacheMode(OS.NSImageCacheDefault);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the image has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the image.
- * When an image has been disposed, it is an error to
- * invoke any other method using the image.
- *
- * @return <code>true</code> when the image is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Sets the color to which to map the transparent pixel.
- * <p>
- * There are certain uses of <code>Images</code> that do not support
- * transparency (for example, setting an image into a button or label).
- * In these cases, it may be desired to simulate transparency by using
- * the background color of the widget to paint the transparent pixels
- * of the image. This method specifies the color that will be used in
- * these cases. For example:
- * <pre>
- * Button b = new Button();
- * image.setBackground(b.getBackground());
- * b.setImage(image);
- * </pre>
- * </p><p>
- * The image may be modified by this operation (in effect, the
- * transparent regions may be filled with the supplied color). Hence
- * this operation is not reversible and it is not legal to call
- * this function twice or with a null argument.
- * </p><p>
- * This method has no effect if the receiver does not have a transparent
- * pixel value.
- * </p>
- *
- * @param color the color to use when a transparent pixel is specified
- *
- * @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) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (transparentPixel == -1) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- byte red = (byte)((transparentPixel >> 16) & 0xFF);
- byte green = (byte)((transparentPixel >> 8) & 0xFF);
- byte blue = (byte)((transparentPixel >> 0) & 0xFF);
- byte newRed = (byte)((int)(color.handle[0] * 255) & 0xFF);
- byte newGreen = (byte)((int)(color.handle[1] * 255) & 0xFF);
- byte newBlue = (byte)((int)(color.handle[2] * 255) & 0xFF);
- NSBitmapImageRep imageRep = getRepresentation();
- int /*long*/ bpr = imageRep.bytesPerRow();
- int /*long*/ data = imageRep.bitmapData();
- byte[] line = new byte[(int)bpr];
- for (int i = 0, offset = 0; i < height; i++, offset += bpr) {
- OS.memmove(line, data + offset, bpr);
- for (int j = 0; j < line.length; j += 4) {
- if (line[j+ 1] == red && line[j + 2] == green && line[j + 3] == blue) {
- line[j + 1] = newRed;
- line[j + 2] = newGreen;
- line[j + 3] = newBlue;
- }
- }
- OS.memmove(data + offset, line, bpr);
- }
- transparentPixel = (newRed & 0xFF) << 16 | (newGreen & 0xFF) << 8 | (newBlue & 0xFF);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Image {*DISPOSED*}";
- return "Image {" + handle + "}";
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java
deleted file mode 100755
index 7ab8a8b4ea..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java
+++ /dev/null
@@ -1,759 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * Instances of this class represent paths through the two-dimensional
- * coordinate system. Paths do not have to be continuous, and can be
- * described using lines, rectangles, arcs, cubic or quadratic bezier curves,
- * glyphs, or other paths.
- * <p>
- * Application code must explicitly invoke the <code>Path.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- * <p>
- * This class requires the operating system's advanced graphics subsystem
- * which may not be available on some platforms.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/snippets/#path">Path, Pattern snippets</a>
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- *
- * @since 3.1
- */
-public class Path extends Resource {
-
- /**
- * the OS resource for the Path
- * (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>
- */
- public NSBezierPath handle;
-
-/**
- * Constructs a new empty Path.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the path
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Path (Device device) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle = NSBezierPath.bezierPath();
- if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES);
- handle.retain();
- handle.moveToPoint(new NSPoint());
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new Path that is a copy of <code>path</code>. If
- * <code>flatness</code> is less than or equal to zero, an unflatten
- * copy of the path is created. Otherwise, it specifies the maximum
- * error between the path and its flatten copy. Smaller numbers give
- * better approximation.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the path
- * @param path the path to make a copy
- * @param flatness the flatness value
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the path is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the path has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- * @since 3.4
- */
-public Path (Device device, Path path, float flatness) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- flatness = Math.max(0, flatness);
- if (flatness == 0) {
- handle = new NSBezierPath(path.handle.copy().id);
- } else {
- float /*double*/ defaultFlatness = NSBezierPath.defaultFlatness();
- NSBezierPath.setDefaultFlatness(flatness);
- handle = path.handle.bezierPathByFlatteningPath();
- handle.retain();
- NSBezierPath.setDefaultFlatness(defaultFlatness);
- }
- if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new Path with the specifed PathData.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the path
- * @param data the data for the path
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li>
- * <li>ERROR_NULL_ARGUMENT - if the data is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- * @since 3.4
- */
-public Path (Device device, PathData data) {
- this(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- if (data == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- init(data);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver a circular or elliptical arc that lies within
- * the specified rectangular area.
- * <p>
- * The resulting arc begins at <code>startAngle</code> and extends
- * for <code>arcAngle</code> degrees.
- * 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
- * @param y the y coordinate of the upper-left corner of the arc
- * @param width the width of the arc
- * @param height the height of the arc
- * @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 addArc(float x, float y, float width, float height, float startAngle, float arcAngle) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransform transform = NSAffineTransform.transform();
- transform.translateXBy(x + width / 2f, y + height / 2f);
- transform.scaleXBy(width / 2f, height / 2f);
- NSBezierPath path = NSBezierPath.bezierPath();
- NSPoint center = new NSPoint();
- float sAngle = -startAngle;
- float eAngle = -(startAngle + arcAngle);
- path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0);
- path.transformUsingAffineTransform(transform);
- handle.appendBezierPath(path);
- if (Math.abs(arcAngle) >= 360) handle.closePath();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver the path described by the parameter.
- *
- * @param path the path to add to the receiver
- *
- * @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>
- */
-public void addPath(Path path) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.appendBezierPath(path.handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver the rectangle specified by x, y, width and height.
- *
- * @param x the x coordinate of the rectangle to add
- * @param y the y coordinate of the rectangle to add
- * @param width the width of the rectangle to add
- * @param height the height of the rectangle to add
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void addRectangle(float x, float y, float width, float height) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSRect rect = new NSRect();
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.appendBezierPathWithRect(rect);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver the pattern of glyphs generated by drawing
- * the given string using the given font starting at the point (x, y).
- *
- * @param string the text to use
- * @param x the x coordinate of the starting point
- * @param y the y coordinate of the starting point
- * @param font the font to use
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the font is null</li>
- * <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 addString(String string, float x, float y, Font font) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (font == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSString str = NSString.stringWith(string);
- NSTextStorage textStorage = (NSTextStorage)new NSTextStorage().alloc().init();
- NSLayoutManager layoutManager = (NSLayoutManager)new NSLayoutManager().alloc().init();
- NSTextContainer textContainer = (NSTextContainer)new NSTextContainer().alloc();
- NSSize size = new NSSize();
- size.width = Float.MAX_VALUE;
- size.height = Float.MAX_VALUE;
- textContainer.initWithContainerSize(size);
- textStorage.addLayoutManager(layoutManager);
- layoutManager.addTextContainer(textContainer);
- NSRange range = new NSRange();
- range.length = str.length();
- /*
- * Feature in Cocoa. Adding attributes directly to a NSTextStorage causes
- * output to the console and eventually a segmentation fault when printing
- * on a thread other than the main thread. The fix is to add attributes to
- * a separate NSMutableAttributedString and add it to text storage when done.
- */
- NSMutableAttributedString attrStr = (NSMutableAttributedString)new NSMutableAttributedString().alloc();
- attrStr.id = attrStr.initWithString(str).id;
- attrStr.beginEditing();
- attrStr.addAttribute(OS.NSFontAttributeName, font.handle, range);
- font.addTraits(attrStr, range);
- attrStr.endEditing();
- textStorage.setAttributedString(attrStr);
- attrStr.release();
- range = layoutManager.glyphRangeForTextContainer(textContainer);
- if (range.length != 0) {
- int /*long*/ glyphs = OS.malloc(4 * range.length * 2);
- layoutManager.getGlyphs(glyphs, range);
- NSBezierPath path = NSBezierPath.bezierPath();
- NSPoint point = new NSPoint();
- path.moveToPoint(point);
- path.appendBezierPathWithGlyphs(glyphs, range.length, font.handle);
- NSAffineTransform transform = NSAffineTransform.transform();
- transform.scaleXBy(1, -1);
- float /*double*/ baseline = layoutManager.defaultBaselineOffsetForFont(font.handle);
- transform.translateXBy(x, -(y + baseline));
- path.transformUsingAffineTransform(transform);
- OS.free(glyphs);
- handle.appendBezierPath(path);
- }
- textContainer.release();
- layoutManager.release();
- textStorage.release();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Closes the current sub path by adding to the receiver a line
- * from the current point of the path back to the starting point
- * of the sub path.
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void close() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.closePath();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the specified point is contained by
- * the receiver and false otherwise.
- * <p>
- * If outline is <code>true</code>, the point (x, y) checked for containment in
- * the receiver's outline. If outline is <code>false</code>, the point is
- * checked to see if it is contained within the bounds of the (closed) area
- * covered by the receiver.
- *
- * @param x the x coordinate of the point to test for containment
- * @param y the y coordinate of the point to test for containment
- * @param gc the GC to use when testing for containment
- * @param outline controls whether to check the outline or contained area of the path
- * @return <code>true</code> if the path contains the point and <code>false</code> otherwise
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the gc is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the gc has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public boolean contains(float x, float y, GC gc, boolean outline) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (gc == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (gc.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- //TODO - see windows
- if (outline) {
- int /*long*/ pixel = OS.malloc(4);
- if (pixel == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- int[] buffer = new int[]{0xFFFFFFFF};
- OS.memmove(pixel, buffer, 4);
- int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- int /*long*/ context = OS.CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorspace, OS.kCGImageAlphaNoneSkipFirst);
- OS.CGColorSpaceRelease(colorspace);
- if (context == 0) {
- OS.free(pixel);
- SWT.error(SWT.ERROR_NO_HANDLES);
- }
- GCData data = gc.data;
- int capStyle = 0;
- switch (data.lineCap) {
- case SWT.CAP_ROUND: capStyle = OS.kCGLineCapRound; break;
- case SWT.CAP_FLAT: capStyle = OS.kCGLineCapButt; break;
- case SWT.CAP_SQUARE: capStyle = OS.kCGLineCapSquare; break;
- }
- OS.CGContextSetLineCap(context, capStyle);
- int joinStyle = 0;
- switch (data.lineJoin) {
- case SWT.JOIN_MITER: joinStyle = OS.kCGLineJoinMiter; break;
- case SWT.JOIN_ROUND: joinStyle = OS.kCGLineJoinRound; break;
- case SWT.JOIN_BEVEL: joinStyle = OS.kCGLineJoinBevel; break;
- }
- OS.CGContextSetLineJoin(context, joinStyle);
- OS.CGContextSetLineWidth(context, data.lineWidth);
- OS.CGContextTranslateCTM(context, -x + 0.5f, -y + 0.5f);
- int /*long*/ path = GC.createCGPathRef(handle);
- OS.CGContextAddPath(context, path);
- OS.CGPathRelease(path);
- OS.CGContextStrokePath(context);
- OS.CGContextRelease(context);
- OS.memmove(buffer, pixel, 4);
- OS.free(pixel);
- return buffer[0] != 0xFFFFFFFF;
- } else {
- NSPoint point = new NSPoint();
- point.x = x;
- point.y = y;
- return handle.containsPoint(point);
- }
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver a cubic bezier curve based on the parameters.
- *
- * @param cx1 the x coordinate of the first control point of the spline
- * @param cy1 the y coordinate of the first control of the spline
- * @param cx2 the x coordinate of the second control of the spline
- * @param cy2 the y coordinate of the second control of the spline
- * @param x the x coordinate of the end point of the spline
- * @param y the y coordinate of the end point of the spline
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- NSPoint ct1 = new NSPoint();
- ct1.x = cx1;
- ct1.y = cy1;
- NSPoint ct2 = new NSPoint();
- ct2.x = cx2;
- ct2.y = cy2;
- handle.curveToPoint(pt, ct1, ct2);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void destroy() {
- handle.release();
- handle = null;
-}
-
-/**
- * Replaces the first four elements in the parameter with values that
- * describe the smallest rectangle that will completely contain the
- * receiver (i.e. the bounding box).
- *
- * @param bounds the array to hold the result
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the bounding box</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void getBounds(float[] bounds) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (bounds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (bounds.length < 4) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSRect rect = handle.controlPointBounds();
- bounds[0] = (float)/*64*/rect.x;
- bounds[1] = (float)/*64*/rect.y;
- bounds[2] = (float)/*64*/rect.width;
- bounds[3] = (float)/*64*/rect.height;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Replaces the first two elements in the parameter with values that
- * describe the current point of the path.
- *
- * @param point the array to hold the result
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the end point</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void getCurrentPoint(float[] point) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (point == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (point.length < 2) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint pt = handle.currentPoint();
- point[0] = (float)/*64*/pt.x;
- point[1] = (float)/*64*/pt.y;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a device independent representation of the receiver.
- *
- * @return the PathData for the receiver
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see PathData
- */
-public PathData getPathData() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int count = (int)/*64*/handle.elementCount();
- int pointCount = 0, typeCount = 0;
- byte[] types = new byte[count];
- float[] pointArray = new float[count * 6];
- int /*long*/ points = OS.malloc(3 * NSPoint.sizeof);
- if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- NSPoint pt = new NSPoint();
- for (int i = 0; i < count; i++) {
- int element = (int)/*64*/handle.elementAtIndex(i, points);
- switch (element) {
- case OS.NSMoveToBezierPathElement:
- types[typeCount++] = SWT.PATH_MOVE_TO;
- OS.memmove(pt, points, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- break;
- case OS.NSLineToBezierPathElement:
- types[typeCount++] = SWT.PATH_LINE_TO;
- OS.memmove(pt, points, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- break;
- case OS.NSCurveToBezierPathElement:
- types[typeCount++] = SWT.PATH_CUBIC_TO;
- OS.memmove(pt, points, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- OS.memmove(pt, points + NSPoint.sizeof, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- OS.memmove(pt, points + NSPoint.sizeof + NSPoint.sizeof, NSPoint.sizeof);
- pointArray[pointCount++] = (int)pt.x;
- pointArray[pointCount++] = (int)pt.y;
- break;
- case OS.NSClosePathBezierPathElement:
- types[typeCount++] = SWT.PATH_CLOSE;
- break;
- }
- }
- OS.free(points);
- if (pointCount != pointArray.length) {
- float[] temp = new float[pointCount];
- System.arraycopy(pointArray, 0, temp, 0, pointCount);
- pointArray = temp;
- }
- PathData data = new PathData();
- data.types = types;
- data.points = pointArray;
- return data;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void init(PathData data) {
- byte[] types = data.types;
- float[] points = data.points;
- for (int i = 0, j = 0; i < types.length; i++) {
- switch (types[i]) {
- case SWT.PATH_MOVE_TO:
- moveTo(points[j++], points[j++]);
- break;
- case SWT.PATH_LINE_TO:
- lineTo(points[j++], points[j++]);
- break;
- case SWT.PATH_CUBIC_TO:
- cubicTo(points[j++], points[j++], points[j++], points[j++], points[j++], points[j++]);
- break;
- case SWT.PATH_QUAD_TO:
- quadTo(points[j++], points[j++], points[j++], points[j++]);
- break;
- case SWT.PATH_CLOSE:
- close();
- break;
- default:
- dispose();
- SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- }
- }
-}
-
-/**
- * Returns <code>true</code> if the Path has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the Path.
- * When a Path has been disposed, it is an error to
- * invoke any other method using the Path.
- *
- * @return <code>true</code> when the Path is disposed, and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Adds to the receiver a line from the current point to
- * the point specified by (x, y).
- *
- * @param x the x coordinate of the end of the line to add
- * @param y the y coordinate of the end of the line to add
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void lineTo(float x, float y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- handle.lineToPoint(pt);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the current point of the receiver to the point
- * specified by (x, y). Note that this starts a new
- * sub path.
- *
- * @param x the x coordinate of the new end point
- * @param y the y coordinate of the new end point
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void moveTo(float x, float y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- handle.moveToPoint(pt);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds to the receiver a quadratic curve based on the parameters.
- *
- * @param cx the x coordinate of the control point of the spline
- * @param cy the y coordinate of the control point of the spline
- * @param x the x coordinate of the end point of the spline
- * @param y the y coordinate of the end point of the spline
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void quadTo(float cx, float cy, float x, float y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- NSPoint ct = new NSPoint();
- ct.x = cx;
- ct.y = cy;
- handle.curveToPoint(pt, ct, ct);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Path {*DISPOSED*}";
- return "Path {" + handle + "}";
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java
deleted file mode 100755
index 1670e9ab87..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * Instances of this class represent patterns to use while drawing. Patterns
- * can be specified either as bitmaps or gradients.
- * <p>
- * Application code must explicitly invoke the <code>Pattern.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- * <p>
- * This class requires the operating system's advanced graphics subsystem
- * which may not be available on some platforms.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/snippets/#path">Path, Pattern snippets</a>
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- *
- * @since 3.1
- */
-public class Pattern extends Resource {
- NSColor color;
- NSGradient gradient;
- NSPoint pt1, pt2;
- Image image;
- float /*double*/ [] color1, color2;
- int alpha1, alpha2;
-
-/**
- * Constructs a new Pattern given an image. Drawing with the resulting
- * pattern will cause the image to be tiled over the resulting area.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the pattern
- * @param image the image that the pattern will draw
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device, or the image is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Pattern(Device device, Image image) {
- super(device);
- if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- this.image = image;
- color = NSColor.colorWithPatternImage(image.handle);
- color.retain();
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Constructs a new Pattern that represents a linear, two color
- * gradient. Drawing with the pattern will cause the resulting area to be
- * tiled with the gradient specified by the arguments.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the pattern
- * @param x1 the x coordinate of the starting corner of the gradient
- * @param y1 the y coordinate of the starting corner of the gradient
- * @param x2 the x coordinate of the ending corner of the gradient
- * @param y2 the y coordinate of the ending corner of the gradient
- * @param color1 the starting color of the gradient
- * @param color2 the ending color of the gradient
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device,
- * or if either color1 or color2 is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if either color1 or color2 has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Pattern(Device device, float x1, float y1, float x2, float y2, Color color1, Color color2) {
- this(device, x1, y1, x2, y2, color1, 0xFF, color2, 0xFF);
-}
-/**
- * Constructs a new Pattern that represents a linear, two color
- * gradient. Drawing with the pattern will cause the resulting area to be
- * tiled with the gradient specified by the arguments.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the pattern
- * @param x1 the x coordinate of the starting corner of the gradient
- * @param y1 the y coordinate of the starting corner of the gradient
- * @param x2 the x coordinate of the ending corner of the gradient
- * @param y2 the y coordinate of the ending corner of the gradient
- * @param color1 the starting color of the gradient
- * @param alpha1 the starting alpha value of the gradient
- * @param color2 the ending color of the gradient
- * @param alpha2 the ending alpha value of the gradient
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device,
- * or if either color1 or color2 is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if either color1 or color2 has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- *
- * @since 3.2
- */
-public Pattern(Device device, float x1, float y1, float x2, float y2, Color color1, int alpha1, Color color2, int alpha2) {
- super(device);
- if (color1 == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (color1.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (color2 == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (color2.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- pt1 = new NSPoint();
- pt2 = new NSPoint();
- pt1.x = x1;
- pt1.y = y1;
- pt2.x = x2;
- pt2.y = y2;
- this.color1 = color1.handle;
- this.color2 = color2.handle;
- this.alpha1 = alpha1;
- this.alpha2 = alpha2;
- NSColor start = NSColor.colorWithDeviceRed(color1.handle[0], color1.handle[1], color1.handle[2], alpha1 / 255f);
- NSColor end = NSColor.colorWithDeviceRed(color2.handle[0], color2.handle[1], color2.handle[2], alpha2 / 255f);
- gradient = ((NSGradient)new NSGradient().alloc()).initWithStartingColor(start, end);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void destroy() {
- if (color != null) color.release();
- color = null;
- if (gradient != null) gradient.release();
- gradient = null;
- image = null;
- color1 = color2 = null;
-}
-
-/**
- * Returns <code>true</code> if the Pattern has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the Pattern.
- * When a Pattern has been disposed, it is an error to
- * invoke any other method using the Pattern.
- *
- * @return <code>true</code> when the Pattern is disposed, and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return device == null;
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString() {
- if (isDisposed()) return "Pattern {*DISPOSED*}";
- return "Pattern {" + (color != null ? color.id : gradient.id) + "}";
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java
deleted file mode 100755
index c8de98bb3a..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java
+++ /dev/null
@@ -1,839 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.*;
-
-/**
- * Instances of this class represent areas of an x-y coordinate
- * system that are aggregates of the areas covered by a number
- * of polygons.
- * <p>
- * Application code must explicitly invoke the <code>Region.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- */
-public final class Region extends Resource {
- /**
- * the OS resource for the region
- * (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>
- */
- public int /*long*/ handle;
-
-/**
- * Constructs a new empty region.
- *
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for region creation</li>
- * </ul>
- */
-public Region() {
- this(null);
-}
-
-/**
- * Constructs a new empty region.
- * <p>
- * You must dispose the region when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the region
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle could not be obtained for region creation</li>
- * </ul>
- *
- * @see #dispose
- *
- * @since 3.0
- */
-public Region(Device device) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle = OS.NewRgn();
- if (handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-Region(Device device, int /*long*/ handle) {
- super(device);
- this.handle = handle;
-}
-
-public static Region cocoa_new(Device device, int /*long*/ handle) {
- return new Region(device, handle);
-}
-
-static int /*long*/ polyToRgn(int[] poly, int length) {
- short[] r = new short[4];
- int /*long*/ polyRgn = OS.NewRgn(), rectRgn = OS.NewRgn();
- int minY = poly[1], maxY = poly[1];
- for (int y = 3; y < length; y += 2) {
- if (poly[y] < minY) minY = poly[y];
- if (poly[y] > maxY) maxY = poly[y];
- }
- int[] inter = new int[length + 1];
- for (int y = minY; y <= maxY; y++) {
- int count = 0;
- int x1 = poly[0], y1 = poly[1];
- for (int p = 2; p < length; p += 2) {
- int x2 = poly[p], y2 = poly[p + 1];
- if (y1 != y2 && ((y1 <= y && y < y2) || (y2 <= y && y < y1))) {
- inter[count++] = (int)((((y - y1) / (float)(y2 - y1)) * (x2 - x1)) + x1 + 0.5f);
- }
- x1 = x2;
- y1 = y2;
- }
- int x2 = poly[0], y2 = poly[1];
- if (y1 != y2 && ((y1 <= y && y < y2) || (y2 <= y && y < y1))) {
- inter[count++] = (int)((((y - y1) / (float)(y2 - y1)) * (x2 - x1)) + x1 + 0.5f);
- }
- for (int gap=count/2; gap>0; gap/=2) {
- for (int i=gap; i<count; i++) {
- for (int j=i-gap; j>=0; j-=gap) {
- if ((inter[j] - inter[j + gap]) <= 0)
- break;
- int temp = inter[j];
- inter[j] = inter[j + gap];
- inter[j + gap] = temp;
- }
- }
- }
- for (int i = 0; i < count; i += 2) {
- OS.SetRect(r, (short)inter[i], (short)y, (short)(inter[i + 1]),(short)(y + 1));
- OS.RectRgn(rectRgn, r);
- OS.UnionRgn(polyRgn, rectRgn, polyRgn);
- }
- }
- OS.DisposeRgn(rectRgn);
- return polyRgn;
-}
-
-static int /*long*/ polyRgn(int[] pointArray, int count) {
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ polyRgn;
- if (C.PTR_SIZEOF == 4) {
- polyRgn = OS.NewRgn();
- OS.OpenRgn();
- OS.MoveTo((short)pointArray[0], (short)pointArray[1]);
- for (int i = 1; i < count / 2; i++) {
- OS.LineTo((short)pointArray[2 * i], (short)pointArray[2 * i + 1]);
- }
- OS.LineTo((short)pointArray[0], (short)pointArray[1]);
- OS.CloseRgn(polyRgn);
- } else {
- polyRgn = polyToRgn(pointArray, count);
- }
- return polyRgn;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds the given polygon to the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param pointArray points that describe the polygon to merge with the receiver
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
-*
- */
-public void add (int[] pointArray) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- add(pointArray, pointArray.length);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-void add(int[] pointArray, int count) {
- if (count <= 2) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ polyRgn = polyRgn(pointArray, count);
- OS.UnionRgn(handle, polyRgn, handle);
- OS.DisposeRgn(polyRgn);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds the given rectangle to the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param rect the rectangle to merge with the receiver
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void add(Rectangle rect) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (rect.width < 0 || rect.height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- add (rect.x, rect.y, rect.width, rect.height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds the given rectangle to the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width coordinate of the rectangle
- * @param height the height coordinate of the rectangle
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.1
- */
-public void add(int x, int y, int width, int height) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ rectRgn = OS.NewRgn();
- short[] r = new short[4];
- OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height));
- OS.RectRgn(rectRgn, r);
- OS.UnionRgn(handle, rectRgn, handle);
- OS.DisposeRgn(rectRgn);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Adds all of the polygons which make up the area covered
- * by the argument to the collection of polygons the receiver
- * maintains to describe its area.
- *
- * @param region the region to merge
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void add(Region region) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- OS.UnionRgn(handle, region.handle, handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the point specified by the
- * arguments is inside the area specified by the receiver,
- * and <code>false</code> otherwise.
- *
- * @param x the x coordinate of the point to test for containment
- * @param y the y coordinate of the point to test for containment
- * @return <code>true</code> if the region contains the point and <code>false</code> otherwise
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public boolean contains(int x, int y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- short[] point = new short[]{(short)y, (short)x};
- return OS.PtInRgn(point, handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the given point is inside the
- * area specified by the receiver, and <code>false</code>
- * otherwise.
- *
- * @param pt the point to test for containment
- * @return <code>true</code> if the region contains the point and <code>false</code> otherwise
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public boolean contains(Point pt) {
- if (pt == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- return contains(pt.x, pt.y);
-}
-
-NSAffineTransform transform;
-void convertRgn(NSAffineTransform transform) {
- int /*long*/ newRgn = OS.NewRgn();
- Callback callback = new Callback(this, "convertRgn", 4);
- int /*long*/ proc = callback.getAddress();
- if (proc == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS);
- this.transform = transform;
- OS.QDRegionToRects(handle, OS.kQDParseRegionFromTopLeft, proc, newRgn);
- this.transform = null;
- callback.dispose();
- OS.CopyRgn(newRgn, handle);
- OS.DisposeRgn(newRgn);
-}
-
-int /*long*/ convertRgn(int /*long*/ message, int /*long*/ rgn, int /*long*/ r, int /*long*/ newRgn) {
- if (message == OS.kQDRegionToRectsMsgParse) {
- short[] rect = new short[4];
- OS.memmove(rect, r, rect.length * 2);
- int i = 0;
- NSPoint point = new NSPoint();
- int[] points = new int[10];
- point.x = rect[1];
- point.y = rect[0];
- point = transform.transformPoint(point);
- short startX, startY;
- points[i++] = startX = (short)point.x;
- points[i++] = startY = (short)point.y;
- point.x = rect[3];
- point.y = rect[0];
- point = transform.transformPoint(point);
- points[i++] = (short)Math.round(point.x);
- points[i++] = (short)point.y;
- point.x = rect[3];
- point.y = rect[2];
- point = transform.transformPoint(point);
- points[i++] = (short)Math.round(point.x);
- points[i++] = (short)Math.round(point.y);
- point.x = rect[1];
- point.y = rect[2];
- point = transform.transformPoint(point);
- points[i++] = (short)point.x;
- points[i++] = (short)Math.round(point.y);
- points[i++] = startX;
- points[i++] = startY;
- int /*long*/ polyRgn = polyRgn(points, points.length);
- OS.UnionRgn(newRgn, polyRgn, newRgn);
- OS.DisposeRgn(polyRgn);
- }
- return 0;
-}
-
-void destroy() {
- OS.DisposeRgn(handle);
- handle = 0;
-}
-
-/**
- * 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) {
- if (this == object) return true;
- if (!(object instanceof Region)) return false;
- Region region = (Region)object;
- return handle == region.handle;
-}
-
-/**
- * Returns a rectangle which represents the rectangular
- * union of the collection of polygons the receiver
- * maintains to describe its area.
- *
- * @return a bounding rectangle for the region
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see Rectangle#union
- */
-public Rectangle getBounds() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- short[] bounds = new short[4];
- OS.GetRegionBounds(handle, bounds);
- int width = bounds[3] - bounds[1];
- int height = bounds[2] - bounds[0];
- return new Rectangle(bounds[1], bounds[0], width, height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-NSBezierPath getPath() {
- Callback callback = new Callback(this, "regionToRects", 4);
- if (callback.getAddress() == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS);
- NSBezierPath path = NSBezierPath.bezierPath();
- path.retain();
- OS.QDRegionToRects(handle, OS.kQDParseRegionFromTopLeft, callback.getAddress(), path.id);
- callback.dispose();
- if (path.isEmpty()) path.appendBezierPathWithRect(new NSRect());
- return path;
-}
-
-NSPoint pt = new NSPoint();
-short[] rect = new short[4];
-int /*long*/ regionToRects(int /*long*/ message, int /*long*/ rgn, int /*long*/ r, int /*long*/ path) {
- if (message == OS.kQDRegionToRectsMsgParse) {
- OS.memmove(rect, r, rect.length * 2);
- pt.x = rect[1];
- pt.y = rect[0];
- OS.objc_msgSend(path, OS.sel_moveToPoint_, pt);
- pt.x = rect[3];
- OS.objc_msgSend(path, OS.sel_lineToPoint_, pt);
- pt.x = rect[3];
- pt.y = rect[2];
- OS.objc_msgSend(path, OS.sel_lineToPoint_, pt);
- pt.x = rect[1];
- OS.objc_msgSend(path, OS.sel_lineToPoint_, pt);
- OS.objc_msgSend(path, OS.sel_closePath);
- }
- return 0;
-}
-
-/**
- * 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
- *
- * @see #equals
- */
-public int hashCode() {
- return (int)/*64*/handle;
-}
-
-/**
- * Intersects the given rectangle to the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param rect the rectangle to intersect with the receiver
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
- */
-public void intersect(Rectangle rect) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- intersect (rect.x, rect.y, rect.width, rect.height);
-}
-
-/**
- * Intersects the given rectangle to the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width coordinate of the rectangle
- * @param height the height coordinate of the rectangle
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.1
- */
-public void intersect(int x, int y, int width, int height) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ rectRgn = OS.NewRgn();
- short[] r = new short[4];
- OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height));
- OS.RectRgn(rectRgn, r);
- OS.SectRgn(handle, rectRgn, handle);
- OS.DisposeRgn(rectRgn);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Intersects all of the polygons which make up the area covered
- * by the argument to the collection of polygons the receiver
- * maintains to describe its area.
- *
- * @param region the region to intersect
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
- */
-public void intersect(Region region) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- OS.SectRgn(handle, region.handle, handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the rectangle described by the
- * arguments intersects with any of the polygons the receiver
- * maintains to describe its area, and <code>false</code> otherwise.
- *
- * @param x the x coordinate of the origin of the rectangle
- * @param y the y coordinate of the origin of the rectangle
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- * @return <code>true</code> if the rectangle intersects with the receiver, and <code>false</code> otherwise
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see Rectangle#intersects(Rectangle)
- */
-public boolean intersects (int x, int y, int width, int height) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- short[] r = new short[4];
- OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height));
- return OS.RectInRgn(r, handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the given rectangle intersects
- * with any of the polygons the receiver maintains to describe
- * its area and <code>false</code> otherwise.
- *
- * @param rect the rectangle to test for intersection
- * @return <code>true</code> if the rectangle intersects with the receiver, and <code>false</code> otherwise
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see Rectangle#intersects(Rectangle)
- */
-public boolean intersects(Rectangle rect) {
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- return intersects(rect.x, rect.y, rect.width, rect.height);
-}
-
-/**
- * Returns <code>true</code> if the region has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the region.
- * When a region has been disposed, it is an error to
- * invoke any other method using the region.
- *
- * @return <code>true</code> when the region is disposed, and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == 0;
-}
-
-/**
- * Returns <code>true</code> if the receiver does not cover any
- * area in the (x, y) coordinate plane, and <code>false</code> if
- * the receiver does cover some area in the plane.
- *
- * @return <code>true</code> if the receiver is empty, and <code>false</code> otherwise
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public boolean isEmpty() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- return OS.EmptyRgn(handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Subtracts the given polygon from the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param pointArray points that describe the polygon to merge with the receiver
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
- */
-public void subtract (int[] pointArray) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (pointArray.length < 2) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ polyRgn = polyRgn(pointArray, pointArray.length);
- OS.DiffRgn(handle, polyRgn, handle);
- OS.DisposeRgn(polyRgn);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Subtracts the given rectangle from the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param rect the rectangle to subtract from the receiver
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
- */
-public void subtract(Rectangle rect) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- subtract (rect.x, rect.y, rect.width, rect.height);
-}
-
-/**
- * Subtracts the given rectangle from the collection of polygons
- * the receiver maintains to describe its area.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width coordinate of the rectangle
- * @param height the height coordinate of the rectangle
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.1
- */
-public void subtract(int x, int y, int width, int height) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int /*long*/ rectRgn = OS.NewRgn();
- short[] r = new short[4];
- OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height));
- OS.RectRgn(rectRgn, r);
- OS.DiffRgn(handle, rectRgn, handle);
- OS.DisposeRgn(rectRgn);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Subtracts all of the polygons which make up the area covered
- * by the argument from the collection of polygons the receiver
- * maintains to describe its area.
- *
- * @param region the region to subtract
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.0
- */
-public void subtract(Region region) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- OS.DiffRgn(handle, region.handle, handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Translate all of the polygons the receiver maintains to describe
- * its area by the specified point.
- *
- * @param x the x coordinate of the point to translate
- * @param y the y coordinate of the point to translate
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.1
- */
-public void translate (int x, int y) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- OS.OffsetRgn (handle, (short)x, (short)y);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Translate all of the polygons the receiver maintains to describe
- * its area by the specified point.
- *
- * @param pt the point to translate
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.1
- */
-public void translate (Point pt) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pt == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- translate (pt.x, pt.y);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "Region {*DISPOSED*}";
- return "Region {" + handle + "}";
-}
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java
deleted file mode 100755
index 1d8b96f356..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java
+++ /dev/null
@@ -1,1980 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.internal.C;
-import org.eclipse.swt.internal.Compatibility;
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.*;
-
-/**
- * <code>TextLayout</code> is a graphic object that represents
- * styled text.
- * <p>
- * Instances of this class provide support for drawing, cursor
- * navigation, hit testing, text wrapping, alignment, tab expansion
- * line breaking, etc. These are aspects required for rendering internationalized text.
- * </p><p>
- * Application code must explicitly invoke the <code>TextLayout#dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/snippets/#textlayout">TextLayout, TextStyle snippets</a>
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: CustomControlExample, StyledText tab</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- *
- * @since 3.0
- */
-public final class TextLayout extends Resource {
-
- NSTextStorage textStorage;
- NSLayoutManager layoutManager;
- NSTextContainer textContainer;
- Font font;
- String text;
- StyleItem[] styles;
- int spacing, ascent, descent, indent;
- boolean justify;
- int alignment;
- int[] tabs;
- int[] segments;
- int wrapWidth;
- int orientation;
-
- int[] lineOffsets;
- NSRect[] lineBounds;
-
- static final int UNDERLINE_THICK = 1 << 16;
- static final RGB LINK_FOREGROUND = new RGB (0, 51, 153);
- int[] invalidOffsets;
- static final char LTR_MARK = '\u200E', RTL_MARK = '\u200F', ZWS = '\u200B';
-
- static class StyleItem {
- TextStyle style;
- int start;
-
- public String toString () {
- return "StyleItem {" + start + ", " + style + "}";
- }
- }
-
-/**
- * Constructs a new instance of this class on the given device.
- * <p>
- * You must dispose the text layout when it is no longer required.
- * </p>
- *
- * @param device the device on which to allocate the text layout
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * </ul>
- *
- * @see #dispose()
- */
-public TextLayout (Device device) {
- super(device);
- wrapWidth = ascent = descent = -1;
- alignment = SWT.LEFT;
- orientation = SWT.LEFT_TO_RIGHT;
- text = "";
- styles = new StyleItem[2];
- styles[0] = new StyleItem();
- styles[1] = new StyleItem();
- init();
-}
-
-void checkLayout() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
-}
-
-float[] computePolyline(int left, int top, int right, int bottom) {
- int height = bottom - top; // can be any number
- int width = 2 * height; // must be even
- int peaks = Compatibility.ceil(right - left, width);
- if (peaks == 0 && right - left > 2) {
- peaks = 1;
- }
- int length = ((2 * peaks) + 1) * 2;
- if (length < 0) return new float[0];
-
- float[] coordinates = new float[length];
- for (int i = 0; i < peaks; i++) {
- int index = 4 * i;
- coordinates[index] = left + (width * i);
- coordinates[index+1] = bottom;
- coordinates[index+2] = coordinates[index] + width / 2;
- coordinates[index+3] = top;
- }
- coordinates[length-2] = left + (width * peaks);
- coordinates[length-1] = bottom;
- return coordinates;
-}
-
-
-void computeRuns() {
- if (textStorage != null) return;
- String segmentsText = getSegmentsText();
- NSString str = NSString.stringWith(segmentsText);
- textStorage = (NSTextStorage)new NSTextStorage().alloc().init();
- layoutManager = (NSLayoutManager)new NSLayoutManager().alloc().init();
- layoutManager.setBackgroundLayoutEnabled(NSThread.isMainThread());
- textContainer = (NSTextContainer)new NSTextContainer().alloc();
- NSSize size = new NSSize();
- size.width = wrapWidth != -1 ? wrapWidth : Float.MAX_VALUE;
- size.height = Float.MAX_VALUE;
- textContainer.initWithContainerSize(size);
- textStorage.addLayoutManager(layoutManager);
- layoutManager.addTextContainer(textContainer);
-
- /*
- * Bug in Cocoa. Adding attributes directly to a NSTextStorage causes
- * output to the console and eventually a segmentation fault when printing
- * on a thread other than the main thread. The fix is to add attributes to
- * a separate NSMutableAttributedString and add it to text storage when done.
- */
- NSMutableAttributedString attrStr = (NSMutableAttributedString)new NSMutableAttributedString().alloc();
- attrStr.id = attrStr.initWithString(str).id;
- attrStr.beginEditing();
- Font defaultFont = font != null ? font : device.systemFont;
- NSRange range = new NSRange();
- range.length = str.length();
- attrStr.addAttribute(OS.NSFontAttributeName, defaultFont.handle, range);
- defaultFont.addTraits(attrStr, range);
- //TODO ascend descent wrap
- NSMutableParagraphStyle paragraph = (NSMutableParagraphStyle)new NSMutableParagraphStyle().alloc().init();
- int align = OS.NSLeftTextAlignment;
- if (justify) {
- align = OS.NSJustifiedTextAlignment;
- } else {
- switch (alignment) {
- case SWT.CENTER:
- align = OS.NSCenterTextAlignment;
- break;
- case SWT.RIGHT:
- align = OS.NSRightTextAlignment;
- }
- }
- paragraph.setAlignment(align);
- paragraph.setLineSpacing(spacing);
- paragraph.setFirstLineHeadIndent(indent);
- paragraph.setLineBreakMode(wrapWidth != -1 ? OS.NSLineBreakByWordWrapping : OS.NSLineBreakByClipping);
- paragraph.setTabStops(NSArray.array());
- if (tabs != null) {
- int count = tabs.length;
- for (int i = 0, pos = 0; i < count; i++) {
- pos += tabs[i];
- NSTextTab tab = (NSTextTab)new NSTextTab().alloc();
- tab = tab.initWithType(OS.NSLeftTabStopType, pos);
- paragraph.addTabStop(tab);
- tab.release();
- }
- int width = count - 2 >= 0 ? tabs[count - 1] - tabs[count - 2] : tabs[count - 1];
- paragraph.setDefaultTabInterval(width);
- }
- attrStr.addAttribute(OS.NSParagraphStyleAttributeName, paragraph, range);
- paragraph.release();
- int /*long*/ textLength = str.length();
- for (int i = 0; i < styles.length - 1; i++) {
- StyleItem run = styles[i];
- if (run.style == null) continue;
- TextStyle style = run.style;
- range.location = textLength != 0 ? translateOffset(run.start) : 0;
- range.length = translateOffset(styles[i + 1].start) - range.location;
- Font font = style.font;
- if (font != null) {
- attrStr.addAttribute(OS.NSFontAttributeName, font.handle, range);
- font.addTraits(attrStr, range);
- }
- Color foreground = style.foreground;
- if (foreground != null) {
- NSColor color = NSColor.colorWithDeviceRed(foreground.handle[0], foreground.handle[1], foreground.handle[2], 1);
- attrStr.addAttribute(OS.NSForegroundColorAttributeName, color, range);
- }
- Color background = style.background;
- if (background != null) {
- NSColor color = NSColor.colorWithDeviceRed(background.handle[0], background.handle[1], background.handle[2], 1);
- attrStr.addAttribute(OS.NSBackgroundColorAttributeName, color, range);
- }
- if (style.strikeout) {
- attrStr.addAttribute(OS.NSStrikethroughStyleAttributeName, NSNumber.numberWithInt(OS.NSUnderlineStyleSingle), range);
- Color strikeColor = style.strikeoutColor;
- if (strikeColor != null) {
- NSColor color = NSColor.colorWithDeviceRed(strikeColor.handle[0], strikeColor.handle[1], strikeColor.handle[2], 1);
- attrStr.addAttribute(OS.NSStrikethroughColorAttributeName, color, range);
- }
- }
- if (isUnderlineSupported(style)) {
- int underlineStyle = 0;
- switch (style.underlineStyle) {
- case SWT.UNDERLINE_SINGLE:
- underlineStyle = OS.NSUnderlineStyleSingle;
- break;
- case SWT.UNDERLINE_DOUBLE:
- underlineStyle = OS.NSUnderlineStyleDouble;
- break;
- case UNDERLINE_THICK:
- underlineStyle = OS.NSUnderlineStyleThick;
- break;
- case SWT.UNDERLINE_LINK: {
- underlineStyle = OS.NSUnderlineStyleSingle;
- if (foreground == null) {
- NSColor color = NSColor.colorWithDeviceRed(LINK_FOREGROUND.red / 255f, LINK_FOREGROUND.green / 255f, LINK_FOREGROUND.blue / 255f, 1);
- attrStr.addAttribute(OS.NSForegroundColorAttributeName, color, range);
- }
- break;
- }
- }
- if (underlineStyle != 0) {
- attrStr.addAttribute(OS.NSUnderlineStyleAttributeName, NSNumber.numberWithInt(underlineStyle), range);
- Color underlineColor = style.underlineColor;
- if (underlineColor != null) {
- NSColor color = NSColor.colorWithDeviceRed(underlineColor.handle[0], underlineColor.handle[1], underlineColor.handle[2], 1);
- attrStr.addAttribute(OS.NSUnderlineColorAttributeName, color, range);
- }
- }
- }
- if (style.rise != 0) {
- attrStr.addAttribute(OS.NSBaselineOffsetAttributeName, NSNumber.numberWithInt(style.rise), range);
- }
- if (style.metrics != null) {
- //TODO implement metrics
- }
- }
- attrStr.endEditing();
- textStorage.setAttributedString(attrStr);
- attrStr.release();
-
- textContainer.setLineFragmentPadding(0);
- layoutManager.glyphRangeForTextContainer(textContainer);
-
- int numberOfLines;
- int /*long*/ numberOfGlyphs = layoutManager.numberOfGlyphs(), index;
- int /*long*/ rangePtr = OS.malloc(NSRange.sizeof);
- NSRange lineRange = new NSRange();
- for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
- layoutManager.lineFragmentUsedRectForGlyphAtIndex(index, rangePtr, true);
- OS.memmove(lineRange, rangePtr, NSRange.sizeof);
- index = lineRange.location + lineRange.length;
- }
- if (numberOfLines == 0) numberOfLines++;
- int[] offsets = new int[numberOfLines + 1];
- NSRect[] bounds = new NSRect[numberOfLines];
- for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
- bounds[numberOfLines] = layoutManager.lineFragmentUsedRectForGlyphAtIndex(index, rangePtr, true);
- if (numberOfLines < bounds.length - 1) bounds[numberOfLines].height -= spacing;
- OS.memmove(lineRange, rangePtr, NSRange.sizeof);
- offsets[numberOfLines] = (int)/*64*/lineRange.location;
- index = lineRange.location + lineRange.length;
- }
- if (numberOfLines == 0) {
- Font font = this.font != null ? this.font : device.systemFont;
- NSFont nsFont = font.handle;
- bounds[0] = new NSRect();
- bounds[0].height = Math.max(layoutManager.defaultLineHeightForFont(nsFont), ascent + descent);
- }
- OS.free(rangePtr);
- offsets[numberOfLines] = (int)/*64*/textStorage.length();
- this.lineOffsets = offsets;
- this.lineBounds = bounds;
-}
-
-void destroy() {
- freeRuns();
- font = null;
- text = null;
- styles = null;
-}
-
-/**
- * Draws the receiver's text using the specified GC at the specified
- * point.
- *
- * @param gc the GC to draw
- * @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 SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the gc is null</li>
- * </ul>
- */
-public void draw(GC gc, int x, int y) {
- draw(gc, x, y, -1, -1, null, null);
-}
-
-/**
- * Draws the receiver's text using the specified GC at the specified
- * point.
- *
- * @param gc the GC to draw
- * @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 selectionStart the offset where the selections starts, or -1 indicating no selection
- * @param selectionEnd the offset where the selections ends, or -1 indicating no selection
- * @param selectionForeground selection foreground, or NULL to use the system default color
- * @param selectionBackground selection background, or NULL to use the system default color
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the gc is null</li>
- * </ul>
- */
-public void draw(GC gc, int x, int y, int selectionStart, int selectionEnd, Color selectionForeground, Color selectionBackground) {
- draw(gc, x, y, selectionStart, selectionEnd, selectionForeground, selectionBackground, 0);
-}
-
-/**
- * Draws the receiver's text using the specified GC at the specified
- * point.
- * <p>
- * The parameter <code>flags</code> can include one of <code>SWT.DELIMITER_SELECTION</code>
- * or <code>SWT.FULL_SELECTION</code> to specify the selection behavior on all lines except
- * for the last line, and can also include <code>SWT.LAST_LINE_SELECTION</code> to extend
- * the specified selection behavior to the last line.
- * </p>
- * @param gc the GC to draw
- * @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 selectionStart the offset where the selections starts, or -1 indicating no selection
- * @param selectionEnd the offset where the selections ends, or -1 indicating no selection
- * @param selectionForeground selection foreground, or NULL to use the system default color
- * @param selectionBackground selection background, or NULL to use the system default color
- * @param flags drawing options
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the gc is null</li>
- * </ul>
- *
- * @since 3.3
- */
-public void draw(GC gc, int x, int y, int selectionStart, int selectionEnd, Color selectionForeground, Color selectionBackground, int flags) {
- checkLayout ();
- if (gc == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (gc.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (selectionForeground != null && selectionForeground.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (selectionBackground != null && selectionBackground.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = gc.checkGC(GC.CLIPPING | GC.TRANSFORM | GC.FOREGROUND);
- try {
- computeRuns();
- int length = translateOffset(text.length());
- if (length == 0 && flags == 0) return;
- gc.handle.saveGraphicsState();
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- NSRange range = new NSRange();
- int /*long*/ numberOfGlyphs = layoutManager.numberOfGlyphs();
- if (numberOfGlyphs > 0) {
- range.location = 0;
- range.length = numberOfGlyphs;
- layoutManager.drawBackgroundForGlyphRange(range, pt);
- }
- boolean hasSelection = selectionStart <= selectionEnd && selectionStart != -1 && selectionEnd != -1;
- if (hasSelection || (flags & SWT.LAST_LINE_SELECTION) != 0) {
- if (selectionBackground == null) selectionBackground = device.getSystemColor(SWT.COLOR_LIST_SELECTION);
- NSColor selectionColor = NSColor.colorWithDeviceRed(selectionBackground.handle[0], selectionBackground.handle[1], selectionBackground.handle[2], selectionBackground.handle[3]);
- NSBezierPath path = NSBezierPath.bezierPath();
- NSRect rect = new NSRect();
- if (hasSelection) {
- int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF);
- range.location = translateOffset(selectionStart);
- range.length = translateOffset(selectionEnd - selectionStart + 1);
- int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount);
- int /*long*/ [] rectCount = new int /*long*/ [1];
- OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF);
- OS.free(pRectCount);
- for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) {
- OS.memmove(rect, pArray, NSRect.sizeof);
- fixRect(rect);
- rect.x += pt.x;
- rect.y += pt.y;
- rect.height = Math.max(rect.height, ascent + descent);
- path.appendBezierPathWithRect(rect);
- }
- }
- //TODO draw full selection for wrapped text
- if ((flags & SWT.LAST_LINE_SELECTION) != 0) {
- NSRect bounds = lineBounds[lineBounds.length - 1];
- rect.x = pt.x + bounds.x + bounds.width;
- rect.y = y + bounds.y;
- rect.width = (flags & SWT.FULL_SELECTION) != 0 ? 0x7fffffff : bounds.height / 3;
- rect.height = Math.max(bounds.height, ascent + descent);
- path.appendBezierPathWithRect(rect);
- }
- selectionColor.setFill();
- path.fill();
- }
- if (numberOfGlyphs > 0) {
- range.location = 0;
- range.length = numberOfGlyphs;
- float /*double*/ [] fg = gc.data.foreground;
- boolean defaultFg = fg[0] == 0 && fg[1] == 0 && fg[2] == 0 && fg[3] == 1;
- if (!defaultFg) {
- for (int i = 0; i < styles.length - 1; i++) {
- StyleItem run = styles[i];
- if (run.style != null && run.style.foreground != null) continue;
- if (run.style != null && run.style.underline && run.style.underlineStyle == SWT.UNDERLINE_LINK) continue;
- range.location = length != 0 ? translateOffset(run.start) : 0;
- range.length = translateOffset(styles[i + 1].start) - range.location;
- layoutManager.addTemporaryAttribute(OS.NSForegroundColorAttributeName, gc.data.fg, range);
- }
- }
- range.location = 0;
- range.length = numberOfGlyphs;
- layoutManager.drawGlyphsForGlyphRange(range, pt);
- if (!defaultFg) {
- range.location = 0;
- range.length = length;
- layoutManager.removeTemporaryAttribute(OS.NSForegroundColorAttributeName, range);
- }
- NSPoint point = new NSPoint();
- for (int j = 0; j < styles.length; j++) {
- StyleItem run = styles[j];
- TextStyle style = run.style;
- if (style == null) continue;
- boolean drawUnderline = style.underline && !isUnderlineSupported(style);
- drawUnderline = drawUnderline && (j + 1 == styles.length || !style.isAdherentUnderline(styles[j + 1].style));
- boolean drawBorder = style.borderStyle != SWT.NONE;
- drawBorder = drawBorder && (j + 1 == styles.length || !style.isAdherentBorder(styles[j + 1].style));
- if (!drawUnderline && !drawBorder) continue;
- int end = j + 1 < styles.length ? translateOffset(styles[j + 1].start - 1) : length;
- for (int i = 0; i < lineOffsets.length - 1; i++) {
- int lineStart = untranslateOffset(lineOffsets[i]);
- int lineEnd = untranslateOffset(lineOffsets[i + 1] - 1);
- if (drawUnderline) {
- int start = run.start;
- for (int k = j; k > 0 && style.isAdherentUnderline(styles[k - 1].style); k--) {
- start = styles[k - 1].start;
- }
- start = translateOffset(start);
- if (!(start > lineEnd || end < lineStart)) {
- range.location = Math.max(lineStart, start);
- range.length = Math.min(lineEnd, end) + 1 - range.location;
- if (range.length > 0) {
- int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF);
- int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount);
- int /*long*/ [] rectCount = new int /*long*/ [1];
- OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF);
- OS.free(pRectCount);
- NSRect rect = new NSRect();
- gc.handle.saveGraphicsState();
- float /*double*/ baseline = layoutManager.typesetter().baselineOffsetInLayoutManager(layoutManager, lineStart);
- float /*double*/ [] color = null;
- if (style.underlineColor != null) color = style.underlineColor.handle;
- if (color == null && style.foreground != null) color = style.foreground.handle;
- if (color != null) {
- NSColor.colorWithDeviceRed(color[0], color[1], color[2], color[3]).setStroke();
- }
- for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) {
- OS.memmove(rect, pArray, NSRect.sizeof);
- fixRect(rect);
- float /*double*/ underlineX = pt.x + rect.x;
- float /*double*/ underlineY = pt.y + rect.y + rect.height - baseline + 1;
- NSBezierPath path = NSBezierPath.bezierPath();
- switch (style.underlineStyle) {
- case SWT.UNDERLINE_ERROR: {
- path.setLineWidth(2f);
- path.setLineCapStyle(OS.NSRoundLineCapStyle);
- path.setLineJoinStyle(OS.NSRoundLineJoinStyle);
- path.setLineDash(new float /*double*/ []{1, 3f}, 2, 0);
- point.x = underlineX;
- point.y = underlineY + 0.5f;
- path.moveToPoint(point);
- point.x = underlineX + rect.width;
- point.y = underlineY + 0.5f;
- path.lineToPoint(point);
- break;
- }
- case SWT.UNDERLINE_SQUIGGLE: {
- gc.handle.setShouldAntialias(false);
- path.setLineWidth(1.0f);
- path.setLineCapStyle(OS.NSButtLineCapStyle);
- path.setLineJoinStyle(OS.NSMiterLineJoinStyle);
- float /*double*/ lineBottom = pt.y + rect.y + rect.height;
- float squigglyThickness = 1;
- float squigglyHeight = 2 * squigglyThickness;
- float /*double*/ squigglyY = Math.min(underlineY - squigglyHeight / 2, lineBottom - squigglyHeight - 1);
- float[] points = computePolyline((int)underlineX, (int)squigglyY, (int)(underlineX + rect.width), (int)(squigglyY + squigglyHeight));
- point.x = points[0] + 0.5f;
- point.y = points[1] + 0.5f;
- path.moveToPoint(point);
- for (int p = 2; p < points.length; p+=2) {
- point.x = points[p] + 0.5f;
- point.y = points[p+1] + 0.5f;
- path.lineToPoint(point);
- }
- break;
- }
- }
- path.stroke();
- }
- gc.handle.restoreGraphicsState();
- }
- }
- }
- if (drawBorder) {
- int start = run.start;
- for (int k = j; k > 0 && style.isAdherentBorder(styles[k - 1].style); k--) {
- start = styles[k - 1].start;
- }
- start = translateOffset(start);
- if (!(start > lineEnd || end < lineStart)) {
- range.location = Math.max(lineStart, start);
- range.length = Math.min(lineEnd, end) + 1 - range.location;
- if (range.length > 0) {
- int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF);
- int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount);
- int /*long*/ [] rectCount = new int /*long*/ [1];
- OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF);
- OS.free(pRectCount);
- NSRect rect = new NSRect();
- gc.handle.saveGraphicsState();
- float /*double*/ [] color = null;
- if (style.borderColor != null) color = style.borderColor.handle;
- if (color == null && style.foreground != null) color = style.foreground.handle;
- if (color != null) {
- NSColor.colorWithDeviceRed(color[0], color[1], color[2], color[3]).setStroke();
- }
- int width = 1;
- float[] dashes = null;
- switch (style.borderStyle) {
- case SWT.BORDER_SOLID: break;
- case SWT.BORDER_DASH: dashes = width != 0 ? GC.LINE_DASH : GC.LINE_DASH_ZERO; break;
- case SWT.BORDER_DOT: dashes = width != 0 ? GC.LINE_DOT : GC.LINE_DOT_ZERO; break;
- }
- float /*double*/ [] lengths = null;
- if (dashes != null) {
- lengths = new float /*double*/[dashes.length];
- for (int k = 0; k < lengths.length; k++) {
- lengths[k] = width == 0 ? dashes[k] : dashes[k] * width;
- }
- }
- for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) {
- OS.memmove(rect, pArray, NSRect.sizeof);
- fixRect(rect);
- rect.x += pt.x + 0.5f;
- rect.y += pt.y + 0.5f;
- rect.width -= 0.5f;
- rect.height -= 0.5f;
- NSBezierPath path = NSBezierPath.bezierPath();
- path.setLineDash(lengths, lengths != null ? lengths.length : 0, 0);
- path.appendBezierPathWithRect(rect);
- path.stroke();
- }
- gc.handle.restoreGraphicsState();
- }
- }
- }
- }
- }
- }
- gc.handle.restoreGraphicsState();
- } finally {
- gc.uncheckGC(pool);
- }
-}
-
-void fixRect(NSRect rect) {
- for (int j = 0; j < lineBounds.length; j++) {
- NSRect line = lineBounds[j];
- if (line.y <= rect.y && rect.y < line.y + line.height) {
- if (rect.x + rect.width > line.x + line.width) {
- rect.width = line.x + line.width - rect.x;
- }
- }
- }
-}
-
-void freeRuns() {
- if (textStorage == null) return;
- if (textStorage != null) {
- textStorage.release();
- }
- if (layoutManager != null) {
- layoutManager.release();
- }
- if (textContainer != null) {
- textContainer.release();
- }
- textStorage = null;
- layoutManager = null;
- textContainer = null;
-}
-
-/**
- * Returns the receiver's horizontal text alignment, which will be one
- * of <code>SWT.LEFT</code>, <code>SWT.CENTER</code> or
- * <code>SWT.RIGHT</code>.
- *
- * @return the alignment used to positioned text horizontally
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getAlignment() {
- checkLayout();
- return alignment;
-}
-
-/**
- * Returns the ascent of the receiver.
- *
- * @return the ascent
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getDescent()
- * @see #setDescent(int)
- * @see #setAscent(int)
- * @see #getLineMetrics(int)
- */
-public int getAscent () {
- checkLayout();
- return ascent;
-}
-
-/**
- * Returns the bounds of the receiver. The width returned is either the
- * width of the longest line or the width set using {@link TextLayout#setWidth(int)}.
- * To obtain the text bounds of a line use {@link TextLayout#getLineBounds(int)}.
- *
- * @return the bounds of the receiver
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setWidth(int)
- * @see #getLineBounds(int)
- */
-public Rectangle getBounds() {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- NSRect rect = layoutManager.usedRectForTextContainer(textContainer);
- if (wrapWidth != -1) rect.width = wrapWidth;
- if (text.length() == 0) {
- Font font = this.font != null ? this.font : device.systemFont;
- NSFont nsFont = font.handle;
- rect.height = layoutManager.defaultLineHeightForFont(nsFont);
- }
- rect.height = Math.max(rect.height, ascent + descent) + spacing;
- return new Rectangle(0, 0, (int)Math.ceil(rect.width), (int)Math.ceil(rect.height));
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the bounds for the specified range of characters. The
- * bounds is the smallest rectangle that encompasses all characters
- * in the range. The start and end offsets are inclusive and will be
- * clamped if out of range.
- *
- * @param start the start offset
- * @param end the end offset
- * @return the bounds of the character range
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Rectangle getBounds(int start, int end) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int length = text.length();
- if (length == 0) return new Rectangle(0, 0, 0, 0);
- if (start > end) return new Rectangle(0, 0, 0, 0);
- start = Math.min(Math.max(0, start), length - 1);
- end = Math.min(Math.max(0, end), length - 1);
- start = translateOffset(start);
- end = translateOffset(end);
- NSRange range = new NSRange();
- range.location = start;
- range.length = end - start + 1;
- int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF);
- int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount);
- int /*long*/ [] rectCount = new int /*long*/ [1];
- OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF);
- OS.free(pRectCount);
- NSRect rect = new NSRect();
- int left = 0x7FFFFFFF, right = 0;
- int top = 0x7FFFFFFF, bottom = 0;
- for (int i = 0; i < rectCount[0]; i++, pArray += NSRect.sizeof) {
- OS.memmove(rect, pArray, NSRect.sizeof);
- fixRect(rect);
- left = Math.min(left, (int)rect.x);
- right = Math.max(right, (int)Math.ceil(rect.x + rect.width));
- top = Math.min(top, (int)rect.y);
- bottom = Math.max(bottom, (int)Math.ceil(rect.y + rect.height));
- }
- return new Rectangle(left, top, right - left, bottom - top);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the descent of the receiver.
- *
- * @return the descent
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getAscent()
- * @see #setAscent(int)
- * @see #setDescent(int)
- * @see #getLineMetrics(int)
- */
-public int getDescent () {
- checkLayout();
- return descent;
-}
-
-/**
- * Returns the default 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 () {
- checkLayout();
- return font;
-}
-
-/**
-* Returns the receiver's indent.
-*
-* @return the receiver's indent
-*
-* @exception SWTException <ul>
-* <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
-* </ul>
-*
-* @since 3.2
-*/
-public int getIndent () {
- checkLayout();
- return indent;
-}
-
-/**
-* Returns the receiver's justification.
-*
-* @return the receiver's justification
-*
-* @exception SWTException <ul>
-* <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
-* </ul>
-*
-* @since 3.2
-*/
-public boolean getJustify () {
- checkLayout();
- return justify;
-}
-
-/**
- * Returns the embedding level for the specified character offset. The
- * embedding level is usually used to determine the directionality of a
- * character in bidirectional text.
- *
- * @param offset the character offset
- * @return the embedding level
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- */
-public int getLevel(int offset) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int length = text.length();
- if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- offset = translateOffset(offset);
- int /*long*/ glyphOffset = layoutManager.glyphIndexForCharacterAtIndex(offset);
- NSRange range = new NSRange();
- range.location = glyphOffset;
- range.length = 1;
- int /*long*/ pBidiLevels = OS.malloc(1);
- byte[] bidiLevels = new byte[1];
- int /*long*/ result = layoutManager.getGlyphsInRange(range, 0, 0, 0, 0, pBidiLevels);
- if (result > 0) {
- OS.memmove(bidiLevels, pBidiLevels, 1);
- }
- OS.free(pBidiLevels);
- return bidiLevels[0];
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the line offsets. Each value in the array is the
- * offset for the first character in a line except for the last
- * value, which contains the length of the text.
- *
- * @return the line offsets
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int[] getLineOffsets() {
- checkLayout ();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int[] offsets = new int[lineOffsets.length];
- for (int i = 0; i < offsets.length; i++) {
- offsets[i] = untranslateOffset(lineOffsets[i]);
- }
- return offsets;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the index of the line that contains the specified
- * character offset.
- *
- * @param offset the character offset
- * @return the line index
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getLineIndex(int offset) {
- checkLayout ();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int length = text.length();
- if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- offset = translateOffset(offset);
- for (int line=0; line<lineOffsets.length - 1; line++) {
- if (lineOffsets[line + 1] > offset) {
- return line;
- }
- }
- return lineBounds.length - 1;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the bounds of the line for the specified line index.
- *
- * @param lineIndex the line index
- * @return the line bounds
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the line index is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public Rectangle getLineBounds(int lineIndex) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- if (!(0 <= lineIndex && lineIndex < lineBounds.length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- NSRect rect = lineBounds[lineIndex];
- int height = Math.max((int)Math.ceil(rect.height), ascent + descent);
- return new Rectangle((int)rect.x, (int)rect.y, (int)Math.ceil(rect.width), height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the receiver's line count. This includes lines caused
- * by wrapping.
- *
- * @return the line count
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getLineCount() {
- checkLayout ();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- return lineOffsets.length - 1;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the font metrics for the specified line index.
- *
- * @param lineIndex the line index
- * @return the font metrics
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the line index is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public FontMetrics getLineMetrics (int lineIndex) {
- checkLayout ();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int lineCount = getLineCount();
- if (!(0 <= lineIndex && lineIndex < lineCount)) SWT.error(SWT.ERROR_INVALID_RANGE);
- int length = text.length();
- if (length == 0) {
- Font font = this.font != null ? this.font : device.systemFont;
- NSFont nsFont = font.handle;
- int ascent = (int)(0.5f + nsFont.ascender());
- int descent = (int)(0.5f + (-nsFont.descender() + nsFont.leading()));
- ascent = Math.max(ascent, this.ascent);
- descent = Math.max(descent, this.descent);
- return FontMetrics.cocoa_new(ascent, descent, 0, 0, ascent + descent);
- }
- Rectangle rect = getLineBounds(lineIndex);
- int baseline = (int)layoutManager.typesetter().baselineOffsetInLayoutManager(layoutManager, getLineOffsets()[lineIndex]);
- return FontMetrics.cocoa_new(rect.height - baseline, baseline, 0, 0, rect.height);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the location for the specified character offset. The
- * <code>trailing</code> argument indicates whether the offset
- * corresponds to the leading or trailing edge of the cluster.
- *
- * @param offset the character offset
- * @param trailing the trailing flag
- * @return the location of the character offset
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getOffset(Point, int[])
- * @see #getOffset(int, int, int[])
- */
-public Point getLocation(int offset, boolean trailing) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- int length = text.length();
- if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- if (length == 0) return new Point(0, 0);
- offset = translateOffset(offset);
- int /*long*/ glyphIndex = layoutManager.glyphIndexForCharacterAtIndex(offset);
- NSRect rect = layoutManager.lineFragmentUsedRectForGlyphAtIndex(glyphIndex, 0);
- NSPoint point = layoutManager.locationForGlyphAtIndex(glyphIndex);
- if (trailing) {
- NSRange range = new NSRange();
- range.location = offset;
- range.length = 1;
- int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF);
- int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount);
- int /*long*/ [] rectCount = new int /*long*/ [1];
- OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF);
- OS.free(pRectCount);
- if (rectCount[0] > 0) {
- NSRect bounds = new NSRect();
- OS.memmove(bounds, pArray, NSRect.sizeof);
- fixRect(bounds);
- point.x += bounds.width;
- }
- }
- return new Point((int)point.x, (int)rect.y);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the next offset for the specified offset and movement
- * type. The movement is one of <code>SWT.MOVEMENT_CHAR</code>,
- * <code>SWT.MOVEMENT_CLUSTER</code>, <code>SWT.MOVEMENT_WORD</code>,
- * <code>SWT.MOVEMENT_WORD_END</code> or <code>SWT.MOVEMENT_WORD_START</code>.
- *
- * @param offset the start offset
- * @param movement the movement type
- * @return the next offset
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the offset is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getPreviousOffset(int, int)
- */
-public int getNextOffset (int offset, int movement) {
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- return _getOffset(offset, movement, true);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-int _getOffset (int offset, int movement, boolean forward) {
- checkLayout();
- computeRuns();
- int length = text.length();
- if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- if (length == 0) return 0;
- offset = translateOffset(offset);
- length = translateOffset(length);
- switch (movement) {
- case SWT.MOVEMENT_CLUSTER://TODO cluster
- case SWT.MOVEMENT_CHAR: {
- boolean invalid = false;
- do {
- int newOffset = offset;
- if (forward) {
- if (newOffset < length) newOffset++;
- } else {
- if (newOffset > 0) newOffset--;
- }
- if (newOffset == offset) break;
- offset = newOffset;
- invalid = false;
- if (invalidOffsets != null) {
- for (int i = 0; i < invalidOffsets.length; i++) {
- if (offset == invalidOffsets[i]) {
- invalid = true;
- break;
- }
- }
- }
- } while (invalid);
- return untranslateOffset(offset);
- }
- case SWT.MOVEMENT_WORD: {
- return untranslateOffset((int)/*64*/textStorage.nextWordFromIndex(offset, forward));
- }
- case SWT.MOVEMENT_WORD_END: {
- NSRange range = textStorage.doubleClickAtIndex(length == offset ? length - 1 : offset);
- return untranslateOffset((int)/*64*/(range.location + range.length));
- }
- case SWT.MOVEMENT_WORD_START: {
- NSRange range = textStorage.doubleClickAtIndex(length == offset ? length - 1 : offset);
- return untranslateOffset((int)/*64*/range.location);
- }
- }
- return untranslateOffset(offset);
-}
-
-/**
- * Returns the character offset for the specified point.
- * For a typical character, the trailing argument will be filled in to
- * indicate whether the point is closer to the leading edge (0) or
- * the trailing edge (1). When the point is over a cluster composed
- * of multiple characters, the trailing argument will be filled with the
- * position of the character in the cluster that is closest to
- * the point.
- *
- * @param point the point
- * @param trailing the trailing buffer
- * @return the character offset
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the trailing length is less than <code>1</code></li>
- * <li>ERROR_NULL_ARGUMENT - if the point is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getLocation(int, boolean)
- */
-public int getOffset(Point point, int[] trailing) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- if (point == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- return getOffset(point.x, point.y, trailing);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the character offset for the specified point.
- * For a typical character, the trailing argument will be filled in to
- * indicate whether the point is closer to the leading edge (0) or
- * the trailing edge (1). When the point is over a cluster composed
- * of multiple characters, the trailing argument will be filled with the
- * position of the character in the cluster that is closest to
- * the point.
- *
- * @param x the x coordinate of the point
- * @param y the y coordinate of the point
- * @param trailing the trailing buffer
- * @return the character offset
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the trailing length is less than <code>1</code></li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getLocation(int, boolean)
- */
-public int getOffset(int x, int y, int[] trailing) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- computeRuns();
- if (trailing != null && trailing.length < 1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- int length = text.length();
- if (length == 0) return 0;
- NSPoint pt = new NSPoint();
- pt.x = x;
- pt.y = y;
- float /*double*/[] partialFration = new float /*double*/[1];
- int /*long*/ glyphIndex = layoutManager.glyphIndexForPoint(pt, textContainer, partialFration);
- int /*long*/ offset = layoutManager.characterIndexForGlyphAtIndex(glyphIndex);
- if (trailing != null) trailing[0] = Math.round((float)/*64*/partialFration[0]);
- return Math.min(untranslateOffset((int)/*64*/offset), length - 1);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns the orientation of the receiver.
- *
- * @return the orientation style
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getOrientation() {
- checkLayout();
- return orientation;
-}
-
-/**
- * Returns the previous offset for the specified offset and movement
- * type. The movement is one of <code>SWT.MOVEMENT_CHAR</code>,
- * <code>SWT.MOVEMENT_CLUSTER</code> or <code>SWT.MOVEMENT_WORD</code>,
- * <code>SWT.MOVEMENT_WORD_END</code> or <code>SWT.MOVEMENT_WORD_START</code>.
- *
- * @param offset the start offset
- * @param movement the movement type
- * @return the previous offset
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the offset is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getNextOffset(int, int)
- */
-public int getPreviousOffset (int index, int movement) {
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- return _getOffset(index, movement, false);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Gets the ranges of text that are associated with a <code>TextStyle</code>.
- *
- * @return the ranges, an array of offsets representing the start and end of each
- * text style.
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getStyles()
- *
- * @since 3.2
- */
-public int[] getRanges () {
- checkLayout();
- int[] result = new int[styles.length * 2];
- int count = 0;
- for (int i=0; i<styles.length - 1; i++) {
- if (styles[i].style != null) {
- result[count++] = styles[i].start;
- result[count++] = styles[i + 1].start - 1;
- }
- }
- if (count != result.length) {
- int[] newResult = new int[count];
- System.arraycopy(result, 0, newResult, 0, count);
- result = newResult;
- }
- return result;
-}
-
-/**
- * Returns the text segments offsets of the receiver.
- *
- * @return the text segments offsets
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int[] getSegments() {
- checkLayout();
- return segments;
-}
-
-String getSegmentsText() {
- if (segments == null) return text;
- int nSegments = segments.length;
- if (nSegments <= 1) return text;
- int length = text.length();
- if (length == 0) return text;
- if (nSegments == 2) {
- if (segments[0] == 0 && segments[1] == length) return text;
- }
- invalidOffsets = new int[nSegments];
- char[] oldChars = new char[length];
- text.getChars(0, length, oldChars, 0);
- char[] newChars = new char[length + nSegments];
- int charCount = 0, segmentCount = 0;
- char separator = getOrientation() == SWT.RIGHT_TO_LEFT ? RTL_MARK : LTR_MARK;
- while (charCount < length) {
- if (segmentCount < nSegments && charCount == segments[segmentCount]) {
- invalidOffsets[segmentCount] = charCount + segmentCount;
- newChars[charCount + segmentCount++] = separator;
- } else {
- newChars[charCount + segmentCount] = oldChars[charCount++];
- }
- }
- if (segmentCount < nSegments) {
- invalidOffsets[segmentCount] = charCount + segmentCount;
- segments[segmentCount] = charCount;
- newChars[charCount + segmentCount++] = separator;
- }
- if (segmentCount != nSegments) {
- int[] tmp = new int [segmentCount];
- System.arraycopy(invalidOffsets, 0, tmp, 0, segmentCount);
- invalidOffsets = tmp;
- }
- return new String(newChars, 0, Math.min(charCount + segmentCount, newChars.length));
-}
-
-/**
- * Returns the line spacing of the receiver.
- *
- * @return the line spacing
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getSpacing () {
- checkLayout();
- return spacing;
-}
-
-/**
- * Gets the style of the receiver at the specified character offset.
- *
- * @param offset the text offset
- * @return the style or <code>null</code> if not set
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public TextStyle getStyle (int offset) {
- checkLayout();
- int length = text.length();
- if (!(0 <= offset && offset < length)) SWT.error(SWT.ERROR_INVALID_RANGE);
- for (int i=1; i<styles.length; i++) {
- StyleItem item = styles[i];
- if (item.start > offset) {
- return styles[i - 1].style;
- }
- }
- return null;
-}
-
-/**
- * Gets all styles of the receiver.
- *
- * @return the styles
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #getRanges()
- *
- * @since 3.2
- */
-public TextStyle[] getStyles () {
- checkLayout();
- TextStyle[] result = new TextStyle[styles.length];
- int count = 0;
- for (int i=0; i<styles.length; i++) {
- if (styles[i].style != null) {
- result[count++] = styles[i].style;
- }
- }
- if (count != result.length) {
- TextStyle[] newResult = new TextStyle[count];
- System.arraycopy(result, 0, newResult, 0, count);
- result = newResult;
- }
- return result;
-}
-
-/**
- * Returns the tab list of the receiver.
- *
- * @return the tab list
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int[] getTabs() {
- checkLayout();
- return tabs;
-}
-
-/**
- * Gets the receiver's text, which will be an empty
- * string if it has never been set.
- *
- * @return the receiver's text
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public String getText () {
- checkLayout ();
- return text;
-}
-
-/**
- * Returns the width of the receiver.
- *
- * @return the width
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public int getWidth () {
- checkLayout();
- return wrapWidth;
-}
-
-/**
- * Returns <code>true</code> if the text layout has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the text layout.
- * When a text layout has been disposed, it is an error to
- * invoke any other method using the text layout.
- * </p>
- *
- * @return <code>true</code> when the text layout is disposed and <code>false</code> otherwise
- */
-public boolean isDisposed () {
- return device == null;
-}
-
-/*
- * Returns true if the underline style is supported natively
- */
-boolean isUnderlineSupported (TextStyle style) {
- if (style != null && style.underline) {
- int uStyle = style.underlineStyle;
- return uStyle == SWT.UNDERLINE_SINGLE || uStyle == SWT.UNDERLINE_DOUBLE || uStyle == SWT.UNDERLINE_LINK || uStyle == UNDERLINE_THICK;
- }
- return false;
-}
-
-/**
- * Sets the text alignment for the receiver. The alignment controls
- * how a line of text is positioned horizontally. The argument should
- * be one of <code>SWT.LEFT</code>, <code>SWT.RIGHT</code> or <code>SWT.CENTER</code>.
- * <p>
- * The default alignment is <code>SWT.LEFT</code>. Note that the receiver's
- * width must be set in order to use <code>SWT.RIGHT</code> or <code>SWT.CENTER</code>
- * alignment.
- * </p>
- *
- * @param alignment the new alignment
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setWidth(int)
- */
-public void setAlignment (int alignment) {
- checkLayout();
- int mask = SWT.LEFT | SWT.CENTER | SWT.RIGHT;
- alignment &= mask;
- if (alignment == 0) return;
- if ((alignment & SWT.LEFT) != 0) alignment = SWT.LEFT;
- if ((alignment & SWT.RIGHT) != 0) alignment = SWT.RIGHT;
- if (this.alignment == alignment) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.alignment = alignment;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the ascent of the receiver. The ascent is distance in pixels
- * from the baseline to the top of the line and it is applied to all
- * lines. The default value is <code>-1</code> which means that the
- * ascent is calculated from the line fonts.
- *
- * @param ascent the new ascent
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the ascent is less than <code>-1</code></li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setDescent(int)
- * @see #getLineMetrics(int)
- */
-public void setAscent (int ascent) {
- checkLayout ();
- if (ascent < -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (this.ascent == ascent) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.ascent = ascent;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the descent of the receiver. The descent is distance in pixels
- * from the baseline to the bottom of the line and it is applied to all
- * lines. The default value is <code>-1</code> which means that the
- * descent is calculated from the line fonts.
- *
- * @param descent the new descent
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the descent is less than <code>-1</code></li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setAscent(int)
- * @see #getLineMetrics(int)
- */
-public void setDescent (int descent) {
- checkLayout ();
- if (descent < -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (this.descent == descent) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.descent = descent;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the default font which will be used by the receiver
- * to draw and measure text. If the
- * argument is null, then a default font appropriate
- * for the platform will be used instead. Note that a text
- * style can override the default font.
- *
- * @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) {
- checkLayout ();
- if (font != null && font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- Font oldFont = this.font;
- if (oldFont == font) return;
- this.font = font;
- if (oldFont != null && oldFont.equals(font)) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the indent of the receiver. This indent it applied of the first line of
- * each paragraph.
- *
- * @param indent new indent
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.2
- */
-public void setIndent (int indent) {
- checkLayout ();
- if (indent < 0) return;
- if (this.indent == indent) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.indent = indent;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the justification of the receiver. Note that the receiver's
- * width must be set in order to use justification.
- *
- * @param justify new justify
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.2
- */
-public void setJustify (boolean justify) {
- checkLayout ();
- if (justify == this.justify) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.justify = justify;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the orientation of the receiver, which must be one
- * of <code>SWT.LEFT_TO_RIGHT</code> or <code>SWT.RIGHT_TO_LEFT</code>.
- *
- * @param orientation new orientation style
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setOrientation(int orientation) {
- checkLayout();
- int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
- orientation &= mask;
- if (orientation == 0) return;
- if ((orientation & SWT.LEFT_TO_RIGHT) != 0) orientation = SWT.LEFT_TO_RIGHT;
- if (this.orientation == orientation) return;
- this.orientation = orientation;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the offsets of the receiver's text segments. Text segments are used to
- * override the default behaviour of the bidirectional algorithm.
- * Bidirectional reordering can happen within a text segment but not
- * between two adjacent segments.
- * <p>
- * Each text segment is determined by two consecutive offsets in the
- * <code>segments</code> arrays. The first element of the array should
- * always be zero and the last one should always be equals to length of
- * the text.
- * </p>
- *
- * @param segments the text segments offset
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setSegments(int[] segments) {
- checkLayout();
- if (this.segments == null && segments == null) return;
- if (this.segments != null && segments !=null) {
- if (this.segments.length == segments.length) {
- int i;
- for (i = 0; i <segments.length; i++) {
- if (this.segments[i] != segments[i]) break;
- }
- if (i == segments.length) return;
- }
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.segments = segments;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the line spacing of the receiver. The line spacing
- * is the space left between lines.
- *
- * @param spacing the new line spacing
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the spacing is negative</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setSpacing (int spacing) {
- checkLayout();
- if (spacing < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (this.spacing == spacing) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.spacing = spacing;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the style of the receiver for the specified range. Styles previously
- * set for that range will be overwritten. The start and end offsets are
- * inclusive and will be clamped if out of range.
- *
- * @param style the style
- * @param start the start offset
- * @param end the end offset
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setStyle (TextStyle style, int start, int end) {
- checkLayout();
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- int length = text.length();
- if (length == 0) return;
- if (start > end) return;
- start = Math.min(Math.max(0, start), length - 1);
- end = Math.min(Math.max(0, end), length - 1);
- int low = -1;
- int high = styles.length;
- while (high - low > 1) {
- int index = (high + low) / 2;
- if (styles[index + 1].start > start) {
- high = index;
- } else {
- low = index;
- }
- }
- if (0 <= high && high < styles.length) {
- StyleItem item = styles[high];
- if (item.start == start && styles[high + 1].start - 1 == end) {
- if (style == null) {
- if (item.style == null) return;
- } else {
- if (style.equals(item.style)) return;
- }
- }
- }
- freeRuns();
- int modifyStart = high;
- int modifyEnd = modifyStart;
- while (modifyEnd < styles.length) {
- if (styles[modifyEnd + 1].start > end) break;
- modifyEnd++;
- }
- if (modifyStart == modifyEnd) {
- int styleStart = styles[modifyStart].start;
- int styleEnd = styles[modifyEnd + 1].start - 1;
- if (styleStart == start && styleEnd == end) {
- styles[modifyStart].style = style;
- return;
- }
- if (styleStart != start && styleEnd != end) {
- StyleItem[] newStyles = new StyleItem[styles.length + 2];
- System.arraycopy(styles, 0, newStyles, 0, modifyStart + 1);
- StyleItem item = new StyleItem();
- item.start = start;
- item.style = style;
- newStyles[modifyStart + 1] = item;
- item = new StyleItem();
- item.start = end + 1;
- item.style = styles[modifyStart].style;
- newStyles[modifyStart + 2] = item;
- System.arraycopy(styles, modifyEnd + 1, newStyles, modifyEnd + 3, styles.length - modifyEnd - 1);
- styles = newStyles;
- return;
- }
- }
- if (start == styles[modifyStart].start) modifyStart--;
- if (end == styles[modifyEnd + 1].start - 1) modifyEnd++;
- int newLength = styles.length + 1 - (modifyEnd - modifyStart - 1);
- StyleItem[] newStyles = new StyleItem[newLength];
- System.arraycopy(styles, 0, newStyles, 0, modifyStart + 1);
- StyleItem item = new StyleItem();
- item.start = start;
- item.style = style;
- newStyles[modifyStart + 1] = item;
- styles[modifyEnd].start = end + 1;
- System.arraycopy(styles, modifyEnd, newStyles, modifyStart + 2, styles.length - modifyEnd);
- styles = newStyles;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the receiver's tab list. Each value in the tab list specifies
- * the space in pixels from the origin of the text layout to the respective
- * tab stop. The last tab stop width is repeated continuously.
- *
- * @param tabs the new tab list
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setTabs(int[] tabs) {
- checkLayout();
- if (this.tabs == null && tabs == null) return;
- if (this.tabs != null && tabs !=null) {
- if (this.tabs.length == tabs.length) {
- int i;
- for (i = 0; i < tabs.length; i++) {
- if (this.tabs[i] != tabs[i]) break;
- }
- if (i == tabs.length) return;
- }
- }
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.tabs = tabs;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the receiver's text.
- *<p>
- * Note: Setting the text also clears all the styles. This method
- * returns without doing anything if the new text is the same as
- * the current text.
- * </p>
- *
- * @param text the new text
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the text is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setText (String text) {
- checkLayout ();
- if (text == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (text.equals(this.text)) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.text = text;
- styles = new StyleItem[2];
- styles[0] = new StyleItem();
- styles[1] = new StyleItem();
- styles[styles.length - 1].start = text.length();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Sets the line width of the receiver, which determines how
- * text should be wrapped and aligned. The default value is
- * <code>-1</code> which means wrapping is disabled.
- *
- * @param width the new width
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the width is <code>0</code> or less than <code>-1</code></li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setAlignment(int)
- */
-public void setWidth (int width) {
- checkLayout();
- if (width < -1 || width == 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- if (this.wrapWidth == width) return;
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- freeRuns();
- this.wrapWidth = width;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString () {
- if (isDisposed()) return "TextLayout {*DISPOSED*}";
- return "TextLayout {" + text + "}";
-}
-
-/*
- * Translate a client offset to an internal offset
- */
-int translateOffset (int offset) {
- int length = text.length();
- if (length == 0) return offset;
- if (invalidOffsets == null) return offset;
- for (int i = 0; i < invalidOffsets.length; i++) {
- if (offset < invalidOffsets[i]) break;
- offset++;
- }
- return offset;
-}
-
-/*
- * Translate an internal offset to a client offset
- */
-int untranslateOffset (int offset) {
- int length = text.length();
- if (length == 0) return offset;
- if (invalidOffsets == null) return offset;
- for (int i = 0; i < invalidOffsets.length; i++) {
- if (offset == invalidOffsets[i]) {
- offset++;
- continue;
- }
- if (offset < invalidOffsets[i]) {
- return offset - i;
- }
- }
- return offset - invalidOffsets.length;
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java
deleted file mode 100755
index b4eee32e72..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation 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
- *******************************************************************************/
-package org.eclipse.swt.graphics;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.cocoa.*;
-
-/**
- * Instances of this class represent transformation matrices for
- * points expressed as (x, y) pairs of floating point numbers.
- * <p>
- * Application code must explicitly invoke the <code>Transform.dispose()</code>
- * method to release the operating system resources managed by each instance
- * when those instances are no longer required.
- * </p>
- * <p>
- * This class requires the operating system's advanced graphics subsystem
- * which may not be available on some platforms.
- * </p>
- *
- * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a>
- * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
- *
- * @since 3.1
- */
-public class Transform extends Resource {
- /**
- * the OS resource for the Transform
- * (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>
- */
- public NSAffineTransform handle;
-
-/**
- * Constructs a new identity Transform.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the Transform
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Transform (Device device) {
- this(device, 1, 0, 0, 1, 0, 0);
-}
-
-/**
- * Constructs a new Transform given an array of elements that represent the
- * matrix that describes the transformation.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the Transform
- * @param elements an array of floats that describe the transformation matrix
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device, or the elements array is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the elements array is too small to hold the matrix values</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Transform(Device device, float[] elements) {
- this (device, checkTransform(elements)[0], elements[1], elements[2], elements[3], elements[4], elements[5]);
-}
-
-/**
- * Constructs a new Transform given all of the elements that represent the
- * matrix that describes the transformation.
- * <p>
- * This operation requires the operating system's advanced
- * graphics subsystem which may not be available on some
- * platforms.
- * </p>
- *
- * @param device the device on which to allocate the Transform
- * @param m11 the first element of the first row of the matrix
- * @param m12 the second element of the first row of the matrix
- * @param m21 the first element of the second row of the matrix
- * @param m22 the second element of the second row of the matrix
- * @param dx the third element of the first row of the matrix
- * @param dy the third element of the second row of the matrix
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li>
- * </ul>
- * @exception SWTError <ul>
- * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li>
- * </ul>
- *
- * @see #dispose()
- */
-public Transform (Device device, float m11, float m12, float m21, float m22, float dx, float dy) {
- super(device);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle = NSAffineTransform.transform();
- if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES);
- handle.retain();
- setElements(m11, m12, m21, m22, dx, dy);
- init();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-static float[] checkTransform(float[] elements) {
- if (elements == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (elements.length < 6) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- return elements;
-}
-
-void destroy() {
- handle.release();
- handle = null;
-}
-
-/**
- * Fills the parameter with the values of the transformation matrix
- * that the receiver represents, in the order {m11, m12, m21, m22, dx, dy}.
- *
- * @param elements array to hold the matrix values
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li>
- * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the matrix values</li>
- * </ul>
- */
-public void getElements(float[] elements) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (elements == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (elements.length < 6) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = handle.transformStruct();
- elements[0] = (float)/*64*/struct.m11;
- elements[1] = (float)/*64*/struct.m12;
- elements[2] = (float)/*64*/struct.m21;
- elements[3] = (float)/*64*/struct.m22;
- elements[4] = (float)/*64*/struct.tX;
- elements[5] = (float)/*64*/struct.tY;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver such that the matrix it represents becomes the
- * identity matrix.
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.4
- */
-public void identity() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = new NSAffineTransformStruct();
- struct.m11 = 1;
- struct.m22 = 1;
- handle.setTransformStruct(struct);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver such that the matrix it represents becomes
- * the mathematical inverse of the matrix it previously represented.
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_CANNOT_INVERT_MATRIX - if the matrix is not invertible</li>
- * </ul>
- */
-public void invert() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = handle.transformStruct();
- if ((struct.m11 * struct.m22 - struct.m12 * struct.m21) == 0) {
- SWT.error(SWT.ERROR_CANNOT_INVERT_MATRIX);
- }
- handle.invert();
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns <code>true</code> if the Transform has been disposed,
- * and <code>false</code> otherwise.
- * <p>
- * This method gets the dispose state for the Transform.
- * When a Transform has been disposed, it is an error to
- * invoke any other method using the Transform.
- *
- * @return <code>true</code> when the Transform is disposed, and <code>false</code> otherwise
- */
-public boolean isDisposed() {
- return handle == null;
-}
-
-/**
- * Returns <code>true</code> if the Transform represents the identity matrix
- * and false otherwise.
- *
- * @return <code>true</code> if the receiver is an identity Transform, and <code>false</code> otherwise
- */
-public boolean isIdentity() {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = handle.transformStruct();
- return struct.m11 == 1 && struct.m12 == 0 && struct.m21 == 0 && struct.m22 == 1 && struct.tX == 0 && struct.tY == 0;
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver such that the matrix it represents becomes the
- * the result of multiplying the matrix it previously represented by the
- * argument.
- *
- * @param matrix the matrix to multiply the receiver by
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @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>
- */
-public void multiply(Transform matrix) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (matrix == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (matrix.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.prependTransform(matrix.handle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver so that it represents a transformation that is
- * equivalent to its previous transformation rotated by the specified angle.
- * The angle is specified in degrees and for the identity transform 0 degrees
- * is at the 3 o'clock position. A positive value indicates a clockwise rotation
- * while a negative value indicates a counter-clockwise rotation.
- *
- * @param angle the angle to rotate the transformation by
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void rotate(float angle) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.rotateByDegrees(angle);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver so that it represents a transformation that is
- * equivalent to its previous transformation scaled by (scaleX, scaleY).
- *
- * @param scaleX the amount to scale in the X direction
- * @param scaleY the amount to scale in the Y direction
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void scale(float scaleX, float scaleY) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.scaleXBy(scaleX, scaleY);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver to represent a new transformation given all of
- * the elements that represent the matrix that describes that transformation.
- *
- * @param m11 the first element of the first row of the matrix
- * @param m12 the second element of the first row of the matrix
- * @param m21 the first element of the second row of the matrix
- * @param m22 the second element of the second row of the matrix
- * @param dx the third element of the first row of the matrix
- * @param dy the third element of the second row of the matrix
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void setElements(float m11, float m12, float m21, float m22, float dx, float dy) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = new NSAffineTransformStruct();
- struct.m11 = m11;
- struct.m12 = m12;
- struct.m21 = m21;
- struct.m22 = m22;
- struct.tX = dx;
- struct.tY = dy;
- handle.setTransformStruct(struct);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver so that it represents a transformation that is
- * equivalent to its previous transformation sheared by (shearX, shearY).
- *
- * @param shearX the shear factor in the X direction
- * @param shearY the shear factor in the Y direction
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @since 3.4
- */
-public void shear(float shearX, float shearY) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSAffineTransformStruct struct = new NSAffineTransformStruct();
- struct.m11 = 1;
- struct.m12 = shearX;
- struct.m21 = shearY;
- struct.m22 = 1;
- NSAffineTransform matrix = NSAffineTransform.transform();
- matrix.setTransformStruct(struct);
- handle.prependTransform(matrix);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Given an array containing points described by alternating x and y values,
- * modify that array such that each point has been replaced with the result of
- * applying the transformation represented by the receiver to that point.
- *
- * @param pointArray an array of alternating x and y values to be transformed
- *
- * @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 transform(float[] pointArray) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- NSPoint point = new NSPoint();
- int length = pointArray.length / 2;
- for (int i = 0, j = 0; i < length; i++, j += 2) {
- point.x = pointArray[j];
- point.y = pointArray[j + 1];
- point = handle.transformPoint(point);
- pointArray[j] = (float)/*64*/point.x;
- pointArray[j + 1] = (float)/*64*/point.y;
- }
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Modifies the receiver so that it represents a transformation that is
- * equivalent to its previous transformation translated by (offsetX, offsetY).
- *
- * @param offsetX the distance to translate in the X direction
- * @param offsetY the distance to translate in the Y direction
- *
- * @exception SWTException <ul>
- * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void translate(float offsetX, float offsetY) {
- if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
- NSAutoreleasePool pool = null;
- if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
- try {
- handle.translateXBy(offsetX, offsetY);
- } finally {
- if (pool != null) pool.release();
- }
-}
-
-/**
- * Returns a string containing a concise, human-readable
- * description of the receiver.
- *
- * @return a string representation of the receiver
- */
-public String toString() {
- if (isDisposed()) return "Transform {*DISPOSED*}";
- float[] elements = new float[6];
- getElements(elements);
- return "Transform {" + elements [0] + ", " + elements [1] + ", " +elements [2] + ", " +elements [3] + ", " +elements [4] + ", " +elements [5] + "}";
-}
-
-}