From 52abe0a4391cab8d6bbae416dd1cbf2ce53a4fe5 Mon Sep 17 00:00:00 2001 From: GetAway Date: Sun, 18 Dec 2016 22:23:42 +0100 Subject: [PATCH] port code from martii for a smoother rendering & better RC handling --- current.h | 3 + gfx.c | 110 ++++++++------ gfx.h | 6 +- input.c | 156 ++++++++++---------- input.h | 18 ++- inputd.c | 112 +++++++------- inputd.h | 3 +- io.c | 80 ++++++++-- io.h | 3 +- readme.txt | 159 ++++++++++++++++++++ text.c | 419 +++++++++++++++++++++++++++++++---------------------- text.h | 5 +- 12 files changed, 691 insertions(+), 383 deletions(-) create mode 100644 current.h create mode 100644 readme.txt diff --git a/current.h b/current.h new file mode 100644 index 0000000..ba13dbd --- /dev/null +++ b/current.h @@ -0,0 +1,3 @@ +#define __plugin__ "input" + +#include "input.h" diff --git a/gfx.c b/gfx.c index 23c826b..f84aaf0 100644 --- a/gfx.c +++ b/gfx.c @@ -1,32 +1,44 @@ +#include + +#include "current.h" #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 + 0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0, + 0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,0, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,0, + 0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0 }; -void RenderBox(int sx, int sy, int ex, int ey, int rad, int col) +size_t GetCircleHeight() { - int F,R=rad,ssx=startx+sx,ssy=starty+sy,dxx=ex-sx,dyy=ey-sy,rx,ry,wx,wy,count; + return sqrt(sizeof(circle)); +} + +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; + + uint32_t *pos = lbb + ssx + stride * ssy; + uint32_t *pos0, *pos1, *pos2, *pos3, *i; + uint32_t pix = bgra[col]; - 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); + fprintf(stderr, "[%s] RenderBox called with dx < 0 (%d)\n",__plugin__ , dxx); dxx=0; } @@ -64,10 +76,11 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col) 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); + pos0=pos+(dyy-ry)*stride; + pos1=pos+ry*stride; + pos2=pos+rx*stride; + pos3=pos+(dyy-rx)*stride; + while (ssx <= ssy) { rx=R-ssx; @@ -75,18 +88,18 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col) wx=rx<<1; wy=ry<<1; - for(i=pos0+(rx<<2); i #include #include -#include "input.h" + +#include "current.h" + #include "text.h" #include "io.h" #include "gfx.h" @@ -10,7 +12,7 @@ #define NCF_FILE "/var/tuxbox/config/neutrino.conf" #define BUFSIZE 1024 -#define I_VERSION 1.11 +#define I_VERSION 1.42 //#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" #define FONT2 "/share/fonts/pakenham.ttf" @@ -28,8 +30,10 @@ 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}; +uint32_t bgra[20]; void TrimString(char *strg); +void closedown(void); // OSD stuff static char menucoltxt[][25]={"Content_Selected_Text","Content_Selected","Content_Text","Content","Content_inactive_Text","Content_inactive","Head_Text","Head"}; @@ -37,40 +41,40 @@ 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; +const char NOMEM[]="input \n"; +const char TMP_FILE[]="/tmp/input.tmp"; +uint32_t *lfb = NULL, *lbb = NULL, *obb = NULL; +char nstr[512]={0}; +char *trstr=NULL; +const char sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={0xE4,0xF6,0xFC,0xC4,0xD6,0xDC,0xDF,0xB0}; +int radius; +int stride; + static void quit_signal(int sig) { char *txt=NULL; switch (sig) { - case SIGINT: txt=strdup("SIGINT"); break; - case SIGTERM: txt=strdup("SIGTERM"); break; - case SIGQUIT: txt=strdup("SIGQUIT"); break; - case SIGSEGV: txt=strdup("SIGSEGV"); break; + case SIGINT: txt=strdup("SIGINT"); break; // 2 + case SIGQUIT: txt=strdup("SIGQUIT"); break; // 3 + case SIGSEGV: txt=strdup("SIGSEGV"); break; // 11 + case SIGTERM: txt=strdup("SIGTERM"); break; // 15 default: txt=strdup("UNKNOWN"); break; } - printf("input Version %.2f killed, signal %s(%d)\n", I_VERSION, txt, sig); - put_instance(get_instance()-1); + printf("%s Version %.2f killed, signal %s(%d)\n", __plugin__, I_VERSION, txt, sig); free(txt); + closedown(); exit(1); } int Read_Neutrino_Cfg(char *entry) { FILE *nfh; -char tstr [512], *cfptr=NULL; +char tstr [512]={0}, *cfptr=NULL; int rv=-1; if((nfh=fopen(NCF_FILE,"r"))!=NULL) @@ -136,8 +140,9 @@ char *pt1=strg, *pt2=strg; int Transform_Msg(char *msg) { -int found=0,i; -char *sptr=msg, *tptr=msg; +unsigned i; +int found=0; +char *sptr=msg, *tptr=msg, rc; while(*sptr) { @@ -149,7 +154,7 @@ char *sptr=msg, *tptr=msg; { rc=*(sptr+1); found=0; - for(i=0; i\n",aptr); + fprintf(stderr, "%s \n",__plugin__,aptr); return 0; break; case 2: - printf("input \n\n",aptr); + fprintf(stderr, "%s \n\n",__plugin__ ,aptr); ShowUsage(); return 0; break; @@ -319,17 +322,17 @@ unsigned int alpha; } if(!format) { - printf("input \n"); + fprintf(stderr, "%s \n", __plugin__); return 0; } if(!title) { - title=ttl; + title=strdup(ttl); } if((buffer=calloc(BUFSIZE+1, sizeof(char)))==NULL) { - printf(NOMEM); + fprintf(stderr, NOMEM); return 0; } @@ -350,34 +353,37 @@ unsigned int alpha; if((ey=Read_Neutrino_Cfg(buffer))<0) ey=620; - for(index=CMCST; index<=CMH; index++) + for(ix=CMCST; ix<=CMH; ix++) { - sprintf(rstr,"menu_%s_alpha",menucoltxt[index]); + sprintf(rstr,"menu_%s_alpha",menucoltxt[ix]); if((tv=Read_Neutrino_Cfg(rstr))>=0) - tr[index]=255-(float)tv*2.55; + tr[ix]=255-(float)tv*2.55; - sprintf(rstr,"menu_%s_blue",menucoltxt[index]); + sprintf(rstr,"menu_%s_blue",menucoltxt[ix]); if((tv=Read_Neutrino_Cfg(rstr))>=0) - bl[index]=(float)tv*2.55; + bl[ix]=(float)tv*2.55; - sprintf(rstr,"menu_%s_green",menucoltxt[index]); + sprintf(rstr,"menu_%s_green",menucoltxt[ix]); if((tv=Read_Neutrino_Cfg(rstr))>=0) - gn[index]=(float)tv*2.55; + gn[ix]=(float)tv*2.55; - sprintf(rstr,"menu_%s_red",menucoltxt[index]); + sprintf(rstr,"menu_%s_red",menucoltxt[ix]); if((tv=Read_Neutrino_Cfg(rstr))>=0) - rd[index]=(float)tv*2.55; + rd[ix]=(float)tv*2.55; } + for (ix = 0; ix <= RED; ix++) + bgra[ix] = (tr[ix] << 24) | (rd[ix] << 16) | (gn[ix] << 8) | bl[ix]; + if(Read_Neutrino_Cfg("rounded_corners")>0) - radius=10; + radius=11; else radius=0; fb = open(FB_DEVICE, O_RDWR); if(fb == -1) { - perror("input "); + perror(__plugin__ " "); exit(1); } @@ -385,7 +391,7 @@ unsigned int alpha; if((trstr=malloc(BUFSIZE))==NULL) { - printf(NOMEM); + fprintf(stderr, NOMEM); return -1; } @@ -393,17 +399,18 @@ unsigned int alpha; if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1) { - perror("input \n"); + perror(__plugin__ " \n"); return -1; } if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) { - perror("input \n"); + perror(__plugin__ " \n"); return -1; } - if(!(lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0))) + + if(!(lfb = (uint32_t*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0))) { - perror("input \n"); + perror(__plugin__ " \n"); return -1; } @@ -411,14 +418,14 @@ unsigned int alpha; if((error = FT_Init_FreeType(&library))) { - printf("input ", error); + fprintf(stderr, "%s ",__plugin__ , 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); + fprintf(stderr, "%s \n",__plugin__ , error); FT_Done_FreeType(library); munmap(lfb, fix_screeninfo.smem_len); return -1; @@ -426,7 +433,7 @@ unsigned int alpha; if((error = FTC_SBitCache_New(manager, &cache))) { - printf("input \n", error); + fprintf(stderr, "%s \n",__plugin__ , error); FTC_Manager_Done(manager); FT_Done_FreeType(library); munmap(lfb, fix_screeninfo.smem_len); @@ -437,7 +444,7 @@ unsigned int alpha; { if((error = FTC_Manager_LookupFace(manager, FONT2, &face))) { - printf("input \n", error); + fprintf(stderr, "%s \n",__plugin__ , error); FTC_Manager_Done(manager); FT_Done_FreeType(library); munmap(lfb, fix_screeninfo.smem_len); @@ -451,51 +458,57 @@ unsigned int alpha; use_kerning = FT_HAS_KERNING(face); - desc.flags = FT_LOAD_MONOCHROME; + desc.flags = FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT; //init backbuffer - if(!(lbb = malloc(fix_screeninfo.line_length*var_screeninfo.yres))) + if(!(lbb = malloc(var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)))) { - perror("input \n"); + perror(__plugin__ " \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))) + stride = fix_screeninfo.line_length/sizeof(uint32_t); + + if(!(obb = malloc(var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)))) { - perror("input \n"); + perror(__plugin__ " \n"); FTC_Manager_Done(manager); FT_Done_FreeType(library); free(lbb); munmap(lfb, fix_screeninfo.smem_len); return 0; } + memcpy(lbb, lfb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)); + memcpy(obb, lfb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)); - 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)*/; + startx = sx; + starty = sy; signal(SIGINT, quit_signal); - signal(SIGTERM, quit_signal); signal(SIGQUIT, quit_signal); + signal(SIGTERM, quit_signal); signal(SIGSEGV, quit_signal); //main loop put_instance(instance=get_instance()+1); - printf("%s\n",inputd(format, title, defstr, keys, frame, mask, bhelp, cols, tmo, debounce)); + printf("%s", inputd(format, title, defstr, keys, frame, mask, bhelp, cols, tmo)); + closedown(); + return 1; +} + +/****************************************************************************** + * input close + ******************************************************************************/ +void closedown(void) +{ 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); + memcpy(lfb, obb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)); + munmap(lfb, fix_screeninfo.smem_len); free(buffer); @@ -504,12 +517,7 @@ unsigned int alpha; free(lbb); free(obb); - munmap(lfb, fix_screeninfo.smem_len); close(fb); CloseRC(); - - - return 1; } - diff --git a/input.h b/input.h index d53dcc0..6c1a9ae 100644 --- a/input.h +++ b/input.h @@ -1,7 +1,8 @@ #ifndef __INPUT_H__ - #define __INPUT_H__ +//#include +#define _FILE_OFFSET_BITS 64 #include #include #include @@ -14,13 +15,14 @@ #include #include #include +#include #include #include FT_FREETYPE_H #include FT_CACHE_H #include FT_CACHE_SMALL_BITMAPS_H -//freetype stuff +#define BUFSIZE 1024 enum {LEFT, CENTER, RIGHT}; enum {SMALL, MED, BIG}; @@ -106,20 +108,22 @@ 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[]; +extern uint32_t *lfb, *lbb, *obb; +extern uint32_t bgra[]; +extern int stride; 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; +extern const char sc[8], tc[8]; +#ifndef FB_DEVICE #define FB_DEVICE "/dev/fb/0" - -#define BUFSIZE 1024 +#endif #endif diff --git a/inputd.c b/inputd.c index 24251b8..2109cab 100644 --- a/inputd.c +++ b/inputd.c @@ -17,17 +17,21 @@ #define NUM '#' #define ANUM '@' #define HEX '^' -#define ndelay 3 +#define ndelay 2 +#define REPEAT_TIMER 2 -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"}; +char rstr[512]={0},tstr[512]={0}, *format=NULL, *estr=NULL; +unsigned int kpos=0; +int epos=-1,cpos=0,cnt,first=1,hex=0; +const char kcod[10][13]={"0 _.:,;$@()#","1-+*/", "2abcä", "3def", "4ghi", "5jkl", "6mnoö", "7pqrsß", "8tuvü", "9wxyz"}; +const 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"; +extern int rcvalue; +const char INST_FILE[]="/tmp/rc.locked"; int instance=0; int rclocked=0; +int rcvalue=0; int get_instance(void) { @@ -67,7 +71,7 @@ FILE *fh; int IsAlpha(char ch) { - char uml[]="AÖÜaöü"; + const char uml[]="ÄÖÜäöü"; return (((ch>='A')&&(ch<='Z')) || ((ch>='a')&&(ch<='z')) || strchr(uml,ch)); } @@ -238,14 +242,15 @@ void SetCode(int code) int ReTransform_Msg(char *msg) { -int found=0,i; +unsigned i; +int found=0; char *sptr=msg, *tptr=tstr; *tptr=0; while(*sptr) { found=0; - for(i=0; icols)?cols:cnt)*exsz; if(j>i) @@ -319,7 +327,7 @@ char kalp[12][5]={"+-*/","abc *estr=0; *rstr=0; - + j=0; for(i=0; i=tmo) + //printf("t2-t1 = %f %i\n", difftime(t2, t1), tmo); + if((t2-t1)>=tmo) { i=KEY_EXIT; } } - if((((format[epos]!=NUM) && (format[epos]!=HEX)) || ((format[epos]==HEX)&&(strlen(hcod[cpos])>1))) && ((t2-t1)>ndelay) && last_key>=0) + 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(); } } + count=0; act_key=i; switch(act_key) @@ -507,21 +514,8 @@ char kalp[12][5]={"+-*/","abc break; case KEY_MUTE: - memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); - usleep(500000L); - while(GetRCCode()!=-1) - { - usleep(100000L); - } - while(GetRCCode()!=KEY_MUTE) - { - usleep(500000L); - } - while((act_key=GetRCCode())!=-1) - { - usleep(100000L); - } -// knew=1; + memset(lfb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)); + while(GetRCCode(300)!=KEY_MUTE); break; case KEY_UP: @@ -622,8 +616,8 @@ char kalp[12][5]={"+-*/","abc } rstr[j]=0; free(estr); - } + } ReTransform_Msg(rstr); - return tstr; + return rstr; } diff --git a/inputd.h b/inputd.h index 99aac19..5e7561a 100644 --- a/inputd.h +++ b/inputd.h @@ -1,11 +1,10 @@ #ifndef __INPUTD_H__ - #define __INPUTD_H__ extern int instance; int get_instance(void); void put_instance(int pval); -char *inputd(char *format, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo, int debounce); +char *inputd(char *format, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo); #endif diff --git a/io.c b/io.c index b4cdaa2..6614899 100644 --- a/io.c +++ b/io.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -15,22 +14,26 @@ #include #include #include +#include +#include +#include "current.h" #include "io.h" -#define RC_DEVICE "/dev/input/nevis_ir" - extern int instance; +extern int get_instance(void); +extern int rcvalue; struct input_event ev; static unsigned short rccode=-1; static int rc; + int InitRC(void) { - rc = open(RC_DEVICE, O_RDONLY); + rc = open(RC_DEVICE, O_RDONLY | O_CLOEXEC); if(rc == -1) { - perror("msgbox "); + perror(__plugin__ " "); exit(1); } fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC); @@ -51,6 +54,7 @@ int RCKeyPressed(void) { if(ev.value) { + rcvalue=ev.value; rccode=ev.code; return 1; } @@ -59,19 +63,65 @@ int RCKeyPressed(void) return 0; } +void ClearRC(void) +{ + struct pollfd pfd; + pfd.fd = rc; + pfd.events = POLLIN; + pfd.revents = 0; + + do + poll(&pfd, 1, 300); + while(read(rc, &ev, sizeof(ev)) == sizeof(ev)); +} -int GetRCCode(void) +int GetRCCode(int timeout_in_ms) { - int rv; - - if(!RCKeyPressed() || (get_instance()>instance)) + int rv = -1; + + if (get_instance()>instance) { - return -1; + return rv; } - rv=rccode; - while(RCKeyPressed()); - - return rv; -} + if (timeout_in_ms) { + struct pollfd pfd; + struct timeval tv; + uint64_t ms_now, ms_final; + + pfd.fd = rc; + pfd.events = POLLIN; + pfd.revents = 0; + + gettimeofday( &tv, NULL ); + ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000; + if (timeout_in_ms > 0) + ms_final = ms_now + timeout_in_ms; + else + ms_final = UINT64_MAX; + while (ms_final > ms_now) { + switch(poll(&pfd, 1, timeout_in_ms)) { + case -1: + perror("GetRCCode: poll() failed"); + case 0: + return -1; + default: + ; + } + if(RCKeyPressed()) { + rv = rccode; + while(RCKeyPressed()); + return rv; + } + gettimeofday( &tv, NULL ); + ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000; + if (timeout_in_ms > 0) + timeout_in_ms = (int)(ms_final - ms_now); + } + } else if(RCKeyPressed()) { + rv = rccode; + while(RCKeyPressed()); + } + return rv; +} diff --git a/io.h b/io.h index d7914d4..2cb93f8 100644 --- a/io.h +++ b/io.h @@ -1,5 +1,4 @@ #ifndef __IO_H__ - #define __IO_H__ #define RC_DEVICE "/dev/input/nevis_ir" @@ -7,5 +6,7 @@ int InitRC(void); int CloseRC(void); int RCKeyPressed(void); +int GetRCCode(int); +void ClearRC(void); #endif diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..878ca9c --- /dev/null +++ b/readme.txt @@ -0,0 +1,159 @@ +Was ist input? +---------------------------------- +Input ist ein Editor, welcher aus Scripten heraus aufgerufen werden kann, und das Ergeb- +nis der Eingaben durch den Nutzer über die Kommandozeile an das Script zurückgibt. +Dabei ist beim Aufruf sowohl die Festlegung des Aussehens der Eingabemaske als auch des +Typs der zu editierenden Daten möglich. Die zu editierenden Felder können bei Bedarf +auch mit Defaultwerten vorbelegt werden. + +Installation +---------------------------------- +Es wird nur die Datei "input" benötigt. Abhängig vom Image-Typ ist diese entweder in +/bin/ (bei JFFS-Only) oder /var/bin/ (bei CRAMFS und SQUASHFS) zu kopieren und mit den +Rechten 755 zu versehen. Nun kann sie aus eigenen Scripten heraus verwendet werden. Eine +spezielle Busybox ist für die Verwendung von "input" nicht erforderlich. + + +Anwendung +---------------------------------- +Der Aufruf der Eingabemaske erfolgt über die Ausführung von "input" mit entsprechenden Kom- +mandozeilenparametern. Wichtig dabei ist, daß das aufrufende Script über die Plugin-Verwal- +tung von Neutrino gestartet wurde, und in der .cfg des Scriptes die Einträge "needfb=1" und +"needrc=1" stehen. Anderenfalls würde Neutrino parallel zum Editor auf die Tastendrücke der +Fernbedienung reagieren. Beim Aufruf aus dem FlexMenü ist das Script mit den Zeichen "&" oder +"§" vor dem Anzeigenamen aufzurufen. Im Folgenden werden die möglichen Parameter beschrieben. +Die Aufrufzeile sieht so aus: + +input l='Layout' [t='Title'] [d='Default'] [k=Keys] [f=Frames] [c=Columns] [o=Timeout] [m=Mask] [h=BreakOnHelp] + +Layout: +Der Layoutstring, welcher festlegt, welche Felder an welcher Stelle und in welchem Format +editierbar sein sollen. Eingabefelder werden durch '#' für reine Zifferneingaben und '@' +für alphanumerische Eingaben definiert. Sollen nur Hexadezimalzeichen eingebbar sein, ist +als Definitionszeichen das Zeichen '^' zu verwenden. Alle anderen Zeichen werden auf dem +Bildschirm zwar dargestellt, sind aber nicht editierbar. +In einer Zeile können maximal 25 Zeichen dargestellt werden. Ist der Layoutstring länger als +der Parameter "c" oder länger als 25 Zeichen, werden die nächsten Zeichen auf einer weiteren +Zeile dargestellt. Damit ist die Darstellunge mehrzeiliger Eingabemasken möglich. + +Title: +Die Überschrift des Editorfensters. Wird dieser Parameter nicht übergeben, wird standardmäßig +der Text "Eingabe" verwendet. + +Default: +Die Editorfelder können vorbelegt werden. Dabei werden die Zeichen des Defaultstrings der +Reihe nach den Eingabefeldern zugewiesen. Der Defaulstring enthält also keine Füllzeichen +wie der Formatstring sondern nur die reinen Daten. + +Keys: +Dieser Parameter kann 0 oder 1 sein. Bei 1 wird im Editorfenster die Tastenbelegung für die +Eingabe von alphanumerischen Zeichen zusätzlich mit angezeigt. Mit 0 wird diese Anzeige un- +terdrückt. Defaultwert ist 0. + +Frames: +Dieser Parameter kann 0 oder 1 sein. Bei 1 werden Rahmen um die Eingabefelder gezeichnet, +bei 0 werden diese Felder ohne Rahmen dargestellt. Defaultwert ist 1. + +Columns: +Mit diesem Parameter wird die Anzahl der Zeichen pro Zeile festgelegt. Somit können auch +schmalere Fenster mehrzeilig dargestellt werden. Zulässig sind Werte von 1 bis 25. +Defaultwert ist 25. + +Timeout: +Gerade für PIN-Abfragen kann dieser Parameter verwendet werden. Er legt die Zeit fest, nach +welcher der Eingabedialog abgebrochen werden soll, wenn keine Taste gedrückt wurde. Damit +können Eingaben automatisch abgebrochen werden, wenn der Nutzer nicht reagiert. Dieser Timeout +wird mit dem ersten Drücken einer Taste unterbrochen, da dann ja ein Nutzer da ist. Das heißt +nach dem ersten Drücken einer Taste wird die Eingabe nicht mehr angebrochen, wenn innerhalb der +Timeout-Zeit keine weitere Taste gedrückt wurde. Ein Wert von 0 für diesen Parameter deaktiviert +den Timeout gänzlich. Defaultwert ist 0. + +Mask: +Dieser Parameter kann 0 oder 1 sein. Bei 1 werden in numerischen Eingabefeldern nicht die +eingegebenen Zahlen angezeigt, sondern das Zeichen "*". Das kann für die verdeckte Eingabe +von PIN-Nummern verwendet werden. Defaultwert ist 0. + +BreakOnHelp +Dieser Parameter kann 0 oder 1 sein. Bei 1 wird in Anlehnung an des LCD-Menü bei Drücken der +"?"-Taste die Eingabe abgebrochen und statt des Ergebnisstrings das Zeichen "?" zurückgeliefert. +Das kann z.B. bei der PIN-Eingabe vom Script als Aufforderung ausgewertet werden, daß der User +die PIN ändern möchte. Defaultwert ist 0. + +Rückgabewert: +input gibt die editierten Felder wieder ohne Füllzeichen über die Kommandozeile zurück. Dieser +Datenstring kann dann vom Script ausgewertet werden. Dabei ist zu beachten, daß die Kommandozeile +mehrfache Leerzeichen zusammenfasst. Also würde ein Text "X X" als "X X" beim Script ankom- +men. Das ist leider kommandozeilenbedingt und nicht zu verhindern. + +Bedienung +---------------------------------- +Mittels der Links-/Rechts-Tasten kann zwischen den einzelnen Eingabefeldern gewechselt werden. +Bei mehrzeiligen Eingabemasken kann mittels der Hoch-/Runter-Tasten auch zwischen den Zeilen +gewechselt werden. +Bei numerischen Eingabefeldern wird die Ziffer bei Druck auf eine Zifferntaste übernommen und +sofort zum nächsten Eingabefeld gewechselt. Bei alphanumerischen Feldern kann wie beim Handy +durch mehrfachen Druck der selben Taste durch die möglichen Buchstaben, Ziffern und Sonderzei- +chen geblättert werden. Der Druck auf eine andere als die bisher gedrückte Taste wird sofort +zum nächsten Feld gewechselt und der neue Wert dort übernommen. Wird in einem alphanumerischen +Feld nach Drücken einer Taste für 3 Sekunden keine weitere Taste betätigt, geht der Editor au- +tomatisch zum nächsten Eingabefeld. Damit ist die Eingabe zweier gleicher Buchstaben hinterein- +ander möglich, ohne erst die Cursortasten benutzen zu müssen. +Die rote Taste schaltet in alphanumerischen Eingabefeldern zwischen Groß- und Kleinschreibung +um. Die gelbe Taste löscht alle Eingabefelder. +Mit der Volume-Plus-Taste wird an der aktuellen Kursorposition ein Zeichen eingefügt. Der Rest +des Eingabefeldes rückt nach rechts. Das letzte Zeichen des Feldes verschwindet. +Mit der Volume-Minus-Taste wird das Zeichen an der aktuellen Kursorposition gelöscht. Der Rest +des Eingabefeldes rückt nach links. +Um das Plugin kurz auszublenden und das Fernsehbild zu sehen, kann die Mute-Taste gedrückt werden. +Das Plugin blendet dann alle grafischen Anzeigen aus und wartet so lange, bis wieder die Mute- +Taste gedrückt wird um anschließend ganz normal fortzusetzen. In der Zwischenzeit werden alle +anderen Tastendrücke ignoriert. +Mit "OK" werden die Änderungen übernommen und der Editor geschlossen. Die "HOME"-Taste bricht +den Vorgang ab, beendet den Editor und liefert einen Leerstring an das Script zurück. +Wenn mit dem Parameter "h=1" erlaubt, wird die Bearbeitung bei Drücken der "?"-Taste abgebrochen +und statt des Ergebnisstrings ein "?" zurückgegeben. + +Beispiele +---------------------------------- +Das Bild "small.png" ist ein Screenshot des Aufrufes: + +input l="####" t="PIN" + +Der Editor würde bei Eingabe von "1234" auch "1234" über die Kommandozeile zurückliefern. +Um diesen Wert einer Variablen zuzuordnen ( in diesem Fall "$pin", sollte der Aufruf so aussehen: + +pin=`input l="####" t="PIN"` + +Nun kann $pin wie gewohnt ausgewertet werden. Aber darauf achten: Bricht der User mit der "HOME"- +Taste ab, ist $pin leer. + +Das Bild "big.png" ergibt sich mit folgendem Aufruf: + +input l='Date: ##.##.####Time: ##:##:##' t='Datum und Uhrzeit ~andern' d='27022005164523' c=16 k=1 + +Der Rückgabewert bei Drücken der "OK"-Taste würde so aussehen: "27022005164523" + + +Sonderzeichen über die Kommandozeile +------------------------------------ +Da Linux keine Übergabe von Sonder- und Steuerzeichen über die Kommandozeile unterstützt, können +die wichtigsten Sonderzeichen über die Nutzung des Formatsteuerzeichens sowohl aus Scripten als +auch von der Kommandozeile dargestellt werden. Aktuell werden folgende Sonder- und Steuerzeichen +unterstützt: + +~a ä +~o ö +~u ü +~A Ä +~O Ö +~U Ü +~z ß +~d ° (degree) + +Diese Steuerzeichen werden sowohl beim Titel, dem Format als auch dem Defaultstring ausgewertet. +Auch der Rückgabestring enthält die Umlaute als Steuerzeichen. Damit ist im Script ein leichteres +Ersetzen der Umlaute bei der Auswertung möglich. + + +Wird "input" mit falschen oder völlig ohne Parameter aufgerufen, wird im Log eine Liste der +unterstützten Parameter ausgegeben. diff --git a/text.c b/text.c index 8c9aaf1..1919952 100644 --- a/text.c +++ b/text.c @@ -11,13 +11,13 @@ int TABULATOR=300; * MyFaceRequester ******************************************************************************/ -FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface) +FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library lib, FT_Pointer request_data __attribute__((unused)), FT_Face *aface) { FT_Error result; - result = FT_New_Face(library, face_id, 0, aface); + result = FT_New_Face(lib, face_id, 0, aface); - if(result) printf("msgbox \n", (char*)face_id); + if(result) fprintf(stderr, "msgbox \n", (char*)face_id); return result; } @@ -26,110 +26,185 @@ FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer requ * RenderChar ******************************************************************************/ -int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color) +struct colors_struct { -// 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; + uint32_t fgcolor, bgcolor; + uint32_t colors[256]; +}; - currentchar=currentchar & 0xFF; +#define COLORS_LRU_SIZE 16 +static struct colors_struct *colors_lru_array[COLORS_LRU_SIZE] = { NULL }; - //load char - - if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) - { -// printf("msgbox fgcolor == fgcolor && colors_lru_array[i]->bgcolor == bgcolor) { + cs = colors_lru_array[i]; + for (j = i; j > 0; j--) + colors_lru_array[j] = colors_lru_array[j - 1]; + colors_lru_array[0] = cs; + return cs->colors; } + i--; + cs = colors_lru_array[i]; + if (!cs) + cs = (struct colors_struct *) calloc(1, sizeof(struct colors_struct)); + for (j = i; j > 0; j--) + colors_lru_array[j] = colors_lru_array[j - 1]; + cs->fgcolor = fgcolor; + cs->bgcolor = bgcolor; + + int ro = var_screeninfo.red.offset; + int go = var_screeninfo.green.offset; + int bo = var_screeninfo.blue.offset; + int to = var_screeninfo.transp.offset; + int rm = (1 << var_screeninfo.red.length) - 1; + int gm = (1 << var_screeninfo.green.length) - 1; + int bm = (1 << var_screeninfo.blue.length) - 1; + int tm = (1 << var_screeninfo.transp.length) - 1; + int fgr = ((int)fgcolor >> ro) & rm; + int fgg = ((int)fgcolor >> go) & gm; + int fgb = ((int)fgcolor >> bo) & bm; + int fgt = ((int)fgcolor >> to) & tm; + int deltar = (((int)bgcolor >> ro) & rm) - fgr; + int deltag = (((int)bgcolor >> go) & gm) - fgg; + int deltab = (((int)bgcolor >> bo) & bm) - fgb; + int deltat = (((int)bgcolor >> to) & tm) - fgt; + for (i = 0; i < 256; i++) + cs->colors[255 - i] = + (((fgr + deltar * i / 255) & rm) << ro) | + (((fgg + deltag * i / 255) & gm) << go) | + (((fgb + deltab * i / 255) & bm) << bo) | + (((fgt + deltat * i / 255) & tm) << to); + + colors_lru_array[0] = cs; + return cs->colors; +} +int RenderChar(FT_ULong currentchar, int _sx, int _sy, int _ex, int color) +{ + int row, pitch; + FT_UInt glyphindex; + FT_Vector kerning; + FT_Error err; - if((error = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL))) + if (currentchar == '\r') // display \r in windows edited files + { + if(color != -1) { -// printf("msgbox \n", (int)currentchar, error); - return 0; + if (_sx + 10 < _ex) + RenderBox(_sx, _sy - 10, _sx + 10, _sy, GRID, color); + else + return -1; } + return 10; + } -// no kerning used -/* - if(use_kerning) - { - FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); + if (currentchar == '\t') + { + /* simulate horizontal TAB */ + return 15; + } - prev_glyphindex = glyphindex; - kerning.x >>= 6; - } - else -*/ - kerning.x = 0; + //load char - //render char + if(!(glyphindex = FT_Get_Char_Index(face, currentchar))) + { + fprintf(stderr, "input xadvance >= ex) return -1; /* limit to maxwidth */ + if((err = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL))) + { + fprintf(stderr, "input \n", (int)currentchar, error); + return 0; + } - 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 */ + int _d = 0; + if (1) + { + FT_UInt _i = FT_Get_Char_Index(face, 'g'); + FTC_SBit _g; + FTC_SBitCache_Lookup(cache, &desc, _i, &_g, NULL); + _d = _g->height - _g->top; + _d += 1; + } - if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4); + if(use_kerning) + { + FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); - x++; - } - } + prev_glyphindex = glyphindex; + kerning.x >>= 6; + } else + kerning.x = 0; - x = 0; - y++; - } + //render char + if(color != -1) /* don't render char, return charwidth only */ + { + if (_sx + sbit->xadvance >= _ex) + return -1; /* limit to maxwidth */ + uint32_t bgcolor = *(lbb + (sy + _sy - sbit->top) * stride + (sx + _sx)); + uint32_t fgcolor = bgra[color]; + uint32_t *colors = lookup_colors(fgcolor, bgcolor); + uint32_t *p = lbb + (sx + _sx + sbit->left + kerning.x) + stride * (sy + _sy - sbit->top - _d); + uint32_t *r = p + (_ex - _sx); /* end of usable box */ + for(row = 0; row < sbit->height; row++) + { + uint32_t *q = p; + uint8_t *s = sbit->buffer + row * sbit->pitch; + for(pitch = 0; pitch < sbit->width; pitch++) + { + if (*s) + *q = colors[*s]; + q++, s++; + if (q > r) /* we are past _ex */ + break; + } + p += stride; + r += stride; } + } //return charwidth - return sbit->xadvance + kerning.x; + return sbit->xadvance + kerning.x; } /****************************************************************************** * GetStringLen ******************************************************************************/ -int GetStringLen(unsigned char *string, int size) +int GetStringLen(char *string, size_t size) { -int i, found; -int stringlen = 0; + int stringlen = 0; //reset kerning - prev_glyphindex = 0; + 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++; - } + 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; @@ -138,7 +213,7 @@ void CatchTabs(char *text) while((tptr=strstr(tptr,"~T"))!=NULL) { *(++tptr)='t'; - for(i=0; i<3; i++) + for(i=0; i<4; i++) { if(*(++tptr)) { @@ -152,140 +227,140 @@ void CatchTabs(char *text) * RenderString ******************************************************************************/ -int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color) +int RenderString(const char *string, int _sx, int _sy, int maxwidth, int layout, int size, int color) { - int stringlen = 0, ex = 0, charwidth = 0, i = 0, found = 0; - char rstr[BUFSIZE]={0}, *rptr=rstr, rc=' '; - int varcolor=color; +unsigned i = 0; +int stringlen = 0, _ex = 0, charwidth = 0, found = 0; +char rstr[BUFSIZE]={0}, *rptr=rstr, rc=' '; +int varcolor=color; //set size - strcpy(rstr,string); + 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; + 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); + stringlen = GetStringLen(rstr, size); - if(layout != LEFT) + if(layout != LEFT) + { + switch(layout) { - switch(layout) - { - case CENTER: if(stringlen < maxwidth) sx += (maxwidth - stringlen)/2; - break; + case CENTER: if(stringlen < maxwidth) _sx += (maxwidth - stringlen)/2; + break; - case RIGHT: if(stringlen < maxwidth) sx += maxwidth - stringlen; - } + case RIGHT: if(stringlen < maxwidth) _sx += maxwidth - stringlen; } + } //reset kerning - prev_glyphindex = 0; + prev_glyphindex = 0; //render string - ex = sx + maxwidth; + _ex = _sx + maxwidth; - while(*rptr != '\0') + while(*rptr != '\0') + { + if(*rptr=='~') { - if(*rptr=='~') + ++rptr; + rc=*rptr; + found=0; + for(i=0; i maxwidth */ - sx += charwidth; + rc=tc[i]; + found=1; } - else + } + if(found) + { + if((charwidth = RenderChar(rc, _sx, _sy, _ex, varcolor)) == -1) return _sx; /* string > maxwidth */ + _sx += charwidth; + } + else + { + switch(*rptr) { - 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; - } + 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,"%4d",&i)==1) + { + rptr+=4; + _sx=i; + } + break; } } - else + } + else + { + int uml = 0; + switch(*rptr) /* skip Umlauts */ + { + case '\xc4': + case '\xd6': + case '\xdc': + case '\xe4': + case '\xf6': + case '\xfc': + case '\xdf': uml=1; break; + } + if (uml == 0) { - int uml = 0; - switch(*rptr) /* skip Umlauts */ + // UTF8_to_Latin1 encoding + if (((*rptr) & 0xf0) == 0xf0) /* skip (can't be encoded in Latin1) */ { - case '\xc4': - case '\xd6': - case '\xdc': - case '\xe4': - case '\xf6': - case '\xfc': - case '\xdf': uml=1; break; + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; // ? question mark + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; } - if (uml == 0) + else if (((*rptr) & 0xe0) == 0xe0) /* skip (can't be encoded in Latin1) */ { - // UTF8_to_Latin1 encoding - if (((*rptr) & 0xf0) == 0xf0) /* skip (can't be encoded in Latin1) */ - { - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; // ? question mark - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; - } - else if (((*rptr) & 0xe0) == 0xe0) /* skip (can't be encoded in Latin1) */ - { - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; - } - else if (((*rptr) & 0xc0) == 0xc0) - { - char c = (((*rptr) & 3) << 6); - rptr++; - if ((*rptr) == 0) - *rptr='\x3f'; - *rptr = (c | ((*rptr) & 0x3f)); - } + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; + } + else if (((*rptr) & 0xc0) == 0xc0) + { + char c = (((*rptr) & 3) << 6); + rptr++; + if ((*rptr) == 0) + *rptr='\x3f'; + *rptr = (c | ((*rptr) & 0x3f)); } - if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */ - sx += charwidth; } - rptr++; + 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 index 6b1ded5..0043013 100644 --- a/text.h +++ b/text.h @@ -1,5 +1,4 @@ #ifndef __TEXT_H__ - #define __TEXT_H__ #include "input.h" @@ -9,8 +8,8 @@ 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); +int RenderString(const char *string, int _sx, int _sy, int maxwidth, int layout, int size, int color); +int GetStringLen(char *string, size_t size); void CatchTabs(char *text); #endif -- 2.39.5