chiark / gitweb /
faster
authorian <ian>
Sat, 23 Oct 2004 11:05:06 +0000 (11:05 +0000)
committerian <ian>
Sat, 23 Oct 2004 11:05:06 +0000 (11:05 +0000)
layout/subseg2display.c

index 31a8ba8b7e1f4a82fd28e2742d5199df0f834f42..fa4e0202c55a7b7fb2b7b8423b6de826fae24ce9 100644 (file)
@@ -194,15 +194,13 @@ static unsigned reverse_bits_in_byte(unsigned a) {
 }
 
 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;
@@ -221,6 +219,15 @@ static void angle_to_colour(double result[3],
   }
 }
 
+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];
@@ -233,10 +240,11 @@ static void process(void) {
   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); }
@@ -248,8 +256,8 @@ static void process(void) {
        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];
@@ -257,7 +265,7 @@ static void process(void) {
        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;
@@ -273,14 +281,14 @@ static void process(void) {
 
        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); }
       }