diff --git a/lib/libtuxtxt/tuxtxt.cpp b/lib/libtuxtxt/tuxtxt.cpp index 14c425f27..f8da3a6ca 100644 --- a/lib/libtuxtxt/tuxtxt.cpp +++ b/lib/libtuxtxt/tuxtxt.cpp @@ -29,12 +29,6 @@ #define KEY_TTZOOM KEY_FN_2 #define KEY_REVEAL KEY_FN_D -#if HAVE_SPARK_HARDWARE -#define MARK_FB(a, b, c, d) if (p == lfb) CFrameBuffer::getInstance()->mark(a, b, (a) + (c), (b) + (d)) -#else -#define MARK_FB(a, b, c, d) -#endif - extern cVideo * videoDecoder; static pthread_t ttx_sub_thread; @@ -44,34 +38,30 @@ static int ttx_req_pause; static int sub_pid, sub_page; static bool use_gui; static int cfg_national_subset; -#if HAVE_SPARK_HARDWARE -bool isTtxEplayer = false; -#endif static int screen_x, screen_y, screen_w, screen_h; -fb_pixel_t *getFBp(int *y) +fb_pixel_t *getFBp(int &y) { - if (*y < (int)var_screeninfo.yres) + if (y < (int)var_screeninfo.yres) return lfb; - *y -= var_screeninfo.yres; + y -= var_screeninfo.yres; return lbb; } void FillRect(int x, int y, int w, int h, fb_pixel_t color, bool modeFullColor = false); void FillRect(int x, int y, int w, int h, fb_pixel_t color, bool modeFullColor) { - fb_pixel_t *p = getFBp(&y); - MARK_FB(x, y, w, h); - p += x + y * stride; + fb_pixel_t *p = getFBp(y); + p += x + y * var_screeninfo.xres; if (w > 0) { - fb_pixel_t col = (modeFullColor) ? color : bgra[color]; + fb_pixel_t col = (modeFullColor) ? color : argb[color]; for (int count = 0; count < h; count++) { fb_pixel_t *dest0 = p; for (int i = 0; i < w; i++) - *(dest0++) = col; - p += stride; + *dest0++ = col; + p += var_screeninfo.xres; } } } @@ -84,7 +74,7 @@ void FillBorder(fb_pixel_t color, bool modeFullColor) FillRect(StartX, ys ,displaywidth,StartY ,color, modeFullColor); FillRect(StartX, ys+StartY+25*fontheight,displaywidth,var_screeninfo.yres-(StartY+25*fontheight),color, modeFullColor); - if (screenmode == 0 ) + if (screenmode[boxed] == 0 ) FillRect(StartX+displaywidth, ys,var_screeninfo.xres-(StartX+displaywidth),var_screeninfo.yres ,color, modeFullColor); } @@ -193,7 +183,6 @@ void hex2str(char *s, unsigned int n) } while (n); } - int toptext_getnext(int startpage, int up, int findgroup) { int current, nextgrp, nextblk; @@ -262,12 +251,12 @@ void RenderClearMenuLineBB(char *p, tstPageAttr *attrcol, tstPageAttr *attr) void ClearBB(fb_pixel_t color) { - FillRect(0, (var_screeninfo.yres - var_screeninfo.yoffset), var_screeninfo.xres, var_screeninfo.yres, color); + FillRect(0, var_screeninfo.yres - var_screeninfo.yoffset, var_screeninfo.xres, var_screeninfo.yres, color); } void ClearFB(int /*color*/) { - //memset(lfb,0, var_screeninfo.yres*fix_screeninfo.line_length); + //memset(lfb,0, var_screeninfo.yres*var_screeninfo.xres); CFrameBuffer::getInstance()->paintBackground(); } @@ -322,15 +311,12 @@ void setfontwidth(int newwidth) void setcolors(unsigned short *pcolormap, int offset, int number) { - int i,trans_tmp,tr; int j = offset; /* index in global color table */ - int R = var_screeninfo.red.offset; - int G = var_screeninfo.green.offset; - int B = var_screeninfo.blue.offset; - int A = var_screeninfo.transp.offset; + int trans_tmp = 25 - trans_mode; - for (i = 0; i < number; i++) - { + argb[transp2] = (((trans_tmp+7)<<11 | 0x7FF)>>8) << 24; + + for (int i = 0; i < number; i++) { int r = (pcolormap[i] << 12 & 0xF000) >> 8; int g = (pcolormap[i] << 8 & 0xF000) >> 8; int b = (pcolormap[i] << 4 & 0xF000) >> 8; @@ -338,17 +324,11 @@ void setcolors(unsigned short *pcolormap, int offset, int number) r = (r * (0x3f+(color_mode<<3))) >> 8; g = (g * (0x3f+(color_mode<<3))) >> 8; b = (b * (0x3f+(color_mode<<3))) >> 8; - bgra[j] = (r << R) | (g << G) | (b << B) | (0xff << A); + + argb[j] &= 0xff000000; + argb[j] |= (r << 16) | (g << 8) | b; j++; } - trans_tmp=25-trans_mode; - tr = ((trans_tmp+7)<<11 | 0x7FF)>>8; - bgra[transp2] &= ~(0xff << A); /* clear alpha */ - bgra[transp2] |= tr << A; - bgra[menu3] &= ~(0xff << A); - bgra[menu3] |= 0xc0 << A; - bgra[transp] &= ~(0xff << A); - bgra[transp] |= 0; } /* hexdump of page contents to stdout for debugging */ @@ -1219,10 +1199,8 @@ void eval_l25() int BlackBgSubst = 0; int ColorTableRemapping = 0; - pop = gpop = drcs = gdrcs = 0; - if (pi->ext) { tstExtData *e = pi->ext; @@ -1327,9 +1305,8 @@ void eval_l25() int o = 2 * (((tuxtxt_cache.page & 0xf0) >> 4) * 10 + (tuxtxt_cache.page & 0x0f)); /* offset of links for current page */ int opop = p[o] & 0x07; /* index of POP link */ int odrcs = p[o+1] & 0x07; /* index of DRCS link */ - unsigned char obj[3*4*4]; // types* objects * (triplet,packet,subp,high) + unsigned char obj[3*4*4] = { 0 }; // types* objects * (triplet,packet,subp,high) unsigned char type,ct, tstart = 4*4; - memset(obj,0,sizeof(obj)); if (p[o] & 0x08) /* GPOP data used */ @@ -1514,7 +1491,7 @@ void eval_l25() } } - if (boxed || transpmode) { + if (boxed || transpmode[boxed]) { FillBorder(transp); } else if(use_gui) { FillBorder(FullScrColor); @@ -1635,6 +1612,7 @@ int tuxtx_main(int pid, int page, int source) #endif use_gui = 1; boxed = 0; + oldboxed = boxed; //printf("to init tuxtxt\n");fflush(stdout); #if !TUXTXT_CFG_STANDALONE int initialized = tuxtxt_init(); @@ -1645,6 +1623,7 @@ int tuxtx_main(int pid, int page, int source) sub_pid = pid; use_gui = 0; boxed = 1; + oldboxed = boxed; } #endif @@ -1669,10 +1648,7 @@ int tuxtx_main(int pid, int page, int source) struct fb_var_screeninfo *var; var = fbp->getScreenInfo(); - /* this is actually the length of the screen in pixels */ - stride = fbp->getStride() / sizeof(fb_pixel_t); memcpy(&var_screeninfo, var, sizeof(struct fb_var_screeninfo)); - fix_screeninfo.line_length = var_screeninfo.xres * sizeof(fb_pixel_t); /* set variable screeninfo for double buffering */ var_screeninfo.yoffset = 0; @@ -1702,7 +1678,8 @@ int tuxtx_main(int pid, int page, int source) printf("[tuxtxt] screen is %dx%d at %dx%d border %d\n", ex-sx, ey-sy, sx, sy, tx); /* initialisations */ - transpmode = 0; + transpmode[0] = 0; + transpmode[1] = 0; if (Init(source) == 0) return 0; @@ -1716,7 +1693,7 @@ int tuxtx_main(int pid, int page, int source) do { if (GetRCCode() == 1) { - if (transpmode == 2) /* TV mode */ + if (transpmode[boxed] == 2) /* TV mode */ { switch (RCCode) { @@ -1747,7 +1724,7 @@ int tuxtx_main(int pid, int page, int source) case RC_MINUS: case RC_DBOX: case RC_STANDBY: - transpmode = 1; /* switch to normal mode */ + transpmode[boxed] = 1; /* switch to normal mode */ SwitchTranspMode(); break; /* and evaluate key */ case RC_TTTV: @@ -1844,14 +1821,14 @@ int tuxtx_main(int pid, int page, int source) case RC_SPLIT: case RC_MINUS: SwitchScreenMode(-1); - prevscreenmode = screenmode; + prevscreenmode[boxed] = screenmode[boxed]; break; case RC_TTTV: case RC_MUTE: SwitchTranspMode(); break; case RC_TEXT: - if(transpmode == 1) + if(transpmode[boxed] == 1) RCCode = RC_HOME; SwitchTranspMode(); break; @@ -1875,7 +1852,7 @@ int tuxtx_main(int pid, int page, int source) #endif } while ((RCCode != RC_HOME) && (RCCode != RC_STANDBY)); /* if transparent mode was selected, remember the original mode */ - screenmode = prevscreenmode; + screenmode[boxed] = prevscreenmode[boxed]; /* exit */ CleanUp(); @@ -1936,13 +1913,13 @@ int Init(int source) tuxtxt_cache.current_subpage [magazine] = -1; } /* init data */ - memset(&tuxtxt_cache.astCachetable, 0, sizeof(tuxtxt_cache.astCachetable)); - memset(&tuxtxt_cache.subpagetable, 0xFF, sizeof(tuxtxt_cache.subpagetable)); - memset(&tuxtxt_cache.astP29, 0, sizeof(tuxtxt_cache.astP29)); + memset(tuxtxt_cache.astCachetable, 0, sizeof(tuxtxt_cache.astCachetable)); + memset(tuxtxt_cache.subpagetable, 0xFF, sizeof(tuxtxt_cache.subpagetable)); + memset(tuxtxt_cache.astP29, 0, sizeof(tuxtxt_cache.astP29)); - memset(&tuxtxt_cache.basictop, 0, sizeof(tuxtxt_cache.basictop)); - memset(&tuxtxt_cache.adip, 0, sizeof(tuxtxt_cache.adip)); - memset(&tuxtxt_cache.flofpages, 0 , sizeof(tuxtxt_cache.flofpages)); + memset(tuxtxt_cache.basictop, 0, sizeof(tuxtxt_cache.basictop)); + memset(tuxtxt_cache.adip, 0, sizeof(tuxtxt_cache.adip)); + memset(tuxtxt_cache.flofpages, 0, sizeof(tuxtxt_cache.flofpages)); tuxtxt_cache.maxadippg = -1; tuxtxt_cache.bttok = 0; maxhotlist = -1; @@ -1978,7 +1955,8 @@ int Init(int source) mkdir(TUXTXTDIR, 0755); /* config defaults */ - screenmode = 0; + screenmode[0] = 0; + screenmode[1] = 0; screen_mode1 = 0; color_mode = 20; trans_mode = 6; @@ -2045,7 +2023,9 @@ int Init(int source) else if (1 == sscanf(line, "TTFShiftY %i", &ival)) TTFShiftY = ival; else if (1 == sscanf(line, "Screenmode %i", &ival)) - screenmode = ival; + screenmode[0] = ival; + else if (1 == sscanf(line, "ScreenmodeBoxed %i", &ival)) + screenmode[1] = ival; else if (1 == sscanf(line, "ShowFLOF %i", &ival)) showflof = ival & 1; else if (1 == sscanf(line, "Show39 %i", &ival)) @@ -2070,7 +2050,8 @@ int Init(int source) fclose(conf); } saveconfig = 0; - savedscreenmode = screenmode; + savedscreenmode[0] = screenmode[0]; + savedscreenmode[1] = screenmode[1]; national_subset_secondary = NAT_DEFAULT; fontwidth = 0; /* initialize at first setting */ @@ -2136,7 +2117,7 @@ int Init(int source) /* init fontlibrary */ if ((error = FT_Init_FreeType(&library))) { - printf("TuxTxt ", error); + printf("TuxTxt \n", error); return 0; } @@ -2165,7 +2146,7 @@ int Init(int source) typettf.height = (FT_UShort) 23; } - typettf.flags = FT_LOAD_MONOCHROME; + typettf.flags = FT_LOAD_RENDER; if ((error = FTC_Manager_LookupFace(manager, typettf.face_id, &face))) { @@ -2249,14 +2230,13 @@ int Init(int source) #else tuxtxt_start(tuxtxt_cache.vtxtpid, source); #endif + fcntl(rc, F_SETFL, O_NONBLOCK); gethotlist(); - if(use_gui) - SwitchScreenMode(screenmode); - else - SwitchScreenMode(0); + SwitchScreenMode(screenmode[use_gui ? 0 : 1]); - prevscreenmode = screenmode; + prevscreenmode[0] = screenmode[0]; + prevscreenmode[1] = screenmode[1]; printf("TuxTxt: init ok\n"); @@ -2270,10 +2250,12 @@ int Init(int source) void CleanUp() { - int curscreenmode = screenmode; + int curscreenmode[2]; + curscreenmode[0] = screenmode[0]; + curscreenmode[1] = screenmode[1]; /* hide and close pig */ - if (screenmode) + if (screenmode[0]) SwitchScreenMode(0); /* turn off divided screen */ #if TUXTXT_CFG_STANDALONE @@ -2286,7 +2268,7 @@ void CleanUp() //tuxtxt_stop(); #endif - //memset(lfb,0, var_screeninfo.yres*fix_screeninfo.line_length); + //memset(lfb,0, var_screeninfo.yres*var_screeninfo.xres); //CFrameBuffer::getInstance()->paintBackground(); ClearFB(transp); @@ -2299,7 +2281,7 @@ void CleanUp() savehotlist(); /* save config */ - if (saveconfig || curscreenmode != savedscreenmode) + if (saveconfig || curscreenmode[0] != savedscreenmode[0] || curscreenmode[1] != savedscreenmode[1]) { if ((conf = fopen(TUXTXTCONF, "wt")) == 0) { @@ -2320,7 +2302,8 @@ void CleanUp() fprintf(conf, "TTFHeightFactor16 %d\n", TTFHeightFactor16); fprintf(conf, "TTFShiftX %d\n", TTFShiftX); fprintf(conf, "TTFShiftY %d\n", TTFShiftY); - fprintf(conf, "Screenmode %d\n", curscreenmode); + fprintf(conf, "Screenmode %d\n", curscreenmode[0]); + fprintf(conf, "ScreenmodeBoxed %d\n", curscreenmode[1]); fprintf(conf, "ShowFLOF %d\n", showflof); fprintf(conf, "Show39 %d\n", show39); fprintf(conf, "ShowLevel2p5 %d\n", showl25); @@ -2354,18 +2337,13 @@ int GetTeletextPIDs() /* show infobar */ RenderMessage(ShowInfoBar); - unsigned char filter[DMX_FILTER_SIZE]; - unsigned char mask[DMX_FILTER_SIZE]; + unsigned char filter[DMX_FILTER_SIZE] = { 0 }; + unsigned char mask[DMX_FILTER_SIZE] = { 0 }; int res; cDemux * dmx = new cDemux(1); dmx->Open(DMX_PSI_CHANNEL); - memset(filter, 0x00, DMX_FILTER_SIZE); - memset(mask, 0x00, DMX_FILTER_SIZE); - - //filter[0] = 0x00; - //mask[0] = 0xFF; mask[0] = 0xFF; mask[4] = 0xFF; @@ -2552,6 +2530,8 @@ skip_pid: getpidsdone = 1; + //UpdateLCD(); /* update pids? */ + return 1; } @@ -2841,7 +2821,7 @@ void Menu_Init(char *menu, int current_pid, int menuitem, int hotindex) void ConfigMenu(int Init) { - int menuitem = M_Start; + int val, menuitem = M_Start; int current_pid = 0; int hotindex; int oldscreenmode, oldtrans = 0; @@ -2865,18 +2845,18 @@ void ConfigMenu(int Init) } /* reset to normal mode */ - if (zoommode) - zoommode = 0; + if (zoommode[0]) + zoommode[0] = 0; - if (transpmode) + if (transpmode[0]) { - oldtrans = transpmode; - transpmode = 0; + oldtrans = transpmode[0]; + transpmode[0] = 0; ClearBB(black); } - oldscreenmode = screenmode; - if (screenmode) + oldscreenmode = screenmode[0]; + if (screenmode[0]) SwitchScreenMode(0); /* turn off divided screen */ hotindex = getIndexOfPageInHotlist(); @@ -2895,6 +2875,10 @@ void ConfigMenu(int Init) clearbbcolor = black; Menu_Init(menu, current_pid, menuitem, hotindex); + /* set blocking mode */ + val = fcntl(rc, F_GETFL); + fcntl(rc, F_SETFL, val &~ O_NONBLOCK); + /* loop */ do { if (GetRCCode() == 1) @@ -3367,10 +3351,11 @@ void ConfigMenu(int Init) current_service = current_pid; // RenderMessage(ShowServiceName); + fcntl(rc, F_SETFL, O_NONBLOCK); RCCode = -1; if (oldscreenmode) SwitchScreenMode(oldscreenmode); /* restore divided screen */ - transpmode = oldtrans; + transpmode[boxed] = oldtrans; return; } break; @@ -3422,19 +3407,18 @@ void ConfigMenu(int Init) break; } } -#if HAVE_SPARK_HARDWARE - CopyBB2FB(); -#endif - UpdateLCD(); /* update number of cached pages */ + //UpdateLCD(); /* update number of cached pages? */ } while ((RCCode != RC_HOME) && (RCCode != RC_DBOX) && (RCCode != RC_MUTE)); ClearBB(transp); CopyBB2FB(); + /* reset to nonblocking mode */ + fcntl(rc, F_SETFL, O_NONBLOCK); tuxtxt_cache.pageupdate = 1; RCCode = -1; if (oldscreenmode) SwitchScreenMode(oldscreenmode); /* restore divided screen */ - transpmode = oldtrans; + transpmode[boxed] = oldtrans; } /****************************************************************************** @@ -3468,9 +3452,9 @@ void PageInput(int Number) } /* show pageinput */ - if (zoommode == 2) + if (zoommode[0] == 2) { - zoommode = 1; + zoommode[0] = 1; CopyBB2FB(); } @@ -3564,8 +3548,8 @@ void GetNextPageOne(int up) /* update page */ if (tuxtxt_cache.page != lastpage) { - if (zoommode == 2) - zoommode = 1; + if (zoommode[boxed] == 2) + zoommode[boxed] = 1; tuxtxt_cache.subpage = subp; hintmode = 0; @@ -3601,8 +3585,8 @@ void GetNextSubPage(int offset) tuxtxt_cache.zap_subpage_manual = 1; /* update page */ - if (zoommode == 2) /* if zoomed to lower half */ - zoommode = 1; /* activate upper half */ + if (zoommode[boxed] == 2) /* if zoomed to lower half */ + zoommode[boxed] = 1; /* activate upper half */ tuxtxt_cache.subpage = loop; hintmode = 0; @@ -3626,8 +3610,8 @@ void ColorKey(int target) { if (!target) return; - if (zoommode == 2) - zoommode = 1; + if (zoommode[boxed] == 2) + zoommode[boxed] = 1; lastpage = tuxtxt_cache.page; tuxtxt_cache.page = target; tuxtxt_cache.subpage = tuxtxt_cache.subpagetable[tuxtxt_cache.page]; @@ -3645,8 +3629,8 @@ void ColorKey(int target) void PageCatching() { - int byte; - int oldzoommode = zoommode; + int val, byte; + int oldzoommode = zoommode[boxed]; pagecatching = 1; @@ -3654,12 +3638,12 @@ void PageCatching() inputcounter = 2; /* show info line */ - zoommode = 0; + zoommode[boxed] = 0; PosX = StartX; PosY = StartY + 24*fontheight; for (byte = 0; byte < 40-nofirst; byte++) RenderCharFB(catchmenutext[menulanguage][byte], &atrtable[catchmenutext[menulanguage][byte+40] - '0' + ATR_CATCHMENU0]); - zoommode = oldzoommode; + zoommode[boxed] = oldzoommode; /* check for pagenumber(s) */ catch_row = 1; @@ -3675,6 +3659,10 @@ void PageCatching() return; } + /* set blocking mode */ + val = fcntl(rc, F_GETFL); + fcntl(rc, F_SETFL, val &~ O_NONBLOCK); + /* loop */ do { GetRCCode(); @@ -3713,6 +3701,7 @@ void PageCatching() case RC_HOME: case RC_HELP: case RC_MUTE: + fcntl(rc, F_SETFL, O_NONBLOCK); tuxtxt_cache.pageupdate = 1; pagecatching = 0; RCCode = -1; @@ -3725,8 +3714,8 @@ void PageCatching() } while (RCCode != RC_OK); /* set new page */ - if (zoommode == 2) - zoommode = 1; + if (zoommode[boxed] == 2) + zoommode[boxed] = 1; lastpage = tuxtxt_cache.page; tuxtxt_cache.page = catched_page; @@ -3739,6 +3728,9 @@ void PageCatching() tuxtxt_cache.subpage = subp; else tuxtxt_cache.subpage = 0; + + /* reset to nonblocking mode */ + fcntl(rc, F_SETFL, O_NONBLOCK); } /****************************************************************************** @@ -3850,7 +3842,7 @@ void RenderCatchedPage() int zoom = 0; /* handle zoom */ - if (zoommode) + if (zoommode[boxed]) zoom = 1<<10; if (pc_old_row || pc_old_col) /* not at first call */ @@ -3858,7 +3850,7 @@ void RenderCatchedPage() /* restore pagenumber */ SetPosX(pc_old_col); - if (zoommode == 2) + if (zoommode[boxed] == 2) PosY = StartY + (pc_old_row-12)*fontheight*((zoom>>10)+1); else PosY = StartY + pc_old_row*fontheight*((zoom>>10)+1); @@ -3872,23 +3864,23 @@ void RenderCatchedPage() pc_old_col = catch_col; /* mark pagenumber */ - if (zoommode == 1 && catch_row > 11) + if (zoommode[boxed] == 1 && catch_row > 11) { - zoommode = 2; + zoommode[boxed] = 2; #if !HAVE_SPARK_HARDWARE CopyBB2FB(); #endif } - else if (zoommode == 2 && catch_row < 12) + else if (zoommode[boxed] == 2 && catch_row < 12) { - zoommode = 1; + zoommode[boxed] = 1; #if !HAVE_SPARK_HARDWARE CopyBB2FB(); #endif } SetPosX(catch_col); - if (zoommode == 2) + if (zoommode[boxed] == 2) PosY = StartY + (catch_row-12)*fontheight*((zoom>>10)+1); else PosY = StartY + catch_row*fontheight*((zoom>>10)+1); @@ -3920,13 +3912,13 @@ void SwitchZoomMode() if (tuxtxt_cache.subpagetable[tuxtxt_cache.page] != 0xFF) { /* toggle mode */ - zoommode++; + zoommode[boxed]++; - if (zoommode == 3) - zoommode = 0; + if (zoommode[boxed] == 3) + zoommode[boxed] = 0; #if TUXTXT_DEBUG - printf("TuxTxt \n", zoommode); + printf("TuxTxt \n", zoommode[boxed], boxed); #endif /* update page */ tuxtxt_cache.pageupdate = 1; /* FIXME */ @@ -3943,38 +3935,42 @@ void SwitchScreenMode(int newscreenmode) //struct v4l2_format format; /* reset transparency mode */ - if (transpmode) - transpmode = 0; + if (boxed) { + ClearFB(transp); + videoDecoder->Pig(-1, -1, -1, -1); + } + if (transpmode[boxed]) + transpmode[boxed] = 0; if (newscreenmode < 0) /* toggle mode */ - screenmode++; + screenmode[boxed]++; else /* set directly */ - screenmode = newscreenmode; + screenmode[boxed] = newscreenmode; - if ((screenmode > 2) || (screenmode < 0)) - screenmode = 0; + if ((screenmode[boxed] > 2) || (screenmode[boxed] < 0)) + screenmode[boxed] = 0; #if TUXTXT_DEBUG - printf("TuxTxt \n", screenmode); + printf("TuxTxt \n", (int)screenmode); #endif /* update page */ tuxtxt_cache.pageupdate = 1; /* clear back buffer */ - clearbbcolor = screenmode?transp:static_cast(FullScrColor); + clearbbcolor = screenmode[boxed]?transp:static_cast(FullScrColor); if(use_gui) ClearBB(clearbbcolor); /* set mode */ - if (screenmode) /* split */ + if (screenmode[boxed]) /* split */ { ClearFB(clearbbcolor); int fw, tx, ty, tw, th; - if (screenmode==1) /* split with topmenu */ + if (screenmode[boxed]==1) /* split with topmenu */ { int x = screen_x; int w = screen_w; @@ -4039,6 +4035,10 @@ void SwitchScreenMode(int newscreenmode) displaywidth= (ex-sx); StartX = sx; //+ (ex-sx - 40*fontwidth) / 2; /* center screen */ } + if (boxed) { + ClearBB(transp); + StartX = (screen_w - displaywidth) / 2; + } } /****************************************************************************** @@ -4047,10 +4047,13 @@ void SwitchScreenMode(int newscreenmode) void SwitchTranspMode() { - if (screenmode) + if (screenmode[boxed]) { - prevscreenmode = screenmode; - SwitchScreenMode(0); /* turn off divided screen */ + prevscreenmode[boxed] = screenmode[boxed]; + if (boxed) + videoDecoder->Pig(-1, -1, -1, -1); + else + SwitchScreenMode(0); /* turn off divided screen */ } /* toggle mode */ #if 0 @@ -4061,21 +4064,26 @@ void SwitchTranspMode() transpmode++; /* backward to immediately switch to TV-screen */ #endif /* transpmode: 0 normal, 1 transparent, 2 off */ - transpmode ++; - if(transpmode > 2) - transpmode = 0; + transpmode[boxed]++; + if(transpmode[boxed] > 2) + transpmode[boxed] = 0; #if TUXTXT_DEBUG - printf("TuxTxt \n", transpmode); + printf("TuxTxt \n", (int)transpmode, (int)boxed); #endif /* set mode */ - if (!transpmode) /* normal text-only */ + if (boxed && !transpmode[boxed]) + { + ClearBB(transp); + tuxtxt_cache.pageupdate = 1; + } + else if (!transpmode[boxed]) { ClearBB(FullScrColor); tuxtxt_cache.pageupdate = 1; } - else if (transpmode == 1) /* semi-transparent BG with FG text */ + else if (transpmode[boxed] == 1) /* semi-transparent BG with FG text */ { ClearBB(transp); tuxtxt_cache.pageupdate = 1; @@ -4133,19 +4141,17 @@ void RenderDRCS( //FIX ME bit; bit >>= 1, x++) /* bit mask (MSB left), column counter */ { - int i, f1, f2; + unsigned int f1 = (c1 & bit) ? fgcolor : bgcolor; + unsigned int f2 = (c2 & bit) ? fgcolor : bgcolor; - f1 = (c1 & bit) ? fgcolor : bgcolor; - f2 = (c2 & bit) ? fgcolor : bgcolor; - - for (i = 0; i < h; i++) + for (int i = 0; i < h; i++) { if (ax[x+1] > ax[x]) { // memset(d + ax[x], f1, ax[x+1] - ax[x]); for (ltmp=0 ; ltmp <= (ax[x+1]-ax[x]); ltmp++) { - *(d + ax[x] + ltmp) = bgra[f1]; + *(d + ax[x] + ltmp) = argb[f1]; } } if (ax[x+7] > ax[x+6]) @@ -4153,40 +4159,41 @@ void RenderDRCS( //FIX ME // memset(d + ax[x+6], f2, ax[x+7] - ax[x+6]); /* 2nd byte 6 pixels to the right */ for (ltmp=0 ; ltmp <= (ax[x+7]-ax[x+6]); ltmp++) { - *(d + ax[x+6] + ltmp) = bgra[f2]; + *(d + ax[x+6] + ltmp) = argb[f2]; } + } - d += stride; + d += var_screeninfo.xres; } - d -= h * stride; + d -= h * var_screeninfo.xres; } - d += h * stride; + d += h * var_screeninfo.xres; } } void DrawVLine(int x, int y, int l, fb_pixel_t color) { - fb_pixel_t *p = getFBp(&y); - MARK_FB(x, y, 0, l); - p += x + y * stride; + fb_pixel_t *p = getFBp(y); + fb_pixel_t col = argb[color]; + p += x + y * var_screeninfo.xres; for ( ; l > 0 ; l--) { - *p = bgra[color]; - p += stride; + *p = col; + p += var_screeninfo.xres; } } void DrawHLine(int x, int y, int l, fb_pixel_t color) { - int ltmp; - fb_pixel_t *p = getFBp(&y); - MARK_FB(x, y, l, 0); - if (l > 0) + fb_pixel_t *p = getFBp(y); + fb_pixel_t col = argb[color]; + p += x + y * var_screeninfo.xres; + while (l > 0) { - for (ltmp=0; ltmp <= l; ltmp++) - *(p + x + ltmp + y * stride) = bgra[color]; + *p++ = col; + l--; } } @@ -4201,66 +4208,48 @@ void FillRectMosaicSeparated(int x, int y, int w, int h, int fgcolor, int bgcolo void FillTrapez(int x0, int y0, int l0, int xoffset1, int h, int l1, fb_pixel_t color) { - fb_pixel_t *p = getFBp(&y0); - MARK_FB(x0, y0, l0, h); - p += x0 + y0 * stride; - - int xoffset, l; - int yoffset; - int ltmp; - - for (yoffset = 0; yoffset < h; yoffset++) - { - l = l0 + ((l1-l0) * yoffset + h/2) / h; - xoffset = (xoffset1 * yoffset + h/2) / h; + for (int yoffset = 0; yoffset < h; yoffset++) { + int l = l0 + ((l1-l0) * yoffset + h/2) / h; + int xoffset = (xoffset1 * yoffset + h/2) / h; if (l > 0) - { - for (ltmp=0; ltmp <= l; ltmp++) - *(p + xoffset + ltmp) = bgra[color]; - } - p += stride; + DrawHLine(xoffset + x0, yoffset + y0, l, color); } } + void FlipHorz(int x, int y, int w, int h) { - unsigned char *buf= new unsigned char[w*4]; - fb_pixel_t *p = getFBp(&y); - MARK_FB(x, y, w, h); - p += x + y * stride; + uint32_t buf[w]; + fb_pixel_t *p = getFBp(y); + p += x + y * var_screeninfo.xres; - int w1,h1; - if(buf != NULL){ - for (h1 = 0 ; h1 < h ; h1++) - { - memmove(buf,p,w*4); - for (w1 = 0 ; w1 < w ; w1++) - { - memmove(p + w1,buf+((w-w1)*4)-4,4); - } - p += stride; + for (int h1 = 0 ; h1 < h ; h1++) { + memcpy(buf, p, w * 4); + for (int w1 = 0 ; w1 < w ; w1++) { + if (w1 + x > (int) var_screeninfo.xres) + fprintf(stderr, "%s: x=%d out of bounds\n", __func__, w1 + x); + else + *(p + w1) = *(buf + w - w1 - 1); } - delete [] buf; + p += var_screeninfo.xres; } } + void FlipVert(int x, int y, int w, int h) { - unsigned char *buf= new unsigned char[w*4]; + fb_pixel_t buf[w]; fb_pixel_t *p1, *p2; - fb_pixel_t *p = getFBp(&y); - MARK_FB(x, y, w, h); - p += x + y * stride; + fb_pixel_t *p = getFBp(y); + p += x + y * var_screeninfo.xres; - int h1; - if(buf != NULL){ - for (h1 = 0 ; h1 < h/2 ; h1++) - { - p1 = (p + (h1 * stride)); - p2 = (p + (h - (h1 + 1)) * stride); - memmove(buf,p1,w*4); - memmove(p1,p2,w*4); - memmove(p2,buf,w*4); - } - delete [] buf; + w *= 4; + + for (int h1 = 0 ; h1 < h/2 ; h1++) { + p1 = p+(h1*var_screeninfo.xres); + p2 = p+(h-(h1+1))*var_screeninfo.xres; + + memmove(buf, p1, w); + memmove(p1, p2, w); + memmove(p2, buf, w); } } @@ -4375,6 +4364,62 @@ void DrawShape(int x, int y, int shapenumber, int curfontwidth, int curfontheigh /****************************************************************************** * RenderChar * ******************************************************************************/ +struct colors_struct +{ + uint32_t fgcolor, bgcolor; + uint32_t colors[256]; +}; + +#define COLORS_LRU_SIZE 16 +static struct colors_struct *colors_lru_array[COLORS_LRU_SIZE] = { NULL }; + +uint32_t *lookup_colors(uint32_t fgcolor, uint32_t bgcolor) +{ + struct colors_struct *cs; + int i = 0; + 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 (int 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 (int 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; +} void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) { @@ -4456,7 +4501,7 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) Attribute->bg = t; } fgcolor = Attribute->fg; - if (transpmode == 1 && PosY < StartY + 24*fontheight) + if (transpmode[boxed] == 1 && PosY < StartY + 24*fontheight) { if (fgcolor == transp) /* outside boxed elements (subtitles, news) completely transparent */ bgcolor = transp; @@ -4511,9 +4556,8 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) { int x,y,f,c; y = yoffset; - fb_pixel_t *p = getFBp(&y); - MARK_FB(PosX, PosY, curfontwidth, fontheight); - p += PosX + PosY * stride; + fb_pixel_t *p = getFBp(y); + p += PosX + PosY * var_screeninfo.xres; for (y=0; y c%x a%x g%x w%d h%d x%d y%d\n", error, Char, (int) Attribute, glyph, curfontwidth, fontheight, PosX, PosY); #endif - FillRect(PosX, PosY + yoffset, curfontwidth, fontheight, bgcolor); + FillRect(PosX, PosY + yoffset, curfontwidth, factor*fontheight, bgcolor); PosX += curfontwidth; return; } /* render char */ sbitbuffer = sbit->buffer; - char localbuffer[1000]; // should be enough to store one character-bitmap... + char localbuffer[8000]; // should be enough to store one character-bitmap... // add diacritical marks if (Attribute->diacrit) { @@ -4840,50 +4884,50 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) sbit->height = fontheight - ascender + sbit->top - TTFShiftY; /* limit char height to defined/calculated fontheight */ int y = yoffset; - p = getFBp(&y); - p += PosX + (PosY + Row) * stride; /* running pointer into framebuffer */ + p = getFBp(y); + p += PosX + (PosY + Row) * var_screeninfo.xres; /* running pointer into framebuffer */ + + uint32_t *colors = lookup_colors(argb[fgcolor], argb[bgcolor]); for (Row = sbit->height; Row; Row--) /* row counts up, but down may be a little faster :) */ { int pixtodo = (usettf ? sbit->width : curfontwidth); fb_pixel_t *pstart = p; + fb_pixel_t bgcol = argb[bgcolor]; for (Bit = xfactor * (sbit->left + TTFShiftX); Bit > 0; Bit--) /* fill left margin */ { for (f = factor-1; f >= 0; f--) - *(p + f * stride) = bgra[bgcolor]; + *(p + f*var_screeninfo.xres) = bgcol; p++; if (!usettf) pixtodo--; } - for (Pitch = sbit->pitch; Pitch; Pitch--) + for (Pitch = sbit->width; Pitch; Pitch--) { - for (Bit = 0x80; Bit; Bit >>= 1) + uint32_t color; + + if (--pixtodo < 0) + break; + + if (*sbitbuffer) /* set -> foreground */ + color = colors[*sbitbuffer]; + else /* not set -> background */ + color = argb[bgcolor]; + + for (f = factor-1; f >= 0; f--) + *(p + f*var_screeninfo.xres) = color; + p++; + + if (xfactor > 1) /* double width */ { - fb_pixel_t color; - - if (--pixtodo < 0) - break; - - if (*sbitbuffer & Bit) /* bit set -> foreground */ - color = fgcolor; - else /* bit not set -> background */ - color = bgcolor; - for (f = factor-1; f >= 0; f--) - *(p + f * stride) = bgra[color]; + *(p + f*var_screeninfo.xres) = color; p++; - if (xfactor > 1) /* double width */ - { - for (f = factor-1; f >= 0; f--) - *(p + f * stride) = bgra[color]; - p++; - - if (!usettf) - pixtodo--; - } + if (!usettf) + pixtodo--; } sbitbuffer++; } @@ -4891,11 +4935,11 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) Bit > 0; Bit--) /* fill rest of char width */ { for (f = factor-1; f >= 0; f--) - *(p + f * stride) = bgra[bgcolor]; + *(p + f*var_screeninfo.xres) = argb[bgcolor]; p++; } - p = pstart + factor * stride; + p = pstart + factor*var_screeninfo.xres; } Row = ascender - sbit->top + sbit->height + TTFShiftY; @@ -4912,12 +4956,7 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) void RenderCharFB(int Char, tstPageAttr *Attribute) { -#if HAVE_SPARK_HARDWARE - if (zoommode != 2) - RenderCharBB(Char, Attribute); -#else - RenderChar(Char, Attribute, zoommode, var_screeninfo.yoffset); -#endif + RenderChar(Char, Attribute, zoommode[boxed], var_screeninfo.yoffset); } /****************************************************************************** @@ -4957,7 +4996,7 @@ void RenderMessage(int Message) memmove(&message_1[24], versioninfo, 4); /* reset zoom */ - zoommode = 0; + zoommode[boxed] = 0; /* set colors */ fbcolor = transp; @@ -5062,7 +5101,7 @@ void DoFlashing(int startrow) int srow = startrow; int erow = 24; int factor=1; - switch (zoommode) + switch (zoommode[boxed]) { case 1: erow = 12; factor=2;break; case 2: srow = 12; factor=2;break; @@ -5156,10 +5195,7 @@ void RenderPage() int row, col, byte, startrow = 0;; int national_subset_bak = national_subset; - /* update lcd */ - UpdateLCD(); - - if (transpmode != 2 && delaystarted) + if (transpmode[boxed] != 2 && delaystarted) { struct timeval tv; gettimeofday(&tv,NULL); @@ -5168,7 +5204,7 @@ void RenderPage() } /* update page or timestring */ - if (transpmode != 2 && tuxtxt_cache.pageupdate && tuxtxt_cache.page_receiving != tuxtxt_cache.page && inputcounter == 2) + if (transpmode[boxed] != 2 && tuxtxt_cache.pageupdate && tuxtxt_cache.page_receiving != tuxtxt_cache.page && inputcounter == 2) { if (boxed && subtitledelay) { @@ -5192,15 +5228,9 @@ void RenderPage() else startrow = 1; - if (boxed) - { - if (screenmode != 0) - SwitchScreenMode(0); /* turn off divided screen */ - } - else - { - if (screenmode != prevscreenmode && !transpmode) - SwitchScreenMode(prevscreenmode); + if (oldboxed != boxed) { + SwitchScreenMode(screenmode[boxed]); + oldboxed = boxed; } /* display first column? */ @@ -5221,7 +5251,7 @@ void RenderPage() fontwidth_topmenusmall = (TVENDX - TOPMENUSTARTX) / TOPMENUCHARS; //fontwidth_small = (TV169FULLSTARTX-sx) / (40-nofirst); fontwidth_small = (screen_w / 2) / (40 - nofirst); - switch(screenmode) + switch(screenmode[boxed]) { case 0: case 1: setfontwidth(fontwidth_normal); @@ -5231,7 +5261,7 @@ void RenderPage() displaywidth = screen_w / 2; break; } - if (transpmode || (boxed && !screenmode)) + if (transpmode[boxed] || boxed) { FillBorder(transp);//ClearBB(transp); clearbbcolor = transp; @@ -5275,9 +5305,9 @@ void RenderPage() /* update framebuffer */ CopyBB2FB(); } - else if (use_gui && transpmode != 2) + else if (use_gui && transpmode[boxed] != 2) { - if (zoommode != 2) + if (zoommode[boxed] != 2) { PosY = StartY; if (tuxtxt_cache.subpagetable[tuxtxt_cache.page] == 0xff) @@ -5342,7 +5372,7 @@ void RenderPage() DoFlashing(startrow); national_subset = national_subset_bak; } - else if (transpmode == 2 && tuxtxt_cache.pageupdate == 2) + else if (transpmode[boxed] == 2 && tuxtxt_cache.pageupdate == 2) { #if TUXTXT_DEBUG printf("received Update flag for page %03x\n",tuxtxt_cache.page); @@ -5468,7 +5498,7 @@ void CreateLine25() } if (tuxtxt_cache.bttok && - screenmode == 1) /* TOP-Info present, divided screen -> create TOP overview */ + !boxed && screenmode[0] == 1) /* TOP-Info present, divided screen -> create TOP overview */ { char line[TOPMENUCHARS]; int current; @@ -5586,24 +5616,14 @@ void CopyBB2FB() CreateLine25(); /* copy backbuffer to framebuffer */ - if (!zoommode) + if (!zoommode[boxed]) { #if HAVE_SPARK_HARDWARE f->blit2FB(lbb, var_screeninfo.xres, var_screeninfo.yres, 0, 0, 0, 0, true); #elif HAVE_COOL_HARDWARE f->fbCopyArea(var_screeninfo.xres, var_screeninfo.yres, 0, 0, 0, var_screeninfo.yres); #else - if ((uint32_t)stride > var_screeninfo.xres) { - fb_pixel_t *lfb_ = lfb; - fb_pixel_t *lbb_ = lbb; - for (uint32_t i1 = 0; i1 < var_screeninfo.yres; i1++) { - memcpy(lfb_, lbb_, var_screeninfo.xres * sizeof(fb_pixel_t)); - lfb_ += stride; - lbb_ += stride; - } - } - else - memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres * sizeof(fb_pixel_t)); #endif /* adapt background of backbuffer if changed */ @@ -5623,27 +5643,29 @@ void CopyBB2FB() return; } - src = topsrc = lbb + StartY * stride; - dst = lfb + StartY * stride; + src = topsrc = lbb + StartY * var_screeninfo.xres; + dst = lfb + StartY * var_screeninfo.xres; /* copy line25 in normal height */ if (!pagecatching ) - memmove(dst + (24 * fontheight) * stride, src + (24 * fontheight) * stride, stride * fontheight); + memmove(dst + (24 * fontheight) * var_screeninfo.xres, src + (24 * fontheight) * var_screeninfo.xres, var_screeninfo.xres * fontheight * sizeof(fb_pixel_t)); - if (transpmode) + if (transpmode[boxed]) fillcolor = transp; else fillcolor = FullScrColor; - if (zoommode == 2) - src += 12 * fontheight * stride; + if (zoommode[boxed] == 2) + src += 12 * fontheight * var_screeninfo.xres; /* copy topmenu in normal height (since PIG also keeps dimensions) */ - if (screenmode == 1) + if (screenmode[boxed] == 1) { - screenwidth = ( TV43STARTX ); + screenwidth = TV43STARTX; #if HAVE_SPARK_HARDWARE int cx = var_screeninfo.xres - TV43STARTX; /* x start */ + if (boxed) + cx = (screen_w - 40 * fontwidth) / 2; int cw = TV43STARTX; /* width */ int cy = StartY; int ch = 24*fontheight; @@ -5658,38 +5680,38 @@ void CopyBB2FB() for (i=0; i < 24*fontheight; i++) { memmove(topdst, topsrc, width); - topdst += stride; - topsrc += stride; + topdst += var_screeninfo.xres; + topsrc += var_screeninfo.xres; } #endif } - else if (screenmode == 2) - screenwidth = ( TV169FULLSTARTX ); + else if (screenmode[boxed] == 2) + screenwidth = TV169FULLSTARTX; else - screenwidth = stride; + screenwidth = var_screeninfo.xres; for (i = StartY; i>0;i--) { for (swtmp=0; swtmp<=screenwidth; swtmp++) { - *(dst - i * stride + swtmp) = bgra[fillcolor]; + *(dst - i * var_screeninfo.xres + swtmp) = argb[fillcolor]; } } for (i = 12*fontheight; i; i--) { memmove(dst, src, screenwidth * sizeof(fb_pixel_t)); - dst += stride; + dst += var_screeninfo.xres; memmove(dst, src, screenwidth * sizeof(fb_pixel_t)); - dst += stride; - src += stride; + dst += var_screeninfo.xres; + src += var_screeninfo.xres; } for (i = var_screeninfo.yres - StartY - 25*fontheight; i >= 0;i--) { for (swtmp=0; swtmp<= screenwidth;swtmp++) { - *(dst + stride * (fontheight + i) + swtmp) = bgra[fillcolor]; + *(dst + var_screeninfo.xres * (fontheight + i) + swtmp) = argb[fillcolor]; } } #if HAVE_SPARK_HARDWARE @@ -5749,7 +5771,7 @@ void DecodePage() /* modify header */ if (boxed) - memset(&page_char, ' ', 40); + memset(page_char, ' ', 40); else { memset(page_char, ' ', 8); @@ -5856,7 +5878,7 @@ void DecodePage() RenderDRCS( page_char + 20 * (DRCSCOLS * row + col + 2), lfb - + (StartY + fontheight + DRCSYSPC * row + var_screeninfo.yres - var_screeninfo.yoffset) * stride + + (StartY + fontheight + DRCSYSPC * row + var_screeninfo.yres - var_screeninfo.yoffset) * var_screeninfo.xres + (StartX + DRCSXSPC * col), ax, white, black); @@ -5866,14 +5888,14 @@ void DecodePage() } else { - int i; + int unsigned i; int h, parityerror = 0; for (i = 0; i < 8; i++) page_atrb[i] = atrtable[ATR_WB]; /* decode parity/hamming */ - for (i = 40; i < (int) sizeof(page_char); i++) + for (i = 40; i < sizeof(page_char); i++) { page_atrb[i] = atrtable[ATR_WB]; p = page_char + i; diff --git a/lib/libtuxtxt/tuxtxt.h b/lib/libtuxtxt/tuxtxt.h index f25ed7ce1..9b641b5e5 100644 --- a/lib/libtuxtxt/tuxtxt.h +++ b/lib/libtuxtxt/tuxtxt.h @@ -21,6 +21,7 @@ #include +#include #include #include #include @@ -210,11 +211,9 @@ const char *ObjectType[] = #define NoServicesFound 3 /* framebuffer stuff */ -static fb_pixel_t *lfb = 0; -static fb_pixel_t *lbb = 0; +static fb_pixel_t *lfb = NULL; +static fb_pixel_t *lbb = NULL; struct fb_var_screeninfo var_screeninfo; -struct fb_fix_screeninfo fix_screeninfo; -int stride; /* freetype stuff */ FT_Library library; @@ -556,11 +555,13 @@ char versioninfo[16]; int hotlist[10]; int maxhotlist; +int rc; int sx, ex, sy, ey; int PosX, PosY, StartX, StartY; int lastpage; int inputcounter; -int zoommode, screenmode, transpmode, hintmode, boxed, nofirst, savedscreenmode, showflof, show39, showl25, prevscreenmode; +int zoommode[2], screenmode[2], transpmode[2], hintmode, nofirst, savedscreenmode[2], showflof, show39, showl25, prevscreenmode[2]; +bool boxed, oldboxed; char dumpl25; int catch_row, catch_col, catched_page, pagecatching; int prev_100, prev_10, next_10, next_100; @@ -1210,8 +1211,18 @@ const unsigned short defaultcolors[] = /* 0x0bgr */ 0x420, 0x210, 0x420, 0x000, 0x000 }; -/* filled in setcolors() */ -fb_pixel_t bgra[SIZECOLTABLE]; +fb_pixel_t argb[] = { + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xff000000, 0xff000000, + 0xff000000, 0xff000000, 0xc0000000, 0x00000000, + 0x33000000 +}; /* old 8bit color table */ unsigned short rd0[] = {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0x00<<8, 0x00<<8, 0x00<<8, 0, 0 };