Merge pull request #60 from processing/fix_static_pixel_density

Resolve rewrite of pixelDensity to settings.
This commit is contained in:
Ben Fry
2020-01-20 14:59:05 -05:00
committed by GitHub
6 changed files with 175 additions and 18 deletions
@@ -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);
@@ -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(
@@ -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);
}
}
}
+12
View File
@@ -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);
}
@@ -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);
}
}
}
@@ -0,0 +1,6 @@
size(100, 100);
pixelDensity(2);
noStroke();
background(0);
ellipse(30, 48, 36, 36);
ellipse(70, 48, 36, 36);