Browse Source

Move pixel parsing macros to olive.c

rexim 3 years ago
parent
commit
0090fb2210
3 changed files with 29 additions and 32 deletions
  1. 6 11
      examples/3d.c
  2. 8 12
      examples/triangle.c
  3. 15 9
      olive.c

+ 6 - 11
examples/3d.c

@@ -178,24 +178,19 @@ char char_canvas[SCALED_DOWN_WIDTH*SCALED_DOWN_HEIGHT];
 
 
 char color_to_char(uint32_t pixel)
 char color_to_char(uint32_t pixel)
 {
 {
-    char table[] = " .:a@#";
-    size_t n = sizeof(table) - 1;
-    size_t r = (0x000000FF&pixel)>>(8*0);
-    size_t g = (0x0000FF00&pixel)>>(8*1);
-    size_t b = (0x00FF0000&pixel)>>(8*2);
+    size_t r = OLIVEC_RED(pixel);
+    size_t g = OLIVEC_GREEN(pixel);
+    size_t b = OLIVEC_BLUE(pixel);
     // TODO: brightness should take into account tranparency as well
     // TODO: brightness should take into account tranparency as well
     size_t bright = r;
     size_t bright = r;
     if (bright < g) bright = g;
     if (bright < g) bright = g;
     if (bright < b) bright = b;
     if (bright < b) bright = b;
+
+    char table[] = " .:a@#";
+    size_t n = sizeof(table) - 1;
     return table[bright*n/256];
     return table[bright*n/256];
 }
 }
 
 
