31 import java.lang.reflect.Method;
32 import java.security.AccessController;
33 import java.security.PrivilegedAction;
34 import java.util.*;
35
36 import javax.swing.*;
37 import javax.swing.border.Border;
38 import javax.swing.plaf.UIResource;
39
40 import sun.awt.AppContext;
41
42 import sun.lwawt.macosx.CImage;
43 import sun.lwawt.macosx.CImage.Creator;
44 import sun.lwawt.macosx.CPlatformWindow;
45 import sun.misc.Launcher;
46 import sun.reflect.misc.ReflectUtil;
47 import sun.security.action.GetPropertyAction;
48 import sun.swing.SwingUtilities2;
49
50 import com.apple.laf.AquaImageFactory.SlicedImageControl;
51 import sun.awt.image.MultiResolutionCachedImage;
52
53 final class AquaUtils {
54
55 private static final String ANIMATIONS_PROPERTY = "swing.enableAnimations";
56
57 /**
58 * Suppresses default constructor, ensuring non-instantiability.
59 */
60 private AquaUtils() {
61 }
62
63 /**
64 * Convenience function for determining ComponentOrientation. Helps us
65 * avoid having Munge directives throughout the code.
66 */
67 static boolean isLeftToRight(final Component c) {
68 return c.getComponentOrientation().isLeftToRight();
69 }
70
87 getCreatorMethod.setAccessible(true);
88 return (Creator)getCreatorMethod.invoke(null, new Object[] {});
89 } catch (final Exception ignored) {
90 return null;
91 }
92 }
93 });
94 }
95
96 private static final RecyclableSingleton<Creator> cImageCreator = new RecyclableSingleton<Creator>() {
97 @Override
98 protected Creator getInstance() {
99 return getCImageCreatorInternal();
100 }
101 };
102 static Creator getCImageCreator() {
103 return cImageCreator.get();
104 }
105
106 static Image generateSelectedDarkImage(final Image image) {
107 final ImageProducer prod = new FilteredImageSource(image.getSource(), new IconImageFilter() {
108 @Override
109 int getGreyFor(final int gray) {
110 return gray * 75 / 100;
111 }
112 });
113 return Toolkit.getDefaultToolkit().createImage(prod);
114 }
115
116 static Image generateDisabledImage(final Image image) {
117 final ImageProducer prod = new FilteredImageSource(image.getSource(), new IconImageFilter() {
118 @Override
119 int getGreyFor(final int gray) {
120 return 255 - ((255 - gray) * 65 / 100);
121 }
122 });
123 return Toolkit.getDefaultToolkit().createImage(prod);
124 }
125
126 static Image generateLightenedImage(final Image image, final int percent) {
127 final GrayFilter filter = new GrayFilter(true, percent);
128 return (image instanceof MultiResolutionCachedImage)
129 ? ((MultiResolutionCachedImage) image).map(
130 rv -> generateLightenedImage(rv, filter))
131 : generateLightenedImage(image, filter);
132 }
133
134 static Image generateLightenedImage(Image image, ImageFilter filter) {
135 final ImageProducer prod = new FilteredImageSource(image.getSource(), filter);
136 return Toolkit.getDefaultToolkit().createImage(prod);
137 }
138
139 private abstract static class IconImageFilter extends RGBImageFilter {
140 IconImageFilter() {
141 super();
142 canFilterIndexColorModel = true;
143 }
144
145 @Override
146 public final int filterRGB(final int x, final int y, final int rgb) {
147 final int red = (rgb >> 16) & 0xff;
148 final int green = (rgb >> 8) & 0xff;
149 final int blue = rgb & 0xff;
150 final int gray = getGreyFor((int)((0.30 * red + 0.59 * green + 0.11 * blue) / 3));
151
152 return (rgb & 0xff000000) | (grayTransform(red, gray) << 16) | (grayTransform(green, gray) << 8) | (grayTransform(blue, gray) << 0);
153 }
154
155 private static int grayTransform(final int color, final int gray) {
156 int result = color - gray;
157 if (result < 0) result = 0;
158 if (result > 255) result = 255;
|
31 import java.lang.reflect.Method;
32 import java.security.AccessController;
33 import java.security.PrivilegedAction;
34 import java.util.*;
35
36 import javax.swing.*;
37 import javax.swing.border.Border;
38 import javax.swing.plaf.UIResource;
39
40 import sun.awt.AppContext;
41
42 import sun.lwawt.macosx.CImage;
43 import sun.lwawt.macosx.CImage.Creator;
44 import sun.lwawt.macosx.CPlatformWindow;
45 import sun.misc.Launcher;
46 import sun.reflect.misc.ReflectUtil;
47 import sun.security.action.GetPropertyAction;
48 import sun.swing.SwingUtilities2;
49
50 import com.apple.laf.AquaImageFactory.SlicedImageControl;
51 import java.util.function.Function;
52 import sun.awt.image.MultiResolutionCachedImage;
53
54 final class AquaUtils {
55
56 private static final String ANIMATIONS_PROPERTY = "swing.enableAnimations";
57
58 /**
59 * Suppresses default constructor, ensuring non-instantiability.
60 */
61 private AquaUtils() {
62 }
63
64 /**
65 * Convenience function for determining ComponentOrientation. Helps us
66 * avoid having Munge directives throughout the code.
67 */
68 static boolean isLeftToRight(final Component c) {
69 return c.getComponentOrientation().isLeftToRight();
70 }
71
88 getCreatorMethod.setAccessible(true);
89 return (Creator)getCreatorMethod.invoke(null, new Object[] {});
90 } catch (final Exception ignored) {
91 return null;
92 }
93 }
94 });
95 }
96
97 private static final RecyclableSingleton<Creator> cImageCreator = new RecyclableSingleton<Creator>() {
98 @Override
99 protected Creator getInstance() {
100 return getCImageCreatorInternal();
101 }
102 };
103 static Creator getCImageCreator() {
104 return cImageCreator.get();
105 }
106
107 static Image generateSelectedDarkImage(final Image image) {
108 final ImageFilter filter = new IconImageFilter() {
109 @Override
110 int getGreyFor(final int gray) {
111 return gray * 75 / 100;
112 }
113 };
114 return map(image, (img) -> generateFilteredImage(img, filter));
115 }
116
117 static Image generateDisabledImage(final Image image) {
118 final ImageFilter filter = new IconImageFilter() {
119 @Override
120 int getGreyFor(final int gray) {
121 return 255 - ((255 - gray) * 65 / 100);
122 }
123 };
124 return map(image, (img) -> generateFilteredImage(img, filter));
125 }
126
127 static Image generateLightenedImage(final Image image, final int percent) {
128 final GrayFilter filter = new GrayFilter(true, percent);
129 return map(image, (img) -> generateFilteredImage(img, filter));
130 }
131
132 static Image generateFilteredImage(Image image, ImageFilter filter) {
133 final ImageProducer prod = new FilteredImageSource(image.getSource(), filter);
134 return Toolkit.getDefaultToolkit().createImage(prod);
135 }
136
137 private static Image map(Image image, Function<Image, Image> mapper) {
138 if (image instanceof MultiResolutionCachedImage) {
139 return ((MultiResolutionCachedImage) image).map(mapper);
140 } else if (image instanceof MultiResolutionImage) {
141 MultiResolutionImage mrImage = (MultiResolutionImage) image;
142 Image[] mappedImages = mrImage.getResolutionVariants().stream()
143 .map(mapper).toArray(Image[]::new);
144 return new BaseMultiResolutionImage(mappedImages);
145 }
146 return mapper.apply(image);
147 }
148
149 private abstract static class IconImageFilter extends RGBImageFilter {
150 IconImageFilter() {
151 super();
152 canFilterIndexColorModel = true;
153 }
154
155 @Override
156 public final int filterRGB(final int x, final int y, final int rgb) {
157 final int red = (rgb >> 16) & 0xff;
158 final int green = (rgb >> 8) & 0xff;
159 final int blue = rgb & 0xff;
160 final int gray = getGreyFor((int)((0.30 * red + 0.59 * green + 0.11 * blue) / 3));
161
162 return (rgb & 0xff000000) | (grayTransform(red, gray) << 16) | (grayTransform(green, gray) << 8) | (grayTransform(blue, gray) << 0);
163 }
164
165 private static int grayTransform(final int color, final int gray) {
166 int result = color - gray;
167 if (result < 0) result = 0;
168 if (result > 255) result = 255;
|