Skip to content
Snippets Groups Projects
Commit 6b1da343 authored by stepan's avatar stepan
Browse files

FastR Grid: implement L_validUnit

parent 0dcf6ed7
No related branches found
No related tags found
No related merge requests found
......@@ -87,6 +87,8 @@ public final class FastRGridExternalLookup {
return new LNewPage();
case "L_convert":
return LConvert.create();
case "L_validUnits":
return LValidUnit.create();
// Viewport management
case "L_upviewport":
......@@ -155,11 +157,6 @@ public final class FastRGridExternalLookup {
case "L_newpagerecording":
return new IgnoredGridExternal(RNull.instance);
// These methods do not use graphics system or any global state. For now,
// we can re-use the native implementation, which in the future should be rewritten
// to managed code.
case "L_validUnits":
return null;
default:
if (name.startsWith("L_")) {
throw RInternalError.shouldNotReachHere("Unimplemented grid external " + name);
......
/*
* This material is distributed under the GNU General Public License
* Version 2. You may review the terms of this license at
* http://www.gnu.org/licenses/gpl-2.0.html
*
* Copyright (C) 2001-3 Paul Murrell
* Copyright (c) 1998-2013, The R Core Team
* Copyright (c) 2017, Oracle and/or its affiliates
*
* All rights reserved.
*/
package com.oracle.truffle.r.library.fastrGrid;
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.notEmpty;
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue;
import java.util.HashMap;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
import com.oracle.truffle.r.runtime.RError.Message;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RIntVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
/**
* External builtin that converts the string representation of a unit, e.g. "cm", to internal
* numerical value. This values are then stored in special attribute "valid.unit".
*/
public abstract class LValidUnit extends RExternalBuiltinNode.Arg1 {
static {
Casts casts = new Casts(LValidUnit.class);
casts.arg(0).mustBe(stringValue(), Message.GENERIC, "'units' must be character").asStringVector().mustBe(notEmpty(), Message.GENERIC, "'units' must be of length > 0");
}
public static LValidUnit create() {
return LValidUnitNodeGen.create();
}
@Specialization
RIntVector convert(RAbstractStringVector units) {
int[] result = new int[units.getLength()];
for (int i = 0; i < units.getLength(); i++) {
result[i] = convertSingle(units.getDataAt(i));
}
return RDataFactory.createIntVector(result, RDataFactory.COMPLETE_VECTOR);
}
protected int convertSingle(String name) {
if (name.equals("npc")) {
// seems to be by far the most common unit
return Unit.NPC;
}
return convertSingleSlowPath(name);
}
@TruffleBoundary
private int convertSingleSlowPath(String name) {
Integer result = NamesHolder.NAMES.get(name);
if (result == null) {
error(Message.GENERIC, "invalid unit");
}
return result;
}
private static final class NamesHolder {
private static final HashMap<String, Integer> NAMES = new HashMap<>(30);
static {
NAMES.put("npc", Unit.NPC);
NAMES.put("cm", Unit.CM);
NAMES.put("inches", Unit.INCHES);
NAMES.put("lines", Unit.LINES);
NAMES.put("native", Unit.NATIVE);
NAMES.put("null", Unit.NULL);
NAMES.put("snpc", Unit.SNPC);
NAMES.put("mm", Unit.MM);
NAMES.put("points", Unit.POINTS);
NAMES.put("picas", Unit.PICAS);
NAMES.put("bigpts", Unit.BIGPOINTS);
NAMES.put("dida", Unit.DIDA);
NAMES.put("cicero", Unit.CICERO);
NAMES.put("scaledpts", Unit.SCALEDPOINTS);
NAMES.put("strwidth", Unit.STRINGWIDTH);
NAMES.put("strheight", Unit.STRINGHEIGHT);
NAMES.put("strascent", Unit.STRINGASCENT);
NAMES.put("strdescent", Unit.STRINGDESCENT);
NAMES.put("char", Unit.CHAR);
NAMES.put("grobx", Unit.GROBX);
NAMES.put("groby", Unit.GROBY);
NAMES.put("grobwidth", Unit.GROBWIDTH);
NAMES.put("grobheight", Unit.GROBHEIGHT);
NAMES.put("grobascent", Unit.GROBASCENT);
NAMES.put("grobdescent", Unit.GROBDESCENT);
NAMES.put("mylines", Unit.MYLINES);
NAMES.put("mychar", Unit.MYCHAR);
NAMES.put("mystrwidth", Unit.MYSTRINGWIDTH);
NAMES.put("mystrheight", Unit.MYSTRINGHEIGHT);
// Some pseudonyms
NAMES.put("centimetre", Unit.CM);
NAMES.put("centimetres", Unit.CM);
NAMES.put("centimeter", Unit.CM);
NAMES.put("centimeters", Unit.CM);
NAMES.put("in", Unit.INCHES);
NAMES.put("inch", Unit.INCHES);
NAMES.put("line", Unit.LINES);
NAMES.put("millimetre", Unit.MM);
NAMES.put("millimetres", Unit.MM);
NAMES.put("millimeter", Unit.MM);
NAMES.put("millimeters", Unit.MM);
NAMES.put("point", Unit.POINTS);
NAMES.put("pt", Unit.POINTS);
}
}
}
......@@ -63,17 +63,17 @@ public final class Unit {
static final String VALID_UNIT_ATTR = "valid.unit";
public static final int NPC = 0;
private static final int CM = 1;
public static final int CM = 1;
public static final int INCHES = 2;
private static final int LINES = 3;
public static final int LINES = 3;
public static final int NATIVE = 4;
private static final int NULL = 5; /* only used in layout specifications */
private static final int SNPC = 6;
private static final int MM = 7;
public static final int NULL = 5; /* only used in layout specifications */
public static final int SNPC = 6;
public static final int MM = 7;
/*
* Some units based on TeX's definition thereof
*/
private static final int POINTS = 8; /* 72.27 pt = 1 in */
public static final int POINTS = 8; /* 72.27 pt = 1 in */
public static final int PICAS = 9; /* 1 pc = 12 pt */
public static final int BIGPOINTS = 10; /* 72 bp = 1 in */
public static final int DIDA = 11; /* 1157 dd = 1238 pt */
......@@ -82,28 +82,28 @@ public final class Unit {
/*
* Some units which require an object to query for a value.
*/
private static final int STRINGWIDTH = 14;
private static final int STRINGHEIGHT = 15;
public static final int STRINGWIDTH = 14;
public static final int STRINGHEIGHT = 15;
public static final int STRINGASCENT = 16;
public static final int STRINGDESCENT = 17;
/*
* LINES now means multiples of the line height. This is multiples of the font size.
*/
private static final int CHAR = 18;
private static final int GROBX = 19;
private static final int GROBY = 20;
private static final int GROBWIDTH = 21;
private static final int GROBHEIGHT = 22;
public static final int CHAR = 18;
public static final int GROBX = 19;
public static final int GROBY = 20;
public static final int GROBWIDTH = 21;
public static final int GROBHEIGHT = 22;
public static final int GROBASCENT = 23;
private static final int GROBDESCENT = 24;
public static final int GROBDESCENT = 24;
private static final int LAST_NORMAL_UNIT = GROBDESCENT;
/*
* No longer used
*/
private static final int MYLINES = 103;
private static final int MYCHAR = 104;
private static final int MYSTRINGWIDTH = 105;
private static final int MYSTRINGHEIGHT = 106;
public static final int MYLINES = 103;
public static final int MYCHAR = 104;
public static final int MYSTRINGWIDTH = 105;
public static final int MYSTRINGHEIGHT = 106;
// null layout arithmetic mode
private static final int L_adding = 1;
......
......@@ -757,6 +757,7 @@ com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LUnsetVi
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPort.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridUtils.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/Unit.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LValidUnit.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPortLocation.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPortContext.java,gnu_r_murrel_core.copyright
com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridLinesNode.java,gnu_r_murrel_core.copyright
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment