00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
#include <stdlib.h>
00037
#include "idvol.h"
00038
#include "idprint.h"
00039
00040
00041 #define DEBUG 0
00042
00043
00044
00045
00046
00047
00048
00058
PPPVOLUME
00059 IdVolAlloc(
int sx,
int sy,
int sz,
int ty)
00060 {
00061
PRIVATE_VOLUME *pvol;
00062
PPPVOLUME pv = NULL;
00063
int plan, ligne;
00064
00065
if (!(ty &
IDO_TYPE) ==
VOL) {
00066 printf
00067 (
"Allocation impossible. Objet de type incompatible.");
00068
return (
PPPVOLUME) NULL;
00069 }
00070
00071 pvol = (
PRIVATE_VOLUME *)
00072 calloc(1,
sizeof(
PRIVATE_VOLUME) + sz *
sizeof(
char **));
00073
00074
if (pvol == NULL) {
00075 printf(
"Echec Alloc Volume (partie privee)\n");
00076 free(pvol);
00077
return (
PPPVOLUME) NULL;
00078 }
00079
if (
DEBUG) printf(
"pvol %p\n",pvol);
00080
00081 pvol->
_fichier = 0;
00082 pvol->
_message = 0;
00083 pv = (
PPPVOLUME) & pvol[1];
00084
IdVolDimX(pv) = sx;
00085
IdVolDimY(pv) = sy;
00086
IdVolDimZ(pv) = sz;
00087
IdVolUsedNbX(pv) = 0;
00088
IdVolUsedNbY(pv) = 0;
00089
IdVolUsedNbZ(pv) = 0;
00090
IdVolType(pv) = ty;
00091 pvol->
subObject = 0;
00092
00093
00094
00095
00096 sx = ((ty &
TY_SIZE) ==
TY_BIT) ? ((sx + 7) >> 3) : sx;
00097
00098 pv[0] = (
void **) malloc( sz * sy *
sizeof(
void *));
00099
00100
if (pv[0] == NULL) {
00101 printf(
"Echec Alloc Volume (pointeurs sur Lignes)\n");
00102 free(pvol);
00103
return (
PPPVOLUME) NULL;
00104 }
00105
00106
if (
DEBUG) printf(
"pv[0] %p\n",pv[0]);
00107
00108 pv[0][0] = (
void *) malloc( sz * sy * sx *
IdSizeOfType(pv));
00109
00110
if (pv[0][0] == NULL) {
00111 printf(
"Echec Alloc Volume (voxels)\n");
00112 free(pvol);
00113
return (
PPPVOLUME) NULL;
00114 }
00115
00116
for (plan = 0; plan < sz; plan++) {
00117 pv[plan]= pv[0] + plan * sy;
00118
if (
DEBUG) printf(
"\tpv[%d] %p\n",plan, pv[plan]);
00119
for (ligne=0; ligne<sy; ligne++) {
00120 pv[plan][ligne] = (((
char *)pv[0][0]) + (plan*sy + ligne )*sx*
IdSizeOfType(pv) );
00121
if (
DEBUG) printf(
"\t pv[%d][%d] %p\n",plan, ligne, pv[plan][ligne]);
00122 }
00123 }
00124
return (pv);
00125 }
00126
00127
00133
void
00134 _IdVolFree(PPPVOLUME * pv)
00135 {
00136
if (*pv) {
00137
if (
_IdVolPrivate(*pv)->subObject == 0) {
00138
00139
00140
00141 free((*pv)[0][0]);
00142 }
00143 free((*pv)[0]);
00144
00145
if (
_IdVolPrivate(*pv)->_message)
00146 free((
_IdVolPrivate(*pv)->_message));
00147
00148
if (
_IdVolPrivate(*pv)->_fichier)
00149 free((
_IdVolPrivate(*pv)->_fichier));
00150
00151
00152 free(
_IdVolPrivate(*pv));
00153 *pv = 0;
00154 }
00155 }