diff --git a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java index 57c542e44..7acd77db2 100644 --- a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java +++ b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java @@ -52,6 +52,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private static final String VERSION_STR = "3.0.0"; private static final String SIZE_METHOD_NAME = "size"; + private static final String PIXEL_DENSITY_METHOD_NAME = "pixelDensity"; private static final String FULLSCREEN_METHOD_NAME = "fullScreen"; private String sketchName; @@ -73,8 +74,10 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private String sketchWidth; private String sketchHeight; private String sketchRenderer; + private String pixelDensity; private boolean sizeRequiresRewrite = false; + private boolean pixelDensityRequiresRewrite = false; private boolean sizeIsFullscreen = false; private RewriteResult headerResult; private RewriteResult footerResult; @@ -308,6 +311,10 @@ public class PdeParseTreeListener extends ProcessingBaseListener { if (SIZE_METHOD_NAME.equals(methodName) || FULLSCREEN_METHOD_NAME.equals(methodName)) { handleSizeCall(ctx); } + + if (PIXEL_DENSITY_METHOD_NAME.equals(methodName)) { + handlePixelDensityCall(ctx); + } } /** @@ -653,6 +660,35 @@ public class PdeParseTreeListener extends ProcessingBaseListener { } } + protected void handlePixelDensityCall(ParserRuleContext ctx) { + ParserRuleContext testCtx = ctx.getParent() + .getParent() + .getParent() + .getParent(); + + boolean isInGlobal = + testCtx instanceof ProcessingParser.StaticProcessingSketchContext; + + boolean isInSetup; + if (!isInGlobal) { + ParserRuleContext methodDeclaration = testCtx.getParent() + .getParent(); + + isInSetup = isMethodSetup(methodDeclaration); + } else { + isInSetup = false; + } + + ParseTree argsContext = ctx.getChild(2); + + if (isInGlobal || isInSetup) { + pixelDensity = argsContext.getChild(0).getText(); + delete(ctx.start, ctx.stop); + insertAfter(ctx.stop, "/* pixelDensity commented out by preprocessor */"); + pixelDensityRequiresRewrite = true; + } + } + /** * Determine if a method declaration is for setup. * @@ -979,35 +1015,43 @@ public class PdeParseTreeListener extends ProcessingBaseListener { protected void writeExtraFieldsAndMethods(PrintWriterWithEditGen classBodyWriter, RewriteResultBuilder resultBuilder) { - if (!sizeRequiresRewrite) { + if (!sizeRequiresRewrite && !pixelDensityRequiresRewrite) { return; } String settingsOuterTemplate = indent1 + "public void settings() { %s }"; - String settingsInner; - if (sizeIsFullscreen) { - String fullscreenInner = sketchRenderer == null ? "" : sketchRenderer; - settingsInner = String.format("fullScreen(%s);", fullscreenInner); - } else { + StringBuilder settingsInner = new StringBuilder(); - if (sketchWidth.isEmpty() || sketchHeight.isEmpty()) { - return; + if (sizeRequiresRewrite) { + if (sizeIsFullscreen) { + String fullscreenInner = sketchRenderer == null ? "" : sketchRenderer; + settingsInner.append(String.format("fullScreen(%s);", fullscreenInner)); + } else { + + if (sketchWidth.isEmpty() || sketchHeight.isEmpty()) { + return; + } + + StringJoiner argJoiner = new StringJoiner(","); + argJoiner.add(sketchWidth); + argJoiner.add(sketchHeight); + + if (sketchRenderer != null) { + argJoiner.add(sketchRenderer); + } + + settingsInner.append(String.format("size(%s);", argJoiner.toString())); } + } - StringJoiner argJoiner = new StringJoiner(","); - argJoiner.add(sketchWidth); - argJoiner.add(sketchHeight); - - if (sketchRenderer != null) { - argJoiner.add(sketchRenderer); - } - - settingsInner = String.format("size(%s);", argJoiner.toString()); + if (pixelDensityRequiresRewrite) { + settingsInner.append("\n"); + settingsInner.append(String.format("pixelDensity(%s);", pixelDensity)); } - String newCode = String.format(settingsOuterTemplate, settingsInner); + String newCode = String.format(settingsOuterTemplate, settingsInner.toString()); classBodyWriter.addEmptyLine(); classBodyWriter.addCodeLine(newCode); diff --git a/java/test/processing/mode/java/ParserTests.java b/java/test/processing/mode/java/ParserTests.java index 8fac2bcd6..377957603 100644 --- a/java/test/processing/mode/java/ParserTests.java +++ b/java/test/processing/mode/java/ParserTests.java @@ -378,6 +378,16 @@ public class ParserTests { expectGood("packageTest", true, Optional.of("test.subtest")); } + @Test + public void testStaticPixelDensity() { + expectGood("staticpixeldensity"); + } + + @Test + public void testParamPixelDensity() { + expectGood("parampixeldensity"); + } + private static boolean compile(String id, String program) { // Create compilable AST to get syntax problems CompilationUnit compilableCU = JdtCompilerUtil.makeAST( diff --git a/java/test/resources/parampixeldensity.expected b/java/test/resources/parampixeldensity.expected new file mode 100644 index 000000000..616b000ba --- /dev/null +++ b/java/test/resources/parampixeldensity.expected @@ -0,0 +1,44 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; + +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class parampixeldensity extends PApplet { + + public void setup() { + /* size commented out by preprocessor */; + // Pulling the display's density dynamically + /* pixelDensity commented out by preprocessor */; + noStroke(); + } + + public void draw() { + background(0); + ellipse(30, 48, 36, 36); + ellipse(70, 48, 36, 36); + } + + public void settings() { + size(100,100); + pixelDensity(displayDensity()); + } + + static public void main(String[] passedArgs) { + String[] appletArgs = new String[] { "parampixeldensity" }; + if (passedArgs != null) { + PApplet.main(concat(appletArgs, passedArgs)); + } else { + PApplet.main(appletArgs); + } + } + +} diff --git a/java/test/resources/parampixeldensity.pde b/java/test/resources/parampixeldensity.pde new file mode 100644 index 000000000..ff0f8376c --- /dev/null +++ b/java/test/resources/parampixeldensity.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + // Pulling the display's density dynamically + pixelDensity(displayDensity()); + noStroke(); +} + +void draw() { + background(0); + ellipse(30, 48, 36, 36); + ellipse(70, 48, 36, 36); +} diff --git a/java/test/resources/staticpixeldensity.expected b/java/test/resources/staticpixeldensity.expected new file mode 100644 index 000000000..58267bf79 --- /dev/null +++ b/java/test/resources/staticpixeldensity.expected @@ -0,0 +1,41 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; + +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class staticpixeldensity extends PApplet { + + public void setup() { +/* size commented out by preprocessor */; +/* pixelDensity commented out by preprocessor */; +noStroke(); +background(0); +ellipse(30, 48, 36, 36); +ellipse(70, 48, 36, 36); + + noLoop(); + } + + public void settings() { + size(100,100); + pixelDensity(2); + } + + static public void main(String[] passedArgs) { + String[] appletArgs = new String[] { "staticpixeldensity" }; + if (passedArgs != null) { + PApplet.main(concat(appletArgs, passedArgs)); + } else { + PApplet.main(appletArgs); + } + } +} diff --git a/java/test/resources/staticpixeldensity.pde b/java/test/resources/staticpixeldensity.pde new file mode 100644 index 000000000..5e2e09899 --- /dev/null +++ b/java/test/resources/staticpixeldensity.pde @@ -0,0 +1,6 @@ +size(100, 100); +pixelDensity(2); +noStroke(); +background(0); +ellipse(30, 48, 36, 36); +ellipse(70, 48, 36, 36);