From 848a0f6e2d634001e30cbfebef05d93f7301facd Mon Sep 17 00:00:00 2001 From: Christian C Date: Sun, 23 Mar 2025 17:47:36 -0700 Subject: Migration to Mask --- lib/data/image_types.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) (limited to 'lib/data') diff --git a/lib/data/image_types.c b/lib/data/image_types.c index d58b8c6..0e40ad1 100644 --- a/lib/data/image_types.c +++ b/lib/data/image_types.c @@ -1,15 +1,43 @@ #include #include +#include -Image* create_image(size_t width, size_t height) +Image* create_image(size_t width, size_t height, size_t channels) { Image* ip = (Image*)malloc(sizeof(Image)); + if (ip == NULL) { + return NULL; + } ip->width = width; ip->height = height; - ip->image = (ImageData_t**)malloc(sizeof(ImageData_t*) * ip->height); - ImageData_t* image_data = calloc(width*height, sizeof(ImageData_t)); + ip->depth = channels; + ip->image = (ImageData_t ***)malloc(sizeof(ImageData_t **) * ip->height); + if (ip->image == NULL) { + fprintf(stderr, "Memory allocation error\n"); + free(ip); + return NULL; + } + ImageData_t *image_data = calloc(width * height*channels, sizeof(ImageData_t)); + if (image_data == NULL) { + fprintf(stderr, "Memory allocation error\n"); + free(ip->image); + free(ip); + return NULL; + } for (size_t y = 0; y < height; y++) { - ip->image[y] = &image_data[y*width]; + ip->image[y] = (ImageData_t **)malloc(sizeof(ImageData_t *) * ip->width); + if (ip->image[y] == NULL) { + fprintf(stderr, "Memory allocation error\n"); + for (size_t ty = 0; ty < y; ty++) { + free(ip->image[ty]); + } + free(image_data); + free(ip->image); + free(ip); + } + for (size_t x = 0; x < width; x++) { + ip->image[y][x] = &image_data[(y * width + x)*channels]; + } } return ip; } @@ -17,10 +45,22 @@ Image* create_image(size_t width, size_t height) Mask* create_image_mask(size_t width, size_t height) { Mask* ip = (Mask*)malloc(sizeof(Mask)); + if (ip == NULL) { + return NULL; + } ip->width = width; ip->height = height; ip->image = (MaskData_t**)malloc(sizeof(MaskData_t*) * ip->height); + if (ip->image == NULL) { + free(ip); + return NULL; + } MaskData_t* image_data = calloc(width*height, sizeof(MaskData_t)); + if (image_data == NULL) { + free(ip->image); + free(ip); + return NULL; + } for (size_t y = 0; y < height; y++) { ip->image[y] = &image_data[y*width]; } -- cgit v1.2.1