summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2005-04-07 19:38:00 +0000
committerSilenio Quarti <silenio>2005-04-07 19:38:00 +0000
commitb2343fc03843d983cdbcf528d75f7e9524819b07 (patch)
tree6924d22c9c7057ba9f5b38a5c096b7a60feefc03
parent4b21419a582289fce72ef15bfe70049085b3c772 (diff)
downloadeclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.tar.gz
eclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.tar.xz
eclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.zip
pattern API
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/cairo/org/eclipse/swt/graphics/Pattern.java59
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/emulated/graphics/org/eclipse/swt/graphics/Pattern.java53
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java78
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java40
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java74
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GCData.java2
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java72
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Pattern.java80
10 files changed, 443 insertions, 19 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cairo/org/eclipse/swt/graphics/Pattern.java b/bundles/org.eclipse.swt/Eclipse SWT/cairo/org/eclipse/swt/graphics/Pattern.java
new file mode 100644
index 0000000000..69d2705e1b
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT/cairo/org/eclipse/swt/graphics/Pattern.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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.cairo.*;
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public class Pattern extends Resource {
+
+ /**
+ * the handle to the OS path resource
+ * (Warning: This field is platform dependent)
+ */
+ public int /*long*/ handle;
+
+public Pattern(Device device, Image image) {
+ if (device == null) device = Device.getDevice();
+ if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ this.device = device;
+ device.checkCairo();
+ image.createSurface();
+ handle = Cairo.cairo_pattern_create_for_surface(image.surface);
+ if (handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+ Cairo.cairo_pattern_set_extend(handle, Cairo.CAIRO_EXTEND_REPEAT);
+ if (device.tracking) device.new_Object(this);
+}
+
+public void dispose() {
+ if (handle == 0) return;
+ if (device.isDisposed()) return;
+ Cairo.cairo_pattern_destroy(handle);
+ handle = 0;
+ if (device.tracking) device.dispose_Object(this);
+ device = null;
+}
+
+public boolean isDisposed() {
+ return handle == 0;
+}
+
+public String toString() {
+ if (isDisposed()) return "Pattern {*DISPOSED*}";
+ return "Pattern {" + handle + "}";
+}
+
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/emulated/graphics/org/eclipse/swt/graphics/Pattern.java b/bundles/org.eclipse.swt/Eclipse SWT/emulated/graphics/org/eclipse/swt/graphics/Pattern.java
new file mode 100644
index 0000000000..e3d16997a5
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT/emulated/graphics/org/eclipse/swt/graphics/Pattern.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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.*;
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public class Pattern extends Resource {
+
+ /**
+ * the handle to the OS path resource
+ * (Warning: This field is platform dependent)
+ */
+ public int handle;
+
+public Pattern(Device device, Image image) {
+ if (device == null) device = Device.getDevice();
+ if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ this.device = device;
+ if (handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+ if (device.tracking) device.new_Object(this);
+}
+
+public void dispose() {
+ if (handle == 0) return;
+ if (device.isDisposed()) return;
+ handle = 0;
+ if (device.tracking) device.dispose_Object(this);
+ device = null;
+}
+
+public boolean isDisposed() {
+ return handle == 0;
+}
+
+public String toString() {
+ if (isDisposed()) return "Pattern {*DISPOSED*}";
+ return "Pattern {" + handle + "}";
+}
+
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
index 1a3d9b5096..06c88c12b5 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
@@ -1193,7 +1193,11 @@ public void fillArc(int x, int y, int width, int height, int startAngle, int arc
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, x + width / 2f, y + height / 2f);
Cairo.cairo_scale(cairo, width / 2f, height / 2f);
Cairo.cairo_arc_negative(cairo, 0, 0, 1, -startAngle * (float)Compatibility.PI / 180, -(startAngle + arcAngle) * (float)Compatibility.PI / 180);
@@ -1321,7 +1325,11 @@ public void fillOval(int x, int y, int width, int height) {
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, x + width / 2f, y + height / 2f);
Cairo.cairo_scale(cairo, width / 2f, height / 2f);
Cairo.cairo_arc_negative(cairo, 0, 0, 1, 0, 2 * (float)Compatibility.PI);
@@ -1350,7 +1358,11 @@ public void fillPath (Path path) {
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_add_path(cairo, path.handle);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1387,7 +1399,11 @@ public void fillPolygon(int[] pointArray) {
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
drawPolyline(cairo, pointArray, true);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1433,7 +1449,11 @@ public void fillRectangle(int x, int y, int width, int height) {
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_rectangle(cairo, x, y, width, height);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1514,7 +1534,11 @@ public void fillRoundRectangle(int x, int y, int width, int height, int arcWidth
int /*long*/ colormap = OS.gdk_colormap_get_system();
OS.gdk_colormap_query_color(colormap, color.pixel, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, nx, ny);
Cairo.cairo_scale(cairo, naw2, nah2);
Cairo.cairo_move_to(cairo, fw - 1, 0);
@@ -1633,6 +1657,14 @@ public Color getBackground() {
}
/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public Pattern getBackgroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.backgroundPattern;
+}
+
+/**
* Returns the width of the specified character in the font
* selected into the receiver.
* <p>
@@ -1783,6 +1815,14 @@ public Color getForeground() {
/**
* WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
*/
+public Pattern getForegroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.foregroundPattern;
+}
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
public int getInterpolation() {
if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
return data.interpolation;
@@ -2162,6 +2202,18 @@ public void setBackground(Color color) {
if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
OS.gdk_gc_set_background(handle, color.handle);
+ data.backgroundPattern = null;
+}
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setBackgroundPattern(Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initCairo();
+ data.backgroundPattern = pattern;
}
static void setCairoFont(int /*long*/ cairo, Font font) {
@@ -2392,6 +2444,20 @@ public void setForeground(Color color) {
GdkColor gdkColor = color.handle;
Cairo.cairo_set_rgb_color(cairo, (gdkColor.red & 0xFFFF) / (float)0xFFFF, (gdkColor.green & 0xFFFF) / (float)0xFFFF, (gdkColor.blue & 0xFFFF) / (float)0xFFFF);
}
+ data.foregroundPattern = null;
+}
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setForegroundPattern(Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initCairo();
+ int /*long*/ cairo = data.cairo;
+ Cairo.cairo_set_pattern(cairo, pattern.handle);
+ data.foregroundPattern = pattern;
}
/**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java
index 415d402408..93917f64bb 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java
@@ -31,6 +31,8 @@ public final class GCData {
public int /*long*/ drawable;
public GdkColor foreground;
public GdkColor background;
+ public Pattern foregroundPattern;
+ public Pattern backgroundPattern;
public int /*long*/ font;
public int /*long*/ context;
public int /*long*/ layout;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java
index 9d37e27035..89851d9424 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java
@@ -95,7 +95,7 @@ public final class Image extends Resource implements Drawable {
*/
public int /*long*/ mask;
- int /*long*/ surface;
+ int /*long*/ surface, surfaceData;
/**
* specifies the transparent pixel
@@ -537,6 +537,41 @@ int /*long*/ createMask(ImageData image, boolean copy) {
void createSurface() {
if (surface != 0) return;
+ if (mask != 0) {
+ int[] w = new int[1], h = new int[1];
+ OS.gdk_drawable_get_size(pixmap, w, h);
+ int width = w[0], height = h[0];
+ int /*long*/ pixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, true, 8, width, height);
+ if (pixbuf == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+ int /*long*/ colormap = OS.gdk_colormap_get_system();
+ OS.gdk_pixbuf_get_from_drawable(pixbuf, pixmap, colormap, 0, 0, 0, 0, width, height);
+ int stride = OS.gdk_pixbuf_get_rowstride(pixbuf);
+ int /*long*/ pixels = OS.gdk_pixbuf_get_pixels(pixbuf);
+ int /*long*/ gdkImagePtr = OS.gdk_drawable_get_image(mask, 0, 0, width, height);
+ byte[] line = new byte[stride];
+ for (int y=0; y<height; y++) {
+ int /*long*/ offset = pixels + (y * stride);
+ OS.memmove(line, offset, stride);
+ for (int x=0; x<width; x++) {
+ int offset1 = x * 4;
+ if (gdkImagePtr != 0) {
+ if (OS.gdk_image_get_pixel(gdkImagePtr, x, y) == 0) {
+ line[offset1+3] = 0;
+ }
+ }
+ byte temp = line[offset1];
+ line[offset1] = line[offset1 + 2];
+ line[offset1 + 2] = temp;
+ }
+ OS.memmove(offset, line, stride);
+ }
+ if (gdkImagePtr != 0) OS.g_object_unref(gdkImagePtr);
+ surfaceData = OS.g_malloc(stride * height);
+ OS.memmove(surfaceData, pixels, stride * height);
+ surface = Cairo.cairo_surface_create_for_image(surfaceData, Cairo.CAIRO_FORMAT_ARGB32, width, height, stride);
+ OS.g_object_unref(pixbuf);
+ return;
+ }
int /*long*/ xDisplay = OS.GDK_DISPLAY();
int /*long*/ xDrawable = OS.GDK_PIXMAP_XID(pixmap);
int /*long*/ xVisual = OS.gdk_x11_visual_get_xvisual(OS.gdk_visual_get_system());
@@ -565,7 +600,8 @@ public void dispose () {
if (pixmap != 0) OS.g_object_unref(pixmap);
if (mask != 0) OS.g_object_unref(mask);
if (surface != 0) Cairo.cairo_surface_destroy(surface);
- surface = pixmap = mask = 0;
+ if (surfaceData != 0) OS.g_free(surfaceData);
+ surfaceData = surface = pixmap = mask = 0;
memGC = null;
if (device.tracking) device.dispose_Object(this);
device = null;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
index 7c5a5fb9dc..55cbb9c2ab 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
@@ -1375,7 +1375,11 @@ public void fillArc(int x, int y, int width, int height, int startAngle, int arc
color.pixel = values.background;
OS.XQueryColor(xDisplay, data.colormap, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, x + width / 2f, y + height / 2f);
Cairo.cairo_scale(cairo, width / 2f, height / 2f);
Cairo.cairo_arc_negative(cairo, 0, 0, 1, -startAngle * (float)Compatibility.PI / 180, -(startAngle + arcAngle) * (float)Compatibility.PI / 180);
@@ -1541,7 +1545,11 @@ public void fillOval (int x, int y, int width, int height) {
color.pixel = values.background;
OS.XQueryColor(display, data.colormap, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, x + width / 2f, y + height / 2f);
Cairo.cairo_scale(cairo, width / 2f, height / 2f);
Cairo.cairo_arc_negative(cairo, 0, 0, 1, 0, 2 * (float)Compatibility.PI);
@@ -1568,7 +1576,11 @@ public void fillPath (Path path) {
OS.XQueryColor(display, data.colormap, color);
int /*long*/ cairo = data.cairo;
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_add_path(cairo, path.handle);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1604,7 +1616,11 @@ public void fillPolygon(int[] pointArray) {
color.pixel = values.background;
OS.XQueryColor(xDisplay, data.colormap, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
drawPolyline(cairo, pointArray, true);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1652,7 +1668,11 @@ public void fillRectangle (int x, int y, int width, int height) {
color.pixel = values.background;
OS.XQueryColor(xDisplay, data.colormap, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_rectangle(cairo, x, y, width, height);
Cairo.cairo_fill(cairo);
Cairo.cairo_restore(cairo);
@@ -1729,7 +1749,11 @@ public void fillRoundRectangle (int x, int y, int width, int height, int arcWidt
color.pixel = values.background;
OS.XQueryColor(xDisplay, data.colormap, color);
Cairo.cairo_save(cairo);
- Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ if (data.backgroundPattern != null) {
+ Cairo.cairo_set_pattern(cairo, data.backgroundPattern.handle);
+ } else {
+ Cairo.cairo_set_rgb_color(cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF);
+ }
Cairo.cairo_translate(cairo, nx, ny);
Cairo.cairo_scale(cairo, naw2, nah2);
Cairo.cairo_move_to(cairo, fw - 1, 0);
@@ -1969,6 +1993,13 @@ public Color getBackground() {
}
/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public Pattern getBackgroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.backgroundPattern;
+}
+/**
* Returns the width of the specified character in the font
* selected into the receiver.
* <p>
@@ -2479,6 +2510,13 @@ public Color getForeground() {
/**
* WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
*/
+public Pattern getForegroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.foregroundPattern;
+}
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
public int getInterpolation() {
if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
return data.interpolation;
@@ -2856,6 +2894,17 @@ public void setBackground (Color color) {
if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
OS.XSetBackground(data.display, handle, color.handle.pixel);
+ data.backgroundPattern = null;
+}
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setBackgroundPattern(Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initCairo();
+ data.backgroundPattern = pattern;
}
static void setCairoFont(int /*long*/ cairo, Font font) {
//TODO - use X font instead of loading new one???
@@ -3067,6 +3116,19 @@ public void setForeground (Color color) {
XColor xColor = color.handle;
Cairo.cairo_set_rgb_color(cairo, (xColor.red & 0xFFFF) / (float)0xFFFF, (xColor.green & 0xFFFF) / (float)0xFFFF, (xColor.blue & 0xFFFF) / (float)0xFFFF);
}
+ data.foregroundPattern = null;
+}
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setForegroundPattern(Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initCairo();
+ int /*long*/ cairo = data.cairo;
+ Cairo.cairo_set_pattern(cairo, pattern.handle);
+ data.foregroundPattern = pattern;
}
/**
* WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GCData.java
index 2156801f18..7cc452c7fb 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GCData.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GCData.java
@@ -31,6 +31,8 @@ public final class GCData {
public int drawable;
public int foreground = -1;
public int background = -1;
+ public Pattern foregroundPattern;
+ public Pattern backgroundPattern;
public Font font;
public int colormap;
public int clipRgn, damageRgn;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
index 40607586e5..1ce4947e0c 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java
@@ -319,6 +319,7 @@ int createGdipPen() {
int color = Gdip.Color_new(data.alpha << 24 | rgb);
int pen = Gdip.Pen_new(color, width);
Gdip.Color_delete(color);
+ if (data.foregroundPattern != null) Gdip.Pen_SetBrush(pen, data.foregroundPattern.handle);
int dashStyle = 0;
switch (style & OS.PS_STYLE_MASK) {
case OS.PS_SOLID: dashStyle = Gdip.DashStyleSolid; break;
@@ -357,6 +358,24 @@ int createGdipPen() {
return pen;
}
+void destroyGdipBrush(int brush) {
+ int type = Gdip.Brush_GetType(brush);
+ switch (type) {
+ case Gdip.BrushTypeSolidColor:
+ Gdip.SolidBrush_delete(brush);
+ break;
+ case Gdip.BrushTypeHatchFill:
+ Gdip.HatchBrush_delete(brush);
+ break;
+ case Gdip.BrushTypeLinearGradient:
+ Gdip.LinearGradientBrush_delete(brush);
+ break;
+ case Gdip.BrushTypeTextureFill:
+ Gdip.TextureBrush_delete(brush);
+ break;
+ }
+}
+
/**
* Disposes of the operating system resources associated with
* the graphics context. Applications must dispose of all GCs
@@ -368,7 +387,7 @@ public void dispose() {
if (data.gdipGraphics != 0) Gdip.Graphics_delete(data.gdipGraphics);
if (data.gdipPen != 0) Gdip.Pen_delete(data.gdipPen);
- if (data.gdipBrush != 0) Gdip.SolidBrush_delete(data.gdipBrush);
+ if (data.gdipBrush != 0) destroyGdipBrush(data.gdipBrush);
data.gdipBrush = data.gdipPen = data.gdipGraphics = 0;
/* Select stock pen and brush objects and free resources */
@@ -2231,6 +2250,14 @@ public Color getBackground() {
}
/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public Pattern getBackgroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.backgroundPattern;
+}
+
+/**
* Returns the width of the specified character in the font
* selected into the receiver.
* <p>
@@ -2431,6 +2458,14 @@ public int getInterpolation() {
return SWT.DEFAULT;
}
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public Pattern getForegroundPattern() {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ return data.foregroundPattern;
+}
+
/**
* Returns the receiver's line cap style, which will be one
* of the constants <code>SWT.CAP_FLAT</code>, <code>SWT.CAP_ROUND</code>,
@@ -2845,7 +2880,7 @@ public void setAlpha(int alpha) {
data.gdipPen = 0;
}
if (data.gdipBrush != 0) {
- Gdip.SolidBrush_delete(data.gdipBrush);
+ destroyGdipBrush(data.gdipBrush);
data.gdipBrush = 0;
}
}
@@ -2869,7 +2904,7 @@ public void setBackground (Color color) {
if (handle == 0) 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 (OS.GetBkColor(handle) == color.handle) return;
+ if (data.backgroundPattern == null && OS.GetBkColor(handle) == color.handle) return;
data.background = color.handle;
OS.SetBkColor (handle, color.handle);
int newBrush = OS.CreateSolidBrush (color.handle);
@@ -2877,9 +2912,23 @@ public void setBackground (Color color) {
if (data.hBrush != 0) OS.DeleteObject (data.hBrush);
data.hBrush = newBrush;
if (data.gdipBrush != 0) {
- Gdip.SolidBrush_delete(data.gdipBrush);
+ destroyGdipBrush(data.gdipBrush);
data.gdipBrush = 0;
}
+ data.backgroundPattern = null;
+}
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setBackgroundPattern (Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initGdip(false, false);
+ if (data.gdipBrush != 0) destroyGdipBrush(data.gdipBrush);
+ data.gdipBrush = Gdip.Brush_Clone(pattern.handle);
+ data.backgroundPattern = pattern;
}
void setClipping(int clipRgn) {
@@ -3035,10 +3084,23 @@ public void setForeground (Color color) {
if (handle == 0) 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 (OS.GetTextColor(handle) == color.handle) return;
+ if (data.foregroundPattern == null && OS.GetTextColor(handle) == color.handle) return;
data.foreground = color.handle;
OS.SetTextColor(handle, color.handle);
setPen(color.handle, -1, -1, -1, -1, data.dashes);
+ data.foregroundPattern = null;
+}
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public void setForegroundPattern (Pattern pattern) {
+ if (handle == 0) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
+ if (pattern == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ initGdip(true, false);
+ Gdip.Pen_SetBrush(data.gdipPen, pattern.handle);
+ data.foregroundPattern = pattern;
}
/**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java
index c10c0152d6..9d9be4cc4c 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java
@@ -43,4 +43,6 @@ public final class GCData {
public int gdipGraphics;
public int gdipPen;
public int gdipBrush;
+ public Pattern foregroundPattern;
+ public Pattern backgroundPattern;
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Pattern.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Pattern.java
new file mode 100644
index 0000000000..8e40572e49
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Pattern.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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.gdip.*;
+
+/**
+ * WARNING API STILL UNDER CONSTRUCTION AND SUBJECT TO CHANGE
+ */
+public class Pattern extends Resource {
+
+ /**
+ * the handle to the OS path resource
+ * (Warning: This field is platform dependent)
+ */
+ public int handle;
+
+public Pattern(Device device, Image image) {
+ if (device == null) device = Device.getDevice();
+ if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+ this.device = device;
+ device.checkGDIP();
+ int img;
+ if (image.type == SWT.ICON){
+ img = Gdip.Bitmap_new(image.handle);
+ } else {
+ img = Gdip.Bitmap_new(image.handle, 0);
+ }
+ int width = Gdip.Image_GetWidth(img);
+ int height = Gdip.Image_GetHeight(img);
+ handle = Gdip.TextureBrush_new(img, Gdip.WrapModeTile, 0, 0, width, height);
+ Gdip.Bitmap_delete(img);
+ if (handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+ if (device.tracking) device.new_Object(this);
+}
+
+public void dispose() {
+ if (handle == 0) return;
+ if (device.isDisposed()) return;
+ int type = Gdip.Brush_GetType(handle);
+ switch (type) {
+ case Gdip.BrushTypeSolidColor:
+ Gdip.SolidBrush_delete(handle);
+ break;
+ case Gdip.BrushTypeHatchFill:
+ Gdip.HatchBrush_delete(handle);
+ break;
+ case Gdip.BrushTypeLinearGradient:
+ Gdip.LinearGradientBrush_delete(handle);
+ break;
+ case Gdip.BrushTypeTextureFill:
+ Gdip.TextureBrush_delete(handle);
+ break;
+ }
+ handle = 0;
+ if (device.tracking) device.dispose_Object(this);
+ device = null;
+}
+
+public boolean isDisposed() {
+ return handle == 0;
+}
+
+public String toString() {
+ if (isDisposed()) return "Pattern {*DISPOSED*}";
+ return "Pattern {" + handle + "}";
+}
+
+}