}
static void angle_to_colour(double result[3],
- double angle /* in units of 2pi radians< <1.0 */,
- int reverse) {
+ int angle_i /* [0..63> */) {
int s;
- double f, u, d, U, D;
+ double angle, f, u, d, U, D;
- angle *= 6.0;
+ angle= angle_i / 64.0 * 6.0;
s= floor(angle);
f= angle - s;
- if (reverse) { s += 3; s %= 6; }
u= f * 0.5;
U= u + 0.5;
}
}
+static double anglemap[64][3];
+
+static void angle_to_colour_init(void) {
+ int i;
+
+ for (i=0; i<64; i++)
+ angle_to_colour(anglemap[i],i);
+}
+
static void process(void) {
int i;
unsigned char rgbob[3];
for (i=0; i<3; i++)
rgbob[i]= background.rgb[i] * 255.0;
+ angle_to_colour_init();
+
for (row=0; row<rows; row++)
for (col=0; col<cols; col++) {
unsigned char rgbi[3], rgbo[3];
- double rgbod[3];
if (fread(rgbi,1,3,encodingfile)!=3) {
if (ferror(encodingfile)) { perror("reading"); exit(12); }
if (fwrite(rgbob,1,3,stdout)!=3) { perror("filling"); exit(12); }
} else {
- int segnum, movfeatpos, movfeatposix, red, blue, green, ix;
- double rgbdirn[3], angle, alpha;
+ int segnum, movfeatpos, movfeatposix, red, blue, green, ix, angle;
+ double *rgbdirn, alpha;
struct result *r;
red= rgbi[0];
blue= reverse_bits_in_byte(rgbi[2]);
if (red & 0x03) badformat("reserved bits set in red");
- angle= ((red >> 2) & 0x3f) / 64.0;
+ angle= ((red >> 2) & 0x3f);
segnum= blue | ((green & 0xc0) << 2);
movfeatpos= green & 0x3f;
r= &idinfo[ix];
- angle_to_colour(rgbdirn, angle, r->alpha < 0);
+ rgbdirn= anglemap[ angle ^ (r->alpha < 0 ? 32 : 0) ];
alpha= fabs(r->alpha);
- for (i=0; i<3; i++)
- rgbod[i]= alpha * rgbdirn[i] + (1.0 - alpha) * r->rgb[i];
-
- for (i=0; i<3; i++)
- rgbo[i]= rgbod[i] * 255.0;
+ for (i=0; i<3; i++) {
+ double v;
+ v= alpha * rgbdirn[i] + (1.0 - alpha) * r->rgb[i];
+ rgbo[i]= v * 255.0;
+ }
if (fwrite(rgbo,1,3,stdout)!=3) { perror("writing"); exit(12); }
}