From 6c275baa20c6013f97b4442fecced8758d0ef3f7 Mon Sep 17 00:00:00 2001
From: Abdelrahman <said.abdelrahman89@gmail.com>
Date: Sun, 18 Aug 2024 15:14:01 +0100
Subject: [PATCH] Ensure pixel coordinates are within bounds

---
 src/img.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/img.c b/src/img.c
index 12dec1e..51a63f1 100644
--- a/src/img.c
+++ b/src/img.c
@@ -7,7 +7,7 @@
 #include <stddef.h>
 #include <string.h>
 
-internal u64 calculate_pixel_index(Buffer *buffer, u64 x, u64 y, u64 base_size);
+internal i64 calculate_pixel_index(Buffer *buffer, u64 x, u64 y, u64 base_size);
 
 bool _init_buffer(Arena *arena, Buffer *buffer, u64 base_size) {
   if (!arena || !buffer || buffer->width == 0 || buffer->height == 0) {
@@ -21,12 +21,20 @@ bool _init_buffer(Arena *arena, Buffer *buffer, u64 base_size) {
 }
 
 u8 *_get_pixel(Buffer *buffer, u64 x, u64 y, u64 base_size) {
-  u64 idx = calculate_pixel_index(buffer, x, y, base_size);
+  i64 idx = calculate_pixel_index(buffer, x, y, base_size);
+  if (idx == -1) {
+    idx = 0;
+  }
+
   return ((u8 *)(buffer->buf)) + idx;
 }
 
 void _set_pixel(Buffer *buffer, u64 x, u64 y, void *value, u64 base_size) {
-  u64 idx = calculate_pixel_index(buffer, x, y, base_size);
+  i64 idx = calculate_pixel_index(buffer, x, y, base_size);
+  if (idx == -1) {
+    return;
+  }
+
   memcpy(((u8 *)(buffer->buf)) + idx, value, base_size);
   return;
 }
@@ -75,7 +83,11 @@ void save_image(const Image *img, const char *filename) {
   write_p7_image(img->width, img->height, (u8 *)(img->buf), filename);
 }
 
-internal u64 calculate_pixel_index(Buffer *buffer, u64 x, u64 y,
+internal i64 calculate_pixel_index(Buffer *buffer, u64 x, u64 y,
                                    u64 base_size) {
+  if (x < 0 || y < 0 || x >= buffer->width || y >= buffer->height) {
+    return -1;
+  }
+
   return (y * buffer->width + x) * base_size;
 }