Skip to content

Commit 173577f

Browse files
committed
Introduce ImageData customization for static images in FileFormat
1 parent 2a30736 commit 173577f

File tree

1 file changed

+140
-1
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/image

1 file changed

+140
-1
lines changed

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

+140-1
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
@@ -83,7 +85,144 @@ static abstract class StaticImageFileFormat extends FileFormat {
8385

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

0 commit comments

Comments
 (0)