📄 wrdt_mac.c
字号:
rect.left=x-r; rect.right=x+r; rect.top=y-r; rect.bottom=y+r; switch(sw) { case 0: case 1: //frame SET_G_COLOR(p1,graphicWorld[activeGraphics]); FrameOval(&rect); break; case 2: //filled circle SET_G_COLOR(p2,graphicWorld[activeGraphics]); PaintOval(&rect); SET_G_COLOR(p1,graphicWorld[activeGraphics]); FrameOval(&rect); break; } SetGWorld(oldGW, oldGD); UnlockPixels(GACTIVE_PIX); if( activeGraphics==dispGraphics ){ rect.right++; rect.bottom++; dev_remake_disp(rect); dev_redisp(rect); }}static void dev_set_text_attr(int esccode);static int Parse(int c);void dev_init(int version){ int i; inkey_flag = 0; dev_gon_flag=1; dev_set_text_attr(37); //white dev_change_1_palette(0, black); dev_change_1_palette(16, black); //for gon(0) gmode_mask=0xF; if( version<=0 || (380<=version && version<=399)) gmode_mask_gline=0x7; //change gline behavier else gmode_mask_gline=0xF; for(i=0; i<gvram_bank_num; i++){ dev_gscreen(i, dispGraphics); dev_clear_graphics(0xFF); } dev_gscreen(0, 0); dev_text_clear_all(); wrd_ton=1; dev_remake_disp(portRect); dev_redisp(portRect); dev_move_coursor(1,1); startpal=endpal=0; pallette_exist=true; fading=false; Parse(-1); //initialize parser wrd_init_path();}static OSErr get_vsscreen(){ OSErr err; Rect rect=portRect; rect.right++; rect.bottom++; //keep safty zone err=NewGWorld(&graphicWorld[gvram_bank_num], 8, &rect, 0, 0,0); if( ! err ){ ctl->cmsg(CMSG_INFO, VERB_NORMAL, "get gvram bank %d",gvram_bank_num ); gvram_bank_num++; }else{ ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Can't get gvram bank %d",gvram_bank_num ); } return err;}static OSErr dev_vsget(int num){ OSErr err; int i; for( i=gvram_bank_num; i<2+num; i++ ){ err=get_vsscreen(); if( err ) return err; } return 0;}static OSErr dev_setup(){ static OSErr err=0; int i; Rect destRect; if( err ) return err; // once errored, do not retry destRect.top=destRect.left=0; destRect.right=640; destRect.bottom=480; gvram_bank_num=0; err=NewGWorld(&dispWorld, 8, &destRect,0,0,0); if( err ) return err; { Rect charbufRect={0,0,16,32}; err=NewGWorld(&charbufWorld, 8, &charbufRect,0,0,0); if( err ) return err; mac_setfont(charbufWorld, WRD_FONTNAME); } //wrd_palette= NewPalette( 33, 0, pmTolerant, 0x0000); //if( wrd_palette ) SetPalette(win.ref, wrd_palette, true); for( i=0; i<=1; i++){ err=get_vsscreen(); if( err ) return err; } dev_init_text_color(); mac_setfont(dispWorld, WRD_FONTNAME); dev_init(-1); return 0; //noErr}// ***********************************************#pragma mark -/*VTParse Table externals*/extern int groundtable[];extern int csitable[];extern int dectable[];extern int eigtable[];extern int esctable[];extern int iestable[];extern int igntable[];extern int scrtable[];extern int scstable[];extern int mbcstable[];extern int smbcstable[];#define MAXPARAM 20#define DEFAULT -1#define TAB_SET 8#define MBCS 1#define CATTR_LPART (1)#define CATTR_16FONT (1<<1)#define CATTR_COLORED (1<<2)#define CATTR_BGCOLORED (1<<3) #define CATTR_TXTCOL_MASK_SHIFT 4#define CATTR_TXTCOL_MASK (7<<CATTR_TXTCOL_MASK_SHIFT)#define CATTR_INVAL (1<<31)static void DelChar(int /*x*/, int /*y*/){}#define ClearLine(y) dev_text_clear(1, (y), 80, (y), 0, 0, false)#define ClearRight() dev_text_clear(wrd_coursor_x, wrd_coursor_y, 80, wrd_coursor_y, 0, 0, false)#define ClearLeft() dev_text_clear(1, wrd_coursor_y, wrd_coursor_x, wrd_coursor_y, 0, 0, false)static void RedrawInject(int x1, int y1, int x2, int y2, Boolean){ Rect rect; SetRect(&rect,x1,y1,x2,y2); dev_remake_disp(rect); dev_redisp(rect);}static void dev_set_text_attr(int esccode){start: switch(esccode){ default: esccode=37; goto start; case 17: esccode=31; goto start; case 18: esccode=34; goto start; case 19: esccode=35; goto start; case 20: esccode=32; goto start; case 21: esccode=33; goto start; case 22: esccode=36; goto start; case 23: esccode=37; goto start; case 16: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: wrd_text_color_attr&=~CATTR_TXTCOL_MASK; wrd_text_color_attr|=( ((esccode>=30)?(esccode-30):(esccode-16))<< CATTR_TXTCOL_MASK_SHIFT); wrd_text_color_attr|=CATTR_COLORED; wrd_text_color_attr&=~CATTR_BGCOLORED; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: wrd_text_color_attr&=~CATTR_TXTCOL_MASK; wrd_text_color_attr|=(esccode-40)<<CATTR_TXTCOL_MASK_SHIFT; wrd_text_color_attr|=CATTR_BGCOLORED; break; }}static 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; } if( c==' ' ){ c='0'; } params[nparam]*=10; params[nparam]+=c-'0'; } break; case CASE_ESC_SEMI: nparam++; params[nparam]=DEFAULT; break; case CASE_TAB: wrd_coursor_x+=TAB_SET; wrd_coursor_x&=~(TAB_SET-1); break; case CASE_BS: if(wrd_coursor_x > 0) wrd_coursor_x--;#if 0 /* ^H maybe work backward character in MIMPI's screen */ DelChar(wrd_coursor_y,wrd_coursor_x); mywin.scrnbuf[wrd_coursor_y][wrd_coursor_x].c=0; mywin.scrnbuf[wrd_coursor_y][wrd_coursor_x].attr=0;#endif break; case CASE_CSI_STATE: nparam=0; params[0]=DEFAULT; prstbl=csitable; break; case CASE_SCR_STATE: prstbl=scrtable; mbcs=0; break; case CASE_MBCS: hankaku=0; prstbl=mbcstable; mbcs=MBCS; break; case CASE_SCS_STATE: if(mbcs) prstbl=smbcstable; else prstbl=scstable; break; case CASE_GSETS: wrd_text_color_attr=(mbcs)?(wrd_text_color_attr|CATTR_16FONT): (wrd_text_color_attr&~(CATTR_16FONT)); if(!mbcs){ hankaku=(c=='I')?1:0; } prstbl=groundtable; break; case CASE_DEC_STATE: prstbl =dectable; break; case CASE_SS2: case CASE_SS3: /*These are ignored because this will not accept SS2 SS3 charset*/ case CASE_GROUND_STATE: prstbl=groundtable; break; case CASE_CR: wrd_coursor_x=1; prstbl=groundtable; break; case CASE_IND: case CASE_VMOT: wrd_coursor_y++; wrd_coursor_x=1; prstbl=groundtable; break; case CASE_CUP: wrd_coursor_y=(params[0]<1)?0:params[0]; if(nparam>=1) wrd_coursor_x=(params[1]<1)?0:params[1]; else wrd_coursor_x=0; prstbl=groundtable; break; case CASE_PRINT: if(wrd_text_color_attr&CATTR_16FONT){ if(!(wrd_text_color_attr&CATTR_LPART)&&(wrd_coursor_x==COLS)){ wrd_coursor_x++; return 1; } wrd_text_color_attr^=CATTR_LPART; } else wrd_text_color_attr&=~CATTR_LPART; DelChar(wrd_coursor_y,wrd_coursor_x); if(hankaku==1) c|=0x80; //mywin.scrnbuf[wrd_coursor_y][wrd_coursor_x].attr=wrd_text_color_attr; //mywin.scrnbuf[wrd_coursor_y][wrd_coursor_x].c=c; wrd_coursor_x++; break; case CASE_CUU: wrd_coursor_y-=((params[0]<1)?1:params[0]); prstbl=groundtable; break; case CASE_CUD: wrd_coursor_y+=((params[0]<1)?1:params[0]); prstbl=groundtable; break; case CASE_CUF: wrd_coursor_x+=((params[0]<1)?1:params[0]); prstbl=groundtable; break; case CASE_CUB: wrd_coursor_x-=((params[0]<1)?1:params[0]); if( wrd_coursor_x<1 ) wrd_coursor_x=1; prstbl=groundtable; break; case CASE_ED: switch(params[0]){ case DEFAULT: case 0: { int j; ClearRight(); for(j=wrd_coursor_y+1;j<=LINES;j++) ClearLine(j); } break; case 1: { int j; ClearLeft(); for(j=1;j<wrd_coursor_y;j++) ClearLine(j); } break; case 2: { //int j; //for(j=0;j<LINES;j++){ // free(mywin.scrnbuf[j]); // mywin.scrnbuf[j]=NULL; //} dev_text_clear_all(); wrd_coursor_y=1; wrd_coursor_x=1; break; } } RedrawInject(0,0,SIZEX,SIZEY,false); prstbl=groundtable; break; case CASE_DECSC: savcol=wrd_coursor_x; savline=wrd_coursor_y; savattr=wrd_text_color_attr; prstbl=groundtable; case CASE_DECRC: wrd_coursor_x=savcol; wrd_coursor_y=savline; wrd_text_color_attr=savattr; prstbl=groundtable; break; case CASE_SGR: { int i; for(i=0;i<nparam+1;i++) dev_set_text_attr(params[i]); } prstbl=groundtable; break; case CASE_EL: switch(params[0]){ case DEFAULT: case 0: ClearRight(); break; case 1: ClearLeft(); break; case 2: ClearLine(wrd_coursor_y); break; } RedrawInject(0,0,SIZEX,SIZEY,false); prstbl=groundtable; break; case CASE_NEL: wrd_coursor_y++; wrd_coursor_x=1; wrd_coursor_y=(wrd_coursor_y<LINES)?wrd_coursor_y:LINES; break;/*Graphic Commands*/ case CASE_MY_GRAPHIC_CMD: //GrphCMD(params,nparam); prstbl=groundtable; break; case CASE_DL: dev_text_scroll(1, wrd_coursor_y+params[0], COLS, LINES, 0, 0, 0, params[0]); RedrawInject(0,0,SIZEX,SIZEY,false); prstbl=groundtable; break;/*Unimpremented Command*/ case CASE_ICH: case CASE_IL: case CASE_DCH: case CASE_DECID: case CASE_DECKPAM: case CASE_DECKPNM: //case CASE_IND: case CASE_HP_BUGGY_LL: case CASE_HTS: case CASE_RI: case CASE_DA1: case CASE_CPR: case CASE_DECSET: case CASE_RST: case CASE_DECSTBM: case CASE_DECREQTPARM: case CASE_OSC: case CASE_RIS: case CASE_HP_MEM_LOCK: case CASE_HP_MEM_UNLOCK: case CASE_LS2: case CASE_LS3: case CASE_LS3R: case CASE_LS2R: case CASE_LS1R: ctl->cmsg(CMSG_INFO,VERB_VERBOSE,"NOT IMPREMENTED:%d\n",prstbl[c]); prstbl=groundtable; break; case CASE_BELL: case CASE_IGNORE: default: break; } if( prstbl==groundtable ) return 1; return 0;}// ***********************************************#pragma mark -#pragma mark ================== Wrd Windowstatic int open_WrdWin();static void click_WrdWin(Point local, short modifiers);static void update_WrdWin();static int message_WrdWin(int message, long param);//#define win mac_WrdWindow //already definedMacWindow win={ 0, //WindowRef open_WrdWin, click_WrdWin, update_WrdWin, goaway_default, close_default, message_WrdWin, 0, 50,70};static int open_WrdWin() /*success-> return 0;*/{ open_window(&win, kWrdWinID); position_window(&win); return 0;}static void click_WrdWin(Point /*local*/, short /*modifiers*/){}static void update_WrdWin(){ dev_redisp(portRect);}static int message_WrdWin(int message, long /*param*/){ Rect rect; switch(message){ case MW_GROW: rect=win.ref->portRect; //rect.right-=15; rect.bottom-=15; rect = win.ref->portRect; rect.right -= 15; //rect.bottom -= 15; return 0; } return -1; //not supported}// ***********************************************#pragma mark -/*ARGSUSED*/static int wrdt_open(char * /*wrdt_opts*/){ // success -> return 0 OSErr err; err=dev_setup(); if( err ) return err; wrdt.opened = 1; wrd_argc = 0; inkey_flag = 0; ctl->cmsg(CMSG_INFO,VERB_VERBOSE,"open macintosh wrd player\n"); return 0;}static void wrdt_update_events(void){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -