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