From 367fbc656e2f678059258d5283dfa8e5a4667ed2 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Mon, 19 Mar 2012 21:40:03 +0000 Subject: [PATCH] Moviebrowser: disabled 'pseudo' transparency for display screenshot - Global setting for picture / icon transparency can be made in framebuffer constuctor - Default is old standard (transparency when Black Content) - Individual transparency with CFrameBuffer::SetTransparent() git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@2155 e54a6e83-5905-42d5-8d5c-058d10e6a962 Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/5fee27085d18eeb085f1cf55f0581508009b0456 Author: Michael Liebmann Date: 2012-03-19 (Mon, 19 Mar 2012) Origin message was: ------------------ * Moviebrowser: disabled 'pseudo' transparency for display screenshot - Global setting for picture / icon transparency can be made in framebuffer constuctor - Default is old standard (transparency when Black Content) - Individual transparency with CFrameBuffer::SetTransparent() git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@2155 e54a6e83-5905-42d5-8d5c-058d10e6a962 --- src/driver/framebuffer.cpp | 38 +++++++++++++++------- src/driver/framebuffer.h | 12 ++++++- src/driver/pictureviewer/pictureviewer.cpp | 20 ++++-------- src/driver/pictureviewer/pictureviewer.h | 4 +-- src/gui/moviebrowser.cpp | 2 +- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/driver/framebuffer.cpp b/src/driver/framebuffer.cpp index 5ce510b7a..d1588a160 100644 --- a/src/driver/framebuffer.cpp +++ b/src/driver/framebuffer.cpp @@ -179,6 +179,10 @@ CFrameBuffer::CFrameBuffer() backgroundFilename = ""; fd = 0; tty = 0; + m_transparent_default = CFrameBuffer::TM_BLACK; // TM_BLACK: Transparency when black content ('pseudo' transparency) + // TM_NONE: No 'pseudo' transparency + // TM_INI: Transparency depends on g_settings.infobar_alpha ??? + m_transparent = m_transparent_default; //FIXME: test memset(red, 0, 256*sizeof(__u16)); memset(green, 0, 256*sizeof(__u16)); @@ -292,6 +296,7 @@ printf("smem_start %x\n", smem_start); paletteSet(); useBackground(false); + m_transparent = m_transparent_default; #if 0 if ((tty=open("/dev/vc/0", O_RDWR))<0) { perror("open (tty)"); @@ -1627,27 +1632,36 @@ void * CFrameBuffer::int_convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long count = x * y; fbbuff = (unsigned int *) cs_malloc_uncached(count * sizeof(unsigned int)); - if(fbbuff == NULL) - { + if(fbbuff == NULL) { printf("convertRGB2FB%s: Error: cs_malloc_uncached\n", ((alpha) ? " (Alpha)" : "")); return NULL; } - if (alpha) - { + if (alpha) { for(i = 0; i < count ; 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 - { - for(i = 0; i < count ; i++) - { - transp = 0; - if(rgbbuff[i*3] || rgbbuff[i*3+1] || rgbbuff[i*3+2]) - transp = 0xFF; - fbbuff[i] = (transp << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); + } else { + switch (m_transparent) { + case CFrameBuffer::TM_BLACK: + for(i = 0; i < count ; i++) { + transp = 0; + if(rgbbuff[i*3] || rgbbuff[i*3+1] || rgbbuff[i*3+2]) + transp = 0xFF; + fbbuff[i] = (transp << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); + } + break; + case CFrameBuffer::TM_INI: + for(i = 0; i < count ; i++) + fbbuff[i] = (transp << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); + break; + case CFrameBuffer::TM_NONE: + default: + for(i = 0; i < count ; i++) + fbbuff[i] = 0xFF000000 | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); + break; } } return (void *) fbbuff; diff --git a/src/driver/framebuffer.h b/src/driver/framebuffer.h index 1ceb61441..e971dabc1 100644 --- a/src/driver/framebuffer.h +++ b/src/driver/framebuffer.h @@ -114,6 +114,7 @@ class CFrameBuffer std::map icon_cache; int cache_size; void * int_convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y, int transp, bool alpha); + int m_transparent_default, m_transparent; public: fb_pixel_t realcolor[256]; @@ -222,7 +223,16 @@ class CFrameBuffer void blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp = 0, uint32_t yp = 0, bool transp = false); bool blitToPrimary(unsigned int * data, int dx, int dy, int sw, int sh); void paintMuteIcon(bool paint, int ax, int ay, int dx, int dy, bool paintFrame=true); + + enum + { + TM_EMPTY = 0, + TM_NONE = 1, + TM_BLACK = 2, + TM_INI = 3 + }; + void SetTransparent(int t){ m_transparent = t; } + void SetTransparentDefault(){ m_transparent = m_transparent_default; } }; - #endif diff --git a/src/driver/pictureviewer/pictureviewer.cpp b/src/driver/pictureviewer/pictureviewer.cpp index 44209f8ad..2dab2184c 100644 --- a/src/driver/pictureviewer/pictureviewer.cpp +++ b/src/driver/pictureviewer/pictureviewer.cpp @@ -547,25 +547,19 @@ void CPictureViewer::rescaleImageDimensions(int *width, int *height, const int m } } -bool CPictureViewer::DisplayImage (const std::string & name, int posx, int posy, int width, int height) +bool CPictureViewer::DisplayImage(const std::string & name, int posx, int posy, int width, int height, int transp) { - return int_DisplayImage(name, posx, posy, width, height, false); -} + CFrameBuffer* frameBuffer = CFrameBuffer::getInstance(); + if (transp > CFrameBuffer::TM_EMPTY) + frameBuffer->SetTransparent(transp); -bool CPictureViewer::DisplayImage(const std::string & name, int posx, int posy, int width, int height, const fb_pixel_t colBg) -{ - return int_DisplayImage(name, posx, posy, width, height, true, colBg); -} - -bool CPictureViewer::int_DisplayImage(const std::string & name, int posx, int posy, int width, int height, bool paintBg, const fb_pixel_t colBg) -{ /* TODO: cache or check for same */ fb_pixel_t * data = getImage(name, width, height); + if (transp > CFrameBuffer::TM_EMPTY) + frameBuffer->SetTransparentDefault(); + if(data) { - CFrameBuffer* frameBuffer = CFrameBuffer::getInstance(); - if (paintBg) - frameBuffer->paintBoxRel(posx, posy, width, height, colBg); frameBuffer->blit2FB(data, width, height, posx, posy); cs_free_uncached(data); return true; diff --git a/src/driver/pictureviewer/pictureviewer.h b/src/driver/pictureviewer/pictureviewer.h index eb1619ce5..094a11217 100644 --- a/src/driver/pictureviewer/pictureviewer.h +++ b/src/driver/pictureviewer/pictureviewer.h @@ -63,8 +63,7 @@ class CPictureViewer void Cleanup(); void SetVisible(int startx, int endx, int starty, int endy); static double m_aspect_ratio_correction; - bool DisplayImage (const std::string & name, int posx, int posy, int width, int height); - bool DisplayImage (const std::string & name, int posx, int posy, int width, int height, const fb_pixel_t colBg); + bool DisplayImage (const std::string & name, int posx, int posy, int width, int height, int transp=CFrameBuffer::TM_EMPTY); bool DisplayLogo (uint64_t channel_id, int posx, int posy, int width, int height); bool GetLogoName(uint64_t channel_id, std::string ChanName, std::string & name, int *width = NULL, int *height = NULL); fb_pixel_t * getImage (const std::string & name, int width, int height); @@ -112,7 +111,6 @@ class CPictureViewer void add_format(int (*picsize)(const char *,int *,int*,int,int),int (*picread)(const char *,unsigned char **,int*,int*), int (*id)(const char*)); unsigned char * int_Resize(unsigned char *orgin, int ox, int oy, int dx, int dy, ScalingMode type, unsigned char * dst, bool alpha); fb_pixel_t * int_getImage(const std::string & name, int *width, int *height, bool GetImage); - bool int_DisplayImage (const std::string & name, int posx, int posy, int width, int height, bool paintBg, const fb_pixel_t colBg=0); }; diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index d5cc1c4f9..8c523d21c 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -1253,7 +1253,7 @@ void CMovieBrowser::refreshMovieInfo(void) g_PicViewer->rescaleImageDimensions(&flogo_w, &flogo_h, picw-2, pich-2); lx = m_cBoxFrameInfo.iX+m_cBoxFrameInfo.iWidth - flogo_w -14; ly = m_cBoxFrameInfo.iY - 1 + (m_cBoxFrameInfo.iHeight-flogo_h)/2; - g_PicViewer->DisplayImage(fname, lx+2, ly+1, flogo_w, flogo_h); + g_PicViewer->DisplayImage(fname, lx+2, ly+1, flogo_w, flogo_h, CFrameBuffer::TM_NONE); m_pcWindow->paintVLineRel(lx, ly, flogo_h+1, COL_WHITE); m_pcWindow->paintVLineRel(lx+flogo_w+2, ly, flogo_h+2, COL_WHITE); m_pcWindow->paintHLineRel(lx, flogo_w+2, ly, COL_WHITE);