Rework handling muteicon

- Integrated for monitoring the mute icon into the frame buffer class.
 If the icon is overwritten by an element, it is restored from the
 framebuffer.

Signed-off-by: Thilo Graf <dbt@novatux.de>


Origin commit data
------------------
Commit: 1049b337bb
Author: Michael Liebmann <tuxcode.bbg@gmail.com>
Date: 2013-05-13 (Mon, 13 May 2013)

Origin message was:
------------------
* Rework handling muteicon

- Integrated for monitoring the mute icon into the frame buffer class.
 If the icon is overwritten by an element, it is restored from the
 framebuffer.

Signed-off-by: Thilo Graf <dbt@novatux.de>
This commit is contained in:
Michael Liebmann
2013-05-13 06:31:02 +02:00
parent e946162499
commit 2b64c52a2f
5 changed files with 228 additions and 26 deletions

View File

@@ -372,6 +372,8 @@ void Font::RenderString(int x, int y, const int width, const char *text, const u
if (!frameBuffer->getActive()) if (!frameBuffer->getActive())
return; return;
frameBuffer->checkFbArea(x, y, width, height, true);
pthread_mutex_lock( &renderer->render_mutex ); pthread_mutex_lock( &renderer->render_mutex );
FT_Error err = FTC_Manager_LookupSize(renderer->cacheManager, &scaler, &size); FT_Error err = FTC_Manager_LookupSize(renderer->cacheManager, &scaler, &size);
@@ -620,6 +622,7 @@ void Font::RenderString(int x, int y, const int width, const char *text, const u
} }
//printf("RenderStat: %d %d %d \n", renderer->cacheManager->num_nodes, renderer->cacheManager->num_bytes, renderer->cacheManager->max_bytes); //printf("RenderStat: %d %d %d \n", renderer->cacheManager->num_nodes, renderer->cacheManager->num_bytes, renderer->cacheManager->max_bytes);
pthread_mutex_unlock( &renderer->render_mutex ); pthread_mutex_unlock( &renderer->render_mutex );
frameBuffer->checkFbArea(x, y, width, height, false);
} }
void Font::RenderString(int x, int y, const int width, const std::string & text, const unsigned char color, const int boxheight, const bool utf8_encoded) void Font::RenderString(int x, int y, const int width, const std::string & text, const unsigned char color, const int boxheight, const bool utf8_encoded)

View File

