summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2007-02-08 22:45:41 +0000
committerSilenio Quarti <silenio>2007-02-08 22:45:41 +0000
commit4fb41486046e62826d702c5ec58e6cd48232783a (patch)
treefe73fb6460be5adc905bc09c729f7f17ca7dbd43
parent200eb7eac44cd3abd294d522e4db6be35dbe2d1e (diff)
downloadeclipse.platform.swt-4fb41486046e62826d702c5ec58e6cd48232783a.tar.gz
eclipse.platform.swt-4fb41486046e62826d702c5ec58e6cd48232783a.tar.xz
eclipse.platform.swt-4fb41486046e62826d702c5ec58e6cd48232783a.zip
172583 - Cairo implementation needed for drawBackground
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java65
1 files changed, 49 insertions, 16 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java
index 5365e355ff..df873d0c55 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java
@@ -12,6 +12,7 @@ package org.eclipse.swt.widgets;
import org.eclipse.swt.*;
+import org.eclipse.swt.internal.cairo.*;
import org.eclipse.swt.internal.gtk.*;
import org.eclipse.swt.graphics.*;
@@ -323,23 +324,55 @@ void deregister () {
void drawBackground (GC gc, int x, int y, int width, int height) {
Control control = findBackgroundControl ();
if (control != null) {
- int /*long*/ gdkGC = gc.handle;
- GdkGCValues values = new GdkGCValues ();
- OS.gdk_gc_get_values (gdkGC, values);
- if (control.backgroundImage != null) {
- Point pt = display.map (this, control, 0, 0);
- OS.gdk_gc_set_fill (gdkGC, OS.GDK_TILED);
- OS.gdk_gc_set_ts_origin (gdkGC, -pt.x, -pt.y);
- OS.gdk_gc_set_tile (gdkGC, control.backgroundImage.pixmap);
- gc.fillRectangle (x, y, width, height);
- OS.gdk_gc_set_fill (gdkGC, values.fill);
- OS.gdk_gc_set_ts_origin (gdkGC, values.ts_x_origin, values.ts_y_origin);
+ GCData data = gc.getGCData ();
+ int /*long*/ cairo = data.cairo;
+ if (cairo != 0) {
+ Cairo.cairo_save (cairo);
+ if (control.backgroundImage != null) {
+ Point pt = display.map (this, control, 0, 0);
+ Cairo.cairo_translate (cairo, -pt.x, -pt.y);
+ x += pt.x;
+ y += pt.y;
+ int /*long*/ xDisplay = OS.GDK_DISPLAY ();
+ int /*long*/ xVisual = OS.gdk_x11_visual_get_xvisual (OS.gdk_visual_get_system());
+ int /*long*/ drawable = control.backgroundImage.pixmap;
+ int /*long*/ xDrawable = OS.GDK_PIXMAP_XID (drawable);
+ int [] w = new int [1], h = new int [1];
+ OS.gdk_drawable_get_size (drawable, w, h);
+ int /*long*/ surface = Cairo.cairo_xlib_surface_create (xDisplay, xDrawable, xVisual, w [0], h [0]);
+ if (surface == 0) error (SWT.ERROR_NO_HANDLES);
+ int /*long*/ pattern = Cairo.cairo_pattern_create_for_surface (surface);
+ if (pattern == 0) error (SWT.ERROR_NO_HANDLES);
+ Cairo.cairo_pattern_set_extend (pattern, Cairo.CAIRO_EXTEND_REPEAT);
+ Cairo.cairo_set_source (cairo, pattern);
+ Cairo.cairo_surface_destroy (surface);
+ Cairo.cairo_pattern_destroy (pattern);
+ } else {
+ GdkColor color = control.getBackgroundColor ();
+ Cairo.cairo_set_source_rgba (cairo, (color.red & 0xFFFF) / (float)0xFFFF, (color.green & 0xFFFF) / (float)0xFFFF, (color.blue & 0xFFFF) / (float)0xFFFF, data.alpha / (float)0xFF);
+ }
+ Cairo.cairo_rectangle (cairo, x, y, width, height);
+ Cairo.cairo_fill (cairo);
+ Cairo.cairo_restore (cairo);
} else {
- gc.setBackground (control.getBackground ());
- gc.fillRectangle (x, y, width, height);
- GdkColor color = new GdkColor ();
- color.pixel = values.background_pixel;
- OS.gdk_gc_set_background (gdkGC, color);
+ int /*long*/ gdkGC = gc.handle;
+ GdkGCValues values = new GdkGCValues ();
+ OS.gdk_gc_get_values (gdkGC, values);
+ if (control.backgroundImage != null) {
+ Point pt = display.map (this, control, 0, 0);
+ OS.gdk_gc_set_fill (gdkGC, OS.GDK_TILED);
+ OS.gdk_gc_set_ts_origin (gdkGC, -pt.x, -pt.y);
+ OS.gdk_gc_set_tile (gdkGC, control.backgroundImage.pixmap);
+ OS.gdk_draw_rectangle (data.drawable, gdkGC, 1, x, y, width, height);
+ OS.gdk_gc_set_fill (gdkGC, values.fill);
+ OS.gdk_gc_set_ts_origin (gdkGC, values.ts_x_origin, values.ts_y_origin);
+ } else {
+ GdkColor color = control.getBackgroundColor ();
+ OS.gdk_gc_set_foreground (gdkGC, color);
+ OS.gdk_draw_rectangle (data.drawable, gdkGC, 1, x, y, width, height);
+ color.pixel = values.foreground_pixel;
+ OS.gdk_gc_set_foreground (gdkGC, color);
+ }
}
} else {
gc.fillRectangle (x, y, width, height);