00001 
00002 #ifndef  __JBXL_CPP_GRAPHIC_DATA_H_
00003 #define  __JBXL_CPP_GRAPHIC_DATA_H_
00004 
00005 
00013 #include "ClassBox.h"
00014 #include "gheader.h"
00015 
00016 #include "Vector.h"
00017 
00018 
00019 
00020 namespace jbxl {
00021 
00022 
00023 extern int  ZeroBase;
00024 extern int  TempBase;
00025 
00026 
00028 
00029 
00030 void    free_CmnHead(CmnHead* hd);      
00031 void    init_CmnHead(CmnHead* hd);
00032 
00033 #define freeCmnHead  free_CmnHead
00034 #define initCmnHead  init_CmnHead
00035 
00036 CmnHead getinfo_CmnHead(CmnHead hd);    
00037 
00039 inline  uByte& CmnHeadBytePoint(CmnHead hd, int i=0, int j=0, int k=0) 
00040 {
00041     return hd.grptr[(int)i + (int)j*hd.xsize + (int)k*hd.xsize*hd.ysize]; 
00042 }
00043 
00044 
00045 
00046 
00047 
00048 
00050 
00065 template <typename T> class MSGraph;
00066 template <typename T> class ExMSGraph;
00067 
00068 
00078 template <typename T=sWord> class MSGraph
00079 {
00080 public:
00081     int xs;                 
00082     int ys;                 
00083     int zs;                 
00084     T*  gp;                 
00085     T   zero;               
00086     T   base;               
00087 
00088 
00089 public:
00090     T   max;                
00091     T   min;                
00092     int color;              
00093     int state;              
00094     RBound<int>  rbound;    
00095     double  RZxy;           
00096     double  norm;           
00097 
00098 public:
00099     double  wRateX;         
00100     double  wRateY;         
00101     double  wRateZ;         
00102     double  wZeroX;         
00103     double  wZeroY;         
00104     double  wZeroZ;         
00105     double  wNowX;          
00106     double  wNowY;          
00107     double  wNowZ;          
00108 
00109 
00110 public:
00111     MSGraph(int x, int y=1, int z=1, T v=(T)0, T b=(T)0, double rz=1.0) { set(x, y, z, v, b, rz);}
00112     MSGraph(RBound<int> rb, T v=(T)0, T b=(T)0, double rz=1.0) { set(rb, v, b, rz);}
00113     MSGraph(void) { init();}
00114 
00115     virtual ~MSGraph(void) {}
00116 
00117     T&     point(int x, int y=0, int z=0) { return gp[x+xs*y+xs*ys*z];} 
00118     T      get_vPoint(double x, double y=0., double z=0., int mode=OFF);
00119     void   set_vPoint(double x, double y=0., double z=0., T cc=(T)0, int mode=OFF);
00120     void   put_vPoint(double x, double y=0., double z=0., T cc=(T)0, int mode=OFF);
00121 
00122     void   set(RBound<int> rb, T v=(T)0, T b=(T)0, double rz=1.0);
00123     void   set(int x, int y=1, int z=1, T v=(T)0, T b=(T)0, double rz=1.0);
00124 
00125     void   init(void);                                      
00126     bool   isNull(void);                                    
00127     void   fill(T v=(T)0);                                  
00128     void   clear(T v);                                      
00129     void   clear(void);                                     
00130     void   getm(int x, int y, int z=1, T v=(T)0);           
00131     void   getm(T v=(T)0);                                  
00132     void   free(void);                                      
00133     void   get_minmax(void);                                
00134     void   set_array(T* ary, int sz=0);                     
00135     void   contrast(T low, T high);                         
00136 
00137     template <typename R> void  mimicry(MSGraph<R> s) {
00138         set(s.xs, s.ys, s.zs, (T)s.zero, (T)s.base, s.RZxy); 
00139         rbound = s.rbound;
00140         color  = s.color;
00141         state  = s.state;
00142         max    = s.zero;
00143         min    = s.zero;
00144         norm   = s.norm;
00145     };
00146 
00147     template <typename R> void dup(MSGraph<R> s) {
00148         *this = s;
00149         getm();
00150         memcpy(gp, s.gp, xs*ys*zs*sizeof(T));
00151     };
00152 
00153     
00154     void   setWindow(double x1, double y1, double x2, double y2);
00155     void   setWindow3D(double x1, double y1, double z1, double x2, double y2, double z2);
00156     
00157     void   wMove(double x, double y, double z=0.0) {wNowX=x; wNowY=y; wNowZ=z;}
00158     void   wMove_rel(double x, double y, double z=0.0) {wNowX+=x; wNowY+=y; wNowZ+=z;}
00159 
00160 
00161     MSGraph<T> operator= (ExMSGraph<T>& s);
00162 };
00163 
00164 
00170 template <typename T>  void  MSGraph<T>::init(void) 
00171 {
00172     xs = ys = zs = 0; 
00173     gp    = NULL; 
00174     RZxy  = 1.0;
00175     zero  = (T)0;
00176     base  = (T)0;
00177     min   = (T)0;
00178     max   = (T)0;
00179     norm  = 1.0;
00180     color = GRAPH_COLOR_UNKNOWN;
00181     state = STATE_GRAPH_NOERR;
00182     rbound.init();
00183 
00184     wRateX = wRateY = 1.0;
00185     wZeroX = wZeroY = 1.0;
00186     wNowX  = wNowY  = 0.0;
00187 
00188     return;
00189 }
00190 
00191 
00197 template <typename T>  bool  MSGraph<T>::isNull() 
00198 {
00199     if (gp==NULL) return true; 
00200 
00201 #ifdef WIN32
00202     if (gp==(T*)WIN_DD_NULL) return true; 
00203 #endif
00204 
00205     return false;
00206 }
00207 
00208 
00209 
00210 template <typename T>  void  MSGraph<T>::set(RBound<int> rb, T v, T b, double rz) 
00211 {
00212     set(rb.xmax-rb.xmin+1, rb.ymax-rb.ymin+1, rb.zmax-rb.zmin+1, v, b, rz);
00213     rbound = rb;
00214     return;
00215 }
00216 
00217 
00218 
00219 template <typename T>  void  MSGraph<T>::set(int x, int y, int z, T v, T b, double rz) 
00220 {
00221     if (z<=0) z = 1;
00222 
00223     getm(x, y, z, v); 
00224     if (gp==NULL) return;
00225 
00226     base = b;
00227     if (rz<=0.0) RZxy = 1.0;
00228     else         RZxy = rz;
00229     rbound.set(0, x-1, 0, y-1, 0, z-1);
00230     
00231     color = GRAPH_COLOR_UNKNOWN;
00232     if (z==1) color = GRAPH_COLOR_MONO;
00233 
00234     norm  = 1.0;
00235     state = STATE_GRAPH_NOERR;
00236     return;
00237 }
00238 
00239 
00240 
00254 template <typename T> void  MSGraph<T>::getm(int x, int y, int z, T v)
00255 {
00256     xs = x;
00257     ys = y;
00258     zs = z;
00259     gp = NULL;
00260     zero = max = min = v;
00261 
00262     if (xs>0 && ys>0 && zs>0) {
00263         gp = (T*)malloc(xs*ys*zs*sizeof(T));
00264         if (gp==NULL) {
00265             init();
00266             state = JBXL_GRAPH_MEMORY_ERROR;
00267             return;
00268         }
00269         for (int i=0; i<xs*ys*zs; i++) gp[i] = (T)v;
00270     }
00271 }
00272 
00273 
00274 
00286 template <typename T> void  MSGraph<T>::getm(T v)
00287 {
00288     gp = NULL;
00289     zero = max = min = v;
00290 
00291     if (xs>0 && ys>0 && zs>0) {
00292         gp = (T*)malloc(xs*ys*zs*sizeof(T));
00293         if (gp==NULL) {
00294             init();
00295             state = JBXL_GRAPH_MEMORY_ERROR;
00296             return;
00297         }
00298         for (int i=0; i<xs*ys*zs; i++) gp[i] = (T)v;
00299     }
00300 }
00301 
00302 
00303 template <typename T> void  MSGraph<T>::get_minmax(void)
00304 {
00305     int i;
00306 
00307     min = max = gp[0];
00308 
00309     for (i=1; i<xs*ys; i++) {
00310         min = Min(min, gp[i]);
00311         max = Max(max, gp[i]);
00312     }
00313 }
00314 
00315 
00316 template <typename T> void  MSGraph<T>::set_array(T* ary, int sz)
00317 {
00318     int size = xs*ys*zs;
00319 
00320     if (sz>0) size = Min(size, sz);
00321     for (int i=0; i<size; i++) gp[i] = ary[i];
00322 }
00323 
00324 
00325 template <typename T> void  MSGraph<T>::contrast(T low, T high)
00326 {
00327     if (max==min) return;
00328 
00329     T dif = (high-low)/(max-min);
00330 
00331     for (int i=0; i<xs*ys*zs; i++) {
00332         gp[i] = (gp[i]-min)*dif + low;
00333     }
00334 
00335     return;
00336 }
00337 
00338 
00339 
00345 template <typename T>  void  MSGraph<T>::fill(T v) 
00346 {       
00347     for (int i=0; i<xs*ys*zs; i++) gp[i] = v;
00348     min = max = v;
00349     return;
00350 }
00351 
00352 
00353 
00359 template <typename T>  void  MSGraph<T>::clear(T v) 
00360 {       
00361     for (int i=0; i<xs*ys*zs; i++) gp[i] = v;
00362     zero = min = max = v;
00363     return;
00364 }
00365 
00366 
00367 
00373 template <typename T>  void  MSGraph<T>::clear(void) 
00374 {       
00375     for (int i=0; i<xs*ys*zs; i++) gp[i] = zero; 
00376     min = max = zero;
00377     return;
00378 }
00379 
00380 
00381 
00387 template <typename T>  void  MSGraph<T>::free(void) 
00388 {  
00389     if (gp!=NULL) ::free(gp); 
00390     init();
00391     return;
00392 }
00393 
00394 
00395 
00407 template <typename T> T  MSGraph<T>::get_vPoint(double x, double y, double z, int mode)
00408 {
00409     int   ix, iy, iz;
00410     int   xx, yy, zz;
00411     T     ret;
00412 
00413     ret = zero;
00414 
00415     z  = z*RZxy;  
00416     if (mode==OFF) {
00417         ix = (int)(x+0.5) - rbound.xmin;
00418         iy = (int)(y+0.5) - rbound.ymin;
00419         iz = (int)(z+0.5) - rbound.zmin;
00420         if (ix>=0 && ix<xs &&iy>=0 && iy<ys && iz>=0 && iz<zs){
00421             ret = gp[iz*xs*ys + iy*xs + ix];
00422         }
00423     }
00424     else {
00425         int n = 0;
00426         T cc = (T)0;
00427 
00428         xx = (int)x - rbound.xmin;
00429         yy = (int)y - rbound.ymin;
00430         zz = (int)z - rbound.zmin;
00431         for (ix=xx; ix<=xx+1; ix++)
00432         for (iy=yy; iy<=yy+1; iy++)
00433         for (iz=zz; iz<=zz+1; iz++) {
00434             if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
00435                 cc = cc + gp[iz*xs*ys + iy*xs + ix];
00436                 n++;
00437             }
00438         }
00439         if (n!=0) ret = cc/n;
00440     }
00441 
00442     return ret;
00443 }
00444 
00445 
00446 
00458 template <typename T>  void  MSGraph<T>::set_vPoint(double x, double y, double z, T cc, int mode)
00459 {
00460     int   ix, iy, iz;
00461     int   xx, yy, zz;
00462 
00463     z = z*RZxy;  
00464     if (mode==OFF) {
00465         ix = (int)(x+0.5) - rbound.xmin;
00466         iy = (int)(y+0.5) - rbound.ymin;
00467         iz = (int)(z+0.5) - rbound.zmin;
00468         if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
00469             gp[iz*xs*ys + iy*xs + ix] = cc;
00470         }
00471     }
00472     else {
00473         xx = (int)x - rbound.xmin;
00474         yy = (int)y - rbound.ymin;
00475         zz = (int)z - rbound.zmin;
00476         for (ix=xx; ix<=xx+1; ix++)
00477         for (iy=yy; iy<=yy+1; iy++)
00478         for (iz=zz; iz<=zz+1; iz++) {
00479             if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
00480                 gp[iz*xs*ys + iy*xs + ix] = cc;
00481             }
00482         }
00483     }
00484     return;
00485 }
00486 
00487 
00488 
00503 template <typename T>  void  MSGraph<T>::put_vPoint(double x, double y, double z, T cc, int mode)
00504 {
00505     int   ix, iy, iz;
00506     int   xx, yy, zz;
00507 
00508     z = z*RZxy;  
00509     if (mode==OFF) {
00510         ix = (int)(x+0.5) - rbound.xmin;
00511         iy = (int)(y+0.5) - rbound.ymin;
00512         iz = (int)(z+0.5) - rbound.zmin;
00513         if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
00514             if (gp[iz*xs*ys + iy*xs + ix]==zero) gp[iz*xs*ys + iy*xs + ix] = cc;
00515         }
00516     }
00517     else {
00518         xx = (int)x - rbound.xmin;
00519         yy = (int)y - rbound.ymin;
00520         zz = (int)z - rbound.zmin;
00521         for (ix=xx; ix<=xx+1; ix++)
00522         for (iy=yy; iy<=yy+1; iy++)
00523         for (iz=zz; iz<=zz+1; iz++) {
00524             if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
00525                 if (gp[iz*xs*ys + iy*xs + ix]==zero) gp[iz*xs*ys + iy*xs + ix] = cc;
00526             }
00527         }
00528    }
00529 
00530     return;
00531 }
00532 
00533 
00534 template <typename T> void  MSGraph<T>::setWindow(double x1, double y1, double x2, double y2)
00535 {
00536     if (x1==x2 || y1==y2) return;
00537 
00538     wRateX = (xs-1.0)/Xabs(x2-x1);
00539     wRateY = (ys-1.0)/Xabs(y2-y1);
00540     wZeroX = Min(x1, x2);
00541     wZeroY = Max(y1, y2);
00542 }
00543 
00544 
00545 
00568 template <typename T> void  MSGraph<T>::setWindow3D(double x1, double y1, double z1, double x2, double y2, double z2)
00569 {
00570     if (x1==x2 || y1==y2 || z1==z2) return;
00571 
00572     wRateX = (xs-1.0)/Xabs(x2-x1);
00573     wRateY = (ys-1.0)/Xabs(y2-y1);
00574     wRateZ = (zs-1.0)/Xabs(z2-z1);
00575     wZeroX = Max(x1, x2);
00576     wZeroY = Min(y1, y2);
00577     wZeroZ = Max(z1, z2);
00578 }
00579 
00580 
00581 
00582 
00583 
00584 template <typename T>  MSGraph<T> MSGraph<T>::operator= (ExMSGraph<T>& s)
00585 {
00586     xs     = s.xs;
00587     ys     = s.ys;
00588     zs     = s.zs;
00589     gp     = s.gp;
00590     zero   = s.zero;
00591     base   = s.base;
00592 
00593     max    = s.max;
00594     min    = s.min;
00595     color  = s.color;
00596     state  = s.state;
00597     rbound = s.rbound;
00598     RZxy   = s.RZxy;
00599     norm   = s.norm;
00600 
00601     wRateX = s.wRateX;
00602     wRateY = s.wRateY;
00603     wRateZ = s.wRateZ;
00604     wZeroX = s.wZeroX;
00605     wZeroY = s.wZeroY;
00606     wZeroZ = s.wZeroZ;
00607     wNowX  = s.wNowX;
00608     wNowY  = s.wNowY;
00609     wNowZ  = s.wNowZ;
00610 
00611     return *this;
00612 }
00613 
00614 
00615 
00616 
00618 
00619 
00620 template <typename T=uWord> class MSGraphDisp : public CVDisplay
00621 {
00622 public:
00623 
00624 public:
00625     MSGraphDisp()  {}
00626     virtual ~MSGraphDisp() {}
00627 
00628     virtual void  displayNew (MSGraph<T> vp) {}
00629     virtual void  displayNext(MSGraph<T> vp) {}
00630 };
00631 
00632 
00633 
00634 
00636 
00637 
00638 
00639 
00640 #define   CH2MG_NORMAL   0   //< ノーマルコピー
00641 #define   CH2MG_NOPARM   1   
00642 
00643 #define   MG2CH_NORMAL   0   
00644 #define   MG2CH_NOPARM   1   
00645 #define   MG2CH_CONTRAST 2   
00646 #define   MG2CH_OCTET    4   
00647 
00648 
00649 
00650 
00667 template <typename T>  MSGraph<T> copyCmnHead2MSGraph(CmnHead hd, unsigned int mode=CH2MG_NORMAL, bool cnt=false)
00668 {
00669     MSGraph<T> vp;
00670     int kind = hd.kind & 0x00ff;
00671 
00672     vp.init();  
00673 
00674     if (kind==UN_KNOWN_DATA || hd.kind==HEADER_NONE) {
00675         vp.state = JBXL_GRAPH_HEADER_ERROR;
00676         return vp;
00677     }
00678 
00679     vp.set(hd.xsize, hd.ysize, hd.zsize);
00680     if (vp.gp==NULL) { vp.state = JBXL_GRAPH_MEMORY_ERROR; return vp;}
00681 
00682     
00683     if (kind==JPEG_RGB_DATA || kind==JPEG_MONO_DATA) {
00684         
00685         if (hd.zsize==3) vp.color = GRAPH_COLOR_RGB;
00686     }
00687     else if (hd.depth==16) {
00688         vp.color = GRAPH_COLOR_MONO16;
00689     }
00690 
00691     
00692     CVCounter* counter = NULL;
00693     if (vp.zs>=10 && cnt) {
00694         counter = GetUsableGlobalCounter();
00695         if (counter!=NULL) counter->SetMax(vp.zs/10);
00696     }
00697 
00698     int ks, js, ln;
00699     ln = vp.xs*vp.ys;
00700 
00701     if (hd.depth==16){
00702         sWord* bp = (sWord*)hd.grptr;
00703         vp.max = vp.min = bp[0];
00704         for (int k=0; k<vp.zs; k++) {
00705             ks = k*ln;
00706             for (int j=0; j<vp.xs*vp.ys; j++) {
00707                 js = j+ ks;
00708                 vp.gp[js] = bp[js];
00709                 vp.max = Max(vp.max, vp.gp[js]);
00710                 vp.min = Min(vp.min, vp.gp[js]);
00711             }
00712             
00713             if (counter!=NULL && k%10==0) {
00714                 counter->StepIt();
00715                 if (counter->isCanceled()) {        
00716                     vp.free();
00717                     vp.state = JBXL_GRAPH_CANCEL;
00718                     return vp;
00719                 }
00720             }
00721 
00722         }
00723     }
00724 
00725     else if (hd.depth<16){ 
00726         
00727         vp.max = vp.min = (T)((unsigned char)hd.grptr[0]);
00728         for (int k=0; k<vp.zs; k++) {
00729             ks = k*ln;
00730             for (int j=0; j<vp.xs*vp.ys; j++) {
00731                 js = j + ks;
00732                 vp.gp[js] = (T)((unsigned char)hd.grptr[js]); 
00733                 vp.max = Max(vp.max, vp.gp[js]);
00734                 vp.min = Min(vp.min, vp.gp[js]);
00735             }
00736 
00737             if (counter!=NULL && k%10==0) {
00738                 counter->StepIt();
00739                 if (counter->isCanceled()) {        
00740                     vp.free();
00741                     vp.state = JBXL_GRAPH_CANCEL;
00742                     return vp;
00743                 }
00744             }
00745         }
00746     }
00747 
00748     else {
00749         vp.max = vp.min = (T)((uByte)hd.grptr[0]>>(hd.depth-15));
00750         for (int k=0; k<vp.zs; k++) {
00751             ks = k*ln;
00752             for (int j=0; j<vp.xs*vp.ys; j++) {
00753                 js = j + ks;
00754                 vp.gp[js] = (T)((uByte)hd.grptr[js]>>(hd.depth-15));
00755                 vp.max = Max(vp.max, vp.gp[js]);
00756                 vp.min = Min(vp.min, vp.gp[js]);
00757             }
00758 
00759             if (counter!=NULL && k%10==0) {
00760                 counter->StepIt();
00761                 if (counter->isCanceled()) {        
00762                     vp.free();
00763                     vp.state = JBXL_GRAPH_CANCEL;
00764                     return vp;
00765                 }
00766             }
00767         }
00768     }
00769 
00770     
00771     if (!checkBit(mode, CH2MG_NOPARM)) {
00772         if (hd.bsize>0 && (kind==CT_DATA || kind==CT_3DM || kind==CT_3D_VOL)) {
00773             sWord* rz = (sWord*)hd.buf;
00774             if (rz[9]==RZXY_RATE || checkBit(hd.kind, HAS_RZXY)) {
00775                 double rzm = rz[8]/(double)rz[9];
00776                 if (rzm<5.0 && rzm>0.) vp.RZxy = rzm;
00777             }
00778 
00779             if (rz[10]!=0 && checkBit(hd.kind, HAS_BASE)) {
00780                 vp.base = (T)rz[10];
00781             }
00782 
00783             if (checkBit(hd.kind, HAS_RBOUND)) {
00784                 vp.rbound.xmin = rz[6];
00785                 vp.rbound.xmax = rz[7];
00786                 vp.rbound.ymin = rz[4];
00787                 vp.rbound.ymax = rz[5];
00788                 vp.rbound.zmin = rz[2];
00789                 vp.rbound.zmax = rz[3];
00790             }
00791         }
00792     }
00793 
00794     if (counter!=NULL) counter->PutFill();
00795 
00796     return  vp;
00797 }
00798 
00799 
00800 
00822 template <typename T>  CmnHead  copyMSGraph2CmnHead(MSGraph<T>& vp, unsigned int mode=MG2CH_NORMAL, bool cnt=false)
00823 {
00824     CmnHead  hd;
00825     CTHead   ct;
00826 
00827     memset(&ct, 0, sizeof(CTHead));
00828     memset(&hd, 0, sizeof(CmnHead));
00829 
00830     if (vp.gp==NULL) {
00831         hd.xsize = JBXL_GRAPH_HEADER_ERROR;
00832         hd.kind  = HEADER_NONE;
00833         return hd;
00834     }
00835 
00836     
00837     hd.kind  = 0;   
00838     hd.xsize = ct.xsize = ct.cutright= vp.xs;
00839     hd.ysize = ct.ysize = ct.cutdown = vp.ys;
00840     hd.zsize = vp.zs;
00841 
00842     if (checkBit(mode, MG2CH_OCTET)) hd.depth = 8;
00843     else                             hd.depth = sizeof(T)*8;
00844     hd.lsize = hd.xsize*hd.ysize*hd.zsize*(hd.depth/8);
00845     hd.bsize = sizeof(CTHead);
00846 
00847     hd.grptr = (uByte*)malloc(hd.lsize*sizeof(uByte));
00848     if (hd.grptr==NULL) {
00849         hd.xsize = JBXL_GRAPH_MEMORY_ERROR;
00850         hd.kind  = HEADER_NONE;
00851         return hd;
00852     }
00853     hd.buf = (uByte*)malloc(hd.bsize*sizeof(uByte));
00854     if (hd.buf==NULL) {
00855         free_CmnHead(&hd);
00856         hd.xsize = JBXL_GRAPH_MEMORY_ERROR;
00857         return hd;
00858     }
00859 
00860     
00861     CVCounter* counter = NULL;
00862 
00863     if (hd.zsize>=5 && cnt) {
00864         counter = GetUsableGlobalCounter();
00865         if (counter!=NULL) counter->SetMax(hd.zsize*2/10);
00866     }
00867 
00868     
00869     int j, k, ks, js, ln;
00870     T   max, min;
00871     max = min = vp.gp[0];
00872 
00873     ln = vp.xs*vp.ys;
00874     for (k=0; k<vp.zs; k++) {
00875         ks = k*ln;
00876         for (j=0; j<vp.ys*vp.xs; j++) {
00877             js = j + ks;
00878             min = Min(vp.gp[js], min);
00879             max = Max(vp.gp[js], max);
00880         }
00881 
00882         
00883         if (counter!=NULL && k%10==0) {
00884             counter->StepIt();
00885             if (counter->isCanceled()) {        
00886                 free_CmnHead(&hd);
00887                 hd.xsize = JBXL_GRAPH_CANCEL;
00888                 return hd;
00889             }
00890         }
00891     }
00892     vp.max = max;
00893     vp.min = min;
00894 
00895     
00896     if (mode==MG2CH_NORMAL) {
00897         memcpy(hd.grptr, vp.gp, hd.lsize);
00898     }
00899 
00900     
00901     else if (checkBit(mode, MG2CH_OCTET)) {
00902         
00903         if (!checkBit(mode, MG2CH_CONTRAST) && vp.max<=255 && vp.min>=0) {
00904             max = 255;
00905             min = 0;
00906         }
00907 
00908         for (k=0; k<hd.zsize; k++) {
00909             ks = k*ln;
00910             for (j=0; j<hd.xsize*hd.ysize; j++) {
00911                 js = j + ks;
00912                 hd.grptr[js] = (uByte)(((vp.gp[js]-min)/(double)(max-min))*255.);
00913             }
00914             
00915             
00916             if (counter!=NULL && k%10==0) {
00917                 counter->StepIt();
00918                 if (counter->isCanceled()) {        
00919                     free_CmnHead(&hd);
00920                     hd.xsize = JBXL_GRAPH_CANCEL;
00921                     return hd;
00922                 }
00923             }
00924         }
00925     }
00926     if (counter!=NULL) counter->PutFill();
00927 
00928     memcpy(hd.buf, &ct, hd.bsize);
00929 
00930     
00931     if (!checkBit(mode, MG2CH_NOPARM)) {
00932         sWord* rz  = (sWord*)hd.buf;
00933         if (vp.RZxy!=1.0) {     
00934             hd.kind = hd.kind | HAS_RZXY;
00935             rz[9] = (sWord)RZXY_RATE;
00936             rz[8] = (sWord)(vp.RZxy*RZXY_RATE);
00937         }
00938         if (vp.base!=0) {
00939             rz[10] = (sWord)vp.base;
00940             hd.kind |= HAS_BASE;
00941         }
00942         rz[2] = (sWord)vp.rbound.zmin;
00943         rz[3] = (sWord)vp.rbound.zmax;
00944         rz[4] = (sWord)vp.rbound.ymin;
00945         rz[5] = (sWord)vp.rbound.ymax;
00946         rz[6] = (sWord)vp.rbound.xmin;
00947         rz[7] = (sWord)vp.rbound.xmax;
00948         hd.kind |= HAS_RBOUND;
00949     }
00950 
00951     return hd;
00952 }
00953 
00954 
00955 
00956 
00957 
00958 template <typename T>  MSGraph<T>  scalingMSGraph2D(MSGraph<T> vp, double scale)
00959 {
00960     MSGraph<T> xp;
00961 
00962     if (scale==0.0) return xp;
00963 
00964     int xs = (int)(vp.xs*scale);
00965     int ys = (int)(vp.ys*scale);
00966     int zs = vp.zs;
00967     int ps = xs*ys;
00968     if (vp.xs*scale-xs>0.0) xs++;
00969     if (vp.ys*scale-ys>0.0) ys++;
00970 
00971     xp.set(xs, ys, zs);
00972     xp.getm();
00973     xp.color = vp.color;
00974 
00975     for (int kk=0; kk<zs; kk++) {
00976         int posk = kk*ps;
00977         
00978         for (int jj=0; jj<ys; jj++) {
00979             int posj = jj*xs + posk;
00980             double y = jj/scale;
00981             int j = (int)y;
00982             int n = j + 1;
00983             if (j>vp.ys-1) j = vp.ys-1;
00984             if (n>vp.ys-1) n = vp.ys-1;
00985             double bt = y - j;
00986             
00987             for (int ii=0; ii<xs; ii++) {
00988                 double x = ii/scale;
00989                 int i = (int)x;
00990                 int m = i + 1;
00991                 if (j>vp.xs-1) j = vp.xs-1;
00992                 if (n>vp.xs-1) n = vp.xs-1;
00993                 double al = x - i;
00994                 
00995                 T a = vp.point(i, j, kk);
00996                 T b = vp.point(m, j, kk);
00997                 T c = vp.point(i, n, kk);
00998                 T d = vp.point(m, n, kk);
00999                 T p = (T)(a*(1.0-al)*(1.0-bt) + b*al*(1.0-bt) + c*(1.0-al)*bt + d*al*bt);
01000 
01001                 xp.gp[ii+posj] = p;
01002             }
01003         }
01004     }
01005         
01006     return xp;
01007 }
01008 
01009 
01010 
01011 
01013 
01014 
01015 
01016 inline  unsigned int  ARGB2Int(unsigned int a, unsigned int r, unsigned int g, unsigned int b)
01017 {
01018     if (isBigEndian) {      
01019         a = (unsigned int)((a&0x000000ff)<<24);
01020         r = (unsigned int)((r&0x000000ff)<<16);
01021         g = (unsigned int)((g&0x000000ff)<<8);
01022         b = (unsigned int) (b&0x000000ff);
01023     }
01024     else {                  
01025         b = (unsigned int)((b&0x000000ff)<<24);
01026         g = (unsigned int)((g&0x000000ff)<<16);
01027         r = (unsigned int)((r&0x000000ff)<<8);
01028         a = (unsigned int) (a&0x000000ff);
01029     }
01030 
01031     unsigned int c = (unsigned int)(a + r + g + b);
01032     return  c;
01033 }
01034 
01035 
01036 #define  RGBA2Int(r, g, b, a)  ARGB2Int((r), (g), (b), (a))
01037 #define  ABGR2Int(a, b, g, r)  ARGB2Int((a), (b), (g), (r))
01038 #define  BGRA2Int(b, g, r, a)  ARGB2Int((b), (g), (r), (a))
01039 
01040 
01041 inline  uWord  ARGB2Word(uWord a, uWord r, uWord g, uWord b)
01042 {
01043     if (isBigEndian) {  
01044         a = (int)(((a&0x00ff)>>4)<<12);
01045         r = (int)(((r&0x00ff)>>4)<<8);
01046         g = (int)(((g&0x00ff)>>4)<<4);
01047         b = (int) ((b&0x00ff)>>4);
01048     }
01049     else {              
01050         g = (int)(((g&0x00ff)>>4)<<12);
01051         b = (int)(((b&0x00ff)>>4)<<8);
01052         a = (int)(((a&0x00ff)>>4)<<4);
01053         r = (int) ((r&0x00ff)>>4);
01054     }
01055 
01056     uWord c = (uWord)(a + r + g + b);
01057     return  c;
01058 }
01059 
01060 
01061 #define  RGBA2Word(r, g, b, a)  ARGB2Word((r), (g), (b), (a))
01062 #define  ABGR2Word(a, b, g, r)  ARGB2Word((a), (b), (g), (r))
01063 #define  BGRA2Word(b, g, r, a)  ARGB2Word((b), (g), (r), (a))
01064 
01065 
01066 inline  uWord  RGB2Word(uWord r, uWord g, uWord b)
01067 {
01068     r = (int)(((r&0x00ff)>>3)<<11);
01069     g = (int)(((g&0x00ff)>>2)<<5);
01070     b = (int) ((b&0x00ff)>>3);
01071     uWord c = (uWord)(r + g + b);
01072 
01073     if (isLittleEndian) swap_byte(&c, 2, 2);
01074     return  c;
01075 }
01076 
01077 
01090 }       
01091 
01092 
01093 #endif
01094