@@ -4,21 +4,27 @@
Copyright (C) 2001 Steffen Hehn 'McClean' Copyright (C) 2001 Steffen Hehn 'McClean'
2003 thegoodguy 2003 thegoodguy
mute icon handling from tuxbox project
Copyright (C) 2009 Stefan Seyfried <seife@tuxboxcvs.slipkontur.de>
mute icon & info clock handling
Copyright (C) 2013 M. Liebmann (micha-bbg)
License: GPL License: GPL
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or
it under the terms of the GNU General Public License as published by modify it under the terms of the GNU General Public
the Free Software Foundation; either version 2 of the License, or License as published by the Free Software Foundation; either
(at your option) any later version. version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
GNU General Public License for more details. General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public
along with this program; if not, write to the Free Software License along with this program; if not, write to the
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
@@ -38,6 +44,7 @@
#include <linux/kd.h> #include <linux/kd.h>
#include <gui/audiomute.h>
#include <gui/color.h> #include <gui/color.h>
#include <gui/pictureviewer.h> #include <gui/pictureviewer.h>
#include <global.h> #include <global.h>
@@ -196,6 +203,9 @@ CFrameBuffer::CFrameBuffer()
memset(green, 0, 256*sizeof(__u16)); memset(green, 0, 256*sizeof(__u16));
memset(blue, 0, 256*sizeof(__u16)); memset(blue, 0, 256*sizeof(__u16));
memset(trans, 0, 256*sizeof(__u16)); memset(trans, 0, 256*sizeof(__u16));
fbAreaActiv = false;
fb_no_check = false;
do_paint_mute_icon = true;
} }
CFrameBuffer* CFrameBuffer::getInstance() CFrameBuffer* CFrameBuffer::getInstance()
@@ -402,6 +412,8 @@ CFrameBuffer::~CFrameBuffer()
} }
close(fd); close(fd);
close(tty); close(tty);
v_fbarea.clear();
} }
int CFrameBuffer::getFileHandle() const int CFrameBuffer::getFileHandle() const
@@ -651,11 +663,15 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int
printf("paintBoxRel: radius %d, start x %d y %d end x %d y %d\n", radius, x, y, x+dx, y+dy); printf("paintBoxRel: radius %d, start x %d y %d end x %d y %d\n", radius, x, y, x+dx, y+dy);
return; return;
} }
checkFbArea(x, y, dx, dy, true);
#if defined(FB_HW_ACCELERATION) #if defined(FB_HW_ACCELERATION)
fb_fillrect fillrect; fb_fillrect fillrect;
fillrect.color = col; fillrect.color = col;
fillrect.rop = ROP_COPY; fillrect.rop = ROP_COPY;
#elif defined(USE_NEVIS_GXA) #elif defined(USE_NEVIS_GXA)
if (!fb_no_check)
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
/* solid fill with background color */ /* solid fill with background color */
unsigned int cmd = GXA_CMD_BLT | GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(7) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(2) | GXA_CMD_NOT_ALPHA; unsigned int cmd = GXA_CMD_BLT | GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(7) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(2) | GXA_CMD_NOT_ALPHA;
@@ -805,6 +821,7 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int
*/ */
add_gxa_sync_marker(); add_gxa_sync_marker();
#endif #endif
checkFbArea(x, y, dx, dy, false);
} }
void CFrameBuffer::paintVLineRelInternal(int x, int y, int dy, const fb_pixel_t col) void CFrameBuffer::paintVLineRelInternal(int x, int y, int dy, const fb_pixel_t col)
@@ -1069,9 +1086,11 @@ _display:
if (h != 0) if (h != 0)
yy += (h - height) / 2; yy += (h - height) / 2;
checkFbArea(x, yy, width, height, true);
if (paintBg) if (paintBg)
paintBoxRel(x, yy, width, height, colBg); paintBoxRel(x, yy, width, height, colBg);
blit2FB(data, width, height, x, yy, 0, 0, true); blit2FB(data, width, height, x, yy, 0, 0, true);
checkFbArea(x, yy, width, height, false);
return true; return true;
} }
@@ -1475,6 +1494,7 @@ void CFrameBuffer::paintBackgroundBoxRel(int x, int y, int dx, int dy)
if (!getActive()) if (!getActive())
return; return;
checkFbArea(x, y, dx, dy, true);
if(!useBackgroundPaint) if(!useBackgroundPaint)
{ {
paintBoxRel(x, y, dx, dy, backgroundColor); paintBoxRel(x, y, dx, dy, backgroundColor);
@@ -1490,6 +1510,7 @@ void CFrameBuffer::paintBackgroundBoxRel(int x, int y, int dx, int dy)
bkpos += BACKGROUNDIMAGEWIDTH; bkpos += BACKGROUNDIMAGEWIDTH;
} }
} }
checkFbArea(x, y, dx, dy, false);
} }
void CFrameBuffer::paintBackground() void CFrameBuffer::paintBackground()
@@ -1497,6 +1518,7 @@ void CFrameBuffer::paintBackground()
if (!getActive()) if (!getActive())
return; return;
checkFbArea(0, 0, xRes, yRes, true);
if (useBackgroundPaint && (background != NULL)) if (useBackgroundPaint && (background != NULL))
{ {
for (int i = 0; i < 576; i++) for (int i = 0; i < 576; i++)
@@ -1506,6 +1528,7 @@ void CFrameBuffer::paintBackground()
{ {
paintBoxRel(0, 0, xRes, yRes, backgroundColor); paintBoxRel(0, 0, xRes, yRes, backgroundColor);
} }
checkFbArea(0, 0, xRes, yRes, false);
} }
void CFrameBuffer::SaveScreen(int x, int y, int dx, int dy, fb_pixel_t * const memp) void CFrameBuffer::SaveScreen(int x, int y, int dx, int dy, fb_pixel_t * const memp)
@@ -1513,6 +1536,7 @@ void CFrameBuffer::SaveScreen(int x, int y, int dx, int dy, fb_pixel_t * const m
if (!getActive()) if (!getActive())
return; return;
checkFbArea(x, y, dx, dy, true);
uint8_t * pos = ((uint8_t *)getFrameBufferPointer()) + x * sizeof(fb_pixel_t) + stride * y; uint8_t * pos = ((uint8_t *)getFrameBufferPointer()) + x * sizeof(fb_pixel_t) + stride * y;
fb_pixel_t * bkpos = memp; fb_pixel_t * bkpos = memp;
for (int count = 0; count < dy; count++) { for (int count = 0; count < dy; count++) {
@@ -1536,6 +1560,7 @@ void CFrameBuffer::SaveScreen(int x, int y, int dx, int dy, fb_pixel_t * const m
bkpos += dx; bkpos += dx;
} }
#endif #endif
checkFbArea(x, y, dx, dy, false);
} }
@@ -1544,6 +1569,7 @@ void CFrameBuffer::RestoreScreen(int x, int y, int dx, int dy, fb_pixel_t * cons
if (!getActive()) if (!getActive())
return; return;
checkFbArea(x, y, dx, dy, true);
uint8_t * fbpos = ((uint8_t *)getFrameBufferPointer()) + x * sizeof(fb_pixel_t) + stride * y; uint8_t * fbpos = ((uint8_t *)getFrameBufferPointer()) + x * sizeof(fb_pixel_t) + stride * y;
fb_pixel_t * bkpos = memp; fb_pixel_t * bkpos = memp;
for (int count = 0; count < dy; count++) for (int count = 0; count < dy; count++)
@@ -1552,6 +1578,7 @@ void CFrameBuffer::RestoreScreen(int x, int y, int dx, int dy, fb_pixel_t * cons
fbpos += stride; fbpos += stride;
bkpos += dx; bkpos += dx;
} }
checkFbArea(x, y, dx, dy, false);
} }
#if 0 #if 0
//never used //never used
@@ -1768,3 +1795,91 @@ void CFrameBuffer::displayRGB(unsigned char *rgbbuff, int x_size, int y_size, in
blit2FB(fbbuff, x_size, y_size, x_offs, y_offs, x_pan, y_pan); blit2FB(fbbuff, x_size, y_size, x_offs, y_offs, x_pan, y_pan);
cs_free_uncached(fbbuff); cs_free_uncached(fbbuff);
} }
// ## AudioMute / Clock ######################################
void CFrameBuffer::setFbArea(int element, int _x, int _y, int _dx, int _dy)
{
if (_x == 0 && _y == 0 && _dx == 0 && _dy == 0) {
// delete area
for (fbarea_iterator_t it = v_fbarea.begin(); it != v_fbarea.end(); ++it) {
if (it->element == element) {
v_fbarea.erase(it);
break;
}
}
if (v_fbarea.empty()) {
fbAreaActiv = false;
}
}
else {
// change area
bool found = false;
for (unsigned int i = 0; i < v_fbarea.size(); i++) {
if (v_fbarea[i].element == element) {
v_fbarea[i].x = _x;
v_fbarea[i].y = _y;
v_fbarea[i].dx = _dx;
v_fbarea[i].dy = _dy;
found = true;
break;
}
}
// set new area
if (!found) {
fb_area_t area;
area.x = _x;
area.y = _y;
area.dx = _dx;
area.dy = _dy;
area.element = element;
v_fbarea.push_back(area);
}
fbAreaActiv = true;
}
}
int CFrameBuffer::checkFbAreaElement(int _x, int _y, int _dx, int _dy, fb_area_t *area)
{
if (fb_no_check)
return FB_PAINTAREA_MATCH_NO;
if (_y > area->y + area->dy)
return FB_PAINTAREA_MATCH_NO;
if (_x + _dx < area->x)
return FB_PAINTAREA_MATCH_NO;
if (_x > area->x + area->dx)
return FB_PAINTAREA_MATCH_NO;
if (_y + _dy < area->y)
return FB_PAINTAREA_MATCH_NO;
return FB_PAINTAREA_MATCH_OK;
}
bool CFrameBuffer::_checkFbArea(int _x, int _y, int _dx, int _dy, bool prev)
{
if (v_fbarea.empty())
return true;
for (unsigned int i = 0; i < v_fbarea.size(); i++) {
int ret = checkFbAreaElement(_x, _y, _dx, _dy, &v_fbarea[i]);
if (ret == FB_PAINTAREA_MATCH_OK) {
switch (v_fbarea[i].element) {
case FB_PAINTAREA_MUTEICON1:
if (!do_paint_mute_icon)
break;
// waitForIdle();
fb_no_check = true;
if (prev)
CAudioMute::getInstance()->hide(true);
else
CAudioMute::getInstance()->paint();
fb_no_check = false;
break;
default:
break;
}
}
}
return true;
}

