#include #include #include #include #include #include "thrdef.h" #include "globdef.h" #include "uidef.h" #include "screendef.h" #include "lconf.h" #include "xdef.h" #include "keyboard_def.h" extern GC xgc; extern XImage *ximage; extern Display *xdis; extern Window xwin; extern Colormap lir_colormap; typedef struct { unsigned short int red; unsigned short int green; unsigned short int blue; unsigned int pixel; short int flag; float total; }PIXINFO; void x_global_uiparms(int wn) { char s[80],ss[10]; int line; line=0; sprintf(s,"Font scale (1 to 5):"); if(ui.vga_mode==0)ui.vga_mode=10; if(wn==0) { fntc:; printf("\n%s\n=>",s); fgets(ss,8,stdin); lir_inkey=toupper(ss[0]); if(lir_inkey < '1' || lir_inkey > '5')goto fntc; ui.font_scale=lir_inkey-'0'; } else { clear_screen(); if(screen_width > 640)ui.vga_mode=11; if(screen_width > 800)ui.vga_mode=12; lir_text(0,2,s); ui.font_scale=lir_get_integer(21,2,2,1,5); if(kill_all_flag) return; } if(ui.mouse_speed <=0 || ui.mouse_speed> 120)ui.mouse_speed=8; sprintf(s,"Parport address (lpt1=888, none=0):"); parport_gtnum:; if(ui.vga_mode < 10 || ui.vga_mode > 256)ui.vga_mode=10; if(wn==0) { printf("\n%s\n=>",s); fgets(ss,8,stdin); sscanf(ss,"%d", &ui.parport); if(ui.parport < 0)goto parport_gtnum; } else { clear_lines(3,3); lir_text(0,3,s); ui.parport=lir_get_integer(36,3,5,0,99999); if(kill_all_flag) return; } if(ui.parport != 0) { sprintf (s,"Parport read pin (ACK=10):"); gtpin:; if(wn==0) { printf("\n%s\n=>",s); fgets(ss,8,stdin); sscanf(ss,"%d", &ui.parport_pin); } else { clear_lines(4,4); lir_text(0,4,s); ui.parport_pin=lir_get_integer(27,4,2,10,15); if(kill_all_flag) return; } if( ui.parport_pin ==14 || ui.parport_pin > 15 || ui.parport_pin < 10) goto gtpin; } else { ui.parport_pin=0; } sprintf(s,"Percentage of screen width to use(33 to 100):"); parport_wfac:; if(wn==0) { printf("\n%s\n=>",s); fgets(ss,8,stdin); sscanf(ss,"%d", &ui.screen_width_factor); if(ui.screen_width_factor < 33 || ui.screen_width_factor > 100)goto parport_wfac; } else { clear_lines(5,5); lir_text(0,5,s); ui.screen_width_factor=lir_get_integer(47,5,3,33,100); if(kill_all_flag) return; } sprintf(s,"Percentage of screen height to use (33 to 100):"); parport_hfac:; if(wn==0) { printf("\n%s\n=>",s); fgets(ss,8,stdin); sscanf(ss,"%d", &ui.screen_height_factor); if(ui.screen_height_factor < 33 || ui.screen_height_factor > 100)goto parport_hfac; } else { clear_lines(6,6); lir_text(0,6,s); ui.screen_height_factor=lir_get_integer(49,6,3,33,100); if(kill_all_flag) return; lir_text(0,8,"Save parameters with W in the main menu"); lir_text(0,9,"Then restart Linrad for changes to take effect."); lir_text(10,11,press_any_key); await_keyboard(); } // ****************************************************** // The remaining ui parameters are used for soundcard control. } void lin_global_uiparms(int wn) { int i; i=wn; } // ********************************************************* // Graphics for X11 // ********************************************************* void lir_getpalettecolor(int j, int *r, int *g, int *b) { int k; unsigned short int *ipalette; switch (color_depth) { case 24: b[0]=(int)(svga_palette[3*j ])>>2; g[0]=(int)(svga_palette[3*j+1])>>2; r[0]=(int)(svga_palette[3*j+2])>>2; break; case 16: ipalette=(void*)(&svga_palette[0]); k=ipalette[j]; k<<=1; b[0]=k&0x3f; k>>=6; g[0]=k&0x3f; k>>=5; r[0]=k; break; case 8: b[0]=(int)(svga_palette[3*j ]); g[0]=(int)(svga_palette[3*j+1]); r[0]=(int)(svga_palette[3*j+2]); break; } } void lir_fillbox(int x, int y,int w, int h, unsigned char c) { int i, j, k; unsigned short int *ipalette; k=(x+y*screen_width); if(k<0 || k+(h-1)*screen_width+w > screen_totpix) { lirerr(1213); return; } if(first_mempix > k)first_mempix=k; switch (color_depth) { case 24: for(j=0; j=MAX_SVGA_PALETTE)c=0; if(c==c1) { lirerr(1248); return; } } store_24:; savmem[m]=c; m++; } k+=screen_width; } break; case 16: ipalette=(void*)(&svga_palette[0]); for(j=0; j=MAX_SVGA_PALETTE)c=0; if(c==c1) { lirerr(1248); return; } } store_16:; savmem[m]=c; m++; } k+=screen_width; } break; case 8: for(j=0; j=MAX_SVGA_PALETTE)c=0; if(c==c1) { lirerr(1248); return; } } store_8:; savmem[m]=c; m++; } k+=screen_width; } break; } } void lir_putbox(int x, int y, int w, int h, void* dp) { unsigned char *savmem; int i, j, k, m; unsigned short int *ipalette; k=(x+y*screen_width); if(k<0 || k+(h-1)*screen_width+w-1 >= screen_totpix) { lirerr(1213); return; } if(first_mempix > k)first_mempix=k; m=0; savmem=(unsigned char*)dp; switch (color_depth) { case 24: for(j=0; j= screen_totpix) { lirerr(1214); return; } switch (color_depth) { case 24: for(i=ia; i<=ib; i++) { mempix_char[4*i ]=svga_palette[3*c ]; mempix_char[4*i+1]=svga_palette[3*c+1]; mempix_char[4*i+2]=svga_palette[3*c+2]; } break; case 16: ipalette=(void*)(&svga_palette[0]); for(i=ia; i<=ib; i++) { mempix_shi[i]=ipalette[c]; } break; case 8: for(i=ia; i<=ib; i++) { mempix_char[i]=xpalette[c]; } break; } if(first_mempix > ia)first_mempix=ia; if(last_mempix < ib)last_mempix=ib; } void lir_line(int x1, int yy1, int x2,int y2, unsigned char c) { int ia; int i,j,k; int xd, yd; float t1,t2,delt; unsigned short int *ipalette; if(x1 < 0)x1=0; if(x1 >= screen_width)x1=screen_width-1; if(x2 < 0)x2=0; if(x2 >= screen_width)x2=screen_width-1; if(yy1 < 0)yy1=0; if(yy1 >= screen_height)yy1=screen_height-1; if(y2 < 0)y2=0; if(y2 >= screen_height)y2=screen_height-1; xd=x2-x1; yd=y2-yy1; if(yd==0) { if(xd==0) { lir_setpixel(x1,yy1,c); } else { lir_hline(x1,yy1,x2,c); } return; } if(abs(xd)>=abs(yd)) { if(xd>=0) { k=1; } else { k=-1; } if(yd >= 0) { delt=0.5; } else { delt=-0.5; } t1=yy1; t2=(float)(yd)/abs(xd); i=x1-k; switch (color_depth) { case 24: while(i!=x2) { i+=k; j=t1+delt; ia=i+j*(screen_width); mempix_char[4*ia ]=svga_palette[3*c ]; mempix_char[4*ia+1]=svga_palette[3*c+1]; mempix_char[4*ia+2]=svga_palette[3*c+2]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; case 16: ipalette=(void*)(&svga_palette[0]); while(i!=x2) { i+=k; j=t1+delt; ia=i+j*(screen_width); mempix_shi[ia ]=ipalette[c ]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; case 8: while(i!=x2) { i+=k; j=t1+delt; ia=i+j*(screen_width); mempix_char[ia ]=xpalette[c ]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; } } else { if(yd>=0) { k=1; } else { k=-1; } if(xd >= 0) { delt=0.5; } else { delt=-0.5; } t1=x1; t2=(float)(xd)/abs(yd); i=yy1-k; switch (color_depth) { case 24: while(i!=y2) { i+=k; j=t1+delt; ia=j+i*(screen_width); mempix_char[4*ia ]=svga_palette[3*c ]; mempix_char[4*ia+1]=svga_palette[3*c+1]; mempix_char[4*ia+2]=svga_palette[3*c+2]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; case 16: ipalette=(void*)(&svga_palette[0]); while(i!=y2) { i+=k; j=t1+delt; ia=j+i*(screen_width); mempix_shi[ia ]=ipalette[c ]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; case 8: while(i!=y2) { i+=k; j=t1+delt; ia=j+i*(screen_width); mempix_char[ia ]=xpalette[c ]; if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; t1+=t2; } break; } } } void lir_setpixel(int x, int y, unsigned char c) { int ia; unsigned short int *ipalette; ia=x+y*screen_width; if(ia < 0 || ia >= screen_totpix) { DEB"\nwrite: x=%d y=%d",x,y); lirerr(1210); return; } switch (color_depth) { case 24: mempix_char[4*ia ]=svga_palette[3*c ]; mempix_char[4*ia+1]=svga_palette[3*c+1]; mempix_char[4*ia+2]=svga_palette[3*c+2]; break; case 16: ipalette=(void*)(&svga_palette[0]); mempix_shi[ia]=ipalette[c]; break; case 8: mempix_char[ia]=xpalette[c]; break; } if(first_mempix > ia)first_mempix=ia; if(last_mempix < ia)last_mempix=ia; } void clear_screen(void) { int i, k; switch (color_depth) { case 24: k=4*screen_width*screen_height; for(i=0; i= first_mempix ) { l1=first_mempix/screen_width; h=last_mempix/screen_width-l1+1; if(h>screen_height)h=screen_height; first_mempix=0x7fffffff; last_mempix=0; while(h>0) { n=(5*h)/screen_height; if(n > 1) { h1=h/n; } else { h1=h; } XPutImage(xdis, xwin, xgc, ximage, 0, l1, 0, l1, screen_width, h1); l1+=h1; h-=h1; if(h > 0)lir_sched_yield(); } XFlush(xdis); } } void thread_mouse(void) { wxmouse(); }