mirror of https://github.com/GNOME/gimp.git
199 lines
4.0 KiB
C
199 lines
4.0 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "exprtree.h"
|
|
#include "builtins.h"
|
|
|
|
extern double currentX,
|
|
currentY,
|
|
currentR,
|
|
currentA;
|
|
extern int imageWidth,
|
|
imageHeight;
|
|
extern int usesRA;
|
|
extern int intersamplingEnabled;
|
|
|
|
exprtree*
|
|
make_number (double num)
|
|
{
|
|
exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
|
|
|
|
tree->type = EXPR_NUMBER;
|
|
tree->val.number = num;
|
|
|
|
tree->next = 0;
|
|
|
|
return tree;
|
|
}
|
|
|
|
exprtree*
|
|
make_var (char *name)
|
|
{
|
|
exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
|
|
|
|
if (strcmp(name, "x") == 0)
|
|
tree->type = EXPR_VAR_X;
|
|
else if (strcmp(name, "y") == 0)
|
|
tree->type = EXPR_VAR_Y;
|
|
else if (strcmp(name, "r") == 0)
|
|
{
|
|
tree->type = EXPR_VAR_R;
|
|
usesRA = 1;
|
|
}
|
|
else if (strcmp(name, "a") == 0)
|
|
{
|
|
tree->type = EXPR_VAR_A;
|
|
usesRA = 1;
|
|
}
|
|
else if (strcmp(name, "W") == 0)
|
|
tree->type = EXPR_VAR_W;
|
|
else if (strcmp(name, "H") == 0)
|
|
tree->type = EXPR_VAR_H;
|
|
else if (strcmp(name, "R") == 0)
|
|
tree->type = EXPR_VAR_BIG_R;
|
|
else if (strcmp(name, "X") == 0)
|
|
tree->type = EXPR_VAR_BIG_X;
|
|
else if (strcmp(name, "Y") == 0)
|
|
tree->type = EXPR_VAR_BIG_Y;
|
|
else
|
|
{
|
|
tree->type = EXPR_NUMBER;
|
|
tree->val.number = 0.0;
|
|
}
|
|
|
|
tree->next = 0;
|
|
|
|
return tree;
|
|
}
|
|
|
|
exprtree*
|
|
make_operator (int type, exprtree *left, exprtree *right)
|
|
{
|
|
exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
|
|
|
|
tree->type = type;
|
|
tree->val.operator.left = left;
|
|
tree->val.operator.right = right;
|
|
|
|
tree->next = 0;
|
|
|
|
return tree;
|
|
}
|
|
|
|
exprtree*
|
|
make_function (char *name, exprtree *args)
|
|
{
|
|
exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
|
|
|
|
if (strcmp(name, "if") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_if;
|
|
tree->val.func.numArgs = 3;
|
|
}
|
|
else if (strcmp(name, "sin") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_sin;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "cos") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_cos;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "tan") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_tan;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "asin") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_asin;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "acos") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_acos;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "atan") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_atan;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "sign") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_sign;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else if (strcmp(name, "min") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_min;
|
|
tree->val.func.numArgs = 2;
|
|
}
|
|
else if (strcmp(name, "max") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_max;
|
|
tree->val.func.numArgs = 2;
|
|
}
|
|
else if (strcmp(name, "inintv") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_inintv;
|
|
tree->val.func.numArgs = 3;
|
|
}
|
|
else if (strcmp(name, "rand") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_rand;
|
|
tree->val.func.numArgs = 2;
|
|
}
|
|
else if (strcmp(name, "origValXY") == 0)
|
|
{
|
|
if (intersamplingEnabled)
|
|
tree->val.func.routine = builtin_origValXYIntersample;
|
|
else
|
|
tree->val.func.routine = builtin_origValXY;
|
|
tree->val.func.numArgs = 2;
|
|
}
|
|
else if (strcmp(name, "origValRA") == 0)
|
|
{
|
|
if (intersamplingEnabled)
|
|
tree->val.func.routine = builtin_origValRAIntersample;
|
|
else
|
|
tree->val.func.routine = builtin_origValRA;
|
|
tree->val.func.numArgs = 2;
|
|
}
|
|
else if (strcmp(name, "grayColor") == 0)
|
|
{
|
|
tree->val.func.routine = builtin_grayColor;
|
|
tree->val.func.numArgs = 1;
|
|
}
|
|
else
|
|
{
|
|
tree->type = EXPR_NUMBER;
|
|
tree->val.number = 0.0;
|
|
|
|
tree->next = 0;
|
|
|
|
return tree;
|
|
}
|
|
|
|
tree->type = EXPR_FUNC;
|
|
tree->val.func.args = args;
|
|
|
|
tree->next = 0;
|
|
|
|
return tree;
|
|
}
|
|
|
|
exprtree*
|
|
arglist_append (exprtree *list1, exprtree *list2)
|
|
{
|
|
exprtree *tree = list1;
|
|
|
|
while (tree->next != 0)
|
|
tree = tree->next;
|
|
|
|
tree->next = list2;
|
|
|
|
return list1;
|
|
}
|