#include #include #include 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->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] = (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; } 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]; } return ip; } void free_image(Image *image) { if (image->image[0] != NULL) { free(image->image[0]); image->image[0] = NULL; } if (image->image != NULL) { free(image->image); image->image = NULL; } if (image != NULL) { free(image); } } void free_image_mask(Mask *image_mask) { if (image_mask->image[0] != NULL) { free(image_mask->image[0]); image_mask->image[0] = NULL; } if (image_mask->image != NULL) { free(image_mask->image); image_mask->image = NULL; } if (image_mask != NULL) { free(image_mask); } }