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 9107e15..a0aeb44 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 @@ -332,7 +332,7 @@ void checkGC (int mask) { if ((state & DRAW_OFFSET) != 0) { data.cairoXoffset = data.cairoYoffset = 0; double[] matrix = new double[6]; - Cairo.cairo_get_matrix(cairo, matrix); + cairo_get_matrix(cairo, matrix); double[] dx = new double[]{1}; double[] dy = new double[]{1}; Cairo.cairo_user_to_device_distance(cairo, dx, dy); @@ -659,6 +659,9 @@ void disposeLayout() { @Override void destroy() { + if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) { + Cairo.cairo_restore(data.cairo); + } if (data.disposeCairo) { long /*int*/ cairo = data.cairo; if (cairo != 0) Cairo.cairo_destroy(cairo); @@ -1447,7 +1450,7 @@ void drawPolyline(long /*int*/ cairo, int[] pointArray, boolean close) { for (int i = 1, j=2; i < count; i++, j += 2) { Cairo.cairo_line_to(cairo, pointArray[j] + xOffset, pointArray[j + 1] + yOffset); } - if (close) Cairo.cairo_close_path(cairo); + //if (close) Cairo.cairo_close_path(cairo); } /** @@ -2055,6 +2058,9 @@ public void fillPolygon(int[] pointArray) { checkGC(FILL); long /*int*/ cairo = data.cairo; if (cairo != 0) { + System.out.println(pointArray.length); + if (pointArray.length >= 80) + return; drawPolyline(cairo, pointArray, true); Cairo.cairo_fill(cairo); return; @@ -2419,7 +2425,7 @@ public Rectangle getClipping() { /* Convert to user space */ if (cairo != 0) { double[] matrix = new double[6]; - Cairo.cairo_get_matrix(cairo, matrix); + cairo_get_matrix(cairo, matrix); Cairo.cairo_matrix_invert(matrix); clipRgn = convertRgn(rgn, matrix); OS.gdk_region_destroy(rgn); @@ -2435,6 +2441,16 @@ public Rectangle getClipping() { return new Rectangle(x, y, width, height); } +void cairo_get_matrix(long /*int*/ cairo, double[] matrix) { + //TODO cairo_get_matrix behavior changed in GTK 3.10 + matrix[0] = 1; + matrix[1] = 0; + matrix[2] = 0; + matrix[3] = 1; + matrix[4] = 0; + matrix[5] = 0; +} + /** * Sets the region managed by the argument to the current * clipping region of the receiver. @@ -2480,7 +2496,7 @@ public void getClipping(Region region) { /* Convert to user space */ if (cairo != 0) { double[] matrix = new double[6]; - Cairo.cairo_get_matrix(cairo, matrix); + cairo_get_matrix(cairo, matrix); Cairo.cairo_matrix_invert(matrix); long /*int*/ rgn = convertRgn(clipping, matrix); OS.gdk_region_subtract(clipping, clipping); @@ -2852,7 +2868,7 @@ public void getTransform(Transform transform) { if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); long /*int*/ cairo = data.cairo; if (cairo != 0) { - Cairo.cairo_get_matrix(cairo, transform.handle); + cairo_get_matrix(cairo, transform.handle); double[] identity = identity(); Cairo.cairo_matrix_invert(identity); Cairo.cairo_matrix_multiply(transform.handle, transform.handle, identity); @@ -2935,6 +2951,9 @@ void init(Drawable drawable, GCData data, long /*int*/ gdkGC) { if (OS.USE_CAIRO) { long /*int*/ cairo = data.cairo = handle; Cairo.cairo_set_fill_rule(cairo, Cairo.CAIRO_FILL_RULE_EVEN_ODD); + if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) { + Cairo.cairo_save(cairo); + } data.state &= ~(BACKGROUND | FOREGROUND | FONT | LINE_WIDTH | LINE_CAP | LINE_JOIN | LINE_STYLE | DRAW_OFFSET); } else if (OS.INIT_CAIRO) { initCairo(); @@ -3285,14 +3304,20 @@ static void setCairoPatternColor(long /*int*/ pattern, int offset, Color c, int void setCairoClip(long /*int*/ damageRgn, long /*int*/ clipRgn) { long /*int*/ cairo = data.cairo; - if (OS.GTK_VERSION >= OS.VERSION(2,18,0) && data.drawable != 0 && !OS.GTK3) { - OS.gdk_cairo_reset_clip(cairo, data.drawable); + if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) { + Cairo.cairo_restore(cairo); + Cairo.cairo_save(cairo); + data.state &= ~(BACKGROUND | FOREGROUND | LINE_CAP | LINE_JOIN | LINE_WIDTH | LINE_STYLE | LINE_MITERLIMIT); } else { - Cairo.cairo_reset_clip(cairo); + if (OS.GTK_VERSION >= OS.VERSION(2,18,0) && data.drawable != 0 && !OS.GTK3) { + OS.gdk_cairo_reset_clip(cairo, data.drawable); + } else { + Cairo.cairo_reset_clip(cairo); + } } if (damageRgn != 0) { double[] matrix = new double[6]; - Cairo.cairo_get_matrix(cairo, matrix); + cairo_get_matrix(cairo, matrix); double[] identity = new double[6]; Cairo.cairo_matrix_init_identity(identity); Cairo.cairo_set_matrix(cairo, identity); @@ -3326,7 +3351,7 @@ void setClipping(long /*int*/ clipRgn) { OS.gdk_region_union(data.clipRgn, clipRgn); if (cairo != 0) { if (data.clippingTransform == null) data.clippingTransform = new double[6]; - Cairo.cairo_get_matrix(cairo, data.clippingTransform); + cairo_get_matrix(cairo, data.clippingTransform); setCairoClip(data.damageRgn, clipRgn); } else { long /*int*/ clipping = clipRgn; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index 8c0b868..61f3a05 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -2733,7 +2733,16 @@ void rendererRender (long /*int*/ cell, long /*int*/ cr, long /*int*/ window, lo } contentX [0] -= imageWidth; contentWidth [0] += imageWidth; - GC gc = new GC (this); + GC gc; + if (cr != 0) { + Cairo.cairo_save(cr); + Cairo.cairo_reset_clip(cr); + GCData data = new GCData(); + data.cairo = cr; + gc = GC.gtk_new (this, data); + } else { + gc = new GC (this); + } if ((drawState & SWT.SELECTED) != 0) { Color background, foreground; if (gtk_widget_has_focus (handle) || OS.GTK3) { @@ -2772,6 +2781,9 @@ void rendererRender (long /*int*/ cell, long /*int*/ cr, long /*int*/ window, lo event.detail = drawState; sendEvent (SWT.PaintItem, event); gc.dispose(); + if (cr != 0) { + Cairo.cairo_restore(cr); + } } } }