diff --git a/src/conio/cterm.c b/src/conio/cterm.c index a29fa997f30e5cd6863379bc1e85684fee223ddc..f933ce1001115aed095f5a3be91615b47b7c5125 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -49,6 +49,7 @@ #include "keys.h" #include "cterm.h" +#include "allfonts.h" #define BUFSIZE 2048 @@ -482,6 +483,41 @@ void do_ansi(char *retbuf, size_t retsize, int *speed) } } break; + case '{': + if(cterm.escbuf[1] == '=') { /* Font loading */ + i=255; + j=0; + if(strlen(cterm.escbuf)>2) { + if((p=strtok(cterm.escbuf+1,";"))!=NULL) { + i=atoi(p); + if(!i && cterm.escbuf[2] != '0') + i=255; + if((p=strtok(NULL,";"))!=NULL) { + j=atoi(p); + } + } + } + if(i>255) + break; + cterm.font_start_time=time(NULL); + cterm.font_read=0; + cterm.font_slot=i; + switch(j) { + case 0: + cterm.font_size=4096; + break; + case 1: + cterm.font_size=3586; + break; + case 2: + cterm.font_size=2048; + break; + default: + cterm.font_size=0; + break; + } + } + break; } break; } @@ -1006,6 +1042,7 @@ void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsign char *in; char *out; + memset(&cterm, 0, sizeof(cterm)); cterm.x=xpos; cterm.y=ypos; cterm.height=height; @@ -1162,7 +1199,42 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, size_t retsize, prn[0]=0; for(j=0;j<buflen;j++) { ch[0]=buf[j]; - if(cterm.sequence) { + if(cterm.font_size) { + cterm.fontbuf[cterm.font_read++]=ch[0]; + if(cterm.font_read == cterm.font_size) { + char *buf; + + if((buf=(char *)malloc(cterm.font_size))!=NULL) { + memcpy(buf,cterm.fontbuf,cterm.font_size); + if(cterm.font_slot >= CONIO_FIRST_FREE_FONT) { + switch(cterm.font_size) { + case 4096: + FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_sixteen); + conio_fontdata[cterm.font_slot].eight_by_sixteen=buf; + FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc); + conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font"); + break; + case 3586: + FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_fourteen); + conio_fontdata[cterm.font_slot].eight_by_fourteen=buf; + FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc); + conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font"); + break; + case 2048: + FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_eight); + conio_fontdata[cterm.font_slot].eight_by_eight=buf; + FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc); + conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font"); + break; + } + } + else + FREE_AND_NULL(buf); + } + cterm.font_size=0; + } + } + else if(cterm.sequence) { k=strlen(cterm.escbuf); strcat(cterm.escbuf,ch); if(k) { @@ -1346,5 +1418,13 @@ void cterm_closelog() void cterm_end(void) { + int i; + cterm_closelog(); + for(i=CONIO_FIRST_FREE_FONT; i < 256; i++) { + FREE_AND_NULL(conio_fontdata[i].eight_by_sixteen); + FREE_AND_NULL(conio_fontdata[i].eight_by_fourteen); + FREE_AND_NULL(conio_fontdata[i].eight_by_eight); + FREE_AND_NULL(conio_fontdata[i].desc); + } } diff --git a/src/conio/cterm.h b/src/conio/cterm.h index 6f9e5e351eb279bf0e33f70696d1b4ac2680730f..c613e2f169df48de41704374d46c4922dda0c71a 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -78,6 +78,11 @@ struct cterminal { int log; FILE* logfile; char DA[1024]; + char fontbuf[4096]; + int font_slot; + int font_size; + int font_read; + int font_start_time; }; #define CTERM_MUSIC_SYNCTERM 0 diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt index 349fd2822aaaeef10b594df4f1657f6472d2cf76..02af3cddbd22e830095b684d880c4029eb82ebf7 100644 --- a/src/conio/cterm.txt +++ b/src/conio/cterm.txt @@ -90,6 +90,21 @@ CSI = [p1] M SOURCE: CTerm only. +CSI = [ p1 [ ; p2 ] ] { + NON-STANDARD EXTENSION. + Defaults: p1 = 255 p2 = 0 + Indicates that a font block is following. + p1 indicates the font slot to place the loaded font into. This must + be higher than the last default defined font (See CSI sp D for list + of predefined fonts) p2 indicates font size according to the + following table: + 0 - 8x16 font, 4096 bytes. + 1 - 8x14 font, 3586 bytes. + 2 - 8x8 font, 2048 bytes. + + SOURCE: CTerm only. + + CSI [ p1 [ ; p2 ] ] * r NON-STANDARD EXTENSION. Set the output emulation speed.