diff options
author | Silenio Quarti <silenio> | 2005-04-07 19:38:00 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2005-04-07 19:38:00 +0000 |
commit | b2343fc03843d983cdbcf528d75f7e9524819b07 (patch) | |
tree | 6924d22c9c7057ba9f5b38a5c096b7a60feefc03 | |
parent | 4b21419a582289fce72ef15bfe70049085b3c772 (diff) | |
download | eclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.tar.gz eclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.tar.xz eclipse.platform.swt-b2343fc03843d983cdbcf528d75f7e9524819b07.zip |
pattern API
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 + "}"; +} + +} |