Need expression parser else intractable

This commit is contained in:
Guillaume Piolat
2025-03-22 11:33:05 +01:00
parent 80af62099a
commit 37edfa3af9
3 changed files with 34 additions and 22 deletions

View File

@@ -5,7 +5,8 @@
"dependencies":
{
"gamut": "~>3.0"
"gamut": "~>3.0",
"expression-plus": "~>1.0"
},
"subConfigurations":

View File

@@ -2,12 +2,16 @@
"input-size": "3984x2160",
"output-size": "3456x960",
"default-size": "48x48",
"default-size": "288x240",
"copyRects": [
{ "from": "0,0-48x48", "to": "0,0" },
{ "from": "0,0-48x48", "to": "0,0" }
{ "from": "62+240*0,224-(240-62)x168", "to": "288*0,0" },
{ "from": "62+240*1,224-(240-62)x168", "to": "288*1,0" },
{ "from": "62+240*1,224-(240-62)x168", "to": "288*2,0" },
{ "from": "62+240*1,224-(240-62)x168", "to": "288*3,0" },
{ "from": "62+240*1,224-(240-62)x168", "to": "288*4,0" },
{ "from": "62+240*1,224-(240-62)x168", "to": "288*5,0" }
]
}

View File

@@ -6,7 +6,7 @@ import std.file;
import std.conv;
import std.string;
import gamut;
import expression;
void usage()
{
@@ -109,9 +109,10 @@ void processFile(string inputPath, string outputPath, string pattern)
input.convertTo(PixelType.rgba8);
Size defaultSize = parseSize(patternFile, "default-size", Size(16, 16));
Size inputSize = parseSize(patternFile, "input-size");
Size outputSize = parseSize(patternFile, "output-size");
Size inputSize = parseSize(patternFile, "input-size", defaultSize);
Size outputSize = parseSize(patternFile, "output-size", defaultSize);
if (inputSize.w != input.width || inputSize.h != input.height)
throw new Exception("input size mismatch");
@@ -119,7 +120,6 @@ void processFile(string inputPath, string outputPath, string pattern)
Image output;
output.create(outputSize.w, outputSize.h, PixelType.rgba8);
Size defaultSize = parseSize(patternFile, "default-size");
void copyRect(Rect src, Rect dst)
{
@@ -194,36 +194,36 @@ void rectInsideImage(ref Image i, Rect r)
throw new Exception("Rectangle exceeds height of image");
}
Point parsePoint(JSONValue parent, string keyName)
Point parsePoint(JSONValue parent, string keyName, Size defaultSize)
{
string r = parent[keyName].str;
return parsePoint(r);
return parsePoint(r, defaultSize);
}
Point parsePoint(string r)
Point parsePoint(string r, Size defaultSize)
{
r = strip(r);
int cPos = cast(int) r.indexOf(",");
if (cPos == -1)
throw new Exception("Point should follow this in format: 4,5");
int x = to!int(r[0..cPos]);
int y = to!int(r[cPos+1..$]);
int x = parseIntegerExpression(r[0..cPos], defaultSize);
int y = parseIntegerExpression(r[cPos+1..$], defaultSize);
return Point(x, y);
}
Size parseSize(JSONValue parent, string keyName)
Size parseSize(JSONValue parent, string keyName, Size defaultSize)
{
return parseSize(parent[keyName].str);
return parseSize(parent[keyName].str, defaultSize);
}
Size parseSize(string r)
Size parseSize(string r, Size defaultSize)
{
r = strip(r);
int xPos = cast(int) r.indexOf("x");
if (xPos == -1)
throw new Exception("Size should follow this in format: 48x48");
int w = to!int(r[0..xPos]);
int h = to!int(r[xPos+1..$]);
int w = parseIntegerExpression(r[0..xPos], defaultSize);
int h = parseIntegerExpression(r[xPos+1..$], defaultSize);
return Size(w, h);
}
@@ -245,16 +245,23 @@ Rect parseRect(string r, Size defaultSize)
if (mPos == -1)
{
pos = parsePoint(r);
pos = parsePoint(r, defaultSize);
size = defaultSize;
}
else
{
pos = parsePoint(r[0..mPos]);
size = parseSize(r[mPos+1..$]);
pos = parsePoint(r[0..mPos], defaultSize);
size = parseSize(r[mPos+1..$], defaultSize);
}
return Rect(pos, size);
}
int parseIntegerExpression(string source,
Size defaultSize)
{
auto e = compileExpression!int(source);
//e["TX"] = defaultSize.w;
//e["TY"] = defaultSize.h;
return e();
}