81 std::cerr <<
"Usage: " <<
argv[0] <<
" <image file> <width> <height> <exprFile>" << std::endl;
88 size_t width = std::strtoul(
argv[2],
nullptr, 10);
89 size_t height = std::strtoul(
argv[3],
nullptr, 10);
91 std::cerr <<
"invalid width/height" << std::endl;
97 std::cerr <<
"Cannot read file " <<
exprFile << std::endl;
100 std::string
exprStr((std::istreambuf_iterator<char>(
istream)), std::istreambuf_iterator<char>());
104 expr.vars[
"u"] = ImageSynthExpr::Var(0.);
105 expr.vars[
"v"] = ImageSynthExpr::Var(0.);
106 expr.vars[
"w"] = ImageSynthExpr::Var(
width);
107 expr.vars[
"h"] = ImageSynthExpr::Var(
height);
110 bool valid = expr.isValid();
112 std::cerr <<
"Invalid expression " << std::endl;
113 std::cerr << expr.parseError() << std::endl;
116 if (!expr.returnType().isFP(3)) {
117 std::cerr <<
"Expected color FP[3] got type " << expr.returnType().toString() << std::endl;
122 std::cerr <<
"Evaluating expresion...from " <<
exprFile << std::endl;
129 double &u = expr.vars[
"u"].val;
130 double &v = expr.vars[
"v"].val;
131 for (
size_t row {}; row <
height; row++) {
137 const double *
result = expr.evalFP();
149 std::cerr <<
"Writing image..." <<
imageFile << std::endl;
150 std::unique_ptr<std::FILE,
decltype(&std::fclose)> fp {
fopen(
imageFile,
"wb"), &std::fclose};