View File

@@ -2,23 +2,23 @@
Neutrino-GUI - DBoxII-Project Neutrino-GUI - DBoxII-Project
Copyright (C) 2001 Steffen Hehn 'McClean' Copyright (C) 2001 Steffen Hehn 'McClean'
Homepage: http://dbox.cyberphoria.org/
License: GPL License: GPL
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or
it under the terms of the GNU General Public License as published by modify it under the terms of the GNU General Public
the Free Software Foundation; either version 2 of the License, or License as published by the Free Software Foundation; either
(at your option) any later version. version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
GNU General Public License for more details. General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public
along with this program; if not, write to the Free Software License along with this program; if not, write to the
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
*/ */
@@ -31,6 +31,7 @@
#include <linux/vt.h> #include <linux/vt.h>
#include <string> #include <string>
#include <vector>
#include <map> #include <map>
#include <OpenThreads/Mutex> #include <OpenThreads/Mutex>
#include <OpenThreads/ScopedLock> #include <OpenThreads/ScopedLock>
@@ -243,6 +244,51 @@ class CFrameBuffer
}; };
void SetTransparent(int t){ m_transparent = t; } void SetTransparent(int t){ m_transparent = t; }
void SetTransparentDefault(){ m_transparent = m_transparent_default; } void SetTransparentDefault(){ m_transparent = m_transparent_default; }
// ## AudioMute / Clock ######################################
private:
enum {
FB_PAINTAREA_MATCH_NO,
FB_PAINTAREA_MATCH_OK
};
typedef struct fb_area_t
{
int x;
int y;
int dx;
int dy;
int element;
} fb_area_struct_t;
bool fbAreaActiv;
typedef std::vector<fb_area_t> v_fbarea_t;
typedef v_fbarea_t::iterator fbarea_iterator_t;
v_fbarea_t v_fbarea;
bool fb_no_check;
bool do_paint_mute_icon;
bool _checkFbArea(int _x, int _y, int _dx, int _dy, bool prev);
int checkFbAreaElement(int _x, int _y, int _dx, int _dy, fb_area_t *area);
public:
enum {
FB_PAINTAREA_INFOCLOCK,
FB_PAINTAREA_MUTEICON1,
FB_PAINTAREA_MUTEICON2,
FB_PAINTAREA_MAX
};
#if defined(FB_HW_ACCELERATION)
inline bool checkFbArea(int, int, int, int, bool) { return true; }
#else
inline bool checkFbArea(int _x, int _y, int _dx, int _dy, bool prev) { return (fbAreaActiv && !fb_no_check) ? _checkFbArea(_x, _y, _dx, _dy, prev) : true; }
#endif
void setFbArea(int element, int _x=0, int _y=0, int _dx=0, int _dy=0);
void fbNoCheck(bool noCheck) { fb_no_check = noCheck; }
void doPaintMuteIcon(bool mode) { do_paint_mute_icon = mode; }
}; };
#endif #endif

