Skip to content

Commit f039195

Browse files
akoch-yattafedejeanne
authored andcommitted
Extend ImageGcDrawer to support transparency
This commit extends the usage of ImageGcDraware to support SWT.Transparency as style that will initialize each GC with a proper transparent bitmap.
1 parent 65ffcb0 commit f039195

File tree

5 files changed

+121
-35
lines changed

5 files changed

+121
-35
lines changed

bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,8 +903,16 @@ public Image(Device device, ImageGcDrawer imageGcDrawer, int width, int height)
903903
}
904904

905905
private ImageData drawWithImageGcDrawer(ImageGcDrawer imageGcDrawer, int width, int height, int zoom) {
906-
Image image = new Image(device, width, height);
907-
GC gc = new GC(image);
906+
int gcStyle = imageGcDrawer.getGcStyle();
907+
Image image;
908+
if ((gcStyle & SWT.TRANSPARENT) != 0) {
909+
final ImageData resultData = new ImageData (width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
910+
resultData.alphaData = new byte [width * height];
911+
image = new Image(device, resultData);
912+
} else {
913+
image = new Image(device, width, height);
914+
}
915+
GC gc = new GC(image, gcStyle);
908916
try {
909917
imageGcDrawer.drawOn(gc, width, height);
910918
ImageData imageData = image.getImageData(zoom);

bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,14 @@ public Image(Device device, Rectangle bounds) {
437437
* @see #dispose()
438438
*/
439439
public Image(Device device, ImageData data) {
440+
this(device, DPIUtil.autoScaleUp(device, data), DPIUtil.getDeviceZoom());
441+
}
442+
443+
private Image(Device device, ImageData data, int zoom) {
440444
super(device);
441445
if (data == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
442-
currentDeviceZoom = DPIUtil.getDeviceZoom();
443-
data = DPIUtil.autoScaleUp (device, data);
444-
init(data);
446+
currentDeviceZoom = zoom;
447+
init(data, zoom);
445448
init();
446449
}
447450

@@ -695,9 +698,9 @@ public Image(Device device, ImageGcDrawer imageGcDrawer, int width, int height)
695698
SWT.error(SWT.ERROR_NULL_ARGUMENT);
696699
}
697700
this.imageGcDrawer = imageGcDrawer;
698-
currentDeviceZoom = DPIUtil.getDeviceZoom();
701+
currentDeviceZoom = 100;
699702
ImageData imageData = drawWithImageGcDrawer(width, height, currentDeviceZoom);
700-
init (imageData);
703+
init (imageData, currentDeviceZoom);
701704
init ();
702705
}
703706

@@ -1162,8 +1165,16 @@ public ImageData getImageData (int zoom) {
11621165
}
11631166

11641167
private ImageData drawWithImageGcDrawer(int width, int height, int zoom) {
1165-
Image image = new Image(device, width, height);
1166-
GC gc = new GC(image);
1168+
int gcStyle = imageGcDrawer.getGcStyle();
1169+
Image image;
1170+
if ((gcStyle & SWT.TRANSPARENT) != 0) {
1171+
final ImageData resultData = new ImageData(width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
1172+
resultData.alphaData = new byte [width * height];
1173+
image = new Image(device, resultData, zoom);
1174+
} else {
1175+
image = new Image(device, width, height);
1176+
}
1177+
GC gc = new GC(image, gcStyle);
11671178
try {
11681179
imageGcDrawer.drawOn(gc, width, height);
11691180
ImageData imageData = image.getImageData(zoom);
@@ -1274,6 +1285,10 @@ void init(int width, int height) {
12741285
}
12751286

12761287
void init(ImageData image) {
1288+
init(image, DPIUtil.getDeviceZoom());
1289+
}
1290+
1291+
void init(ImageData image, int zoom) {
12771292
if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
12781293

12791294
PaletteData palette = image.palette;
@@ -1286,7 +1301,7 @@ void init(ImageData image) {
12861301
int imageDataHeight = image.height;
12871302

12881303
// Scale dimensions of Image object to 100% scale factor
1289-
double scaleFactor = DPIUtil.getDeviceZoom() / 100f;
1304+
double scaleFactor = zoom / 100f;
12901305
this.width = (int) Math.round(imageDataWidth / scaleFactor);
12911306
this.height = (int) Math.round(imageDataHeight / scaleFactor);
12921307

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,15 @@ public Image(Device device, ImageData data) {
380380
this.device.registerResourceWithZoomSupport(this);
381381
}
382382

383+
private Image(Device device, ImageData data, int zoom) {
384+
super(device);
385+
if (data == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
386+
initialNativeZoom = zoom;
387+
this.imageProvider = new PlainImageDataProviderWrapper(data, zoom);
388+
init();
389+
this.device.registerResourceWithZoomSupport(this);
390+
}
391+
383392
/**
384393
* Constructs an instance of this class, whose type is
385394
* <code>SWT.ICON</code>, from the two given <code>ImageData</code>
@@ -1956,27 +1965,34 @@ private ImageHandle initializeHandleFromSource(int zoom) {
19561965
}
19571966

19581967
private class PlainImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
1959-
private ImageData imageDataAt100;
1968+
private ImageData imageDataAtBaseZoom;
1969+
private int baseZoom;
19601970

19611971
PlainImageDataProviderWrapper(ImageData imageData) {
1962-
this.imageDataAt100 = (ImageData) imageData.clone();
1972+
this(imageData, 100);
1973+
}
1974+
1975+
PlainImageDataProviderWrapper(ImageData imageData, int zoom) {
1976+
this.imageDataAtBaseZoom = (ImageData) imageData.clone();
1977+
this.baseZoom = zoom;
19631978
initImage();
19641979
}
19651980

19661981
@Override
19671982
protected Rectangle getBounds(int zoom) {
1968-
Rectangle rectangle = new Rectangle(0, 0, imageDataAt100.width, imageDataAt100.height);
1983+
Rectangle rectangle = new Rectangle(0, 0, imageDataAtBaseZoom.width, imageDataAtBaseZoom.height);
1984+
rectangle = DPIUtil.scaleDown(rectangle, baseZoom);
19691985
return DPIUtil.scaleUp(rectangle, zoom);
19701986
}
19711987

19721988
@Override
19731989
protected ElementAtZoom<ImageData> loadImageData(int zoom) {
1974-
return new ElementAtZoom<>(imageDataAt100, 100);
1990+
return new ElementAtZoom<>(imageDataAtBaseZoom, baseZoom);
19751991
}
19761992

19771993
@Override
19781994
AbstractImageProviderWrapper createCopy(Image image) {
1979-
return image.new PlainImageDataProviderWrapper(this.imageDataAt100);
1995+
return image.new PlainImageDataProviderWrapper(this.imageDataAtBaseZoom);
19801996
}
19811997
}
19821998

@@ -2478,8 +2494,18 @@ ImageData newImageData(int zoom) {
24782494
@Override
24792495
protected ImageHandle newImageHandle(int zoom) {
24802496
initialNativeZoom = zoom;
2481-
Image image = new Image(device, width, height, zoom);
2482-
GC gc = new GC(image, drawer.getGcStyle());
2497+
int gcStyle = drawer.getGcStyle();
2498+
Image image;
2499+
if ((gcStyle & SWT.TRANSPARENT) != 0) {
2500+
int scaledHeight = DPIUtil.scaleUp(height, zoom);
2501+
int scaledWidth = DPIUtil.scaleUp(width, zoom);
2502+
final ImageData resultData = new ImageData (scaledWidth, scaledHeight, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
2503+
resultData.alphaData = new byte [scaledWidth * scaledHeight];
2504+
image = new Image(device, resultData, zoom);
2505+
} else {
2506+
image = new Image(device, width, height, zoom);
2507+
}
2508+
GC gc = new GC(image, gcStyle);
24832509
try {
24842510
gc.data.nativeZoom = zoom;
24852511
drawer.drawOn(gc, width, height);

examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet367.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class Snippet367 {
3636
private static final String IMAGE_PATH_200 = IMAGES_ROOT + IMAGE_200;
3737

3838
public static void main (String [] args) {
39+
final Display display = new Display ();
40+
3941
final ImageFileNameProvider filenameProvider = zoom -> {
4042
switch (zoom) {
4143
case 100:
@@ -65,7 +67,17 @@ public static void main (String [] args) {
6567
gc.drawLine(3, 3, width - 3, height - 3);
6668
};
6769

68-
final Display display = new Display ();
70+
Image imageWithDataProvider = new Image (display, imageDataProvider);
71+
final ImageGcDrawer transparentImageGcDrawer = new ImageGcDrawer() {
72+
@Override
73+
public void drawOn(GC gc, int width, int height) {
74+
gc.drawImage(imageWithDataProvider, 0, 0);
75+
}
76+
@Override
77+
public int getGcStyle() {
78+
return SWT.TRANSPARENT;
79+
}
80+
};
6981
final Shell shell = new Shell (display);
7082
shell.setText("Snippet367");
7183
shell.setLayout (new GridLayout (3, false));
@@ -99,13 +111,17 @@ public static void main (String [] args) {
99111
new Button(shell, SWT.NONE).setImage (new Image (display, filenameProvider));
100112

101113
new Label (shell, SWT.NONE).setText ("ImageDataProvider:");
102-
new Label (shell, SWT.NONE).setImage (new Image (display, imageDataProvider));
103-
new Button(shell, SWT.NONE).setImage (new Image (display, imageDataProvider));
114+
new Label (shell, SWT.NONE).setImage (imageWithDataProvider);
115+
new Button(shell, SWT.NONE).setImage (imageWithDataProvider);
104116

105117
new Label (shell, SWT.NONE).setText ("ImageGcDrawer:");
106118
new Label (shell, SWT.NONE).setImage (new Image (display, imageGcDrawer, 20, 20));
107119
new Button(shell, SWT.NONE).setImage (new Image (display, imageGcDrawer, 20, 20));
108120

121+
new Label (shell, SWT.NONE).setText ("Transparent ImageGcDrawer:");
122+
new Label (shell, SWT.NONE).setImage (new Image (display, transparentImageGcDrawer, 20, 20));
123+
new Button(shell, SWT.NONE).setImage (new Image (display, transparentImageGcDrawer, 20, 20));
124+
109125
createSeparator(shell);
110126

111127
new Label (shell, SWT.NONE).setText ("1. Canvas\n(PaintListener)");

examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,44 @@ public static void main (String [] args) {
6464

6565
final Display display = new Display ();
6666

67+
final Image imageWithFileNameProvider = new Image (display, filenameProvider);
68+
final Image disabledImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_DISABLE);
69+
final Image greyImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_GRAY);
70+
71+
final Image imageWithDataProvider = new Image (display, imageDataProvider);
72+
final Image disabledImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_DISABLE);
73+
final Image greyImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_GRAY);
74+
75+
final Image imageWithData = new Image (display, IMAGE_PATH_100);
76+
final Image disabledImageWithData = new Image (display,imageWithData, SWT.IMAGE_DISABLE);
77+
final Image greyImageWithData = new Image (display,imageWithData, SWT.IMAGE_GRAY);
78+
6779
final ImageGcDrawer imageGcDrawer = (gc, width, height) -> {
6880
gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
6981
gc.fillRectangle(0, 0, width, height);
7082
gc.setForeground(display.getSystemColor(SWT.COLOR_YELLOW));
7183
gc.drawRectangle(4, 4, width - 8, height - 8);
7284
};
7385

86+
final Image imageWithGcDrawer = new Image (display, imageGcDrawer, 16, 16);
87+
final Image disabledImageWithGcDrawer = new Image (display, imageWithGcDrawer, SWT.IMAGE_DISABLE);
88+
final Image greyImageWithGcDrawer = new Image (display, imageWithGcDrawer, SWT.IMAGE_GRAY);
89+
90+
final ImageGcDrawer transparentImageGcDrawer = new ImageGcDrawer() {
91+
@Override
92+
public void drawOn(GC gc, int width, int height) {
93+
gc.drawImage(imageWithDataProvider, 0, 0);
94+
}
95+
@Override
96+
public int getGcStyle() {
97+
return SWT.TRANSPARENT;
98+
}
99+
};
100+
101+
final Image imageWithTransparentGcDrawer = new Image (display, transparentImageGcDrawer, 16, 16);
102+
final Image disabledImageWithTransparentGcDrawer = new Image (display, imageWithTransparentGcDrawer, SWT.IMAGE_DISABLE);
103+
final Image greyImageWithTransparentGcDrawer = new Image (display, imageWithTransparentGcDrawer, SWT.IMAGE_GRAY);
104+
74105
final Shell shell = new Shell (display);
75106
shell.setText("Snippet382");
76107
shell.setLayout (new GridLayout (3, false));
@@ -80,21 +111,7 @@ public void handleEvent(Event e) {
80111
if (e.type == SWT.Paint) {
81112
GC mainGC = e.gc;
82113
GCData gcData = mainGC.getGCData();
83-
final Image imageWithFileNameProvider = new Image (display, filenameProvider);
84-
final Image disabledImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_DISABLE);
85-
final Image greyImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_GRAY);
86114

87-
final Image imageWithDataProvider = new Image (display, imageDataProvider);
88-
final Image disabledImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_DISABLE);
89-
final Image greyImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_GRAY);
90-
91-
final Image imageWithData = new Image (display, IMAGE_PATH_100);
92-
final Image disabledImageWithData = new Image (display,imageWithData, SWT.IMAGE_DISABLE);
93-
final Image greyImageWithData = new Image (display,imageWithData, SWT.IMAGE_GRAY);
94-
95-
final Image imageWithGcDrawer = new Image (display, imageGcDrawer, 16, 16);
96-
final Image disabledImageWithGcDrawer = new Image (display, imageWithGcDrawer, SWT.IMAGE_DISABLE);
97-
final Image greyImageWithGcDrawer = new Image (display, imageWithGcDrawer, SWT.IMAGE_GRAY);
98115

99116
try {
100117
drawImages(mainGC, gcData, "Normal",40, imageWithFileNameProvider);
@@ -112,6 +129,10 @@ public void handleEvent(Event e) {
112129
drawImages(mainGC, gcData, "Normal", 400, imageWithGcDrawer);
113130
drawImages(mainGC, gcData, "Disabled", 440, disabledImageWithGcDrawer);
114131
drawImages(mainGC, gcData, "Greyed", 480, greyImageWithGcDrawer);
132+
133+
drawImages(mainGC, gcData, "Normal", 520, imageWithTransparentGcDrawer);
134+
drawImages(mainGC, gcData, "Disabled", 560, disabledImageWithTransparentGcDrawer);
135+
drawImages(mainGC, gcData, "Greyed", 600, greyImageWithTransparentGcDrawer);
115136
} finally {
116137
mainGC.dispose ();
117138
}
@@ -130,7 +151,7 @@ private void drawImages(GC mainGC, GCData gcData, String text, int y, final Imag
130151
};
131152
shell.addListener(SWT.Paint, l);
132153

133-
shell.setSize(400, 550);
154+
shell.setSize(400, 750);
134155
shell.open ();
135156
while (!shell.isDisposed ()) {
136157
if (!display.readAndDispatch ()) display.sleep ();

0 commit comments

Comments
 (0)