Skip to content

Commit

Permalink
Merge pull request #60 from processing/fix_static_pixel_density
Browse files Browse the repository at this point in the history
Resolve rewrite of pixelDensity to settings.
  • Loading branch information
benfry authored Jan 20, 2020
2 parents 624e907 + 17e2825 commit 50f06bf
Show file tree
Hide file tree
Showing 6 changed files with 173 additions and 16 deletions.
76 changes: 60 additions & 16 deletions java/src/processing/mode/java/preproc/PdeParseTreeListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -308,6 +311,10 @@ public void exitMethodCall(ProcessingParser.MethodCallContext ctx) {
if (SIZE_METHOD_NAME.equals(methodName) || FULLSCREEN_METHOD_NAME.equals(methodName)) {
handleSizeCall(ctx);
}

if (PIXEL_DENSITY_METHOD_NAME.equals(methodName)) {
handlePixelDensityCall(ctx);
}
}

/**
Expand Down Expand Up @@ -653,6 +660,35 @@ protected void handleSizeCall(ParserRuleContext ctx) {
}
}

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.
*
Expand Down Expand Up @@ -979,35 +1015,43 @@ protected void writeStaticSketchFooter(PrintWriterWithEditGen footerWriter,
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);

StringJoiner argJoiner = new StringJoiner(",");
argJoiner.add(sketchWidth);
argJoiner.add(sketchHeight);
if (sketchRenderer != null) {
argJoiner.add(sketchRenderer);
}

if (sketchRenderer != null) {
argJoiner.add(sketchRenderer);
settingsInner.append(String.format("size(%s);", argJoiner.toString()));
}
}

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);
Expand Down
10 changes: 10 additions & 0 deletions java/test/processing/mode/java/ParserTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,16 @@ public void testPackage() {
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(
Expand Down
44 changes: 44 additions & 0 deletions java/test/resources/parampixeldensity.expected
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions java/test/resources/parampixeldensity.pde
Original file line number Diff line number Diff line change
@@ -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);
}
41 changes: 41 additions & 0 deletions java/test/resources/staticpixeldensity.expected
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
6 changes: 6 additions & 0 deletions java/test/resources/staticpixeldensity.pde
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
size(100, 100);
pixelDensity(2);
noStroke();
background(0);
ellipse(30, 48, 36, 36);
ellipse(70, 48, 36, 36);

0 comments on commit 50f06bf

Please sign in to comment.