-#define OLIVEC_RED(color)   (((color)&0x000000FF)>>(8*0))
-#define OLIVEC_GREEN(color) (((color)&0x0000FF00)>>(8*1))
-#define OLIVEC_BLUE(color)  (((color)&0x00FF0000)>>(8*2))
-#define OLIVEC_ALPHA(color) (((color)&0xFF000000)>>(8*3))
-#define OLIVEC_RGBA(r, g, b, a) ((((r)&0xFF)<<(8*0)) | (((g)&0xFF)<<(8*1)) | (((b)&0xFF)<<(8*2)) | (((a)&0xFF)<<(8*3)))
-
 uint32_t compress_pixels_chunk(Olivec_Canvas oc)
 uint32_t compress_pixels_chunk(Olivec_Canvas oc)
 {
 {
     size_t r = 0;
     size_t r = 0;

+ 8 - 12
examples/triangle.c

@@ -159,7 +159,7 @@ defer:
 #include <time.h>
 #include <time.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
-#define SCALE_DOWN_FACTOR 40
+#define SCALE_DOWN_FACTOR 20
 static_assert(WIDTH%SCALE_DOWN_FACTOR == 0, "WIDTH must be divisible by the SCALE_DOWN_FACTOR");
 static_assert(WIDTH%SCALE_DOWN_FACTOR == 0, "WIDTH must be divisible by the SCALE_DOWN_FACTOR");
 #define SCALED_DOWN_WIDTH (WIDTH/SCALE_DOWN_FACTOR)
 #define SCALED_DOWN_WIDTH (WIDTH/SCALE_DOWN_FACTOR)
 static_assert(HEIGHT%SCALE_DOWN_FACTOR == 0, "HEIGHT must be divisible by the SCALE_DOWN_FACTOR");
 static_assert(HEIGHT%SCALE_DOWN_FACTOR == 0, "HEIGHT must be divisible by the SCALE_DOWN_FACTOR");
@@ -169,23 +169,19 @@ char char_canvas[SCALED_DOWN_WIDTH*SCALED_DOWN_HEIGHT];
 
 
 char color_to_char(uint32_t pixel)
 char color_to_char(uint32_t pixel)
 {
 {
-    char table[] = " .:a@#";
-    size_t n = sizeof(table) - 1;
-    size_t r = (0x000000FF&pixel)>>(8*0);
-    size_t g = (0x0000FF00&pixel)>>(8*1);
-    size_t b = (0x00FF0000&pixel)>>(8*2);
+    size_t r = OLIVEC_RED(pixel);
+    size_t g = OLIVEC_GREEN(pixel);
+    size_t b = OLIVEC_BLUE(pixel);
+    // TODO: brightness should take into account tranparency as well
     size_t bright = r;
     size_t bright = r;
     if (bright < g) bright = g;
     if (bright < g) bright = g;
     if (bright < b) bright = b;
     if (bright < b) bright = b;
+
+    char table[] = " .:a@#";
+    size_t n = sizeof(table) - 1;
     return table[bright*n/256];
     return table[bright*n/256];
 }
 }
 
 
-#define OLIVEC_RED(color)   (((color)&0x000000FF)>>(8*0))
-#define OLIVEC_GREEN(color) (((color)&0x0000FF00)>>(8*1))
-#define OLIVEC_BLUE(color)  (((color)&0x00FF0000)>>(8*2))
-#define OLIVEC_ALPHA(color) (((color)&0xFF000000)>>(8*3))
-#define OLIVEC_RGBA(r, g, b, a) ((((r)&0xFF)<<(8*0)) | (((g)&0xFF)<<(8*1)) | (((b)&0xFF)<<(8*2)) | (((a)&0xFF)<<(8*3)))
-
 uint32_t compress_pixels_chunk(Olivec_Canvas oc)
 uint32_t compress_pixels_chunk(Olivec_Canvas oc)
 {
 {
     size_t r = 0;
     size_t r = 0;

+ 15 - 9
olive.c

@@ -177,23 +177,29 @@ OLIVECDEF Olivec_Canvas olivec_subcanvas(Olivec_Canvas oc, int x, int y, int w,
     return oc;
     return oc;
 }
 }
 
 
+#define OLIVEC_RED(color)   (((color)&0x000000FF)>>(8*0))
+#define OLIVEC_GREEN(color) (((color)&0x0000FF00)>>(8*1))
+#define OLIVEC_BLUE(color)  (((color)&0x00FF0000)>>(8*2))
+#define OLIVEC_ALPHA(color) (((color)&0xFF000000)>>(8*3))
+#define OLIVEC_RGBA(r, g, b, a) ((((r)&0xFF)<<(8*0)) | (((g)&0xFF)<<(8*1)) | (((b)&0xFF)<<(8*2)) | (((a)&0xFF)<<(8*3)))
+
 OLIVECDEF void olivec_blend_color(uint32_t *c1, uint32_t c2)
 OLIVECDEF void olivec_blend_color(uint32_t *c1, uint32_t c2)
 {
 {
-    uint32_t r1 = ((*c1)>>(0*8))&0xFF;
-    uint32_t g1 = ((*c1)>>(1*8))&0xFF;
-    uint32_t b1 = ((*c1)>>(2*8))&0xFF;
-    uint32_t a1 = ((*c1)>>(3*8))&0xFF;
+    uint32_t r1 = OLIVEC_RED(*c1); // ((*c1)>>(0*8))&0xFF;
+    uint32_t g1 = OLIVEC_GREEN(*c1); // ((*c1)>>(1*8))&0xFF;
+    uint32_t b1 = OLIVEC_BLUE(*c1); // ((*c1)>>(2*8))&0xFF;
+    uint32_t a1 = OLIVEC_ALPHA(*c1); // ((*c1)>>(3*8))&0xFF;
 
 
-    uint32_t r2 = (c2>>(0*8))&0xFF;
-    uint32_t g2 = (c2>>(1*8))&0xFF;
-    uint32_t b2 = (c2>>(2*8))&0xFF;
-    uint32_t a2 = (c2>>(3*8))&0xFF;
+    uint32_t r2 = OLIVEC_RED(c2); //(c2>>(0*8))&0xFF;
+    uint32_t g2 = OLIVEC_GREEN(c2); //(c2>>(1*8))&0xFF;
+    uint32_t b2 = OLIVEC_BLUE(c2); //(c2>>(2*8))&0xFF;
+    uint32_t a2 = OLIVEC_ALPHA(c2); //(c2>>(3*8))&0xFF;
 
 
     r1 = (r1*(255 - a2) + r2*a2)/255; if (r1 > 255) r1 = 255;
     r1 = (r1*(255 - a2) + r2*a2)/255; if (r1 > 255) r1 = 255;
     g1 = (g1*(255 - a2) + g2*a2)/255; if (g1 > 255) g1 = 255;
     g1 = (g1*(255 - a2) + g2*a2)/255; if (g1 > 255) g1 = 255;
     b1 = (b1*(255 - a2) + b2*a2)/255; if (b1 > 255) b1 = 255;
     b1 = (b1*(255 - a2) + b2*a2)/255; if (b1 > 255) b1 = 255;
 
 
-    *c1 = (r1<<(0*8)) | (g1<<(1*8)) | (b1<<(2*8)) | (a1<<(3*8));
+    *c1 = OLIVEC_RGBA(r1, g1, b1, a1);
 }
 }
 
 
 OLIVECDEF void olivec_fill(Olivec_Canvas oc, uint32_t color)
 OLIVECDEF void olivec_fill(Olivec_Canvas oc, uint32_t color)