Coverage Report

Created: 2023-12-08 06:53

/src/freeimage-svn/FreeImage/trunk/Source/LibOpenJPEG/image.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2005, Herve Drolon, FreeImage Team
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 *
14
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
 * POSSIBILITY OF SUCH DAMAGE.
25
 */
26
27
#include "opj_includes.h"
28
29
0
opj_image_t* opj_image_create0(void) {
30
0
  opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
31
0
  return image;
32
0
}
33
34
0
opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
35
0
  OPJ_UINT32 compno;
36
0
  opj_image_t *image = NULL;
37
38
0
  image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
39
0
  if(image) {
40
0
    image->color_space = clrspc;
41
0
    image->numcomps = numcmpts;
42
    /* allocate memory for the per-component information */
43
0
    image->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t));
44
0
    if(!image->comps) {
45
0
      fprintf(stderr,"Unable to allocate memory for image.\n");
46
0
      opj_image_destroy(image);
47
0
      return NULL;
48
0
    }
49
    /* create the individual image components */
50
0
    for(compno = 0; compno < numcmpts; compno++) {
51
0
      opj_image_comp_t *comp = &image->comps[compno];
52
0
      comp->dx = cmptparms[compno].dx;
53
0
      comp->dy = cmptparms[compno].dy;
54
0
      comp->w = cmptparms[compno].w;
55
0
      comp->h = cmptparms[compno].h;
56
0
      comp->x0 = cmptparms[compno].x0;
57
0
      comp->y0 = cmptparms[compno].y0;
58
0
      comp->prec = cmptparms[compno].prec;
59
0
      comp->bpp = cmptparms[compno].bpp;
60
0
      comp->sgnd = cmptparms[compno].sgnd;
61
0
      comp->data = (OPJ_INT32*) opj_calloc(comp->w * comp->h, sizeof(OPJ_INT32));
62
0
      if(!comp->data) {
63
0
        fprintf(stderr,"Unable to allocate memory for image.\n");
64
0
        opj_image_destroy(image);
65
0
        return NULL;
66
0
      }
67
0
    }
68
0
  }
69
70
0
  return image;
71
0
}
72
73
0
void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
74
0
  if(image) {
75
0
    if(image->comps) {
76
0
      OPJ_UINT32 compno;
77
78
      /* image components */
79
0
      for(compno = 0; compno < image->numcomps; compno++) {
80
0
        opj_image_comp_t *image_comp = &(image->comps[compno]);
81
0
        if(image_comp->data) {
82
0
          opj_free(image_comp->data);
83
0
        }
84
0
      }
85
0
      opj_free(image->comps);
86
0
    }
87
88
0
    if(image->icc_profile_buf) {
89
0
      opj_free(image->icc_profile_buf);
90
0
    }
91
92
0
    opj_free(image);
93
0
  }
94
0
}
95
96
/**
97
 * Updates the components characteristics of the image from the coding parameters.
98
 *
99
 * @param p_image_header  the image header to update.
100
 * @param p_cp        the coding parameters from which to update the image.
101
 */
102
void opj_image_comp_header_update(opj_image_t * p_image_header, const struct opj_cp * p_cp)
103
0
{
104
0
  OPJ_UINT32 i, l_width, l_height;
105
0
  OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
106
0
  OPJ_INT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;
107
0
  opj_image_comp_t* l_img_comp = NULL;
108
109
0
  l_x0 = opj_int_max((OPJ_INT32)p_cp->tx0 , (OPJ_INT32)p_image_header->x0);
110
0
  l_y0 = opj_int_max((OPJ_INT32)p_cp->ty0 , (OPJ_INT32)p_image_header->y0);
111
0
  l_x1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + p_cp->tw * p_cp->tdx), (OPJ_INT32)p_image_header->x1);
112
0
  l_y1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + p_cp->th * p_cp->tdy), (OPJ_INT32)p_image_header->y1);
113
114
0
  l_img_comp = p_image_header->comps;
115
0
  for (i = 0; i < p_image_header->numcomps; ++i) {
116
0
    l_comp_x0 = opj_int_ceildiv(l_x0, (OPJ_INT32)l_img_comp->dx);
117
0
    l_comp_y0 = opj_int_ceildiv(l_y0, (OPJ_INT32)l_img_comp->dy);
118
0
    l_comp_x1 = opj_int_ceildiv(l_x1, (OPJ_INT32)l_img_comp->dx);
119
0
    l_comp_y1 = opj_int_ceildiv(l_y1, (OPJ_INT32)l_img_comp->dy);
120
0
    l_width = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_x1 - l_comp_x0, (OPJ_INT32)l_img_comp->factor);
121
0
    l_height = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_y1 - l_comp_y0, (OPJ_INT32)l_img_comp->factor);
122
0
    l_img_comp->w = l_width;
123
0
    l_img_comp->h = l_height;
124
0
    l_img_comp->x0 = (OPJ_UINT32)l_comp_x0/*l_x0*/;
125
0
    l_img_comp->y0 = (OPJ_UINT32)l_comp_y0/*l_y0*/;
126
0
    ++l_img_comp;
127
0
  }
128
0
}
129
130
131
/**
132
 * Copy only header of image and its component header (no data are copied)
133
 * if dest image have data, they will be freed
134
 *
135
 * @param p_image_src   the src image
136
 * @param p_image_dest  the dest image
137
 *
138
 */
139
void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest)
140
0
{
141
0
  OPJ_UINT32 compno;
142
143
  /* preconditions */
144
0
  assert(p_image_src != 00);
145
0
  assert(p_image_dest != 00);
146
147
0
  p_image_dest->x0 = p_image_src->x0;
148
0
  p_image_dest->y0 = p_image_src->y0;
149
0
  p_image_dest->x1 = p_image_src->x1;
150
0
  p_image_dest->y1 = p_image_src->y1;
151
152
0
  if (p_image_dest->comps){
153
0
    for(compno = 0; compno < p_image_dest->numcomps; compno++) {
154
0
      opj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);
155
0
      if(image_comp->data) {
156
0
        opj_free(image_comp->data);
157
0
      }
158
0
    }
159
0
    opj_free(p_image_dest->comps);
160
0
    p_image_dest->comps = NULL;
161
0
  }
162
163
0
  p_image_dest->numcomps = p_image_src->numcomps;
164
165
0
  p_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps * sizeof(opj_image_comp_t));
166
0
  if (!p_image_dest->comps){
167
0
    p_image_dest->comps = NULL;
168
0
    p_image_dest->numcomps = 0;
169
0
    return;
170
0
  }
171
172
0
  for (compno=0; compno < p_image_dest->numcomps; compno++){
173
0
    memcpy( &(p_image_dest->comps[compno]),
174
0
        &(p_image_src->comps[compno]),
175
0
        sizeof(opj_image_comp_t));
176
0
    p_image_dest->comps[compno].data = NULL;
177
0
  }
178
179
0
  p_image_dest->color_space = p_image_src->color_space;
180
0
  p_image_dest->icc_profile_len = p_image_src->icc_profile_len;
181
182
0
  if (p_image_dest->icc_profile_len) {
183
0
    p_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(p_image_dest->icc_profile_len);
184
0
    if (!p_image_dest->icc_profile_buf){
185
0
      p_image_dest->icc_profile_buf = NULL;
186
0
      p_image_dest->icc_profile_len = 0;
187
0
      return;
188
0
    }
189
0
    memcpy( p_image_dest->icc_profile_buf,
190
0
        p_image_src->icc_profile_buf,
191
0
        p_image_src->icc_profile_len);
192
0
    }
193
0
    else
194
0
      p_image_dest->icc_profile_buf = NULL;
195
196
0
  return;
197
0
}
198
199
0
opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
200
0
  OPJ_UINT32 compno;
201
0
  opj_image_t *image = 00;
202
203
0
  image = (opj_image_t*) opj_malloc(sizeof(opj_image_t));
204
0
  if (image)
205
0
  {
206
0
    memset(image,0,sizeof(opj_image_t));
207
    
208
0
    image->color_space = clrspc;
209
0
    image->numcomps = numcmpts;
210
    
211
    /* allocate memory for the per-component information */
212
0
    image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
213
0
    if (!image->comps) {
214
0
      opj_image_destroy(image);
215
0
      return 00;
216
0
    }
217
0
    memset(image->comps,0,image->numcomps * sizeof(opj_image_comp_t));
218
    
219
    /* create the individual image components */
220
0
    for(compno = 0; compno < numcmpts; compno++) {
221
0
      opj_image_comp_t *comp = &image->comps[compno];
222
0
      comp->dx = cmptparms[compno].dx;
223
0
      comp->dy = cmptparms[compno].dy;
224
0
      comp->w = cmptparms[compno].w;
225
0
      comp->h = cmptparms[compno].h;
226
0
      comp->x0 = cmptparms[compno].x0;
227
0
      comp->y0 = cmptparms[compno].y0;
228
0
      comp->prec = cmptparms[compno].prec;
229
0
      comp->sgnd = cmptparms[compno].sgnd;
230
0
      comp->data = 0;
231
0
    }
232
0
  }
233
234
0
  return image;
235
0
}