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