From 3bad2c1636a3e2e2809cd211cb8c3775a0ef3902 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 25 Jul 2009 00:02:23 +0200 Subject: [PATCH] make PIG working with HD Skins --- lib/gui/evideo.cpp | 159 +++++++++++++++++++++----- lib/gui/evideo.h | 12 +- lib/python/Components/Renderer/Pig.py | 8 +- lib/python/Components/VideoWindow.py | 7 +- 4 files changed, 147 insertions(+), 39 deletions(-) diff --git a/lib/gui/evideo.cpp b/lib/gui/evideo.cpp index 328d95e4..745571d2 100644 --- a/lib/gui/evideo.cpp +++ b/lib/gui/evideo.cpp @@ -1,9 +1,44 @@ #include +#include -eVideoWidget::eVideoWidget(eWidget *parent): eWidget(parent) +static ePtr fullsizeTimer; +static int pendingFullsize; + +void setFullsize() { - m_decoder = 1; + for (int decoder=0; decoder < 1; ++decoder) + { + if (pendingFullsize & (1 << decoder)) + { + for (int i=0; i<4; ++i) + { + const char *targets[]={"left", "top", "width", "height"}; + char filename[128]; + snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", decoder, targets[i]); + FILE *f = fopen(filename, "w"); + if (!f) + { + eDebug("failed to open %s - %m", filename); + break; + } + fprintf(f, "%08x\n", 0); + fclose(f); + } + pendingFullsize &= ~(1 << decoder); + } + } +} + +eVideoWidget::eVideoWidget(eWidget *parent) + :eLabel(parent), m_fb_size(720, 576), m_state(0), m_decoder(1) +{ + if (!fullsizeTimer) + { + fullsizeTimer = eTimer::create(eApp); + fullsizeTimer->timeout.connect(slot(setFullsize)); + } parent->setPositionNotifyChild(1); +// setBackgroundColor(gRGB(0xFF000000)); } int eVideoWidget::event(int event, void *data, void *data2) @@ -11,13 +46,19 @@ int eVideoWidget::event(int event, void *data, void *data2) switch (event) { case evtChangedPosition: - case evtChangedSize: case evtParentChangedPosition: + m_state &= ~1; + updatePosition(!isVisible()); + break; + case evtChangedSize: + m_state |= 2; + updatePosition(!isVisible()); + break; case evtParentVisibilityChanged: updatePosition(!isVisible()); break; } - return eWidget::event(event, data, data2); + return eLabel::event(event, data, data2); } eVideoWidget::~eVideoWidget() @@ -25,42 +66,106 @@ eVideoWidget::~eVideoWidget() updatePosition(1); } +void eVideoWidget::setFBSize(eSize size) +{ + m_fb_size = size; +} + void eVideoWidget::updatePosition(int disable) { - eRect pos(0, 0, 0, 0); + if (!disable) + m_state |= 4; + + if (disable && !(m_state & 4)) + { +// eDebug("was not visible!"); + return; + } + + if ((m_state & 2) != 2) + { +// eDebug("no size!"); + return; + } + +// eDebug("position %d %d -> %d %d", position().x(), position().y(), size().width(), size().height()); + + eRect pos(0,0,0,0); if (!disable) pos = eRect(getAbsolutePosition(), size()); + else + m_state &= ~4; + +// eDebug("abs position %d %d -> %d %d", pos.left(), pos.top(), pos.width(), pos.height()); - if (m_cur_pos == pos) + if (!disable && m_state & 8 && pos == m_user_rect) + { +// eDebug("matched"); return; + } - m_cur_pos = pos; + if (!(m_state & 1)) + { + m_user_rect = pos; + m_state |= 1; +// eDebug("set user rect pos!"); + } + +// eDebug("m_user_rect %d %d -> %d %d", m_user_rect.left(), m_user_rect.top(), m_user_rect.width(), m_user_rect.height()); - eDebug("position is %d %d -> %d %d", pos.left(), pos.top(), pos.width(), pos.height()); + int left = pos.left() * 720 / m_fb_size.width(); + int top = pos.top() * 576 / m_fb_size.height(); + int width = pos.width() * 720 / m_fb_size.width(); + int height = pos.height() * 576 / m_fb_size.height(); - for (int i=0; i<4; ++i) + int tmp = left - (width * 4) / 100; + left = tmp < 0 ? 0 : tmp; + tmp = top - (height * 4) / 100; + top = tmp < 0 ? 0 : tmp; + tmp = (width * 108) / 100; + width = left + tmp > 720 ? 720 - left : tmp; + tmp = (height * 108) / 100; + height = top + tmp > 576 ? 576 - top : tmp; + +// eDebug("picture recalced %d %d -> %d %d", left, top, width, height); + + if (!disable) { - const char *targets[]={"left", "top", "width", "height"}; - char filename[128]; - snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", m_decoder, targets[i]); - FILE *f = fopen(filename, "w"); - if (!f) + for (int i=0; i<4; ++i) { - eDebug("failed to open %s - %m", filename); - break; + const char *targets[]={"left", "top", "width", "height"}; + char filename[128]; + snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", m_decoder, targets[i]); + FILE *f = fopen(filename, "w"); + if (!f) + { + eDebug("failed to open %s - %m", filename); + break; + } + int val = 0; + { + switch (i) + { + case 0: val = left; break; + case 1: val = top; break; + case 2: val = width; break; + case 3: val = height; break; + } + fprintf(f, "%08x\n", val); + fclose(f); +// eDebug("%s %08x", filename, val); + } } - int val = 0; - switch (i) - { - case 0: val = pos.left(); break; - case 1: val = pos.top(); break; - case 2: val = pos.width(); break; - case 3: val = pos.height(); break; - } - fprintf(f, "%08x\n", val); - fclose(f); - eDebug("%s %08x", filename, val); + pendingFullsize &= ~(1 << m_decoder); + m_state |= 8; } + else + { + m_state &= ~8; + pendingFullsize |= (1 << m_decoder); + fullsizeTimer->start(100, true); + } + } void eVideoWidget::setDecoder(int decoder) diff --git a/lib/gui/evideo.h b/lib/gui/evideo.h index daa45a22..2f1b91b6 100644 --- a/lib/gui/evideo.h +++ b/lib/gui/evideo.h @@ -1,20 +1,22 @@ #ifndef __lib_gui_evideo_h #define __lib_gui_evideo_h -#include +#include -class eVideoWidget: public eWidget +class eVideoWidget: public eLabel { + eSize m_fb_size; + int m_state; + eRect m_user_rect; + int m_decoder; public: eVideoWidget(eWidget *parent); ~eVideoWidget(); void setDecoder(int target); + void setFBSize(eSize size); protected: int event(int event, void *data=0, void *data2=0); void updatePosition(int disable = 0); - eRect m_cur_pos; - - int m_decoder; }; #endif diff --git a/lib/python/Components/Renderer/Pig.py b/lib/python/Components/Renderer/Pig.py index 23e1393d..64ed6778 100644 --- a/lib/python/Components/Renderer/Pig.py +++ b/lib/python/Components/Renderer/Pig.py @@ -2,7 +2,7 @@ ## P(icture)i(n)g(raphics) renderer ## from Renderer import Renderer -from enigma import eVideoWidget, eSize, ePoint +from enigma import eVideoWidget, eSize, ePoint, getDesktop class Pig(Renderer): def __init__(self): @@ -12,7 +12,9 @@ class Pig(Renderer): GUI_WIDGET = eVideoWidget def postWidgetCreate(self, instance): + desk = getDesktop(0) instance.setDecoder(0) + instance.setFBSize(desk.size()) def applySkin(self, desktop, parent): ret = Renderer.applySkin(self, desktop, parent) @@ -21,10 +23,6 @@ class Pig(Renderer): self.Size = self.instance.size() return ret - def preWidgetRemove(self, instance): - instance.resize(eSize(720,576)) - instance.move(ePoint(0,0)) - def onShow(self): if self.instance: if self.Size: diff --git a/lib/python/Components/VideoWindow.py b/lib/python/Components/VideoWindow.py index 31190d95..2906aa31 100644 --- a/lib/python/Components/VideoWindow.py +++ b/lib/python/Components/VideoWindow.py @@ -1,12 +1,15 @@ from GUIComponent import GUIComponent -from enigma import eVideoWidget +from enigma import eVideoWidget, eSize class VideoWindow(GUIComponent): - def __init__(self, decoder = 1): + def __init__(self, decoder = 1, fb_width = 720, fb_height = 576): GUIComponent.__init__(self) self.decoder = decoder + self.fb_width = fb_width + self.fb_height = fb_height GUI_WIDGET = eVideoWidget def postWidgetCreate(self, instance): instance.setDecoder(self.decoder) + instance.setFBSize(eSize(self.fb_width, self.fb_height)); \ No newline at end of file -- 2.30.2