Browse Source

Implement olivec_sprite_copy()

rexim 3 years ago
parent
commit
2aeb28817c
7 changed files with 34 additions and 0 deletions
  1. 20 0
      olive.c
  2. 14 0
      test.c
  3. BIN
      test/sprite_blend_vs_copy_expected.png
  4. BIN
      wasm/3d.wasm
  5. BIN
      wasm/squish.wasm
  6. BIN
      wasm/triangle.wasm
  7. BIN
      wasm/triangle3d.wasm

+ 20 - 0
olive.c

@@ -302,6 +302,7 @@ OLIVECDEF void olivec_triangle(Olivec_Canvas oc, int x1, int y1, int x2, int y2,
 OLIVECDEF void olivec_triangle3(Olivec_Canvas oc, int x1, int y1, int x2, int y2, int x3, int y3, uint32_t c1, uint32_t c2, uint32_t c3);
 OLIVECDEF void olivec_triangle3(Olivec_Canvas oc, int x1, int y1, int x2, int y2, int x3, int y3, uint32_t c1, uint32_t c2, uint32_t c3);
 OLIVECDEF void olivec_text(Olivec_Canvas oc, const char *text, int x, int y, Olivec_Font font, size_t size, uint32_t color);
 OLIVECDEF void olivec_text(Olivec_Canvas oc, const char *text, int x, int y, Olivec_Font font, size_t size, uint32_t color);
 OLIVECDEF void olivec_sprite_blend(Olivec_Canvas oc, int x, int y, int w, int h, Olivec_Canvas sprite);
 OLIVECDEF void olivec_sprite_blend(Olivec_Canvas oc, int x, int y, int w, int h, Olivec_Canvas sprite);
+OLIVECDEF void olivec_sprite_copy(Olivec_Canvas oc, int x, int y, int w, int h, Olivec_Canvas sprite);
 
 
 typedef struct {
 typedef struct {
     // Safe ranges to iterate over.
     // Safe ranges to iterate over.
@@ -742,6 +743,25 @@ OLIVECDEF void olivec_sprite_blend(Olivec_Canvas oc, int x, int y, int w, int h,
     }
     }
 }
 }
 
 
+OLIVECDEF void olivec_sprite_copy(Olivec_Canvas oc, int x, int y, int w, int h, Olivec_Canvas sprite)
+{
+    if (sprite.width == 0) return;
+    if (sprite.height == 0) return;
+
+    Olivec_Normalized_Rect nr = {0};
+    if (!olivec_normalize_rect(x, y, w, h, oc.width, oc.height, &nr)) return;
+
+    int xa = nr.ox1; if (w < 0) xa = nr.ox2;
+    int ya = nr.oy1; if (h < 0) ya = nr.oy2;
+    for (int y = nr.y1; y <= nr.y2; ++y) {
+        for (int x = nr.x1; x <= nr.x2; ++x) {
+            size_t nx = (x - xa)*((int) sprite.width)/w;
+            size_t ny = (y - ya)*((int) sprite.height)/h;
+            OLIVEC_PIXEL(oc, x, y) = OLIVEC_PIXEL(sprite, nx, ny);
+        }
+    }
+}
+
 #endif // OLIVEC_IMPLEMENTATION
 #endif // OLIVEC_IMPLEMENTATION
 
 
 // TODO: 3D triangles with z-buffering
 // TODO: 3D triangles with z-buffering

+ 14 - 0
test.c

@@ -6,6 +6,7 @@
 #include <errno.h>
 #include <errno.h>
 
 
 #include "./assets/tsodinPog.c"
 #include "./assets/tsodinPog.c"
+#include "./assets/Sadge.c"
 
 
 #define return_defer(value) do { result = (value); goto defer; } while (0)
 #define return_defer(value) do { result = (value); goto defer; } while (0)
 #define UNUSED(x) (void)(x)
 #define UNUSED(x) (void)(x)
@@ -549,6 +550,18 @@ Olivec_Canvas test_sprite_blend_null(void)
     return dst;
     return dst;
 }
 }
 
 
+Olivec_Canvas test_sprite_blend_vs_copy(void)
+{
+    Olivec_Canvas sadge = olivec_canvas(Sadge_pixels, Sadge_width, Sadge_height, Sadge_width);
+    size_t w = sadge.width;
+    size_t h = sadge.height*2;
+    Olivec_Canvas dst = canvas_alloc(w, h);
+    olivec_fill(dst, RED_COLOR);
+    olivec_sprite_blend(dst, 0, 0, sadge.width, sadge.height, sadge);
+    olivec_sprite_copy(dst, 0, sadge.height, sadge.width, sadge.height, sadge);
+    return dst;
+}
+
 Test_Case test_cases[] = {
 Test_Case test_cases[] = {
     DEFINE_TEST_CASE(fill_rect),
     DEFINE_TEST_CASE(fill_rect),
     DEFINE_TEST_CASE(fill_circle),
     DEFINE_TEST_CASE(fill_circle),
@@ -569,6 +582,7 @@ Test_Case test_cases[] = {
     DEFINE_TEST_CASE(sprite_blend_empty_rect),
     DEFINE_TEST_CASE(sprite_blend_empty_rect),
     DEFINE_TEST_CASE(empty_rect),
     DEFINE_TEST_CASE(empty_rect),
     DEFINE_TEST_CASE(sprite_blend_null),
     DEFINE_TEST_CASE(sprite_blend_null),
+    DEFINE_TEST_CASE(sprite_blend_vs_copy),
 };
 };
 #define TEST_CASES_COUNT (sizeof(test_cases)/sizeof(test_cases[0]))
 #define TEST_CASES_COUNT (sizeof(test_cases)/sizeof(test_cases[0]))
 
 

BIN
test/sprite_blend_vs_copy_expected.png


BIN
wasm/3d.wasm


BIN
wasm/squish.wasm


BIN
wasm/triangle.wasm


BIN
wasm/triangle3d.wasm