aboutsummaryrefslogtreecommitdiff
path: root/lib/data/image_types.c
blob: 0e40ad1021c06757a5b3e3ddd0fb3f9987b96ce0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <lib/data/image_types.h>
#include <stdlib.h>
#include <stdio.h>

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);
  }
}