renamed and reorganized "jp3d" directory to "openjpeg3d". Is now a standalone directo...
[openjpeg.git] / libopenjpeg3d / volume.c
1 /*\r
2  * Copyright (c) 2005, Herve Drolon, FreeImage Team\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  *\r
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
24  * POSSIBILITY OF SUCH DAMAGE.\r
25  */\r
26 \r
27 #include "opj_includes.h"\r
28 \r
29 opj_volume_t* OPJ_CALLCONV opj_volume_create(int numcmpts, opj_volume_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {\r
30         int compno;\r
31         opj_volume_t *volume = NULL;\r
32 \r
33         volume = (opj_volume_t*)opj_malloc(sizeof(opj_volume_t));\r
34         if(volume) {\r
35                 volume->color_space = clrspc;\r
36                 volume->numcomps = numcmpts;\r
37                 /* allocate memory for the per-component information */\r
38                 volume->comps = (opj_volume_comp_t*)opj_malloc(volume->numcomps * sizeof(opj_volume_comp_t));\r
39                 if(!volume->comps) {\r
40                         opj_volume_destroy(volume);\r
41                         return NULL;\r
42                 }\r
43                 /* create the individual volume components */\r
44                 for(compno = 0; compno < numcmpts; compno++) {\r
45                         opj_volume_comp_t *comp = &volume->comps[compno];\r
46                         comp->dx = cmptparms[compno].dx;\r
47                         comp->dy = cmptparms[compno].dy;\r
48                         comp->dz = cmptparms[compno].dz;\r
49                         comp->w = cmptparms[compno].w;\r
50                         comp->h = cmptparms[compno].h;\r
51                         comp->l = cmptparms[compno].l;\r
52                         comp->x0 = cmptparms[compno].x0;\r
53                         comp->y0 = cmptparms[compno].y0;\r
54                         comp->z0 = cmptparms[compno].z0;\r
55                         comp->prec = cmptparms[compno].prec;\r
56                         comp->bpp = cmptparms[compno].bpp;\r
57                         comp->sgnd = cmptparms[compno].sgnd;\r
58                         comp->bigendian = cmptparms[compno].bigendian;\r
59                         comp->dcoffset = cmptparms[compno].dcoffset;\r
60                         comp->data = (int*)opj_malloc(comp->w * comp->h * comp->l * sizeof(int));\r
61                         if(!comp->data) {\r
62                                 fprintf(stdout,"Unable to malloc comp->data (%d x %d x %d x bytes)",comp->w,comp->h,comp->l);\r
63                                 opj_volume_destroy(volume);\r
64                                 return NULL;\r
65                         }\r
66                         //fprintf(stdout,"%d %d %d %d %d %d %d %d %d", comp->w,comp->h, comp->l, comp->dx, comp->dy, comp->dz, comp->prec, comp->bpp, comp->sgnd);\r
67                 }\r
68         }\r
69 \r
70         return volume;\r
71 }\r
72 \r
73 void OPJ_CALLCONV opj_volume_destroy(opj_volume_t *volume) {\r
74         int i;\r
75         if(volume) {\r
76                 if(volume->comps) {\r
77                         /* volume components */\r
78                         for(i = 0; i < volume->numcomps; i++) {\r
79                                 opj_volume_comp_t *volume_comp = &volume->comps[i];\r
80                                 if(volume_comp->data) {\r
81                                         opj_free(volume_comp->data);\r
82                                 }\r
83                         }\r
84                         opj_free(volume->comps);\r
85                 }\r
86                 opj_free(volume);\r
87         }\r
88 }\r
89 \r