srecord noeq GazelleVScript(S text) { LS tok; class Run is Steppable { ListAndIndex ptr; // main variables settable IBWIntegralImage integralImage; settable BWImage bwImage; *() { parse(); ptr = ListAndIndex(tok, 1); } public bool step() { S token = ptr!; if (token == null) false; next(); if (isInteger(token)) { int i = parseInt(token); S token2 = tpp(); if (eqic(token2, "p")) scaleToHeight(i); else if (eqic(token2, "c")) posterize(i); else warn("Unknown token: " + token); } else { warn("Unknown token: " + token); } true; } S tpp() { var token = ptr!; next(); ret token; } void next { if (!ptr.atEnd()) ptr = ptr.plus(2); } // operations void scaleToHeight(int pixelRows) { pixelRows = min(pixelRows, 512); if (integralImage == null) ret with warn("No integral image to scale down"); bwImage = scaledBWImageFromBWIntegralImage_withMeta(pixelRows, integralImage); } void posterize(int colors) { colors = clamp(colors, 2, 256); if (bwImage == null) ret with warn("No image to posterize"); else bwImage = posterizeBWImage_withMeta(colors, bwImage); } // end of operations O result() { ret or(bwImage, integralImage); } run { stepAll(this); } } void parse() { tok if null = javaTok(text); } }