#include #include #include #include #include "pixiadll.h" #include "px_samp.h" #include "math.h" HINSTANCE hInst; int CALLBACK _DllMainCRTStartup( HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved ) { hInst = hInstance; return(1); } /* テスト用の設定パラメータ 何らかの設定ダイアログをもつフィルタの場合にはこのように使用します。 */ typedef struct tagSAMPLE{ int a; int b; }SAMPLE; SAMPLE sample; /* 設定パラメータをもつフィルタでは、このように設定パラメータを読み書きする。 */ BOOL ReadData( LPSTR szDir ) { unsigned char szDataDir[256]; HFILE hFile; strcpy( szDataDir, szDir ); strcat( szDataDir, "px_samp.dat" ); if(-1==(hFile=_lopen( szDataDir,OF_READ|OF_SHARE_DENY_WRITE))){ sample.a = 0; sample.b = 0; return( TRUE ); } _lread( hFile,(LPBYTE)&sample, sizeof(SAMPLE)); _lclose( hFile ); return( TRUE ); } BOOL WriteData( LPSTR szDir ) { unsigned char szDataDir[256]; HFILE hFile; strcpy( szDataDir, szDir ); strcat( szDataDir, "px_samp.dat" ); if(-1==(hFile=_lcreat(szDataDir,0))) return( FALSE ); _lwrite( hFile,(LPBYTE)&sample, sizeof(SAMPLE)); _lclose( hFile ); return( TRUE ); } /*------------------------------------------------------------ フィルタのタイトルを得る 入力: hWnd.. オーナーウインドウハンドル 通常は使用しないが,NULLの場合も考慮すること 出力: fOpt.. 詳細設定をもつかどうかのフラグ ver.. DLL仕様のバージョン(Pixiaでは10にする。) info.. リストボックスに表示する文字列 */ BOOL FilterGetTitle( HWND hWnd, LPSTR info, BOOL *opt, int *ver ) { strcpy( info, "テストフィルタ" ); *opt = TRUE; *ver = 10; return( TRUE ); } /*------------------------------------------------------------ フィルタの実行 入力: */ BOOL FilterProc(HWND hWnd, LAYERINFO *li, SETLINEFUNC *sf, GETLINEFUNC *gf, LPSTR szDir,LPBYTE lpExt) { int i, j; int buff_size; LPBYTE lpWork; ReadData( szDir ); // 設定したパラメータを読み込む buff_size = (li->cx * 3 + 100); lpWork = (LPBYTE)GlobalAllocPtr( GHND, buff_size ); unsigned char ps[li->cy][li->cx][2]; //データを配列に移す作業 j行i列、RGBの赤、緑、青 int ps2[li->cy][li->cx][2]; if( lpWork == NULL ) return( FALSE ); for(j = 0; j < li->cy; j ++ ){ // 進行状況の表示 if( j % 5 ==0 ){ SendMessage( hWnd, MM_DISPINFO, INFO_PERCENTAGE, j * 100 / li->cy ); } // 画素情報を得る gf->GetLine( j, 0, li->cx-1, lpWork, -1 ); for( i = 0; i < li->cx;i ++ ){ // 赤ゲット ps[j][i][0] = lpWork[i*3]; // 青ゲット ps[j][i][1] = lpWork[i*3+1]; // 緑ゲット ps[j][i][2] = lpWork[i*3+2]; } } if(pictChange(li,ps,ps2)){ } // 画素情報を保存する。 for( j = 0; j < li->cy; j ++ ){ // 進行状況の表示 if( j % 5 ==0 ){ SendMessage( hWnd, MM_DISPINFO, INFO_PERCENTAGE, j * 100 / li->cy ); } // 画素情報を戻す for( i = 0; i < li->cx;i ++ ){ // 赤青緑セット lpWork[i*3] = ps2[j][i][0]; lpWork[i*3+1] = ps2[j][i][1] ; lpWork[i*3+2] = ps2[j][i][2]; } sf->SetLine( j, 0, li->cx-1, lpWork, -1 ); } // GlobalFreePtr( lpWork ); // 進行状況表示の終了 SendMessage( hWnd, MM_DISPINFO, INFO_NONE, 0 ); return( TRUE ); } BOOL pictChange(LAYERINFO *li,unsigned char *ps,int *ps2) { //絵のサイズから必要な円の数と計算回数を求める //int splitSizeX; //int splitSizeY; //splitSizeX=li->cx/2; //splitSizeY=li->cy/2; //1*1画像とか入ったらバグが出そうだけど、その場合は何もしないで終了 int stdSize=1;//碁盤の目に区切るときの基準サイズ if(li->cx > li->cy){ stdSize=li->cy/3; }else{ stdSize=li->cx/3; } while(stdSize>=2) { RAND_MAX=stdSize/2; for(int j=0;jcy/stdSize;j++){ for(int i=0;icx/stdSize;i++){ for(int k=0;k<4;k++){ if(pictToCircle(li,ps,ps2,stdSize,i*stdSize+rand()-stdSize/4,j*stdSize+rand()-stdSize/4)==true){ } } } } } stdSize/=2; return (true); } BOOL pictToCircle(LAYERINFO *li,unsigned char *ps,int *ps2,int size,int x,int y) { int startX; int startY; int endX; int endY; int i; int j; startX=CutNum(0,li->cx,x-size); startY=CutNum(0,li->cy,y-size); endX =CutNum(0,li->cx,x+size); endY =CutNum(0,li->cy,y+size); int sizeX=endX-startX; int sizeY=endY-startY; float ar=0; float ag=0; float ab=0; for(j=0;j4){ k=2; } if(sizeX>4){ l=2; } if(sizeY>7){ k=3; } if(sizeX>7){ l=3; } for(j=0;j0.8){ return (CirclePaint(ps2,x,y,startX,startY,endX,endY,size,ar,ag,ab)); }else{ return (false); } } BOOL function CirclePaint(int *ps2,int x,int y,int sx,int sy,int ex,int ey,int r,int ar,int ag,int ab){ //x,yから一定距離以内にある点を全て円で壁画する関数 //実はここは独自処理を追加したいので、後で色々いじれたらいいなあと思う、予定だけだけど //全部計算後値のエラーが起きたときにそなえ、全ての点の数値を最後に整える予定 //円だけならライブラリでいいのだがそのうち、エリア範囲を判断して他の形を選んだり、色の塗り方選んだり独自処理を追加する予定なので、数値レベルで直接いじくっている bool ans=false; int hekigaOk=0; int r2=r^2; for(int j=sy;jl){ l=min; } if(max