Skip to content

Commit e0a66ba

Browse files
committed
disabled icon logic
1 parent 8cb089b commit e0a66ba

File tree

11 files changed

+284
-61
lines changed

11 files changed

+284
-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

+115-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,25 @@
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.eclipse.swt.graphics.SVGRasterizerRegistry;
35+
import org.w3c.dom.Document;
36+
import org.w3c.dom.Element;
37+
import org.xml.sax.SAXException;
38+
2439
import com.github.weisj.jsvg.*;
2540
import com.github.weisj.jsvg.geometry.size.*;
2641
import com.github.weisj.jsvg.parser.*;
@@ -45,17 +60,39 @@ public class JSVGRasterizer implements SVGRasterizer {
4560
KEY_STROKE_CONTROL, VALUE_STROKE_PURE, //
4661
KEY_TEXT_ANTIALIASING, VALUE_TEXT_ANTIALIAS_ON //
4762
);
48-
63+
4964
@Override
5065
public ImageData rasterizeSVG(InputStream stream, float scalingFactor) throws IOException {
5166
if (stream == null) {
5267
throw new IllegalArgumentException("InputStream cannot be null");
5368
}
54-
stream.mark(Integer.MAX_VALUE);
5569
if(svgLoader == null) {
5670
svgLoader = new SVGLoader();
5771
}
72+
return rasterize(stream, scalingFactor);
73+
}
74+
75+
@Override
76+
public ImageData rasterizeDisabledSVG(InputStream stream, float scalingFactor) throws IOException {
77+
if(svgLoader == null) {
78+
svgLoader = new SVGLoader();
79+
}
80+
InputStream disabledStream = applyDisabledLook(stream);
81+
return rasterize(disabledStream, scalingFactor);
82+
}
83+
84+
@Override
85+
public ImageData rasterizeGraySVG(InputStream stream, float scalingFactor) throws IOException {
86+
if(svgLoader == null) {
87+
svgLoader = new SVGLoader();
88+
}
89+
InputStream disabledStream = applyGrayLook(stream);
90+
return rasterize(disabledStream, scalingFactor);
91+
}
92+
93+
private ImageData rasterize(InputStream stream, float scalingFactor) throws IOException {
5894
SVGDocument svgDocument = null;
95+
stream.mark(Integer.MAX_VALUE);
5996
InputStream nonClosingStream = new FilterInputStream(stream) {
6097
@Override
6198
public void close() throws IOException {
@@ -81,6 +118,82 @@ public void close() throws IOException {
81118
return null;
82119
}
83120

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