From: svenhoefer Date: Tue, 14 Aug 2012 20:09:49 +0000 (+0200) Subject: * initial commit X-Git-Url: https://git.webhop.me/?a=commitdiff_plain;h=2d940ce9c995fa47ba88451d63f290f4d98bfa62;p=input.git * initial commit --- 2d940ce9c995fa47ba88451d63f290f4d98bfa62 diff --git a/gfx.c b/gfx.c new file mode 100644 index 0000000..23c826b --- /dev/null +++ b/gfx.c @@ -0,0 +1,128 @@ +#include "input.h" + +char circle[] = +{ + 0,0,0,0,0,1,1,0,0,0,0,0, + 0,0,0,1,1,1,1,1,1,0,0,0, + 0,0,1,1,1,1,1,1,1,1,0,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,0,1,1,1,1,1,1,1,1,0,0, + 0,0,0,1,1,1,1,1,1,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0 +}; + +void RenderBox(int sx, int sy, int ex, int ey, int rad, int col) +{ + int F,R=rad,ssx=startx+sx,ssy=starty+sy,dxx=ex-sx,dyy=ey-sy,rx,ry,wx,wy,count; + + unsigned char *pos=(lbb+(ssx<<2)+fix_screeninfo.line_length*ssy); + unsigned char *pos0, *pos1, *pos2, *pos3, *i; + unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]}; + + if (dxx<0) + { + printf("[input] RenderBox called with dx < 0 (%d)\n", dxx); + dxx=0; + } + + if(R) + { + if(--dyy<=0) + { + dyy=1; + } + + if(R==1 || R>(dxx/2) || R>(dyy/2)) + { + R=dxx/10; + F=dyy/10; + if(R>F) + { + if(R>(dyy/3)) + { + R=dyy/3; + } + } + else + { + R=F; + if(R>(dxx/3)) + { + R=dxx/3; + } + } + } + ssx=0; + ssy=R; + F=1-R; + + rx=R-ssx; + ry=R-ssy; + + pos0=pos+((dyy-ry)*fix_screeninfo.line_length); + pos1=pos+(ry*fix_screeninfo.line_length); + pos2=pos+(rx*fix_screeninfo.line_length); + pos3=pos+((dyy-rx)*fix_screeninfo.line_length); + while (ssx <= ssy) + { + rx=R-ssx; + ry=R-ssy; + wx=rx<<1; + wy=ry<<1; + + for(i=pos0+(rx<<2); i +#include +#include +#include +#include "input.h" +#include "text.h" +#include "io.h" +#include "gfx.h" +#include "inputd.h" + +#define NCF_FILE "/var/tuxbox/config/neutrino.conf" +#define BUFSIZE 1024 +#define I_VERSION 1.08 + +//#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" +#define FONT2 "/share/fonts/pakenham.ttf" +// if font is not in usual place, we look here: +#define FONT "/share/fonts/neutrino.ttf" + +// CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH +// WHITE, BLUE0, TRANSP, CMS, ORANGE, GREEN, YELLOW, RED + +unsigned char bl[] = { 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00}; +unsigned char gn[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xC0, 0x00, + 0xFF, 0x80, 0x00, 0x80, 0xC0, 0xFF, 0xFF, 0x00}; +unsigned char rd[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF}; +unsigned char tr[] = { 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0xA0, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + +void TrimString(char *strg); + +// OSD stuff +static char menucoltxt[][25]={"Content_Selected_Text","Content_Selected","Content_Text","Content","Content_inactive_Text","Content_inactive","Head_Text","Head"}; +static char spres[][5]={"","_crt","_lcd"}; + +char *buffer=NULL; + +//static void ShowInfo(void); + +// Misc +char NOMEM[]="input \n"; +char TMP_FILE[]="/tmp/input.tmp"; +unsigned char *lfb = 0, *lbb = 0, *obb = 0; +unsigned char nstr[512]="",rstr[512]=""; +unsigned char *trstr; +unsigned char rc,sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={0xE4,0xF6,0xFC,0xC4,0xD6,0xDC,0xDF,0xB0}; +int radius=10; + +static void quit_signal(int sig) +{ + put_instance(get_instance()-1); + printf("input Version %.2f killed\n",I_VERSION); + exit(1); +} + +int Read_Neutrino_Cfg(char *entry) +{ +FILE *nfh; +char tstr [512], *cfptr=NULL; +int rv=-1; + + if((nfh=fopen(NCF_FILE,"r"))!=NULL) + { + tstr[0]=0; + + while((!feof(nfh)) && ((strstr(tstr,entry)==NULL) || ((cfptr=strchr(tstr,'='))==NULL))) + { + fgets(tstr,500,nfh); + } + if(!feof(nfh) && cfptr) + { + ++cfptr; + if(sscanf(cfptr,"%d",&rv)!=1) + { + if(strstr(cfptr,"true")!=NULL) + { + rv=1; + } + else + { + if(strstr(cfptr,"false")!=NULL) + { + rv=0; + } + else + { + rv=-1; + } + } + } +// printf("%s\n%s=%s -> %d\n",tstr,entry,cfptr,rv); + } + fclose(nfh); + } + return rv; +} + +void TrimString(char *strg) +{ +char *pt1=strg, *pt2=strg; + + while(*pt2 && *pt2<=' ') + { + ++pt2; + } + if(pt1 != pt2) + { + do + { + *pt1=*pt2; + ++pt1; + ++pt2; + } + while(*pt2); + *pt1=0; + } + while(strlen(strg) && strg[strlen(strg)-1]<=' ') + { + strg[strlen(strg)-1]=0; + } +} + +int Transform_Msg(char *msg) +{ +int found=0,i; +char *sptr=msg, *tptr=msg; + + while(*sptr) + { + if(*sptr!='~') + { + *tptr=*sptr; + } + else + { + rc=*(sptr+1); + found=0; + for(i=0; i\n",aptr); + return 0; + break; + + case 2: + printf("input \n\n",aptr); + ShowUsage(); + return 0; + break; + } + } + if(!format) + { + printf("input \n"); + return 0; + } + if(!title) + { + title=ttl; + } + + if((buffer=calloc(BUFSIZE+1, sizeof(char)))==NULL) + { + printf(NOMEM); + return 0; + } + + spr=Read_Neutrino_Cfg("screen_preset")+1; + sprintf(buffer,"screen_StartX%s",spres[spr]); + if((sx=Read_Neutrino_Cfg(buffer))<0) + sx=100; + + sprintf(buffer,"screen_EndX%s",spres[spr]); + if((ex=Read_Neutrino_Cfg(buffer))<0) + ex=1180; + + sprintf(buffer,"screen_StartY%s",spres[spr]); + if((sy=Read_Neutrino_Cfg(buffer))<0) + sy=100; + + sprintf(buffer,"screen_EndY%s",spres[spr]); + if((ey=Read_Neutrino_Cfg(buffer))<0) + ey=620; + + for(index=CMCST; index<=CMH; index++) + { + sprintf(rstr,"menu_%s_alpha",menucoltxt[index]); + if((tv=Read_Neutrino_Cfg(rstr))>=0) + tr[index]=255-(float)tv*2.55; + + sprintf(rstr,"menu_%s_blue",menucoltxt[index]); + if((tv=Read_Neutrino_Cfg(rstr))>=0) + bl[index]=(float)tv*2.55; + + sprintf(rstr,"menu_%s_green",menucoltxt[index]); + if((tv=Read_Neutrino_Cfg(rstr))>=0) + gn[index]=(float)tv*2.55; + + sprintf(rstr,"menu_%s_red",menucoltxt[index]); + if((tv=Read_Neutrino_Cfg(rstr))>=0) + rd[index]=(float)tv*2.55; + } + + if(Read_Neutrino_Cfg("rounded_corners")>0) + radius=10; + else + radius=0; + + fb = open(FB_DEVICE, O_RDWR); + if(fb == -1) + { + perror("input "); + exit(1); + } + + InitRC(); + + if((trstr=malloc(BUFSIZE))==NULL) + { + printf(NOMEM); + return -1; + } + + //init framebuffer + + if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1) + { + perror("input \n"); + return -1; + } + if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) + { + perror("input \n"); + return -1; + } + if(!(lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0))) + { + perror("input \n"); + return -1; + } + + //init fontlibrary + + if((error = FT_Init_FreeType(&library))) + { + printf("input ", error); + munmap(lfb, fix_screeninfo.smem_len); + return -1; + } + + if((error = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &manager))) + { + printf("input \n", error); + FT_Done_FreeType(library); + munmap(lfb, fix_screeninfo.smem_len); + return -1; + } + + if((error = FTC_SBitCache_New(manager, &cache))) + { + printf("input \n", error); + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + munmap(lfb, fix_screeninfo.smem_len); + return -1; + } + + if((error = FTC_Manager_LookupFace(manager, FONT, &face))) + { + if((error = FTC_Manager_LookupFace(manager, FONT2, &face))) + { + printf("input \n", error); + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + munmap(lfb, fix_screeninfo.smem_len); + return 2; + } + else + desc.face_id = FONT2; + } + else + desc.face_id = FONT; + + use_kerning = FT_HAS_KERNING(face); + + desc.flags = FT_LOAD_MONOCHROME; + + //init backbuffer + + if(!(lbb = malloc(fix_screeninfo.line_length*var_screeninfo.yres))) + { + perror("input \n"); + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + munmap(lfb, fix_screeninfo.smem_len); + return -1; + } + if(!(obb = malloc(fix_screeninfo.line_length*var_screeninfo.yres))) + { + perror("input \n"); + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + free(lbb); + munmap(lfb, fix_screeninfo.smem_len); + return 0; + } + + memcpy(lbb, lfb, fix_screeninfo.line_length*var_screeninfo.yres); + memcpy(obb, lfb, fix_screeninfo.line_length*var_screeninfo.yres); + + startx = sx /*+ (((ex-sx) - 620)/2)*/; + starty = sy /* + (((ey-sy) - 505)/2)*/; + + + + signal(SIGINT, quit_signal); + signal(SIGTERM, quit_signal); + signal(SIGQUIT, quit_signal); + + //main loop + put_instance(instance=get_instance()+1); + printf("%s\n",inputd(format, title, defstr, keys, frame, mask, bhelp, cols, tmo, debounce)); + put_instance(get_instance()-1); + + //cleanup + + // clear Display +// memset(lbb, 0, var_screeninfo.xres*var_screeninfo.yres); +// memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); + + memcpy(lfb, obb, fix_screeninfo.line_length*var_screeninfo.yres); + + free(buffer); + + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + + free(lbb); + free(obb); + munmap(lfb, fix_screeninfo.smem_len); + + close(fb); + CloseRC(); + + + return 1; +} + diff --git a/input.h b/input.h new file mode 100644 index 0000000..d53dcc0 --- /dev/null +++ b/input.h @@ -0,0 +1,125 @@ +#ifndef __INPUT_H__ + +#define __INPUT_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_CACHE_H +#include FT_CACHE_SMALL_BITMAPS_H + +//freetype stuff + +enum {LEFT, CENTER, RIGHT}; +enum {SMALL, MED, BIG}; + +FT_Error error; +FT_Library library; +FTC_Manager manager; +FTC_SBitCache cache; +FTC_SBit sbit; +#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 +FTC_Image_Desc desc; +#else +FTC_ImageTypeRec desc; +#endif +FT_Face face; +FT_UInt prev_glyphindex; +FT_Bool use_kerning; + +// rc codes + +#undef KEY_EPG +#undef KEY_SAT +#undef KEY_STOP +#undef KEY_PLAY + +#define KEY_1 2 +#define KEY_2 3 +#define KEY_3 4 +#define KEY_4 5 +#define KEY_5 6 +#define KEY_6 7 +#define KEY_7 8 +#define KEY_8 9 +#define KEY_9 10 +#define KEY_BACKSPACE 14 +#define KEY_UP 103 +#define KEY_LEFT 105 +#define KEY_RIGHT 106 +#define KEY_DOWN 108 +#define KEY_MUTE 113 +#define KEY_VOLUMEDOWN 114 +#define KEY_VOLUMEUP 115 +#define KEY_POWER 116 +#define KEY_HELP 138 +#define KEY_HOME 102 +#define KEY_EXIT 174 +#define KEY_SETUP 141 +#define KEY_PAGEUP 104 +#define KEY_PAGEDOWN 109 +#define KEY_OK 0x160 +#define KEY_RED 0x18e +#define KEY_GREEN 0x18f +#define KEY_YELLOW 0x190 +#define KEY_BLUE 0x191 + +#define KEY_TVR 0x179 +#define KEY_TTX 0x184 +#define KEY_COOL 0x1A1 +#define KEY_FAV 0x16C +#define KEY_EPG 0x16D +#define KEY_VF 0x175 + +#define KEY_SAT 0x17D +#define KEY_SKIPP 0x197 +#define KEY_SKIPM 0x19C +#define KEY_TS 0x167 +#define KEY_AUDIO 0x188 +#define KEY_REW 0x0A8 +#define KEY_FWD 0x09F +#define KEY_HOLD 0x077 +#define KEY_REC 0x0A7 +#define KEY_STOP 0x080 +#define KEY_PLAY 0x0CF + +//devs + +int fb; + +//framebuffer stuff + +enum {FILL, GRID}; + +enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE1, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED}; +#define TRANSP 0 + +extern unsigned char *lfb, *lbb, *obb; +extern unsigned char rd[], gn[], bl[], tr[]; + +struct fb_fix_screeninfo fix_screeninfo; +struct fb_var_screeninfo var_screeninfo; + +int startx, starty, sx, ex, sy, ey; +extern unsigned char sc[8], tc[8]; +extern char *butmsg[3]; +extern int buttons,selection; + +#define FB_DEVICE "/dev/fb/0" + +#define BUFSIZE 1024 + +#endif + diff --git a/inputd.c b/inputd.c new file mode 100644 index 0000000..5a5524a --- /dev/null +++ b/inputd.c @@ -0,0 +1,623 @@ +#include +#include +#include +#include "input.h" +#include "text.h" +#include "io.h" +#include "gfx.h" + +#define xbrd 25 +#define ybrd 25 +#define exsz 23 +#define eysz 38 +#define bxsz 60 +#define bysz 60 +#define hsz 50 +#define tys 30 +#define NUM '#' +#define ANUM '@' +#define HEX '^' +#define ndelay 3 + +char rstr[512],tstr[512], *format, *estr; +int epos=-1,cpos=0,kpos=0,cnt,first=1,hex=0; +char kcod[10][13]={"0 _.:,;$@()#","1-+*/", "2abcä", "3def", "4ghi", "5jkl", "6mnoö", "7pqrsß", "8tuvü", "9wxyz"}; +char hcod[10][13]={"0","1", "2abc", "3def", "4", "5", "6", "7", "8", "9"}; +unsigned rc; +extern int radius; +char INST_FILE[]="/tmp/rc.locked"; +int instance=0; + +int get_instance(void) +{ +FILE *fh; +int rval=0; + + if((fh=fopen(INST_FILE,"r"))!=NULL) + { + rval=fgetc(fh); + fclose(fh); + } + return rval; +} + +void put_instance(int pval) +{ +FILE *fh; + + if(pval) + { + if((fh=fopen(INST_FILE,"w"))!=NULL) + { + fputc(pval,fh); + fclose(fh); + } + } + else + { + remove(INST_FILE); + } +} + +int IsAlpha(char ch) +{ + char uml[]="AÖÜaöü"; + return (((ch>='A')&&(ch<='Z')) || ((ch>='a')&&(ch<='z')) || strchr(uml,ch)); +} + +int IsNum(char ch) +{ + return ((ch>='0')&&(ch<='9')); +} + +int IsInput(char ch) +{ + + if((ch==NUM) || (ch==ANUM)) + { + hex=0; + return 1; + } + if (ch==HEX) + { + hex=1; + return 1; + } + return 0; +} + +void FindCode(char ch) +{ + + if(!hex) + { + for(cpos=0; cpos<10; cpos++) + { + for(kpos=0; kpos=cnt) + { + epos=0; + } + } + while(!IsInput(format[epos])); + FindCode(estr[epos]); + first=1; +} + +void PrevPos(void) +{ + do + { + epos--; + if(epos<0) + { + epos=cnt-1; + } + } + while(!IsInput(format[epos])); + FindCode(estr[epos]); + first=1; +} + +void SetCode(int code) +{ + if(format[epos]==NUM) + { + hex=0; + cpos=code; + kpos=0; + estr[epos]=kcod[cpos][kpos]; + NextPos(); + } + else + { + if(format[epos]==HEX) + { + hex=1; + if(strlen(hcod[code])>1) + { + if(!first) + { + if(cpos==code) + { + if(++kpos>=strlen(hcod[cpos])) + { + kpos=0; + } + } + else + { + NextPos(); + cpos=code; + kpos=0; + first=0; + } + estr[epos]=hcod[cpos][kpos]; + } + else + { + cpos=code; + kpos=0; + estr[epos]=hcod[cpos][kpos]; + first=0; + } + } + else + { + cpos=code; + kpos=0; + estr[epos]=hcod[cpos][kpos]; + NextPos(); + } + } + else + { + hex=0; + if(!first) + { + if(cpos==code) + { + if(++kpos>=strlen(kcod[cpos])) + { + kpos=0; + } + } + else + { + NextPos(); + cpos=code; + kpos=1; + first=0; + } + estr[epos]=kcod[cpos][kpos]; + } + else + { + cpos=code; + kpos=1; + estr[epos]=kcod[cpos][kpos]; + first=0; + } + } + } +} + +int ReTransform_Msg(char *msg) +{ +int found=0,i; +char *sptr=msg, *tptr=tstr; + + *tptr=0; + while(*sptr) + { + found=0; + for(i=0; i25) + { + cols=25; + } + if(cols<1) + { + cols=1; + } + format=form; + estr=strdup(form); + cnt=strlen(form); + + i=GetStringLen(title, BIG)+10; + j=((cnt>cols)?cols:cnt)*exsz; + if(j>i) + { + i=j; + } + if(keys) + { + j=3*bxsz; + if(j>i) + { + i=j; + } + } + wxw=i+2*xbrd; + + i=(((cnt-1)/cols)+1)*eysz; + if(keys) + { + i+=4*bysz; + } + wyw=((keys)?4:2)*ybrd+i; + + wxs=((ex-sx)-wxw)/2; + wys=(((ey-sy)-wyw)+hsz)/2; + exs=wxs+(wxw-((cnt>cols)?cols:cnt)*exsz)/2; + eys=wys+ybrd; + + *estr=0; + *rstr=0; + + j=0; + for(i=0; i=tmo) + { + i=KEY_EXIT; + } + } + if((((format[epos]!=NUM) && (format[epos]!=HEX)) || ((format[epos]==HEX)&&(strlen(hcod[cpos])>1))) && ((t2-t1)>ndelay) && last_key>=0) + { + act_key=i=-2; + b_key=-3; + NextPos(); + } + } + act_key=i; + + switch(act_key) + { + case KEY_0: + SetCode(0); + break; + + case KEY_1: + SetCode(1); + break; + + case KEY_2: + SetCode(2); + break; + + case KEY_3: + SetCode(3); + break; + + case KEY_4: + SetCode(4); + break; + + case KEY_5: + SetCode(5); + break; + + case KEY_6: + SetCode(6); + break; + + case KEY_7: + SetCode(7); + break; + + case KEY_8: + SetCode(8); + break; + + case KEY_9: + SetCode(9); + break; + + case KEY_RIGHT: + NextPos(); + act_key=-2; + break; + + case KEY_LEFT: + PrevPos(); + act_key=-2; + break; + + case KEY_VOLUMEUP: + ipos=epos; + while(IsInput(format[ipos+1]) && ((ipos+1)epos) + { + estr[ipos]=estr[ipos-1]; + --ipos; + } + estr[epos]=' '; +// estr[epos]=((format[epos]=='#')||(format[epos]=='^'))?'0':' '; + act_key=-1; + break; + + case KEY_VOLUMEDOWN: + ipos=epos+1; + while(IsInput(format[ipos]) && (ipos=cols) + { + epos-=cols; + if(!IsInput(format[epos])) + { + NextPos(); + } + } + else + { + epos=cnt-1; + if(!IsInput(format[epos])) + { + PrevPos(); + } + } + act_key=-2; + break; + + case KEY_DOWN: + if(epos<=(cnt-cols)) + { + epos+=cols; + if(!IsInput(format[epos])) + { + NextPos(); + } + } + else + { + epos=0; + if(!IsInput(format[epos])) + { + NextPos(); + } + } + act_key=-2; + break; + + case KEY_EXIT: + free(estr); + estr=NULL; + *rstr=0; + run=0; + break; + + case KEY_RED: + if(IsAlpha(estr[epos])) + { + estr[epos]^=0x20; + } + act_key=-2; + break; + + case KEY_YELLOW: + epos=-1; + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "io.h" + +#define RC_DEVICE "/dev/input/nevis_ir" + +extern int instance; +struct input_event ev; +static unsigned short rccode=-1; +static int rc; + +int InitRC(void) +{ + rc = open(RC_DEVICE, O_RDONLY); + if(rc == -1) + { + perror("msgbox "); + exit(1); + } + fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC); + while(RCKeyPressed()); + return 1; +} + +int CloseRC(void) +{ + while(RCKeyPressed()); + close(rc); + return 1; +} + +int RCKeyPressed(void) +{ + if(read(rc, &ev, sizeof(ev)) == sizeof(ev)) + { + if(ev.value) + { + rccode=ev.code; + return 1; + } + } + rccode = -1; + return 0; +} + + +int GetRCCode(void) +{ + int rv; + + if(!RCKeyPressed() || (get_instance()>instance)) + { + return -1; + } + rv=rccode; + while(RCKeyPressed()); + + return rv; +} + + diff --git a/io.h b/io.h new file mode 100644 index 0000000..d7914d4 --- /dev/null +++ b/io.h @@ -0,0 +1,11 @@ +#ifndef __IO_H__ + +#define __IO_H__ + +#define RC_DEVICE "/dev/input/nevis_ir" + +int InitRC(void); +int CloseRC(void); +int RCKeyPressed(void); + +#endif diff --git a/text.c b/text.c new file mode 100644 index 0000000..92d2473 --- /dev/null +++ b/text.c @@ -0,0 +1,247 @@ +#include "text.h" +#include "gfx.h" +#include "io.h" + +int FSIZE_BIG=32; +int FSIZE_MED=24; +int FSIZE_SMALL=20; +int TABULATOR=300; + +/****************************************************************************** + * MyFaceRequester + ******************************************************************************/ + +FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface) +{ + FT_Error result; + + result = FT_New_Face(library, face_id, 0, aface); + + if(result) printf("msgbox \n", (char*)face_id); + + return result; +} + +/****************************************************************************** + * RenderChar + ******************************************************************************/ + +int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color) +{ +// unsigned char pix[4]={oldcmap.red[col],oldcmap.green[col],oldcmap.blue[col],oldcmap.transp[col]}; +// unsigned char pix[4]={0x80,0x80,0x80,0x80}; + unsigned char pix[4]={bl[color],gn[color],rd[color],tr[color]}; + int row, pitch, bit, x = 0, y = 0; + FT_UInt glyphindex; + FT_Vector kerning; + FT_Error error; + + currentchar=currentchar & 0xFF; + + //load char + + if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) + { +// printf("msgbox \n", (int)currentchar, error); + return 0; + } + +// no kerning used +/* + if(use_kerning) + { + FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); + + prev_glyphindex = glyphindex; + kerning.x >>= 6; + } + else +*/ + kerning.x = 0; + + //render char + + if(color != -1) /* don't render char, return charwidth only */ + { + if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */ + + for(row = 0; row < sbit->height; row++) + { + for(pitch = 0; pitch < sbit->pitch; pitch++) + { + for(bit = 7; bit >= 0; bit--) + { + if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */ + + if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4); + + x++; + } + } + + x = 0; + y++; + } + + } + + //return charwidth + + return sbit->xadvance + kerning.x; +} + +/****************************************************************************** + * GetStringLen + ******************************************************************************/ + +int GetStringLen(unsigned char *string, int size) +{ +int i, found; +int stringlen = 0; + + //reset kerning + + prev_glyphindex = 0; + + //calc len + + switch (size) + { + case SMALL: desc.width = desc.height = FSIZE_SMALL; break; + case MED: desc.width = desc.height = FSIZE_MED; break; + case BIG: desc.width = desc.height = FSIZE_BIG; break; + default: desc.width = desc.height = size; break; + } + + while(*string != '\0') + { + stringlen += RenderChar(*string, -1, -1, -1, -1); + string++; + } + + return stringlen; +} + + +void CatchTabs(char *text) +{ + int i; + char *tptr=text; + + while((tptr=strstr(tptr,"~T"))!=NULL) + { + *(++tptr)='t'; + for(i=0; i<3; i++) + { + if(*(++tptr)) + { + *tptr=' '; + } + } + } +} + +/****************************************************************************** + * RenderString + ******************************************************************************/ + +int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color) +{ + int stringlen, ex, charwidth,i,found; + char rstr[BUFSIZE], *rptr=rstr, rc; + int varcolor=color; + + //set size + + strcpy(rstr,string); + + switch (size) + { + case SMALL: desc.width = desc.height = FSIZE_SMALL; break; + case MED: desc.width = desc.height = FSIZE_MED; break; + case BIG: desc.width = desc.height = FSIZE_BIG; break; + default: desc.width = desc.height = size; break; + } + TABULATOR=3*size; + //set alignment + + stringlen = GetStringLen(rstr, size); + + if(layout != LEFT) + { + switch(layout) + { + case CENTER: if(stringlen < maxwidth) sx += (maxwidth - stringlen)/2; + break; + + case RIGHT: if(stringlen < maxwidth) sx += maxwidth - stringlen; + } + } + + //reset kerning + + prev_glyphindex = 0; + + //render string + + ex = sx + maxwidth; + + while(*rptr != '\0') + { + if(*rptr=='~') + { + ++rptr; + rc=*rptr; + found=0; + for(i=0; i maxwidth */ + sx += charwidth; + } + else + { + switch(*rptr) + { + case 'R': varcolor=RED; break; + case 'G': varcolor=GREEN; break; + case 'Y': varcolor=YELLOW; break; + case 'B': varcolor=BLUE1; break; + case 'S': varcolor=color; break; + case 't': + sx=TABULATOR*((int)(sx/TABULATOR)+1); + break; + case 'T': + if(sscanf(rptr+1,"%3d",&i)==1) + { + rptr+=3; + sx=i; + } + break; + } + } + } + else + { + if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */ + sx += charwidth; + } + rptr++; + } + return stringlen; +} + diff --git a/text.h b/text.h new file mode 100644 index 0000000..6b1ded5 --- /dev/null +++ b/text.h @@ -0,0 +1,16 @@ +#ifndef __TEXT_H__ + +#define __TEXT_H__ + +#include "input.h" + +extern int FSIZE_BIG; +extern int FSIZE_MED; +extern int FSIZE_SMALL; + +FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface); +int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color); +int GetStringLen(unsigned char *string, int size); +void CatchTabs(char *text); + +#endif