View File

@@ -37,6 +37,8 @@
CAudioMute::CAudioMute():CComponentsPicture(0, 0, 0, 0, NEUTRINO_ICON_BUTTON_MUTE) CAudioMute::CAudioMute():CComponentsPicture(0, 0, 0, 0, NEUTRINO_ICON_BUTTON_MUTE)
{ {
y_old = -1; y_old = -1;
paint_bg = false;
do_paint_mute_icon = true;
CVolumeHelper::getInstance()->refresh(); CVolumeHelper::getInstance()->refresh();
CVolumeHelper::getInstance()->getMuteIconDimensions(&x, &y, &width, &height); CVolumeHelper::getInstance()->getMuteIconDimensions(&x, &y, &width, &height);
} }
@@ -60,20 +62,53 @@ void CAudioMute::AudioMute(int newValue, bool isEvent)
if( isEvent && ( neutrino->getMode() != CNeutrinoApp::mode_scart ) && ( neutrino->getMode() != CNeutrinoApp::mode_audio) && ( neutrino->getMode() != CNeutrinoApp::mode_pic)) if( isEvent && ( neutrino->getMode() != CNeutrinoApp::mode_scart ) && ( neutrino->getMode() != CNeutrinoApp::mode_audio) && ( neutrino->getMode() != CNeutrinoApp::mode_pic))
{ {
CFrameBuffer *framebuffer = CFrameBuffer::getInstance();
CVolumeHelper::getInstance()->getMuteIconDimensions(&x, &y, &width, &height); CVolumeHelper::getInstance()->getMuteIconDimensions(&x, &y, &width, &height);
if ((y_old != y)) { if ((y_old != y)) {
this->hide(); if (do_paint_mute_icon)
{
framebuffer->fbNoCheck(true);
this->hide(true);
framebuffer->fbNoCheck(false);
}
framebuffer->setFbArea(CFrameBuffer::FB_PAINTAREA_MUTEICON1);
y_old = y; y_old = y;
} }
if ((g_settings.mode_clock) && (doInit)) if ((g_settings.mode_clock) && (doInit))
CInfoClock::getInstance()->ClearDisplay(); CInfoClock::getInstance()->ClearDisplay();
if (newValue) framebuffer->fbNoCheck(true);
if (newValue) {
if (do_paint_mute_icon)
this->paint(); this->paint();
else framebuffer->setFbArea(CFrameBuffer::FB_PAINTAREA_MUTEICON1, this->getXPos(), this->getYPos(), this->getWidth(), this->getHeight());
this->hide(); }
else {
if (do_paint_mute_icon)
this->hide(true);
framebuffer->setFbArea(CFrameBuffer::FB_PAINTAREA_MUTEICON1);
}
framebuffer->fbNoCheck(false);
if (doInit) if (doInit)
CVolumeHelper::getInstance()->refresh(); CVolumeHelper::getInstance()->refresh();
} }
} }
void CAudioMute::enableMuteIcon(bool enable)
{
CNeutrinoApp *neutrino = CNeutrinoApp::getInstance();
CFrameBuffer *framebuffer = CFrameBuffer::getInstance();
if (enable) {
framebuffer->doPaintMuteIcon(true);
do_paint_mute_icon = true;
if (neutrino->isMuted())
this->paint();
}
else {
if (neutrino->isMuted())
this->hide(true);
framebuffer->doPaintMuteIcon(false);
do_paint_mute_icon = false;
}
}

View File

@@ -33,6 +33,7 @@ class CAudioMute : public CComponentsPicture
{ {
private: private:
int y_old; int y_old;
bool do_paint_mute_icon;
public: public:
@@ -41,6 +42,8 @@ class CAudioMute : public CComponentsPicture
static CAudioMute* getInstance(); static CAudioMute* getInstance();
void AudioMute(int newValue, bool isEvent= false); void AudioMute(int newValue, bool isEvent= false);
void doPaintMuteIcon(bool mode) { do_paint_mute_icon = mode; }
void enableMuteIcon(bool enable);
}; };
#endif // __CAUDIOMUTE__ #endif // __CAUDIOMUTE__