diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java new file mode 100644 index 0000000000000000000000000000000000000000..06f33e2aa39c73c53d369278b7485a04ef376a1d --- /dev/null +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.truffle.r.library.fastrGrid; + +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean; + +import java.util.Arrays; + +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.library.fastrGrid.DisplayListFactory.LGetDisplayListElementNodeGen; +import com.oracle.truffle.r.library.fastrGrid.DisplayListFactory.LSetDisplayListOnNodeGen; +import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode; +import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RList; +import com.oracle.truffle.r.runtime.data.RNull; + +public class DisplayList { + private static final int INITIAL_DL_SIZE = 100; + + static RList createInitialDisplayList() { + Object[] data = new Object[INITIAL_DL_SIZE]; + Arrays.fill(data, 0, data.length, RNull.instance); + RList list = RDataFactory.createList(data); + list.makeSharedPermanent(); + return list; + } + + static void initDisplayList(GridState gridState) { + RList list = createInitialDisplayList(); + list.setDataAt(list.getInternalStore(), 0, gridState.getViewPort()); + gridState.setDisplayList(list); + gridState.setDisplayListIndex(1); + } + + public abstract static class LGetDisplayListElement extends RExternalBuiltinNode.Arg1 { + static { + Casts casts = new Casts(LGetDisplayListElement.class); + casts.arg(0).asIntegerVector().findFirst(); + } + + public static LGetDisplayListElement create() { + return LGetDisplayListElementNodeGen.create(); + } + + @Specialization + @TruffleBoundary + Object getDLElement(int index) { + return GridContext.getContext().getGridState().getDisplayList().getDataAt(index); + } + } + + public abstract static class LSetDisplayListOn extends RExternalBuiltinNode.Arg1 { + static { + Casts casts = new Casts(LSetDisplayListOn.class); + casts.arg(0).asLogicalVector().findFirst().map(toBoolean()); + } + + public static LSetDisplayListOn create() { + return LSetDisplayListOnNodeGen.create(); + } + + @Specialization + @TruffleBoundary + byte setDLOn(boolean value) { + GridState gridState = GridContext.getContext().getGridState(); + boolean result = gridState.isDisplayListOn(); + gridState.setIsDisplayListOn(value); + return RRuntime.asLogical(result); + } + } + + public static final class LInitDisplayList extends RExternalBuiltinNode.Arg0 { + static { + Casts.noCasts(LInitDisplayList.class); + } + + @Override + @TruffleBoundary + public Object execute() { + GridState gridState = GridContext.getContext().getGridState(); + initDisplayList(gridState); + return RNull.instance; + } + + } +} diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java index 354cc207472ef0334c9b04627f23b0179e87e366..dc2ca5e33d64d34c249f78c8ce9640e45aab3b6b 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java @@ -22,6 +22,9 @@ */ package com.oracle.truffle.r.library.fastrGrid; +import com.oracle.truffle.r.library.fastrGrid.DisplayList.LGetDisplayListElement; +import com.oracle.truffle.r.library.fastrGrid.DisplayList.LInitDisplayList; +import com.oracle.truffle.r.library.fastrGrid.DisplayList.LSetDisplayListOn; import com.oracle.truffle.r.library.fastrGrid.grDevices.DevCurr; import com.oracle.truffle.r.library.fastrGrid.grDevices.DevHoldFlush; import com.oracle.truffle.r.library.fastrGrid.grDevices.DevOff; @@ -34,7 +37,6 @@ import com.oracle.truffle.r.runtime.RInternalCode; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.context.RContext; -import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; @@ -129,20 +131,28 @@ public final class FastRGridExternalLookup { case "L_initGPar": return new LInitGPar(); - // Display list stuff: not implemented atm + // Display list stuff case "L_getDisplayList": - return new IgnoredGridExternal(RDataFactory.createList()); + return new GridStateGetNode(GridState::getDisplayList); + case "L_setDisplayList": + return GridStateSetNode.create((state, val) -> state.setDisplayList((RList) val)); case "L_getDLindex": - return new IgnoredGridExternal(0); + return new GridStateGetNode(GridState::getDisplayListIndex); + case "L_setDLindex": + return GridStateSetNode.create((state, val) -> state.setDisplayListIndex(RRuntime.asInteger(val))); + case "L_setDLelt": + return GridStateSetNode.create(GridState::setDisplayListElement); + case "L_getDLelt": + return LGetDisplayListElement.create(); + case "L_setDLon": + return LSetDisplayListOn.create(); case "L_getDLon": + return new GridStateGetNode(state -> RRuntime.asLogical(state.isDisplayListOn())); case "L_getEngineDLon": return new IgnoredGridExternal(RRuntime.LOGICAL_FALSE); case "L_initDisplayList": + return new LInitDisplayList(); case "L_newpagerecording": - case "L_setDisplayList": - case "L_setDLelt": - case "L_setDLindex": - case "L_setDLon": return new IgnoredGridExternal(RNull.instance); // These methods do not use graphics system or any global state. For now, diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java index deab204f3b8ce9f20b3608108a34ce0c26fe3780..321e0a022bae4fcc9d5ee5154af2c5e3af2e28fe 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java @@ -42,6 +42,39 @@ public final class GridState { return devHoldCount; } + public RList getDisplayList() { + if (devState.displayList == null) { + devState.displayList = DisplayList.createInitialDisplayList(); + } + return devState.displayList; + } + + public void setDisplayList(RList newList) { + newList.makeSharedPermanent(); + devState.displayList = newList; + } + + public void setDisplayListElement(Object element) { + Object[] data = devState.displayList.getDataWithoutCopying(); + data[devState.displayListIndex] = element; + } + + public boolean isDisplayListOn() { + return devState.isDisplayListOn; + } + + public void setIsDisplayListOn(boolean flag) { + devState.isDisplayListOn = flag; + } + + public int getDisplayListIndex() { + return devState.displayListIndex; + } + + public void setDisplayListIndex(int newValue) { + devState.displayListIndex = newValue; + } + public void init(REnvironment gridEnv) { this.gridEnv = gridEnv; this.currentGrob = RNull.instance; @@ -112,5 +145,8 @@ public final class GridState { private RList viewPort; private double scale = 1; private int devHoldCount; + private boolean isDisplayListOn = true; + private RList displayList; + private int displayListIndex = 0; } } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java index a6314dff2c06b37db7b29a26f97f4fb674ea078c..d24bea0560f6858231683a6e94b23cece372a147 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java @@ -54,7 +54,7 @@ final class LGridDirty extends RExternalBuiltinNode { if (gridState.getViewPort() == null) { gridState.setViewPort(initViewPort.execute(frame)); } - + DisplayList.initDisplayList(gridState); return RNull.instance; } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java index 90a2dcd6e941b70aa7f45f1dd1cefecc4c6eb6a3..f893a5b02bc3bc37f1c998d71c265d50b6c86b6c 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java @@ -22,8 +22,6 @@ */ package com.oracle.truffle.r.library.fastrGrid.device; -import static com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.INCH_TO_POINTS_FACTOR; - /** * Abstract device that can draw primitive shapes and text. All sizes and coordinates are specified * in inches and angles in radians unless stated otherwise. diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java index 6e31f1f417c26d9f791b73dd9e540838c93bc0e5..93c4f700aa9bc9cbcfdc2b32e4e8ba48e4447063 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java @@ -58,6 +58,7 @@ public final class JFrameDevice extends Graphics2DDevice { public static JFrameDevice create() { FastRFrame frame = new FastRFrame(); frame.setVisible(true); + frame.pack(); Graphics2D graphics = (Graphics2D) frame.getGraphics(); defaultInitGraphics(graphics); return new JFrameDevice(frame, graphics, true); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java index f1fab85632025eb617b80a6347c691d6a4f8a679..5048fe9411bad215e5a62392976c45f03821b8ba 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java @@ -22,8 +22,6 @@ */ package com.oracle.truffle.r.library.fastrGrid.grDevices; -import java.io.IOException; - import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.r.library.fastrGrid.GridContext; import com.oracle.truffle.r.library.fastrGrid.device.awt.BufferedImageDevice;