Skip to content

Commit bdeea3f

Browse files
committed
Introduce ImageData customization for static images in FileFormat
1 parent 66b9d6d commit bdeea3f

File tree

2 files changed

+142
-3
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT

2 files changed

+142
-3
lines changed

bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/image/FileFormat.java

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
import java.io.*;
1818
import java.util.*;
19+
import java.util.List;
1920
import java.util.function.*;
2021

2122
import org.eclipse.swt.*;
2223
import org.eclipse.swt.graphics.*;
2324
import org.eclipse.swt.internal.DPIUtil.*;
25+
import org.eclipse.swt.widgets.*;
2426

2527
/**
2628
* Abstract factory class for loading/unloading images from files or streams
@@ -88,7 +90,144 @@ List<ElementAtZoom<ImageData>> loadFromByteStream(int fileZoom, int targetZoom)
8890

8991
@Override
9092
List<ElementAtZoom<ImageData>> loadFromByteStream(int fileZoom, int targetZoom, int flag) {
91-
return Arrays.stream(loadFromByteStream()).map(d -> new ElementAtZoom<>(d, fileZoom)).toList();
93+
switch (flag) {
94+
case SWT.IMAGE_COPY: {
95+
return Arrays.stream(loadFromByteStream()).map(d -> new ElementAtZoom<>(d, fileZoom)).toList();
96+
}
97+
case SWT.IMAGE_DISABLE: {
98+
ImageData originalData = loadFromByteStream()[0];
99+
ImageData data = applyDisableImageData(originalData, originalData.width, originalData.height);
100+
return List.of(new ElementAtZoom<>(data, fileZoom));
101+
}
102+
case SWT.IMAGE_GRAY: {
103+
ImageData originalData = loadFromByteStream()[0];
104+
ImageData data = applyGrayImageData(originalData, originalData.width, originalData.height);
105+
return List.of(new ElementAtZoom<>(data, fileZoom));
106+
} default:
107+
throw new IllegalArgumentException("Unexpected value: " + flag);
108+
}
109+
110+
}
111+
112+
private ImageData applyDisableImageData(ImageData data, int height, int width) {
113+
PaletteData palette = data.palette;
114+
RGB[] rgbs = new RGB[3];
115+
rgbs[0] = Display.getDefault().getSystemColor(SWT.COLOR_BLACK).getRGB();
116+
rgbs[1] = Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW).getRGB();
117+
rgbs[2] = Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND).getRGB();
118+
ImageData newData = new ImageData(width, height, 8, new PaletteData(rgbs));
119+
newData.alpha = data.alpha;
120+
newData.alphaData = data.alphaData;
121+
newData.maskData = data.maskData;
122+
newData.maskPad = data.maskPad;
123+
if (data.transparentPixel != -1) newData.transparentPixel = 0;
124+
125+
/* Convert the pixels. */
126+
int[] scanline = new int[width];
127+
int[] maskScanline = null;
128+
ImageData mask = null;
129+
if (data.maskData != null) mask = data.getTransparencyMask();
130+
if (mask != null) maskScanline = new int[width];
131+
int redMask = palette.redMask;
132+
int greenMask = palette.greenMask;
133+
int blueMask = palette.blueMask;
134+
int redShift = palette.redShift;
135+
int greenShift = palette.greenShift;
136+
int blueShift = palette.blueShift;
137+
for (int y=0; y<height; y++) {
138+
int offset = y * newData.bytesPerLine;
139+
data.getPixels(0, y, width, scanline, 0);
140+
if (mask != null) mask.getPixels(0, y, width, maskScanline, 0);
141+
for (int x=0; x<width; x++) {
142+
int pixel = scanline[x];
143+
if (!((data.transparentPixel != -1 && pixel == data.transparentPixel) || (mask != null && maskScanline[x] == 0))) {
144+
int red, green, blue;
145+
if (palette.isDirect) {
146+
red = pixel & redMask;
147+
red = (redShift < 0) ? red >>> -redShift : red << redShift;
148+
green = pixel & greenMask;
149+
green = (greenShift < 0) ? green >>> -greenShift : green << greenShift;
150+
blue = pixel & blueMask;
151+
blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift;
152+
} else {
153+
red = palette.colors[pixel].red;
154+
green = palette.colors[pixel].green;
155+
blue = palette.colors[pixel].blue;
156+
}
157+
int intensity = red * red + green * green + blue * blue;
158+
if (intensity < 98304) {
159+
newData.data[offset] = (byte)1;
160+
} else {
161+
newData.data[offset] = (byte)2;
162+
}
163+
}
164+
offset++;
165+
}
166+
}
167+
return newData;
168+
}
169+
170+
private ImageData applyGrayImageData(ImageData data, int pHeight, int pWidth) {
171+
PaletteData palette = data.palette;
172+
ImageData newData = data;
173+
if (!palette.isDirect) {
174+
/* Convert the palette entries to gray. */
175+
RGB [] rgbs = palette.getRGBs();
176+
for (int i=0; i<rgbs.length; i++) {
177+
if (data.transparentPixel != i) {
178+
RGB color = rgbs [i];
179+
int red = color.red;
180+
int green = color.green;
181+
int blue = color.blue;
182+
int intensity = (red+red+green+green+green+green+green+blue) >> 3;
183+
color.red = color.green = color.blue = intensity;
184+
}
185+
}
186+
newData.palette = new PaletteData(rgbs);
187+
} else {
188+
/* Create a 8 bit depth image data with a gray palette. */
189+
RGB[] rgbs = new RGB[256];
190+
for (int i=0; i<rgbs.length; i++) {
191+
rgbs[i] = new RGB(i, i, i);
192+
}
193+
newData = new ImageData(pWidth, pHeight, 8, new PaletteData(rgbs));
194+
newData.alpha = data.alpha;
195+
newData.alphaData = data.alphaData;
196+
newData.maskData = data.maskData;
197+
newData.maskPad = data.maskPad;
198+
if (data.transparentPixel != -1) newData.transparentPixel = 254;
199+
200+
/* Convert the pixels. */
201+
int[] scanline = new int[pWidth];
202+
int redMask = palette.redMask;
203+
int greenMask = palette.greenMask;
204+
int blueMask = palette.blueMask;
205+
int redShift = palette.redShift;
206+
int greenShift = palette.greenShift;
207+
int blueShift = palette.blueShift;
208+
for (int y=0; y<pHeight; y++) {
209+
int offset = y * newData.bytesPerLine;
210+
data.getPixels(0, y, pWidth, scanline, 0);
211+
for (int x=0; x<pWidth; x++) {
212+
int pixel = scanline[x];
213+
if (pixel != data.transparentPixel) {
214+
int red = pixel & redMask;
215+
red = (redShift < 0) ? red >>> -redShift : red << redShift;
216+
int green = pixel & greenMask;
217+
green = (greenShift < 0) ? green >>> -greenShift : green << greenShift;
218+
int blue = pixel & blueMask;
219+
blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift;
220+
int intensity = (red+red+green+green+green+green+green+blue) >> 3;
221+
if (newData.transparentPixel == intensity) intensity = 255;
222+
newData.data[offset] = (byte)intensity;
223+
} else {
224+
newData.data[offset] = (byte)254;
225+
}
226+
offset++;
227+
}
228+
}
229+
}
230+
return newData;
92231
}
93232
}
94233

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,11 @@ public Image(Device device, Image srcImage, int flag) {
304304
private boolean createWithSVG(Device device, int flag) {
305305
if (imageProvider.getProvider() instanceof ImageFileNameProvider imageFileNameProvider) {
306306
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom(imageFileNameProvider, getZoom());
307-
if (fileName.element().endsWith(".svg")) {
307+
// if (fileName.element().endsWith(".svg")) {
308308
ElementAtZoom<ImageData> imageData = ImageDataLoader.load(fileName.element(), fileName.zoom(), getZoom(), flag);
309309
init(imageData.element(), getZoom());
310310
return true;
311-
}
311+
// }
312312
}
313313
// else if (imageProvider.getProvider() instanceof ImageDataProvider imageDataProvider) {
314314
// if (imageDataProvider.supportsRasterizationFlag(flag)) {

0 commit comments

Comments
 (0)