From 2282de3a416a306d4a7950eef7382f9b14dfa634 Mon Sep 17 00:00:00 2001 From: GetAway Date: Sat, 1 Jul 2017 13:27:29 +0200 Subject: [PATCH] add gui icon support; port most of martiis... code for smoother rendering & better RC handling add tuxwetter.png header icon use always same FONT as neutrino add shadow fix a lot of -Wshadow compiler warnings add hack to get descender of font fix cpu overload >90% when showing pictures bump Version 4.00 --- build.sh | 5 +- convert.list | 214 ++++++++-------- fb_display.c | 230 +++++++++++------ fb_display.h | 12 +- gfx.c | 215 ++++++++-------- gfx.h | 7 +- gif.h | 4 +- icons.h | 10 + io.c | 71 ++++- io.h | 3 +- parser.c | 4 +- php.c | 56 ++-- php.h | 2 +- plugins.mk.example | 6 +- png_helper.cpp | 20 ++ pngw.c | 182 ------------- pngw.cpp | 237 +++++++++++++++++ pngw.h | 16 +- resize.c | 80 ++++-- resize.h | 4 +- starter.c | 2 +- text.c | 615 ++++++++++++++++++++++++-------------------- text.h | 6 +- tuxwetter.c | 625 +++++++++++++++++++++++---------------------- tuxwetter.h | 43 +++- tuxwetter.png | Bin 0 -> 2864 bytes 26 files changed, 1512 insertions(+), 1157 deletions(-) create mode 100644 icons.h create mode 100644 png_helper.cpp delete mode 100644 pngw.c create mode 100644 pngw.cpp create mode 100644 tuxwetter.png diff --git a/build.sh b/build.sh index dc378a8..ea77f6c 100644 --- a/build.sh +++ b/build.sh @@ -1 +1,4 @@ -arm-cx2450x-linux-gnueabi-gcc -g -o tuxwetter tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c -L$PREFIX/lib -I$PREFIX/include -I$PREFIX/include/freetype2 -O2 -lfreetype -lcrypto -lssl -lcurl -lz -ljpeg -lpng -lgif -DWWEATHER gifdecomp.c +arm-cx2450x-linux-gnueabi-g++ -Wall -Wshadow -O2 -c pngw.cpp png_helper.cpp -I$(TARGETPREFIX)/include && \ +arm-cx2450x-linux-gnueabi)-gcc -Wall -Wshadow -O2 -c tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c gif.c gifdecomp.c -lfreetype -lz -DWWEATHER -lcrypto -lssl -lcurl -lrtmp -ljpeg -lpng -lgif -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 && \ +arm-cx2450x-linux-gnueabi-g++ $(TARGET_LDFLAGS) -o tuxwetter tuxwetter.o gfx.o io.o text.o parser.o php.o http.o jpeg.o fb_display.o resize.o pngw.o png_helper.o gif.o gifdecomp.o -lfreetype -lz -lcrypto -lssl -lcurl -lrtmp -ljpeg -lpng -lgif -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 && \ +arm-cx2450x-linux-gnueabi-gcc -g -o tuxwetter.so starter.c -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(SOURCE_DIR)/neutrino-hd/src -O2 diff --git a/convert.list b/convert.list index d34e21f..b2ca45d 100644 --- a/convert.list +++ b/convert.list @@ -1,5 +1,5 @@ null|0 -AM CLOUDS / PM SUN|Vormittags wolkig später sonnig +AM CLOUDS / PM SUN|Vormittags wolkig später sonnig AM FOG / PM CLOUDS|Vormittag Nebel / Nachmittag wolkig AM FOG / PM SUN|Vormittag Nebel / Nachmittag sonnig AM LIGHT RAIN|vormittags leichter Regen @@ -23,17 +23,17 @@ CLEAR|heiter CLEARING|aufklarend CLEAR/SUNNY|klar/sonnig CLOUDS|wolkig -CLOUDS EARLY / CLEARING LATE|wolkig, später aufklarend +CLOUDS EARLY / CLEARING LATE|wolkig, später aufklarend CLOUDY|wolkig -CLOUDY AND WINDY|wolkig und stürmisch -CLOUDY / WIND|bewölkt und stürmisch +CLOUDY AND WINDY|wolkig und stürmisch +CLOUDY / WIND|bewölkt und stürmisch DRIFTING SNOW|Schneetreiben -DRIFTING SNOW AND WINDY|Schneetreiben und stürmisch +DRIFTING SNOW AND WINDY|Schneetreiben und stürmisch DRIZZLE|Nieselregen -DRIZZLE AND WINDY|Nieselregen und stürmisch +DRIZZLE AND WINDY|Nieselregen und stürmisch E|Ost ENE|OstNordOst -ESE|OstSüdOst +ESE|OstSüdOst EXTREME|extrem stark FAIR|heiter FAIR AND WINDY|Heiter und windig @@ -43,7 +43,7 @@ FEW SNOW SHOWERS|einige Schneeschauer FEW SNOW SHOWERS / WIND|einige Schneeschauer, windig FIRST QUARTER|zunehmender Halbmond FOG|Nebel -FOG LATE|später neblig +FOG LATE|später neblig FOGGY|neblig FREEZING DRIZZLE|gefrierender Nieselregen FREEZING FOG|gefrierender Nebel @@ -55,26 +55,26 @@ FULL MOON|Vollmond GERMANY|Deutschland HAZE|dunstig HEAVY FREEZING DRIZZLE|stark gefrierender Nieselregen -HEAVY T-STORM AND WINDY|schwere Gewitter, stürmisch +HEAVY T-STORM AND WINDY|schwere Gewitter, stürmisch HEAVY RAIN|starker Regen HEAVY RAIN AT TIMES|zeitweise starker Regen HEAVY SNOW|starker Schneefall HIGH|hoch ICE CRYSTALS|Eiskristalle -ICE EARLY|anfangs Eisglätte +ICE EARLY|anfangs Eisglätte ICE PELLETS|Hagel -ISOLATED T-STORMS|örtlich Gewitter -ISOLATED|örtlich +ISOLATED T-STORMS|örtlich Gewitter +ISOLATED|örtlich LAST QUARTER|abnehmender Halbmond LIGHT DRIZZLE|leichter Nieselregen -LIGHT FREEZING DRIZZLE|leichter Nieselregen, überfrierend -LIGHT FREEZING RAIN|leicht überfrierender Regen +LIGHT FREEZING DRIZZLE|leichter Nieselregen, überfrierend +LIGHT FREEZING RAIN|leicht überfrierender Regen LIGHT RAIN|leichter Regen -LIGHT RAIN AND WINDY|leichter Regen, stürmisch +LIGHT RAIN AND WINDY|leichter Regen, stürmisch LIGHT RAIN EARLY|anfangs leichter Regen -LIGHT RAIN LATE|später leichter Regen +LIGHT RAIN LATE|später leichter Regen LIGHT RAIN SHOWER|leichte Schauer -LIGHT RAIN SHOWER AND WINDY|leichte Regenschauer, stürmisch +LIGHT RAIN SHOWER AND WINDY|leichte Regenschauer, stürmisch LIGHT RAIN / WIND|leichter Regen, windig LIGHT RAIN / WIND LATE|im Verlauf leichter Regen, windig LIGHT SHOWERS OF ICE PELLETS|leichte Hagelschauer @@ -86,30 +86,30 @@ LIGHT SNOW GRAINSLIGHT SNOW LATE|leichter Schneegriesel LIGHT SNOW SHOWER|leichter Schneeschauer LIGHT SNOW SHOWERS|leichte Schneeschauer LIGHT SNOW AND FREEZING RAIN|leichter Schneefall, gefrierender Regen -LIGHT SNOW AND WINDY|leichter Schneefall, stürmisch -LIGHT SNOW / WIND|leichter Schneefall, stürmisch +LIGHT SNOW AND WINDY|leichter Schneefall, stürmisch +LIGHT SNOW / WIND|leichter Schneefall, stürmisch LOW|niedrig MIST|Dunst MIST AND WINDY|Dunst und windig -MODERATE|mäßig -MODERATE OR HEAVY FREEZING RAIN|mäßig bis stark gefrierender Regen -MODERATE OR HEAVY RAIN IN AREA WITH THUNDER|mäßiger Regen im Nahbereich mit Donner -MODERATE OR HEAVY RAIN SHOWER|mäßig bis starker Regenschauer +MODERATE|mäßig +MODERATE OR HEAVY FREEZING RAIN|mäßig bis stark gefrierender Regen +MODERATE OR HEAVY RAIN IN AREA WITH THUNDER|mäßiger Regen im Nahbereich mit Donner +MODERATE OR HEAVY RAIN SHOWER|mäßig bis starker Regenschauer MODERATE OR HEAVY SHOWERS OF ICE PELLETS|leichte bis starke Hagelschauer -MODERATE OR HEAVY SLEET|mäßig bis starker Schneeregen -MODERATE OR HEAVY SLEET SHOWERS|mäßig bis starker Graupelschauer -MODERATE OR HEAVY SNOW IN AREA WITH THUNDER|mäßig bis starker Schneefall mit Donner -MODERATE OR HEAVY SNOW SHOWERS|mäßige bis starke Schneeschauer -MODERATE RAIN|mäßiger Regen -MODERATE RAIN AT TIMES|zeitweise mäßiger Regen -MODERATE SNOW|mäßiger Schneefall +MODERATE OR HEAVY SLEET|mäßig bis starker Schneeregen +MODERATE OR HEAVY SLEET SHOWERS|mäßig bis starker Graupelschauer +MODERATE OR HEAVY SNOW IN AREA WITH THUNDER|mäßig bis starker Schneefall mit Donner +MODERATE OR HEAVY SNOW SHOWERS|mäßige bis starke Schneeschauer +MODERATE RAIN|mäßiger Regen +MODERATE RAIN AT TIMES|zeitweise mäßiger Regen +MODERATE SNOW|mäßiger Schneefall MONDAY|Montag -MOSTLY CLEAR|überwiegend heiter -MOSTLY CLOUDY AND WINDY|überwiegend bewölkt, stürmisch -MOSTLY CLOUDY / WIND|überwiegend bewölkt, stürmisch -MOSTLY CLOUDY|überwiegend bewölkt -MOSTLY SUNNY|überwiegend sonnig -MOSTLY|überwiegend +MOSTLY CLEAR|überwiegend heiter +MOSTLY CLOUDY AND WINDY|überwiegend bewölkt, stürmisch +MOSTLY CLOUDY / WIND|überwiegend bewölkt, stürmisch +MOSTLY CLOUDY|überwiegend bewölkt +MOSTLY SUNNY|überwiegend sonnig +MOSTLY|überwiegend N|Nord N/A| NE|NordOst @@ -121,20 +121,20 @@ NW|NordWest OVERCAST|bedeckt PARTLY|teils PARTLY CLOUDY|teils wolkig -PARTLY CLOUDY AND WINDY|teilweise bewölkt und stürmisch -PARTLY CLOUDY / WIND|teils bewölkt und stürmisch +PARTLY CLOUDY AND WINDY|teilweise bewölkt und stürmisch +PARTLY CLOUDY / WIND|teils bewölkt und stürmisch PATCHES OF FOG|vereinzelt Nebel -PATCHY FREEZING DRIZZLE NEARBY|leichter gefrierender Nieselregen in der Nähe +PATCHY FREEZING DRIZZLE NEARBY|leichter gefrierender Nieselregen in der Nähe PATCHY HEAVY SNOW|stellenweise starker Schneefall PATCHY LIGHT DRIZZLE|stellenweise leichter Nieselregen PATCHY LIGHT RAIN|stellenweise leichter Regen PATCHY LIGHT RAIN IN AREA WITH THUNDER|stellenweise leichter Regen mit Donner PATCHY LIGHT SNOW|stellenweise leichter Schneefall PATCHY LIGHT SNOW IN AREA WITH THUNDER|stellenweise leichter Schneefall mit Donner -PATCHY MODERATE SNOW|stellenweise mäßiger Schneefall -PATCHY RAIN NEARBY|stellenweise Regen in der Nähe -PATCHY SLEET NEARBY|stellenweise Schneeregen in der Nähe -PATCHY SNOW NEARBY|stellenweise Schneefall in der Nähe +PATCHY MODERATE SNOW|stellenweise mäßiger Schneefall +PATCHY RAIN NEARBY|stellenweise Regen in der Nähe +PATCHY SLEET NEARBY|stellenweise Schneeregen in der Nähe +PATCHY SNOW NEARBY|stellenweise Schneefall in der Nähe PM LIGHT RAIN|nachmittags leichter Regen PM LIGHT SNOW|nachmittags leichter Schneefall PM RAIN / SNOW SHOWERS|nachmittags Regen- u. Schneeschauer @@ -146,73 +146,73 @@ PM SNOW SHOWERS / WIND|nachmittags Schneeschauer / windig PM T-STORMS|nachmittags Gewitter PM|nachmittags RAIN|Regen -RAIN / FREEZING RAIN|Regen, später gefrierend +RAIN / FREEZING RAIN|Regen, später gefrierend RAIN / SNOW|Regen / Schnee RAIN / SNOW SHOWERS|Regen- und Schneeschauer RAIN / THUNDER|Regen / Gewitter -RAIN / WIND|Regen, stürmisch -RAIN / WINDY|Regen, stürmisch +RAIN / WIND|Regen, stürmisch +RAIN / WINDY|Regen, stürmisch RAIN / SNOW SHOWERS EARLY|anfangs Schnee- und Regenschauer -RAIN / SNOW SHOWERS LATE|später Schnee- und Regenschauer -RAIN / SNOW SHOWERS / WIND|Regen- Schneeschauer, stürmisch -RAIN / SNOW SHOWERS / WIND EARLY|Regen- Schneeschauer, stürmisch -RAIN / SNOW / WIND|stürmisch, Regen und Schnee +RAIN / SNOW SHOWERS LATE|später Schnee- und Regenschauer +RAIN / SNOW SHOWERS / WIND|Regen- Schneeschauer, stürmisch +RAIN / SNOW SHOWERS / WIND EARLY|Regen- Schneeschauer, stürmisch +RAIN / SNOW / WIND|stürmisch, Regen und Schnee RAIN AND SNOW|Regen und Schnee -RAIN AND WINDY|Regen, stürmisch +RAIN AND WINDY|Regen, stürmisch RAIN EARLY|anfangs Regen -RAIN LATE|später Regen +RAIN LATE|später Regen RAIN SHOWER|Regenschauer -RAIN SHOWER AND WINDY|Regenschauer, stürmisch -RAIN TO SNOW|Regen, in Schnee übergehend +RAIN SHOWER AND WINDY|Regenschauer, stürmisch +RAIN TO SNOW|Regen, in Schnee übergehend RISING|steigend -S|Süd +S|Süd SATURDAY|Samstag -SCATTERED SHOWERS / WIND|vereinzelt Schauer, stürmisch +SCATTERED SHOWERS / WIND|vereinzelt Schauer, stürmisch SCATTERED SHOWERS|vereinzelt Schauer SCATTERED SNOW SHOWERS|vereinzelt Schneeschauer -SCATTERED SNOW SHOWERS / WIND|vereinzelt Schneeschauer, stürmisch +SCATTERED SNOW SHOWERS / WIND|vereinzelt Schneeschauer, stürmisch SCATTERED T-STORMS|vereinzelte Gewitter SCATTERED|vereinzelt -SE|SüdOst +SE|SüdOst SHOWER|Schauer -SHOWERS / WIND|Schauer, stürmisch +SHOWERS / WIND|Schauer, stürmisch SHOWERS EARLY|anfangs Schauer SHOWERS IN THE VICINITY|im Verlauf Schauer -SHOWERS LATE|später Schauer +SHOWERS LATE|später Schauer SHOWERS|Schauer SNOW|Schnee -SNOW AND WINDY|Schnee, stürmisch +SNOW AND WINDY|Schnee, stürmisch SNOW EARLY|anfangs Schneefall SNOW SHOWERS|Schneeschauer SNOW SHOWER|Schneeschauer SNOW SHOWERS EARLY|anfangs Schneeschauer -SNOW SHOWERS LATE|später Schneeschauer -SNOW SHOWERS / WIND|Schneeschauer, stürmisch -SNOW SHOWERS / WIND LATE|Schneeschauer, später stürmisch -SNOW SHOWER / WIND|Schneeschauer, stürmisch -SNOW TO WINTRY MIX|Schnee, später Schneeregen +SNOW SHOWERS LATE|später Schneeschauer +SNOW SHOWERS / WIND|Schneeschauer, stürmisch +SNOW SHOWERS / WIND LATE|Schneeschauer, später stürmisch +SNOW SHOWER / WIND|Schneeschauer, stürmisch +SNOW TO WINTRY MIX|Schnee, später Schneeregen SNOW / WIND|Schnee / Wind -SSE|SüdSüdOst -SSW|SüdSüdWest -STEADY|beständig +SSE|SüdSüdOst +SSW|SüdSüdWest +STEADY|beständig SUNDAY|Sonntag SUNNY|sonnig -SW|SüdWest +SW|SüdWest THE|der THIRD QUARTER|abnehmender Halbmond THUNDER|Gewitter THUNDER IN THE VICINITY|Donner in der Umgebung -THUNDER OUTBREAKS IN NEARBY|Donner-Ausbrüche in der Nähe -THUNDERY OUTBREAKS IN NEARBY|Gewitter in der Nähe +THUNDER OUTBREAKS IN NEARBY|Donner-Ausbrüche in der Nähe +THUNDERY OUTBREAKS IN NEARBY|Gewitter in der Nähe THURSDAY|Donnerstag TORRENTIAL RAIN SHOWER|sintflutartige Regenschauer T-SHOWERS|tropische Schauer T-SHOWERS / WIND|tropische Schauer / Wind T-STORM|Gewitter -T-STORM AND WINDY|Gewitter, stürmisch +T-STORM AND WINDY|Gewitter, stürmisch T-STORMS|Gewitter T-STORMS EARLY|anfangs Gewitter -T-STORMS LATE|später Gewitter +T-STORMS LATE|später Gewitter TUESDAY|Dienstag UNLIMITED|unbegrenzt UNKNOWN PRECIP|Niederschlag @@ -227,62 +227,62 @@ WAXING GIBBOUS|zunehmender 3/4 Mond WAXING HALF, FIRST QUARTER|zunehmender Viertelmond WEDNESDAY|Mittwoch WINTRY MIX|Schneeregen -WINTRY MIX / WIND|Schneeregen, stürmisch +WINTRY MIX / WIND|Schneeregen, stürmisch WNW|WestNordWest -WSW|WestSüdWest +WSW|WestSüdWest # Lokalisierung der Bildschirmanzeige Kein Eintrag| Bitte warten| -Fehlende Übersetzungen| -Keine fehlenden Übersetzungen| +Fehlende Übersetzungen| +Keine fehlenden Übersetzungen| keine Daten vom Wetterserver erhalten!| -Tage Vorschau nicht möglich!| -Ungültige Daten aus tuxwetter.conf| +Tage Vorschau nicht möglich!| +Ungültige Daten aus tuxwetter.conf| Uhr| -Steuertasten in den Menüs| -Farbtasten Rot, Grün, Gelb, Blau| +Steuertasten in den Menüs| +Farbtasten Rot, Grün, Gelb, Blau| Direktanwahl Funktionen 1-4| Zifferntasten 1-6| Direktanwahl Funktionen 5-10| Hoch| -vorheriger Menüeintrag| +vorheriger Menüeintrag| Runter| -nächster Menüeintrag| -Rechts (bei mehrseitigen Menüs)| -eine Seite vorblättern| -Links (bei mehrseitigen Menüs)| -eine Seite zurückblättern| +nächster Menüeintrag| +Rechts (bei mehrseitigen Menüs)| +eine Seite vorblättern| +Links (bei mehrseitigen Menüs)| +eine Seite zurückblättern| OK| -Menüpunkt ausführen| +Menüpunkt ausführen| Home| -zurück zum vorigen Menü| -Menü-Taste (im Hauptmenü)| -fehlende Übersetzungen anzeigen| +zurück zum vorigen Menü| +Menü-Taste (im Hauptmenü)| +fehlende Übersetzungen anzeigen| Standby-Taste| Tuxwetter beenden| Steuertasten in Daten- und Grafikanzeige| vorherigen Eintrag anzeigen| -nächsten Eintrag anzeigen| +nächsten Eintrag anzeigen| Links (in Bildanzeige)| -neu downloaden (für WebCams)| +neu downloaden (für WebCams)| Rechts (bei Ani-GIF's)| Animation wiederholen| -Rot (in fehlenden Übersetzungen)| -Fehlliste löschen| +Rot (in fehlenden Übersetzungen)| +Fehlliste löschen| OK / Home| -Aktuelle Anzeige schließen| +Aktuelle Anzeige schließen| Aktuelles Wetter| Standort:| -Längengrad:| +Längengrad:| Breitengrad:| Ortszeit:| Aktuelle Uhrzeit:| Zeitpunkt der Messung:| Bedingung:| Temperatur:| -gefühlt:| +gefühlt:| Luftfeuchtigkeit:| Taupunkt:| Luftdruck:| @@ -293,7 +293,7 @@ mit| sichtbar| Sonnenaufgang:| Sonnenuntergang:| -Bewölkung:| +Bewölkung:| Mondphase:| Fernsicht:| Niederschlag:| @@ -301,17 +301,17 @@ UV-Index:| Regenrisiko:| Heute| Wochentrend| -Vorschau für| -Höchste Temperatur:| +Vorschau für| +Höchste Temperatur:| Tiefste Temperatur:| Tageswerte| Nachtwerte| Bild| -Wetterdaten für| +Wetterdaten für| Aktuelles Wetter| Januar| Februar| -März| +März| April| Mai| Juni| @@ -322,16 +322,16 @@ Oktober| November| Dezember| Formatfehler der URL in der tuxwetter.conf| -Nicht unterstütztes Dateiformat| +Nicht unterstütztes Dateiformat| Bitte warten| Datei kann nicht angezeigt werden.| Fehler| beim Download| Formatfehler der URL in der tuxwetter.conf| Wochentrend anzeigen| -Höchstwerte| +Höchstwerte| Tiefstwerte| -Trend für die kommende Woche| +Trend für die kommende Woche| MONDAY_SIG|Mo TUESDAY_SIG|Di WEDNESDAY_SIG|Mi diff --git a/fb_display.c b/fb_display.c index 4129986..81e7296 100644 --- a/fb_display.c +++ b/fb_display.c @@ -22,9 +22,6 @@ //#include "config.h" #include #include -#ifdef HAVE_DBOX_HARDWARE -#include -#endif #include "tuxwetter.h" #include "parser.h" //#include "bmps.h" @@ -55,12 +52,11 @@ static unsigned short red[256], green[256], blue[256], transp[256]; static struct fb_cmap map332 = {0, 256, red, green, blue, NULL}; -extern int fbd; // Framebuffer device -extern unsigned char *lfb; -extern unsigned int alpha; + +extern int multiple_pics; static int gbpp, gccp, gmode_on=0; static struct fb_fix_screeninfo fix; -//static struct fb_cmap colormap = {1, 8, rd, gn, bl, tr}; +extern void blit(); typedef struct pixelformat{ char *name; @@ -85,6 +81,7 @@ const struct pixelformat gpix = { int openFB(const char *name); void getFixScreenInfo(struct fb_fix_screeninfo *fix); int set332map(void); + void blit2FB(void *fbbuff, unsigned int pic_xs, unsigned int pic_ys, unsigned int scr_xs, unsigned int scr_ys, @@ -92,7 +89,7 @@ void blit2FB(void *fbbuff, unsigned int xoffs, unsigned int yoffs, int cpp, int setpal); -inline unsigned short make16color(unsigned long r, unsigned long g, +static inline unsigned short make16color(unsigned long r, unsigned long g, unsigned long b, unsigned long rl, unsigned long ro, unsigned long gl, unsigned long go, unsigned long bl, @@ -109,7 +106,7 @@ int fb_set_gmode(int gmode) return -1; } - struct fb_fix_screeninfo fix; +// struct fb_fix_screeninfo fix; if (ioctl(fb, FBIOGET_FSCREENINFO, &fix)<0) { perror("FBIOGET_FSCREENINFO"); @@ -125,11 +122,10 @@ int fb_set_gmode(int gmode) return 0; } - -void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int setpal) +void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int setpal, int alpha) { struct fb_var_screeninfo var; - unsigned short *fbbuff = NULL; + void *fbbuff = NULL; int bp = 0; if(rgbbuff==NULL) return; @@ -154,13 +150,16 @@ void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y if(y_offs + y_size > (int)var.yres) y_offs = 0; /* blit buffer 2 fb */ - fbbuff = (unsigned short *) convertRGB2FB(rgbbuff, x_size * y_size, var.bits_per_pixel, &bp); + fbbuff = convertRGB2FB(rgbbuff, x_size * y_size, var.bits_per_pixel, &bp, alpha); if(fbbuff==NULL) return; + /* ClearFB if image is smaller */ - if(clearflag) - clearFB(0,0,var.bits_per_pixel, bp); + if(clearflag) + setBG(); + blit2FB(fbbuff, x_size, y_size, var.xres, var.yres, x_pan, y_pan, x_offs, y_offs, bp, setpal); + free(fbbuff); gbpp=bp; gccp=var.bits_per_pixel; @@ -227,7 +226,7 @@ void blit2FB(void *fbbuff, unsigned int xoffs, unsigned int yoffs, int cpp, int setpal) { - int i, xc, yc; + int i, xc, yc, count, count2; unsigned char *cp; unsigned short *sp; unsigned int *ip; ip = (unsigned int *) fbbuff; sp = (unsigned short *) ip; @@ -236,32 +235,75 @@ void blit2FB(void *fbbuff, xc = (pic_xs > scr_xs) ? scr_xs : pic_xs; yc = (pic_ys > scr_ys) ? scr_ys : pic_ys; - unsigned int stride = fix.line_length; + int xo = (xoffs * cpp)/sizeof(uint32_t); - switch(cpp){ + switch(cpp){ case 1: - if(setpal) + if(setpal) + { + set332map(); + } + for(i = 0; i < yc; i++){ + memcpy(lbb+(i+yoffs)*stride+xo,cp + (i+yp)*pic_xs+xp,xc*cpp); + } + break; + case 2: + for(i = 0; i < yc; i++){ + memcpy(lbb+(i+yoffs)*stride+xo,sp + (i+yp)*pic_xs+xp, xc*cpp); + } + break; + case 4: { - set332map(); + uint32_t * data = (uint32_t *) fbbuff; + + uint32_t * d = (uint32_t *)lbb + xo + stride * yoffs; + uint32_t * d2; + + for (count = 0; count < yc; count++ ) { + uint32_t *pixpos = &data[(count + yp) * pic_xs]; + d2 = (uint32_t *) d; + for (count2 = 0; count2 < xc; count2++ ) { + uint32_t pix = *(pixpos + xp); + if ((pix & 0xff000000) == 0xff000000) + *d2 = pix; + else { + uint8_t *in = (uint8_t *)(pixpos + xp); + uint8_t *out = (uint8_t *)d2; + int a = in[3]; /* TODO: big/little endian */ + *out = (*out + ((*in - *out) * a) / 256); + in++; out++; + *out = (*out + ((*in - *out) * a) / 256); + in++; out++; + *out = (*out + ((*in - *out) * a) / 256); + } + d2++; + pixpos++; + } + d += stride; + } } - for(i = 0; i < yc; i++){ - memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,cp + (i+yp)*pic_xs+xp,xc*cpp); - } - break; - case 2: - for(i = 0; i < yc; i++){ - memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,sp + (i+yp)*pic_xs+xp, xc*cpp); - } - break; - case 4: - for(i = 0; i < yc; i++){ - memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,ip + (i+yp)*pic_xs+xp, xc*cpp); - } - break; - } + break; + } + if (!multiple_pics) + blit(); } +void setBG() +{ + RenderBox(0, 0, var_screeninfo.xres, var_screeninfo.yres, 0, 0/*black*/); +} +void clearBB() +{ + memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t)); +} + +void clearFB(int cfx __attribute((unused)) __attribute((unused)), int cfy __attribute((unused)) __attribute((unused)), int bpp __attribute((unused)), int cpp __attribute((unused))) +{ + clearBB(); + blit(); +} +#if 0 void clearFB(int cfx, int cfy, int bpp, int cpp) { int x,y; @@ -322,13 +364,14 @@ int x,y; } } +#endif void closeFB(void) { clearFB(0, 0, gbpp, gccp); } -inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b) +static inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b) { return ( (((r >> 5) & 7) << 5) | @@ -336,36 +379,36 @@ inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char ((b >> 6) & 3) ); } -inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b) +static inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b) { - return ( - (((b >> 3) & 31) << 10) | + return ( + (((r >> 3) & 31) << 10) | (((g >> 3) & 31) << 5) | - ((r >> 3) & 31) ); + ((b >> 3) & 31) ); } -inline unsigned short make16color(unsigned long r, unsigned long g, unsigned long b, +static inline unsigned short make16color(unsigned long r, unsigned long g, unsigned long b, unsigned long rl, unsigned long ro, unsigned long gl, unsigned long go, unsigned long bl, unsigned long bo, unsigned long tl, unsigned long to) { return ( -// ((0xFF >> (8 - tl)) << to) | + //((0xFF >> (8 - tl)) << to) | ((r >> (8 - rl)) << ro) | ((g >> (8 - gl)) << go) | ((b >> (8 - bl)) << bo)); } -void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp) +void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp, int alpha) { unsigned long i; void *fbbuff = NULL; - unsigned char *c_fbbuff; - unsigned short *s_fbbuff; - unsigned int *i_fbbuff; + uint8_t *c_fbbuff; + uint16_t *s_fbbuff; + uint32_t *i_fbbuff; unsigned long rl, ro, gl, go, bl, bo, tl, to; - + struct fb_var_screeninfo tvar; ioctl(fb, FBIOGET_VSCREENINFO, &tvar); rl = tvar.red.length; @@ -376,19 +419,19 @@ void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *c bo = tvar.blue.offset; tl = tvar.transp.length; to = tvar.transp.offset; - - switch(bpp) - { + + switch(bpp) + { case 8: *cpp = 1; - c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char)); + c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char)); if(c_fbbuff==NULL) { printf("Error: malloc\n"); return NULL; } for(i = 0; i < count; i++) - c_fbbuff[i] = make8color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + c_fbbuff[i] = make8color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); fbbuff = (void *) c_fbbuff; break; case 15: @@ -400,7 +443,7 @@ void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *c return NULL; } for(i = 0; i < count ; i++) - s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); fbbuff = (void *) s_fbbuff; break; case 16: @@ -411,42 +454,57 @@ void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *c printf("Error: malloc\n"); return NULL; } - for(i = 0; i < count ; i++) - s_fbbuff[i]=make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2], rl, ro, gl, go, bl, bo, tl, to); + for(i = 0; i < count ; i++) + s_fbbuff[i] = make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2], rl, ro, gl, go, bl, bo, tl, to); fbbuff = (void *) s_fbbuff; - break; + break; case 24: case 32: - *cpp = 4; - i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int)); - if(i_fbbuff==NULL) - { - printf("Error: malloc\n"); - return NULL; - } - for(i = 0; i < count ; i++) - i_fbbuff[i] = (/*transp*/0xFF << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); - - fbbuff = (void *) i_fbbuff; - break; + *cpp = 4; + i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int)); + if(i_fbbuff==NULL) + { + printf("Error: malloc\n"); + return NULL; + } + if(alpha) { + for(i = 0; i < count ; i++) { + i_fbbuff[i] = ((rgbbuff[i*4+3] << 24) & 0xFF000000) | + ((rgbbuff[i*4] << 16) & 0x00FF0000) | + ((rgbbuff[i*4+1] << 8) & 0x0000FF00) | + ((rgbbuff[i*4+2]) & 0x000000FF); + } + } + else + { + int _transp; + for(i = 0; i < count ; i++) { + _transp = 0; + if(rgbbuff[i*3] || rgbbuff[i*3+1] || rgbbuff[i*3+2]) + _transp = 0xFF; + i_fbbuff[i] = (_transp << 24) | + ((rgbbuff[i*3] << 16) & 0xFF0000) | + ((rgbbuff[i*3+1] << 8) & 0xFF00) | + (rgbbuff[i*3+2] & 0xFF); + } + } + fbbuff = (void *) i_fbbuff; + break; default: - fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp); - exit(1); - } - return fbbuff; + fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp); + exit(1); + } + return fbbuff; } - - - -int showBusy(int sx, int sy, int width, char r, char g, char b) +int showBusy(int _sx, int _sy, int width, char r, char g, char b) { unsigned char rgb_buffer[3]; unsigned char* fb_buffer; unsigned char* m_busy_buffer=NULL; unsigned char* busy_buffer_wrk; int cpp; - struct fb_fix_screeninfo fix; +// struct fb_fix_screeninfo fix; if(ioctl(fb, FBIOGET_FSCREENINFO, &fix) == -1) { printf("fb_display \n"); @@ -459,13 +517,14 @@ int showBusy(int sx, int sy, int width, char r, char g, char b) printf("fb_display \n"); return -1; } - var.bits_per_pixel = gpix.bpp; +// var.bits_per_pixel = gpix.bpp; rgb_buffer[0]=r; rgb_buffer[1]=g; rgb_buffer[2]=b; - fb_buffer = (unsigned char*) convertRGB2FB(rgb_buffer, 1, var.bits_per_pixel, &cpp); + fb_buffer = convertRGB2FB(rgb_buffer, 1, var.bits_per_pixel, &cpp, 0); + if(fb_buffer==NULL) { printf("Error: malloc\n"); @@ -476,24 +535,25 @@ int showBusy(int sx, int sy, int width, char r, char g, char b) free(m_busy_buffer); m_busy_buffer=NULL; } - m_busy_buffer = (unsigned char*) malloc(width*width*cpp); + size_t bufsize = width * width * cpp; + m_busy_buffer = (unsigned char*) malloc(bufsize); if(m_busy_buffer==NULL) { printf("Error: malloc\n"); return -1; } busy_buffer_wrk = m_busy_buffer; - unsigned int stride = fix_screeninfo.line_length*2; int y=0, x=0; for(y=sy ; y < sy+width; y++) { - for(x=sx ; x< sx+width; x++) + for(x=_sx ; x< _sx+width; x++) { - memcpy(busy_buffer_wrk, lfb + y * stride + x*cpp, cpp); + memcpy(busy_buffer_wrk, lbb + y * stride + (x * cpp)/sizeof(uint32_t), cpp); busy_buffer_wrk+=cpp; - memcpy(lfb + y * stride + x*cpp, fb_buffer, cpp); + memcpy(lbb + y * stride + (x * cpp)/sizeof(uint32_t), fb_buffer, cpp); } } -return 0; + blit(); + return 0; } diff --git a/fb_display.h b/fb_display.h index b29b3d6..7019a2b 100644 --- a/fb_display.h +++ b/fb_display.h @@ -1,7 +1,4 @@ /* - * $Id: fb_display.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ - * - * tuxwetter - d-box2 linux project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,14 +18,15 @@ #ifndef __pictureviewer_fbdisplay__ #define __pictureviewer_fbdisplay__ -void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp); -void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int transp); +void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp, int alpha); +void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int setpal, int alpha); int fb_set_gmode(int gmode); void getCurrentRes(int *x,int *y); +void setBG(void); void clearFB(int cfx, int cfy, int bpp, int cpp); +void clearBB(void); void closeFB(void); -int showBusy(int sx, int sy, int width, char r, char g, char b); - +int showBusy(int _sx, int _sy, int width, char r, char g, char b); #endif diff --git a/gfx.c b/gfx.c index 81a2ba4..ed0ad7b 100644 --- a/gfx.c +++ b/gfx.c @@ -3,24 +3,11 @@ #include "tuxwetter.h" #include "gfx.h" +#include "resize.h" +#include "pngw.h" +#include "fb_display.h" -//typedef struct { unsigned char width_lo; unsigned char width_hi; unsigned char height_lo; unsigned char height_hi; unsigned char transp; } IconHeader; - -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 -}; +extern const char NOMEM[]; void Center_Screen(int wx, int wy, int *csx, int *csy) { @@ -35,13 +22,13 @@ void RenderBox(int rsx, int rsy, int rex, int rey, int rad, int col) { int F,R=rad,ssx=sx+rsx,ssy=sy+rsy,dxx=rex,dyy=rey,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) { - printf("[shellexec] RenderBox called with dx < 0 (%d)\n", dxx); + printf("[tuxwetter] %s called with dxx < 0 (%d)\n", __func__, dxx); dxx=0; } @@ -79,10 +66,10 @@ void RenderBox(int rsx, int rsy, int rex, int rey, int rad, int col) rx=R-ssx; ry=R-ssy; - pos0=pos+((dyy-ry)*fix_screeninfo.line_length); - pos1=pos+(ry*fix_screeninfo.line_length); - pos2=pos+(rx*fix_screeninfo.line_length); - pos3=pos+((dyy-rx)*fix_screeninfo.line_length); + pos0=pos+(dyy-ry)*stride; + pos1=pos+ry*stride; + pos2=pos+rx*stride; + pos3=pos+(dyy-rx)*stride; while (ssx <= ssy) { rx=R-ssx; @@ -90,18 +77,18 @@ void RenderBox(int rsx, int rsy, int rex, int rey, int rad, int col) wx=rx<<1; wy=ry<<1; - for(i=pos0+(rx<<2); i\n"); + fclose(tfh); + return -1; + } + // no resize + if (xsize == 0 || ysize == 0) + { + xsize = x1; + ysize = y1; + } + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) + { + printf(NOMEM); + fclose(tfh); + return -1; } -} -#if 0 -/****************************************************************************** - * PaintIcon - ******************************************************************************/ -void PaintIcon(char *filename, int x, int y, unsigned char offset) -{ - IconHeader iheader; - unsigned int width, height,count,count2; - unsigned char pixbuf[768],*pixpos,compressed,pix1,pix2; - unsigned char * d = (lbb+(startx+x)+var_screeninfo.xres*(starty+y)); - unsigned char * d2; - int fd; + if(!(rv=png_load(fname, &buffer, &x1, &y1, &bpp))) + { + alpha=(bpp==4)?1:0; + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,0,alpha); - fd = open(filename, O_RDONLY); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 0, 0, alpha); + } + free(buffer); + fclose(tfh); + } + *iw = imx; + *ih = imy; + return (rv)?-1:0; +} - if (fd == -1) +void scale_pic(unsigned char **buffer, int x1, int y1, int xstart, int ystart, int xsize, int ysize, + int *imx, int *imy, int *dxp, int *dyp, int *dxo, int *dyo, int center, int alpha) +{ + float xfact=0, yfact=0; + int txsize=0, tysize=0; + int txstart =xstart, tystart= ystart; + + if (xsize > (ex-xstart)) txsize= (ex-xstart); + else txsize= xsize; + if (ysize > (ey-ystart)) tysize= (ey-ystart); + else tysize=ysize; + xfact= 1000*txsize/x1; + xfact= xfact/1000; + yfact= 1000*tysize/y1; + yfact= yfact/1000; + + if ( xfact <= yfact) { - printf("shellexec \n", filename); - return; + *imx=(int)x1*xfact; + *imy=(int)y1*xfact; + if (center !=0) + { + tystart=(ey-sy)-*imy; + tystart=tystart/2; + tystart=tystart+ystart; + } } - - read(fd, &iheader, sizeof(IconHeader)); - - width = (iheader.width_hi << 8) | iheader.width_lo; - height = (iheader.height_hi << 8) | iheader.height_lo; - - - for (count=0; count> 1 ); - pixpos = (unsigned char*) &pixbuf; - d2 = d; - for (count2=0; count2> 1; count2 ++ ) + *imx=(int)x1*yfact; + *imy=(int)y1*yfact; + if (center !=0) { - compressed = *pixpos; - pix1 = (compressed & 0xf0) >> 4; - pix2 = (compressed & 0x0f); - - if (pix1 != iheader.transp) - { - *d2=pix1 + offset; - } - d2++; - if (pix2 != iheader.transp) - { - *d2=pix2 + offset; - } - d2++; - pixpos++; + txstart=(ex-sx)-*imx; + txstart=txstart/2; + txstart=txstart+xstart; } - d += var_screeninfo.xres; } - close(fd); - return; + if ((x1 != *imx) || (y1 != *imy)) + *buffer=color_average_resize(*buffer,x1,y1,*imx,*imy,alpha); + + *dxp=0; + *dyp=0; + *dxo=txstart; + *dyo=tystart; } -#endif /****************************************************************************** * RenderLine @@ -210,7 +218,7 @@ void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) int y; int End; int step; - unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]}; + uint32_t pix = bgra[col]; dx = abs (xa - xb); dy = abs (ya - yb); @@ -235,8 +243,7 @@ void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) End = xb; step = yb < ya ? -1 : 1; } - - memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + *(lbb + startx+x + stride*(y+starty)) = pix; while( x < End ) { @@ -248,7 +255,7 @@ void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) y += step; p += twoDyDx; } - memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + *(lbb + startx+x + stride*(y+starty)) = pix; } } else @@ -271,8 +278,7 @@ void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) End = yb; step = xb < xa ? -1 : 1; } - - memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + *(lbb + startx+x + stride*(y+starty)) = pix; while( y < End ) { @@ -284,9 +290,8 @@ void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) x += step; p += twoDxDy; } - memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + + *(lbb + startx+x + stride*(y+starty)) = pix; } } } - - diff --git a/gfx.h b/gfx.h index 9bfa439..7806a0f 100644 --- a/gfx.h +++ b/gfx.h @@ -3,10 +3,11 @@ #define __GFX_H__ void Center_Screen(int wx, int wy, int *csx, int *csy); -void RenderBox(int sx, int sy, int ex, int ey, int mode, int color); -//void PaintIcon(char *filename, int x, int y, unsigned char offset); +void RenderBox(int rsx, int rsy, int rex, int rey, int mode, int color); +int paintIcon(const char *const fname, int xstart, int ystart, int xsize, int ysize, int *iw, int *ih); +void scale_pic(unsigned char **buffer, int x1, int y1, int xstart, int ystart, int xsize, int ysize, + int *imx, int *imy, int *dxp, int *dyp, int *dxo, int *dyo, int center, int alpha); void RenderLine( int xa, int ya, int xb, int yb, unsigned char farbe ); -void RenderCircle(int sx, int sy, int col); #endif diff --git a/gif.h b/gif.h index d8cc227..ff9bf02 100644 --- a/gif.h +++ b/gif.h @@ -23,7 +23,7 @@ #define __GIF_H__ int fh_gif_id(const char *name); -int fh_gif_load(const char *name,char *buffer,int x,int y); -int fh_gif_getsize(char *name,int *x,int *y, int wanted_width, int wanted_height); +int fh_gif_load(const char *name,unsigned char *buffer,int x,int y); +int fh_gif_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height); #endif diff --git a/icons.h b/icons.h new file mode 100644 index 0000000..770f34e --- /dev/null +++ b/icons.h @@ -0,0 +1,10 @@ +#ifndef __icons_h__ +#define __icons_h__ + + +#define ICON_BUTTON_RED "/share/tuxbox/neutrino/icons/rot.png" +#define ICON_BUTTON_GREEN "/share/tuxbox/neutrino/icons/gruen.png" +#define ICON_BUTTON_YELLOW "/share/tuxbox/neutrino/icons/gelb.png" +#define ICON_BUTTON_BLUE "/share/tuxbox/neutrino/icons/blau.png" + +#endif diff --git a/io.c b/io.c index 173c929..feff64e 100644 --- a/io.c +++ b/io.c @@ -15,10 +15,10 @@ #include #include #include +#include #include "io.h" #include "tuxwetter.h" -#define RC_DEVICE "/dev/input/nevis_ir" extern int instance; struct input_event ev; @@ -27,7 +27,7 @@ static int rc; int InitRC(void) { - rc = open(RC_DEVICE, O_RDONLY); + rc = open(RC_DEVICE, O_RDONLY | O_CLOEXEC); if(rc == -1) { perror("tuxwetter "); @@ -59,19 +59,66 @@ int RCKeyPressed(void) return 0; } +void ClearRC(void) +{ + struct pollfd pfd; + pfd.fd = rc; + pfd.events = POLLIN; + pfd.revents = 0; + + do + poll(&pfd, 1, 300); + while(read(rc, &ev, sizeof(ev)) == sizeof(ev)); +} + -int GetRCCode(void) +int GetRCCode(int timeout_in_ms) { - int rv; - - if(!RCKeyPressed() || (get_instance()>instance)) + int rv = -1; + + if (get_instance()>instance) { - return -1; + return rv; } - rv=rccode; - while(RCKeyPressed()); - - return rv; -} + if (timeout_in_ms) { + struct pollfd pfd; + struct timeval tv; + uint64_t ms_now, ms_final; + + pfd.fd = rc; + pfd.events = POLLIN; + pfd.revents = 0; + gettimeofday( &tv, NULL ); + ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000; + if (timeout_in_ms > 0) + ms_final = ms_now + timeout_in_ms; + else + ms_final = UINT64_MAX; + while (ms_final > ms_now) { + switch(poll(&pfd, 1, timeout_in_ms)) { + case -1: + perror("GetRCCode: poll() failed"); + case 0: + return -1; + default: + ; + } + if(RCKeyPressed()) { + rv = rccode; + while(RCKeyPressed()); + return rv; + } + + gettimeofday( &tv, NULL ); + ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000; + if (timeout_in_ms > 0) + timeout_in_ms = (int)(ms_final - ms_now); + } + } else if(RCKeyPressed()) { + rv = rccode; + while(RCKeyPressed()); + } + return rv; +} diff --git a/io.h b/io.h index 1619ae7..6eba5e2 100644 --- a/io.h +++ b/io.h @@ -7,6 +7,7 @@ int InitRC(void); int CloseRC(void); int RCKeyPressed(void); -int GetRCCode(void); +int GetRCCode(int); +void ClearRC(void); #endif diff --git a/parser.c b/parser.c index fbdd2c9..b4ee75b 100644 --- a/parser.c +++ b/parser.c @@ -33,7 +33,7 @@ int ptc= 0; int t_actday= 0; int t_actmonth= 0; int t_actyear= 0; -const char mnames[12][10]={"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"}; +const char mnames[12][10]={"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"}; char prstrans[512]; extern int num_of_days; @@ -578,7 +578,7 @@ int parser(char *citycode, const char *trans, int metric, int inet, int ctmo) exit_ind=1; #endif -//*** Übersetzungs File *** +//*** Übersetzungs File *** if ((wxfile = fopen(trans,"r"))==NULL) { diff --git a/php.c b/php.c index 1da5008..975784e 100644 --- a/php.c +++ b/php.c @@ -10,13 +10,13 @@ #define FH_ERROR_FORMAT 2 /* file format error */ #define FH_ERROR_MALLOC 3 /* error during malloc */ -int fh_php_trans(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int *cut, int *x, int *y, int plain, int plot) +int fh_php_trans(const char *name, int _sx, int _sy, int dy, int cs, int line, int highlite, int *cut, int *x, int *y, int plain, int plot) { -char tstr[BUFSIZE],rstr[BUFSIZE],*tptr,*xptr,cc,br3flag=0; -int loop=1, j, first, aline=0, fx=sx, fy=sy, slen, deg=0; +char tstr[BUFSIZE]={0},rstr[BUFSIZE]={0},*tptr=NULL,*xptr=NULL,cc,br3flag=0; +int loop=1, j, first, aline=0, fx=_sx, fy=_sy, slen, deg=0; -int wxw=ex-sx-((preset)?120:30); //box width -int wyw=ey-sy-((preset)?60:40); //box height +int wxw=ex-_sx-((preset)?120:30); //box width +int wyw=ey-_sy-((preset)?60:40); //box height FILE *fh; @@ -25,7 +25,7 @@ FILE *fh; first=(line==0); *x=0; *y=0; -// sy+=dy; +// _sy+=dy; while((loop>0) && (fgets(tstr, sizeof(tstr), fh))) { tptr=tstr+strlen(tstr); @@ -86,15 +86,15 @@ FILE *fh; cc='&'; } else { - cc='ä'; + cc=0xA4; //ä } break; - case 'A': cc='Ä'; break; - case 'o': cc='ö'; break; - case 'O': cc='Ö'; break; - case 'u': cc='ü'; break; - case 'U': cc='Ü'; break; - case 's': cc='ß'; break; + case 'A': cc=0x84; break; + case 'o': cc=0xB6; break; + case 'O': cc=0x96; break; + case 'u': cc=0xBC; break; + case 'U': cc=0x9C; break; + case 's': cc=0x9F; break; // ß case 'q': case 'Q': cc='"'; break; case 'l': @@ -108,6 +108,7 @@ FILE *fh; } if(cc) { + rstr[j++]=0xC3; rstr[j++]=cc; } if((tptr=strchr(tptr,';'))==NULL) @@ -123,30 +124,37 @@ FILE *fh; } } } - if((loop>0) && (sy<(fy+wyw/*420*/))) + if((loop>0) && (_sy<(fy+wyw/*420*/))) { rstr[j]=0; + // printf(" # 1 # php.c %s \n",rstr); + // char *t = (char *)alloca(j * 4 + 1); + // memcpy(t, rstr, j + 1); + // TranslateString(t, j * 4); + // //strcpy(rstr, t); + // printf(" # 2 # php.c %s \n",t); if(plot) { + if(!br3flag) { - RenderString(rstr, sx, sy, wxw/*619*/, LEFT, cs, (first && highlite)?GREEN:CMCT); + RenderString(rstr, _sx, _sy, wxw/*619*/, LEFT, cs, (first && highlite)?GREEN:CMCT); } else { - RenderString(rstr, sx, fx+250, wxw/*619*/, CENTER, FSIZE_BIG, CMCT); + RenderString(rstr, _sx, fx+250, wxw/*619*/, CENTER, FSIZE_BIG, CMCT); } if(strlen(rstr)) { first=0; } - sy+=dy; + _sy+=dy; } else { if(strlen(rstr)) { - slen=GetStringLen(sx, rstr, FSIZE_MED); + slen=GetStringLen(_sx, rstr, FSIZE_MED); if(slen>*x) { *x=slen; @@ -158,15 +166,15 @@ FILE *fh; } if(plot) { - int ssy = ((preset)?80:25); - *cut=(sy>=(fy+wyw/*420*/)); + int ssx = ((preset)?80:25); + *cut=(_sy>=(fy+wyw/*420*/)); if(line) { - RenderString("<<", ssy, fy, sx, LEFT, FSIZE_MED, CMHT); + RenderString("<<", ssx, fy, _sx, LEFT, FSIZE_MED, CMHT); } if(*cut) { - RenderString(">>", ssy, sy-dy, sx, LEFT, FSIZE_MED, CMHT); + RenderString(">>", ssx, _sy-dy, _sx, LEFT, FSIZE_MED, CMHT); } } } @@ -176,11 +184,11 @@ FILE *fh; return(FH_ERROR_OK); } -int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut) +int fh_php_load(const char *name, int _sx, int _sy, int dy, int cs, int line, int highlite, int plain, int *cut) { int dummy; - return fh_php_trans(name, sx, sy, dy, cs, line, highlite, cut, &dummy, &dummy, plain, 1); + return fh_php_trans(name, _sx, _sy, dy, cs, line, highlite, cut, &dummy, &dummy, plain, 1); } diff --git a/php.h b/php.h index a5e0030..895aaa1 100644 --- a/php.h +++ b/php.h @@ -1,7 +1,7 @@ #ifndef __PHP_H__ #define __PHP_H__ -int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut); +int fh_php_load(const char *name, int _sx, int _sy, int dy, int cs, int line, int highlite, int plain, int *cut); int fh_php_getsize(const char *filename, int plain, int *x,int *y); #endif diff --git a/plugins.mk.example b/plugins.mk.example index a0d87a5..466e207 100644 --- a/plugins.mk.example +++ b/plugins.mk.example @@ -12,10 +12,14 @@ $(BIN)/tuxwetter: mkdir -p $(LIBPLUG)/ && \ mkdir -p $(VARCONF)/tuxwetter/ && \ pushd $(SOURCE)/tuxwetter && \ - $(TARGET)-gcc -Wall $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -lfreetype -lz -DWWEATHER -lcurl -ljpeg -lpng -lungif gifdecomp.c -o $@ tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c && \ + $(TARGET)-g++ -Wall -Wshadow -O2 -c pngw.cpp png_helper.cpp -I$(TARGETPREFIX)/include && \ + $(TARGET)-gcc -Wall -Wshadow -O2 -c tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c gif.c gifdecomp.c -lfreetype -lz -DWWEATHER -lcrypto -lssl -lcurl -lrtmp -ljpeg -lpng -lgif -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 && \ + $(TARGET)-g++ $(TARGET_LDFLAGS) -o tuxwetter tuxwetter.o gfx.o io.o text.o parser.o php.o http.o jpeg.o fb_display.o resize.o pngw.o png_helper.o gif.o gifdecomp.o -lfreetype -lz -lcrypto -lssl -lcurl -lrtmp -ljpeg -lpng -lgif -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 && \ + $(TARGET)-gcc -g -o tuxwetter.so starter.c -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(SOURCE_DIR)/neutrino-hd/src -O2 cp -f tuxwetter.cfg $(LIBPLUG)/tuxwetter.cfg && \ cp -f tuxwetter.conf $(VARCONF)/tuxwetter/ && \ cp -f tuxwetter.mcfg $(VARCONF)/tuxwetter/ && \ + cp -f tuxwetter.png $(VARCONF)/tuxwetter/ && \ cp -f startbild.jpg $(VARCONF)/tuxwetter/ && \ cp -f convert.list $(VARCONF)/tuxwetter/ diff --git a/png_helper.cpp b/png_helper.cpp new file mode 100644 index 0000000..5186d09 --- /dev/null +++ b/png_helper.cpp @@ -0,0 +1,20 @@ + +#include "pngw.h" + +int png_load_ext(const char *filename, unsigned char **buffer, int* xp, int* yp, int* bpp); +int fh_png_getsize(const char *filename, int *x, int *y); + +extern "C" +{ + +int png_load(const char *filename, unsigned char **buffer, int* xp, int* yp, int* bpp) +{ + return png_load_ext(filename, buffer, xp, yp, bpp); +} + +int png_getsize(const char *filename, int *x, int *y) +{ + return fh_png_getsize(filename, x, y); +} + +} diff --git a/pngw.c b/pngw.c deleted file mode 100644 index 127dd93..0000000 --- a/pngw.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * $Id: pngw.c,v 1.2 2011/02/27 14:56:10 rhabarber1848 Exp $ - * - * tuxwetter - d-box2 linux project - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * -*/ - -//#include "config.h" -#include -#include -#include -#include -#include -#include "tuxwetter.h" - -#define FH_ERROR_OK 0 -#define FH_ERROR_FILE 1 /* read/access error */ -#define FH_ERROR_FORMAT 2 /* file format error */ -#define FH_ERROR_MALLOC 3 /* error during malloc */ -#define PNG_BYTES_TO_CHECK 4 -#define min(x,y) ((x) < (y) ? (x) : (y)) - -int fh_png_id(const char *name) -{ - int fd; - char id[4]; - fd=open(name,O_RDONLY); if(fd==-1) return(0); - read(fd,id,4); - close(fd); - if(id[1]=='P' && id[2]=='N' && id[3]=='G') return(1); - return(0); -} - - -int fh_png_load(const char *name,unsigned char *buffer,int x,int y) -{ - static const png_color_16 my_background = {0, 0, 0, 0, 0}; - - png_structp png_ptr; - png_infop info_ptr; - png_uint_32 width, height; - unsigned int i; - int bit_depth, color_type, interlace_type; - int number_passes,pass; - png_byte * fbptr; - FILE * fh; - - if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); - - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); - if(png_ptr == NULL) { - fclose(fh); - return(FH_ERROR_FORMAT); - } - info_ptr = png_create_info_struct(png_ptr); - if(info_ptr == NULL) - { - png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); - fclose(fh); return(FH_ERROR_FORMAT); - } - -#if (PNG_LIBPNG_VER < 10500) - if(setjmp(png_ptr->jmpbuf)) -#else - if(setjmp(png_jmpbuf(png_ptr))) -#endif - { - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); - fclose(fh); return(FH_ERROR_FORMAT); - } - - png_init_io(png_ptr,fh); - - png_read_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL); - - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - png_set_palette_to_rgb(png_ptr); - png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - /* other possibility for png_set_background: use png_get_bKGD */ - } - - if (color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - png_set_gray_to_rgb(png_ptr); - png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } - - if (color_type & PNG_COLOR_MASK_ALPHA) - png_set_strip_alpha(png_ptr); - - if (bit_depth < 8) - png_set_packing(png_ptr); - - if (bit_depth == 16) - png_set_strip_16(png_ptr); - -/* on Intel PC ?: - if (bit_depth == 16) - png_set_swap(png_ptr); -*/ - - number_passes = png_set_interlace_handling(png_ptr); - png_read_update_info(png_ptr,info_ptr); - - if (width * 3 != png_get_rowbytes(png_ptr, info_ptr)) - { - printf("[png.cpp]: Error processing %s - please report (including image).\n", name); - return(FH_ERROR_FORMAT); - } - - for(pass = 0; pass < number_passes; pass++) - { - fbptr = (png_byte *)buffer; - for (i = 0; i < height; i++, fbptr += width * 3) - { - png_read_row(png_ptr, fbptr, NULL); - } - } - png_read_end(png_ptr, info_ptr); - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); - fclose(fh); - return(FH_ERROR_OK); -} -int fh_png_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height) -{ - png_structp png_ptr; - png_infop info_ptr; - png_uint_32 width, height; - int bit_depth, color_type, interlace_type; - FILE *fh; - - if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); - - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); - if(png_ptr == NULL) { - fclose(fh); - return(FH_ERROR_FORMAT); - } - info_ptr = png_create_info_struct(png_ptr); - if(info_ptr == NULL) - { - png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); - fclose(fh); return(FH_ERROR_FORMAT); - } - -#if (PNG_LIBPNG_VER < 10500) - if(setjmp(png_ptr->jmpbuf)) -#else - if(setjmp(png_jmpbuf(png_ptr))) -#endif - { - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); - fclose(fh); return(FH_ERROR_FORMAT); - } - - png_init_io(png_ptr,fh); - png_read_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL); - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); - *x=width; - *y=height; - fclose(fh); - return(FH_ERROR_OK); -} - diff --git a/pngw.cpp b/pngw.cpp new file mode 100644 index 0000000..3569eb2 --- /dev/null +++ b/pngw.cpp @@ -0,0 +1,237 @@ +/* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include +#include +#include +#include + +#include "pngw.h" + +#define FH_ERROR_OK 0 +#define FH_ERROR_FILE 1 /* read/access error */ +#define FH_ERROR_FORMAT 2 /* file format error */ +#define FH_ERROR_MALLOC 3 /* error during malloc */ +#define PNG_BYTES_TO_CHECK 4 +#define min(x,y) ((x) < (y) ? (x) : (y)) + +int fh_png_load(const char *name, unsigned char **buffer, int* xp, int* yp); + +int fh_png_id(const char *name) +{ + int fd; + char id[4]; + fd=open(name,O_RDONLY); if(fd==-1) return(0); + read(fd,id,4); + close(fd); + if(id[1]=='P' && id[2]=='N' && id[3]=='G') return(1); + return(0); +} + +int fh_png_load(const char *name, unsigned char **buffer, int* xp, int* yp); + +int int_png_load(const char *name, unsigned char **buffer, int* xp, int* yp, int* bpp, bool alpha) +{ + static const png_color_16 my_background = {0, 0, 0, 0, 0}; + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + unsigned int i; + int bit_depth, color_type, interlace_type, number_passes, pass, int_bpp; + png_byte * fbptr; + FILE * fh; + bool updateInfo_alreadyRead; + + if(!(fh=fopen(name,"rb"))) + return(FH_ERROR_FILE); + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if(png_ptr == NULL) { + fclose(fh); + return(FH_ERROR_FORMAT); + } + info_ptr = png_create_info_struct(png_ptr); + if(info_ptr == NULL) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_FORMAT); + } +#if (PNG_LIBPNG_VER < 10500) + if (setjmp(png_ptr->jmpbuf)) +#else + if (setjmp(png_jmpbuf(png_ptr))) +#endif + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_FORMAT); + } + png_init_io(png_ptr,fh); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); + updateInfo_alreadyRead = false; + if (alpha) // 24bit or gray scale PNGs with alpha-channel + { + *bpp = png_get_channels(png_ptr, info_ptr); + if ((*bpp == 2) && (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) { + if (bit_depth < 8) { + /* Extract multiple pixels with bit depths of 1, 2, and 4 + from a single byte into separate bytes + (useful for paletted and grayscale images). */ + png_set_packing(png_ptr); + /* Expand grayscale images to the full 8 bits + from 1, 2, or 4 bits/pixel */ +#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR <= 2 && PNG_LIBPNG_VER_RELEASE < 9 + png_set_gray_1_2_4_to_8(png_ptr); +#else + png_set_expand_gray_1_2_4_to_8(png_ptr); +#endif + } + /* Expand the grayscale to 24-bit RGB if necessary. */ + png_set_gray_to_rgb(png_ptr); + /* Update the users info structure */ + png_read_update_info(png_ptr, info_ptr); + updateInfo_alreadyRead = true; + *bpp = png_get_channels(png_ptr, info_ptr); + if (*bpp != 4) { + /* No 4 channels found + load PNG without alpha channel */ + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return fh_png_load(name, buffer, xp, yp); + } + } + else if ((*bpp != 4) || !(color_type & PNG_COLOR_MASK_ALPHA)) { + /* No 4 channels & not an alpha channel found + load PNG without alpha channel */ + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return fh_png_load(name, buffer, xp, yp); + } + int_bpp = 4; + + /* Expand paletted or RGB images with transparency + to full alpha channels so the data will + be available as RGBA quartets. */ + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + }else // All other PNGs + { + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_set_palette_to_rgb(png_ptr); + png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + /* other possibility for png_set_background: use png_get_bKGD */ + } + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + png_set_gray_to_rgb(png_ptr); + png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } + /* this test does not trigger for 8bit-paletted PNGs with newer libpng (1.2.36 at least), + but the data delivered is with alpha channel anyway, so always strip alpha for now + */ +#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR <= 2 && PNG_LIBPNG_VER_RELEASE < 36 + if (color_type & PNG_COLOR_MASK_ALPHA) +#endif + png_set_strip_alpha(png_ptr); + if (bit_depth < 8) + png_set_packing(png_ptr); + int_bpp = 3; + } + if (bit_depth == 16) + png_set_strip_16(png_ptr); + number_passes = png_set_interlace_handling(png_ptr); + /* Update the users info structure */ + if (updateInfo_alreadyRead == 0) + png_read_update_info(png_ptr,info_ptr); + unsigned long rowbytes = png_get_rowbytes(png_ptr, info_ptr); + if (width * int_bpp != rowbytes) + { + printf("[pngw.cpp]: Error processing %s - please report (including image).\n", name); + printf(" width: %lu rowbytes: %lu\n", (unsigned long)width, (unsigned long)rowbytes); + fclose(fh); + return(FH_ERROR_FORMAT); + } + for (pass = 0; pass < number_passes; pass++) + { + fbptr = (png_byte *)(*buffer); + for (i = 0; i < height; i++, fbptr += width * int_bpp) + png_read_row(png_ptr, fbptr, NULL); + } + png_read_end(png_ptr, info_ptr); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_OK); +} + +int png_load_ext(const char *name, unsigned char **buffer, int* xp, int* yp, int* bpp) +{ + return int_png_load(name, buffer, xp, yp, bpp, true); +} + +int fh_png_load(const char *name, unsigned char **buffer, int* xp, int* yp) +{ + return int_png_load(name, buffer, xp, yp, NULL, false); +} + +int fh_png_getsize(const char *name,int *x,int *y) +{ + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + int bit_depth, color_type, interlace_type; + FILE *fh; + + if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); + if(png_ptr == NULL) { + fclose(fh); + return(FH_ERROR_FORMAT); + } + info_ptr = png_create_info_struct(png_ptr); + if(info_ptr == NULL) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_FORMAT); + } + +#if (PNG_LIBPNG_VER < 10500) + if (setjmp(png_ptr->jmpbuf)) +#else + if (setjmp(png_jmpbuf(png_ptr))) +#endif + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_FORMAT); + } + + png_init_io(png_ptr,fh); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + *x=width; + *y=height; + fclose(fh); + return(FH_ERROR_OK); +} diff --git a/pngw.h b/pngw.h index 60dac18..a09901a 100644 --- a/pngw.h +++ b/pngw.h @@ -1,7 +1,4 @@ /* - * $Id: pngw.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ - * - * tuxwetter - d-box2 linux project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +19,16 @@ #ifndef __PNGW_H__ #define __PNGW_H__ -int fh_png_load(const char *filename, unsigned char *buffer, int x, int y); -int fh_png_getsize(const char *filename, int *x, int *y, int wanted_width, int wanted_height); +#ifdef __cplusplus +extern "C" +{ +#endif + +int png_load(const char *filename, unsigned char **buffer, int* xp, int* yp, int* bpp); +int png_getsize(const char *filename, int *x, int *y); +#ifdef __cplusplus +} #endif + +#endif // __PNGW_H__ diff --git a/resize.c b/resize.c index 8815623..89d9452 100644 --- a/resize.c +++ b/resize.c @@ -21,7 +21,9 @@ #include #include +#include +#if 0 unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy) { // dbout("simple_resize{\n"); @@ -51,42 +53,84 @@ unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy) // dbout("simple_resize}\n"); return(cr); } +#endif -unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy) +unsigned char * color_average_resize(unsigned char * orgin, int ox, int oy, int dx, int dy, int alpha) { -// dbout("color_average_resize{\n"); +#if DEBUG +printf(" COLOR_AVERAGE_RESIZE in\n"); +#endif unsigned char *cr,*p,*q; - int i,j,k,l,xa,xb,ya,yb; - int sq,r,g,b; - cr=(unsigned char*) malloc(dx*dy*3); + int i,j,k,l,ya,yb; + int sq,r,g,b,a; + cr = (unsigned char*) malloc(dx * dy * ((alpha) ? 4 : 3)); if(cr==NULL) { printf("Error: malloc\n"); -// dbout("color_average_resize}\n"); return(orgin); } p=cr; - for(j=0;j=ox) + xb_v[i]=ox-1; + } + + if (alpha) + { + for(j=0;j=oy) yb=oy-1; + for(i=0;i=ox) xb=ox-1; - yb=(j+1)*oy/dy; if(yb>=oy) yb=oy-1; - for(l=ya,r=0,g=0,b=0,sq=0;l<=yb;l++) + ya= j*oy/dy; + yb= (j+1)*oy/dy; if(yb>=oy) yb=oy-1; + for(i=0;i #define SCRIPT "tuxwetter" -int main() +void main() { int ret, pid, status; pid=fork(); diff --git a/text.c b/text.c index 2fa3f5a..66f9127 100644 --- a/text.c +++ b/text.c @@ -2,24 +2,151 @@ #include "gfx.h" #include "io.h" +extern void blit(); + int FSIZE_BIG=28; int FSIZE_MED=24; int FSIZE_SMALL=20; int FSIZE_VSMALL=16; int TABULATOR=72; -unsigned sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={'ä','ö','ü','Ä','Ö','Ü','ß','°'}; + +static char *sc = "aouAOUzd", + *su = "\xA4\xB6\xBC\x84\x96\x9C\x9F", + *tc = "\xE4\xF6\xFC\xC4\xD6\xDC\xDF\xB0"; + +// 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)) + { + int remaining_unicode_length; + if ((((unsigned char)(*text)) & 0xf8) == 0xf0) { + unicode_value = ((unsigned char)(*text)) & 0x07; + remaining_unicode_length = 3; + } else if ((((unsigned char)(*text)) & 0xf0) == 0xe0) { + 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 { + (*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) +{ +//printf("--> translate String\n"); + 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++ = *fptr++; + } + *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 (*fptr == 'd') { + *tptr++ = 0xC2; + *tptr++ = 0xb0; + fptr++; + } else if (sc[i]) { + *tptr++ = 0xC3; + *tptr++ = su[i]; + 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, FT_Face *aface) { FT_Error result; - result = FT_New_Face(library, face_id, 0, aface); + result = FT_New_Face(lib, face_id, 0, aface); - if(result) printf("msgbox \n", (char*)face_id); + if(result) + printf("tuxwetter \n", (char*)face_id); return result; } @@ -27,292 +154,268 @@ FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer requ /****************************************************************************** * RenderChar ******************************************************************************/ +struct colors_struct +{ + uint32_t fgcolor, bgcolor; + uint32_t colors[256]; +}; -int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color) +#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) { -// 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; + 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; - //load char - - if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) + if (currentchar == '\r') // display \r in windows edited files + { + if(color != -1) { -// printf("msgbox \n", (int)currentchar, error); - return 0; - } - -// no kerning used -/* - if(use_kerning) - { - FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); + //load char - prev_glyphindex = glyphindex; - kerning.x >>= 6; - } - else -*/ - kerning.x = 0; + if(!(glyphindex = FT_Get_Char_Index(face, currentchar))) + { + printf("tuxwetter \n", (int)currentchar, error); + return 0; + } - if(color != -1) /* don't render char, return charwidth only */ - { - if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */ + 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; + } - for(row = 0; row < sbit->height; row++) - { - for(pitch = 0; pitch < sbit->pitch; pitch++) - { - for(bit = 7; bit >= 0; bit--) - { - if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */ + if(use_kerning) + { + FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); - if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4); + prev_glyphindex = glyphindex; + kerning.x >>= 6; + } else + kerning.x = 0; - x++; - } - } + //render char - x = 0; - y++; + 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(int sx, char *string, int size) +int GetStringLen(int _sx, char *_string, size_t size) { -int i, found; -int stringlen = 0; + int i, stringlen = 0; + int len = strlen(_string); + char *string = alloca(4 * len + 1); + strcpy(string, _string); + TranslateString(string, len * 4 + 1); //reset kerning - prev_glyphindex = 0; + prev_glyphindex = 0; //calc len - if(size) - { + if (size) desc.width = desc.height = size; - } - - while(*string != '\0') - { - if(*string != '~') - { - stringlen += RenderChar(*string, -1, -1, -1, -1); - } - else - { - string++; - if(*string=='t') - { - stringlen=desc.width+TABULATOR*((int)(stringlen/TABULATOR)+1); - } - else - { - if(*string=='T') - { - if(sscanf(string+1,"%4d",&i)==1) - { - string+=4; - stringlen=i-sx; - } - } - else - { - found=0; - for(i=0; i maxwidth */ - sx += charwidth; - } - else - { - switch(*rptr) - { - case 'R': varcolor=RED; break; - case 'G': varcolor=GREEN; break; - case 'Y': varcolor=YELLOW; break; - case 'B': varcolor=BLUE0; 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 - { - 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) - { - // 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)); + while(*rptr) { + if(*rptr=='~') { + ++rptr; + switch(*rptr) { + case 'R': varcolor=RED; break; + case 'G': varcolor=GREEN; break; + case 'Y': varcolor=YELLOW; break; + case 'B': varcolor=BLUE0; break; + case 'S': varcolor=color; break; + case 't': + _sx=TABULATOR*((int)(_sx/TABULATOR)+1); + rptr++; + continue; + case 'T': + if(sscanf(rptr+1,"%4d",&i)==1) { + rptr+=4; + _sx=i; } - } - if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */ - sx += charwidth; + rptr++; + continue; } - rptr++; + if((charwidth = RenderChar('~', _sx, _sy, _ex, varcolor)) == -1) return _sx; /* string > maxwidth */ + _sx += charwidth; } + if((charwidth = RenderChar(UTF8ToUnicode(&rptr, 1), _sx, _sy, _ex, varcolor)) == -1) return _sx; /* string > maxwidth */ + _sx += charwidth; + } return stringlen; } @@ -322,8 +425,8 @@ int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int siz void ShowMessage(char *message, int wait) { - extern int radius; - int mxw=400, myw=120+40*wait, mhw=30; + extern int radius, radius_small; + int mxw=420, myw=120+40*wait, mhw=30; int msx,msy; char *tdptr; @@ -331,68 +434,28 @@ void ShowMessage(char *message, int wait) //layout - RenderBox(msx, msy, mxw, myw, radius, CMH); - RenderBox(msx+2, msy+2, mxw-4, myw-4, radius, CMC); + RenderBox(msx+6, msy+6, mxw, myw, radius, CSP0); + RenderBox(msx, msy, mxw, myw, radius, CMC); RenderBox(msx, msy, mxw, mhw, radius, CMH); //message tdptr=strdup("Tuxwetter Info"); - RenderString(tdptr, msx+2, msy+(mhw-4), mxw-4, CENTER, FSIZE_MED, CMHT); + RenderString(tdptr, msx+2, msy+mhw, mxw-4, CENTER, FSIZE_MED, CMHT); free(tdptr); tdptr=strdup(message); - RenderString(tdptr, msx+2, msy+mhw+((myw-mhw)/2)-FSIZE_MED/2+(!wait*15), mxw-4, CENTER, FSIZE_MED, CMCT); + RenderString(tdptr, msx+2, msy+mhw+2+((myw-mhw)/2)-FSIZE_MED/2+(!wait*15), mxw-4, CENTER, FSIZE_MED, CMCT); free(tdptr); if(wait) { - RenderBox(msx+mxw/2-25, msy+myw-45, 50, FSIZE_SMALL*3/2, radius, CMCS); - RenderString("OK", msx+mxw/2-26, msy+myw-42+FSIZE_SMALL, 50, CENTER, FSIZE_SMALL, CMCT); + RenderBox(msx+mxw/2-35+4, msy+myw-45+4, 70, FSIZE_SMALL*3/2, radius_small, CSP0); + RenderBox(msx+mxw/2-35, msy+myw-45, 70, FSIZE_SMALL*3/2, radius_small, CMCS); + RenderString("OK", msx+mxw/2-26, msy+myw-38+FSIZE_SMALL, 50, CENTER, FSIZE_SMALL, CMCT); } - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - - while(wait && (GetRCCode() != KEY_OK)); - + blit(); -} + while(wait && (GetRCCode(-1) != KEY_OK)); -void TranslateString(char *src) -{ -int i,found; -char rc,*rptr=src,*tptr=src; - while(*rptr != '\0') - { - if(*rptr=='~') - { - ++rptr; - rc=*rptr; - found=0; - for(i=0; i %d\n",tstr,entry,cfptr,rv); } fclose(nfh); @@ -300,6 +314,11 @@ int ReadConf(char *iscmd) if((line_buffer[0]) && (line_buffer[0]!='#') && (!isspace(line_buffer[0])) && ((cptr=strchr(line_buffer,'='))!=NULL)) { + int neutrinofont = Read_Neutrino_Cfg("font_file="); + if(neutrinofont!=1 && strstr(line_buffer, "FONT=") == line_buffer) + { + strcpy(FONT,strchr(line_buffer,'=')+1); + } if(strstr(line_buffer,"SplashScreen") == line_buffer) { sscanf(cptr+1,"%d",&show_splash); @@ -310,11 +329,11 @@ int ReadConf(char *iscmd) } if(strstr(line_buffer,"ProxyAdressPort") == line_buffer) { - proxyadress=(unsigned char*)strdup(cptr+1); + proxyadress=strdup(cptr+1); } if(strstr(line_buffer,"ProxyUserPwd") == line_buffer) { - proxyuserpwd=(unsigned char*)strdup(cptr+1); + proxyuserpwd=strdup(cptr+1); } if(strstr(line_buffer,"ConnectTimeout") == line_buffer) { @@ -354,7 +373,7 @@ int ReadConf(char *iscmd) return 1; } -int PaintWideString(int dy/*linespace*/, const char *string, int sx, int sy, int maxwidth, int layout, int size, int color) +int PaintWideString(int dy/*linespace*/, const char *string, int _sx, int _sy, int maxwidth, int layout, int size, int color) { char vstr[512]={0},tstr[512]={0}; int tc = 0; @@ -369,8 +388,8 @@ int PaintWideString(int dy/*linespace*/, const char *string, int sx, int sy, int tstr[tc+1]= '\0'; tc=-1; - int tl = GetStringLen(sx, tstr, size); - int vl = GetStringLen(sx, vstr, size); + int tl = GetStringLen(_sx, tstr, size); + int vl = GetStringLen(_sx, vstr, size); if((vl+tl) < maxwidth) { //add to line @@ -380,8 +399,8 @@ int PaintWideString(int dy/*linespace*/, const char *string, int sx, int sy, int else { //new line TrimString(vstr); - RenderString(vstr, sx, sy, maxwidth, layout, size, color); - sy+=dy; + RenderString(vstr, _sx, _sy, maxwidth, layout, size, color); + _sy+=dy; vstr[0]= '\0'; strcat(vstr,tstr); @@ -400,17 +419,17 @@ int PaintWideString(int dy/*linespace*/, const char *string, int sx, int sy, int strcat(vstr,tstr); TrimString(vstr); - RenderString(vstr, sx, sy, maxwidth, layout, size, color); + RenderString(vstr, _sx, _sy, maxwidth, layout, size, color); - return(sy); + return(_sy); } int Transform_Entry(char *src, char *trg) { int tret=-1,fcnt,fpos,tval,ferr,tsub; int noprint,rndval,loctime=0; -char /*pstr[512]={0},nstr[512]={0},dstr[50]={0},*/fstr[5]={0},*cptr,*tptr,*aptr; -time_t stime; +char fstr[5]={0},*cptr,*tptr,*aptr; +time_t subtime; struct tm *tltime; tsub=0; @@ -461,15 +480,15 @@ struct tm *tltime; } } } - time(&stime); - stime-=tsub; + time(&subtime); + subtime-=tsub; if(loctime) { - tltime=localtime(&stime); + tltime=localtime(&subtime); } else { - tltime=gmtime(&stime); + tltime=gmtime(&subtime); } fpos=0; @@ -617,6 +636,7 @@ FILE *fh; { while(fgets(line_buffer, BUFSIZE, fh)) { + TranslateString(line_buffer, BUFSIZE); TrimString(line_buffer); if(strstr(line_buffer,TYPESTR[TYP_MENU])==line_buffer) { @@ -784,7 +804,7 @@ char *lcptr = NULL, *lcstr= NULL, *lcdptr = NULL; } LCD_update(); #endif - switch((rccode = GetRCCode())) + switch(rccode = GetRCCode(-1)) { case KEY_RED: m->act_entry=(m->act_entry/10)*10; @@ -1117,8 +1137,9 @@ FILE *fh; void ShowInfo(MENU *m) { + int iw, ih, icon_w=0, icon_h=0, xsize=0, ysize=0, loop; double scrollbar_len, scrollbar_ofs, scrollbar_cor; - int loop, index=m->act_entry,tind=m->act_entry, sbw=(m->num_entrys > LIST_STEP)?14:0; + int ix=m->act_entry,tind=m->act_entry, sbw=(m->num_entrys > LIST_STEP)?14:0; char tstr[BUFSIZE]={0}, *tptr=NULL; int moffs=35, roffs=8, ixw=400, iyw=(m->num_entrys < LIST_STEP)?((m->num_entrys+1)*30+moffs):375, dy, my, mh, toffs, soffs=4, isx, isy; @@ -1129,18 +1150,16 @@ void ShowInfo(MENU *m) Center_Screen(ixw, iyw, &isx, &isy); - tind=index; + tind=ix; //frame layout + RenderBox(isx+6, isy+6, ixw, iyw, radius, CSP0); RenderBox(isx, isy, ixw, iyw, radius, CMC); -// RenderBox(0, 0, ixw, iyw, GRID, CMCS); - // titlebar - RenderBox(isx+2, isy-2, ixw-2, moffs+roffs, radius, CMH); + RenderBox(isx, isy, ixw, moffs+roffs, radius, CMH); //selectbar - RenderBox(isx+2, isy+moffs+toffs+soffs+(index%10)*dy+2, ixw-sbw-2, dy+2, radius, CMCS); - + RenderBox(isx+2, isy+moffs+toffs+soffs+(ix%10)*dy+2, ixw-sbw-2, dy+2, radius, CMCS); if(sbw) { @@ -1148,27 +1167,36 @@ void ShowInfo(MENU *m) RenderBox(isx+ixw-sbw, isy+moffs+roffs, sbw, mh, radius, CMCP1); //slider scrollbar_len = (double)(mh-4) / (double)(((m->num_entrys-1)/LIST_STEP+1)*LIST_STEP); - scrollbar_ofs = scrollbar_len*(double)((index/LIST_STEP)*LIST_STEP)+roffs; + scrollbar_ofs = scrollbar_len*(double)((ix/LIST_STEP)*LIST_STEP)+roffs; scrollbar_cor = scrollbar_len*(double)LIST_STEP; RenderBox(isx+ixw-sbw+2, isy+moffs+scrollbar_ofs+2, sbw-4, scrollbar_cor, radius, CMCP3); } + png_getsize(TUX_ICON, &icon_w, &icon_h); + // limit icon size + if(icon_w > 32 || icon_h > 32) { + icon_w = xsize = 32; + icon_h = ysize = 32; + } + multiple_pics=1; + paintIcon(TUX_ICON, isx+44-icon_w/2, (isy+dy-soffs+11)-icon_h/2, xsize, ysize, &iw, &ih); + // Title text - RenderString(m->headertxt[m->act_header], isx+45, isy+dy-soffs+3, ixw-sbw-45, LEFT, FSIZE_BIG, CMHT); + RenderString(m->headertxt[m->act_header], isx+47, isy+dy-soffs+11, ixw-sbw-45, LEFT, FSIZE_BIG, CMHT); - index /= 10; + ix /= 10; //Show table of commands - for(loop = index*10; (loop < (index+1)*10) && (loop < m->num_entrys); ++loop) + for(loop = ix*10; (loop < (ix+1)*10) && (loop < m->num_entrys); ++loop) { strcpy(tstr,m->list[loop]->entry); if((tptr=strchr(tstr,','))!=NULL) { *tptr=0; } - RenderString(tstr, isx+45, isy+my, ixw-sbw-65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); + RenderString(tstr, isx+47, isy+my+7, ixw-sbw-65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); if(m->list[loop]->type==TYP_MENU) { - RenderString(">", isx+30, isy+my, 65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); + RenderString(">", isx+32, isy+my+7, 65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); } if(m->list[loop]->underline) { @@ -1176,28 +1204,25 @@ void ShowInfo(MENU *m) RenderBox(isx+10, isy+my+soffs+3, ixw-10-sbw, my+soffs+3, 0, CMCP1); } + icon_w = icon_h = 0; + png_getsize(ICON_BUTTON_RED, &icon_w, &icon_h); + //multiple_pics=1; switch(loop % 10) { - case 0: RenderCircle(isx+9,isy+my-15,RED); break; - case 1: RenderCircle(isx+9,isy+my-15,GREEN); break; - case 2: RenderCircle(isx+9,isy+my-15,YELLOW); break; - case 3: RenderCircle(isx+9,isy+my-15,BLUE0); break; -/* - case 0: PaintIcon("/share/tuxbox/neutrino/icons/rot.png" ,isx+25,isy+my-17, 16, 16); break; - case 1: PaintIcon("/share/tuxbox/neutrino/icons/gruen.png",isx+25,isy+my-17, 16, 16); break; - case 2: PaintIcon("/share/tuxbox/neutrino/icons/gelb.png" ,isx+25,isy+my-17, 16, 16); break; - case 3: PaintIcon("/share/tuxbox/neutrino/icons/blau.png" ,isx+25,isy+my-17, 16, 16); break; -*/ + case 0: paintIcon(ICON_BUTTON_RED, isx+42-icon_w/2, isy+my-9+(icon_h)/2, 0, 0, &iw, &ih); break; + case 1: paintIcon(ICON_BUTTON_GREEN, isx+42-icon_w/2, isy+my-9+(icon_h)/2, 0, 0, &iw, &ih); break; + case 2: paintIcon(ICON_BUTTON_YELLOW,isx+42-icon_w/2, isy+my-9+(icon_h)/2, 0, 0, &iw, &ih); break; + case 3: paintIcon(ICON_BUTTON_BLUE, isx+42-icon_w/2, isy+my-9+(icon_h)/2, 0, 0, &iw, &ih); break; default: sprintf(tstr,"%1d",(loop % 10)-3); - RenderString(tstr, isx+10, isy+my-1, 15, CENTER, FSIZE_SMALL, ((loop%10) == (tind%10))?CMCST:CMCT); + RenderString(tstr, isx+10, isy+my+4, 15, CENTER, FSIZE_SMALL, ((loop%10) == (tind%10))?CMCST:CMCT); break; - } my += dy; } + multiple_pics=0; //copy backbuffer to framebuffer - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + blit(); } @@ -1234,7 +1259,7 @@ int res; } else { - ShowMessage(prs_translate("Ungültige Daten aus tuxwetter.conf",CONVERT_LIST),1); + ShowMessage(prs_translate("Ungültige Daten aus tuxwetter.conf",CONVERT_LIST),1); city_code[0]=0; return 1; } @@ -1244,13 +1269,11 @@ int res; void clear_screen(void) { - memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + clearBB(); + blit(); } - - -void show_data(int index) +void show_data(int ix) { #ifndef WWEATHER char *pt1 = NULL; @@ -1262,7 +1285,7 @@ int col1=40, vy=70; int col2=((preset)?340:300); int wxw=ex-sx-((preset)?120:30); //box width -int wyw=ey-sy-((preset)?50:40); //box height +int wyw=ey-sy-((preset)?60:20); //box height int nc=10; //table columns int gys=vy; //table space top int gysf=34; //table space bottom @@ -1300,11 +1323,12 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; gyw+=wsy; col1+=wsx; col2+=wsx; - vy+=wsy; + vy+=wsy+8; //frame layout - if(index!=1) + if(ix!=1) { + RenderBox(wsx+6, wsy+6, wxw, wyw, radius, CSP0); RenderBox(wsx, wsy, wxw, wyw, radius, CMC); RenderBox(wsx+2, wsy+2, wxw-4, 44, radius, CMH); } @@ -1326,20 +1350,20 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; sprintf(iun,"inch"); *cun=0; // Uhrzeit } - if(index==-99) + if(ix==-99) { int i; - unsigned char grstr[XL+1]={'G'^XX,'r'^XX,'\xFC'^XX,'\xDF'^XX,'e'^XX,' '^XX,'v'^XX,'o'^XX,'m'^XX,' '^XX,'N'^XX,'e'^XX,'w'^XX,'-'^XX,'T'^XX,'u'^XX,'x'^XX,'w'^XX,'e'^XX,'t'^XX,'t'^XX,'e'^XX,'r'^XX,'-'^XX,'T'^XX,'e'^XX,'a'^XX,'m'^XX,'!'^XX,' '^XX,' '^XX,';'^XX,'-'^XX,')'^XX,' '^XX,' '^XX,'w'^XX,'w'^XX,'w'^XX,'.'^XX,'k'^XX,'e'^XX,'y'^XX,'w'^XX,'e'^XX,'l'^XX,'t'^XX,'-'^XX,'b'^XX,'o'^XX,'a'^XX,'r'^XX,'d'^XX,'.'^XX,'c'^XX,'o'^XX,'m'^XX,0}; + char grstr[XL+1]={'G'^XX,'r'^XX,'\xFC'^XX,'\xDF'^XX,'e'^XX,' '^XX,'v'^XX,'o'^XX,'m'^XX,' '^XX,'N'^XX,'e'^XX,'w'^XX,'-'^XX,'T'^XX,'u'^XX,'x'^XX,'w'^XX,'e'^XX,'t'^XX,'t'^XX,'e'^XX,'r'^XX,'-'^XX,'T'^XX,'e'^XX,'a'^XX,'m'^XX,'!'^XX,' '^XX,' '^XX,';'^XX,'-'^XX,')'^XX,' '^XX,' '^XX,'w'^XX,'w'^XX,'w'^XX,'.'^XX,'k'^XX,'e'^XX,'y'^XX,'w'^XX,'e'^XX,'l'^XX,'t'^XX,'-'^XX,'b'^XX,'o'^XX,'a'^XX,'r'^XX,'d'^XX,'.'^XX,'c'^XX,'o'^XX,'m'^XX,0}; dy = ((preset)?dy:22); sprintf(rstr,"Tuxwetter Version %s%s",P_VERSION,S_VERSION); - RenderString(rstr, wsx, wsy+34, wxw, CENTER, FSIZE_BIG, CMHT); + RenderString(rstr, wsx, wsy+40, wxw, CENTER, FSIZE_BIG, CMHT); - sprintf(rstr,"%s",prs_translate("Steuertasten in den Menüs",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Steuertasten in den Menüs",CONVERT_LIST)); RenderString(rstr, 0, vy, wxw, CENTER, HMED, GREEN); vy+=dy; - sprintf(rstr,"%s",prs_translate("Farbtasten Rot, Grün, Gelb, Blau",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Farbtasten Rot, Grün, Gelb, Blau",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); sprintf(rstr,"%s",prs_translate("Direktanwahl Funktionen 1-4",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); @@ -1353,43 +1377,43 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; sprintf(rstr,"%s",prs_translate("Hoch",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("vorheriger Menüeintrag",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("vorheriger Menüeintrag",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("nächster Menüeintrag",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("nächster Menüeintrag",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; - sprintf(rstr,"%s",prs_translate("PgDown (bei mehrseitigen Menüs)",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("PgDown (bei mehrseitigen Menüs)",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("eine Seite vorblättern",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("eine Seite vorblättern",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; - sprintf(rstr,"%s",prs_translate("PgUp (bei mehrseitigen Menüs)",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("PgUp (bei mehrseitigen Menüs)",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("eine Seite zurückblättern",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("eine Seite zurückblättern",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; sprintf(rstr,"%s",prs_translate("OK",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("Menüpunkt ausführen",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Menüpunkt ausführen",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; sprintf(rstr,"%s",prs_translate("Home",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("zurück zum vorigen Menü",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("zurück zum vorigen Menü",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; - sprintf(rstr,"%s",prs_translate("MENU-Taste (im Hauptmenü)",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("MENU-Taste (im Hauptmenü)",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("fehlende Übersetzungen anzeigen",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("fehlende Übersetzungen anzeigen",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; @@ -1411,13 +1435,13 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("nächsten Eintrag anzeigen",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("nächsten Eintrag anzeigen",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; sprintf(rstr,"%s",prs_translate("Links (in Bildanzeige)",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("neu downloaden (für WebCams)",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("neu downloaden (für WebCams)",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; @@ -1427,15 +1451,15 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; - sprintf(rstr,"%s",prs_translate("Rot (in fehlenden Übersetzungen)",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Rot (in fehlenden Übersetzungen)",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("Fehlliste löschen",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Fehlliste löschen",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=dy; sprintf(rstr,"%s",prs_translate("OK / Home",CONVERT_LIST)); RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); - sprintf(rstr,"%s",prs_translate("Aktuelle Anzeige schließen",CONVERT_LIST)); + sprintf(rstr,"%s",prs_translate("Aktuelle Anzeige schließen",CONVERT_LIST)); RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); vy+=(1.5*(double)dy); @@ -1443,25 +1467,26 @@ char tun[2]="C",sun[5]="km/h",dun[6]="km",pun[5]="hPa",iun[7]="mm", cun[20]; { grstr[i]^=XX; } - RenderString((char*)grstr, 0, vy, wxw, CENTER, HMED, CMHT); - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); - rcd=GetRCCode(); + RenderString(grstr, 0, vy, wxw, CENTER, HMED, CMHT); + blit(); + + rcd=GetRCCode(-1); while((rcd != KEY_OK) && (rcd != KEY_EXIT)) { - rcd=GetRCCode(); + rcd=GetRCCode(-1); } } else { - if(index==1) + if(ix==1) { int i, tmax[nc], tmin[nc], mint=100, maxt=-100, j, pmin, pmax; double tstep=1, garr[nc*10], tv1, tv2, tv3; RenderBox(wsx, wsy, wxw, wyw, radius, CMC); RenderBox(wsx, wsy, wxw, 44, radius, CMH); - sprintf(rstr,"%s %d %s",prs_translate("Trend für die kommende Woche",CONVERT_LIST),nc,prs_translate("Tage",CONVERT_LIST)); - RenderString(rstr, wsx, wsy+34, wxw, CENTER, FSIZE_BIG, CMHT); + sprintf(rstr,"%s %d %s",prs_translate("Trend für die kommende Woche",CONVERT_LIST),nc,prs_translate("Tage",CONVERT_LIST)); + RenderString(rstr, wsx, wsy+40, wxw, CENTER, FSIZE_BIG, CMHT); RenderLine(gxs,gys,gxs,gys+gyw+gywf,CMCIT); RenderLine(gxs+1,gys,gxs+1,gys+gyw+gywf,CMCIT); for(i=0; i (ex-xstart)) txsize= (ex-xstart); - else txsize= xsize; - if (ysize > (ey-ystart)) tysize= (ey-ystart); - else tysize=ysize; - xfact= 1000*txsize/x1; - xfact= xfact/1000; - yfact= 1000*tysize/y1; - yfact= yfact/1000; - - if ( xfact <= yfact) - { - *imx=(int)x1*xfact; - *imy=(int)y1*xfact; - if (center !=0) - { - tystart=(ey-sy)-*imy; - tystart=tystart/2; - tystart=tystart+ystart; - } - } - else - { - *imx=(int)x1*yfact; - *imy=(int)y1*yfact; - if (center !=0) - { - txstart=(ex-sx)-*imx; - txstart=txstart/2; - txstart=txstart+xstart; - } - } - *buffer=(unsigned char*)color_average_resize(*buffer,x1,y1,*imx,*imy); - - *dxp=0; - *dyp=0; - *dxo=txstart; - *dyo=tystart; -} - void close_jpg_gif_png(void) { #if 0 @@ -2280,27 +2255,27 @@ void close_jpg_gif_png(void) // memcpy(&otr,&rtr,256); ioctl(fb, FBIOPUTCMAP, oldcmap); // for(; sy <= ey; sy++) memset(lbb + sx + var_screeninfo.xres*(sy),TRANSP, ex-sx + 1); - memset(lbb, TRANSP, var_screeninfo.xres*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, fix_screeninfo.line_length*var_screeninfo.yres*sizeof(uint32_t)); #endif gmodeon=0; } -int wait_image(int repeat, int first) +int wait_image(int repeat, int first __attribute__((unused))) { time_t t1,t2; int rv; if(!repeat) { - rv=GetRCCode(); + rv=GetRCCode(1000); return rv; } time(&t1); t2=t1; while((t2-t1)\n"); return -1; @@ -2391,11 +2366,12 @@ unsigned char *buffer=NULL; printf(NOMEM); return -1; } - if(!(rv=fh_png_load(name, buffer, x1, y1))) + if(!(rv=png_load(name, &buffer, &x1, &y1, &bpp))) { - scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + alpha=(bpp==4)?1:0; + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center,alpha); fb_set_gmode(1); - fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1, alpha); gmodeon=1; } free(buffer); @@ -2414,7 +2390,6 @@ unsigned char *buffer=NULL; else { showBusy(startx+3,starty+3,10,0xff,00,00); -// showBusy(startx+10,starty+10,20,170,0,0); if(rcn==KEY_EXIT) { rcn=KEY_OK; @@ -2434,7 +2409,8 @@ int show_gif(char *name, int xstart, int ystart, int xsize, int ysize, int wait, FILE *tfh; int x1,y1,rcg,count,cloop,rv=-1; int imx,imy,dxo,dyo,dxp,dyp; -char *buffer=NULL, fname[512]; +char fname[512]; +unsigned char *buffer=NULL; if((tfh=fopen(name,"r"))!=NULL) { @@ -2462,16 +2438,16 @@ char *buffer=NULL, fname[512]; printf("Tuxwetter \n"); return -1; } - if((buffer=(char *) malloc(x1*y1*4))==NULL) + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) { printf(NOMEM); return -1; } if(!(rv=fh_gif_load(fname, buffer, x1, y1))) { - scale_pic((unsigned char**)&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center,0/*alpha*/); fb_set_gmode(1); - fb_display((unsigned char*)buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1, 0/*alpha*/); gmodeon=1; if(gifs>1) @@ -2498,7 +2474,6 @@ char *buffer=NULL, fname[512]; else { showBusy(startx+3,starty+3,10,0xff,00,00); - if(rcg==KEY_EXIT) { rcg=KEY_OK; @@ -2511,19 +2486,19 @@ char *buffer=NULL, fname[512]; return (rv)?-1:0; } -int pic_on_data(char *url, int xstart, int ystart, int xsize, int ysize, int wait, int single, int center, int rahmen) +int pic_on_data(char *url __attribute__((unused)), int xstart, int ystart, int xsize, int ysize, int wait __attribute__((unused)), int single, int center, int rahmen) { FILE *tfh; -int /*i,*/x1,y1,rv=-1; +int x1,y1,rv=-1; int imx,imy,dxo,dyo,dxp,dyp; unsigned char *buffer=NULL/*,*gbuf*/; -unsigned char *tbuf=lfb; +//unsigned char *tbuf=lfb; if((tfh=fopen(ICON_FILE,"r"))!=NULL) { fclose(tfh); - lfb=lbb; + //lfb=lbb; if(fh_gif_getsize(ICON_FILE, &x1, &y1, xsize, ysize)) { @@ -2537,13 +2512,12 @@ unsigned char *tbuf=lfb; return -1; } - if(!(rv=fh_gif_load(ICON_FILE, (char *)buffer, x1, y1))) + if(!(rv=fh_gif_load(ICON_FILE, buffer, x1, y1))) { - scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center,0/*alpha*/); if (rahmen >0) { RenderBox(xstart+1-sx-rahmen, ystart-6-sy-rahmen,xstart+xsize+2-sx+rahmen,ystart+ysize-sy-6+rahmen, 0, CMCS); -// memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); } if(single & 2) @@ -2552,7 +2526,7 @@ unsigned char *tbuf=lfb; #if 0 // don't know what this is about #ifndef HAVE_DREAMBOX_HARDWARE - i=fix_screeninfo.line_length*var_screeninfo.yres; + i=fix_screeninfo.line_length*var_screeninfo.yres*sizeof(uint32_t); gbuf=lfb; while(i--) if(*gbuf >=127) @@ -2563,7 +2537,7 @@ unsigned char *tbuf=lfb; #endif } - fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 0, single); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 0, single, 0/*alpha*/); #if 0 // don't know what this is about if(single & 1) @@ -2575,7 +2549,7 @@ unsigned char *tbuf=lfb; } free(buffer); - lfb=tbuf; +// lfb=tbuf; } return (rv)?-1:0; } @@ -2584,13 +2558,13 @@ int show_php(char *name, char *title, int plain, int highlite) { FILE *tfh; int x1,y1,cs,rcp,rv=-1,run=1,line=0,action=1,cut; -int col1,sy=0,dy=26,psx,psy; +int col1,ssy=0,dy=26,psx,psy; int pxw=ex-sx-((preset)?120:30); //box width old 620 -int pyw=ey-sy-((preset)?60:40); //box height old 510 +int pyw=ey-sy-((preset)?60:20); //box height old 510 Center_Screen(pxw,pyw,&psx,&psy); col1=psx+((preset)?60:40); - sy=psy+70; + ssy=psy+78; if((tfh=fopen(name,"r"))!=NULL) { fclose(tfh); @@ -2614,19 +2588,20 @@ int pyw=ey-sy-((preset)?60:40); //box height old 510 //frame layout if(action) { + RenderBox(psx+6, psy+6, pxw, pyw, radius, CSP0); RenderBox(psx, psy, pxw, pyw, radius, CMC); RenderBox(psx+2, psy+2, pxw-4, 44, radius, CMH); - RenderString(title, psx, psy+34, pxw, CENTER, FSIZE_BIG, CMHT); + RenderString(title, psx, psy+40, pxw, CENTER, FSIZE_BIG, CMHT); - if(!(rv=fh_php_load(name, col1, sy, dy, cs, line, highlite, plain, &cut))) + if(!(rv=fh_php_load(name, col1, ssy, dy, cs, line, highlite, plain, &cut))) { - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + blit(); } } if(!rv) { - rcp=GetRCCode(); + rcp=GetRCCode(-1); while ((rcp != KEY_OK) && (rcp != KEY_EXIT) && (rcp != KEY_PAGEUP) && (rcp != KEY_PAGEDOWN) && (rcp != KEY_LEFT) && (rcp != KEY_RIGHT) && @@ -2634,7 +2609,7 @@ int pyw=ey-sy-((preset)?60:40); //box height old 510 (rcp != KEY_VOLUMEUP) && (rcp != KEY_VOLUMEDOWN)&& (rcp != KEY_RED)) { - rcp=GetRCCode(); + rcp=GetRCCode(-1); } if(rcp==KEY_EXIT) { @@ -2698,7 +2673,7 @@ long flength = 0; { *pt3=0; ++pt3; - printf("Tuxwetter \n",pt1); + printf("Tuxwetter <%s Downloading %s>\n", __func__, pt1); if(!HTTP_downloadFile(pt1, TRANS_FILE, 1, intype, ctmo, 2)) { if((fh=fopen(TRANS_FILE,"r"))!=NULL) @@ -2901,22 +2876,22 @@ int llev=m->headerlevels[m->act_header], lmen=m->act_header, lentr=m->lastheader return 1; } -void read_neutrino_osd_conf(int *ex,int *sx,int *ey, int *sy) +void read_neutrino_osd_conf(int *_ex,int *_sx,int *_ey, int *_sy) { - const char *filename="/var/tuxbox/config/neutrino.conf"; + const char *filename=NCF_FILE; const char spres[][4]={"","crt","lcd"}; - char sstr[4][32]={0}; - int pres=-1, resolution=-1, loop, *sptr[4]={ex, sx, ey, sy}; + char sstr[4][32]={{0}}; + int pres=-1, resolution=-1, loop, *sptr[4]={_ex, _sx, _ey, _sy}; char *buffer; size_t len; - ssize_t read; + ssize_t r; FILE* fd; fd = fopen(filename, "r"); if(fd){ buffer=NULL; len = 0; - while ((read = getline(&buffer, &len, fd)) != -1){ + while ((r = getline(&buffer, &len, fd)) != -1){ sscanf(buffer, "screen_preset=%d", &pres); sscanf(buffer, "osd_resolution=%d", &resolution); } @@ -2941,7 +2916,7 @@ void read_neutrino_osd_conf(int *ex,int *sx,int *ey, int *sy) buffer=NULL; len = 0; - while ((read = getline(&buffer, &len, fd)) != -1){ + while ((r = getline(&buffer, &len, fd)) != -1){ for(loop=0; loop<4; loop++) { sscanf(buffer, sstr[loop], sptr[loop]); } @@ -2958,7 +2933,7 @@ void read_neutrino_osd_conf(int *ex,int *sx,int *ey, int *sy) int main (int argc, char **argv) { -int index=0,cindex=0,tv,rce,ferr=0,tret=-1; +int ix=0,cindex=0,tv,rce,ferr=0,tret=-1; int mainloop=1,wloop=1, dloop=1; char rstr[BUFSIZE]={0}, *rptr=NULL; char tstr[BUFSIZE]={0}; @@ -2981,10 +2956,14 @@ PLISTENTRY pl=&epl; } if(strchr(argv[tv],'=')) { - cmdline=strdup(argv[tv]); - TrimString(cmdline); - TranslateString(cmdline); + size_t len = strlen(argv[tv]); + char *t = alloca(len * 4 + 1); + memcpy(t, argv[tv], len + 1); + TrimString(t); + TranslateString(t, len * 4 + 1); + cmdline=strdup(t); } + } // system("ping -c 2 google.com &"); @@ -2994,7 +2973,7 @@ PLISTENTRY pl=&epl; printf(NOMEM); return -1; } - if (!ReadConf(cmdline)) + if (!ReadConf(cmdline)) { printf("Tuxwetter \n"); return -1; @@ -3055,39 +3034,60 @@ PLISTENTRY pl=&epl; } //printf("sx=%i, ex =%i, sy=%i, ey=%i \n", sx, ex, sy, ey); - 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; } cindex=CMC; - for(index=CMCP0; index<=CMCP3; index++) + for(ix=CMCP0; ix<=CSP0; ix++) { - rd[index]=rd[cindex]+25; - gn[index]=gn[cindex]+25; - bl[index]=bl[cindex]+25; - tr[index]=tr[cindex]; - cindex=index; + rd[ix]=rd[cindex]+25; + gn[ix]=gn[cindex]+25; + bl[ix]=bl[cindex]+25; + tr[ix]=tr[cindex]; + cindex=ix; } - if(Read_Neutrino_Cfg("rounded_corners")>0) - radius=10; + sprintf(trstr,"infobar_alpha"); + if((tv=Read_Neutrino_Cfg(trstr))>=0) + tr[CSP0]=255-(float)tv*2.55; + + sprintf(trstr,"infobar_blue"); + if((tv=Read_Neutrino_Cfg(trstr))>=0) + bl[CSP0]=(float)tv*2.55*0.4; + + sprintf(trstr,"infobar_green"); + if((tv=Read_Neutrino_Cfg(trstr))>=0) + gn[CSP0]=(float)tv*2.55*0.4; + + sprintf(trstr,"infobar_red"); + if((tv=Read_Neutrino_Cfg(trstr))>=0) + rd[CSP0]=(float)tv*2.55*0.4; + + for (ix = 0; ix <= CSP0; ix++) + bgra[ix] = (tr[ix] << 24) | (rd[ix] << 16) | (gn[ix] << 8) | bl[ix]; + + if(Read_Neutrino_Cfg("rounded_corners")>0) { + radius = 11; + radius_small = 7; + } else - radius=0; + radius = radius_small = 0; fb = open(FB_DEVICE, O_RDWR); if(fb == -1) @@ -3116,7 +3116,7 @@ PLISTENTRY pl=&epl; perror("tuxwetter \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("tuxwetter \n"); return -1; @@ -3163,14 +3163,14 @@ PLISTENTRY pl=&epl; } else desc.face_id = FONT; + printf("tuxwetter \n", (char*)desc.face_id); 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(fix_screeninfo.line_length*var_screeninfo.yres*sizeof(uint32_t)))) { perror("tuxwetter \n"); FTC_Manager_Done(manager); @@ -3179,7 +3179,9 @@ PLISTENTRY pl=&epl; return -1; } - memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); + stride = fix_screeninfo.line_length/sizeof(uint32_t); + + memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres*sizeof(uint32_t)); startx = sx; starty = sy; @@ -3204,6 +3206,7 @@ PLISTENTRY pl=&epl; xremove("/tmp/startbild.jpg"); #endif show_jpg(START_PIC, sx, sy, ex-sx, ey-sy, 5, 0, 1, 1); + clearBB(); } //main loop @@ -3258,12 +3261,12 @@ PLISTENTRY pl=&epl; { fclose(tfh); pl=&epl; - sprintf(tstr,"%s,http://localhost/../../../..%s",prs_translate("Fehlende Übersetzungen",CONVERT_LIST),MISS_FILE); + sprintf(tstr,"%s,http://localhost/../../../..%s",prs_translate("Fehlende Übersetzungen",CONVERT_LIST),MISS_FILE); pl->entry=strdup(tstr); } else { - ShowMessage(prs_translate("Keine fehlenden Übersetzungen",CONVERT_LIST),1); + ShowMessage(prs_translate("Keine fehlenden Übersetzungen",CONVERT_LIST),1); break; } case 1: @@ -3364,7 +3367,7 @@ PLISTENTRY pl=&epl; if(pl->pictype==PTYP_ASK) { close_jpg_gif_png(); - ShowMessage(prs_translate("Nicht unterstütztes Dateiformat",CONVERT_LIST),1); + ShowMessage(prs_translate("Nicht unterstütztes Dateiformat",CONVERT_LIST),1); dloop=-1; break; } @@ -3415,7 +3418,7 @@ PLISTENTRY pl=&epl; { ++rptr; } - printf("Tuxwetter \n",rptr); + printf("Tuxwetter <%s Downloading %s>\n",__func__, rptr); ferr=HTTP_downloadFile(rptr, (pl->pictype==PTYP_JPG)?JPG_FILE:(pl->pictype==PTYP_PNG)?PNG_FILE:(pl->pictype==PTYP_GIF)?GIF_FILE:PHP_FILE, 1, intype, ctmo, 2); } @@ -3494,7 +3497,7 @@ PLISTENTRY pl=&epl; { strncpy(lastpicture,line_buffer,BUFSIZE-1); - index=menu.act_entry; + ix=menu.act_entry; switch(tret) { case -1: @@ -3505,17 +3508,17 @@ PLISTENTRY pl=&epl; case KEY_UP: case KEY_VOLUMEDOWN: - if(--index < 0) + if(--ix < 0) { - index=menu.num_entrys-1; + ix=menu.num_entrys-1; } break; case KEY_DOWN: case KEY_VOLUMEUP: - if(++index>=menu.num_entrys) + if(++ix>=menu.num_entrys) { - index=0; + ix=0; } break; @@ -3528,7 +3531,7 @@ PLISTENTRY pl=&epl; dloop=0; break; } - menu.act_entry=index; + menu.act_entry=ix; pl=menu.list[menu.act_entry]; if((pl->type!=TYP_PICTURE) && (pl->type!=TYP_PICHTML) && (pl->type!=TYP_TXTHTML) && (pl->type!=TYP_TXTPLAIN) && (pl->type!=TYP_TEXTPAGE)) { @@ -3572,46 +3575,46 @@ PLISTENTRY pl=&epl; Clear_List(&funcs, 1); funcs.act_entry=0; - sprintf(tstr,"%s %s",prs_translate("Wetterdaten für",CONVERT_LIST),city_name); + sprintf(tstr,"%s %s",prs_translate("Wetterdaten für",CONVERT_LIST),city_name); if(funcs.headertxt[0]) { free(funcs.headertxt[0]); } funcs.headertxt[0]=strdup(tstr); - for(index=0; index1) + if(ix>1) { - sprintf(tstr,"%s %s",prs_translate("Vorschau für",CONVERT_LIST),rstr); + sprintf(tstr,"%s %s",prs_translate("Vorschau für",CONVERT_LIST),rstr); } else { - if(index==1) + if(ix==1) { sprintf(tstr,"%s",prs_translate("Wochentrend",CONVERT_LIST)); } @@ -3625,7 +3628,8 @@ PLISTENTRY pl=&epl; wloop=1; while(wloop) { - clear_screen(); + clearBB(); + //clear_screen(); switch(Get_Selection(&funcs)) { case -99: @@ -3650,12 +3654,12 @@ PLISTENTRY pl=&epl; ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); } show_data(funcs.act_entry); - rce=GetRCCode(); + rce=GetRCCode(-1); while((rce != KEY_OK) && (rce != KEY_EXIT) && (rce != KEY_DOWN) && (rce != KEY_UP) && (rce != KEY_VOLUMEUP) && (rce != KEY_VOLUMEDOWN)) { - rce=GetRCCode(); + rce=GetRCCode(-1); } - index=funcs.act_entry; + ix=funcs.act_entry; if(gmodeon) { close_jpg_gif_png(); @@ -3664,17 +3668,17 @@ PLISTENTRY pl=&epl; { case KEY_UP: case KEY_VOLUMEDOWN: - if(--index < 0) + if(--ix < 0) { - index=menu.num_entrys-1; + ix=menu.num_entrys-1; } break; case KEY_DOWN: case KEY_VOLUMEUP: - if(++index>=MAX_FUNCS) + if(++ix>=MAX_FUNCS) { - index=0; + ix=0; } break; @@ -3683,7 +3687,7 @@ PLISTENTRY pl=&epl; dloop=0; break; } - funcs.act_entry=index; + funcs.act_entry=ix; } } } @@ -3729,12 +3733,12 @@ PLISTENTRY pl=&epl; CloseRC(); - for(index=0; index<32; index++) + for(ix=0; ix<32; ix++) { - sprintf(tstr,"%s%02d.gif",GIF_MFILE,index); + sprintf(tstr,"%s%02d.gif",GIF_MFILE,ix); xremove(tstr); } - sprintf(tstr,"[ -e /tmp/picture* ] && rm /tmp/picture*"); + sprintf(tstr,"ls /tmp/picture* &>/dev/null && rm /tmp/picture*"); system(tstr); xremove("/tmp/tuxwettr.tmp"); // xremove("/tmp/bmps.tar"); @@ -3742,7 +3746,7 @@ PLISTENTRY pl=&epl; xremove("/tmp/tempgif.gif"); xremove(PHP_FILE); put_instance(get_instance()-1); -# if 0 +#if 0 // swisstime if((tfh=fopen(TIME_FILE,"r"))!=NULL) { @@ -3754,9 +3758,8 @@ PLISTENTRY pl=&epl; free(line_buffer); // clear Display - memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); -// memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); + memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres*sizeof(uint32_t)); + blit(); munmap(lfb, fix_screeninfo.smem_len); close(fb); free(lbb); diff --git a/tuxwetter.h b/tuxwetter.h index a787669..562aaa9 100644 --- a/tuxwetter.h +++ b/tuxwetter.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include FT_FREETYPE_H @@ -112,9 +113,34 @@ int fb; //framebuffer stuff -enum {FILL, GRID}; - -enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED, CMCP0, CMCP1, CMCP2, CMCP3}; +enum { + FILL, + GRID +}; + +enum { + CMCST, + CMCS, + CMCT, + CMC, + CMCIT, + CMCI, + CMHT, + CMH, + WHITE, + BLUE0, + GTRANSP, + CMS, + ORANGE, + GREEN, + YELLOW, + RED, + CMCP0, + CMCP1, + CMCP2, + CMCP3, + CSP0 +}; #define TRANSP 0 extern int FSIZE_BIG; @@ -123,14 +149,15 @@ extern int FSIZE_SMALL; extern int FSIZE_VSMALL; extern int TABULATOR; -extern unsigned char *lfb, *lbb; -extern unsigned char *proxyadress, *proxyuserpwd; +extern uint32_t bgra[]; +extern int stride; +extern uint32_t *lfb, *lbb; + +extern char *proxyadress, *proxyuserpwd; struct fb_fix_screeninfo fix_screeninfo; struct fb_var_screeninfo var_screeninfo; -extern unsigned char rd[],gn[],bl[],tr[]; -int startx, starty, sx, ex, sy, ey, preset, debounce, rblock; -extern unsigned sc[8], tc[8]; +int startx, starty, sx, ex, sy, ey, preset; extern int instance; int get_instance(void); void put_instance(int pval); diff --git a/tuxwetter.png b/tuxwetter.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8f01f2a1660df90a9b8042364289ce2f3cc7ea GIT binary patch literal 2864 zcmV-03(xe4P)WdKuQATc0Hb!;FqFflhEF)}(ZGdeLjAS*C2Ffd6QfvErh00(qQO+^Rc z2LTEh4r+hcI{*Lx32;bRa{vGwAOHXyAOXz}o1Opw00d`2O+f$vv5yPOk2-F2(pS?qZ;tX4c@2nY^>UnKetTeyV_miOAmD{ zJN0S%T|JnOyYc&@LsFDYZhtL_Z=Vn6ytzaY(eyMJH3mU6P-hX)STzgH)wAIDN?@3r zUcm`(ukky6(lLAXtN#~(gQw1PJTq-Pd%8C|cRV@?JrhAahM~(NuyQi$9X>2@`v8AE zZVD~}=c>YBTE>}#f?HYxsNtEv)Z3-4i<+7epBccZzQKE*9LPTR^08s5Dj!BBejL1# zLyKb!^`0iAb8$qA8hjQY4;S3NHf&td44>VBP(i@^iiCv6i59zUU}dFi{p|}{`u}GD zFZ5ho|Hrejm;cr^A=DWoC`^wc=|DIhflLsyB-7Fb;Mc(Ah-txYv(_HtM?%ZU{Y zcBJw}M8Z)Bj1ITkhP$q>MT6IhT}Lh;oT4l^{XU-i!?QTFe;>w<9>l!y<0y?sF_vWR z-u_xw5j7^b*3!0wzicL`G6a(g9V@!r`jH1e3$=`wX}} z%YeioTt6Dd#nUeI3vNiIJW`5Gd?{IH0GMKo^oYW`{EP&a=gD{xhkDN-n;(ap#D^s> zX!KxSr4Ug_LQw)plAKQ$iLWAf#tJ#F5)lQw^!xzk)|^K&%%FFW3Y5`;6)PHWmb^7h z*~KU&mvJ=!QqM_ZzwFGh&!y^B~@|_}q*%td&ap8IKi;;DlgxQqkecHxiV7BMCPY z%|`K8Ay}-KNER`et?Jnq|7b4G5ZI|Gd?647_5Rr3|L?}g4p=vy2g+*4e zAjH&zXC?R?wG<939(dpZ*hmMwUN7qE>Zn9tvbABu26S|EltHMyT}wA@+O+rz0N-1; zF1*;q?)BGsz*DCa@RFfC?wIVU!vuX&e;YK?ePhbPu*}-3q7E zS@wXbfD$RFDMlh`ikXHRH*Um2(ub+35XZ9Y?kfP8AIn7L3F@hcMBp1;Di=5G^-2`Cs0mS?F{qLPzZvt!4O zWmf>$d2{CnpL1(ZGqp94eE~Q;6=a*aWK1t#${Awz19nL)FR(NNHdi^;rjg6TeD1@| z2{1>8QAy~s*(_udu5dWa*zNXPuK-|2p*UdEoEX@G0YxU~l8Y}z7RkNK@ zrC}Dts<~h!Hv}?Z7f7bbu!Uk8C!rGPd$mi!rr=?O&cBJFp`o%N)3|xs%hzJDh

zi_(W+J&WM%I<#KbX!e({U$#4=D}L-q*Mfg$*hAfYsU~Y^2${$TO8EpBjZR4-#TXiz zDlFK$`5i2(=tj@G4m^HzHFoZL0!>X#lsF~w$V6QS zYrhh{{R$6U9*?i>=vg3HmsZdA{WUq8yimUoOhqendku7p3xB%v1N40JAQpKqbyvZ; zSnjZM* zXx{VAZPPjJhiWYSc`cG;bc*GBxBUnUDnlS?H)%n_1;htA-11{9Hh+CP+S=O6@t>NS z!tn4gJ~;grp5NLtqC#@`rORAi3s9f z-mCwP>eVRSBZidQ2xUt