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

📄 x_wrdwindow.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 4 页
字号:
		    0, 0, tx, ty, w, h);	  if(mywin.screens[ts] == mywin.disp_screen)	      Redraw(tx, ty, w, h);	}	break;      case 10: { /* line copy */	  int cp, sk, i;	  if(nopts < 2)	      break;	  if((cp = opts[0]) < 0)	      break;	  if((sk = opts[1]) < 0)	      break;	  if(cp + sk == 0)	      break;	  simg = XGetImage(mywin.d, mywin.screens[ss],			   sx1, sy1, w, h, mywin.gscreen_plane_mask, ZPixmap);	  if(!simg) break;	  timg = XGetImage(mywin.d, mywin.screens[ts],			   tx, ty, w, h, mywin.gscreen_plane_mask, ZPixmap);	  if(!timg) break;	  y = 0;	  while(y < h)	  {	      for(i = 0; i < cp && y < h; i++, y++)	      {		  for(x = 0; x < w; x++)		      XPutPixel(timg, x, y, XGetPixel(simg, x, y));	      }	      y += sk;	  }	}	if(mywin.screens[ts] == mywin.disp_screen)	    Redraw(tx, ty, w, h);	break;      case 11: {	  int etx, ety;	  while(tx < 0) tx += SIZEX;	  tx %= SIZEX;	  while(ty < 0) ty += SIZEY;	  ty %= SIZEY;	  etx = tx + w;	  ety = ty + h;	  XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr,		    sx1, sx2, w, h, tx, ty);	  if(etx > SIZEX)	      XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr,			sx1 + (etx - SIZEX),			sy1,			w - (etx - SIZEX),			h,			0, ty);	  if(ety > SIZEY)	      XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr,			sx1,			sy1 + (ety - SIZEY),			w,			h - (ety - SIZEY),			tx, 0);	  if(etx > SIZEX && ety > SIZEY)	  {	      XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr,			sx1 + (etx - SIZEX),			sy1 + (ety - SIZEY),			w - (etx - SIZEX),			h - (ety - SIZEY),			0, 0);	  }	  if(mywin.screens[ts] == mywin.disp_screen)	  {	      if(etx < SIZEX && ety < SIZEY)		  Redraw(tx, ty, w, h);	      else		  Redraw(0, 0, SIZEX, SIZEY);	  }	}	break;      case 12: {	  unsigned long psm, ptm;	  int plane_map[4] = {2, 0, 1, 3};	  psm = mywin.pmask[plane_map[opts[0] & 3]] | mywin.basepix;	  ptm = mywin.pmask[plane_map[opts[1] & 3]] | mywin.basepix;	  simg = XGetImage(mywin.d, mywin.screens[ss],			   sx1, sy1, w, h, mywin.gscreen_plane_mask, ZPixmap);	  if(!simg) break;	  timg = XGetImage(mywin.d, mywin.screens[ts],			   tx, ty, w, h, mywin.gscreen_plane_mask, ZPixmap);	  if(!timg) break;	  for(y = 0; y < h; y++)	      for(x = 0; x < w; x++)	      {		  int p1, p2;		  p1 = XGetPixel(simg, x, y);		  p2 = XGetPixel(timg, x, y);		  if(p1 & psm)		      p2 |= ptm;		  else		      p2 &= ~ptm;		  XPutPixel(timg, x, y, p2);	      }	  if(mywin.screens[ts] == mywin.disp_screen)	      Redraw(tx, ty, w, h);	}	break;    }    if(simg != NULL)	XDestroyImage(simg);    if(timg != NULL)	XDestroyImage(timg);    x_GMode(gmode_save);}static void MyDestroyImage(XImage *img){    img->data = NULL; /* Don't free in XDestroyImage() */    XDestroyImage(img);}void x_PLoad(char *filename){  static XImage *image = NULL;  if(image == NULL) {    image=XCreateImage(mywin.d,		       DefaultVisual(mywin.d,DefaultScreen(mywin.d)),		       DefaultDepth(mywin.d,DefaultScreen(mywin.d)),		       ZPixmap,0,None,SIZEX,SIZEY,8,0);    image->data = image_buffer;  }  memset(image->data, 0, SIZEX * SIZEY);  if(!pho_load_pixel(image,mywin.curcoltab,filename))    return;  XPutImage(mywin.d,mywin.active_screen,mywin.gc	    ,image,0,0,0,0,SIZEX,SIZEY);  if(mywin.active_screen==mywin.disp_screen)    Redraw(0,0,SIZEX,SIZEY);}void x_Mag(magdata *mag,int32 x,int32 y,int32 s,int32 p){  XImage *image;  int pixsizex,pixsizey;  if(mag==NULL){    ctl->cmsg(CMSG_INFO,VERB_VERBOSE,"mag ERROR!\n");    return;  }  x=(x==WRD_NOARG)?mag->xorig:x;  y=(y==WRD_NOARG)?mag->yorig:y;  p=(p==WRD_NOARG)?0:p;  x=x+mag->xorig/8*8-mag->xorig;  pixsizex=mag->xend-mag->xorig/8*8+1;  pixsizey=mag->yend-mag->yorig+1;  mag->pal[0]=17;  x_Pal(mag->pal,16);  if(mywin.active_screen==mywin.screens[0]){ /* Foreground screen */    mag->pal[0]=18;    x_Pal(mag->pal,16);  } else {			/* Background screen */    mag->pal[0]=19;    x_Pal(mag->pal,16);  }  if((p&1)==0){    mag->pal[0]=0;    x_Pal(mag->pal,16);  }  if(p==2)    return;  image=XCreateImage(mywin.d,		     DefaultVisual(mywin.d,DefaultScreen(mywin.d)),		     DefaultDepth(mywin.d,DefaultScreen(mywin.d)),		     ZPixmap,0,None,pixsizex,pixsizey,8,0);  image->data=image_buffer;  memset(image->data, 0, pixsizex*pixsizey);  mag_load_pixel(image,mywin.curcoltab,mag);  XPutImage(mywin.d,mywin.active_screen,mywin.gc	    ,image,0,0,x,y,pixsizex,pixsizey);  if(mywin.active_screen==mywin.disp_screen)    Redraw(x,y,pixsizex,pixsizey);  MyDestroyImage(image);}void x_Gcls(int mode){  int gmode_save;  gmode_save = mywin.gmode;  if(mode==0)    mode=15;  x_GMode(mode);  XSetFunction(mywin.d,mywin.gcgr,GXclear);  XFillRectangle(mywin.d,mywin.active_screen,mywin.gcgr,0,0,SIZEX,SIZEY);  XSetFunction(mywin.d,mywin.gcgr,GXcopy);  x_GMode(gmode_save);  Redraw(0,0,SIZEX,SIZEY);}void x_Ton(int param){  mywin.ton=param;  Redraw(0,0,SIZEX,SIZEY);}void x_Gon(int param){  mywin.gon=param;  Redraw(0,0,SIZEX,SIZEY);}void x_RedrawControl(int flag){  mywin.redrawflag = flag;  if(flag)  {    Redraw(0,0,SIZEX,SIZEY);    store_palette();  }  XFlush(mywin.d);}void x_Gline(int *params,int nparam){    int x, y, w, h; /* Update rectangle region */    unsigned long color;    Pixmap screen;    x = min(params[0], params[2]);    y = min(params[1], params[3]);    w = max(params[0], params[2]) - x + 1;    h = max(params[1], params[3]) - y + 1;    screen = mywin.active_screen;    switch(params[5])    {      default:      case 0:	if (truecolor)	  color = (unsigned long) params[4];	else	  color = mywin.curcoltab[params[4]].pixel;	XSetForeground(mywin.d,mywin.gcgr,color);	XDrawLine(mywin.d,screen,mywin.gcgr,		  params[0],params[1],params[2],params[3]);	break;      case 1:	if (truecolor)	  color = (unsigned long) params[4];	else	  color = mywin.curcoltab[params[4]].pixel;	XSetForeground(mywin.d,mywin.gcgr,color);	XDrawRectangle(mywin.d,screen,mywin.gcgr,x,y,w-1,h-1);	break;      case 2:	if (truecolor)	  color = (unsigned long) params[6];	else	  color = mywin.curcoltab[params[6]].pixel;	XSetForeground(mywin.d,mywin.gcgr,color);	XFillRectangle(mywin.d,screen,mywin.gcgr,x,y,w,h);	break;  }  if(mywin.active_screen==mywin.disp_screen)    Redraw(x,y,w,h);}void x_GCircle(int *params,int nparam){  int pad=0;  int (*Linefunc)();  Linefunc=XDrawArc;  if(nparam>=5){    switch(params[4]){    default:    case 0:    case 1:      Linefunc=XDrawArc;      if (truecolor)	XSetForeground(mywin.d,mywin.gcgr,(unsigned long) params[3]);      else	XSetForeground(mywin.d,mywin.gcgr,mywin.curcoltab[params[3]].pixel);      pad=-1;      break;    case 2:      Linefunc=XFillArc;      if (truecolor)	XSetForeground(mywin.d,mywin.gcgr,(unsigned long) params[5]);      else	XSetForeground(mywin.d,mywin.gcgr,mywin.curcoltab[params[5]].pixel);      break;    }  }  if(nparam>=3){    int xcorner,ycorner,width,height,angle;    xcorner=params[0]-params[2];/*x_center-radius*/    ycorner=params[1]-params[2];/*y_center-radius*/    width=height=params[2]*2;/*radius*2*/    angle=360*64;    (*Linefunc)(mywin.d,mywin.active_screen,mywin.gcgr,xcorner,ycorner,		width+pad,height+pad,		0,angle);    if(mywin.active_screen==mywin.disp_screen)      Redraw(xcorner,ycorner,width,height);  }}#define FOREGROUND_PALLET 0void x_Pal(int *param,int nparam){  int pallet;  if(nparam==NUMPXL){    pallet=param[0];    nparam--;    param++;  }  else    pallet=FOREGROUND_PALLET;  if(nparam==NUMPXL-1){    int i;    for(i=0;i<NUMPXL;i++){      col12toXColor(param[i],&mywin.gcolor[pallet][i]);    }    if(pallet==FOREGROUND_PALLET){      memcpy(mywin.curcoltab,mywin.gcolor[FOREGROUND_PALLET],sizeof(mywin.curcoltab));      if(mywin.redrawflag)	  store_palette();    }  }}void x_Palrev(int pallet){  int i;  if(pallet < 0 || pallet > MAXPAL)    return;  for(i = 0; i < NUMPXL; i++){    mywin.gcolor[pallet][i].red ^= 0xffff;    mywin.gcolor[pallet][i].green ^= 0xffff;    mywin.gcolor[pallet][i].blue ^= 0xffff;  }  if(pallet == FOREGROUND_PALLET){    memcpy(mywin.curcoltab,	   mywin.gcolor[FOREGROUND_PALLET],	   sizeof(mywin.curcoltab));    if(mywin.redrawflag)	  store_palette();  }}void x_Gscreen(int active,int appear){  if(active<NUMVSCREEN)     mywin.active_screen=mywin.screens[active];  if((appear<NUMVSCREEN)&&(mywin.disp_screen!=mywin.screens[appear])){    mywin.disp_screen=mywin.screens[appear];    Redraw(0,0,SIZEX,SIZEY);  }}#define FADE_REDUCE_TIME 0.1void x_Fade(int *params,int nparam,int step,int maxstep){  static XColor *frompal=NULL,*topal=NULL;  if(params==NULL){    int i;    if(frompal==NULL||topal==NULL)      return;    if(step==maxstep){      memcpy(mywin.curcoltab,topal,sizeof(mywin.curcoltab));      memcpy(mywin.gcolor[0],mywin.curcoltab,sizeof(mywin.curcoltab));    }    else{      int tmp;      if(!mywin.redrawflag)	return;      if(truecolor) {      /* @FADE for TrueColor takes many CPU powers.       * So reduce @FADE controls.       */	if((step & 1) == 0 || aq_filled() < AUDIO_BUFFER_SIZE)	  return; /* Skip fade */      }      for(i=0;i<NUMPXL;i++){	tmp=(topal[i].red-frompal[i].red)/maxstep;	mywin.curcoltab[i].red=tmp*step+frompal[i].red;	tmp=(topal[i].green-frompal[i].green)/maxstep;	mywin.curcoltab[i].green=tmp*step+frompal[i].green;	tmp=(topal[i].blue-frompal[i].blue)/maxstep;	mywin.curcoltab[i].blue=tmp*step+frompal[i].blue;      }    }    if(mywin.redrawflag)	store_palette();  }  else{    if(params[2] == 0 && params[1] < MAXPAL) {      memcpy(mywin.curcoltab,mywin.gcolor[params[1]],sizeof(mywin.curcoltab));      memcpy(mywin.gcolor[0],mywin.curcoltab,sizeof(mywin.curcoltab));      if(mywin.redrawflag) {	  store_palette();      }    }    else if(params[0] < MAXPAL && params[1] < MAXPAL)    {      frompal=mywin.gcolor[params[0]];      topal=mywin.gcolor[params[1]];    }    else      frompal=topal=NULL;    return;  }}void x_Startup(int version){    int i;    Parse(-1);    memset(mywin.scrnbuf, 0, LINES*sizeof(Linbuf *));    mywin.curline = 0;    mywin.curcol = 0;    mywin.ton = 1;    mywin.gon = 1;    mywin.curattr = 0;    x_VRel();    x_GMode(-1);    InitColor(mywin.cmap, False);    mywin.active_screen = mywin.disp_screen = mywin.screens[0];    XSetForeground(mywin.d, mywin.gcgr, mywin.curcoltab[0].pixel);    XSetForeground(mywin.d, mywin.gc, mywin.txtcolor[COLOR_DEFAULT].pixel);    for(i = 0; i < NUMVSCREEN; i++)	XFillRectangle(mywin.d, mywin.screens[i], mywin.gcgr,		       0, 0, SIZEX, SIZEY);    XFillRectangle(mywin.d, mywin.offscr, mywin.gcgr, 0, 0, SIZEX, SIZEY);    XSetWindowBackgroundPixmap(mywin.d, mywin.w, mywin.offscr);    XFillRectangle(mywin.d, mywin.w, mywin.gcgr, 0, 0, SIZEX, SIZEY);    if(truecolor && shm_screen)	XFillRectangle(mywin.d, shm_screen->pm, mywin.gcgr,		       0, 0, SIZEX, SIZEY);}/*Graphic Definition*/#define GRPH_LINE_MODE 1#define GRPH_CIRCLE_MODE 2#define GRPH_PAL_CHANGE 3#define GRPH_FADE 4#define GRPH_FADE_STEP 5static void GrphCMD(int *params,int nparam){  switch(params[0]){  case GRPH_LINE_MODE:    x_Gline(params+1,nparam-1);    break;  case GRPH_CIRCLE_MODE:    x_GCircle(params+1,nparam-1);    break;  case GRPH_PAL_CHANGE:    x_Pal(params+1,nparam-1);    break;  case GRPH_FADE:    x_Fade(params+1,nparam-1,-1,-1);    break;  case GRPH_FADE_STEP:    x_Fade(NULL,0,params[1],params[2]);    break;  }}/***************************************************** * VT parser * * ******************************************************/#define MAXPARAM 20static int Parse(int c){  static int *prstbl=groundtable;  static char mbcs;  static int params[MAXPARAM],nparam=0;  static int hankaku=0;  static int savcol,savline;  static long savattr;  if(c==-1) {    prstbl=groundtable;    mbcs=0;    nparam=0;    hankaku=0;    savcol=savline=0;    return 0;  }  if(mbcs&&     prstbl !=mbcstable&&     prstbl !=scstable&&     prstbl !=scstable){    mbcs=0;  }  switch(prstbl[c]){  case CASE_IGNORE_STATE:    prstbl=igntable;    break;  case CASE_IGNORE_ESC:    prstbl=iestable;    break;  case CASE_ESC:    prstbl=esctable;    break;  case CASE_ESC_IGNORE:    prstbl=eigtable;    break;  case CASE_ESC_DIGIT:    if(nparam<MAXPARAM){      if(params[nparam]==DEFAULT){	params[nparam]=0;      }      params[nparam]*=10;      params[nparam]+=c-'0';    }    break;  case CASE_ESC_SEMI:    nparam++;    params[nparam]=DEFAULT;    break;  case CASE_TAB:    mywin.curcol+=TAB_SET;    mywin.curcol&=~(TAB_SET-1);    break;  case CASE_BS:    if(mywin.curcol > 0)      mywin.curcol--;#if 0 /* ^H maybe work backward character in MIMPI's screen */    DelChar(mywin.curline,mywin.curcol);    mywin.scrnbuf[mywin.curline][mywin.curcol].c=0;    mywin.scrnbuf[mywin.curline][mywin.curcol].attr=0;#endif    break;  case CASE_CSI_STATE:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -