summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
diff options
context:
space:
mode:
authorSilenio Quarti <silenio_quarti@ca.ibm.com>2012-10-17 11:25:17 -0400
committerSilenio Quarti <silenio_quarti@ca.ibm.com>2012-10-17 11:25:17 -0400
commit57c0e797a17f6a1fdd2b2a079dc4b2435e2d55ee (patch)
tree3da233bab1535bb55e7ca8be87fcfbd277d7f28c /bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
parentb178ded274cefa13fff8fc6fb8115ee14a844dc8 (diff)
downloadeclipse.platform.swt-57c0e797a17f6a1fdd2b2a079dc4b2435e2d55ee.tar.gz
eclipse.platform.swt-57c0e797a17f6a1fdd2b2a079dc4b2435e2d55ee.tar.xz
eclipse.platform.swt-57c0e797a17f6a1fdd2b2a079dc4b2435e2d55ee.zip
fix leaks when creating polygon region with cairo and fix formating
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java81
1 files changed, 31 insertions, 50 deletions
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 c5ddd158d1..398aa44474 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
@@ -454,26 +454,27 @@ long /*int*/ convertRgn(long /*int*/ rgn, double[] matrix) {
Cairo.cairo_matrix_transform_point(matrix, x, y);
pointArray[6] = (int)x[0];
pointArray[7] = (int)Math.round(y[0]);
- if (OS.GTK_VERSION >= OS.VERSION(3, 0, 0)) {
- long /*ing*/ cairo = OS.gdk_cairo_create(newRgn);
- int count = pointArray.length / 2;
- if (count == 0) return 0;
- Cairo.cairo_move_to(cairo, pointArray[0], pointArray[1]);
- for (int n=1,j=2; n<count; n++,j+=2) {
- Cairo.cairo_move_to(cairo, pointArray[j]+0.5, pointArray[j+1]+0.5);
- }
- Cairo.cairo_close_path(cairo);
- Cairo.cairo_set_fill_rule(cairo, Cairo.CAIRO_FILL_RULE_EVEN_ODD);
- Cairo.cairo_fill(cairo);
- long /*ing*/ surface = Cairo.cairo_get_target(cairo);
- long /*int*/ polyRgn = OS.gdk_cairo_region_create_from_surface(surface);
- Cairo.cairo_region_union(newRgn, polyRgn);
- Cairo.cairo_destroy(cairo);
- } else {
+ if (OS.GTK_VERSION >= OS.VERSION(3, 0, 0)) {
+ int count = pointArray.length / 2;
+ if (count != 0) {
+ long /*ing*/ cairo = OS.gdk_cairo_create(newRgn);
+ Cairo.cairo_move_to(cairo, pointArray[0], pointArray[1]);
+ for (int n=1,j=2; n<count; n++,j+=2) {
+ Cairo.cairo_move_to(cairo, pointArray[j]+0.5, pointArray[j+1]+0.5);
+ }
+ Cairo.cairo_close_path(cairo);
+ Cairo.cairo_set_fill_rule(cairo, Cairo.CAIRO_FILL_RULE_EVEN_ODD);
+ Cairo.cairo_fill(cairo);
+ long /*ing*/ surface = Cairo.cairo_get_target(cairo);
+ long /*int*/ polyRgn = OS.gdk_cairo_region_create_from_surface(surface);
+ Cairo.cairo_region_union(newRgn, polyRgn);
+ Cairo.cairo_destroy(cairo);
+ }
+ } else {
long /*int*/ polyRgn = OS.gdk_region_polygon(pointArray, pointArray.length / 2, OS.GDK_EVEN_ODD_RULE);
OS.gdk_region_union(newRgn, polyRgn);
OS.gdk_region_destroy(polyRgn);
- }
+ }
}
if (rects[0] != 0) OS.g_free(rects[0]);
return newRgn;
@@ -1230,40 +1231,20 @@ void drawImageXRender(Image srcImage, int srcX, int srcY, int srcWidth, int srcH
if (clipping != 0) {
int[] nRects = new int[1];
long /*int*/[] rects = new long /*int*/[1];
- if (OS.GTK_VERSION >= OS.VERSION(3, 0, 0)) {
- int num = Cairo.cairo_region_num_rectangles (clipping);
- for (int n = 0; n < num; n++) {
- Cairo.cairo_region_get_rectangle (clipping, n, nRects[n]);
- }
- cairo_rectangle_int_t rect = new cairo_rectangle_int_t ();
- short[] xRects = new short[nRects[0] * 4];
- for (int i=0, j=0; i<nRects[0]; i++, j+=4) {
- Cairo.memmove(rect, rects[0] + (i * cairo_rectangle_int_t.sizeof), cairo_rectangle_int_t.sizeof);
- xRects[j] = (short)(translateX + rect.x);
- xRects[j+1] = (short)(translateY + rect.y);
- xRects[j+2] = (short)rect.width;
- xRects[j+3] = (short)rect.height;
- }
- OS.XRenderSetPictureClipRectangles(xDisplay, destPict, 0, 0, xRects, nRects[0]);
- if (clipping != data.clipRgn && clipping != data.damageRgn) {
- Cairo.cairo_region_destroy(clipping);
- }
- } else {
- OS.gdk_region_get_rectangles(clipping, rects, nRects);
- GdkRectangle rect = new GdkRectangle();
- short[] xRects = new short[nRects[0] * 4];
- for (int i=0, j=0; i<nRects[0]; i++, j+=4) {
- OS.memmove(rect, rects[0] + (i * GdkRectangle.sizeof), GdkRectangle.sizeof);
- xRects[j] = (short)(translateX + rect.x);
- xRects[j+1] = (short)(translateY + rect.y);
- xRects[j+2] = (short)rect.width;
- xRects[j+3] = (short)rect.height;
- }
- OS.XRenderSetPictureClipRectangles(xDisplay, destPict, 0, 0, xRects, nRects[0]);
- if (clipping != data.clipRgn && clipping != data.damageRgn) {
- OS.gdk_region_destroy(clipping);
- }
+ cairo_region_get_rectangles(clipping, rects, nRects);
+ GdkRectangle rect = new GdkRectangle();
+ short[] xRects = new short[nRects[0] * 4];
+ for (int i=0, j=0; i<nRects[0]; i++, j+=4) {
+ OS.memmove(rect, rects[0] + (i * GdkRectangle.sizeof), GdkRectangle.sizeof);
+ xRects[j] = (short)(translateX + rect.x);
+ xRects[j+1] = (short)(translateY + rect.y);
+ xRects[j+2] = (short)rect.width;
+ xRects[j+3] = (short)rect.height;
}
+ OS.XRenderSetPictureClipRectangles(xDisplay, destPict, 0, 0, xRects, nRects[0]);
+ if (clipping != data.clipRgn && clipping != data.damageRgn) {
+ cairo_region_destroy(clipping);
+ }
if (rects[0] != 0) OS.g_free(rects[0]);
}
OS.XRenderComposite(xDisplay, maskPict != 0 ? OS.PictOpOver : OS.PictOpSrc, srcPict, maskPict, destPict, srcX, srcY, srcX, srcY, destX + translateX, destY + translateY, destWidth, destHeight);