From 2d940ce9c995fa47ba88451d63f290f4d98bfa62 Mon Sep 17 00:00:00 2001 From: svenhoefer Date: Tue, 14 Aug 2012 22:09:49 +0200 Subject: [PATCH 1/1] * initial commit --- gfx.c | 128 ++++++++++++ gfx.h | 8 + input.c | 504 ++++++++++++++++++++++++++++++++++++++++++++ input.h | 125 +++++++++++ inputd.c | 623 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ inputd.h | 11 + io.c | 77 +++++++ io.h | 11 + text.c | 247 ++++++++++++++++++++++ text.h | 16 ++ 10 files changed, 1750 insertions(+) create mode 100644 gfx.c create mode 100644 gfx.h create mode 100644 input.c create mode 100644 input.h create mode 100644 inputd.c create mode 100644 inputd.h create mode 100644 io.c create mode 100644 io.h create mode 100644 text.c create mode 100644 text.h 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 -- 2.39.5