00001
00009 #include "ExGdata.h"
00010
00011
00012
00013 using namespace jbxl;
00014
00015
00017
00018
00019
00020
00021 void ExCmnHead::init(void)
00022 {
00023 init_CmnHead(this);
00024 dbyte = 0;
00025 state = 0;
00026 refno = NULL;
00027 }
00028
00029
00030
00031 void ExCmnHead::set(RBound<int> rb, int d, int* rn) {
00032 set(rb.xmax-rb.xmin+1, rb.ymax-rb.ymin+1, rb.zmax-rb.zmin+1, d, rn);
00033 return;
00034 }
00035
00036
00037
00038 void ExCmnHead::set(int x, int y, int z, int d, int* rn)
00039 {
00040 init_CmnHead(this);
00041 state = 0;
00042 getm(x, y, z, d);
00043
00044 if (rn!=NULL) setRefer(rn);
00045 else if (refno!=NULL) {
00046 if (grptr==NULL) *refno = -1;
00047 else *refno = 1;
00048 }
00049
00050 return;
00051 }
00052
00053
00054
00055 void ExCmnHead::getm(int x, int y, int z, int d)
00056 {
00057 if (x<=0) x = 1;
00058 if (y<=0) y = 1;
00059 if (z<=0) z = 1;
00060 if (d<=0) d = 8;
00061
00062 xsize = x;
00063 ysize = y;
00064 zsize = z;
00065 depth = d;
00066 state = 0;
00067
00068 dbyte = (d+7)/8;
00069 lsize = x*y*z*dbyte;
00070
00071 grptr = (uByte*)malloc(lsize*sizeof(uByte));
00072 if (grptr==NULL) {
00073 init_CmnHead(this);
00074 state = JBXL_GRAPH_MEMORY_ERROR;
00075 return;
00076 }
00077 memset(grptr, 0, lsize);
00078 }
00079
00080
00081
00082 void ExCmnHead::setRefer(int* rn)
00083 {
00084 refno = rn;
00085 if (refno!=NULL) {
00086 if (grptr==NULL) *refno = -1;
00087 else *refno = 1;
00088 }
00089 }
00090
00091
00092
00093 bool ExCmnHead::isNull(void)
00094 {
00095 if (grptr==NULL) return true;
00096
00097 #ifdef WIN32
00098 if (grptr==(uByte*)WIN_DD_NULL) return true;
00099 #endif
00100
00101 if (refno!=NULL) {
00102 if (*refno<0) return true;
00103 else return false;
00104 }
00105 return false;
00106 }
00107
00108
00117 void ExCmnHead::mfree(bool azero)
00118 {
00119 if (refno!=NULL) {
00120 (*refno)--;
00121 if (!azero && *refno==0) {
00122 free_CmnHead(this);
00123 *refno = -1;
00124 }
00125 else if (*refno==-1) {
00126 DEBUG_MODE PRINT_MESG("ExCmnHead::free(): [警告] 通常ありえない参照数 0\n");
00127 }
00128 else if (*refno<-1) {
00129 *refno = -1;
00130 }
00131 }
00132
00133 return;
00134 }
00135
00136
00145 void ExCmnHead::free(void)
00146 {
00147 if (refno==NULL) {
00148 if (!isNull()) {
00149 free_CmnHead(this);
00150 }
00151 }
00152 else {
00153 mfree();
00154 }
00155 return;
00156 }
00157
00158
00164 void ExCmnHead::ffree(void)
00165 {
00166 if (refno==NULL) {
00167 if (!isNull()) {
00168 free_CmnHead(this);
00169 }
00170 }
00171 else {
00172 if (*refno>=0) {
00173 free_CmnHead(this);
00174 *refno = -1;
00175 }
00176 }
00177
00178 return;
00179 }
00180
00181
00182
00184
00185
00186
00187 ExCmnHead ExCmnHead::operator= (ExCmnHead& s)
00188 {
00189 ExCmnHead dm = *this;
00190
00191 kind = s.kind;
00192 xsize = s.xsize;
00193 ysize = s.ysize;
00194 zsize = s.zsize;
00195 dbyte = s.dbyte;
00196 depth = s.depth;
00197 bsize = s.bsize;
00198 lsize = s.lsize;
00199 buf = s.buf;
00200 grptr = s.grptr;
00201 state = s.state;
00202
00203 if (!s.isNull()) {
00204 if (s.refno!=NULL) {
00205 if (*s.refno>=0) {
00206 refno = s.refno;
00207 (*refno)++;
00208 }
00209 else {
00210 DEBUG_MODE PRINT_MESG("ExCmnHead::= (ExCmnHead): コピー元参照変数の不正!!\n");
00211 }
00212 }
00213 else {
00214 if (refno!=NULL) {
00215 if (*refno<=-1) *refno = 1;
00216 else refno = NULL;
00217 }
00218 }
00219 }
00220
00221 else {
00222 grptr = NULL;
00223 if (s.refno!=NULL) {
00224 refno = s.refno;
00225 *refno = -1;
00226 }
00227 else {
00228 if (refno!=NULL) {
00229 if (*refno<=-1) *refno = -1;
00230 else refno = NULL;
00231 }
00232 }
00233 }
00234
00235 if (!dm.isNull()) dm.free();
00236 return *this;
00237 }
00238
00239
00240
00241
00242 ExCmnHead ExCmnHead::operator= (CmnHead& s)
00243 {
00244 if (!isNull()) free();
00245
00246 kind = s.kind;
00247 xsize = s.xsize;
00248 ysize = s.ysize;
00249 zsize = s.zsize;
00250 depth = s.depth;
00251 bsize = s.bsize;
00252 lsize = s.lsize;
00253 buf = s.buf;
00254 grptr = s.grptr;
00255 state = 0;
00256 dbyte = (depth+7)/8;
00257
00258 if (s.grptr!=NULL) {
00259 if (refno!=NULL) {
00260 if (*refno<=-1) *refno = 1;
00261 else refno = NULL;
00262 }
00263 }
00264
00265 else {
00266 grptr = NULL;
00267 if (refno!=NULL) {
00268 if (*refno<=-1) *refno = -1;
00269 else refno = NULL;
00270 }
00271 }
00272
00273 return *this;
00274 }
00275
00276