allow access to gfbdc from python to set resolution
authorFelix Domke <tmbinc@elitedvb.net>
Sat, 10 Nov 2007 13:01:54 +0000 (13:01 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sat, 10 Nov 2007 13:01:54 +0000 (13:01 +0000)
lib/gdi/gfbdc.cpp
lib/gdi/gfbdc.h
lib/gdi/grc.h
lib/python/enigma_python.i

index 871ccd2313e50b44a2efad9c6574452fc166fe2f..02ebc4ff02134c1898d1b187124424bf4e6039f4 100644 (file)
@@ -17,62 +17,15 @@ gFBDC::gFBDC()
        if (!fb->Available())
                eFatal("no framebuffer available");
 
        if (!fb->Available())
                eFatal("no framebuffer available");
 
-       fb->SetMode(720, 576, 32);
+       surface.clut.data = 0;
+       setResolution(720, 576); // default res
 
 
-       for (int y=0; y<576; y++)                                                                                                                                                // make whole screen transparent
-               memset(fb->lfb+y*fb->Stride(), 0x00, fb->Stride());
-
-       surface.type = 0;
-       surface.x = 720;
-       surface.y = 576;
-       surface.bpp = 32;
-       surface.bypp = 4;
-       surface.stride = fb->Stride();
-       surface.data = fb->lfb;
-       surface.offset = 0;
-       
-       surface.data_phys = 50*1024*1024; // FIXME
-       
-       int fb_size = surface.stride * surface.y;
-
-       if (fb->getNumPages() > 1)
-       {
-               m_enable_double_buffering = 1;
-               surface_back.type = 0;
-               surface_back.x = 720;
-               surface_back.y = 576;
-               surface_back.bpp = 32;
-               surface_back.bypp = 4;
-               surface_back.stride = fb->Stride();
-               surface_back.offset = surface.y;
-               surface_back.data = fb->lfb + fb_size;
-               surface_back.data_phys = surface.data_phys + fb_size;
-       
-               fb_size *= 2;
-       } else
-               m_enable_double_buffering = 0;
-       
-       eDebug("%dkB available for acceleration surfaces.", (fb->Available() - fb_size)/1024);
-       eDebug("resolution: %d x %d x %d (stride: %d)", surface.x, surface.y, surface.bpp, fb->Stride());
-
-       if (gAccel::getInstance())
-               gAccel::getInstance()->setAccelMemorySpace(fb->lfb + fb_size, surface.data_phys + fb_size, fb->Available() - fb_size);
-       
-       surface.clut.colors = 256;
-       surface.clut.data = new gRGB[surface.clut.colors];
-       
-       surface_back.clut = surface.clut;
-       
-       m_pixmap = new gPixmap(&surface);
-       
-       memset(surface.clut.data, 0, sizeof(*surface.clut.data)*surface.clut.colors);
        reloadSettings();
 }
 
 gFBDC::~gFBDC()
 {
        delete fb;
        reloadSettings();
 }
 
 gFBDC::~gFBDC()
 {
        delete fb;
-       
        delete[] surface.clut.data;
        instance=0;
 }
        delete[] surface.clut.data;
        instance=0;
 }
@@ -94,7 +47,7 @@ void gFBDC::calcRamp()
                if (d > 255)
                        d=255;
                ramp[i]=d;
                if (d > 255)
                        d=255;
                ramp[i]=d;
-               
+
                rampalpha[i]=i*alpha/256;
        }
 #endif
                rampalpha[i]=i*alpha/256;
        }
 #endif
