chiark / gitweb /
Reverse order of samples in Rgb and other optimisations
[ypp-sc-tools.main.git] / pctb / convert.h
index 1dcb8a2f5d78ee70f52aab1ac446467f72826dc1..11f534bb1c8824fd5b8de4f72adfc206554993af 100644 (file)
 
 #define MAXIMGIDENT 100
 
+typedef uint32_t Rgb; /* red<<0 | green<<8 | blue<<16 */
+
 typedef struct RgbImage {
   int w, h;
-  unsigned char data[];
-  /* red   = data[ y*w*3 + x*3 + 0 ] = RI_PIXEL(ri,x,y)[0]
-   * green = data[ y*w*3 + x*3 + 1 ] = RI_PIXEL(ri,x,y)[1]
-   * blue  = data[ y*w*3 + x*3 + 2 ] = RI_PIXEL(ri,x,y)[2]
-   */
+  Rgb data[]; /* data[ y*w + x ] */
 } RgbImage;
 
-typedef unsigned long Rgb;
-
 void identify_rgbimage(const RgbImage *base, Rect portion,
                       char result[MAXIMGIDENT], const char *what);
 RgbImage *alloc_rgb_image(int w, int h);
 void fwrite_ppmraw(FILE *f, const RgbImage *ri);
 
-#define RI_PIXEL(ri,x,y) ((ri)->data + ((y)*(ri)->w + (x)) * 3)
+#define RI_PIXEL32(ri,x,y) ((ri)->data + ((y)*(ri)->w + (x)))
 
 static inline Rgb ri_rgb(const RgbImage *ri, int x, int y) {
-  const unsigned char *rip= RI_PIXEL(ri,x,y);
-  return (rip[0] << 16) |
-         (rip[1] <<  8) |
-         (rip[2]      );
+  return *RI_PIXEL32(ri,x,y);
 }
 
 /*----- from structure.c -----*/