/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 | } |