@@ -120,7 +73,7 @@ void gFBDC::setPalette()
 {
        if (!surface.clut.data)
                return;
 {
        if (!surface.clut.data)
                return;
-       
+
        for (int i=0; i<256; ++i)
        {
                fb->CMAP()->red[i]=ramp[surface.clut.data[i].r]<<8;
        for (int i=0; i<256; ++i)
        {
                fb->CMAP()->red[i]=ramp[surface.clut.data[i].r]<<8;
@@ -148,7 +101,7 @@ void gFBDC::exec(gOpcode *o)
                        gSurface s(surface);
                        surface = surface_back;
                        surface_back = s;
                        gSurface s(surface);
                        surface = surface_back;
                        surface_back = s;
-               
+
                        fb->setOffset(surface_back.offset);
                }
                break;
                        fb->setOffset(surface_back.offset);
                }
                break;
@@ -158,19 +111,19 @@ void gFBDC::exec(gOpcode *o)
                static timeval l;
                static int t;
                timeval now;
                static timeval l;
                static int t;
                timeval now;
-               
+
                if (t == 1000)
                {
                        gettimeofday(&now, 0);
                if (t == 1000)
                {
                        gettimeofday(&now, 0);
-               
+
                        int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000;
                        eDebug("%d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1));
                        l = now;
                        t = 0;
                }
                        int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000;
                        eDebug("%d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1));
                        l = now;
                        t = 0;
                }
-               
+
                ++t;
                ++t;
-               
+
                fb->waitVSync();
                break;
        }
                fb->waitVSync();
                break;
        }
@@ -204,6 +157,66 @@ void gFBDC::setGamma(int g)
        setPalette();
 }
 
        setPalette();
 }
 
+void gFBDC::setResolution(int xres, int yres)
+{
+       if ((m_xres == xres) && (m_yres == yres))
+               return;
+
+       m_xres = xres; m_yres = yres;
+
+       fb->SetMode(m_xres, m_yres, 32);
+
+       for (int y=0; y<m_yres; y++)    // make whole screen transparent
+               memset(fb->lfb+y*fb->Stride(), 0x00, fb->Stride());
+
+       surface.type = 0;
+       surface.x = m_xres;
+       surface.y = m_yres;
+       surface.bpp = 32;
+       surface.bypp = 4;
+       surface.stride = fb->Stride();
+       surface.data = fb->lfb;
+       surface.offset = 0;
+
+       surface.data_phys = 50*1024*1024; // FIXME
+
+       int fb_size = surface.stride * surface.y;
+
+       if (fb->getNumPages() > 1)
+       {
+               m_enable_double_buffering = 1;
+               surface_back.type = 0;
+               surface_back.x = m_xres;
+               surface_back.y = m_yres;
+               surface_back.bpp = 32;
+               surface_back.bypp = 4;
+               surface_back.stride = fb->Stride();
+               surface_back.offset = surface.y;
+               surface_back.data = fb->lfb + fb_size;
+               surface_back.data_phys = surface.data_phys + fb_size;
+
+               fb_size *= 2;
+       } else
+               m_enable_double_buffering = 0;
+
+       eDebug("%dkB available for acceleration surfaces.", (fb->Available() - fb_size)/1024);
+       eDebug("resolution: %d x %d x %d (stride: %d)", surface.x, surface.y, surface.bpp, fb->Stride());
+
+       if (gAccel::getInstance())
+               gAccel::getInstance()->setAccelMemorySpace(fb->lfb + fb_size, surface.data_phys + fb_size, fb->Available() - fb_size);
+
+       if (!surface.clut.data)
+       {
+               surface.clut.colors = 256;
+               surface.clut.data = new gRGB[surface.clut.colors];
+               memset(surface.clut.data, 0, sizeof(*surface.clut.data)*surface.clut.colors);
+       }
+
+       surface_back.clut = surface.clut;
+
+       m_pixmap = new gPixmap(&surface);
+}
+
 void gFBDC::saveSettings()
 {
 }
 void gFBDC::saveSettings()
 {
 }
index 16260fb202c5349fb5bbe835370caa560f22ef88..aad50f2b5d341d0e34d4490d8ccd1c6b30d3e0ed 100644 (file)
@@ -5,8 +5,13 @@
 #include "gpixmap.h"
 #include "grc.h"
 
 #include "gpixmap.h"
 #include "grc.h"
 
