⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphic.c

📁 YBasic编程语言的移植和开发 YBasic编程语言的移植和开发 YBasic编程语言的移植和开发
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -