📄 wrdt_mac.c
字号:
static void wrdt_close(void){ wrdt.opened = 0; inkey_flag = 0;}static char *wrd_event2string(int id){ char *name; name = event2string(id); if(name != NULL) return name + 1; return "";}// **************************************************#pragma mark -static void mac_wrd_pal(int pnum, int wrd_args[]){ int code; RGBColor color; for( code=0; code<16; code++ ){ color.red=((wrd_args[code] >> 8) & 0x000F) * 0x1111; color.green=((wrd_args[code] >> 4) & 0x000F) * 0x1111; color.blue=(wrd_args[code] & 0x000F) * 0x1111; dev_palette[pnum][code]=color; if( pnum==0 ){ dev_change_1_palette(code, color); } } if( pnum==0 ){ //dev_remake_disp(portRect); dev_redisp(portRect); }}static void wrd_fadestep(int nowstep, int maxstep){ RGBColor pal[16]; int code; //static unsigned long lasttick=0; static int skip_num; //if( nowstep!=1 && nowstep!=maxstep /*&& (nowstep%4)==0*/ && lasttick==TickCount() ){ // return; //too fast fade. skip fading. //} if( nowstep==1 ){ skip_num=0; } if( nowstep!=maxstep && !mac_flushing_flag){ //consider skipping const int skip_threshold[11]={99,99,6,5,4, 2,1,0,0,0,0}; int threshold= skip_threshold[ (int)(aq_filled_ratio()*10) ]; if( skip_num<threshold ){ skip_num++; return; // system is busy } } skip_num=0; for( code=0; code<16; code++ ){ pal[code].red= (dev_palette[startpal][code].red*(maxstep-nowstep) + dev_palette[endpal][code].red*nowstep)/maxstep; pal[code].green= (dev_palette[startpal][code].green*(maxstep-nowstep) + dev_palette[endpal][code].green*nowstep)/maxstep; pal[code].blue= (dev_palette[startpal][code].blue*(maxstep-nowstep) + dev_palette[endpal][code].blue*nowstep)/maxstep; } dev_change_palette(pal); dev_redisp(portRect); if( nowstep==maxstep ) fading=false; //lasttick=TickCount();}static void mac_wrd_fade(int p1, int p2, int speed){ startpal=p1; endpal=p2; if( fading ){ //double fade command wrd_fadestep(1, 1); } if(speed==0){ dev_change_palette( dev_palette[p2]); //dev_remake_disp(portRect); dev_redisp(portRect); }else{ fading=true; }}static void dev_gon(int gon){ dev_gon_flag=gon; dev_remake_disp(portRect); dev_redisp(portRect);}static void dev_palrev(int paln ){ int code; for( code=0; code<16; code++ ){ dev_palette[paln][code].red ^= 0xFFFF; dev_palette[paln][code].green ^= 0xFFFF; dev_palette[paln][code].blue ^= 0xFFFF; } if( paln==0 ){ dev_change_palette(dev_palette[0]); dev_redisp(portRect); }}static int wrd_mag(char* filename, int x, int y, int /*s*/, int p){ int err; Rect rect; //char fullpath[255]; GDHandle oldGD; GWorldPtr oldGW; GetGWorld(&oldGW, &oldGD); LockPixels(GACTIVE_PIX); SetGWorld(graphicWorld[activeGraphics],0); err= mac_mag_load(filename, x,y, GACTIVE_PIX, p ,&rect); SetGWorld(oldGW, oldGD); UnlockPixels(GACTIVE_PIX); if( err ) return err; if( p==0 || p==2 ){ dev_change_palette(dev_palette[17]); rect=portRect; //update all } if( activeGraphics==dispGraphics || p==0 || p==2 ){ dev_remake_disp(rect); dev_redisp(rect); } memcpy(&dev_palette[18+ (activeGraphics==0? 0:1)] , &dev_palette[17], 16*sizeof(RGBColor)); return 0; //no error}static int wrd_pho(char* filename){ //char fullpath[255]; GDHandle oldGD; GWorldPtr oldGW; GetGWorld(&oldGW, &oldGD); LockPixels(GACTIVE_PIX); SetGWorld(graphicWorld[activeGraphics],0); mac_pho_load(filename, GACTIVE_PIX); SetGWorld(oldGW, oldGD); UnlockPixels(GACTIVE_PIX); if( activeGraphics==dispGraphics ){ dev_remake_disp(portRect); dev_redisp(portRect); } return 0; //no error}static void wrd_load_default_image(){ char filename[256], *p; strncpy(filename, current_file_info->filename, sizeof(filename)); p= strrchr( filename, '.' ); if( p==0 ) return; strncpy( p, ".mag", sizeof(filename) - (p - filename) - 1 ); filename[sizeof(filename) - 1] = '\0'; ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@DEFAULT_LOAD_MAG(%s)", filename); if( wrd_mag(filename, WRD_NOARG, WRD_NOARG, 1,0)==0 ) //no err return; //retry pho file strncpy(filename, current_file_info->filename sizeof(filename)); p= strrchr( filename, '.' ); if( p==0 ) return; strncpy( p, ".pho", sizeof(filename) - (p - filename) - 1 ); filename[sizeof(filename) - 1] = '\0'; wrd_pho(filename);}// **************************************************#pragma mark -static void mac_wrd_color(int c){ dev_set_text_attr(c);}static void mac_wrd_DrawText(const char* str, int len){ int i; for( i=0; i<=len; ){ if( str[i]==0 || i==len ){ dev_text_output(str, i); break; }else if( wrd_coursor_x+i>80 ){ dev_text_output(str, i); dev_newline(); //i++; str+=i; len-=i; i=0; }else if( str[i]=='\x1b' ){ //esc sequence if( i ){ dev_text_output(str, i); str+=i; len-=i; i=0; } for(;;i++){ if( Parse(str[i]) ){ break; //esc sequence ended } } i++; str+=i; len-=i; i=0; }else if (str[i]=='\t' ){ //tab space int newx; dev_text_output(str, i); newx=((wrd_coursor_x-1)|7)+2; dev_text_clear(wrd_coursor_x, wrd_coursor_y, newx-1, wrd_coursor_y, 0, 0, true); dev_move_coursor(newx,wrd_coursor_y); i++; str+=i; len-=i; i=0; }else{ i++; } }}static void mac_wrd_doESC(const char* code ){ char str[20]="\33["; strncat(str, code, sizeof(str) - strlen(str) - 1); str[sizeof(str)-1] = '\0'; mac_wrd_DrawText(str, strlen(str));}static void mac_wrd_event_esc(int esc){ mac_wrd_doESC(event2string(esc)+1);}static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[]){ char *p; char *text; int i, len; if( ! win.show ) return; //wrd_args[wrd_argc++] = arg; if(cmd == WRD_ARG) return; if(cmd == WRD_MAGPRELOAD){ //char *p = wrd_event2string(arg); /* Load MAG file */ WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@WRD_MAGPRELOAD")); wrd_argc = 0; return; } if(inkey_flag) printf("* "); switch(cmd) { case WRD_LYRIC: case WRD_NL: if(cmd == WRD_NL) text = "\n"; else{ p = wrd_event2string(wrd_args[0]); len = strlen(p); text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len)); code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL); } len = strlen(text); if( len ){ mac_wrd_DrawText(text, text[len-1]=='\n'? len-1:len); if( text[len-1]=='\n' ){ dev_newline(); } ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", text); } reuse_mblock(&tmpbuffer); break; case WRD_COLOR: mac_wrd_color(wrd_args[0]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@COLOR(%d)", wrd_args[0])); break; case WRD_END: /* Never call */ WRD_DEBUG((CMSG_INFO, VERB_VERBOSE,"@END")); break; case WRD_ESC: mac_wrd_event_esc(wrd_args[0]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@ESC(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_EXEC: WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@EXEC(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_FADE: mac_wrd_fade(wrd_args[0], wrd_args[1], wrd_args[2]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@FADE(%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2])); break; case WRD_FADESTEP: wrd_fadestep(wrd_args[0], WRD_MAXFADESTEP); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@FADESTEP(%d/%d)", wrd_args[0], WRD_MAXFADESTEP)); break; case WRD_GCIRCLE: dev_gcircle(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GCIRCLE(%d,%d,%d,%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5])); break; case WRD_GCLS: dev_clear_graphics(wrd_args[0]? wrd_args[0]:0xFF); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GCLS(%d)", wrd_args[0])); break; case WRD_GINIT: WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GINIT()")); break; case WRD_GLINE: dev_gline(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6],graphicWorld[activeGraphics]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GLINE(%d,%d,%d,%d,%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6])); break; case WRD_GMODE: DEV_SET_GMODE(wrd_args[0]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GMODE(%d)", wrd_args[0])); break; case WRD_GMOVE: wrd_args[0] &= ~0x7; wrd_args[4] &= ~0x7; wrd_args[2] |= 0x7; dev_gmove(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], graphicWorld[wrd_args[6]], graphicWorld[wrd_args[7]], wrd_args[8], 0, gmode_mask, 0,0,0); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GMOVE(%d,%d, %d,%d, %d,%d, %d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6], wrd_args[7], wrd_args[8])); break; case WRD_GON: dev_gon(wrd_args[0]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GON(%d)", wrd_args[0])); break; case WRD_GSCREEN: dev_gscreen(wrd_args[0], wrd_args[1]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@GSCREEN(%d,%d)", wrd_args[0], wrd_args[1])); break; case WRD_INKEY: inkey_flag = 1; WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@INKEY - begin")); break; case WRD_OUTKEY: inkey_flag = 0; WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@INKEY - end")); break; case WRD_LOCATE: dev_move_coursor(wrd_args[0], wrd_args[1]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@LOCATE(%d,%d)", wrd_args[0], wrd_args[1])); break; case WRD_LOOP: /* Never call */ break; case WRD_MAG: wrd_mag(wrd_event2string(wrd_args[0]), wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4]);/* p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE); *//* strcpy(p, "@MAG("); *//* strcat(p, wrd_event2string(wrd_args[0])); *//* strcat(p, ","); *//* for(i = 1; i < 3; i++) *//* { *//* if(wrd_args[i] == WRD_NOARG) *//* strcat(p, "*,"); *//* else *//* sprintf(p + strlen(p), "%d,", wrd_args[i]); *//* } *//* sprintf(p + strlen(p), "%d,%d)", wrd_args[3], wrd_args[4]); *//* WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "%s", p)); *//* reuse_mblock(&tmpbuffer); */ break; case WRD_MIDI: /* Never call */ break; case WRD_OFFSET: /* Never call */ break; case WRD_PAL:/* mac_wrd_pal( wrd_args[0], &wrd_args[1]); *//* p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE); *//* sprintf(p, "@PAL(%03x", wrd_args[0]); *//* for(i = 1; i < 17; i++) *//* sprintf(p + strlen(p), ",%03x", wrd_args[i]); *//* strcat(p, ")"); *//* WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "%s", p)); *//* reuse_mblock(&tmpbuffer); */ break; case WRD_PALCHG: WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@PALCHG(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_PALREV: dev_palrev(wrd_args[0]); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@PALREV(%d)", wrd_args[0])); break; case WRD_PATH: WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@PATH(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_PLOAD: wrd_pho(wrd_event2string(wrd_args[0])); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@PLOAD(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_REM: p = wrd_event2string(wrd_args[0]); len = strlen(p); text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len)); code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@REM %s", text)); reuse_mblock(&tmpbuffer); break; case WRD_REMARK: WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@REMARK(%s)", wrd_event2string(wrd_args[0]))); break; case WRD_REST: /* Never call */ break; case WRD_SCREEN: /* Not supported */ break; case WRD_SCROLL: dev_text_scroll(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6], 1); dev_remake_disp(portRect); dev_redisp(portRect); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@SCROLL(%d,%d,%d,%d,%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6])); break; case WRD_STARTUP: dev_init(wrd_args[0]); dev_init_text_color(); wrd_load_default_image(); inkey_flag = 0; dev_set_height(400); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@STARTUP(%d)", wrd_args[0])); break; case WRD_STOP: /* Never call */ break; case WRD_TCLS: dev_text_clear(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],wrd_args[4],wrd_args[5], true); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@TCLS(%d,%d,%d,%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5])); break; case WRD_TON: wrd_ton=wrd_args[0]; dev_remake_disp(portRect); dev_redisp(portRect); WRD_DEBUG((CMSG_INFO, VERB_VERBOSE, "@TON(%d)", wrd_args[0])); break; case WRD_WAIT: /* Never call */ break; case WRD_WMODE: /* Never call */ break; /* Ensyutsukun */ case WRD_eFONTM: print_ecmd("FONTM", wrd_args, 1); break; case WRD_eFONTP: print_ecmd("FONTP", wrd_args, 4); break; case WRD_eFONTR: print_ecmd("FONTR", wrd_args, 17); break; case WRD_eGSC: print_ecmd("GSC", wrd_args, 1); break; case WRD_eLINE: print_ecmd("LINE", wrd_args, 1); break; case WRD_ePAL: print_ecmd("PAL", wrd_args, 2); break; case WRD_eREGSAVE: print_ecmd("REGSAVE", wrd_args, 17); break; case WRD_eSCROLL: print_ecmd("SCROLL",wrd_args, 2); break; case WRD_eTEXTDOT: print_ecmd("TEXTDOT", wrd_args, 1); break; case WRD_eTMODE: print_ecmd("TMODE", wrd_args, 1); break; case WRD_eTSCRL: print_ecmd("TSCRL", wrd_args, 0); break; case WRD_eVCOPY: wrd_args[0] &= ~0x7; wrd_args[4] &= ~0x7; wrd_args[2] |= 0x7; dev_gmove(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],wrd_args[5], graphicWorld[wrd_args[6]+(wrd_args[8]? 2:0)], graphicWorld[wrd_args[7]+ (wrd_args[8]? 0:2)], 0/*normal copy*/,0,gmode_mask, 0,0,0 ); //ignore mode in this version, always EMS->GVRAM print_ecmd("VCOPY", wrd_args, 9); break; case WRD_eVSGET: dev_vsget(wrd_args[0]); print_ecmd("VSGE", wrd_args, 4); break; case WRD_eVSRES: print_ecmd("VSRES", wrd_args, 0); break; case WRD_eXCOPY: dev_gmove(wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], graphicWorld[wrd_args[6]], graphicWorld[wrd_args[7]], wrd_args[8]+0x10, 0/*trans*/, gmode_mask, 0,0,0 ); print_ecmd("XCOPY", wrd_args, 14); break; /* Extensionals */ case WRD_START_SKIP: mac_RedrawControl(0); ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "WRD START SKIP"); break; case WRD_END_SKIP: mac_RedrawControl(1); ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "WRD END SKIP"); break;#ifdef ENABLE_SHERRY case WRD_SHERRY_UPDATE: sry_update(); break;#endif } wrd_argc = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -