--- /dev/null
+#define __plugin__ "input"
+
+#include "input.h"
+#include <math.h>
+
+#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;
}
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;
wx=rx<<1;
wy=ry<<1;
- for(i=pos0+(rx<<2); i<pos0+((rx+dxx-wx)<<2);i+=4)
- memcpy(i, pix, 4);
- for(i=pos1+(rx<<2); i<pos1+((rx+dxx-wx)<<2);i+=4)
- memcpy(i, pix, 4);
- for(i=pos2+(ry<<2); i<pos2+((ry+dxx-wy)<<2);i+=4)
- memcpy(i, pix, 4);
- for(i=pos3+(ry<<2); i<pos3+((ry+dxx-wy)<<2);i+=4)
- memcpy(i, pix, 4);
+ for(i=pos0+rx; i<pos0+rx+dxx-wx;i++)
+ *i = pix;
+ for(i=pos1+rx; i<pos1+rx+dxx-wx;i++)
+ *i = pix;
+ for(i=pos2+ry; i<pos2+ry+dxx-wy;i++)
+ *i = pix;
+ for(i=pos3+ry; i<pos3+ry+dxx-wy;i++)
+ *i = pix;
ssx++;
- pos2-=fix_screeninfo.line_length;
- pos3+=fix_screeninfo.line_length;
+ pos2-=stride;
+ pos3+=stride;
if (F<0)
{
F+=(ssx<<1)-1;
{
F+=((ssx-ssy)<<1);
ssy--;
- pos0-=fix_screeninfo.line_length;
- pos1+=fix_screeninfo.line_length;
+ pos0-=stride;
+ pos1+=stride;
}
}
- pos+=R*fix_screeninfo.line_length;
+ pos+=R*stride;
}
for (count=R; count<(dyy-R); count++)
{
- for(i=pos; i<pos+(dxx<<2);i+=4)
- memcpy(i, pix, 4);
- pos+=fix_screeninfo.line_length;
+ for(i=pos; i<pos+dxx;i++)
+ *i = pix;
+ pos+=stride;
}
}
* RenderCircle
******************************************************************************/
-void RenderCircle(int sx, int sy, char col)
+void RenderCircle(int _sx, int _sy, int col)
{
int x, y;
- unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
- //render
+ uint32_t pix = bgra[col];
+ uint32_t *p = lbb + startx + _sx;
+ int s = stride * (starty + _sy /*+ y*/);
+ int h = GetCircleHeight();
- for(y = 0; y < 12; y++)
- {
- for(x = 0; x < 12; x++) if(circle[x + y*12]) memcpy(lbb + (startx + sx + x)*4 + fix_screeninfo.line_length*(starty + sy + y), pix, 4);
- }
+ for(y = 0; y < h * h; y += h, s += stride)
+ for(x = 0; x < h; x++)
+ switch(circle[x + y]) {
+ case 1: *(p + x + s) = pix; break;
+ case 2: *(p + x + s) = 0xFFFFFFFF; break;
+ }
}
-
#ifndef __GFX_H__
-
#define __GFX_H__
-void RenderBox(int sx, int sy, int ex, int ey, int mode, int color);
-void RenderCircle(int sx, int sy, char col);
+void RenderBox(int sx, int sy, int ex, int ey, int rad, int col);
+void RenderCircle(int _sx, int _sy, int col);
+size_t GetCircleHeight();
#endif
#include <stdio.h>
#include <time.h>
#include <signal.h>
-#include "input.h"
+
+#include "current.h"
+
#include "text.h"
#include "io.h"
#include "gfx.h"
#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"
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"};
char *buffer=NULL;
-//static void ShowInfo(void);
-
// Misc
-char NOMEM[]="input <Out of memory>\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 <Out of memory>\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)
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)
{
{
rc=*(sptr+1);
found=0;
- for(i=0; i<sizeof(sc) && !found; i++)
+ for(i=0; i<sizeof(sc)/sizeof(sc[0]) && !found; i++)
{
if(rc==sc[i])
{
int main (int argc, char **argv)
{
-int tv,cols=25,debounce=25,tmo=0,index, spr;
-char ttl[]="Eingabe";
+int tv,cols=25,tmo=0,ix, spr;
+const char ttl[]="Eingabe";
int dloop=1,keys=0,frame=1,mask=0,bhelp=0;
-char *title=NULL, *format=NULL, *defstr=NULL, *aptr, *rptr;
-unsigned int alpha;
-//FILE *fh;
+char rstr[512]={0}, *title=NULL, *format=NULL, *defstr=NULL, *aptr=NULL, *rptr=NULL;
if(argc==1)
{
switch (dloop)
{
case 1:
- printf("input <param error: %s>\n",aptr);
+ fprintf(stderr, "%s <param error: %s>\n",__plugin__,aptr);
return 0;
break;
case 2:
- printf("input <unknown command: %s>\n\n",aptr);
+ fprintf(stderr, "%s <unknown command: %s>\n\n",__plugin__ ,aptr);
ShowUsage();
return 0;
break;
}
if(!format)
{
- printf("input <missing format string>\n");
+ fprintf(stderr, "%s <missing format string>\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;
}
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 <open framebuffer device>");
+ perror(__plugin__ " <open framebuffer device>");
exit(1);
}
if((trstr=malloc(BUFSIZE))==NULL)
{
- printf(NOMEM);
+ fprintf(stderr, NOMEM);
return -1;
}
if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
{
- perror("input <FBIOGET_FSCREENINFO>\n");
+ perror(__plugin__ " <FBIOGET_FSCREENINFO>\n");
return -1;
}
if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
{
- perror("input <FBIOGET_VSCREENINFO>\n");
+ perror(__plugin__ " <FBIOGET_VSCREENINFO>\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 <mapping of Framebuffer>\n");
+ perror(__plugin__ " <mapping of Framebuffer>\n");
return -1;
}
if((error = FT_Init_FreeType(&library)))
{
- printf("input <FT_Init_FreeType failed with Errorcode 0x%.2X>", error);
+ fprintf(stderr, "%s <FT_Init_FreeType failed with Errorcode 0x%.2X>",__plugin__ , error);
munmap(lfb, fix_screeninfo.smem_len);
return -1;
}
if((error = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &manager)))
{
- printf("input <FTC_Manager_New failed with Errorcode 0x%.2X>\n", error);
+ fprintf(stderr, "%s <FTC_Manager_New failed with Errorcode 0x%.2X>\n",__plugin__ , error);
FT_Done_FreeType(library);
munmap(lfb, fix_screeninfo.smem_len);
return -1;
if((error = FTC_SBitCache_New(manager, &cache)))
{
- printf("input <FTC_SBitCache_New failed with Errorcode 0x%.2X>\n", error);
+ fprintf(stderr, "%s <FTC_SBitCache_New failed with Errorcode 0x%.2X>\n",__plugin__ , error);
FTC_Manager_Done(manager);
FT_Done_FreeType(library);
munmap(lfb, fix_screeninfo.smem_len);
{
if((error = FTC_Manager_LookupFace(manager, FONT2, &face)))
{
- printf("input <FTC_Manager_LookupFace failed with Errorcode 0x%.2X>\n", error);
+ fprintf(stderr, "%s <FTC_Manager_LookupFace failed with Errorcode 0x%.2X>\n",__plugin__ , error);
FTC_Manager_Done(manager);
FT_Done_FreeType(library);
munmap(lfb, fix_screeninfo.smem_len);
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 <allocating of Backbuffer>\n");
+ perror(__plugin__ " <allocating of Backbuffer>\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 <allocating of Backbuffer>\n");
+ perror(__plugin__ " <allocating of Backbuffer>\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);
free(lbb);
free(obb);
- munmap(lfb, fix_screeninfo.smem_len);
close(fb);
CloseRC();
-
-
- return 1;
}
-
#ifndef __INPUT_H__
-
#define __INPUT_H__
+//#include <config.h>
+#define _FILE_OFFSET_BITS 64
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/un.h>
+#include <stdint.h>
#include <ft2build.h>
#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};
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
#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)
{
int IsAlpha(char ch)
{
- char uml[]="AÖÜaöü";
+ const char uml[]="ÄÖÜäöü";
return (((ch>='A')&&(ch<='Z')) || ((ch>='a')&&(ch<='z')) || strchr(uml,ch));
}
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; i<sizeof(tc) && !found; i++)
+ for(i=0; i<sizeof(tc)/sizeof(tc[0]) && !found; i++)
{
rc=*sptr;
if(rc==tc[i])
return strlen(rstr);
}
-char *inputd(char *form, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo, int debounce)
+char *inputd(char *form, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo)
{
-int exs,eys,wxs,wxw,wys,wyw,i,j,xp,yp;
+int i,j;
+int exs,eys,wxs,wxw,wys,wyw,xp,yp;
char trnd[2]={0,0},tch;
-int act_key=-1, last_key=-1, b_key=-1, run=1, ipos=0;
+int act_key=-1, last_key=-1, run=1, ipos=0, count=0;
time_t t1,t2,tm1;
-char knum[12][2]={"1","2","3","4","5","6","7","8","9"," ","0"};
-char kalp[12][5]={"+-*/","abcä","def","ghi","jkl","mnoö","pqrs","tuvü","wxyz","","_,.;"};
+ // only for num block
+const char knum[12][2]={"1","2","3","4","5","6","7","8","9"," ","0"};
+const char kalp[12][5]={"+-*/","abcä","def","ghi","jkl","mnoö","pqrs","tuvü","wxyz","","_,.;"};
+
epos=-1;
cpos=0;
{
cols=1;
}
+
format=form;
estr=strdup(form);
cnt=strlen(form);
-
i=GetStringLen(title, BIG)+10;
j=((cnt>cols)?cols:cnt)*exsz;
if(j>i)
*estr=0;
*rstr=0;
-
+
j=0;
for(i=0; i<strlen(format); i++)
{
}
estr[i]=0;
- RenderBox(wxs-2, wys-hsz-2, wxs+wxw+2, wys+wyw+2, radius, CMH);
+ // title
+ RenderBox(wxs-2, wys-hsz-2, wxs+wxw+2, wys+wyw+2, radius , CMH);
RenderBox(wxs, wys-hsz, wxs+wxw, wys+wyw, radius, CMC);
RenderBox(wxs, wys-hsz, wxs+wxw, wys, radius, CMH);
- RenderString(title, wxs, wys-15, wxw, CENTER, BIG, CMHT);
+ RenderString(title, wxs, wys-7, wxw, CENTER, BIG, CMHT);
if(keys)
{
int bxs=wxs+(wxw-(3*bxsz))/2;
for(i=0; i<11; i++)
{
- if(i!=9)
+ if(i!=9) //num fields
{
RenderBox(bxs+(i%3)*bxsz, bys+(i/3)*bysz, bxs+((i%3)+1)*bxsz, bys+((i/3)+1)*bysz, radius, CMS);
RenderBox(bxs+(i%3)*bxsz+2, bys+(i/3)*bysz+2, bxs+((i%3)+1)*bxsz-2, bys+((i/3)+1)*bysz-2, radius, CMC);
- RenderString(knum[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz/2, bxsz, CENTER, MED, CMCIT);
- RenderString(kalp[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz-8, bxsz, CENTER, SMALL, CMCIT);
+ RenderString(knum[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz/2+8, bxsz, CENTER, MED, CMCIT);
+ RenderString(kalp[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz-2, bxsz, CENTER, SMALL, CMCIT);
}
}
- RenderCircle(bxs,wys+wyw-ybrd-8,RED);
- RenderString("Groß/Klein",bxs+15,wys+wyw-ybrd+5,3*bxsz,LEFT,SMALL,CMCIT);
- RenderCircle(bxs+3*bxsz-GetStringLen("löschen",SMALL)-15,wys+wyw-ybrd-8,YELLOW);
- RenderString("löschen",bxs,wys+wyw-ybrd+5,3*bxsz,RIGHT,SMALL,CMCIT);
+ RenderCircle(bxs,wys+wyw-ybrd-11,RED);
+ RenderString("Groß/Klein",bxs+20,wys+wyw-ybrd+10,3*bxsz,LEFT,SMALL,CMCIT);
+ RenderCircle(bxs+3*bxsz-GetStringLen("löschen",SMALL)-15,wys+wyw-ybrd-11,YELLOW);
+ RenderString("löschen",bxs+5,wys+wyw-ybrd+10,3*bxsz,RIGHT,SMALL,CMCIT);
}
-
+
while(run)
{
for(i=0; i<cnt; i++)
yp=i/cols;
if(frame && IsInput(format[i]))
{
- RenderBox(exs+xp*exsz, eys+5+yp*eysz, exs+(xp+1)*exsz, eys+(yp+1)*eysz, radius, CMS);
+ RenderBox(exs+xp*exsz, eys+5+yp*eysz, exs+(xp+1)*exsz, eys+(yp+1)*eysz, 0/*radius*/, CMS);
}
- RenderBox(exs+xp*exsz+1, eys+5+yp*eysz+1, exs+(xp+1)*exsz-1, eys+(yp+1)*eysz-1, radius, (epos==i)?CMCS:CMC);
+ RenderBox(exs+xp*exsz+1, eys+5+yp*eysz+1, exs+(xp+1)*exsz-1, eys+(yp+1)*eysz-1, 0/*radius*/, (epos==i)?CMCS:CMC);
+
*trnd=(mask && format[i]==NUM && IsNum(estr[i]))?'*':estr[i];
- RenderString(trnd, exs+xp*exsz+2, eys+yp*eysz+tys, exsz-2, CENTER, MED, (epos==i)?CMCST:(IsInput(format[i]))?CMCT:CMCIT);
+ RenderString(trnd, exs+xp*exsz+2, eys+yp*eysz+tys+7, exsz-2, CENTER, MED, (epos==i)?CMCST:(IsInput(format[i]))?CMCT:CMCIT);
}
- memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
-// sleep(1);
-
time(&t1);
i=-1;
while(i==-1)
{
- i=GetRCCode();
- if(i!=-1)
+ i=GetRCCode(1000);
+ if (i != KEY_UP && i != KEY_DOWN && i != KEY_LEFT && i != KEY_RIGHT)
{
- tmo=0;
- if(i==b_key)
+ if (rcvalue == 2 && count < 3)
{
- usleep(debounce*1000);
- while((i=GetRCCode())!=-1);
+ count++;
+ i = -1;
}
- b_key=i;
}
time(&t2);
if(tmo)
{
- if((t2-tm1)>=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)
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:
}
rstr[j]=0;
free(estr);
- }
+ }
ReTransform_Msg(rstr);
- return tstr;
+ return rstr;
}
#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
#include <errno.h>
#include <locale.h>
#include <fcntl.h>
-#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <linux/input.h>
+#include <poll.h>
+#include <stdint.h>
+#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 <open remote control>");
+ perror(__plugin__ " <open remote control>");
exit(1);
}
fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC);
{
if(ev.value)
{
+ rcvalue=ev.value;
rccode=ev.code;
return 1;
}
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;
+}
#ifndef __IO_H__
-
#define __IO_H__
#define RC_DEVICE "/dev/input/nevis_ir"
int InitRC(void);
int CloseRC(void);
int RCKeyPressed(void);
+int GetRCCode(int);
+void ClearRC(void);
#endif
--- /dev/null
+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.
* 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 <Font \"%s\" failed>\n", (char*)face_id);
+ if(result) fprintf(stderr, "msgbox <Font \"%s\" failed>\n", (char*)face_id);
return result;
}
* 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 <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
- return 0;
+static uint32_t *lookup_colors(uint32_t fgcolor, uint32_t bgcolor)
+{
+ struct colors_struct *cs;
+ int i = 0, j;
+ for (i = 0; i < COLORS_LRU_SIZE; i++)
+ if (colors_lru_array[i] && colors_lru_array[i]->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 <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\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 <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
+ return 0;
+ }
- if(color != -1) /* don't render char, return charwidth only */
- {
- if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */
+ if((err = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
+ {
+ fprintf(stderr, "input <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\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<<bit) memcpy(lbb + (startx + sx + sbit->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;
while((tptr=strstr(tptr,"~T"))!=NULL)
{
*(++tptr)='t';
- for(i=0; i<3; i++)
+ for(i=0; i<4; i++)
{
if(*(++tptr))
{
* 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<sizeof(sc)/sizeof(sc[0]) && !found; i++)
{
- ++rptr;
- rc=*rptr;
- found=0;
- for(i=0; i<sizeof(sc) && !found; i++)
- {
- if(rc==sc[i])
- {
- rc=tc[i];
- found=1;
- }
- }
- if(found)
+ if(rc==sc[i])
{
- if((charwidth = RenderChar(rc, sx, sy, ex, varcolor)) == -1) return sx; /* string > 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;
}
-
#ifndef __TEXT_H__
-
#define __TEXT_H__
#include "input.h"
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