+class gFBDC;
+
+SWIG_TEMPLATE_TYPEDEF(ePtr<gFBDC>, gFBDCPtr);
+
 class gFBDC: public gDC
 {
 class gFBDC: public gDC
 {
+#ifndef SWIG
        fbClass *fb;
        static gFBDC *instance;
        void exec(gOpcode *opcode);
        fbClass *fb;
        static gFBDC *instance;
        void exec(gOpcode *opcode);
@@ -16,25 +21,28 @@ class gFBDC: public gDC
        void setPalette();
        gSurface surface, surface_back;
        int m_enable_double_buffering;
        void setPalette();
        gSurface surface, surface_back;
        int m_enable_double_buffering;
+       int m_xres, m_yres;
+#endif
 public:
        void reloadSettings();
        void setAlpha(int alpha);
        void setBrightness(int brightness);
        void setGamma(int gamma);
 public:
        void reloadSettings();
        void setAlpha(int alpha);
        void setBrightness(int brightness);
        void setGamma(int gamma);
-       
+
        int getAlpha() { return alpha; }
        int getBrightness() { return brightness; }
        int getGamma() { return gamma; }
        int getAlpha() { return alpha; }
        int getBrightness() { return brightness; }
        int getGamma() { return gamma; }
-       
+
        int haveDoubleBuffering() { return m_enable_double_buffering; }
        int haveDoubleBuffering() { return m_enable_double_buffering; }
-       
+
+       void setResolution(int xres, int yres);
+
        void saveSettings();
        void saveSettings();
-       
+
        gFBDC();
        virtual ~gFBDC();
        gFBDC();
        virtual ~gFBDC();
-       static int getInstance(ePtr<gFBDC> &ptr) { if (!instance) return -1; ptr = instance; return 0; }
+       static SWIG_VOID(int) getInstance(ePtr<gFBDC> &SWIG_NAMED_OUTPUT(ptr)) { if (!instance) return -1; ptr = instance; return 0; }
        int islocked() { return fb->islocked(); }
 };
 
        int islocked() { return fb->islocked(); }
 };
 
-
 #endif
 #endif
index 555f2ffb9485e6e0f1d0cfe5b8d12bf9450710de..57d3dce4098e71006eca2ad5e67dbd2e7edbbb14 100644 (file)
@@ -23,6 +23,7 @@
 #include <lib/gdi/region.h>
 #include <lib/gdi/gfont.h>
 
 #include <lib/gdi/region.h>
 #include <lib/gdi/gfont.h>
 
+#ifndef SWIG
 class eTextPara;
 
 class gDC;
 class eTextPara;
 
 class gDC;
@@ -255,10 +256,12 @@ public:
        void flip();
        void notify();
 };
        void flip();
        void notify();
 };
+#endif
 
 class gDC: public iObject
 {
 DECLARE_REF(gDC);
 
 class gDC: public iObject
 {
 DECLARE_REF(gDC);
+#ifndef SWIG
 protected:
        ePtr<gPixmap> m_pixmap;
 
 protected:
        ePtr<gPixmap> m_pixmap;
 
@@ -276,6 +279,9 @@ protected:
        int m_spinner_num, m_spinner_i;
 public:
        virtual void exec(gOpcode *opcode);
        int m_spinner_num, m_spinner_i;
 public:
        virtual void exec(gOpcode *opcode);
+#else
+public:
+#endif
        gDC(gPixmap *pixmap);
        gDC();
        virtual ~gDC();
        gDC(gPixmap *pixmap);
        gDC();
        virtual ~gDC();
index 3783beed916ca97798bdcc065920acc6cf9930f1..ee5a13ba561d600eac52456249f5a02fa2342926 100644 (file)
@@ -50,6 +50,8 @@ is usually caused by not marking PSignals as immutable.
 #include <lib/gdi/fb.h>
 #include <lib/gdi/font.h>
 #include <lib/gdi/gpixmap.h>
 #include <lib/gdi/fb.h>
 #include <lib/gdi/font.h>
 #include <lib/gdi/gpixmap.h>
+#include <lib/gdi/grc.h>
+#include <lib/gdi/gfbdc.h>
 #include <lib/gui/ewidget.h>
 #include <lib/gui/elabel.h>
 #include <lib/gui/einput.h>
 #include <lib/gui/ewidget.h>
 #include <lib/gui/elabel.h>
 #include <lib/gui/einput.h>
@@ -163,6 +165,8 @@ typedef long time_t;
 %include <lib/gdi/fb.h>
 %include <lib/gdi/font.h>
 %include <lib/gdi/gpixmap.h>
 %include <lib/gdi/fb.h>
 %include <lib/gdi/font.h>
 %include <lib/gdi/gpixmap.h>
+%include <lib/gdi/grc.h>
+%include <lib/gdi/gfbdc.h>
 %include <lib/gdi/epoint.h>
 %include <lib/gdi/erect.h>
 %include <lib/gdi/esize.h>
 %include <lib/gdi/epoint.h>
 %include <lib/gdi/erect.h>
 %include <lib/gdi/esize.h>