From 33c5da3515ba88e45fd3b4cde45a3e0d24a10dcf Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 1 Apr 2012 13:00:19 +0200 Subject: [PATCH] tuxtxt: adapt to framebuffer blitting changes --- lib/libtuxtxt/tuxtxt.cpp | 50 ++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/libtuxtxt/tuxtxt.cpp b/lib/libtuxtxt/tuxtxt.cpp index 57a85f591..256691374 100644 --- a/lib/libtuxtxt/tuxtxt.cpp +++ b/lib/libtuxtxt/tuxtxt.cpp @@ -26,6 +26,12 @@ #define KEY_TTZOOM KEY_FN_2 #define KEY_REVEAL KEY_FN_D +#ifdef 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; @@ -52,6 +58,7 @@ unsigned char *getFBp(int *y) void FillRect(int x, int y, int w, int h, int color) { unsigned char *p = getFBp(&y); + MARK_FB(x, y, w, h); p += x*4 + y * fix_screeninfo.line_length; #if !HAVE_TRIPLEDRAGON unsigned int col = bgra[color][3] << 24 | bgra[color][2] << 16 | bgra[color][1] << 8 | bgra[color][0]; @@ -256,6 +263,7 @@ void ClearB(int color) { FillRect(0, 0, var_screeninfo.xres, var_screeninfo.yres, color); /* framebuffer */ FillRect(0, var_screeninfo.yres, var_screeninfo.xres, var_screeninfo.yres, color); /* backbuffer */ + CFrameBuffer::getInstance()->blit(); } int GetCurFontWidth() @@ -1654,6 +1662,7 @@ int tuxtx_main(int _rc, int pid, int page, int source) fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) | O_EXCL | O_NONBLOCK); +#ifndef HAVE_SPARK_HARDWARE /* get fixed screeninfo */ if (ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1) { @@ -1667,7 +1676,12 @@ int tuxtx_main(int _rc, int pid, int page, int source) perror("TuxTxt "); return 0; } - +#else + struct fb_var_screeninfo *var; + var = fbp->getScreenInfo(); + memcpy(&var_screeninfo, var, sizeof(struct fb_var_screeninfo)); + fix_screeninfo.line_length = var_screeninfo.xres * sizeof(fb_pixel_t); +#endif /* set variable screeninfo for double buffering */ var_screeninfo.yoffset = 0; #if 0 @@ -1676,10 +1690,10 @@ int tuxtx_main(int _rc, int pid, int page, int source) ex = x + w - 10; ey = y + h - 10; #endif - screen_x = fbp->scaleX(fbp->getScreenX()); - screen_y = fbp->scaleY(fbp->getScreenY()); - screen_w = fbp->scaleX(fbp->getScreenWidth()); - screen_h = fbp->scaleY(fbp->getScreenHeight()); + screen_x = fbp->getScreenX(); + screen_y = fbp->getScreenY(); + screen_w = fbp->getScreenWidth(); + screen_h = fbp->getScreenHeight(); int x = screen_x; int y = screen_y; @@ -2801,6 +2815,7 @@ void Menu_Init(char *menu, int current_pid, int menuitem, int hotindex) national_subset = national_subset_bak; Menu_HighlightLine(menu, MenuLine[menuitem], 1); Menu_UpdateHotlist(menu, hotindex, menuitem); + CFrameBuffer::getInstance()->blit(); } void ConfigMenu(int Init) @@ -3391,6 +3406,7 @@ void ConfigMenu(int Init) break; } } + CFrameBuffer::getInstance()->blit(); UpdateLCD(); /* update number of cached pages */ } while ((RCCode != RC_HOME) && (RCCode != RC_DBOX) && (RCCode != RC_MUTE)); @@ -3690,6 +3706,7 @@ void PageCatching() RCCode = -1; return; } + CFrameBuffer::getInstance()->blit(); UpdateLCD(); } while (RCCode != RC_OK); @@ -3984,7 +4001,7 @@ void SwitchScreenMode(int newscreenmode) CFrameBuffer *f = CFrameBuffer::getInstance(); videoDecoder->Pig(tx, ty, tw, th, - f->scaleX(f->getScreenWidth(true)), f->scaleY(f->getScreenHeight(true))); + f->getScreenWidth(true), f->getScreenHeight(true)); #if 0 int sm = 0; ioctl(pig, VIDIOC_OVERLAY, &sm); @@ -4151,6 +4168,7 @@ void RenderDRCS( //FIX ME void DrawVLine(int x, int y, int l, int color) { unsigned char *p = getFBp(&y); + MARK_FB(x, y, 0, l); p += x*4 + y * fix_screeninfo.line_length; for ( ; l > 0 ; l--) @@ -4164,6 +4182,7 @@ void DrawHLine(int x, int y, int l, int color) { int ltmp; unsigned char *p = getFBp(&y); + MARK_FB(x, y, l, 0); if (l > 0) { for (ltmp=0; ltmp <= l; ltmp++) @@ -4185,6 +4204,7 @@ 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, int color) { unsigned char *p = getFBp(&y0); + MARK_FB(x0, y0, l0, h); p += x0 * 4 + y0 * fix_screeninfo.line_length; int xoffset, l; @@ -4209,6 +4229,7 @@ void FlipHorz(int x, int y, int w, int h) { unsigned char *buf= new unsigned char[w*4]; unsigned char *p = getFBp(&y); + MARK_FB(x, y, w, h); p += x * 4 + y * fix_screeninfo.line_length; int w1,h1; @@ -4230,6 +4251,7 @@ void FlipVert(int x, int y, int w, int h) unsigned char *buf= new unsigned char[w*4]; unsigned char *p1, *p2; unsigned char *p = getFBp(&y); + MARK_FB(x, y, w, h); p += x*4 + y * fix_screeninfo.line_length; int h1; @@ -4494,6 +4516,7 @@ void RenderChar(int Char, tstPageAttr *Attribute, int zoom, int yoffset) int x,y,f,c; y = yoffset; unsigned char *p = getFBp(&y); + MARK_FB(PosX, PosY, curfontwidth, fontheight); p += PosX * 4 + PosY * fix_screeninfo.line_length; for (y=0; yblit(); } + void RenderPage() { int row, col, byte, startrow = 0;; @@ -5360,6 +5384,7 @@ void RenderPage() RenderCharFB(ns[0],&atrtable[ATR_WB]); RenderCharFB(ns[1],&atrtable[ATR_WB]); RenderCharFB(ns[2],&atrtable[ATR_WB]); + CFrameBuffer::getInstance()->blit(); tuxtxt_cache.pageupdate=0; } @@ -5608,7 +5633,8 @@ void CopyBB2FB() perror("TuxTxt "); #else #ifdef HAVE_SPARK_HARDWARE - f->blit2FB(lbb, var_screeninfo.xres, var_screeninfo.yres, 0, 0, 0, 0, false, false); + f->blit2FB(lbb, var_screeninfo.xres, var_screeninfo.yres, 0, 0, 0, 0, false); + f->blit(); #else memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); #endif @@ -5662,7 +5688,7 @@ void CopyBB2FB() int cw = TV43STARTX; /* width */ int cy = StartY; int ch = 24*fontheight; - f->blit2FB(lbb, cw, ch, cx, cy, cx, cy, false, false); + f->blit2FB(lbb, cw, ch, cx, cy, cx, cy, false); #else unsigned char *topdst = dst; size_t width = ex * sizeof(fb_pixel_t) - screenwidth; @@ -5706,6 +5732,10 @@ void CopyBB2FB() memmove(dst + fix_screeninfo.line_length*(fontheight+i)+swtmp*4, bgra[fillcolor], 4); } } +#ifdef HAVE_SPARK_HARDWARE + f->mark(0, 0, var_screeninfo.xres, var_screeninfo.yres); + f->blit(); +#endif } /****************************************************************************** @@ -6468,7 +6498,7 @@ printf("[tuxtxt] new key, code %X\n", RCCode); } RCCode = -1; - usleep(1000000/100); + usleep(1000000/25); return 0; }