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.