Skip to content

Commit ad19a22

Browse files
committed
disabled icon logic
disabled icon logic
1 parent fcb178b commit ad19a22

File tree

9 files changed

+175
-10
lines changed

9 files changed

+175
-10
lines changed

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

+1-1
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.tests/JUnit Tests/org/eclipse/swt/svg/tests/junit/Test_org_eclipse_swt_internal_SVGRasterizer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class Test_org_eclipse_swt_internal_SVGRasterizer {
3838

3939
ImageDataProvider imageDataProvider = zoom -> {
4040
String fileName = "collapseall.svg";
41-
return new ImageData(getPath(fileName), zoom);
41+
return new ImageData(getPath(fileName), zoom, SWT.IMAGE_COPY);
4242
};
4343

4444
@Before
@@ -89,7 +89,7 @@ public void test_ConstructorLorg_eclipse_swt_graphics_Device_ImageDataProvider()
8989
// Corrupt Image provider
9090
ImageDataProvider provider = zoom -> {
9191
String fileName = "corrupt.svg";
92-
return new ImageData(getPath(fileName), zoom);
92+
return new ImageData(getPath(fileName), zoom, SWT.IMAGE_COPY);
9393
};
9494
try {
9595
image = new Image(display, provider);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.eclipse.swt.svg.JSVGRasterizer

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

+101-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,19 @@
4242
import org.eclipse.swt.SWT;
4343
import org.eclipse.swt.graphics.ImageData;
4444
import org.eclipse.swt.graphics.PaletteData;
45+
import org.eclipse.swt.graphics.RGB;
4546
import org.eclipse.swt.internal.image.SVGRasterizer;
47+
import javax.xml.parsers.DocumentBuilder;
48+
import javax.xml.parsers.DocumentBuilderFactory;
49+
import javax.xml.parsers.ParserConfigurationException;
50+
import javax.xml.transform.Transformer;
51+
import javax.xml.transform.TransformerException;
52+
import javax.xml.transform.TransformerFactory;
53+
import javax.xml.transform.dom.DOMSource;
54+
import javax.xml.transform.stream.StreamResult;
55+
import org.w3c.dom.Document;
56+
import org.w3c.dom.Element;
57+
import org.xml.sax.SAXException;
4658

4759
import com.github.weisj.jsvg.SVGDocument;
4860
import com.github.weisj.jsvg.geometry.size.FloatSize;
@@ -73,7 +85,19 @@ public class JSVGRasterizer implements SVGRasterizer {
7385
);
7486

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

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

-5
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,4 @@ public static ElementAtZoom<ImageData> load(String filename, int fileZoom, int t
4848
if (data.isEmpty()) SWT.error(SWT.ERROR_INVALID_IMAGE);
4949
return data.get(0);
5050
}
51-
52-
public static ImageData[] load(String filename, int zoom) {
53-
return new ImageLoader().load(filename, zoom);
54-
}
55-
5651
}

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

+13
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/graphics/ImageLoader.java

+1
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ List<ElementAtZoom<ImageData>> load(InputStream stream, int fileZoom, int target
162162
return images;
163163
}
164164

165+
//TODO: JavaDocs flag parameter
165166
/**
166167
* Loads an array of <code>ImageData</code> objects from the
167168
* file with the specified name. Throws an error if either

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ public interface SVGRasterizer {
3232
* the input is not a valid SVG file or cannot be processed.
3333
* @throws IOException if an error occurs while reading the SVG data.
3434
*/
35-
public ImageData[] rasterizeSVG(InputStream stream, int zoom) throws IOException;
35+
public ImageData[] rasterizeSVG(InputStream stream, int zoom, int flag) throws IOException;
3636
}

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

+55
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
@@ -561,6 +592,20 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
561592
this.device.registerResourceWithZoomSupport(this);
562593
}
563594

595+
private Image(Device device, ImageFileNameProvider imageFileNameProvider, int flag) {
596+
super(device);
597+
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
598+
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
599+
int zoom = getZoom();
600+
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
601+
ImageHandle imageMetadata = initNative (fileName.element(), zoom);
602+
if (imageMetadata == null) {
603+
init(new ImageData (fileName.element(), zoom, flag), zoom);
604+
}
605+
init();
606+
this.device.registerResourceWithZoomSupport(this);
607+
}
608+
564609
/**
565610
* Constructs an instance of this class by loading its representation
566611
* from the ImageData retrieved from the ImageDataProvider. Throws an
@@ -599,6 +644,16 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
599644
this.device.registerResourceWithZoomSupport(this);
600645
}
601646

647+
private Image(Device device, ImageDataProvider imageDataProvider, int flag) {
648+
super(device);
649+
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
650+
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
651+
ImageData data = imageDataProvider.getCustomizedImageData(getZoom(), flag);
652+
init (data, getZoom());
653+
init();
654+
this.device.registerResourceWithZoomSupport(this);
655+
}
656+
602657
/**
603658
* The provided ImageGcDrawer will be called on demand whenever a new variant of the
604659
* Image for an additional zoom is required. Depending on the OS-specific implementation

0 commit comments

Comments
 (0)