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,2,2,2,2,2,2,2,2,2,2,0,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 2,1,1,1,1,1,1,1,1,1,1,2,
+ 0,2,2,2,2,2,2,2,2,2,2,0
};
//typedef struct { unsigned char width_lo; unsigned char width_hi; unsigned char height_lo; unsigned char height_hi; unsigned char transp; } IconHeader;
-
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]};
+ uint32_t *pos = lbb + ssx + stride * ssy;
+ uint32_t *pos0, *pos1, *pos2, *pos3, *i;
+ uint32_t pix = bgra[col];
if (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;
}
}
void RenderCircle(int sx, int sy, char col)
{
int x, y;
- unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
- //render
-
- 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);
- }
+ uint32_t pix = bgra[col];
+ uint32_t *p = lbb + startx + sx;
+ int s = stride * (starty + sy);
+
+ for(y = 0; y < 12 * 12; y += 12, s += stride)
+ for(x = 0; x < 12; x++)
+ switch(circle[x + y]) {
+ case 1: *(p + x + s) = pix; break;
+ case 2: *(p + x + s) = 0xFFFFFFFF; break;
+ }
}
/******************************************************************************
* PaintIcon
******************************************************************************/
+
/*void PaintIcon(char *filename, int x, int y, unsigned char offset)
{
IconHeader iheader;
close(fd);
return;
}
-*/
\ No newline at end of file
+*/
#ifndef __GFX_H__
-
#define __GFX_H__
void RenderBox(int sx, int sy, int ex, int ey, int mode, int color);
#include <sys/dir.h>
#include <sys/stat.h>
#include <linux/input.h>
+#include <poll.h>
+#include <stdint.h>
#include "shellexec.h"
#include "io.h"
int InitRC(void)
{
- rc = open(RC_DEVICE, O_RDONLY);
+ rc = open(RC_DEVICE, O_RDONLY | O_CLOEXEC);
if(rc == -1)
{
perror("shellexec <open remote control>");
case KEY_OK: rccode = RC_OK;
break;
- case KEY_0: rccode = RC_0;
+ case KEY_0: rccode = RC_0;
break;
- case KEY_1: rccode = RC_1;
+ case KEY_1: rccode = RC_1;
break;
- case KEY_2: rccode = RC_2;
+ case KEY_2: rccode = RC_2;
break;
- case KEY_3: rccode = RC_3;
+ case KEY_3: rccode = RC_3;
break;
- case KEY_4: rccode = RC_4;
+ case KEY_4: rccode = RC_4;
break;
- case KEY_5: rccode = RC_5;
+ case KEY_5: rccode = RC_5;
break;
- case KEY_6: rccode = RC_6;
+ case KEY_6: rccode = RC_6;
break;
- case KEY_7: rccode = RC_7;
+ case KEY_7: rccode = RC_7;
break;
- case KEY_8: rccode = RC_8;
+ case KEY_8: rccode = RC_8;
break;
- case KEY_9: rccode = RC_9;
+ case KEY_9: rccode = RC_9;
break;
case KEY_RED: rccode = RC_RED;
case KEY_POWER: rccode = RC_STANDBY;
break;
- default: rccode = -1;
+ default: rccode = -1;
}
return rccode;
}
-int GetRCCode(void)
+void ClearRC(void)
{
- int rv;
+ 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));
+}
- if(!RCKeyPressed() || (get_instance()>instance))
- {
- return -1;
+int GetRCCode(int timeout_in_ms)
+{
+ int rv = -1;
+
+ 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 RCTranslate(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 RCTranslate(rv);
}
- rv=rccode;
- while(RCKeyPressed());
-
- return RCTranslate(rv);
+ return rv;
}
-
-
#ifndef __IO_H__
-
#define __IO_H__
-#define RC_DEVICE "/dev/input/nevis_ir"
+#define RC_DEVICE "/dev/input/nevis_ir"
int InitRC(void);
int CloseRC(void);
int RCKeyPressed(void);
-int GetRCCode(void);
+int GetRCCode(int);
+void ClearRC(void);
#endif
//#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:
-unsigned char FONT[128]="/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, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00};
-unsigned char gn[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xC0, 0x00,
- 0xFF, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00,
- 0x00, 0x00, 0x00, 0x00};
-unsigned char rd[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
- 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x80, 0x80,
- 0x00, 0x00, 0x00, 0x00};
-unsigned char tr[] = { 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0x80, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x00};
-
+char FONT[128]="/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, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00};
+unsigned char gn[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xC0, 0x00,
+ 0xFF, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00};
+unsigned char rd[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x80, 0x80,
+ 0x00, 0x00, 0x00, 0x00};
+unsigned char tr[] = { 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0x80, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00};
+
+uint32_t bgra[20];
void TrimString(char *strg);
// OSD stuff
#define LIST_STEP 10
#define BUFSIZE 4095
-#define SH_VERSION 1.20
+#define SH_VERSION 1.21
typedef struct {int fnum; FILE *fh[16];} FSTRUCT, *PFSTRUCT;
static int direct[32];
typedef struct {char *entry; char *message; int headerpos; int type; int underline; int stay; int showalways;} LISTENTRY;
typedef LISTENTRY *PLISTENTRY;
-typedef PLISTENTRY *LIST;
+typedef PLISTENTRY *LIST;
typedef struct {int num_headers; int act_header; int max_header; int *headerwait; int *headermed; char **headertxt; char **icon; int *headerlevels; int *lastheaderentrys; int num_entrys; int act_entry; int max_entrys; int num_active; char *menact; char *menactdep; LIST list;} MENU;
enum {TYP_MENU, TYP_MENUDON, TYP_MENUDOFF, TYP_MENUFON, TYP_MENUFOFF, TYP_MENUSON, TYP_MENUSOFF, TYP_EXECUTE, TYP_COMMENT, TYP_DEPENDON, TYP_DEPENDOFF, TYP_FILCONTON, TYP_FILCONTOFF, TYP_SHELLRESON, TYP_SHELLRESOFF, TYP_ENDMENU, TYP_INACTIVE};
static char TYPESTR[TYP_ENDMENU+1][13]={"MENU=","MENUDON=","MENUDOFF=","MENUFON=","MENUFOFF=","MENUSON=","MENUSOFF=","ACTION=","COMMENT=","DEPENDON=","DEPENDOFF=","FILCONTON=","FILCONTOFF=","SHELLRESON=","SHELLRESOFF=","ENDMENU"};
static void ShowInfo(MENU *m, int knew);
-unsigned char *lfb = 0, *lbb = 0;
-unsigned char title[256];
-unsigned char VFD[256]="";
+uint32_t *lfb = NULL, *lbb = NULL;
+char title[256];
+char VFD[256]="";
char url[256]="time.fu-berlin.de";
char *line_buffer=NULL;
-unsigned char *trstr;
-int mloop=1, paging=1, mtmo=120, radius=10;
+char *trstr;
+int paging=1, mtmo=120, radius=10;
int ixw=600, iyw=680, xoffs=13, vfd=0;
char INST_FILE[]="/tmp/rc.locked";
int instance=0;
+int stride;
int get_instance(void)
{
}
return NULL;
}
-
+
void TrimString(char *strg)
{
char *pt1=strg, *pt2=strg;
TrimString(buffer);
}
}
- TranslateString(buffer);
+ TranslateString(buffer, size);
}
- return rv;
+ return rv;
}
int ExistFile(char *fname)
}
return res;
}
+static int mysystem(const char *command) {
+ if (!command)
+ return -1;
+ char *a = (char *) alloca(strlen(command) + 1);
+ strcpy(a, command);
+ char *s = a;
+ while (*s && *s != ' ' && *s != '\t')
+ s++;
+ *s = 0;
+ if (access(a, X_OK))
+ chmod(a, 0755);
+
+ return system(command);
+}
+#define system mysystem
void OnMenuClose(char *cmd, char *dep)
{
if(dep)
{
- res=!system(dep);
+ res=!system(dep);
res|=ExistFile(dep);
}
if(cmd && res)
++pt1;
}
pt2=pt1;
- while(*pt2 && ((*pt2=='*') || (*pt2=='&') || (*pt2=='§') || (*pt2=='+') || (*pt2=='-') || (*pt2=='!') || (*pt2=='_')))
+ while(*pt2 && ((*pt2=='*') || (*pt2=='&') || (*pt2==0302) || (*pt2==0247) || (*pt2=='+') || (*pt2=='-') || (*pt2=='!') || (*pt2=='_')))
{
if(*pt2=='_')
{
*(pt2-1)=0;
pt2=pt1;
}
-
+
if(menu.icon[menu.num_headers])
{
free(menu.icon[menu.num_headers]);
}
else
{
- if(strstr(line_buffer,"FONT=")==line_buffer)
+ if(strstr(line_buffer,"FONT=")==line_buffer)
{
strcpy(FONT,strchr(line_buffer,'=')+1);
}
{
sscanf(strchr(line_buffer,'=')+1,"%d",&FSIZE_MED);
}
+#if 0
if(strstr(line_buffer,"MENUTIMEOUT=")==line_buffer)
{
sscanf(strchr(line_buffer,'=')+1,"%d",&mtmo);
}
+#endif
if(strstr(line_buffer,"PAGING=")==line_buffer)
{
sscanf(strchr(line_buffer,'=')+1,"%d",&paging);
}
}
}
-//printf("Check_Config: Level: %d -> %s\n",level,line_buffer);
+ //printf("Check_Config: Level: %d -> %s\n",level,line_buffer);
}
rv=0;
fclose(fstr.fh[fstr.fnum]);
switch(mode)
{
case 0: return 0;
-
+
case 1:
-
+
if((m->list=calloc(LIST_STEP,sizeof(PLISTENTRY)))==NULL)
{
printf(NOMEM);
}
m->max_entrys=LIST_STEP;
break;
-
+
case -1:
if(m->num_headers && m->headertxt)
{
}
time(&tm1);
do{
-// usleep(100000L);
+ //usleep(100000L);
first=(paging)?0:(MAX_FUNCS*(int)(m->act_entry/MAX_FUNCS));
last=(paging)?(m->num_entrys-1):(MAX_FUNCS*(int)(m->act_entry/MAX_FUNCS)+MAX_FUNCS-1);
if(last>=m->num_entrys)
{
last=m->num_entrys-1;
}
-
+
active=0;
for(i=first; i<=last && !active; i++)
{
active |= ((m->list[i]->type != TYP_COMMENT) && (m->list[i]->type != TYP_INACTIVE));
}
-
+
rccode=-1;
if(knew)
{
ShowInfo(m, knew);
}
knew=1;
- switch(rccode = GetRCCode())
+ switch(rccode = GetRCCode(mtmo * 1000))
{
case RC_RED:
if(active && direct[0]>=0)
- {
+ {
m->act_entry=direct[0];
rv=1;
mloop=0;
}
break;
- case RC_GREEN:
+ case RC_GREEN:
if(active && direct[1]>=0)
- {
+ {
m->act_entry=direct[1];
rv=1;
mloop=0;
}
break;
- case RC_YELLOW:
+ case RC_YELLOW:
if(active && direct[2]>=0)
- {
+ {
m->act_entry=direct[2];
rv=1;
mloop=0;
}
break;
- case RC_BLUE:
+ case RC_BLUE:
if(active && direct[3]>=0)
- {
+ {
m->act_entry=direct[3];
rv=1;
mloop=0;
case RC_1:
if(active && direct[4]>=0)
- {
+ {
m->act_entry=direct[4];
rv=1;
mloop=0;
case RC_2:
if(active && direct[5]>=0)
- {
+ {
m->act_entry=direct[5];
rv=1;
mloop=0;
case RC_3:
if(active && direct[6]>=0)
- {
+ {
m->act_entry=direct[6];
rv=1;
mloop=0;
case RC_4:
if(active && direct[7]>=0)
- {
+ {
m->act_entry=direct[7];
rv=1;
mloop=0;
case RC_5:
if(active && direct[8]>=0)
- {
+ {
m->act_entry=direct[8];
rv=1;
mloop=0;
case RC_6:
if(active && direct[9]>=0)
- {
+ {
m->act_entry=direct[9];
rv=1;
mloop=0;
case RC_7:
if(active && direct[10]>=0)
- {
+ {
m->act_entry=direct[10];
rv=1;
mloop=0;
case RC_8:
if(active && direct[11]>=0)
- {
+ {
m->act_entry=direct[11];
rv=1;
mloop=0;
case RC_9:
if(active && direct[12]>=0)
- {
+ {
m->act_entry=direct[12];
rv=1;
mloop=0;
case RC_0:
if(active && direct[13]>=0)
- {
+ {
m->act_entry=direct[13];
rv=1;
mloop=0;
}
m->act_entry=i;
}
-// knew=1;
+ //knew=1;
break;
- case RC_DOWN:
+ case RC_DOWN:
case RC_PLUS:
if(m->num_active)
{
}
m->act_entry=i;
}
-// knew=1;
+ //knew=1;
break;
case RC_PAGEUP:
m->act_entry=i;
break;
- case RC_OK:
+ case RC_OK:
if(m->num_active)
{
rv=1;
case -1:
knew=0;
+#if 0
if(mtmo == 0)
- break;
+ break;
+#endif
time(&tm2);
if((tm2-tm1)<mtmo)
{
break;
}
rv=RC_HOME;
- case RC_HOME:
+ case RC_HOME:
rv=0;
mloop=0;
break;
- case RC_MUTE:
- memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
+ case RC_MUTE:
+ memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
usleep(500000L);
- while(GetRCCode()!=-1)
- {
- usleep(100000L);
- }
- while(GetRCCode()!=RC_MUTE)
- {
- usleep(500000L);
- }
- while((rccode=GetRCCode())!=-1)
- {
- usleep(100000L);
- }
- break;
+ ClearRC();
+ while(GetRCCode(-1)!=RC_MUTE);
+ ClearRC();
+ break;
case RC_STANDBY:
rv=-1;
mloop=0;
- break;
-
+ break;
+
default: knew=0; break;
}
if(rccode!=-1)
ShowInfo(m, knew);
-return rv;
+ return rv;
}
int AddListEntry(MENU *m, char *line, int pos)
{
return 1;
}
-//printf("AddListEntry: %s\n",line);
+ //printf("AddListEntry: %s\n",line);
wstr=strdup(line);
-
+
if(m->num_entrys>=m->max_entrys)
{
if((m->list=realloc(m->list,(m->max_entrys+LIST_STEP)*sizeof(PLISTENTRY)))==NULL)
}
m->max_entrys+=LIST_STEP;
}
-
+
entr=m->list[m->num_entrys];
entr->underline=entr->stay=entr->showalways=0;
ptr1=strchr(wstr,'=');
ptr1++;
ptr2=ptr1;
- while(*ptr2 && ((*ptr2=='*') || (*ptr2=='&') || (*ptr2=='§') || (*ptr2=='+') || (*ptr2=='-') || (*ptr2=='!') || (*ptr2=='_')))
+ while(*ptr2 && ((*ptr2=='*') || (*ptr2=='&') || (*ptr2==0302) || (*ptr2==0247) || (*ptr2=='+') || (*ptr2=='-') || (*ptr2=='!') || (*ptr2=='_')))
{
switch(*ptr2)
{
case '+': entr->showalways=1; break;
case '-': entr->showalways=2; break;
case '&': entr->stay=1; break;
- case '§': entr->stay=2; break;
+ case 0302: if (*(ptr2 + 1) != 0247) break; // UTF-8 value of paragraph symbol
+ ptr2++;
+ case 0247: entr->stay=2; break;
}
while(*(++ptr2))
{
}
}
break;
-
+
case TYP_MENU:
if((ptr2=strstr(ptr1,",ICON="))!=NULL)
{
m->num_entrys++;
found=1;
break;
-
+
case TYP_DEPENDON:
case TYP_DEPENDOFF:
case TYP_MENUDON:
pfound=ExistFile(ptr3);
}
if((((i==TYP_DEPENDON)||(i==TYP_MENUDON)||(i==TYP_FILCONTON)||(i==TYP_MENUFON)) && pfound) || (((i==TYP_DEPENDOFF)||(i==TYP_MENUDOFF)||(i==TYP_FILCONTOFF)||(i==TYP_MENUFOFF)) && !pfound))
- {
+ {
entr->type=(i<TYP_EXECUTE)?TYP_MENU:((strlen(ptr2))?TYP_EXECUTE:TYP_INACTIVE);
entr->entry=strdup(ptr1);
if(ptr4)
else
{
if(entr->showalways)
- {
+ {
entr->type=TYP_INACTIVE;
entr->entry=strdup(ptr1);
entr->headerpos=pos;
}
pfound=system(ptr3);
if((((i==TYP_SHELLRESON)||(i==TYP_MENUSON)) && !pfound) || (((i==TYP_SHELLRESOFF)||(i==TYP_MENUSOFF)) && pfound))
- {
+ {
entr->type=(i<TYP_EXECUTE)?TYP_MENU:((strlen(ptr2))?TYP_EXECUTE:TYP_INACTIVE);
entr->entry=strdup(ptr1);
if(ptr4)
else
{
if(entr->showalways)
- {
+ {
entr->type=TYP_INACTIVE;
entr->entry=strdup(ptr1);
entr->headerpos=pos;
}
}
break;
- }
+ }
if(found && (i != TYP_COMMENT) && (i != TYP_INACTIVE))
{
m->num_active++;
mlevel--;
}
}
-//printf("Get_Menu: loop: %d, mlevel: %d, pos: %d -> %s\n",loop,mlevel,pos,line_buffer);
+ //printf("Get_Menu: loop: %d, mlevel: %d, pos: %d -> %s\n",loop,mlevel,pos,line_buffer);
}
if(loop)
{
return rv;
}
-
+
--pos;
--mlevel;
loop=1;
}
menu.menact=strdup(pt1);
}
-
+
}
mlevel--;
}
char dstr[BUFSIZE],*lcptr,*lcstr;
int dy, my, moffs, mh, toffs, soffs=4, oldx=startx, oldy=starty, sbar=0, nosel;
PLISTENTRY pl;
-
+
moffs=iyw/(MAX_FUNCS+1);
mh=iyw-moffs;
dy=mh/(MAX_FUNCS+1);
toffs=dy/2;
my=moffs+dy+toffs;
-
+
startx = sx + (((ex-sx) - ixw)/2);
starty = sy + (((ey-sy) - iyw)/2);
tind=index;
-
+
//frame layout
RenderBox(0, 0, ixw, iyw, radius, CMC);
// titlebar
RenderBox(0, 0, ixw, moffs+5, radius, CMH);
-
+
for(loop=MAX_FUNCS*(index/MAX_FUNCS); loop<MAX_FUNCS*(index/MAX_FUNCS+1) && loop<m->num_entrys && !sbar; loop++)
{
pl=m->list[loop];
scrollbar_len = (double)mh / (double)((m->num_entrys/MAX_FUNCS+1)*MAX_FUNCS);
scrollbar_ofs = scrollbar_len*(double)((index/MAX_FUNCS)*MAX_FUNCS);
scrollbar_cor = scrollbar_len*(double)MAX_FUNCS;
- RenderBox(ixw-sbw, moffs + scrollbar_ofs, ixw, moffs + scrollbar_ofs + scrollbar_cor , radius, COL_MENUCONTENT_PLUS_3);
+ RenderBox(ixw-sbw, moffs + scrollbar_ofs, ixw, moffs + scrollbar_ofs + scrollbar_cor , radius, COL_MENUCONTENT_PLUS_3);
}
// Title text
if(m->icon[m->act_header])
{
-// PaintIcon(m->icon[m->act_header],xoffs-6,soffs+2,1);
+ //PaintIcon(m->icon[m->act_header],xoffs-6,soffs+2,1);
}
-
+
index /= MAX_FUNCS;
dloop=0;
ldy=dy;
if(m->num_active && sbar && (loop==m->act_entry))
{
RenderBox(2, my+soffs-dy, ixw-sbw, my+soffs, radius, CMCS);
- }
+ }
nosel=(pl->type==TYP_COMMENT) || (pl->type==TYP_INACTIVE);
if(!(pl->type==TYP_COMMENT && pl->underline==2))
- {
+ {
RenderString(dstr, 45, my, ixw-sbw-65, LEFT, (pl->type==TYP_COMMENT)?SMALL:MED, (((loop%MAX_FUNCS) == (tind%MAX_FUNCS)) && (sbar) && (!nosel))?CMCST:(nosel)?CMCIT:CMCT);
}
if(pl->type==TYP_MENU)
{
int cloffs=0,ccenter=0;
if(pl->type==TYP_COMMENT)
- {
+ {
if(strlen(dstr)==0)
{
if(pl->underline==2)
cloffs=dy/3;
}
}
- else
+ else
{
if(pl->underline==2)
{
}
//copy backbuffer to framebuffer
- memcpy(lfb, lbb,fix_screeninfo.line_length*var_screeninfo.yres);
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
if(m->num_active && knew)
{
int Menu_Up(MENU *m)
{
int llev=m->headerlevels[m->act_header], lmen=m->act_header, lentr=m->lastheaderentrys[m->act_header];
-
+
if(m->menact)
{
OnMenuClose(m->menact,m->menactdep);
m->act_header=lmen;
Get_Menu(1);
m->act_entry=lentr;
-
- return 1;
+
+ return 1;
}
printf(NOMEM);
return -1;
}
-
+
if((trstr=calloc(BUFSIZE+1, sizeof(char)))==NULL)
{
printf(NOMEM);
return -1;
}
-
+
spr=Read_Neutrino_Cfg("screen_preset")+1;
sprintf(trstr,"screen_StartX%s",spres[spr]);
if((sx=Read_Neutrino_Cfg(trstr))<0)
tr[index]=tr[cindex];
cindex=index;
}
+ for (index = 0; index <= COL_MENUCONTENT_PLUS_3; index++)
+ bgra[index] = (tr[index] << 24) | (rd[index] << 16) | (gn[index] << 8) | bl[index];
fb = open(FB_DEVICE, O_RDWR);
if(fb == -1)
}
InitRC();
-// InitVFD();
+ //InitVFD();
//init framebuffer
perror("shellexec <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("shellexec <mapping of Framebuffer>\n");
return -1;
}
//init fontlibrary
-
if((error = FT_Init_FreeType(&library)))
{
printf("shellexec <FT_Init_FreeType failed with Errorcode 0x%.2X>", error);
printf("shellexec <FTC_Manager_LookupFace Font \"%s\" loaded>\n", desc.face_id);
use_kerning = FT_HAS_KERNING(face);
- desc.flags = FT_LOAD_MONOCHROME;
+ desc.flags = FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT;
if(Read_Neutrino_Cfg("rounded_corners")>0)
radius=9;
radius=0;
//init backbuffer
-
- if(!(lbb = malloc(fix_screeninfo.line_length*var_screeninfo.yres)))
+ if(!(lbb = malloc(var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t))))
{
printf("shellexec <allocating of Backbuffer failed>\n");
FTC_Manager_Done(manager);
munmap(lfb, fix_screeninfo.smem_len);
return -1;
}
+ stride = fix_screeninfo.line_length/sizeof(uint32_t);
-// lbb=lfb;
- memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
- memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+ //lbb=lfb;
+ memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
startx = sx + (((ex-sx) - (fix_screeninfo.line_length-200))/2);
starty = sy + (((ey-sy) - (var_screeninfo.yres-150))/2);
-
-
index=0;
if(vfd)
{
case -1:
mainloop=0;
break;
-
+
case 0:
mainloop=Menu_Up(&menu);
break;
-
+
case 1:
pl=menu.list[menu.act_entry];
switch (pl->type)
Get_Menu(0);
menu.act_entry=0;
break;
-
+
case TYP_EXECUTE:
if((rptr=strxchr(pl->entry,','))!=NULL)
{
}
else
{
- memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
- memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+ memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
}
-
+
if(*(rptr+strlen(rptr)-1)=='&')
{
*(rptr+strlen(rptr)-1)=0;
rptr=tstr;
}
}
+ CloseRC();
system(rptr);
-
+ InitRC();
+
mainloop= pl->stay==1;
if(pl->stay==1)
{
}
//cleanup
-
Clear_List(&menu,-1);
FTC_Manager_Done(manager);
FT_Done_FreeType(library);
-/* if(strlen(url))
+#if 0
+ if(strlen(url))
{
sprintf(line_buffer,"/sbin/rdate -s %s > /dev/null &",url);
system(line_buffer);
}
-*/
+#endif
CloseRC();
-// CloseVFD();
-
+ //CloseVFD();
+
free(line_buffer);
free(trstr);
// clear Display
- memset(lbb, TRANSP,fix_screeninfo.line_length*var_screeninfo.yres);
- memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+ memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
munmap(lfb, fix_screeninfo.smem_len);
close(fb);
return 0;
}
-
-type=2
-name=Flexmenü
-desc=Variables Bildschirmmenue
-needfb=1
-needlcd=1
-needrc=1
-needoffsets=1
+type=2\r
+name=Flexmenü\r
+desc=Variables Bildschirmmenü\r
#ifndef __shellexec_H__
-
#define __shellexec_H__
-
+//#include <config.h>
+#define _FILE_OFFSET_BITS 64
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/un.h>
+#include <stdint.h>
#include <ft2build.h>
#include FT_FREETYPE_H
FT_Error error;
FT_Library library;
FTC_Manager manager;
-FTC_SBitCache cache;
+FTC_SBitCache cache;
FTC_SBit sbit;
#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0
FTC_Image_Desc desc;
enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED, COL_MENUCONTENT_PLUS_0, COL_MENUCONTENT_PLUS_1, COL_MENUCONTENT_PLUS_2, COL_MENUCONTENT_PLUS_3};
#define TRANSP 0
-extern unsigned char rd[], gn[], bl[], tr[];
-extern unsigned char *lfb, *lbb;
+extern uint32_t bgra[];
+extern int stride;
+extern uint32_t *lfb, *lbb;
extern int FSIZE_BIG;
extern int FSIZE_MED;
int get_instance(void);
void put_instance(int pval);
+#ifndef FB_DEVICE
#define FB_DEVICE "/dev/fb/0"
+#endif
int key_count;
unsigned short lastkey;
-#endif
\ No newline at end of file
+#endif
fprintf(stderr, "[%s.so] parent, waitpid() returned..\n", SCRIPT);
if (WIFEXITED(status))
fprintf(stderr, "[%s.so] child returned with status %d\n", SCRIPT, WEXITSTATUS(status));
-}
+}
#include "text.h"
#include "gfx.h"
#include "io.h"
+#include "shellexec.h"
int FSIZE_BIG=28;
int FSIZE_MED=24;
int FSIZE_SMALL=20;
int TABULATOR=72;
-static unsigned sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={'ä','ö','ü','Ä','Ö','Ü','ß','°'}, su[7]={0xA4,0xB6,0xBC,0x84,0x96,0x9C,0x9F};
+//extern void blit();
-void TranslateString(char *src)
-{
-int i,found,quota=0;
-char rc,*rptr=src,*tptr=src;
+static char *sc = "aouAOUzd",
+ *su = "\xA4\xB6\xBC\x84\x96\x9C\x9F",
+ *tc = "\xE4\xF6\xFC\xC4\xD6\xDC\xDF\xB0";
- while(*rptr != '\0')
+// from neutrino/src/driver/fontrenderer.cpp
+int UTF8ToUnicode(char **textp, const int utf8_encoded) // returns -1 on error
+{
+ int unicode_value, i;
+ char *text = *textp;
+ if (utf8_encoded && ((((unsigned char)(*text)) & 0x80) != 0))
{
- if(*rptr=='\'')
+ int remaining_unicode_length;
+ if ((((unsigned char)(*text)) & 0xf8) == 0xf0)
{
- quota^=1;
+ unicode_value = ((unsigned char)(*text)) & 0x07;
+ remaining_unicode_length = 3;
}
- if(!quota && *rptr=='~')
+ else if ((((unsigned char)(*text)) & 0xf0) == 0xe0)
{
- ++rptr;
- rc=*rptr;
- found=0;
- for(i=0; i<sizeof(sc)/sizeof(sc[0]) && !found; i++)
- {
- if(rc==sc[i])
- {
- rc=tc[i];
- found=1;
- }
- }
- if(found)
- {
- *tptr=rc;
- }
- else
- {
- *tptr='~';
- tptr++;
- *tptr=*rptr;
- }
+ unicode_value = ((unsigned char)(*text)) & 0x0f;
+ remaining_unicode_length = 2;
+ }
+ else if ((((unsigned char)(*text)) & 0xe0) == 0xc0)
+ {
+ unicode_value = ((unsigned char)(*text)) & 0x1f;
+ remaining_unicode_length = 1;
}
else
{
- if (!quota && *rptr==0xC3 && *(rptr+1))
- {
- found=0;
- for(i=0; i<sizeof(su)/sizeof(su[0]) && !found; i++)
- {
- if(*(rptr+1)==su[i])
- {
- found=1;
- *tptr=tc[i];
- ++rptr;
- }
- }
- if(!found)
- {
- *tptr=*rptr;
- }
+ (*textp)++;
+ return -1;
+ }
+
+ *textp += remaining_unicode_length;
+
+ for (i = 0; *text && i < remaining_unicode_length; i++) {
+ text++;
+ if (((*text) & 0xc0) != 0x80) {
+ remaining_unicode_length = -1;
+ return -1; // incomplete or corrupted character
}
+ unicode_value <<= 6;
+ unicode_value |= ((unsigned char)(*text)) & 0x3f;
+ }
+ } else
+ unicode_value = (unsigned char)(*text);
+
+ (*textp)++;
+ return unicode_value;
+}
+
+void CopyUTF8Char(char **to, char **from)
+{
+ int remaining_unicode_length;
+ if (!((unsigned char)(**from) & 0x80))
+ remaining_unicode_length = 1;
+ else if ((((unsigned char)(**from)) & 0xf8) == 0xf0)
+ remaining_unicode_length = 4;
+ else if ((((unsigned char)(**from)) & 0xf0) == 0xe0)
+ remaining_unicode_length = 3;
+ else if ((((unsigned char)(**from)) & 0xe0) == 0xc0)
+ remaining_unicode_length = 2;
+ else {
+ (*from)++;
+ return;
+ }
+ while (**from && remaining_unicode_length) {
+ **to = **from;
+ (*from)++, (*to)++, remaining_unicode_length--;
+ }
+}
+
+int isValidUTF8(char *text) {
+ while (*text)
+ if (-1 == UTF8ToUnicode(&text, 1))
+ return 0;
+ return 1;
+}
+
+void TranslateString(char *src, size_t size)
+{
+ char *fptr = src;
+ size_t src_len = strlen(src);
+ char *tptr_start = alloca(src_len * 4 + 1);
+ char *tptr = tptr_start;
+
+ if (isValidUTF8(src))
+ strncpy(tptr_start, fptr, src_len + 1);
+ else {
+ while (*fptr) {
+ int i;
+ for (i = 0; tc[i] && (tc[i] != *fptr); i++);
+ if (tc[i]) {
+ *tptr++ = 0xC3;
+ *tptr++ = su[i];
+ fptr++;
+ } else if (*fptr & 0x80)
+ fptr++;
else
- {
- *tptr=*rptr;
- }
+ *tptr++ = *fptr++;
}
- tptr++;
- rptr++;
+ *tptr = 0;
}
- *tptr=0;
+
+ fptr = tptr_start;
+ tptr = src;
+ char *tptr_end = src + size - 4;
+ while (*fptr && tptr < tptr_end) {
+ if (*fptr == '~') {
+ fptr++;
+ int i;
+ for (i = 0; sc[i] && (sc[i] != *fptr); i++);
+ if (sc[i]) {
+ *tptr++ = 0xC3;
+ *tptr++ = su[i];
+ fptr++;
+ } else if (*fptr == 'd') {
+ *tptr++ = 0xC2;
+ *tptr++ = 0xb0;
+ fptr++;
+ } else
+ *tptr++ = '~';
+ } else
+ CopyUTF8Char(&tptr, &fptr);
+ }
+ *tptr = 0;
}
/******************************************************************************
* 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("shellexec <Font \"%s\" failed>\n", (char*)face_id);
+ if (result)
+ printf("shellexec <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;
+ uint32_t fgcolor, bgcolor;
+ uint32_t colors[256];
+};
+
+#define COLORS_LRU_SIZE 16
+static struct colors_struct *colors_lru_array[COLORS_LRU_SIZE] = { NULL };
+
+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 error;
+ FT_Error err;
- currentchar=currentchar & 0xFF;
+ if (currentchar == '\r') // display \r in windows edited files
+ {
+ if(color != -1)
+ {
+ if (_sx + 10 < _ex)
+ RenderBox(_sx, _sy - 10, _sx + 10, _sy, GRID, color);
+ else
+ return -1;
+ }
+ return 10;
+ }
- //load char
+ if (currentchar == '\t')
+ {
+ /* simulate horizontal TAB */
+ return 15;
+ }
- if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar)))
+ //load char
+ if(!(glyphindex = FT_Get_Char_Index(face, currentchar)))
{
- // printf("msgbox <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
+ printf("shellexec <FT_Get_Char_Index for Char \"%c\" failed>\n", (int)currentchar);
return 0;
}
-
- if((error = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
+ if((err = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
{
- // printf("msgbox <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\n", (int)currentchar, error);
+ printf("shellexec <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\n", (int)currentchar, err);
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 */
+ } else
+ kerning.x = 0;
+ //render char
+ if (color != -1) /* don't render char, return charwidth only */
+ {
+ uint32_t bgcolor = *(lbb + (starty + _sy) * stride + (startx + _sx));
+ uint32_t fgcolor = bgra[color];
+ uint32_t *colors = lookup_colors(fgcolor, bgcolor);
+ uint32_t *p = lbb + (startx + _sx + sbit->left + kerning.x) + stride * (starty + _sy - sbit->top);
+ uint32_t *r = p + (_ex - _sx); /* end of usable box */
for(row = 0; row < sbit->height; row++)
{
- for(pitch = 0; pitch < sbit->pitch; pitch++)
+ uint32_t *q = p;
+ uint8_t *s = sbit->buffer + row * sbit->pitch;
+ for(pitch = 0; pitch < sbit->width; 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<<bit) memcpy(lbb + (startx + sx + sbit->left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4);
-
- x++;
- }
+ if (*s)
+ *q = colors[*s];
+ q++, s++;
+ if (q > r) /* we are past _ex */
+ break;
}
-
- x = 0;
- y++;
+ p += stride;
+ r += stride;
}
+ if (_sx + sbit->xadvance >= _ex)
+ return -1; /* limit to maxwidth */
+ }
-}
-
-//return charwidth
-
-return sbit->xadvance + kerning.x;
+ //return charwidth
+ return sbit->xadvance + kerning.x;
}
/******************************************************************************
* GetStringLen
******************************************************************************/
-int GetStringLen(int sx, unsigned char *string, int size)
+int GetStringLen(int _sx, char *string, size_t size)
{
- int i, found;
- int stringlen = 0;
-
+ int i, stringlen = 0;
+
//reset kerning
-
+
prev_glyphindex = 0;
-
+
//calc len
-
+
switch (size)
{
case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
default: desc.width = desc.height = size; break;
}
- while(*string != '\0')
- {
- if(*string != '~')
- {
- stringlen += RenderChar(*string, -1, -1, -1, -1);
- }
- else
- {
+ while(*string) {
+ switch(*string) {
+ case '~':
string++;
if(*string=='t')
- {
stringlen=desc.width+TABULATOR*((int)(stringlen/TABULATOR)+1);
+ else if(*string=='T' && sscanf(string+1,"%4d",&i)==1) {
+ string+=5;
+ stringlen=i-_sx;
}
- else
- {
- if(*string=='T')
- {
- if(sscanf(string+1,"%4d",&i)==1)
- {
- string+=4;
- stringlen=i-sx;
- }
- }
- else
- {
- found=0;
- for(i=0; i<sizeof(sc)/sizeof(sc[0]) && !found; i++)
- {
- if(*string==sc[i])
- {
- stringlen += RenderChar(tc[i], -1, -1, -1, -1);
- found=1;
- }
- }
- }
- }
+ break;
+ default:
+ stringlen += RenderChar(UTF8ToUnicode(&string, 1), -1, -1, -1, -1);
+ break;
}
- string++;
}
-
+
return stringlen;
}
if(strstr(rstr,"~c"))
layout=CENTER;
- //set size
-
+ //set size
switch (size)
{
case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
case BIG: desc.width = desc.height = FSIZE_BIG; break;
default: desc.width = desc.height = size; break;
}
-
- //set alignment
+ //set alignment
if(layout != LEFT)
{
stringlen = GetStringLen(sx, string, size);
}
}
- //reset kerning
-
+ //reset kerning
prev_glyphindex = 0;
- //render string
-
+ //render string
ex = sx + maxwidth;
while(*rptr != '\0')
case 'B': varcolor=BLUE0; break;
case 'S': varcolor=color; break;
case 't': sx=((sx/TABULATOR)+1)*TABULATOR; break;
- case 'T':
+ case 'T':
if(sscanf(rptr+1,"%4d",&i)==1)
{
rptr+=4;
}
else
{
- if((charwidth = RenderChar(*rptr, sx, sy, ex, ((color!=CMCIT) && (color!=CMCST))?varcolor:color)) == -1) return; /* string > maxwidth */
+ if ((charwidth = RenderChar(UTF8ToUnicode(&rptr, 1), sx, sy, ex, ((color!=CMCIT) && (color!=CMCST)) ? varcolor : color)) == -1)
+ return; /* string > maxwidth */
sx += charwidth;
}
- rptr++;
+ //rptr++;
}
}
{
extern int radius;
int ixw=400;
- int lx=startx/*, ly=starty*/;
+ int lx=startx;
+ //int ly=starty;
char *tdptr;
-
+
startx = sx + (((ex-sx) - ixw)/2);
-// starty=sy;
-
- //layout
+ //starty=sy;
- RenderBox(0, 178, ixw, 327, radius, CMH);
- RenderBox(2, 180, ixw-4, 323, radius, CMC);
- RenderBox(0, 178, ixw, 220, radius, CMH);
+ //layout
+ RenderBox(0, 178, ixw, 327, radius, CMH);
+ RenderBox(2, 180, ixw-4, 323, radius, CMC);
+ RenderBox(0, 178, ixw, 220, radius, CMH);
//message
-
- tdptr=strdup(mtitle);
- remove_tabs(tdptr);
- RenderString(tdptr, 2, 213, ixw, CENTER, FSIZE_BIG, CMHT);
- free(tdptr);
- tdptr=strdup(message);
- remove_tabs(tdptr);
- RenderString(tdptr, 2, 270, ixw, CENTER, FSIZE_MED, CMCT);
- free(tdptr);
-
- if(wait)
- {
- RenderBox(ixw/2-25, 286, ixw/2+25, 310, radius, CMCS);
- RenderString("OK", ixw/2-25, 305, 50, CENTER, FSIZE_MED, CMCT);
- }
- memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+ tdptr=strdup(mtitle);
+ remove_tabs(tdptr);
+ RenderString(tdptr, 2, 213, ixw, CENTER, FSIZE_BIG, CMHT);
+ free(tdptr);
+ tdptr=strdup(message);
+ remove_tabs(tdptr);
+ RenderString(tdptr, 2, 270, ixw, CENTER, FSIZE_MED, CMCT);
+ free(tdptr);
+
+ if(wait)
+ {
+ RenderBox(ixw/2-25, 286, ixw/2+25, 310, radius, CMCS);
+ RenderString("OK", ixw/2-25, 305, 50, CENTER, FSIZE_MED, CMCT);
+ }
+ memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+ //blit();
- while(wait && (GetRCCode() != RC_OK));
-
- startx=lx;
-// starty=ly;
+ while(wait && (GetRCCode(-1) != RC_OK));
-}
+ startx=lx;
+ //starty=ly;
+}
#ifndef __TEXT_H__
-
#define __TEXT_H__
#include "shellexec.h"
extern int FSIZE_MED;
extern int FSIZE_SMALL;
-void TranslateString(char *src);
-int GetStringLen(int sx, unsigned char *string, int size);
+void TranslateString(char *src, size_t size);
+int GetStringLen(int sx, char *string, size_t size);
FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface);
void RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color);
void ShowMessage(char *mtitle, char *message, int wait);