1#ifndef __JBXL_CPP_GRAPHIC_DATA_H_
2#define __JBXL_CPP_GRAPHIC_DATA_H_
30#define freeCmnHead free_CmnHead
31#define initCmnHead init_CmnHead
62template <
typename T>
class MSGraph;
63template <
typename T>
class ExMSGraph;
108 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);}
116 void set_vPoint(
double x,
double y=0.,
double z=0., T cc=(T)0,
int mode=
OFF);
117 void put_vPoint(
double x,
double y=0.,
double z=0., T cc=(T)0,
int mode=
OFF);
120 void set(
int x,
int y=1,
int z=1, T v=(T)0, T b=(T)0,
double rz=1.0);
127 void getm(
int x,
int y,
int z=1, T v=(T)0);
151 void setWindow(
double x1,
double y1,
double x2,
double y2);
152 void setWindow3D(
double x1,
double y1,
double z1,
double x2,
double y2,
double z2);
181 wRateX = wRateY = 1.0;
182 wZeroX = wZeroY = 1.0;
196 if (gp==NULL)
return true;
221 if (gp==NULL)
return;
224 if (rz<=0.0) RZxy = 1.0;
226 rbound.
set(0, x-1, 0, y-1, 0, z-1);
256 zero = max = min = v;
258 if (xs>0 && ys>0 && zs>0) {
259 gp = (T*)malloc(xs*ys*zs*
sizeof(T));
265 for (
int i=0; i<xs*ys*zs; i++) gp[i] = (T)v;
284 zero = max = min = v;
286 if (xs>0 && ys>0 && zs>0) {
287 gp = (T*)malloc(xs*ys*zs*
sizeof(T));
293 for (
int i=0; i<xs*ys*zs; i++) gp[i] = (T)v;
304 for (i=1; i<xs*ys; i++) {
305 min =
Min(min, gp[i]);
306 max =
Max(max, gp[i]);
315 if (sz>0) size =
Min(size, sz);
316 for (
int i=0; i<size; i++) gp[i] = ary[i];
322 if (max==min)
return;
324 T dif = (high-low)/(max-min);
326 for (
int i=0; i<xs*ys*zs; i++) {
327 gp[i] = (gp[i]-min)*dif + low;
341 for (
int i=0; i<xs*ys*zs; i++) gp[i] = v;
354 for (
int i=0; i<xs*ys*zs; i++) gp[i] = v;
355 zero = min = max = v;
367 for (
int i=0; i<xs*ys*zs; i++) gp[i] = zero;
380 if (gp!=NULL) ::free(gp);
407 ix = (int)(x+0.5) - rbound.
xmin;
408 iy = (int)(y+0.5) - rbound.
ymin;
409 iz = (int)(z+0.5) - rbound.
zmin;
410 if (ix>=0 && ix<xs &&iy>=0 && iy<ys && iz>=0 && iz<zs){
411 ret = gp[iz*xs*ys + iy*xs + ix];
418 xx = (int)x - rbound.
xmin;
419 yy = (int)y - rbound.
ymin;
420 zz = (int)z - rbound.
zmin;
421 for (ix=xx; ix<=xx+1; ix++)
422 for (iy=yy; iy<=yy+1; iy++)
423 for (iz=zz; iz<=zz+1; iz++) {
424 if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
425 cc = cc + gp[iz*xs*ys + iy*xs + ix];
429 if (n!=0) ret = cc/n;
454 ix = (int)(x+0.5) - rbound.
xmin;
455 iy = (int)(y+0.5) - rbound.
ymin;
456 iz = (int)(z+0.5) - rbound.
zmin;
457 if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
458 gp[iz*xs*ys + iy*xs + ix] = cc;
462 xx = (int)x - rbound.
xmin;
463 yy = (int)y - rbound.
ymin;
464 zz = (int)z - rbound.
zmin;
465 for (ix=xx; ix<=xx+1; ix++)
466 for (iy=yy; iy<=yy+1; iy++)
467 for (iz=zz; iz<=zz+1; iz++) {
468 if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
469 gp[iz*xs*ys + iy*xs + ix] = cc;
498 ix = (int)(x+0.5) - rbound.
xmin;
499 iy = (int)(y+0.5) - rbound.
ymin;
500 iz = (int)(z+0.5) - rbound.
zmin;
501 if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
502 if (gp[iz*xs*ys + iy*xs + ix]==zero) gp[iz*xs*ys + iy*xs + ix] = cc;
506 xx = (int)x - rbound.
xmin;
507 yy = (int)y - rbound.
ymin;
508 zz = (int)z - rbound.
zmin;
509 for (ix=xx; ix<=xx+1; ix++)
510 for (iy=yy; iy<=yy+1; iy++)
511 for (iz=zz; iz<=zz+1; iz++) {
512 if (ix>=0 && ix<xs && iy>=0 && iy<ys && iz>=0 && iz<zs){
513 if (gp[iz*xs*ys + iy*xs + ix]==zero) gp[iz*xs*ys + iy*xs + ix] = cc;
524 if (x1==x2 || y1==y2)
return;
526 wRateX = (xs-1.0)/
Xabs(x2-x1);
527 wRateY = (ys-1.0)/
Xabs(y2-y1);
528 wZeroX =
Min(x1, x2);
529 wZeroY =
Max(y1, y2);
557 if (x1==x2 || y1==y2 || z1==z2)
return;
559 wRateX = (xs-1.0)/
Xabs(x2-x1);
560 wRateY = (ys-1.0)/
Xabs(y2-y1);
561 wRateZ = (zs-1.0)/
Xabs(z2-z1);
562 wZeroX =
Max(x1, x2);
563 wZeroY =
Min(y1, y2);
564 wZeroZ =
Max(z1, z2);
624#define CH2MG_NORMAL 0
625#define CH2MG_NOPARM 1
627#define MG2CH_NORMAL 0
628#define MG2CH_NOPARM 1
629#define MG2CH_CONTRAST 2
654 int kind = hd.
kind & 0x00ff;
671 else if (hd.
depth==16) {
677 if (vp.
zs>=10 && cnt) {
679 if (counter!=NULL) counter->
SetMax(vp.
zs/10);
688 for (
int k=0; k<vp.
zs; k++) {
690 for (
int j=0; j<vp.
xs*vp.
ys; j++) {
697 if (counter!=NULL && k%10==0) {
709 else if (hd.
depth<16){
712 for (
int k=0; k<vp.
zs; k++) {
714 for (
int j=0; j<vp.
xs*vp.
ys; j++) {
716 vp.
gp[js] = (T)((
unsigned char)hd.
grptr[js]);
721 if (counter!=NULL && k%10==0) {
734 for (
int k=0; k<vp.
zs; k++) {
736 for (
int j=0; j<vp.
xs*vp.
ys; j++) {
743 if (counter!=NULL && k%10==0) {
759 double rzm = rz[8]/(double)rz[9];
760 if (rzm<5.0 && rzm>0.) vp.
RZxy = rzm;
778 if (counter!=NULL) counter->
PutFill();
810 memset(&ct, 0,
sizeof(
CTHead));
811 memset(&hd, 0,
sizeof(
CmnHead));
826 else hd.
depth =
sizeof(T)*8;
831 if (hd.
grptr==NULL) {
849 if (hd.
zsize>=5 && cnt) {
855 int j, k, ks, js, ln;
857 max = min = vp.
gp[0];
860 for (k=0; k<vp.
zs; k++) {
862 for (j=0; j<vp.
ys*vp.
xs; j++) {
864 min =
Min(vp.
gp[js], min);
865 max =
Max(vp.
gp[js], max);
869 if (counter!=NULL && k%10==0) {
894 for (k=0; k<hd.
zsize; k++) {
898 hd.
grptr[js] = (
uByte)(((vp.
gp[js]-min)/(
double)(max-min))*255.);
902 if (counter!=NULL && k%10==0) {
912 if (counter!=NULL) counter->
PutFill();
947 if (scale==0.0)
return xp;
949 int xs = (int)(vp.
xs*scale);
950 int ys = (int)(vp.
ys*scale);
953 if (vp.
xs*scale-xs>0.0) xs++;
954 if (vp.
ys*scale-ys>0.0) ys++;
960 for (
int kk=0; kk<zs; kk++) {
963 for (
int jj=0; jj<ys; jj++) {
964 int posj = jj*xs + posk;
968 if (j>vp.
ys-1) j = vp.
ys-1;
969 if (n>vp.
ys-1) n = vp.
ys-1;
972 for (
int ii=0; ii<xs; ii++) {
976 if (j>vp.
xs-1) j = vp.
xs-1;
977 if (n>vp.
xs-1) n = vp.
xs-1;
980 T a = vp.
point(i, j, kk);
981 T b = vp.
point(m, j, kk);
982 T c = vp.
point(i, n, kk);
983 T d = vp.
point(m, n, kk);
984 T p = (T)(a*(1.0-al)*(1.0-bt) + b*al*(1.0-bt) + c*(1.0-al)*bt + d*al*bt);
1000inline unsigned int ARGB2Int(
unsigned int a,
unsigned int r,
unsigned int g,
unsigned int b)
1003 a = (
unsigned int)((a&0x000000ff)<<24);
1004 r = (
unsigned int)((r&0x000000ff)<<16);
1005 g = (
unsigned int)((g&0x000000ff)<<8);
1006 b = (
unsigned int) (b&0x000000ff);
1009 b = (
unsigned int)((b&0x000000ff)<<24);
1010 g = (
unsigned int)((g&0x000000ff)<<16);
1011 r = (
unsigned int)((r&0x000000ff)<<8);
1012 a = (
unsigned int) (a&0x000000ff);
1015 unsigned int c = (
unsigned int)(a + r + g + b);
1020#define RGBA2Int(r, g, b, a) ARGB2Int((r), (g), (b), (a))
1021#define ABGR2Int(a, b, g, r) ARGB2Int((a), (b), (g), (r))
1022#define BGRA2Int(b, g, r, a) ARGB2Int((b), (g), (r), (a))
1028 a = (int)(((a&0x00ff)>>4)<<12);
1029 r = (int)(((r&0x00ff)>>4)<<8);
1030 g = (int)(((g&0x00ff)>>4)<<4);
1031 b = (int) ((b&0x00ff)>>4);
1034 g = (int)(((g&0x00ff)>>4)<<12);
1035 b = (int)(((b&0x00ff)>>4)<<8);
1036 a = (int)(((a&0x00ff)>>4)<<4);
1037 r = (int) ((r&0x00ff)>>4);
1045#define RGBA2Word(r, g, b, a) ARGB2Word((r), (g), (b), (a))
1046#define ABGR2Word(a, b, g, r) ARGB2Word((a), (b), (g), (r))
1047#define BGRA2Word(b, g, r, a) ARGB2Word((b), (g), (r), (a))
1052 r = (int)(((r&0x00ff)>>3)<<11);
1053 g = (int)(((g&0x00ff)>>2)<<5);
1054 b = (int) ((b&0x00ff)>>3);
#define MG2CH_CONTRAST
コントラスト調整を行う
#define MG2CH_NORMAL
ノーマルコピー
#define MG2CH_NOPARM
パラメータ処理(Z軸の歪, rboundの処理)をしない.
#define CH2MG_NOPARM
パラメータ処理(Z軸の歪, rboundの処理)をしない.
#define MG2CH_OCTET
8bitへ変換
virtual void StepIt(int n=1)
カウンタのメモリを増やす
virtual void SetMax(int m)
カウンタの最大値(最終目標)を設定
virtual void PutFill()
取り敢えずの目標(最短目標)までカウンタを進める.
virtual bool isCanceled()
カウンタがオペレータにより,キャンセルされたか
virtual void displayNext(MSGraph< T > vp)
virtual void displayNew(MSGraph< T > vp)
T get_vPoint(double x, double y=0., double z=0., int mode=OFF)
void clear(T v)
全空間を画素値 v にする
double wNowZ
ペンの現地点の z成分(ワールド座標系)
double wZeroX
スクリーン座標系の原点に対するワールド座標系の x成分.
double wZeroY
スクリーン座標系の原点に対するワールド座標系の y成分.
T & point(int x, int y=0, int z=0)
座標(x,y,z)の画素値の参照
void init(void)
グラフィックデータは解放しない
int zs
zサイズ. 4Byte. 2Dの場合は 1.
void set_array(T *ary, int sz=0)
ary の内容を gpにコピー.
MSGraph< T > operator=(ExMSGraph< T > &s)
void setWindow3D(double x1, double y1, double z1, double x2, double y2, double z2)
void get_minmax(void)
min, max を獲得
double wRateY
ワールド座標系の y成分1ドットに対するスクリーン座標系のドット数.
void contrast(T low, T high)
コントラストの調整
MSGraph(int x, int y=1, int z=1, T v=(T) 0, T b=(T) 0, double rz=1.0)
void put_vPoint(double x, double y=0., double z=0., T cc=(T) 0, int mode=OFF)
double wZeroZ
スクリーン座標系の原点に対するワールド座標系の z成分.
double wRateZ
ワールド座標系の z成分1ドットに対するスクリーン座標系のドット数.
double wNowX
ペンの現地点の x成分(ワールド座標系)
double norm
規格化定数.フィルタのときに使用.
MSGraph(RBound< int > rb, T v=(T) 0, T b=(T) 0, double rz=1.0)
void getm(T v=(T) 0)
グラフィックメモリを獲得する
void fill(T v=(T) 0)
全空間を画素値 v にする
void set(int x, int y=1, int z=1, T v=(T) 0, T b=(T) 0, double rz=1.0)
double RZxy
Z軸の歪.Z軸の間隔を 1とした XY軸の間隔.(X or Y)/Z.
void free(void)
グラフィックデータを開放する
void set(RBound< int > rb, T v=(T) 0, T b=(T) 0, double rz=1.0)
void setWindow(double x1, double y1, double x2, double y2)
bool isNull(void)
グラフィックデータを持っていないか?
void set_vPoint(double x, double y=0., double z=0., T cc=(T) 0, int mode=OFF)
void mimicry(MSGraph< R > s)
RBound< int > rbound
画像の境界情報
void clear(void)
全空間を画素値 zero にする
double wNowY
ペンの現地点の y成分(ワールド座標系)
void wMove(double x, double y, double z=0.0)
void getm(int x, int y, int z=1, T v=(T) 0)
グラフィックメモリを獲得する
void wMove_rel(double x, double y, double z=0.0)
double wRateX
ワールド座標系の x成分1ドットに対するスクリーン座標系のドット数.
void set(T XMin=(T) 0, T XMax=(T) 0, T YMin=(T) 0, T YMax=(T) 0, T ZMin=(T) 0, T ZMax=(T) 0, T TMin=(T) 0, T TMax=(T) 0)
unsigned short uWord
2Byte
#define checkBit(dat, bit)
#define JBXL_GRAPH_CANCEL
処理がキャンセルされた
#define JBXL_GRAPH_HEADER_ERROR
画像ヘッダーのエラー
#define JBXL_GRAPH_MEMORY_ERROR
メモリエラー
unsigned int ARGB2Int(unsigned int a, unsigned int r, unsigned int g, unsigned int b)
CVCounter * GetUsableGlobalCounter()
現在有効なグローバルカウンタを得る.(子カウンタを得るかもしれない)
uWord RGB2Word(uWord r, uWord g, uWord b)
MSGraph< T > scalingMSGraph2D(MSGraph< T > vp, double scale)
MSGraph< T > copyCmnHead2MSGraph(CmnHead hd, unsigned int mode=CH2MG_NORMAL, bool cnt=false)
uByte & CmnHeadBytePoint(CmnHead hd, int i=0, int j=0, int k=0)
共通ヘッダCmnHeadから座標を指定して,画像データを取り出す
void init_CmnHead(CmnHead *hd)
uWord ARGB2Word(uWord a, uWord r, uWord g, uWord b)
void free_CmnHead(CmnHead *hd)
CmnHead getinfo_CmnHead(CmnHead hd)
ヘッダ情報のみをコピーする
CmnHead copyMSGraph2CmnHead(MSGraph< T > &vp, unsigned int mode=MG2CH_NORMAL, bool cnt=false)
unsigned int lsize
Size of Graphics Data (byte unit)
uByte * buf
Ture Header buffer
int zsize
For 3D Data (or Color)
int kind
Kind of Graphics Format.
unsigned int bsize
Fllowing buf size or Any Data (byte unit)
uByte * grptr
Pointer to Data.
int ysize
Height of Graphics.
int depth
Color Depth of Graphics (bit unit)
int xsize
Width of Graphics.