#define NCF_FILE "/var/tuxbox/config/neutrino.conf"
#define CFG_FILE "/var/tuxbox/config/logomask.conf"
-#define CL_VERSION "1.01"
+#define CL_VERSION "1.2"
#define MAX_MASK 16
// TRANSP, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, TURQUOISE,
unsigned char *lfb = 0, *lbb = 0;
char tstr[BUFSIZE];
int xpos=0,ypos=0,sdat=0,big=0,secs=1;
+int wxh, wyh;
gpixel lpix;
void TrimString(char *strg)
strg[strlen(strg)-1]=0;
}
}
+
int Read_Neutrino_Cfg(char *entry)
{
FILE *nfh;
return rv;
}
+void xscal(int *xp, int *xw, int sxp, int sxw, double scal)
+{
+ int xe=sxp+sxw,lxp,lxw;
+
+ lxp=sxp;
+ if(sxp<wxh)
+ lxp=wxh-(wxh-sxp)*scal;
+ else
+ lxp=wxh+(sxp-wxh)*scal;
+ if(lxp<0)
+ lxp=0;
+ if(lxp>=var_screeninfo.xres)
+ lxp=var_screeninfo.xres-1;
+ if(xe<wxh)
+ xe=wxh-(wxh-xe)*scal;
+ else
+ xe=wxh+(xe-wxh)*scal;
+ if(xe<0)
+ xe=0;
+ if(xe>=var_screeninfo.xres)
+ xe=var_screeninfo.xres-1;
+ lxw=xe-lxp;
+ if((lxp+lxw)>=var_screeninfo.xres)
+ lxw=var_screeninfo.xres-lxw-1;
+ *xp=lxp;
+ *xw=lxw;
+}
+
+void yscal(int *yp, int *yw, int syp, int syw, double scal)
+{
+ int ye=syp+syw,lyp,lyw;
+
+ lyp=syp;
+ if(syp<wyh)
+ lyp=wyh-(wyh-syp)*scal;
+ else
+ lyp=wyh+(syp-wyh)*scal;
+ if(lyp<0)
+ lyp=0;
+ if(lyp>=var_screeninfo.yres)
+ lyp=var_screeninfo.yres-1;
+ if(ye<wyh)
+ ye=wyh-(wyh-ye)*scal;
+ else
+ ye=wyh+(ye-wyh)*scal;
+ if(ye<0)
+ ye=0;
+ if(ye>=var_screeninfo.yres)
+ ye=var_screeninfo.yres-1;
+ lyw=ye-lyp;
+ if((lyp+lyw)>=var_screeninfo.yres)
+ lyw=var_screeninfo.yres-lyw-1;
+ *yp=lyp;
+ *yw=lyw;
+}
+
/******************************************************************************
* logomask Main
******************************************************************************/
+
int main (int argc, char **argv)
{
- int i,j,m,found,loop=1,mask=0,test=0,pmode=0,lmode=0,mchanged=1,cchanged=2,mwait;
+ int i,j,m,found,loop=1,mask=0,test=0,pmode=0,lmode=0,pmode43=1,lmode43=1,mchanged=1,mchanged43=1,cchanged=2,mwait,tv;
unsigned char lastchan[20]="", actchan[20]=""/*,channel[128]=""*/;
- int xp[MAX_MASK][8],yp[MAX_MASK][8],xw[MAX_MASK][8],yw[MAX_MASK][8],valid[MAX_MASK],xxp,xxw,yyp,yyw,nmsk=0;
+ int xp[4][MAX_MASK][8],yp[4][MAX_MASK][8],xw[4][MAX_MASK][8],yw[4][MAX_MASK][8],valid[MAX_MASK],xxp,xxw,yyp,yyw,nmsk=0;
gpixel tp, cmc, mc[MAX_MASK];
+ double sc131=1.16666666667, sc132=1.193, sc23=1.33333333333;
FILE *fh;
char *cpt1,*cpt2;
printf("logomask Version %s\n",CL_VERSION);
if((mwait=Read_Neutrino_Cfg("timing.infobar"))<0)
mwait=6;
-
-// mwait-=1;
+ if((tv=Read_Neutrino_Cfg("video_Format"))<0)
+ tv=3;
+ --tv;
fb = open(FB_DEVICE, O_RDWR);
memset(lbb, 0, fix_screeninfo.line_length*var_screeninfo.yres);
// if problem with config file return from plugin
+ wxh=var_screeninfo.xres>>1;
+ wyh=var_screeninfo.yres>>1;
while(loop)
{
sleep(1);
mchanged=0;
+ if(access("/tmp/.logomask_pause",0)!=-1)
+ continue;
+ i=0;
+ system("wget -Y off -q -O /tmp/logomask.stat http://localhost/control/zapto?statussectionsd");
+ if((fh=fopen("/tmp/logomask.stat","r"))!=NULL)
+ {
+ if(fgets(tstr,500,fh))
+ {
+ TrimString(tstr);
+ if(strlen(tstr))
+ {
+ sscanf(tstr,"%d",&i);
+ }
+ }
+ fclose(fh);
+ }
+ if(i!=1)
+ continue;
system("pzapit -var > /tmp/logomaskset.stat");
if((fh=fopen("/tmp/logomaskset.stat","r"))!=NULL)
{
fclose(fh);
}
+ if(tv>1)
+ {
+ system("pzapit -vm43 > /tmp/logomaskset.stat");
+ if((fh=fopen("/tmp/logomaskset.stat","r"))!=NULL)
+ {
+ if(fgets(tstr,500,fh))
+ {
+ TrimString(tstr);
+ if(strlen(tstr))
+ {
+ lmode43=pmode43;
+ if(sscanf(tstr+strlen(tstr)-1,"%d",&i)!=1)
+ {
+ pmode43=0;
+ }
+ else
+ {
+ mchanged43=(pmode43!=i);
+ pmode43=i;
+ }
+ }
+ }
+ fclose(fh);
+ }
+ }
+
system("pzapit -gi > /tmp/logomask.chan");
if((fh=fopen("/tmp/logomask.chan","r"))!=NULL)
{
if(strlen(tstr))
{
strcpy(actchan,tstr);
- cchanged=(cchanged==2)?3:((strcmp(actchan,lastchan)?1:0));
+ cchanged=(cchanged==2)?3:((mchanged43 || (strcmp(actchan,lastchan))?1:0));
if(mchanged || cchanged)
{
found=0;
{
if(cchanged==1)
{
- sleep(mwait);
+ sleep((mchanged43)?3:mwait);
}
cchanged=1;
}
{
if(valid[m])
{
- xxp=xp[m][lmode];
- xxw=xw[m][lmode];
- yyp=yp[m][lmode];
- yyw=yw[m][lmode];
+ xxp=xp[lmode43][m][lmode];
+ xxw=xw[lmode43][m][lmode];
+ yyp=yp[lmode43][m][lmode];
+ yyw=yw[lmode43][m][lmode];
make_color(TRANSP, &cmc);
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL,&cmc);
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL,&cmc);
for(i=0;i<=yyw;i++)
{
j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if((j+(xxw<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if((j+(xxw<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
{
memcpy(lfb+j, lbb+j, xxw<<2);
}
cpt1++;
if(sscanf(cpt1,"%d,%d,%d,%d",&xxp,&xxw,&yyp,&yyw)==4)
{
- xp[nmsk][i]=xxp;
- xw[nmsk][i]=xxw;
- yp[nmsk][i]=yyp;
- yw[nmsk][i]=yyw;
+ xp[1][nmsk][i]=xxp;
+ xw[1][nmsk][i]=xxw;
+ yp[1][nmsk][i]=yyp;
+ yw[1][nmsk][i]=yyw;
+ if(tv>1)
+ { // todo 14:9-Fernseher beruecksichtigen
+ // Pan & Scan
+ xscal(&(xp[0][nmsk][i]),&(xw[0][nmsk][i]),xxp,xxw,sc23);
+ yscal(&(yp[0][nmsk][i]),&(yw[0][nmsk][i]),yyp,yyw,sc23);
+ // Vollbild
+ xscal(&(xp[2][nmsk][i]),&(xw[2][nmsk][i]),xxp,xxw,sc23);
+ yp[2][nmsk][i]=yyp;
+ yw[2][nmsk][i]=yyw;
+ // Pan & Scan 14:9
+ xscal(&(xp[3][nmsk][i]),&(xw[3][nmsk][i]),xxp,xxw,sc131);
+ yscal(&(yp[3][nmsk][i]),&(yw[3][nmsk][i]),yyp,yyw,sc132);
+ }
mc[nmsk].lpixel=cmc.lpixel;
found=1;
valid[nmsk]=1;
}
if(mask)
{
+//printf("[logomask] pmode=%d,pmode43=%d\n",pmode,pmode43);
for(m=0; m<nmsk; m++)
{
if(valid[m])
{
- xxp=xp[m][pmode];
- xxw=xw[m][pmode];
- yyp=yp[m][pmode];
- yyw=yw[m][pmode];
- cmc.lpixel=mc[m].lpixel;
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, (test)?GRID:FILL, &cmc);
- for(i=0;i<=yyw;i++)
+ xxw=xw[pmode43][m][pmode];
+ if(xxw>0)
{
- j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if((j+(xxw<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ xxp=xp[pmode43][m][pmode];
+ yyp=yp[pmode43][m][pmode];
+ yyw=yw[pmode43][m][pmode];
+ cmc.lpixel=mc[m].lpixel;
+ RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, (test)?GRID:FILL, &cmc);
+ for(i=0;i<=yyw;i++)
{
- memcpy(lfb+j, lbb+j, xxw<<2);
+ j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
+ if((j+(xxw<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
+ {
+ memcpy(lfb+j, lbb+j, xxw<<2);
+ }
}
}
+//printf("[logomask]mask%d: xxp=%d, xxw=%d, yyp=%d, yyw=%d\n",m+1,xxp,xxw,yyp,yyw);
}
}
}
{
if(valid[m])
{
- xxp=xp[m][pmode];
- xxw=xw[m][pmode];
- yyp=yp[m][pmode];
- yyw=yw[m][pmode];
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, &cmc);
+ xxp=xp[pmode43][m][pmode];
+ xxw=xw[pmode43][m][pmode];
+ yyp=yp[pmode43][m][pmode];
+ yyw=yw[pmode43][m][pmode];
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, &cmc);
for(i=0;i<=yyw;i++)
{
j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if((j+(xxw<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if((j+(xxw<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
{
memcpy(lfb+j, lbb+j, xxw<<2);
}
#include <string.h>
#include <time.h>
+#include <linux/input.h>
+#include <sys/stat.h>
#include "logoset.h"
#include "io.h"
#include "gfx.h"
extern int FSIZE_MED;
extern int FSIZE_SMALL;
-#define NCF_FILE "/var/tuxbox/config/neutrino.conf"
-#define CFG_FILE "/var/tuxbox/config/logomask.conf"
+static unsigned char NCF_FILE[]="/var/tuxbox/config/neutrino.conf";
+static unsigned char CFG_FILE[]="/var/tuxbox/config/logomask.conf";
+static unsigned char AST_FILE[]="/var/etc/init.d/S9L_logomask";
+static unsigned char AST_TEXT[]="#!/bin/sh\n(sleep 20; logomask) &\n";
unsigned char FONT[64]= "/share/fonts/pakenham.ttf";
-#define CL_VERSION "1.01"
+#define CL_VERSION "1.2a"
#define MAX_MASK 16
// TRANSP, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, TURQUOISE,
}
}
+int Read_Neutrino_Cfg(char *entry)
+{
+FILE *nfh;
+char *cfptr=NULL;
+int rv=-1;
+
+ if((nfh=fopen(NCF_FILE,"r"))!=NULL)
+ {
+ tstr[0]=0;
+
+ while((!feof(nfh)) && ((strstr(tstr,entry)==NULL) || ((cfptr=strchr(tstr,'='))==NULL)))
+ {
+ fgets(tstr,500,nfh);
+ }
+ if(!feof(nfh) && cfptr)
+ {
+ ++cfptr;
+ if(sscanf(cfptr,"%d",&rv)!=1)
+ {
+ rv=-1;
+ }
+// printf("%s\n%s=%s -> %d\n",tstr,entry,cfptr,rv);
+ }
+ fclose(nfh);
+ }
+ return rv;
+}
+
/******************************************************************************
* logoset Main
******************************************************************************/
int main (int argc, char **argv)
{
- int i,j,found=0,m,mask=1,kmode=1,pmode=0, lc=-1, changed=0, todo=1, help=1, help_changed=0, move=0;
+ int i,j,found=0,m,mask=1,kmode=1,pmode=0, lc=-1, changed=0, todo=1, help=1, help_changed=0, move=0, autost,tv,pmode43,scr=1;
unsigned char actchan[20]=""/*,channel[128]=""*/;
FILE *fh,*fh2;
char *cpt1,*cpt2;
gpixel mp, mc[MAX_MASK], tp;
- int tsx=430, tsy=120, tdy=24, tsz=28, txw=500, tcol=TURQUOISE;
+ int tsx=430, tsy=120, tdy=24, tsz=28, txw=500, tcol=LGREEN;
int xp[MAX_MASK][8],yp[MAX_MASK][8],xw[MAX_MASK][8],yw[MAX_MASK][8],valid[MAX_MASK],cmc[MAX_MASK],xxp,xxw,yyp,yyw,nmsk=0,amsk=0;
double xs=1.0, ys=1.0;
time_t t1,t2;
yw[j][i]=20;
}
}
+ if((tv=Read_Neutrino_Cfg("video_Format"))<0)
+ tv=3;
+ --tv;
+ if((i=Read_Neutrino_Cfg("screen_preset"))>=0)
+ scr=i;
+ if(!scr)
+ {
+ tsy=65;
+ tdy=20;
+ }
+
system("pzapit -var > /tmp/logomaskset.stat");
if((fh=fopen("/tmp/logomaskset.stat","r"))!=NULL)
{
fclose(fh);
}
+ if(tv>1)
+ {
+ system("pzapit -vm43 > /tmp/logomaskset.stat");
+ if((fh=fopen("/tmp/logomaskset.stat","r"))!=NULL)
+ {
+ if(fgets(tstr,500,fh))
+ {
+ TrimString(tstr);
+ if(strlen(tstr))
+ {
+ if(sscanf(tstr+strlen(tstr)-1,"%d",&pmode43)!=1)
+ {
+ pmode43=0;
+ }
+ }
+ }
+ fclose(fh);
+ }
+ if(pmode43!=1)
+ system("pzapit -vm43 1");
+ }
+
system("touch /tmp/.logomask_kill");
fb = open(FB_DEVICE, O_RDWR);
}
memset(lbb, 0, fix_screeninfo.line_length*var_screeninfo.yres);
-
system("pzapit -gi > /tmp/logomask.chan");
if((fh=fopen("/tmp/logomask.chan","r"))!=NULL)
{
yyp=yp[m][pmode];
yyw=yw[m][pmode];
tp.lpixel=mc[m].lpixel;
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, &tp);
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, (xxw>0)?&tp:make_color(LRED,&tp));
if(m==amsk)
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, GRID, make_color(LBLUE,&tp));
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, GRID, make_color((xxw>0)?LBLUE:LRED,&tp));
for(i=0;i<=yyw;i++)
{
j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if((j+(xxw<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if((j+(abs(xxw)<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
{
- memcpy(lfb+j, lbb+j, xxw<<2);
+ memcpy(lfb+j, lbb+j, abs(xxw)<<2);
}
}
}
}
time(&t1);
+ autost=access(AST_FILE, 1)!=-1;
while((rc!=KEY_EXIT) && (rc!=KEY_OK))
{
rc=GetRCCode();
yyp=yp[amsk][pmode];
yyw=yw[amsk][pmode];
lpix.lpixel=mc[amsk].lpixel;
- switch(rc)
+ if(xxw>0)
{
- case KEY_LEFT:
- if(lc==KEY_LEFT)
- {
- xs+=0.3;
- }
- else
- {
- xs=1.0;
- }
- if(kmode)
- {
- if(xxp>0)
- {
- changed=1;
- xxp-=xs;
- }
- }
- else
+ switch(rc)
{
- if(xxw>6)
- {
- changed=1;
- xxw-=xs;
- }
- }
- move=1;
- break;
-
- case KEY_RIGHT:
- if((xxp+xxw)<(fix_screeninfo.line_length-1))
- {
- changed=1;
- if(lc==KEY_RIGHT)
+ case KEY_LEFT:
+ if(lc==KEY_LEFT)
{
xs+=0.3;
}
}
if(kmode)
{
- xxp+=xs;
+ if(xxp>0)
+ {
+ changed=1;
+ xxp-=xs;
+ if(xxp<0)
+ xxp=0;
+ }
}
else
{
- xxw+=xs;
+ if(xxw>4)
+ {
+ changed=1;
+ xxw-=xs;
+ if(xxw<2)
+ xxw=2;
+ }
}
- }
- move=1;
+ move=1;
break;
-
- case KEY_UP:
- if(lc==KEY_UP)
- {
- ys+=0.2;
- }
- else
- {
- ys=1.0;
- }
- if(kmode)
- {
- if(yyp>0)
- {
- changed=1;
- yyp-=ys;
- }
- }
- else
- {
- if(yyw>6)
+
+ case KEY_RIGHT:
+ if((xxp+xxw)<var_screeninfo.xres)
{
changed=1;
- yyw-=ys;
+ if(lc==KEY_RIGHT)
+ {
+ xs+=0.3;
+ }
+ else
+ {
+ xs=1.0;
+ }
+ if(kmode)
+ {
+ xxp+=xs;
+ if((xxp+xxw)>var_screeninfo.xres)
+ xxp=var_screeninfo.xres-xxw;
+ }
+ else
+ {
+ xxw+=xs;
+ if((xxp+xxw)>var_screeninfo.xres)
+ xxw=var_screeninfo.xres-xxp;
+ }
}
- }
- move=1;
+ move=1;
break;
- case KEY_DOWN:
- if((yyp+yyw)<(var_screeninfo.yres-1))
- {
- changed=1;
- if(lc==KEY_DOWN)
+ case KEY_UP:
+ if(lc==KEY_UP)
{
ys+=0.2;
}
}
if(kmode)
{
- yyp+=ys;
- }
- else
- {
- yyw+=ys;
- }
- }
- move=1;
- break;
-
- case KEY_RED:
- changed=1;
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, make_color(TRANSP,&tp));
- for(i=0;i<=yyw;i++)
- {
- j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if(((j+(xxw<<2)))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if(yyp>0)
{
- memcpy(lfb+j, lbb+j, xxw<<2);
+ changed=1;
+ yyp-=ys;
}
- }
- valid[amsk]=0;
- nmsk--;
- kmode=1;
- if(nmsk)
- {
- todo=2;
- amsk=-1;
- for(m=0; m<MAX_MASK && amsk<0; m++)
- {
- if(valid[m])
- {
- amsk=m;
- xxp=xp[amsk][pmode];
- xxw=xw[amsk][pmode];
- yyp=yp[amsk][pmode];
- yyw=yw[amsk][pmode];
- lpix.lpixel=mc[amsk].lpixel;
- }
- }
+ if(yyp<0)
+ yyp=0;
}
else
{
- todo=mask=0;
+ if(yyw>4)
+ {
+ changed=1;
+ yyw-=ys;
+ }
+ if(yyw<2)
+ yyw=2;
}
+ move=1;
break;
-
- case KEY_GREEN:
- if(nmsk<MAX_MASK)
+
+ case KEY_DOWN:
+ if((yyp+yyw)<var_screeninfo.yres)
{
- todo=2;
changed=1;
- kmode=1;
- amsk=-1;
- for(m=0; amsk<0 && m<MAX_MASK; m++)
+ if(lc==KEY_DOWN)
{
- if(!valid[m])
- {
- amsk=m;
- valid[amsk]=1;
- nmsk++;
- cmc[amsk]=BLACK;
- make_color(BLACK, &mc[amsk]);
- for(i=0; i<8; i++)
- {
- xp[amsk][i]=(1280-40)/2;
- xw[amsk][i]=40;
- yp[amsk][i]=(720-20)/2;
- yw[amsk][i]=20;
- }
- xxp=xp[amsk][pmode];
- xxw=xw[amsk][pmode];
- yyp=yp[amsk][pmode];
- yyw=yw[amsk][pmode];
- lpix.lpixel=mc[amsk].lpixel;
- }
+ ys+=0.2;
}
- }
- break;
-
- case KEY_PAGEUP:
- if(nmsk>1)
- {
- m=amsk+1;
- if(m>=MAX_MASK)
+ else
{
- m=0;
+ ys=1.0;
}
- while(!valid[m])
+ if(kmode)
{
- if(++m>=MAX_MASK)
- {
- m=0;
- }
+ yyp+=ys;
+ if((yyp+yyw)>var_screeninfo.yres)
+ yyp=var_screeninfo.yres-yyw;
}
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, &lpix);
- amsk=m;
- xxp=xp[amsk][pmode];
- xxw=xw[amsk][pmode];
- yyp=yp[amsk][pmode];
- yyw=yw[amsk][pmode];
- lpix.lpixel=mc[amsk].lpixel;
- }
- break;
-
- case KEY_PAGEDOWN:
- if(nmsk>1)
- {
- m=amsk-1;
- if(m<0)
+ else
{
- m=MAX_MASK-1;
+ yyw+=ys;
+ if((yyp+yyw)>var_screeninfo.yres)
+ yyw=var_screeninfo.yres-yyp;
}
- while(!valid[m])
- {
- if(--m<0)
- {
- m=MAX_MASK;
- }
- }
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, &lpix);
- amsk=m;
- xxp=xp[amsk][pmode];
- xxw=xw[amsk][pmode];
- yyp=yp[amsk][pmode];
- yyw=yw[amsk][pmode];
- lpix.lpixel=mc[amsk].lpixel;
}
+ move=1;
break;
case KEY_YELLOW:
case KEY_BLUE:
kmode=1;
break;
-
+
case KEY_1:
if(nmsk)
{
changed=1;
}
break;
+ }
+ }
+ switch(rc)
+ {
+
+ case KEY_RED:
+ changed=1;
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, make_color(TRANSP,&tp));
+ for(i=0;i<=yyw;i++)
+ {
+ j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
+ if(((j+(abs(xxw)<<2)))<=fix_screeninfo.line_length*var_screeninfo.yres)
+ {
+ memcpy(lfb+j, lbb+j, abs(xxw)<<2);
+ }
+ }
+ valid[amsk]=0;
+ nmsk--;
+ kmode=1;
+ if(nmsk)
+ {
+ todo=2;
+ amsk=-1;
+ for(m=0; m<MAX_MASK && amsk<0; m++)
+ {
+ if(valid[m])
+ {
+ amsk=m;
+ xxp=xp[amsk][pmode];
+ xxw=xw[amsk][pmode];
+ yyp=yp[amsk][pmode];
+ yyw=yw[amsk][pmode];
+ lpix.lpixel=mc[amsk].lpixel;
+ }
+ }
+ }
+ else
+ {
+ todo=mask=0;
+ }
+ break;
+
+ case KEY_GREEN:
+ if(nmsk<MAX_MASK)
+ {
+ todo=2;
+ changed=1;
+ kmode=1;
+ amsk=-1;
+ for(m=0; amsk<0 && m<MAX_MASK; m++)
+ {
+ if(!valid[m])
+ {
+ amsk=m;
+ valid[amsk]=1;
+ nmsk++;
+ cmc[amsk]=BLACK;
+ make_color(BLACK, &mc[amsk]);
+ for(i=0; i<8; i++)
+ {
+ xp[amsk][i]=(1280-40)/2;
+ xw[amsk][i]=40;
+ yp[amsk][i]=(720-20)/2;
+ yw[amsk][i]=20;
+ }
+ xxp=xp[amsk][pmode];
+ xxw=xw[amsk][pmode];
+ yyp=yp[amsk][pmode];
+ yyw=yw[amsk][pmode];
+ lpix.lpixel=mc[amsk].lpixel;
+ }
+ }
+ }
+ break;
+
+ case KEY_PAGEUP:
+ if(nmsk>1)
+ {
+ m=amsk+1;
+ if(m>=MAX_MASK)
+ {
+ m=0;
+ }
+ while(!valid[m])
+ {
+ if(++m>=MAX_MASK)
+ {
+ m=0;
+ }
+ }
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, (xxw>0)?&lpix:make_color(LRED,&tp));
+ amsk=m;
+ xxp=xp[amsk][pmode];
+ xxw=xw[amsk][pmode];
+ yyp=yp[amsk][pmode];
+ yyw=yw[amsk][pmode];
+ lpix.lpixel=mc[amsk].lpixel;
+ }
+ break;
+
+ case KEY_PAGEDOWN:
+ if(nmsk>1)
+ {
+ m=amsk-1;
+ if(m<0)
+ {
+ m=MAX_MASK-1;
+ }
+ while(!valid[m])
+ {
+ if(--m<0)
+ {
+ m=MAX_MASK;
+ }
+ }
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, (xxw>0)?&lpix:make_color(LRED,&tp));
+ amsk=m;
+ xxp=xp[amsk][pmode];
+ xxw=xw[amsk][pmode];
+ yyp=yp[amsk][pmode];
+ yyw=yw[amsk][pmode];
+ lpix.lpixel=mc[amsk].lpixel;
+ }
+ break;
+
+ case KEY_FAV:
+ if(amsk>=0)
+ {
+ changed=1;
+ xw[amsk][pmode]=-xw[amsk][pmode];
+ xxw=xw[amsk][pmode];
+ printf("logoset: xxp=%d, xxw=%d, yyp=%d, yyw=%d\n",xxp,xxw,yyp,yyw);
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, (xxw>0)?&lpix:make_color(LRED, &tp));
+ }
+ break;
+
+ case KEY_COOL:
+ if(amsk>=0)
+ {
+ for(i=0; i<MAX_MASK; i++)
+ for(j=0; j<8; j++)
+ {
+ xp[i][j]=xp[i][pmode];
+ xw[i][j]=xw[i][pmode];
+ yp[i][j]=yp[i][pmode];
+ yw[i][j]=yw[i][pmode];
+ }
+ changed=1;
+ }
+ break;
+
+ case KEY_0:
+ if(autost)
+ {
+ remove(AST_FILE);
+ autost=!autost;
+ }
+ else
+ {
+ if((fh=fopen(AST_FILE,"w"))!=NULL)
+ {
+ fprintf(fh, AST_TEXT);
+ fclose(fh);
+ sleep(1);
+ chmod(AST_FILE, S_IRWXU | S_IRWXG | S_IRWXO);
+ autost=!autost;
+ }
+ }
+ break;
case KEY_HELP:
help_changed=1;
lpix.lpixel=mc[amsk].lpixel;
if(mask || todo==2)
{
- RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+xw[amsk][pmode], yp[amsk][pmode]+yw[amsk][pmode], FILL, make_color(TRANSP, &tp));
+ RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+abs(xw[amsk][pmode]), yp[amsk][pmode]+yw[amsk][pmode], FILL, make_color(TRANSP, &tp));
for(i=0;i<=yw[amsk][pmode];i++)
{
j=(yp[amsk][pmode]+i)*fix_screeninfo.line_length+(xp[amsk][pmode]<<2);
- if((j+(xw[amsk][pmode]<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if((j+(xw[amsk][pmode]<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
{
memcpy(lfb+j, lbb+j, (xw[amsk][pmode]+1)<<2);
}
yyp=yp[m][pmode];
yyw=yw[m][pmode];
tp.lpixel=mc[m].lpixel;
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, FILL, ((m==amsk) && move)?make_color(TRANSP, &tp):&tp);
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, FILL, ((m==amsk) && move)?make_color(TRANSP, &tp):&tp);
if(m==amsk)
- RenderBox(xxp, yyp, xxp+xxw, yyp+yyw, GRID, make_color((kmode)?LBLUE:LYELLOW,&tp));
+ RenderBox(xxp, yyp, xxp+abs(xxw), yyp+yyw, GRID, make_color((xxw>0)?((kmode)?LBLUE:LYELLOW):LRED,&tp));
for(i=0;i<=yyw;i++)
{
j=(yyp+i)*fix_screeninfo.line_length+(xxp<<2);
- if((j+(xxw<<2))<fix_screeninfo.line_length*var_screeninfo.yres)
+ if((j+(abs(xxw)<<2))<=fix_screeninfo.line_length*var_screeninfo.yres)
{
- memcpy(lfb+j, lbb+j, (xxw+1)<<2);
+ memcpy(lfb+j, lbb+j, (abs(xxw)+1)<<2);
}
}
}
{
xs=1.0;
ys=1.0;
- tsy=120;
+ tsy=80;
if(move)
{
- RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+xw[amsk][pmode], yp[amsk][pmode]+yw[amsk][pmode], FILL, &mc[amsk]);
- RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+xw[amsk][pmode], yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((kmode)?LBLUE:LYELLOW,&tp));
+ RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+abs(xw[amsk][pmode]), yp[amsk][pmode]+yw[amsk][pmode], FILL, &mc[amsk]);
+ RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+abs(xw[amsk][pmode]), yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((xw[amsk][pmode]>0)?((kmode)?LBLUE:LYELLOW):LRED,&tp));
}
move=0;
if(help_changed)
}
if(help)
{
- RenderBox(tsx,tsy,tsx+txw,tsy+21*tdy,FILL,make_color(TRANSP, &tp));
+ RenderBox(tsx,tsy,tsx+abs(txw),tsy+21*tdy,FILL,make_color(TRANSP, &tp));
if(nmsk)
- RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+xw[amsk][pmode], yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((kmode)?LBLUE:LYELLOW, &tp));
+ RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+abs(xw[amsk][pmode]), yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((xw[amsk][pmode]>0)?((kmode)?LBLUE:LYELLOW):LRED, &tp));
RenderString("Maskensteuerung", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Blau : Umschalten auf Positionseinstellung", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Gelb : Umschalten auf Größeneinstellung", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Rot : Maske löschen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("PgUp : nächste Maske auswählen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("PgDn : vorherige Maske auswählen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
+ RenderString("Fav : Maske aktivieren/deaktivieren", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Maskenfarbe", tsx, tsy+=(2*tdy), txw, LEFT, tsz, tcol);
RenderString("Mute : Maskenfarbe aus Vorgabe auswählen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("1,4,7 : Farbton Rot erhöhen, auf Mitte setzen, verringern", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Vol + : Transparenz erhöhen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Vol - : Transparenz verringern", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Allgemein", tsx, tsy+=(2*tdy), txw, LEFT, tsz, tcol);
+ if(autost)
+ RenderString("0 : Autostart von logomask ausschalten", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
+ else
+ RenderString("0 : Autostart von logomask einschalten", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("? : Hilfetext ein/ausschalten", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("Exit : Abbrechen", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
RenderString("OK : Speichern und Beenden", tsx, tsy+=tdy, txw, LEFT, tsz, tcol);
{
if(help_changed)
{
- RenderBox(tsx, tsy, tsx+txw, tsy+21*tdy, FILL, make_color(TRANSP, &tp));
+ RenderBox(tsx, tsy, tsx+abs(txw), tsy+21*tdy, FILL, make_color(TRANSP, &tp));
if(nmsk)
- RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+xw[amsk][pmode], yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((kmode)?LBLUE:LYELLOW, &tp));
+ RenderBox(xp[amsk][pmode], yp[amsk][pmode], xp[amsk][pmode]+abs(xw[amsk][pmode]), yp[amsk][pmode]+yw[amsk][pmode], GRID, make_color((xw>0)?((kmode)?LBLUE:LYELLOW):LRED, &tp));
}
}
help_changed=0;
--- /dev/null
+Was ist Logomask?
+---------------------------
+Diese Plugin dient dazu, senderspezifisch die Senderlogos oder auch Laufschrif-
+ten (z.B bei n-tv)mit einer oder mehreren schwarzen Masken abzudecken, um das
+Fernsehbild ruhiger zu gestalten. Position und Größe der Masken werden dabei für
+jeden Sender separat gespeichert und können auch für jeden einzelnen Videomodus
+des Senders (4:3, 16:9 usw.) getrennt konfiguriert werden. Zur schnellen Anpassung
+der Masken über die Fernbedienung enthält das Archiv auch das Konfigurationstool
+"logoset".
+
+Installation
+------------
+Die Speicherorte der Dateien ergeben sich aus der Archivstruktur. Das eigent-
+liche Plugin "logomask" kommt mit den Rechten 755 nach /var/plugins/. Seine
+Konfigurationsdatei "logomask.conf" legt das Plugin in /var/tuxbox/config ab.
+Im Archiv ist die Konfigurationsdatei nur als Beispiel enthalten, da sie für
+jede Box spezifisch angelegt werden muß. Das Plugin kann entweder direkt durch
+den Eintrag "/var/plugins/logomask &" in einer der Neutrino-Startdateien gestar-
+tet werden (das "&" im Eintrag ist wichtig), über den ebenfalls im Archiv be-
+findlichen Shellstarter (logomask.cfg und logomask.so kommen nach /var/tuxbox/plugins/,
+logomask.so mit den Rechten 755, logomask.sh kommt mit den Rechten 755 nach /var/plugins/),
+oder, wenn des FlexMenü im Image vorhanden ist, durch Einfügen der ebenfalls im Archiv
+enthaltenen Einträge in die shellexec.conf. Während im Flexmenü die jeweils sinn-
+vollen Einträge (Starten oder Beenden) automatisch angeboten werden, kann man
+beim Start über die blaue Taste das Plugin mit einem Aufruf starten und mit einem
+erneuten Aufruf beenden.
+Das Konfigurationsplugin "logoset" kommt mit den Rechten 755 nach /var/plugins/ und kann
+ebenfalls über Shellstarter (logoset.cfg und logoset.so nach /var/tuxbox/plugins/,
+logoset.so mit Rechten 755) oder über das FlexMenü gestartet werden.
+
+Bedienung
+---------
+Bevor das Plugin genutzt werden kann, muß es mit dem Konfigurations-Plugin auf die
+Senderlogos der gewünschten Sender eingestellt werden. Wurde ein Sender nicht kon-
+figuriert, wird auch keine Maske dargestellt. Nach dem Umschalten auf einen anderen
+Sender wartet das Plugin mit dem Löschen der alten und dem Anzeigen der neuen Masken
+so lange, bis die InfoBar im unteren Bildbereich ausgeblendet wurde, damit diese
+Information nicht gelöscht oder überschrieben wird.
+
+Will man auf einem Sender die Masken aktivieren, stellt man diesen Sender ein und
+startet das Konfigurations-Plugin. In der Mitte des Bildes wird nun ein blauer
+Rahmen angezeigt. Diesen kann man mit den Richtungstasten der Fernbedienung nun so
+auf dem Logo platzieren, daß der Rahmen mit seiner linken oberen Ecke schon auf der
+richtigen Position steht. Nun kann mit der gelben Taste auf Größenveränderung umge-
+schaltet werden (die Rahmenfarbe wechselt zu gelb). Mit den Rechts-/Links-Tasten
+kann die Maskengröße jetzt horizontal vergrößert/verkleinert und mit den Runter-/Hoch-
+tasten vertikal vergrößert/verkleinert werden. Will man die Position zwischendurch
+noch einmal ändern, kann mit der blauen Taste auch wieder in den Positionierungsmo-
+dus geschaltet werden (Rahmenfarbe wechselt wieder zu blau).
+Die Schrittweite der Verschiebung erhöht sich bei länger gedrückter Taste, um eine
+schnelle Positionierung zu ermöglichen. Wird länger als zwei Sekunden keine oder eine
+andere als die bisherige Taste gedrückt, wird die Schrittweite wieder auf den Start-
+wert gesetzt, damit eine Feinpositionierung durchgeführt werden kann. Bei längerem
+Tastendruck wird die Schrittweite jedoch wieder erhöht.
+
+Da Plasmafernseher auf die standardmäßig schwarzen Masken bei sehr langer Anzeige mit
+Einbrenneffekten reagieren, kann die Farbe jeder einzelnen Maske mit der Mute-Taste
+aus 15 Farben(Dbox) ausgewählt werden. Jeder Tastendruck schaltet zur nächsten Farbe. Em-
+pfehlenswert für Plasmas ist Grau. Die gewählte Farbe wird so lange angezeigt, bis
+wieder begonnen wird, die Maske zu bewegen.
+Aufgrund des höheren Farbraums bei neueren Boxen ist hier sogar eine Farbgestaltung
+der Masken möglich, welche keine Wünsche mehr offenlassen dürfte.
+
+Für das Hinzufügen zusätzlicher Masken wird die grüne Taste betätigt. Die neue Maske
+erscheint wieder in der Bildschirmmitte und kann, wie die vorhergende Maske konfigu-
+riert werden. Für jeden Sender können maximal 16 Masken angelegt werden. Dabei wird
+beim Konfigurieren immer die aktuelle Maske mit dem farbigen Rahmen angezeigt. Alle
+anderen Masken werden normal schwarz dargestellt. Zwischen den einzelnen Masken kann
+mittels der Lautstärke + und - Tasten weitergeschaltet werden.
+Soll eine Maske nicht mehr dargestellt werden, so ist diese Maske mit den Volume-Tas-
+ten auszuwählen und die rote Taste zu betätigen. Die selektierte Maske wird nun gelöscht
+und die erste Maske in der Reihe (wenn vorhanden) wieder aktiv geschaltet.
+Sitzen alle Masken richtig, kann die Einstellung mit der OK-Taste in die Konfigurations-
+datei übernommen werden. Das Plugin "logomask", welches währen der Einstellung ge-
+stoppt wurde, wird nun automatisch neu gestartet.
+Der Hilfetext kann mit der "?"-Taste ein- und ausgeblendet werden.
+Diese Einstellungen sind für die verschiedenen Videomodi der Box getrennt vorzunehmen.
+Schaltet die Box auf einen Videomodus, welcher noch nicht konfiguriert wurde, wird die
+Maske in der Bildmitte dargestellt und muß mit dem Konfigrations-Plugin einmalig ange-
+passt werden.
+Sollte ein Sender allerdings einen 16:9-Film im 4:3-Format senden und dabei sein Logo
+weiter nach unten schieben, kann das die Box nicht erkennen. In diesem Fall kann man
+die Maske aber auch schnell über die Fernbedienung neu positionieren.
+Die Einstellungen werden generell nur mit der "OK"-Taste übernommen. Drückt man die
+"Home"-Taste, wird die Konfiguration ohne Änderungen der Konfigurationsdatei abgebro-
+chen.