framebuffer-ng: implement new framebuffer functions

This commit is contained in:
Stefan Seyfried
2013-05-24 22:28:22 +02:00
parent a7f1e0e25e
commit 0c56de9801
2 changed files with 151 additions and 11 deletions

View File

@@ -43,6 +43,7 @@
extern GLFramebuffer *glfb; extern GLFramebuffer *glfb;
#endif #endif
#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>
@@ -68,7 +69,7 @@ extern CPictureViewer * g_PicViewer;
/*******************************************************************************/ /*******************************************************************************/
void CFrameBuffer::waitForIdle(void) void CFrameBuffer::waitForIdle(const char *)
{ {
accel->waitForIdle(); accel->waitForIdle();
} }
@@ -276,15 +277,25 @@ unsigned int CFrameBuffer::getScreenHeight(bool real)
return g_settings.screen_EndY - g_settings.screen_StartY; return g_settings.screen_EndY - g_settings.screen_StartY;
} }
unsigned int CFrameBuffer::getScreenWidthRel()
unsigned int CFrameBuffer::getScreenPercentRel(bool force_small)
{ {
// always reduce a possible detailline if (force_small || !g_settings.big_windows)
return (g_settings.screen_EndX - g_settings.screen_StartX - 2*ConnectLineBox_Width) * (g_settings.big_windows ? 100 : NON_BIG_WINDOWS) / 100; return NON_BIG_WINDOWS;
return 100;
} }
unsigned int CFrameBuffer::getScreenHeightRel() unsigned int CFrameBuffer::getScreenWidthRel(bool force_small)
{ {
return (g_settings.screen_EndY - g_settings.screen_StartY) * (g_settings.big_windows ? 100 : NON_BIG_WINDOWS) / 100; int percent = getScreenPercentRel(force_small);
// always reduce a possible detailline
return (g_settings.screen_EndX - g_settings.screen_StartX - 2*ConnectLineBox_Width) * percent / 100;
}
unsigned int CFrameBuffer::getScreenHeightRel(bool force_small)
{
int percent = getScreenPercentRel(force_small);
return (g_settings.screen_EndY - g_settings.screen_StartY) * percent / 100;
} }
unsigned int CFrameBuffer::getScreenX() unsigned int CFrameBuffer::getScreenX()
@@ -906,7 +917,8 @@ void CFrameBuffer::loadPal(const std::string & filename, const unsigned char off
close(lfd); close(lfd);
} }
void CFrameBuffer::paintBoxFrame(const int sx, const int sy, const int dx, const int dy, const int px, const fb_pixel_t col, const int rad)
void CFrameBuffer::paintBoxFrame(const int sx, const int sy, const int dx, const int dy, const int px, const fb_pixel_t col, const int rad, int type)
{ {
if (!getActive()) if (!getActive())
return; return;
@@ -1213,3 +1225,88 @@ void CFrameBuffer::paintMuteIcon(bool paint, int ax, int ay, int dx, int dy, boo
paintBackgroundBoxRel(ax, ay, dx, dy); paintBackgroundBoxRel(ax, ay, dx, dy);
blit(); blit();
} }
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;
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

@@ -33,6 +33,7 @@
#include <string> #include <string>
#include <map> #include <map>
#include <vector>
#include <OpenThreads/Mutex> #include <OpenThreads/Mutex>
#include <OpenThreads/ScopedLock> #include <OpenThreads/ScopedLock>
@@ -175,8 +176,9 @@ class CFrameBuffer
unsigned int getStride() const; // size of a single line in the framebuffer (in bytes) unsigned int getStride() const; // size of a single line in the framebuffer (in bytes)
unsigned int getScreenWidth(bool real = false); unsigned int getScreenWidth(bool real = false);
unsigned int getScreenHeight(bool real = false); unsigned int getScreenHeight(bool real = false);
unsigned int getScreenWidthRel(); unsigned int getScreenPercentRel(bool force_small);
unsigned int getScreenHeightRel(); unsigned int getScreenWidthRel(bool force_small = false);
unsigned int getScreenHeightRel(bool force_small = false);
unsigned int getScreenX(); unsigned int getScreenX();
unsigned int getScreenY(); unsigned int getScreenY();
@@ -204,7 +206,7 @@ class CFrameBuffer
inline void paintBox(int xa, int ya, int xb, int yb, const fb_pixel_t col) { paintBoxRel(xa, ya, xb - xa, yb - ya, col); } inline void paintBox(int xa, int ya, int xb, int yb, const fb_pixel_t col) { paintBoxRel(xa, ya, xb - xa, yb - ya, col); }
inline void paintBox(int xa, int ya, int xb, int yb, const fb_pixel_t col, int radius, int type) { paintBoxRel(xa, ya, xb - xa, yb - ya, col, radius, type); } inline void paintBox(int xa, int ya, int xb, int yb, const fb_pixel_t col, int radius, int type) { paintBoxRel(xa, ya, xb - xa, yb - ya, col, radius, type); }
void paintBoxFrame(const int x, const int y, const int dx, const int dy, const int px, const fb_pixel_t col, const int rad = 0); void paintBoxFrame(const int x, const int y, const int dx, const int dy, const int px, const fb_pixel_t col, const int rad = 0, int type = CORNER_ALL);
void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col); void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col);
void paintVLine(int x, int ya, int yb, const fb_pixel_t col); void paintVLine(int x, int ya, int yb, const fb_pixel_t col);
@@ -251,7 +253,7 @@ class CFrameBuffer
bool Lock(void); bool Lock(void);
void Unlock(void); void Unlock(void);
bool Locked(void) { return locked; }; bool Locked(void) { return locked; };
void waitForIdle(void); void waitForIdle(const char *func = NULL);
void* convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y, int transp = 0xFF); void* convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y, int transp = 0xFF);
void* convertRGBA2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y); void* convertRGBA2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y);
void displayRGB(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, bool clearfb = true, int transp = 0xFF); void displayRGB(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, bool clearfb = true, int transp = 0xFF);
@@ -271,6 +273,47 @@ 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
};
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; }
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