📄 graphic.c
字号:
return bitstring;}static char *newbits(int w,int h) /* create a new bitmap string */{ char *bits; sprintf(string,"%d,%d:",w,h); bits=my_malloc(strlen(string)+((w*h)>>2)+2); strcpy(bits,string); bitcount=0; return bits;}static void addbits(char *bits,int state) /* add one bit to bitstring */{ static char *pbits; static int nibble; static int mask; if (bitcount==0) { pbits=bits+strlen(bits); *(pbits+1)='\0'; nibble=0; mask=1; } if (state) nibble|=mask; bitcount++; *pbits="0123456789abcdef"[nibble]; mask=(mask<<1)&15; if (mask==0) { pbits++; *pbits='\0'; *(pbits+1)='\0'; nibble=0; mask=1; }}static int readbits(char *bits) /* read bits from string one after another */{ static char *bitpt; static int mask; static char byte; int bit; static char *digits="0123456789abcdef"; if (bits) { bitpt=bits; mask=1; if (*bitpt) byte=strchr(digits,*bitpt)-digits; else byte=0; return 0; } bit=(((byte)&mask)!=0)?1:0; mask=(mask<<1)&15; if (mask==0) { mask=1; if (*bitpt) { bitpt++; byte=strchr(digits,*bitpt)-digits; } else { byte=0; } } return bit;}void create_openprinter(int num) /* create command 'openprinter' */{ struct command *cmd; cmd=add_command(cOPENPRN,FALSE); cmd->args=num;}void openprinter(struct command *cmd) /* opens a printer */{#ifdef WINDOWS char PrinterName[200]; /* Name of default Printer */ char *p; /* points into PrinterName */ static int first=TRUE; DOCINFO di; float width,height,prnscalex,prnscaley; LOGBRUSH mybrush; RECT interior;#endif /* close file, if already open */#ifdef UNIX if (printerfile) closeprinter();#endif if (cmd->args==1) { printerfilename=my_strdup((char *)(pop(stSTRING)->pointer)); print_to_file=TRUE;} else { printerfilename=my_strdup("\0"); print_to_file=FALSE; }#ifdef UNIX if (*printerfilename=='\0') {#ifdef HAVE_TMPNAM char *pfn; pfn=tmpnam(NULL); printerfilename=my_strdup(pfn);#else struct stat s; my_free(printerfilename); printerfilename=my_strdup("/tmp/yabasic.ps"); if (stat(printerfilename,&s) && errno!=ENOENT) { sprintf(string,"could not check printerfile '%s': %s",printerfilename,my_strerror(errno)); error(ERROR,string); return; } if (s.st_mode & S_IFLNK) { sprintf(string,"could not print to file '%s'; it is a symbolic link"); error(ERROR,string); return; }#endif deleteprinterfile=TRUE; } else { deleteprinterfile=FALSE; } printerfile=fopen(printerfilename,"w"); if (!printerfile) { sprintf(string,"could not open file '%s' for printing: %s",printerfilename,my_strerror(errno)); error(ERROR,string); }#endif #ifdef WINDOWS if (first) { /* query win.ini for default printer */ GetProfileString("windows","device",",,,",PrinterName,200); /* truncate printer name */ p=PrinterName; while(*p && *p!=',') p++; *p='\0'; printer=CreateDC(NULL,PrinterName,NULL,NULL); if (!printer) printer=CreateDC(NULL,"winspool",NULL,NULL); if (!printer) { error(ERROR,"Couldn't get handle for printer"); return; } /* calculate scaling-factors */ width=(float)GetDeviceCaps(printer,PHYSICALWIDTH); prnoffx=(float)GetDeviceCaps(printer,PHYSICALOFFSETX); prnscalex=(float)(width-4*prnoffx)/winwidth; height=(float)GetDeviceCaps(printer,PHYSICALHEIGHT); prnoffy=(float)GetDeviceCaps(printer,PHYSICALOFFSETY); prnscaley=(float)(height-4*prnoffy)/winheight; prnscale=(prnscalex<prnscaley)?prnscalex:prnscaley; /* create printerpens */ mybrush.lbStyle=BS_SOLID; mybrush.lbColor=RGB(255,255,255); mybrush.lbHatch=HS_DIAGCROSS; revprinterpen=ExtCreatePen(PS_GEOMETRIC,(long)prnscale,&mybrush,0,NULL); mybrush.lbStyle=BS_SOLID; mybrush.lbColor=RGB(0,0,0); mybrush.lbHatch=HS_DIAGCROSS; printerpen=ExtCreatePen(PS_GEOMETRIC,(long)prnscale,&mybrush,0,NULL); /* set clipping region */ GetClientRect(window,&interior); SelectClipRgn(printer,NULL); IntersectClipRect(printer, (int)(interior.left*prnscalex+prnoffx), (int)(interior.top*prnscaley+prnoffy), (int)(interior.right*prnscalex+prnoffx), (int)(interior.bottom*prnscaley+prnoffy)); /* create printerfont */ logfont.lfHeight=(long)(-fontheight*prnscale); printerfont=CreateFontIndirect(&logfont); if (printerfont==NULL) { sprintf(string,"Could not create font for printer"); error(ERROR,string); return; } } di.cbSize=sizeof(DOCINFO); di.lpszDocName="yabasic grafics"; di.lpszOutput=(print_to_file)?printerfilename:(LPTSTR)NULL; di.lpszDatatype=(LPTSTR)NULL; di.fwType=0; if (StartDoc(printer,&di)==SP_ERROR) { error(ERROR,"Couldn't start printing"); return; } StartPage(printer); first=FALSE;#else /* UNIX */ fprintf(printerfile,"%%!PS-Adobe-1.0\n"); fprintf(printerfile,"%%%%Title: %s grafic\n",progname); fprintf(printerfile,"%%%%BoundingBox: 0 0 %i %i\n", (int)(winwidth*psscale),(int)(winheight*psscale)); fprintf(printerfile,"%%%%DocumentFonts: Helvetica\n"); fprintf(printerfile,"%%%%Creator: yabasic\n"); fprintf(printerfile,"%%%%Pages: (atend)\n"); fprintf(printerfile,"%%%%EndComments\n"); fprintf(printerfile,"gsave\n"); fprintf(printerfile,"/txt 4 dict def\n"); fprintf(printerfile,"/rec 6 dict def\n"); fprintf(printerfile,"/cir 5 dict def\n"); fprintf(printerfile,"/M {moveto} def\n"); fprintf(printerfile,"/RL {rlineto} def\n"); fprintf(printerfile,"/L {lineto} def\n"); fprintf(printerfile,"/N {newpath} def\n"); fprintf(printerfile,"/S {stroke} def\n"); fprintf(printerfile,"/DO {(y) eq {1} {0} ifelse setgray N M 0 %g RL %g 0 RL 0 %g RL" " closepath fill 0 setgray} def\n",psscale,psscale,-psscale); fprintf(printerfile,"/LI {(y) eq {1} {0} ifelse setgray N M L stroke 0 setgray} def\n"); fprintf(printerfile,"/CI {mark 6 1 roll cir /fi 3 -1 roll put\n"); fprintf(printerfile," cir /cl 3 -1 roll put\n"); fprintf(printerfile," cir /r 3 -1 roll put\n"); fprintf(printerfile," cir /x 3 -1 roll put\n"); fprintf(printerfile," cir /y 3 -1 roll put\n"); fprintf(printerfile," cir /cl get (y) eq {1} {0} ifelse setgray\n"); fprintf(printerfile," N cir /x get cir /y get cir /r get 0 360 arc\n"); fprintf(printerfile," closepath cir /fi get (y) eq {fill} {stroke} ifelse\n"); fprintf(printerfile," 0 setgray cleartomark} def\n"); fprintf(printerfile,"/AT {mark 5 1 roll txt /txt 3 -1 roll put\n"); fprintf(printerfile," txt /xa 3 -1 roll put\n"); fprintf(printerfile," txt /y 3 -1 roll put\n"); fprintf(printerfile," txt /x 3 -1 roll put\n"); fprintf(printerfile," N txt /x get txt /y get M\n"); fprintf(printerfile," txt /txt get false charpath flattenpath pathbbox\n"); fprintf(printerfile," pop exch pop exch sub\n"); fprintf(printerfile," txt /x get exch\n"); fprintf(printerfile," txt /xa get (c) eq {2 div sub} if\n"); fprintf(printerfile," txt /xa get (l) eq {pop} if\n"); fprintf(printerfile," txt /xa get (r) eq {sub} if\n"); fprintf(printerfile," txt /y get M\n"); fprintf(printerfile," txt /txt get show cleartomark\n"); fprintf(printerfile," } def\n"); fprintf(printerfile,"/RE {mark 7 1 roll rec /fi 3 -1 roll put\n"); fprintf(printerfile," rec /cl 3 -1 roll put\n"); fprintf(printerfile," rec /y2 3 -1 roll put\n"); fprintf(printerfile," rec /x2 3 -1 roll put\n"); fprintf(printerfile," rec /y1 3 -1 roll put\n"); fprintf(printerfile," rec /x1 3 -1 roll put\n"); fprintf(printerfile," rec /cl get (y) eq {1} {0} ifelse setgray\n"); fprintf(printerfile," N rec /x1 get rec /y1 get M\n"); fprintf(printerfile," rec /x1 get rec /y2 get L\n"); fprintf(printerfile," rec /x2 get rec /y2 get L\n"); fprintf(printerfile," rec /x2 get rec /y1 get L\n"); fprintf(printerfile," rec /x1 get rec /y1 get L\n"); fprintf(printerfile," closepath rec /fi get (y) eq {fill} {stroke} ifelse\n"); fprintf(printerfile," 0 setgray cleartomark} def\n"); fprintf(printerfile,"30 30 translate\n"); fprintf(printerfile,"%g setlinewidth\n",psscale); firsttext=TRUE; /* font will be set in text-command */ fflush(printerfile);#endif}void closeprinter() /* close printer */{#ifdef WINDOWS EndPage(printer); EndDoc(printer);#else /* UNIX */ if (printerfile) { fprintf(printerfile,"showpage\ngrestore\n%%%%Trailer\n"); fclose(printerfile); printerfile=NULL; if (deleteprinterfile) { deleteprinterfile=FALSE; sprintf(string,"lpr %s",printerfilename); if (system(string)) { sprintf(string,"couldn't print '%s'",printerfilename); error(ERROR,string); return; } remove(printerfilename); } }#endif if (printerfilename) { my_free(printerfilename); printerfilename=NULL; } print_to_file=FALSE;}#ifdef UNIX void getwinkey(char *retkey) /* read a key from grafics window */{ static XEvent event; /* what has happened ? */ KeySym sym; /* keysmbol */ int yk,len,x,y; close(ConnectionNumber(display)); display=XOpenDisplay(displayname); XSelectInput(display,window,KeyPressMask|ButtonPressMask|ButtonReleaseMask); do { XNextEvent(display,&event); len=XLookupString((XKeyPressedEvent*)&event,retkey,100,&sym,NULL); sym=XKeycodeToKeysym(display,event.xkey.keycode,0); } while(event.type==KeyPress && (sym==XK_Shift_L || sym==XK_Shift_R || sym==XK_Control_L || sym==XK_Control_R || sym==XK_Alt_L ||sym==XK_Alt_R || sym==XK_Caps_Lock || sym==XK_Shift_Lock)); XSelectInput(display,window,0); if (event.type==ButtonPress) { x=event.xbutton.x; y=event.xbutton.y; itransform(&x,&y); sprintf(retkey,"MB%dd+%d:%04d,%04d",event.xbutton.button,event.xbutton.state&15,x,y); return; } if (event.type==ButtonRelease) { x=event.xbutton.x; y=event.xbutton.y; itransform(&x,&y); sprintf(retkey,"MB%du+%d:%04d,%04d",event.xbutton.button,event.xbutton.state&15,x,y); return; } len=XLookupString((XKeyPressedEvent*)&event,retkey,100,&sym,NULL); retkey[len]='\0'; if (len!=1 || !isprint(retkey[0])) { yk=-1; sym=XKeycodeToKeysym(display,event.xkey.keycode,0); switch(sym) { case XK_BackSpace: yk=kBACKSPACE;break; case XK_Tab: yk=kTAB;break; case XK_Insert: yk=kINS;break; case XK_Home: yk=kHOME;break; case XK_End: yk=kEND;break; case XK_Clear: yk=kCLEAR;break; case XK_Return: yk=kENTER;break; case XK_KP_Enter: yk=kENTER;break; case XK_Escape: yk=kESC;break; case XK_Delete: yk=kDEL;break; case XK_Left: yk=kLEFT;break; case XK_Up: yk=kUP;break; case XK_Right: yk=kRIGHT;break; case XK_Down: yk=kDOWN;break; case XK_Page_Up: yk=kSCRNUP;break; case XK_Page_Down: yk=kSCRNDOWN;break; case XK_F1: yk=kF1;break; case XK_F2: yk=kF2;break; case XK_F3: yk=kF3;break; case XK_F4: yk=kF4;break; case XK_F5: yk=kF5;break; case XK_F6: yk=kF6;break; case XK_F7: yk=kF7;break; case XK_F8: yk=kF8;break; case XK_F9: yk=kF9;break; case XK_F10: yk=kF10;break; case XK_F11: yk=kF11;break; case XK_F12: yk=kF12;break; case XK_F13: yk=kF13;break; case XK_F14: yk=kF14;break; case XK_F15: yk=kF15;break; case XK_F16: yk=kF16;break; case XK_F17: yk=kF17;break; case XK_F18: yk=kF18;break; case XK_F19: yk=kF19;break; case XK_F20: yk=kF20;break; case XK_F21: yk=kF21;break; case XK_F22: yk=kF22;break; case XK_F23: yk=kF23;break; case XK_F24: yk=kF24;break; default: break; } if (yk>0) strcpy(retkey,ykey[yk]); else sprintf(retkey,"key%x",(int)sym); }}void gettermkey(char *keybuff) /* read a key from terminal */{ char *skey=NULL; int key; /* returned key */ do key=getch(); while(key==ERR); switch(key) { case KEY_UP: skey=ykey[kUP];break; case KEY_DOWN: skey=ykey[kDOWN];break; case KEY_LEFT: skey=ykey[kLEFT];break; case KEY_RIGHT: skey=ykey[kRIGHT];break; case KEY_DC: skey=ykey[kDEL];break; case KEY_IC: skey=ykey[kINS];break; case KEY_IL: skey=ykey[kINS];break; case KEY_CLEAR: skey=ykey[kCLEAR];break; case KEY_HOME: skey=ykey[kHOME];break;#ifdef KEY_END case KEY_END: skey=ykey[kEND];break;#endif case KEY_F0: skey=ykey[kF0];break; case KEY_F(1): skey=ykey[kF1];break; case KEY_F(2): skey=ykey[kF2];break; case KEY_F(3): skey=ykey[kF3];break; case KEY_F(4): skey=ykey[kF4];break; case KEY_F(5): skey=ykey[kF5];break; case KEY_F(6): skey=ykey[kF6];break; case KEY_F(7): skey=ykey[kF7];break; case KEY_F(8): skey=ykey[kF8];break; case KEY_F(9): skey=ykey[kF9];break; case KEY_F(10): skey=ykey[kF10];break; case KEY_F(11): skey=ykey[kF11];break; case KEY_F(12): skey=ykey[kF12];break; case KEY_F(13): skey=ykey[kF13];break; case KEY_F(14): skey=ykey[kF14];break; case KEY_F(15): skey=ykey[kF15];break; case KEY_F(16): skey=ykey[kF16];break; case KEY_F(17): skey=ykey[kF17];break; case KEY_F(18): skey=ykey[kF18];break; case KEY_F(19): skey=ykey[kF19];break; case KEY_F(20): skey=ykey[kF20];break; case KEY_F(21): skey=ykey[kF21];break; case KEY_F(22): skey=ykey[kF22];break; case KEY_F(23): skey=ykey[kF23];break; case KEY_F(24): skey=ykey[kF24];break; case KEY_BACKSPACE: skey=ykey[kBACKSPACE];break; case KEY_NPAGE: skey=ykey[kSCRNDOWN];break; case KEY_PPAGE: skey=ykey[kSCRNUP];break; case KEY_ENTER: skey=ykey[kENTER];break; default: if (isprint(key)) { keybuff[0]=key; keybuff[1]='\0'; } else if (key<0 || key>=KEY_MAX) { keybuff[0]='\0'; } else { switch(key) { case 0x1b:skey=ykey[kESC];break; case 0x7f:skey=ykey[kDEL];break; case 0xa:skey=ykey[kENTER];break; case 0x9:skey=ykey[kTAB];break; default: sprintf(keybuff,"key%x",key); } } break; } if (skey) strcpy(keybuff,skey);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -