From 6650c08be84a33f7df746aa375f142dfa0c7d79f Mon Sep 17 00:00:00 2001 From: stepan <stepan.sindelar@oracle.com> Date: Thu, 23 Mar 2017 14:53:59 +0100 Subject: [PATCH] FastR Grid: support font family and style --- .../truffle/r/library/fastrGrid/GPar.java | 15 ++++++- .../truffle/r/library/fastrGrid/LPoints.java | 10 +++++ .../fastrGrid/device/DrawingContext.java | 32 +++++++++++++ .../fastrGrid/device/JFrameDevice.java | 45 ++++++++++++++++--- 4 files changed, 95 insertions(+), 7 deletions(-) diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java index 6f69df073c..04932a5a8b 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java @@ -64,7 +64,8 @@ public final class GPar { private static final int GP_LINEJOIN = 12; private static final int GP_LINEMITRE = 13; private static final int GP_LEX = 14; - private static final int GP_FONTFACE = 15; + + // Note: there is last slot "fontface" which is either unused at all, or only used in R code private static final int GP_LENGTH = 16; private static final String[] NAMES = new String[]{ "fill", @@ -82,7 +83,7 @@ public final class GPar { "linejoin", "linemitre", "lex", - "fontface" // TODO: could not find this name in grid sources + "fontface" }; private static final RStringVector NAMES_VECTOR = (RStringVector) RDataFactory.createStringVector(NAMES, RDataFactory.COMPLETE_VECTOR).makeSharedPermanent(); @@ -169,6 +170,16 @@ public final class GPar { return asDouble(data[GP_FONTSIZE]) * asDouble(data[GP_CEX]); } + @Override + public GridFontStyle getFontStyle() { + return GridFontStyle.fromInt(RRuntime.asInteger(data[GP_FONT])); + } + + @Override + public String getFontFamily() { + return RRuntime.asString(data[GP_FONTFAMILY]); + } + @Override public double getLineHeight() { return asDouble(data[GP_LINEHEIGHT]); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java index d4b71e0a5b..51747552cb 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java @@ -168,6 +168,16 @@ public abstract class LPoints extends RExternalBuiltinNode.Arg4 { return inner.getFontSize(); } + @Override + public GridFontStyle getFontStyle() { + return inner.getFontStyle(); + } + + @Override + public String getFontFamily() { + return inner.getFontFamily(); + } + @Override public double getLineHeight() { return inner.getLineHeight(); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java index b3baf6db3c..4ff84b7777 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java @@ -29,6 +29,10 @@ package com.oracle.truffle.r.library.fastrGrid.device; public interface DrawingContext { double INCH_TO_POINTS_FACTOR = 72.27; + String FONT_FAMILY_MONO = "mono"; + String FONT_FAMILY_SANS = "sans"; + String FONT_FAMILY_SERIF = "serif"; + enum GridLineType { // The order is important! BLANK, @@ -51,6 +55,25 @@ public interface DrawingContext { } } + enum GridFontStyle { + PLAIN, + BOLD, + ITALIC, + BOLDITALIC, + /** + * Supposed to be symbol font in Adobe symbol encoding. + */ + SYMBOL; + + /** + * Return enum's value corresponding to R's value. + */ + public static GridFontStyle fromInt(int num) { + assert num > 0 && num <= SYMBOL.ordinal() + 1; + return values()[num - 1]; + } + } + GridLineType getLineType(); /** @@ -65,6 +88,15 @@ public interface DrawingContext { */ double getFontSize(); + GridFontStyle getFontStyle(); + + /** + * Gets the font family name. The standard values that any device must implement are "serif", + * "sans" and "mono". On top of that the device can recognize name of any font that it can + * support. + */ + String getFontFamily(); + /** * Gets the height of a line in multiplies of the base line height. */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java index 2ac24f74a6..cb0f0a6462 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java @@ -28,6 +28,7 @@ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.HeadlessException; @@ -46,6 +47,7 @@ import java.util.function.Supplier; import javax.swing.JFrame; import javax.swing.JPanel; +import com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.GridFontStyle; import com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.GridLineType; import com.oracle.truffle.r.runtime.RInternalError; @@ -116,7 +118,7 @@ public class JFrameDevice implements GridDevice { tr.translate((float) (leftX * POINTS_IN_INCH), (float) (currentFrame.getContentPane().getHeight() - bottomY * POINTS_IN_INCH)); tr.rotate(-rotationAnticlockWise); graphics.setTransform(tr); - setFontSize(ctx); + setFont(ctx); graphics.drawString(text, 0, 0); return null; }); @@ -136,7 +138,7 @@ public class JFrameDevice implements GridDevice { public double getStringWidth(DrawingContext ctx, String text) { setContext(ctx); return noTranform(() -> { - setFontSize(ctx); + setFont(ctx); int swingUnits = graphics.getFontMetrics(graphics.getFont()).stringWidth(text); return swingUnits / POINTS_IN_INCH; }); @@ -146,7 +148,7 @@ public class JFrameDevice implements GridDevice { public double getStringHeight(DrawingContext ctx, String text) { setContext(ctx); return noTranform(() -> { - setFontSize(ctx); + setFont(ctx); int swingUnits = graphics.getFont().getSize(); return swingUnits / POINTS_IN_INCH; }); @@ -181,9 +183,42 @@ public class JFrameDevice implements GridDevice { graphics.setStroke(fromGridLineType(ctx.getLineType())); } - private void setFontSize(DrawingContext ctx) { + private void setFont(DrawingContext ctx) { float fontSize = (float) ((ctx.getFontSize() / INCH_TO_POINTS_FACTOR) * POINTS_IN_INCH); - graphics.setFont(graphics.getFont().deriveFont(fontSize)); + Font font = new Font(getFontName(ctx.getFontFamily()), getAwtFontStyle(ctx.getFontStyle()), 1).deriveFont(fontSize); + graphics.setFont(font); + } + + private String getFontName(String gridFontFamily) { + if (gridFontFamily == null) { + return null; + } + switch (gridFontFamily) { + case DrawingContext.FONT_FAMILY_MONO: + return Font.MONOSPACED; + case DrawingContext.FONT_FAMILY_SANS: + return Font.SANS_SERIF; + case DrawingContext.FONT_FAMILY_SERIF: + return Font.SERIF; + case "": + return null; + } + return gridFontFamily; + } + + private int getAwtFontStyle(GridFontStyle fontStyle) { + switch (fontStyle) { + case PLAIN: + return Font.PLAIN; + case BOLD: + return Font.BOLD; + case ITALIC: + return Font.ITALIC; + case BOLDITALIC: + return Font.BOLD | Font.ITALIC; + default: + throw RInternalError.shouldNotReachHere("unexpected value of GridFontStyle enum"); + } } private <T> T noTranform(Supplier<T> action) { -- GitLab