Skip to content

Commit 548d586

Browse files
committed
disabled icon logic
cleanup
1 parent 45d0b2b commit 548d586

File tree

5 files changed

+150
-3
lines changed

5 files changed

+150
-3
lines changed

binaries/org.eclipse.swt.win32.win32.x86_64/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Fragment-Host: org.eclipse.swt;bundle-version="[3.128.0,4.0.0)"
33
Bundle-Name: %fragmentName
44
Bundle-Vendor: %providerName
55
Bundle-SymbolicName: org.eclipse.swt.win32.win32.x86_64; singleton:=true
6-
Bundle-Version: 3.130.0.qualifier
6+
Bundle-Version: 4.0.0.qualifier
77
Bundle-ManifestVersion: 2
88
Bundle-Localization: fragment
99
Export-Package:

bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,30 @@
3535
import java.awt.RenderingHints.Key;
3636
import java.awt.image.BufferedImage;
3737
import java.awt.image.DataBufferInt;
38+
import java.io.ByteArrayInputStream;
39+
import java.io.ByteArrayOutputStream;
3840
import java.io.IOException;
3941
import java.io.InputStream;
42+
import java.io.OutputStream;
4043
import java.util.Map;
4144

4245
import org.eclipse.swt.SWT;
4346
import org.eclipse.swt.graphics.ImageData;
4447
import org.eclipse.swt.graphics.PaletteData;
4548
import org.eclipse.swt.internal.image.SVGRasterizer;
4649

50+
import javax.xml.parsers.DocumentBuilder;
51+
import javax.xml.parsers.DocumentBuilderFactory;
52+
import javax.xml.parsers.ParserConfigurationException;
53+
import javax.xml.transform.Transformer;
54+
import javax.xml.transform.TransformerException;
55+
import javax.xml.transform.TransformerFactory;
56+
import javax.xml.transform.dom.DOMSource;
57+
import javax.xml.transform.stream.StreamResult;
58+
import org.w3c.dom.Document;
59+
import org.w3c.dom.Element;
60+
import org.xml.sax.SAXException;
61+
4762
import com.github.weisj.jsvg.SVGDocument;
4863
import com.github.weisj.jsvg.geometry.size.FloatSize;
4964
import com.github.weisj.jsvg.parser.LoaderContext;
@@ -71,7 +86,19 @@ public class JSVGRasterizer implements SVGRasterizer {
7186
);
7287

7388
@Override
74-
public ImageData rasterizeSVG(InputStream inputStream, int zoom) throws IOException {
89+
public ImageData rasterizeSVG(InputStream inputStream, int zoom, int flag) throws IOException {
90+
switch(flag) {
91+
case SWT.IMAGE_DISABLE:
92+
inputStream = applyDisabledLook(inputStream);
93+
break;
94+
case SWT.IMAGE_GRAY:
95+
inputStream = applyGrayLook(inputStream);
96+
break;
97+
case SWT.IMAGE_COPY:
98+
break;
99+
default:
100+
SWT.error(SWT.ERROR_INVALID_IMAGE);
101+
}
75102
SVGDocument svgDocument = loadSVG(inputStream);
76103
if (svgDocument != null) {
77104
return generateRasterizedImageData(svgDocument, zoom);
@@ -139,4 +166,80 @@ private ImageData convertToSWTImageData(BufferedImage rasterizedImage) {
139166
}
140167
return imageData;
141168
}
169+
170+
private static InputStream applyDisabledLook(InputStream svgInputStream) throws IOException {
171+
Document svgDocument = parseSVG(svgInputStream);
172+
addDisabledFilter(svgDocument);
173+
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
174+
writeSVG(svgDocument, outputStream);
175+
return new ByteArrayInputStream(outputStream.toByteArray());
176+
}
177+
}
178+
179+
private static InputStream applyGrayLook(InputStream svgInputStream) throws IOException {
180+
Document svgDocument = parseSVG(svgInputStream);
181+
addGrayFilter(svgDocument);
182+
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
183+
writeSVG(svgDocument, outputStream);
184+
return new ByteArrayInputStream(outputStream.toByteArray());
185+
}
186+
}
187+
188+
private static Document parseSVG(InputStream inputStream) throws IOException {
189+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
190+
DocumentBuilder builder;
191+
try {
192+
builder = factory.newDocumentBuilder();
193+
return builder.parse(inputStream);
194+
} catch (SAXException | IOException | ParserConfigurationException e) {
195+
throw new IOException(e.getMessage());
196+
}
197+
}
198+
199+
private static void addDisabledFilter(Document document) {
200+
addFilter(document, 0.64f, 0.4f);
201+
}
202+
203+
private static void addGrayFilter(Document document) {
204+
addFilter(document, 0.64f, 0.1f);
205+
}
206+
207+
private static void addFilter(Document document, float slope, float intercept) {
208+
Element defs = (Element) document.getElementsByTagName("defs").item(0);
209+
if (defs == null) {
210+
defs = document.createElement("defs");
211+
document.getDocumentElement().appendChild(defs);
212+
}
213+
214+
Element filter = document.createElement("filter");
215+
filter.setAttribute("id", "customizedLook");
216+
217+
Element colorMatrix = document.createElement("feColorMatrix");
218+
colorMatrix.setAttribute("type", "saturate");
219+
colorMatrix.setAttribute("values", "0");
220+
filter.appendChild(colorMatrix);
221+
222+
Element componentTransfer = document.createElement("feComponentTransfer");
223+
for (String channel : new String[] { "R", "G", "B" }) {
224+
Element func = document.createElement("feFunc" + channel);
225+
func.setAttribute("type", "linear");
226+
func.setAttribute("slope", Float.toString(slope));
227+
func.setAttribute("intercept", Float.toString(intercept));
228+
componentTransfer.appendChild(func);
229+
}
230+
filter.appendChild(componentTransfer);
231+
defs.appendChild(filter);
232+
document.getDocumentElement().setAttribute("filter", "url(#customizedLook)");
233+
}
234+
235+
private static void writeSVG(Document document, OutputStream outputStream) throws IOException {
236+
TransformerFactory transformerFactory = TransformerFactory.newInstance();
237+
Transformer transformer;
238+
try {
239+
transformer = transformerFactory.newTransformer();
240+
transformer.transform(new DOMSource(document), new StreamResult(outputStream));
241+
} catch (TransformerException e) {
242+
throw new IOException(e.getMessage());
243+
}
244+
}
142245
}

bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/ImageDataProvider.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,17 @@ public interface ImageDataProvider {
4343
*/
4444
ImageData getImageData (int zoom);
4545

46+
/**
47+
* @since 4.0
48+
*/
49+
default ImageData getCustomizedImageData(int zoom, int flag) {
50+
throw new UnsupportedOperationException();
51+
}
52+
53+
/**
54+
* @since 4.0
55+
*/
56+
default boolean supportsRasterizationFlag(int flag) {
57+
return false;
58+
}
4659
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ public interface SVGRasterizer {
3434
* the input is not a valid SVG file or cannot be processed.
3535
* @throws IOException
3636
*/
37-
public ImageData rasterizeSVG(InputStream stream, int zoom) throws IOException;
37+
public ImageData rasterizeSVG(InputStream stream, int zoom, int flag) throws IOException;
3838
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ public Image(Device device, Image srcImage, int flag) {
239239
long srcImageHandle = win32_getHandle(srcImage, getZoom());
240240
switch (flag) {
241241
case SWT.IMAGE_COPY: {
242+
if(createWithSVG(device, flag)) {
243+
break;
244+
}
242245
switch (type) {
243246
case SWT.BITMAP:
244247
/* Get the HDC for the device */
@@ -274,12 +277,18 @@ public Image(Device device, Image srcImage, int flag) {
274277
break;
275278
}
276279
case SWT.IMAGE_DISABLE: {
280+
if(createWithSVG(device, flag)) {
281+
break;
282+
}
277283
ImageData data = srcImage.getImageData(srcImage.getZoom());
278284
ImageData newData = applyDisableImageData(data, rect.height, rect.width);
279285
init (newData, getZoom());
280286
break;
281287
}
282288
case SWT.IMAGE_GRAY: {
289+
if(createWithSVG(device, flag)) {
290+
break;
291+
}
283292
ImageData data = srcImage.getImageData(srcImage.getZoom());
284293
ImageData newData = applyGrayImageData(data, rect.height, rect.width);
285294
init (newData, getZoom());
@@ -292,6 +301,28 @@ public Image(Device device, Image srcImage, int flag) {
292301
this.device.registerResourceWithZoomSupport(this);
293302
}
294303

304+
private boolean createWithSVG(Device device, int flag) {
305+
ImageData data = null;
306+
Image customizedImage = null;
307+
if (imageProvider.getProvider() instanceof ImageFileNameProvider imageFileNameProvider) {
308+
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom(imageFileNameProvider, getZoom());
309+
if (fileName.element().endsWith(".svg")) {
310+
customizedImage = new Image(device, imageFileNameProvider, flag);
311+
}
312+
} else if (imageProvider.getProvider() instanceof ImageDataProvider imageDataProvider) {
313+
if (imageDataProvider.supportsRasterizationFlag(flag)) {
314+
customizedImage = new Image(device, imageDataProvider, flag);
315+
}
316+
}
317+
if(customizedImage != null) {
318+
data = customizedImage.getImageData(customizedImage.getZoom());
319+
init(data, getZoom());
320+
customizedImage.dispose();
321+
return true;
322+
}
323+
return false;
324+
}
325+
295326
/**
296327
* Constructs an empty instance of this class with the
297328
* width and height of the specified rectangle. The result

0 commit comments

Comments
 (0)