#include "regmach.h"
+#include <float.h>
/*#define DEBUG*/
#ifdef DEBUG
#define DBG(x)
#endif
+static float MAX_EXP_ARG; /* = log(DBL_MAX); */
+
+
/* these functions currently assume RGB images - there seems to be some
support for other color spaces, but I can't tell how you find what
space an image is using.
}
}
-static i_color make_hsv(double hue, double sat, double val) {
+static i_color make_hsv(double hue, double sat, double val, int alpha) {
int i;
i_color c;
for( i=0; i< MAXCHANNELS; i++) c.channel[i]=0;
break;
}
}
+ c.rgba.a = alpha;
return c;
}
-static i_color make_rgb(int r, int g, int b) {
+static i_color make_rgb(int r, int g, int b, int a) {
i_color c;
if (r < 0)
r = 0;
b = 255;
c.rgb.b = b;
+ c.rgba.a = a;
+
return c;
}
double dx, dy;
struct rm_op *codes_base = codes;
size_t count_base = code_count;
+
DBG(("rm_run(%p, %d)\n", codes, code_count));
while (code_count) {
DBG((" rm_code %d\n", codes->code));
nout = -na;
case rbc_multp:
- cout = make_rgb(ca.rgb.r * nb, ca.rgb.g * nb, ca.rgb.b * nb);
+ cout = make_rgb(ca.rgb.r * nb, ca.rgb.g * nb, ca.rgb.b * nb, 255);
break;
case rbc_addp:
cout = make_rgb(ca.rgb.r + cb.rgb.r, ca.rgb.g + cb.rgb.g,
- ca.rgb.b + cb.rgb.b);
+ ca.rgb.b + cb.rgb.b, 255);
break;
case rbc_subtractp:
cout = make_rgb(ca.rgb.r - cb.rgb.r, ca.rgb.g - cb.rgb.g,
- ca.rgb.b - cb.rgb.b);
+ ca.rgb.b - cb.rgb.b, 255);
break;
case rbc_sin:
case rbc_getp1:
i_gpix(images[0], na, nb, c_regs+codes->rout);
+ if (images[0]->channels < 4) cout.rgba.a = 255;
break;
case rbc_getp2:
i_gpix(images[1], na, nb, c_regs+codes->rout);
+ if (images[1]->channels < 4) cout.rgba.a = 255;
break;
case rbc_getp3:
i_gpix(images[2], na, nb, c_regs+codes->rout);
+ if (images[2]->channels < 4) cout.rgba.a = 255;
break;
case rbc_value:
break;
case rbc_hsv:
- cout = make_hsv(na, nb, nc);
+ cout = make_hsv(na, nb, nc, 255);
+ break;
+
+ case rbc_hsva:
+ cout = make_hsv(na, nb, nc, nd);
break;
case rbc_red:
nout = ca.rgb.b;
break;
+ case rbc_alpha:
+ nout = ca.rgba.a;
+ break;
+
case rbc_rgb:
- cout = make_rgb(na, nb, nc);
+ cout = make_rgb(na, nb, nc, 255);
+ break;
+
+ case rbc_rgba:
+ cout = make_rgb(na, nb, nc, nd);
break;
case rbc_int:
cout = ca;
break;
+ case rbc_log:
+ if (na > 0) {
+ nout = log(na);
+ }
+ else {
+ nout = DBL_MAX;
+ }
+ break;
+
+ case rbc_exp:
+ if (!MAX_EXP_ARG) MAX_EXP_ARG = log(DBL_MAX);
+ if (na <= MAX_EXP_ARG) {
+ nout = exp(na);
+ }
+ else {
+ nout = DBL_MAX;
+ }
+ break;
+
case rbc_print:
printf("r%d is %g\n", codes->ra, na);
break;