Skip to content

Commit c57c55d

Browse files
committed
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 c57c55d

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)