//======================================================= // tcbmp : Timing chart to Bitmap by Kumagai Masaaki // // Input: TCML(*.tc) , EPS(*.eps) by tchart.exe // Output: Windows BMP(24bit) #include #include #include #include #include #include #include // グローバル int OffsetX=0; int OffsetY=0; double ScaleX=4; double ScaleY=-4; double CPx=0,CPy=0; HDC dc; HBITMAP bitmap; BITMAPINFOHEADER bih; HFONT oldfont; inline int X(double x) { return (int)((OffsetX+x)*ScaleX+0.5); } inline int Y(double y) { return (int)((OffsetY+y)*ScaleY+0.5); } inline int WH(double w) { return (int)(ceil(w*ScaleX)); } int InitBitmap(int w, int h) { dc=CreateCompatibleDC(NULL); bih.biSize=sizeof(BITMAPINFOHEADER); bih.biWidth=w; bih.biHeight=h; bih.biPlanes=1; bih.biBitCount=24; bih.biCompression=BI_RGB; bih.biSizeImage=bih.biWidth*bih.biHeight*3; bih.biXPelsPerMeter=10000; bih.biYPelsPerMeter=10000; bih.biClrUsed=0; bih.biClrImportant=0; void *bitmapbits; bitmap=CreateDIBSection(dc,(BITMAPINFO *)(&bih),DIB_RGB_COLORS,&bitmapbits,NULL,NULL); SelectObject(dc,bitmap); HBRUSH background=CreateSolidBrush(RGB(0xff,0xff,0xff)); RECT allrect={0,0,bih.biWidth,bih.biHeight}; FillRect(dc,&allrect,background); DeleteObject(background); HFONT font=CreateFont(-10,0, 0,0,0, FALSE,FALSE,FALSE, SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY|NONANTIALIASED_QUALITY, FF_DONTCARE|DEFAULT_PITCH,"ARIAL"); SetBkMode(dc,TRANSPARENT); oldfont=SelectObject(dc,font); return 0; } int SaveAndTermBitmap(char *filename) { BITMAPFILEHEADER bfh; bfh.bfType='B'+'M'*0x100; bfh.bfSize=sizeof(bfh)+sizeof(bih)+bih.biWidth*bih.biHeight*3; bfh.bfReserved1=0; bfh.bfReserved2=0; bfh.bfOffBits=sizeof(bfh); FILE *fp=fopen(filename,"wb"); fwrite(&bfh,sizeof(bfh),1,fp); fwrite(&bih,sizeof(bih),1,fp); int i; int bw=(bih.biWidth*3+3)&(~3); char *buff=new char[bw]; for(i=0;ilw=TKD(tk[tki-1]); } if(strcmp(tk[tki],"setrgbcolor")==0) { st->r=TKD(tk[tki-3]); st->g=TKD(tk[tki-2]); st->b=TKD(tk[tki-1]); } if(strcmp(tk[tki],"stroke")==0) { HPEN pen=CreatePen(PS_SOLID,WH(st->lw),RGB(st->r*255,st->g*255,st->b*255)); HPEN open=SelectObject(dc,pen); Polyline(dc,pt,ptc+1); ptc=0; SelectObject(dc,open); DeleteObject(pen); } if(strcmp(tk[tki],"showleft")==0) { SetTextAlign(dc,TA_BASELINE|TA_LEFT); char *text=GetText(tk,tki); TextOut(dc,X(CPx),Y(CPy),text,strlen(text)); } if(strcmp(tk[tki],"showcenter")==0) { SetTextAlign(dc,TA_BASELINE|TA_CENTER); char *text=GetText(tk,tki); TextOut(dc,X(CPx),Y(CPy),text,strlen(text)); } if(strcmp(tk[tki],"showright")==0) { SetTextAlign(dc,TA_BASELINE|TA_RIGHT); char *text=GetText(tk,tki); TextOut(dc,X(CPx),Y(CPy),text,strlen(text)); } if(strcmp(tk[tki],"makefont")==0) { char *fontname=FontRename(tk[tki-8]+1); int height=WH(TKD(tk[tki-3])); if(height>0) height*=-1; HFONT font=CreateFont(height,0, 0,0,0, FALSE,FALSE,FALSE, SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY|NONANTIALIASED_QUALITY, FF_DONTCARE|DEFAULT_PITCH,fontname); DeleteObject(SelectObject(dc,font)); } tki++; } return 0; } double FindMag(char **tk) { int i; for(i=1;tk[i];i++) { if(strstr(tk[i],"bitmapmag")) { return TKD(tk[i+1]); } } return 4; } char *BaseName(const char *src,int space=4) { char *r=new char[strlen(src)+space]; strcpy(r,src); char *p=strrchr(r,'/'); if(p==NULL) p=strrchr(r,'\\'); if(p==NULL) p=r; if(strchr(p,'.')) *(strchr(p,'.'))='\0'; return r; } char *EPSName(const char *src) { char *r=BaseName(src,4); strcat(r,".eps"); return r; } char *BMPName(const char *src) { char *r=BaseName(src,4); strcat(r,".bmp"); return r; } int main(int argc,char **argv) { if(argc<2) { fprintf(stderr,"tcbmp | ()\n"); getchar(); return 0; } char *sourcefile=argv[1]; char *destfile; if(argc>2) destfile=argv[2]; else destfile=BMPName(argv[1]); if((strlen(sourcefile)>4)&& (strcmp(sourcefile+(strlen(sourcefile)-3),".tc")==0)) { // tchart.exe 呼び出し char *sysbuff=new char[100+strlen(sourcefile)*2]; char *epsname=EPSName(sourcefile); sprintf(sysbuff,"tchart.exe \"%s\" \"%s\"",sourcefile,epsname); fprintf(stderr,"Exec: %s\n",sysbuff); if(system(sysbuff)!=0) { fprintf(stderr,"Failed to exec 'system()'\n"); getchar(); return 1; } delete sysbuff; sourcefile=epsname; } FILE *source=fopen(sourcefile,"r"); if(source==NULL) { fprintf(stderr,"Cannot open '%s'\n",sourcefile); getchar(); return 1; } int w,h; if(FindBoundingBox(source,w,h)<0) { fprintf(stderr,"Illegal file\n"); getchar(); return 1; } char **tk=CreateTokenList(sourcefile,source); double mag=FindMag(tk); ScaleX=mag; ScaleY=-mag; w=(int)(mag*w); h=(int)(mag*h); InitBitmap(w,h); int tki=1; Setting st={10,0,0,0}; Parse(tk,tki,&st); SaveAndTermBitmap(destfile); return 0; }