Skip to content

Commit 67d7433

Browse files
committed
disabled icon logic
1 parent 8cb089b commit 67d7433

File tree

11 files changed

+283
-61
lines changed

11 files changed

+283
-61
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.129.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

+114-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,24 @@
1717
import java.awt.image.*;
1818
import java.io.*;
1919
import java.util.*;
20+
21+
import javax.xml.parsers.DocumentBuilder;
22+
import javax.xml.parsers.DocumentBuilderFactory;
23+
import javax.xml.parsers.ParserConfigurationException;
24+
import javax.xml.transform.Transformer;
25+
import javax.xml.transform.TransformerException;
26+
import javax.xml.transform.TransformerFactory;
27+
import javax.xml.transform.dom.DOMSource;
28+
import javax.xml.transform.stream.StreamResult;
29+
2030
import org.eclipse.swt.graphics.SVGRasterizer;
2131
import org.eclipse.swt.graphics.ImageData;
2232
import org.eclipse.swt.graphics.PaletteData;
2333
import org.eclipse.swt.graphics.RGB;
34+
import org.w3c.dom.Document;
35+
import org.w3c.dom.Element;
36+
import org.xml.sax.SAXException;
37+
2438
import com.github.weisj.jsvg.*;
2539
import com.github.weisj.jsvg.geometry.size.*;
2640
import com.github.weisj.jsvg.parser.*;
@@ -45,17 +59,39 @@ public class JSVGRasterizer implements SVGRasterizer {
4559
KEY_STROKE_CONTROL, VALUE_STROKE_PURE, //
4660
KEY_TEXT_ANTIALIASING, VALUE_TEXT_ANTIALIAS_ON //
4761
);
48-
62+
4963
@Override
5064
public ImageData rasterizeSVG(InputStream stream, float scalingFactor) throws IOException {
5165
if (stream == null) {
5266
throw new IllegalArgumentException("InputStream cannot be null");
5367
}
54-
stream.mark(Integer.MAX_VALUE);
5568
if(svgLoader == null) {
5669
svgLoader = new SVGLoader();
5770
}
71+
return rasterize(stream, scalingFactor);
72+
}
73+
74+
@Override
75+
public ImageData rasterizeDisabledSVG(InputStream stream, float scalingFactor) throws IOException {
76+
if(svgLoader == null) {
77+
svgLoader = new SVGLoader();
78+
}
79+
InputStream disabledStream = applyDisabledLook(stream);
80+
return rasterize(disabledStream, scalingFactor);
81+
}
82+
83+
@Override
84+
public ImageData rasterizeGraySVG(InputStream stream, float scalingFactor) throws IOException {
85+
if(svgLoader == null) {
86+
svgLoader = new SVGLoader();
87+
}
88+
InputStream disabledStream = applyGrayLook(stream);
89+
return rasterize(disabledStream, scalingFactor);
90+
}
91+
92+
private ImageData rasterize(InputStream stream, float scalingFactor) throws IOException {
5893
SVGDocument svgDocument = null;
94+
stream.mark(Integer.MAX_VALUE);
5995
InputStream nonClosingStream = new FilterInputStream(stream) {
6096
@Override
6197
public void close() throws IOException {
@@ -81,6 +117,82 @@ public void close() throws IOException {
81117
return null;
82118
}
83119

120+
private static InputStream applyDisabledLook(InputStream svgInputStream) throws IOException {
121+
Document svgDocument = parseSVG(svgInputStream);
122+
addDisabledFilter(svgDocument);
123+
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
124+
writeSVG(svgDocument, outputStream);
125+
return new ByteArrayInputStream(outputStream.toByteArray());
126+
}
127+
}
128+
129+
private static InputStream applyGrayLook(InputStream svgInputStream) throws IOException {
130+
Document svgDocument = parseSVG(svgInputStream);
131+
addGrayFilter(svgDocument);
132+
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
133+
writeSVG(svgDocument, outputStream);
134+
return new ByteArrayInputStream(outputStream.toByteArray());
135+
}
136+
}
137+
138+
private static Document parseSVG(InputStream inputStream) throws IOException {
139+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
140+
DocumentBuilder builder;
141+
try {
142+
builder = factory.newDocumentBuilder();
143+
return builder.parse(inputStream);
144+
} catch (SAXException | IOException | ParserConfigurationException e) {
145+
throw new IOException(e.getMessage());
146+
}
147+
}
148+
149+
private static void addDisabledFilter(Document document) {
150+
addFilter(document, 0.64f, 0.4f);
151+
}
152+
153+
private static void addGrayFilter(Document document) {
154+
addFilter(document, 0.64f, 0.1f);
155+
}
156+
157+
private static void addFilter(Document document, float slope, float intercept) {
158+
Element defs = (Element) document.getElementsByTagName("defs").item(0);
159+
if (defs == null) {
160+
defs = document.createElement("defs");
161+
document.getDocumentElement().appendChild(defs);
162+
}
163+
164+
Element filter = document.createElement("filter");
165+
filter.setAttribute("id", "customizedLook");
166+
167+
Element colorMatrix = document.createElement("feColorMatrix");
168+
colorMatrix.setAttribute("type", "saturate");
169+
colorMatrix.setAttribute("values", "0");
170+
filter.appendChild(colorMatrix);
171+
172+
Element componentTransfer = document.createElement("feComponentTransfer");
173+
for (String channel : new String[] { "R", "G", "B" }) {
174+
Element func = document.createElement("feFunc" + channel);
175+
func.setAttribute("type", "linear");
176+
func.setAttribute("slope", Float.toString(slope));
177+
func.setAttribute("intercept", Float.toString(intercept));
178+
componentTransfer.appendChild(func);
179+
}
180+
filter.appendChild(componentTransfer);
181+
defs.appendChild(filter);
182+
document.getDocumentElement().setAttribute("filter", "url(#customizedLook)");
183+
}
184+
185+
private static void writeSVG(Document document, OutputStream outputStream) throws IOException {
186+
TransformerFactory transformerFactory = TransformerFactory.newInstance();
187+
Transformer transformer;
188+
try {
189+
transformer = transformerFactory.newTransformer();
190+
transformer.transform(new DOMSource(document), new StreamResult(outputStream));
191+
} catch (TransformerException e) {
192+
throw new IOException(e.getMessage());
193+
}
194+
}
195+
84196
private ImageData convertToSWT(BufferedImage bufferedImage) {
85197
if (bufferedImage.getColorModel() instanceof DirectColorModel) {
86198
DirectColorModel colorModel = (DirectColorModel)bufferedImage.getColorModel();

bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/ImageLoader.java

+22-11
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,37 @@ public ImageData[] load(InputStream stream) {
176176
* <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li>
177177
* </ul>
178178
*
179-
* @since 3.129
179+
* @since 4.0
180180
*/
181-
public ImageData[] load(InputStream stream, int zoom) {
181+
public ImageData[] load(InputStream stream, int zoom, int flag) {
182182
if (stream == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
183183
reset();
184184
if (!stream.markSupported()) {
185185
stream = new BufferedInputStream(stream);
186186
}
187+
ImageData rasterizedData = null;
187188
SVGRasterizer rasterizer = SVGRasterizerRegistry.getRasterizer();
188189
if (rasterizer != null && zoom != 0) {
189-
try {
190+
try {
190191
if (rasterizer.isSVGFile(stream)) {
191-
float scalingFactor = zoom / 100.0f;
192-
ImageData rasterizedData = rasterizer.rasterizeSVG(stream, scalingFactor);
193-
if (rasterizedData != null) {
192+
float scalingFactor = zoom / 100.0f;
193+
switch(flag) {
194+
case SWT.IMAGE_DISABLE:
195+
rasterizedData = rasterizer.rasterizeDisabledSVG(stream, scalingFactor);
196+
break;
197+
case SWT.IMAGE_GRAY:
198+
rasterizedData = rasterizer.rasterizeGraySVG(stream, scalingFactor);
199+
break;
200+
case SWT.IMAGE_COPY:
201+
rasterizedData = rasterizer.rasterizeSVG(stream, scalingFactor);
202+
break;
203+
}
204+
if (rasterizedData != null) {
194205
data = new ImageData[]{rasterizedData};
195-
return data;
206+
return data;
196207
}
197208
}
198-
} catch (IOException e) {
209+
} catch (IOException e) {
199210
//ignore.
200211
}
201212
}
@@ -258,12 +269,12 @@ public ImageData[] load(String filename) {
258269
* <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
259270
* </ul>
260271
*
261-
* @since 3.129
272+
* @since 4.0
262273
*/
263-
public ImageData[] load(String filename, int zoom) {
274+
public ImageData[] load(String filename, int zoom, int flag) {
264275
if (filename == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
265276
try (InputStream stream = new FileInputStream(filename)) {
266-
return load(stream, zoom);
277+
return load(stream, zoom, flag);
267278
} catch (IOException e) {
268279
SWT.error(SWT.ERROR_IO, e);
269280
}

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ scanlinePad, checkData(data), 0, null,
331331
* @see ImageLoader#load(InputStream)
332332
*/
333333
public ImageData(InputStream stream) {
334-
this(stream, 0);
334+
this(stream, 0, SWT.IMAGE_COPY);
335335
}
336336

337337
/**
@@ -360,10 +360,10 @@ public ImageData(InputStream stream) {
360360
* </ul>
361361
*
362362
* @see ImageLoader#load(InputStream)
363-
* @since 3.129
363+
* @since 4.0
364364
*/
365-
public ImageData(InputStream stream, int zoom) {
366-
ImageData[] data = ImageDataLoader.load(stream, zoom);
365+
public ImageData(InputStream stream, int zoom, int flag) {
366+
ImageData[] data = ImageDataLoader.load(stream, zoom, flag);
367367
if (data.length < 1) SWT.error(SWT.ERROR_INVALID_IMAGE);
368368
ImageData i = data[0];
369369
setAllFields(
@@ -409,7 +409,7 @@ public ImageData(InputStream stream, int zoom) {
409409
* </ul>
410410
*/
411411
public ImageData(String filename) {
412-
this(filename, 0);
412+
this(filename, 0, SWT.IMAGE_COPY);
413413
}
414414

415415
/**
@@ -435,10 +435,10 @@ public ImageData(String filename) {
435435
* <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
436436
* </ul>
437437
*
438-
* @since 3.129
438+
* @since 4.0
439439
*/
440-
public ImageData(String filename, int zoom) {
441-
ImageData[] data = ImageDataLoader.load(filename, zoom);
440+
public ImageData(String filename, int zoom, int flag) {
441+
ImageData[] data = ImageDataLoader.load(filename, zoom, flag);
442442
if (data.length < 1) SWT.error(SWT.ERROR_INVALID_IMAGE);
443443
ImageData i = data[0];
444444
setAllFields(

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ public static ImageData[] load(InputStream stream) {
2525
return new ImageLoader().load(stream);
2626
}
2727

28-
public static ImageData[] load(InputStream stream, int zoom) {
29-
return new ImageLoader().load(stream, zoom);
28+
public static ImageData[] load(InputStream stream, int zoom, int flag) {
29+
return new ImageLoader().load(stream, zoom, flag);
3030
}
3131

32-
public static ImageData[] load(String filename) {
32+
public static ImageData[] load(String filename) {
3333
return new ImageLoader().load(filename);
3434
}
3535

36-
public static ImageData[] load(String filename, int zoom) {
37-
return new ImageLoader().load(filename, zoom);
36+
public static ImageData[] load(String filename, int zoom, int flag) {
37+
return new ImageLoader().load(filename, zoom, flag);
3838
}
3939

4040
}

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
*/
2626
public interface ImageDataProvider {
2727

28-
2928
/**
3029
* Returns the image data for the given zoom level.
3130
* <p>
@@ -43,4 +42,17 @@ public interface ImageDataProvider {
4342
*/
4443
ImageData getImageData (int zoom);
4544

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

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* Defines the interface for an SVG rasterizer, responsible for converting SVG
1818
* data into rasterized images.
1919
*
20-
* @since 3.129
20+
* @since 4.0
2121
*/
2222
public interface SVGRasterizer {
2323

@@ -34,6 +34,10 @@ public interface SVGRasterizer {
3434
*/
3535
public ImageData rasterizeSVG(InputStream stream, float scalingFactor) throws IOException;
3636

37+
public ImageData rasterizeDisabledSVG(InputStream stream, float scalingFactor) throws IOException;
38+
39+
public ImageData rasterizeGraySVG(InputStream stream, float scalingFactor) throws IOException;
40+
3741
/**
3842
* Determines whether the given {@link InputStream} contains a SVG file.
3943
*

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* A registry for managing the instance of an {@link SVGRasterizer} implementation.
1818
* This allows for the registration and retrieval of a single rasterizer instance.
1919
*
20-
* @since 3.129
20+
* @since 4.0
2121
*/
2222
class SVGRasterizerRegistry {
2323

0 commit comments

Comments
 (0)