112 import com.sun.javafx.tk.TKSystemMenu;
113 import com.sun.javafx.tk.Toolkit;
114 import com.sun.prism.BasicStroke;
115 import com.sun.prism.Graphics;
116 import com.sun.prism.GraphicsPipeline;
117 import com.sun.prism.PixelFormat;
118 import com.sun.prism.RTTexture;
119 import com.sun.prism.ResourceFactory;
120 import com.sun.prism.ResourceFactoryListener;
121 import com.sun.prism.Texture.WrapMode;
122 import com.sun.prism.impl.Disposer;
123 import com.sun.prism.impl.PrismSettings;
124 import com.sun.scenario.DelayedRunnable;
125 import com.sun.scenario.animation.AbstractMasterTimer;
126 import com.sun.scenario.effect.FilterContext;
127 import com.sun.scenario.effect.Filterable;
128 import com.sun.scenario.effect.impl.prism.PrFilterContext;
129 import com.sun.scenario.effect.impl.prism.PrImage;
130 import com.sun.javafx.logging.PulseLogger;
131 import static com.sun.javafx.logging.PulseLogger.PULSE_LOGGING_ENABLED;
132 import com.sun.prism.impl.ManagedResource;
133
134 public final class QuantumToolkit extends Toolkit {
135
136 public static final boolean verbose =
137 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("quantum.verbose"));
138
139 public static final boolean pulseDebug =
140 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("quantum.pulse"));
141
142 private static final boolean multithreaded =
143 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> {
144 // If it is not specified, or it is true, then it should
145 // be true. Otherwise it should be false.
146 String value = System.getProperty("quantum.multithreaded");
147 if (value == null) return true;
148 final boolean result = Boolean.parseBoolean(value);
149 if (verbose) {
150 System.out.println(result ? "Multi-Threading Enabled" : "Multi-Threading Disabled");
151 }
879 int cmi = 0;
880 if (paint.getCycleMethod() == CycleMethod.NO_CYCLE) {
881 cmi = com.sun.prism.paint.Gradient.PAD;
882 } else if (paint.getCycleMethod() == CycleMethod.REFLECT) {
883 cmi = com.sun.prism.paint.Gradient.REFLECT;
884 } else {
885 cmi = com.sun.prism.paint.Gradient.REPEAT;
886 }
887
888 // TODO: extract colors/offsets and pass them in directly...
889 List<com.sun.prism.paint.Stop> stops = convertStops(paint.getStops());
890 return new com.sun.prism.paint.RadialGradient(cx, cy, fa, fd,
891 (float)paint.getRadius(), null, paint.isProportional(), cmi, stops);
892 }
893
894 @Override
895 protected Object createImagePatternPaint(ImagePattern paint) {
896 if (paint.getImage() == null) {
897 return com.sun.prism.paint.Color.TRANSPARENT;
898 } else {
899 return new com.sun.prism.paint.ImagePattern((com.sun.prism.Image) paint.getImage().impl_getPlatformImage(),
900 (float)paint.getX(),
901 (float)paint.getY(),
902 (float)paint.getWidth(),
903 (float)paint.getHeight(),
904 paint.isProportional(),
905 Toolkit.getPaintAccessor().isMutable(paint));
906 }
907 }
908
909 static BasicStroke tmpStroke = new BasicStroke();
910 private void initStroke(StrokeType pgtype, double strokewidth,
911 StrokeLineCap pgcap,
912 StrokeLineJoin pgjoin, float miterLimit,
913 float[] dashArray, float dashOffset)
914 {
915 int type;
916 if (pgtype == StrokeType.CENTERED) {
917 type = BasicStroke.TYPE_CENTERED;
918 } else if (pgtype == StrokeType.INSIDE) {
919 type = BasicStroke.TYPE_INNER;
1038 el = new CubicCurveTo (
1039 struct.f0,
1040 struct.f1,
1041 struct.f2,
1042 struct.f3,
1043 struct.f4,
1044 struct.f5);
1045 } else if (type == PathIterator.SEG_CLOSE) {
1046 el = new ClosePath();
1047 } else {
1048 throw new IllegalStateException("Invalid element type: " + type);
1049 }
1050 helper.next();
1051 elements.add(el);
1052 }
1053
1054 return elements.toArray(new PathElement[elements.size()]);
1055 }
1056
1057 @Override public Filterable toFilterable(Image img) {
1058 return PrImage.create((com.sun.prism.Image) img.impl_getPlatformImage());
1059 }
1060
1061 @Override public FilterContext getFilterContext(Object config) {
1062 if (config == null || (!(config instanceof com.sun.glass.ui.Screen))) {
1063 return PrFilterContext.getDefaultInstance();
1064 }
1065 Screen screen = (Screen)config;
1066 return PrFilterContext.getInstance(screen);
1067 }
1068
1069 @Override public AbstractMasterTimer getMasterTimer() {
1070 return MasterTimer.getInstance();
1071 }
1072
1073 @Override public FontLoader getFontLoader() {
1074 return com.sun.javafx.font.PrismFontLoader.getInstance();
1075 }
1076
1077 @Override public TextLayoutFactory getTextLayoutFactory() {
1078 return com.sun.javafx.text.PrismTextLayoutFactory.getFactory();
1201 return clipboard;
1202 }
1203
1204 private GlassSystemMenu systemMenu = new GlassSystemMenu();
1205 @Override public TKSystemMenu getSystemMenu() {
1206 return systemMenu;
1207 }
1208
1209 @Override public TKClipboard getNamedClipboard(String name) {
1210 return null;
1211 }
1212
1213 @Override public void startDrag(TKScene scene, Set<TransferMode> tm, TKDragSourceListener l, Dragboard dragboard) {
1214 if (dragboard == null) {
1215 throw new IllegalArgumentException("dragboard should not be null");
1216 }
1217
1218 GlassScene view = (GlassScene)scene;
1219 view.setTKDragSourceListener(l);
1220
1221 QuantumClipboard gc = (QuantumClipboard)dragboard.impl_getPeer();
1222 gc.setSupportedTransferMode(tm);
1223 gc.flush();
1224
1225 // flush causes a modal DnD event loop, when we return, close the clipboard
1226 gc.close();
1227 }
1228
1229 @Override public void enableDrop(TKScene s, TKDropTargetListener l) {
1230
1231 assert s instanceof GlassScene;
1232
1233 GlassScene view = (GlassScene)s;
1234 view.setTKDropTargetListener(l);
1235 }
1236
1237 @Override public void registerDragGestureListener(TKScene s, Set<TransferMode> tm, TKDragGestureListener l) {
1238
1239 assert s instanceof GlassScene;
1240
1241 GlassScene view = (GlassScene)s;
|
112 import com.sun.javafx.tk.TKSystemMenu;
113 import com.sun.javafx.tk.Toolkit;
114 import com.sun.prism.BasicStroke;
115 import com.sun.prism.Graphics;
116 import com.sun.prism.GraphicsPipeline;
117 import com.sun.prism.PixelFormat;
118 import com.sun.prism.RTTexture;
119 import com.sun.prism.ResourceFactory;
120 import com.sun.prism.ResourceFactoryListener;
121 import com.sun.prism.Texture.WrapMode;
122 import com.sun.prism.impl.Disposer;
123 import com.sun.prism.impl.PrismSettings;
124 import com.sun.scenario.DelayedRunnable;
125 import com.sun.scenario.animation.AbstractMasterTimer;
126 import com.sun.scenario.effect.FilterContext;
127 import com.sun.scenario.effect.Filterable;
128 import com.sun.scenario.effect.impl.prism.PrFilterContext;
129 import com.sun.scenario.effect.impl.prism.PrImage;
130 import com.sun.javafx.logging.PulseLogger;
131 import static com.sun.javafx.logging.PulseLogger.PULSE_LOGGING_ENABLED;
132 import com.sun.javafx.scene.input.DragboardHelper;
133 import com.sun.prism.impl.ManagedResource;
134
135 public final class QuantumToolkit extends Toolkit {
136
137 public static final boolean verbose =
138 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("quantum.verbose"));
139
140 public static final boolean pulseDebug =
141 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean("quantum.pulse"));
142
143 private static final boolean multithreaded =
144 AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> {
145 // If it is not specified, or it is true, then it should
146 // be true. Otherwise it should be false.
147 String value = System.getProperty("quantum.multithreaded");
148 if (value == null) return true;
149 final boolean result = Boolean.parseBoolean(value);
150 if (verbose) {
151 System.out.println(result ? "Multi-Threading Enabled" : "Multi-Threading Disabled");
152 }
880 int cmi = 0;
881 if (paint.getCycleMethod() == CycleMethod.NO_CYCLE) {
882 cmi = com.sun.prism.paint.Gradient.PAD;
883 } else if (paint.getCycleMethod() == CycleMethod.REFLECT) {
884 cmi = com.sun.prism.paint.Gradient.REFLECT;
885 } else {
886 cmi = com.sun.prism.paint.Gradient.REPEAT;
887 }
888
889 // TODO: extract colors/offsets and pass them in directly...
890 List<com.sun.prism.paint.Stop> stops = convertStops(paint.getStops());
891 return new com.sun.prism.paint.RadialGradient(cx, cy, fa, fd,
892 (float)paint.getRadius(), null, paint.isProportional(), cmi, stops);
893 }
894
895 @Override
896 protected Object createImagePatternPaint(ImagePattern paint) {
897 if (paint.getImage() == null) {
898 return com.sun.prism.paint.Color.TRANSPARENT;
899 } else {
900 return new com.sun.prism.paint.ImagePattern(
901 (com.sun.prism.Image) Toolkit.getImageAccessor().getPlatformImage(paint.getImage()),
902 (float)paint.getX(),
903 (float)paint.getY(),
904 (float)paint.getWidth(),
905 (float)paint.getHeight(),
906 paint.isProportional(),
907 Toolkit.getPaintAccessor().isMutable(paint));
908 }
909 }
910
911 static BasicStroke tmpStroke = new BasicStroke();
912 private void initStroke(StrokeType pgtype, double strokewidth,
913 StrokeLineCap pgcap,
914 StrokeLineJoin pgjoin, float miterLimit,
915 float[] dashArray, float dashOffset)
916 {
917 int type;
918 if (pgtype == StrokeType.CENTERED) {
919 type = BasicStroke.TYPE_CENTERED;
920 } else if (pgtype == StrokeType.INSIDE) {
921 type = BasicStroke.TYPE_INNER;
1040 el = new CubicCurveTo (
1041 struct.f0,
1042 struct.f1,
1043 struct.f2,
1044 struct.f3,
1045 struct.f4,
1046 struct.f5);
1047 } else if (type == PathIterator.SEG_CLOSE) {
1048 el = new ClosePath();
1049 } else {
1050 throw new IllegalStateException("Invalid element type: " + type);
1051 }
1052 helper.next();
1053 elements.add(el);
1054 }
1055
1056 return elements.toArray(new PathElement[elements.size()]);
1057 }
1058
1059 @Override public Filterable toFilterable(Image img) {
1060 return PrImage.create((com.sun.prism.Image) Toolkit.getImageAccessor().getPlatformImage(img));
1061 }
1062
1063 @Override public FilterContext getFilterContext(Object config) {
1064 if (config == null || (!(config instanceof com.sun.glass.ui.Screen))) {
1065 return PrFilterContext.getDefaultInstance();
1066 }
1067 Screen screen = (Screen)config;
1068 return PrFilterContext.getInstance(screen);
1069 }
1070
1071 @Override public AbstractMasterTimer getMasterTimer() {
1072 return MasterTimer.getInstance();
1073 }
1074
1075 @Override public FontLoader getFontLoader() {
1076 return com.sun.javafx.font.PrismFontLoader.getInstance();
1077 }
1078
1079 @Override public TextLayoutFactory getTextLayoutFactory() {
1080 return com.sun.javafx.text.PrismTextLayoutFactory.getFactory();
1203 return clipboard;
1204 }
1205
1206 private GlassSystemMenu systemMenu = new GlassSystemMenu();
1207 @Override public TKSystemMenu getSystemMenu() {
1208 return systemMenu;
1209 }
1210
1211 @Override public TKClipboard getNamedClipboard(String name) {
1212 return null;
1213 }
1214
1215 @Override public void startDrag(TKScene scene, Set<TransferMode> tm, TKDragSourceListener l, Dragboard dragboard) {
1216 if (dragboard == null) {
1217 throw new IllegalArgumentException("dragboard should not be null");
1218 }
1219
1220 GlassScene view = (GlassScene)scene;
1221 view.setTKDragSourceListener(l);
1222
1223 QuantumClipboard gc = (QuantumClipboard) DragboardHelper.getPeer(dragboard);
1224 gc.setSupportedTransferMode(tm);
1225 gc.flush();
1226
1227 // flush causes a modal DnD event loop, when we return, close the clipboard
1228 gc.close();
1229 }
1230
1231 @Override public void enableDrop(TKScene s, TKDropTargetListener l) {
1232
1233 assert s instanceof GlassScene;
1234
1235 GlassScene view = (GlassScene)s;
1236 view.setTKDropTargetListener(l);
1237 }
1238
1239 @Override public void registerDragGestureListener(TKScene s, Set<TransferMode> tm, TKDragGestureListener l) {
1240
1241 assert s instanceof GlassScene;
1242
1243 GlassScene view = (GlassScene)s;
|