/src/freeimage-svn/FreeImage/trunk/Source/LibOpenJPEG/image.c
Line  | Count  | Source  | 
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  | }  |