View | Details | Raw Unified | Return to bug 421127 | Differences between
and this patch

Collapse All | Expand All

(-)a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java (-10 / +35 lines)
Lines 332-338 void checkGC (int mask) { Link Here
332
		if ((state & DRAW_OFFSET) != 0) {
332
		if ((state & DRAW_OFFSET) != 0) {
333
			data.cairoXoffset = data.cairoYoffset = 0;
333
			data.cairoXoffset = data.cairoYoffset = 0;
334
			double[] matrix = new double[6];
334
			double[] matrix = new double[6];
335
			Cairo.cairo_get_matrix(cairo, matrix);
335
			cairo_get_matrix(cairo, matrix);
336
			double[] dx = new double[]{1};
336
			double[] dx = new double[]{1};
337
			double[] dy = new double[]{1};
337
			double[] dy = new double[]{1};
338
			Cairo.cairo_user_to_device_distance(cairo, dx, dy);
338
			Cairo.cairo_user_to_device_distance(cairo, dx, dy);
Lines 659-664 void disposeLayout() { Link Here
659
659
660
@Override
660
@Override
661
void destroy() {
661
void destroy() {
662
	if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) {
663
		Cairo.cairo_restore(data.cairo);
664
	}
662
	if (data.disposeCairo) {
665
	if (data.disposeCairo) {
663
		long /*int*/ cairo = data.cairo;
666
		long /*int*/ cairo = data.cairo;
664
		if (cairo != 0) Cairo.cairo_destroy(cairo);
667
		if (cairo != 0) Cairo.cairo_destroy(cairo);
Lines 1447-1453 void drawPolyline(long /*int*/ cairo, int[] pointArray, boolean close) { Link Here
1447
	for (int i = 1, j=2; i < count; i++, j += 2) {
1450
	for (int i = 1, j=2; i < count; i++, j += 2) {
1448
		Cairo.cairo_line_to(cairo, pointArray[j] + xOffset, pointArray[j + 1] + yOffset);
1451
		Cairo.cairo_line_to(cairo, pointArray[j] + xOffset, pointArray[j + 1] + yOffset);
1449
	}
1452
	}
1450
	if (close) Cairo.cairo_close_path(cairo);
1453
	//if (close) Cairo.cairo_close_path(cairo);
1451
}
1454
}
1452
1455
1453
/** 
1456
/** 
Lines 2055-2060 public void fillPolygon(int[] pointArray) { Link Here
2055
	checkGC(FILL);
2058
	checkGC(FILL);
2056
	long /*int*/ cairo = data.cairo;
2059
	long /*int*/ cairo = data.cairo;
2057
	if (cairo != 0) {
2060
	if (cairo != 0) {
2061
		System.out.println(pointArray.length);
2062
		if (pointArray.length >= 80) 
2063
			return;
2058
		drawPolyline(cairo, pointArray, true);
2064
		drawPolyline(cairo, pointArray, true);
2059
		Cairo.cairo_fill(cairo);
2065
		Cairo.cairo_fill(cairo);
2060
		return;
2066
		return;
Lines 2419-2425 public Rectangle getClipping() { Link Here
2419
		/* Convert to user space */
2425
		/* Convert to user space */
2420
		if (cairo != 0) {
2426
		if (cairo != 0) {
2421
			double[] matrix = new double[6];
2427
			double[] matrix = new double[6];
2422
			Cairo.cairo_get_matrix(cairo, matrix);
2428
			cairo_get_matrix(cairo, matrix);
2423
			Cairo.cairo_matrix_invert(matrix);
2429
			Cairo.cairo_matrix_invert(matrix);
2424
			clipRgn = convertRgn(rgn, matrix);
2430
			clipRgn = convertRgn(rgn, matrix);
2425
			OS.gdk_region_destroy(rgn);
2431
			OS.gdk_region_destroy(rgn);
Lines 2435-2440 public Rectangle getClipping() { Link Here
2435
	return new Rectangle(x, y, width, height);
2441
	return new Rectangle(x, y, width, height);
2436
}
2442
}
2437
2443
2444
void cairo_get_matrix(long /*int*/ cairo, double[] matrix) {
2445
	//TODO cairo_get_matrix behavior changed in GTK 3.10
2446
	matrix[0] = 1;
2447
	matrix[1] = 0;
2448
	matrix[2] = 0;
2449
	matrix[3] = 1;
2450
	matrix[4] = 0;
2451
	matrix[5] = 0;
2452
}
2453
2438
/** 
2454
/** 
2439
 * Sets the region managed by the argument to the current
2455
 * Sets the region managed by the argument to the current
2440
 * clipping region of the receiver.
2456
 * clipping region of the receiver.
Lines 2480-2486 public void getClipping(Region region) { Link Here
2480
	/* Convert to user space */
2496
	/* Convert to user space */
2481
	if (cairo != 0) {
2497
	if (cairo != 0) {
2482
		double[] matrix = new double[6];
2498
		double[] matrix = new double[6];
2483
		Cairo.cairo_get_matrix(cairo, matrix);
2499
		cairo_get_matrix(cairo, matrix);
2484
		Cairo.cairo_matrix_invert(matrix);
2500
		Cairo.cairo_matrix_invert(matrix);
2485
		long /*int*/ rgn = convertRgn(clipping, matrix);
2501
		long /*int*/ rgn = convertRgn(clipping, matrix);
2486
		OS.gdk_region_subtract(clipping, clipping);
2502
		OS.gdk_region_subtract(clipping, clipping);
Lines 2852-2858 public void getTransform(Transform transform) { Link Here
2852
	if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
2868
	if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
2853
	long /*int*/ cairo = data.cairo;
2869
	long /*int*/ cairo = data.cairo;
2854
	if (cairo != 0) {
2870
	if (cairo != 0) {
2855
		Cairo.cairo_get_matrix(cairo, transform.handle);
2871
		cairo_get_matrix(cairo, transform.handle);
2856
		double[] identity = identity();
2872
		double[] identity = identity();
2857
		Cairo.cairo_matrix_invert(identity);
2873
		Cairo.cairo_matrix_invert(identity);
2858
		Cairo.cairo_matrix_multiply(transform.handle, transform.handle, identity);
2874
		Cairo.cairo_matrix_multiply(transform.handle, transform.handle, identity);
Lines 2935-2940 void init(Drawable drawable, GCData data, long /*int*/ gdkGC) { Link Here
2935
	if (OS.USE_CAIRO) {
2951
	if (OS.USE_CAIRO) {
2936
		long /*int*/ cairo = data.cairo = handle;
2952
		long /*int*/ cairo = data.cairo = handle;
2937
		Cairo.cairo_set_fill_rule(cairo, Cairo.CAIRO_FILL_RULE_EVEN_ODD);
2953
		Cairo.cairo_set_fill_rule(cairo, Cairo.CAIRO_FILL_RULE_EVEN_ODD);
2954
		if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) {
2955
			Cairo.cairo_save(cairo);
2956
		}
2938
		data.state &= ~(BACKGROUND | FOREGROUND | FONT | LINE_WIDTH | LINE_CAP | LINE_JOIN | LINE_STYLE | DRAW_OFFSET);
2957
		data.state &= ~(BACKGROUND | FOREGROUND | FONT | LINE_WIDTH | LINE_CAP | LINE_JOIN | LINE_STYLE | DRAW_OFFSET);
2939
	} else if (OS.INIT_CAIRO) {
2958
	} else if (OS.INIT_CAIRO) {
2940
		 initCairo();
2959
		 initCairo();
Lines 3285-3298 static void setCairoPatternColor(long /*int*/ pattern, int offset, Color c, int Link Here
3285
3304
3286
void setCairoClip(long /*int*/ damageRgn, long /*int*/ clipRgn) {
3305
void setCairoClip(long /*int*/ damageRgn, long /*int*/ clipRgn) {
3287
	long /*int*/ cairo = data.cairo;
3306
	long /*int*/ cairo = data.cairo;
3288
	if (OS.GTK_VERSION >= OS.VERSION(2,18,0) && data.drawable != 0 && !OS.GTK3) {
3307
	if (OS.GTK_VERSION >= OS.VERSION(3, 9, 0)) {
3289
		OS.gdk_cairo_reset_clip(cairo, data.drawable);
3308
		Cairo.cairo_restore(cairo);
3309
		Cairo.cairo_save(cairo);
3310
		data.state &= ~(BACKGROUND | FOREGROUND | LINE_CAP | LINE_JOIN | LINE_WIDTH | LINE_STYLE | LINE_MITERLIMIT);
3290
	} else {
3311
	} else {
3291
		Cairo.cairo_reset_clip(cairo);
3312
		if (OS.GTK_VERSION >= OS.VERSION(2,18,0) && data.drawable != 0 && !OS.GTK3) {
3313
			OS.gdk_cairo_reset_clip(cairo, data.drawable);
3314
		} else {
3315
			Cairo.cairo_reset_clip(cairo);
3316
		}
3292
	}
3317
	}
3293
	if (damageRgn != 0) {
3318
	if (damageRgn != 0) {
3294
		double[] matrix = new double[6];
3319
		double[] matrix = new double[6];
3295
		Cairo.cairo_get_matrix(cairo, matrix);
3320
		cairo_get_matrix(cairo, matrix);
3296
		double[] identity = new double[6];
3321
		double[] identity = new double[6];
3297
		Cairo.cairo_matrix_init_identity(identity);
3322
		Cairo.cairo_matrix_init_identity(identity);
3298
		Cairo.cairo_set_matrix(cairo, identity);
3323
		Cairo.cairo_set_matrix(cairo, identity);
Lines 3326-3332 void setClipping(long /*int*/ clipRgn) { Link Here
3326
		OS.gdk_region_union(data.clipRgn, clipRgn);
3351
		OS.gdk_region_union(data.clipRgn, clipRgn);
3327
		if (cairo != 0) {
3352
		if (cairo != 0) {
3328
			if (data.clippingTransform == null) data.clippingTransform = new double[6];
3353
			if (data.clippingTransform == null) data.clippingTransform = new double[6];
3329
			Cairo.cairo_get_matrix(cairo, data.clippingTransform);
3354
			cairo_get_matrix(cairo, data.clippingTransform);
3330
			setCairoClip(data.damageRgn, clipRgn);
3355
			setCairoClip(data.damageRgn, clipRgn);
3331
		} else {
3356
		} else {
3332
			long /*int*/ clipping = clipRgn;
3357
			long /*int*/ clipping = clipRgn;
(-)a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java (-1 / +13 lines)
Lines 2733-2739 void rendererRender (long /*int*/ cell, long /*int*/ cr, long /*int*/ window, lo Link Here
2733
				}
2733
				}
2734
				contentX [0] -= imageWidth;
2734
				contentX [0] -= imageWidth;
2735
				contentWidth [0] += imageWidth;
2735
				contentWidth [0] += imageWidth;
2736
				GC gc = new GC (this);
2736
				GC gc;
2737
				if (cr != 0) {
2738
					Cairo.cairo_save(cr);
2739
					Cairo.cairo_reset_clip(cr);
2740
					GCData data = new GCData();
2741
					data.cairo = cr;
2742
					gc = GC.gtk_new (this, data);
2743
				} else {
2744
					gc = new GC (this);
2745
				}
2737
				if ((drawState & SWT.SELECTED) != 0) {
2746
				if ((drawState & SWT.SELECTED) != 0) {
2738
					Color background, foreground;
2747
					Color background, foreground;
2739
					if (gtk_widget_has_focus (handle) || OS.GTK3) {
2748
					if (gtk_widget_has_focus (handle) || OS.GTK3) {
Lines 2772-2777 void rendererRender (long /*int*/ cell, long /*int*/ cr, long /*int*/ window, lo Link Here
2772
				event.detail = drawState;
2781
				event.detail = drawState;
2773
				sendEvent (SWT.PaintItem, event);	
2782
				sendEvent (SWT.PaintItem, event);	
2774
				gc.dispose();
2783
				gc.dispose();
2784
				if (cr != 0) {
2785
					Cairo.cairo_restore(cr);
2786
				}
2775
			}
2787
			}
2776
		}
2788
		}
2777
	}
2789
	}

Return to bug 421127