Merge branch 'master' of git.opendreambox.org:/git/enigma2
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 3 Jun 2009 17:00:24 +0000 (19:00 +0200)
committerFelix Domke <tmbinc@elitedvb.net>
Wed, 3 Jun 2009 17:00:24 +0000 (19:00 +0200)
23 files changed:
lib/gdi/Makefile.am
lib/gdi/accel.cpp
lib/gdi/accel.h
lib/gdi/bcm.cpp [new file with mode: 0644]
lib/gdi/compositing.cpp [new file with mode: 0644]
lib/gdi/compositing.h [new file with mode: 0644]
lib/gdi/erect.h
lib/gdi/fb.cpp
lib/gdi/fb.h
lib/gdi/gfbdc.cpp
lib/gdi/gpixmap.cpp
lib/gdi/gpixmap.h
lib/gdi/grc.cpp
lib/gdi/grc.h
lib/gdi/region.cpp
lib/gdi/region.h
lib/gui/epixmap.cpp
lib/gui/epixmap.h
lib/gui/esubtitle.cpp
lib/gui/ewidgetanimation.cpp
lib/gui/ewidgetdesktop.cpp
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
skin.py

index 46ed948a9ec9dfd73633775040da105089799a83..1280556eff8d47bae2c5a782accd426e9a3ddb55 100644 (file)
@@ -5,7 +5,8 @@ noinst_LIBRARIES = libenigma_gdi.a
 
 libenigma_gdi_a_SOURCES = \
        region.cpp grc.cpp epng.cpp erect.cpp fb.cpp font.cpp font_arabic.cpp gfbdc.cpp  \
-       glcddc.cpp gpixmap.cpp lcd.cpp gfont.cpp accel.cpp picload.cpp picexif.cpp
+       glcddc.cpp gpixmap.cpp lcd.cpp gfont.cpp accel.cpp picload.cpp picexif.cpp \
+       compositing.cpp bcm.cpp
 
 if WITH_SDL
 libenigma_gdi_a_SOURCES += sdl.cpp
index d9c80e2ea82cf17b12eec2723ed92ec6c623511b..bf9a5a44d26f3039aa908f67f3c382f36e879dde 100644 (file)
@@ -9,7 +9,9 @@
 #include <lib/gdi/gpixmap.h>
 
 gAccel *gAccel::instance;
+#define BCM_ACCEL
 
+#ifdef ATI_ACCEL
 extern int ati_accel_init(void);
 extern void ati_accel_close(void);
 extern void ati_accel_blit(
@@ -21,6 +23,20 @@ extern void ati_accel_fill(
                int dst_addr, int dst_width, int dst_height, int dst_stride,
                int x, int y, int width, int height,
                unsigned long color);
+#endif
+#ifdef BCM_ACCEL
+extern int bcm_accel_init(void);
+extern void bcm_accel_close(void);
+extern void bcm_accel_blit(
+               int src_addr, int src_width, int src_height, int src_stride,
+               int dst_addr, int dst_width, int dst_height, int dst_stride,
+               int src_x, int src_y, int width, int height,
+               int dst_x, int dst_y, int dwidth, int dheight);
+extern void bcm_accel_fill(
+               int dst_addr, int dst_width, int dst_height, int dst_stride,
+               int x, int y, int width, int height,
+               unsigned long color);
+#endif
 
 gAccel::gAccel()
 {
@@ -33,12 +49,18 @@ gAccel::gAccel()
 #ifdef ATI_ACCEL       
        ati_accel_init();
 #endif
+#ifdef BCM_ACCEL       
+       m_bcm_accel_state = bcm_accel_init();
+#endif
 }
 
 gAccel::~gAccel()
 {
 #ifdef ATI_ACCEL
        ati_accel_close();
+#endif
+#ifdef BCM_ACCEL
+       bcm_accel_close();
 #endif
        instance = 0;
 }
@@ -62,7 +84,7 @@ void gAccel::setAccelMemorySpace(void *addr, int phys_addr, int size)
        m_accel_phys_addr = phys_addr;
 }
 
-int gAccel::blit(gSurface *dst, const gSurface *src, const ePoint &p, const eRect &area, int flags)
+int gAccel::blit(gSurface *dst, const gSurface *src, const eRect &p, const eRect &area, int flags)
 {
 #ifdef ATI_ACCEL
        ati_accel_blit(
@@ -71,6 +93,17 @@ int gAccel::blit(gSurface *dst, const gSurface *src, const ePoint &p, const eRec
                area.left(), area.top(), area.width(), area.height(),
                p.x(), p.y());
        return 0;
+#endif
+#ifdef BCM_ACCEL
+       if (!m_bcm_accel_state)
+       {
+               bcm_accel_blit(
+                       src->data_phys, src->x, src->y, src->stride,
+                       dst->data_phys, dst->x, dst->y, dst->stride, 
+                       area.left(), area.top(), area.width(), area.height(),
+                       p.x(), p.y(), p.width(), p.height());
+               return 0;
+       }
 #endif
        return -1;
 }
@@ -83,12 +116,20 @@ int gAccel::fill(gSurface *dst, const eRect &area, unsigned long col)
                area.left(), area.top(), area.width(), area.height(),
                col);
        return 0;
+#endif
+#if 0 // def BCM_ACCEL
+       bcm_accel_fill(
+               dst->data_phys, dst->x, dst->y, dst->stride, 
+               area.left(), area.top(), area.width(), area.height(),
+               col);
+       return 0;
 #endif
        return -1;
 }
 
 int gAccel::accelAlloc(void *&addr, int &phys_addr, int size)
 {
+       eDebug("accel %d bytes", size);
        if ((!size) || (!m_accel_allocation))
        {
                eDebug("size: %d, alloc %p", size, m_accel_allocation);
@@ -99,6 +140,21 @@ int gAccel::accelAlloc(void *&addr, int &phys_addr, int size)
        
        size += 4095; size >>= 12;
        int i;
+       
+       int used = 0, free = 0, s = 0;
+       for (i=0; i < m_accel_size; ++i)
+       {
+               if (m_accel_allocation[i] == 0)
+                       free++;
+               else if (m_accel_allocation[i] == -1)
+                       used++;
+               else
+               {
+                       used++;
+                       s += m_accel_allocation[i];
+               }
+       }
+       eDebug("accel memstat: used=%d kB, free %d kB, s %d kB", used * 4, free * 4, s * 4);
 
        for (i=0; i < m_accel_size - size; ++i)
        {
@@ -108,7 +164,7 @@ int gAccel::accelAlloc(void *&addr, int &phys_addr, int size)
                                break;
                if (a == size)
                {
-                       m_accel_allocation[i+a] = size;
+                       m_accel_allocation[i] = size;
                        for (a=1; a<size; ++a)
                                m_accel_allocation[i+a] = -1;
                        addr = ((unsigned char*)m_accel_addr) + (i << 12);
@@ -116,6 +172,7 @@ int gAccel::accelAlloc(void *&addr, int &phys_addr, int size)
                        return 0;
                }
        }
+       eDebug("accel alloc failed\n");
        return -1;
 }
 
index 63d3bf306209aca01529c82b74e94fd1430aac81..bbb2e26acb3ca17308123a2d50aca1e51ca535eb 100644 (file)
@@ -14,7 +14,7 @@ public:
        
        void setAccelMemorySpace(void *addr, int phys_addr, int size);
        
-       int blit(gSurface *dst, const gSurface *src, const ePoint &p, const eRect &area, int flags);
+       int blit(gSurface *dst, const gSurface *src, const eRect &p, const eRect &area, int flags);
        int fill(gSurface *dst, const eRect &area, unsigned long col);
        
        int accelAlloc(void *&addr, int &phys_addr, int size);
@@ -24,6 +24,7 @@ private:
        int m_accel_phys_addr;
        int m_accel_size; // in blocks
        int *m_accel_allocation;
+       int m_bcm_accel_state;
        
        static gAccel *instance;
 };
diff --git a/lib/gdi/bcm.cpp b/lib/gdi/bcm.cpp
new file mode 100644 (file)
index 0000000..bd82091
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+  Interface to the Dreambox dm800/dm8000 proprietary accel interface.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+
+#define FBIO_ACCEL  0x23
+
+static unsigned int displaylist[1024];
+static int ptr;
+
+#define P(x, y) do { displaylist[ptr++] = x; displaylist[ptr++] = y; } while (0)
+#define C(x) P(x, 0)
+
+static int fb_fd;
+static int exec_list(void);
+
+int bcm_accel_init(void)
+{
+       fb_fd = open("/dev/fb/0", O_RDWR);
+       if (fb_fd < 0)
+       {
+               perror("/dev/fb/0");
+               return 1;
+       }
+       if (exec_list())
+       {
+               fprintf(stderr, "BCM accel interface not available - %m\n");
+               close(fb_fd);
+               return 1;
+       }
+       return 0;
+}
+
+void bcm_accel_close(void)
+{
+       close(fb_fd);
+}
+
+static int exec_list(void)
+{
+       int ret;
+       struct
+       {
+               void *ptr;
+               int len;
+       } l;
+
+       l.ptr = displaylist;
+       l.len = ptr;
+       ret = ioctl(fb_fd, FBIO_ACCEL, &l);
+       ptr = 0;
+       return ret;
+}
+
+void bcm_accel_blit(
+               int src_addr, int src_width, int src_height, int src_stride,
+               int dst_addr, int dst_width, int dst_height, int dst_stride,
+               int src_x, int src_y, int width, int height,
+               int dst_x, int dst_y, int dwidth, int dheight)
+{
+       C(0x43); // reset source
+       C(0x53); // reset dest
+       C(0x5b);  // reset pattern
+       C(0x67); // reset blend
+       C(0x75); // reset output
+
+       P(0x0, src_addr); // set source addr
+       P(0x1, src_stride);  // set source pitch
+       P(0x2, src_width); // source width
+       P(0x3, src_height); // height
+       P(0x4, 0x7e48888); // format: ARGB 8888
+
+       C(0x5); // set source surface (based on last parameters)
+
+       P(0x2e, src_x); // define  rect
+       P(0x2f, src_y);
+       P(0x30, width);
+       P(0x31, height);
+
+       C(0x32); // set this rect as source rect
+
+       P(0x0, dst_addr); // prepare output surface
+       P(0x1, dst_stride);
+       P(0x2, dst_width);
+       P(0x3, dst_height);
+       P(0x4, 0x7e48888);
+       
+       C(0x69); // set output surface
+       
+       P(0x2e, dst_x); // prepare output rect
+       P(0x2f, dst_y);
+       P(0x30, dwidth);
+       P(0x31, dheight);
+
+       C(0x6e); // set this rect as output rect
+
+       C(0x77);  // do it
+
+       exec_list();
+}
+
+void bcm_accel_fill(
+               int dst_addr, int dst_width, int dst_height, int dst_stride,
+               int x, int y, int width, int height,
+               unsigned long color)
+{
+//     printf("unimplemented bcm_accel_fill\n");
+}
+
diff --git a/lib/gdi/compositing.cpp b/lib/gdi/compositing.cpp
new file mode 100644 (file)
index 0000000..e373a02
--- /dev/null
@@ -0,0 +1,9 @@
+#include <lib/gdi/compositing.h>
+#include <lib/gdi/grc.h>
+
+DEFINE_REF(gCompositingData);
+
+gContext::~gContext()
+{
+}
+
diff --git a/lib/gdi/compositing.h b/lib/gdi/compositing.h
new file mode 100644 (file)
index 0000000..706a592
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef __lib_gdi_compositing_h
+#define __lib_gdi_compositing_h
+
+#include <lib/gdi/gpixmap.h>
+
+#include <vector>
+
+class gDC;
+
+struct gContext
+{
+       ePtr<gDC> m_pixmap;
+       int m_reg_int[256];
+       float m_reg_float[256]; 
+       ~gContext();
+};
+
+struct gCompositingElement
+{
+       std::vector<unsigned int> m_code;
+       gContext m_context;
+};
+
+class gCompositingData: public Object
+{
+DECLARE_REF(gCompositingData);
+public:
+       int execute(void); /* returns ticks until next execution */
+private:
+       std::vector<gCompositingElement> m_elements;
+       gContext m_globals;
+};
+
+#endif
index d95b8c0f6caf184ffd3b4256eda7dac19cbf204b..839814035c28e09e2db3c583da3e71eae752338d 100644 (file)
@@ -119,6 +119,14 @@ public:
        static eRect emptyRect() { return eRect(0, 0, 0, 0); }
        static eRect invalidRect() { return eRect(); }
        
+       inline void scale(int x_n, int x_d, int y_n, int y_d) 
+       {
+               x1 *= x_n; x1 /= x_d; 
+               x2 *= x_n; x2 /= x_d; 
+               y1 *= y_n; y1 /= y_d; 
+               y2 *= y_n; y2 /= y_d; 
+       }
+       
 private:
        int x1;
        int y1;
index bb6041e0f76094710cb85642176a428daffa72f0..cde3e3572f382cc589f3207f9a743cbcba850abf 100644 (file)
@@ -62,6 +62,7 @@ fbClass::fbClass(const char *fb)
        }
 
        available=fix.smem_len;
+       m_phys_mem = fix.smem_start;
        eDebug("%dk video mem", available/1024);
        lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
        if (!lfb)
index fa4a4829218c31270285539b8aea64cf2745cab9..54473805256b893103fc05733d3db52e82e35d56 100644 (file)
@@ -17,6 +17,7 @@ class fbClass
 
        int m_manual_blit;
        int m_number_of_pages;
+       int m_phys_mem;
 #ifdef SWIG
        fbClass(const char *fb="/dev/fb/0");
        ~fbClass();
@@ -32,6 +33,8 @@ public:
        
        int getNumPages() { return m_number_of_pages; }
        
+       unsigned long getPhysAddr() { return m_phys_mem; }
+       
        int setOffset(int off);
        int waitVSync();
        void blit();
index d2f8dad25462f4b1677b401ad88fbc7c475fd736..80dd2479b52b92d97a983b5ddf38c4de6dd8b326 100644 (file)
@@ -131,6 +131,7 @@ void gFBDC::exec(gOpcode *o)
 
                ++t;
 
+               fb->blit();
                fb->waitVSync();
                break;
        }
@@ -188,7 +189,7 @@ void gFBDC::setResolution(int xres, int yres)
        surface.data = fb->lfb;
        surface.offset = 0;
 
-       surface.data_phys = 50*1024*1024; // FIXME
+       surface.data_phys = fb->getPhysAddr();
 
        int fb_size = surface.stride * surface.y;
 
index e01e5e434cd1ddcd14653f8d750479e2d4a36d37..6f741d8563f2f606b1b74efe786423f8dd6c9748 100644 (file)
@@ -256,25 +256,67 @@ static void blit_8i_to_32_ab(__u32 *dst, __u8 *src, __u32 *pal, int width)
        }
 }
 
+#define FIX 0x10000
 
-void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag)
+void gPixmap::blit(const gPixmap &src, const eRect &_pos, const gRegion &clip, int flag)
 {
+//     eDebug("blit: -> %d.%d %d:%d -> %d.%d %d:%d, flags=%d",
+//             _pos.x(), _pos.y(), _pos.width(), _pos.height(),
+//             clip.extends.x(), clip.extends.y(), clip.extends.width(), clip.extends.height(),
+//             flag);
+       eRect pos = _pos;
+       
+//     eDebug("source size: %d %d", src.size().width(), src.size().height());
+       
+       if (!(flag & blitScale)) /* pos' size is valid only when scaling */
+               pos = eRect(pos.topLeft(), src.size());
+       else if (pos.size() == src.size()) /* no scaling required */
+               flag &= ~blitScale;
+
+       int scale_x = FIX, scale_y = FIX;
+       
+       if (flag & blitScale)
+       {
+               ASSERT(src.size().width());
+               ASSERT(src.size().height());
+               scale_x = pos.size().width() * FIX / src.size().width();
+               scale_y = pos.size().height() * FIX / src.size().height();
+       }
+       
+//     eDebug("SCALE %x %x", scale_x, scale_y);
+
        for (unsigned int i=0; i<clip.rects.size(); ++i)
        {
-               eRect area=eRect(pos, src.size());
+//             eDebug("clip rect: %d %d %d %d", clip.rects[i].x(), clip.rects[i].y(), clip.rects[i].width(), clip.rects[i].height());
+               eRect area = pos; /* pos is the virtual (pre-clipping) area on the dest, which can be larger/smaller than src if scaling is enabled */
                area&=clip.rects[i];
                area&=eRect(ePoint(0, 0), size());
 
                if ((area.width()<0) || (area.height()<0))
                        continue;
 
-               eRect srcarea=area;
+               eRect srcarea = area;
                srcarea.moveBy(-pos.x(), -pos.y());
 
+//             eDebug("srcarea before scale: %d %d %d %d",
+//                     srcarea.x(), srcarea.y(), srcarea.width(), srcarea.height());
+               
+               if (flag & blitScale)
+                       srcarea = eRect(srcarea.x() * FIX / scale_x, srcarea.y() * FIX / scale_y, srcarea.width() * FIX / scale_x, srcarea.height() * FIX / scale_y);
+
+//             eDebug("srcarea after scale: %d %d %d %d",
+//                     srcarea.x(), srcarea.y(), srcarea.width(), srcarea.height());
+
                if ((surface->data_phys && src.surface->data_phys) && (gAccel::getInstance()))
-                       if (!gAccel::getInstance()->blit(surface, src.surface, area.topLeft(), srcarea, flag))
+                       if (!gAccel::getInstance()->blit(surface, src.surface, area, srcarea, flag))
                                continue;
 
+               if (flag & blitScale)
+               {
+                       eWarning("unimplemented: scale on non-accel surfaces");
+                       continue;
+               }
+
                if ((surface->bpp == 8) && (src.surface->bpp==8))
                {
                        __u8 *srcptr=(__u8*)src.surface->data;
@@ -400,6 +442,8 @@ void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag
        }
 }
 
+#undef FIX
+
 void gPixmap::mergePalette(const gPixmap &target)
 {
        if ((!surface->clut.colors) || (!target.surface->clut.colors))
index e3798bf72fd27ef9d1b940eea88aa422b6067105..87fb5029906511780c5a31436c580b4500f6972e 100644 (file)
@@ -116,7 +116,8 @@ public:
        enum
        {
                blitAlphaTest=1,
-               blitAlphaBlend=2
+               blitAlphaBlend=2,
+               blitScale=4
        };
 
        gPixmap(gSurface *surface);
@@ -139,7 +140,7 @@ private:
        void fill(const gRegion &clip, const gColor &color);
        void fill(const gRegion &clip, const gRGB &color);
        
-       void blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flags=0);
+       void blit(const gPixmap &src, const eRect &pos, const gRegion &clip, int flags=0);
        
        void mergePalette(const gPixmap &target);
        void line(const gRegion &clip, ePoint start, ePoint end, gColor color);
index 86d53fd3cc1021d3d8fd31c108c295c90f04e499..5ef68332101906660ce4671310490d9a709e72c8 100644 (file)
@@ -119,7 +119,11 @@ void *gRC::thread()
                                break;
                        else if (o.opcode==gOpcode::notify)
                                need_notify = 1;
-                       else if(o.dc)
+                       else if (o.opcode==gOpcode::setCompositing)
+                       {
+                               m_compositing = o.parm.setCompositing;
+                               m_compositing->Release();
+                       } else if(o.dc)
                        {
                                o.dc->exec(&o);
                                // o.dc is a gDC* filled with grabref... so we must release it here
@@ -377,6 +381,13 @@ void gPainter::clear()
 
 void gPainter::blit(gPixmap *pixmap, ePoint pos, const eRect &clip, int flags)
 {
+       blitScale(pixmap, eRect(pos, eSize()), clip, flags, 0);
+}
+
+void gPainter::blitScale(gPixmap *pixmap, const eRect &position, const eRect &clip, int flags, int aflags)
+{
+       flags |= aflags;
+
        if ( m_dc->islocked() )
                return;
        gOpcode o;
@@ -388,13 +399,12 @@ void gPainter::blit(gPixmap *pixmap, ePoint pos, const eRect &clip, int flags)
        pixmap->AddRef();
        o.parm.blit  = new gOpcode::para::pblit;
        o.parm.blit->pixmap = pixmap;
-       o.parm.blit->position = pos;
        o.parm.blit->clip = clip;
-       o.parm.blit->flags=flags;
+       o.parm.blit->flags = flags;
+       o.parm.blit->position = position;
        m_rc->submit(o);
 }
 
-
 void gPainter::setPalette(gRGB *colors, int start, int len)
 {
        if ( m_dc->islocked() )
@@ -549,6 +559,16 @@ void gPainter::notify()
        m_rc->submit(o);
 }
 
+void gPainter::setCompositing(gCompositingData *comp)
+{
+       gOpcode o;
+       o.opcode = gOpcode::setCompositing;
+       o.dc = 0;
+       o.parm.setCompositing = comp;
+       comp->AddRef(); /* will be freed in ::thread */
+       m_rc->submit(o);
+}
+
 void gPainter::end()
 {
        if ( m_dc->islocked() )
@@ -677,7 +697,7 @@ void gDC::exec(gOpcode *o)
                gRegion clip;
                                // this code should be checked again but i'm too tired now
                
-               o->parm.blit->position += m_current_offset;
+               o->parm.blit->position.moveBy(m_current_offset);
                
                if (o->parm.blit->clip.valid())
                {
@@ -777,7 +797,7 @@ void gDC::enableSpinner()
        ASSERT(m_spinner_saved);
        
                /* save the background to restore it later. We need to negative position because we want to blit from the middle of the screen. */
-       m_spinner_saved->blit(*m_pixmap, -m_spinner_pos.topLeft(), gRegion(eRect(ePoint(0, 0), m_spinner_saved->size())), 0);
+       m_spinner_saved->blit(*m_pixmap, eRect(-m_spinner_pos.topLeft(), eSize()), gRegion(eRect(ePoint(0, 0), m_spinner_saved->size())), 0);
        
        incrementSpinner();
 }
@@ -787,7 +807,7 @@ void gDC::disableSpinner()
        ASSERT(m_spinner_saved);
 
                /* restore background */
-       m_pixmap->blit(*m_spinner_saved, m_spinner_pos.topLeft(), gRegion(m_spinner_pos), 0);
+       m_pixmap->blit(*m_spinner_saved, eRect(m_spinner_pos.topLeft(), eSize()), gRegion(m_spinner_pos), 0);
 }
 
 void gDC::incrementSpinner()
@@ -811,12 +831,12 @@ void gDC::incrementSpinner()
        }
 #endif
 
-       m_spinner_temp->blit(*m_spinner_saved, ePoint(0, 0), eRect(ePoint(0, 0), m_spinner_pos.size()));
+       m_spinner_temp->blit(*m_spinner_saved, eRect(0, 0, 0, 0), eRect(ePoint(0, 0), m_spinner_pos.size()));
 
        if (m_spinner_pic[m_spinner_i])
-               m_spinner_temp->blit(*m_spinner_pic[m_spinner_i], ePoint(0, 0), eRect(ePoint(0, 0), m_spinner_pos.size()), gPixmap::blitAlphaTest);
+               m_spinner_temp->blit(*m_spinner_pic[m_spinner_i], eRect(0, 0, 0, 0), eRect(ePoint(0, 0), m_spinner_pos.size()), gPixmap::blitAlphaTest);
 
-       m_pixmap->blit(*m_spinner_temp, m_spinner_pos.topLeft(), gRegion(m_spinner_pos), 0);
+       m_pixmap->blit(*m_spinner_temp, eRect(m_spinner_pos.topLeft(), eSize()), gRegion(m_spinner_pos), 0);
        m_spinner_i++;
        m_spinner_i %= m_spinner_num;
 }
index 7071425ef6ce7e968b96e239c35b4db5cc365e1f..3b6ed3255744943226af292bae563c2d265677db 100644 (file)
@@ -22,6 +22,7 @@
 #include <lib/gdi/gpixmap.h>
 #include <lib/gdi/region.h>
 #include <lib/gdi/gfont.h>
+#include <lib/gdi/compositing.h>
 
 class eTextPara;
 
@@ -60,7 +61,9 @@ struct gOpcode
                
                enableSpinner, disableSpinner, incrementSpinner,
                
-               shutdown
+               shutdown,
+               
+               setCompositing,
        } opcode;
 
        gDC *dc;
@@ -102,8 +105,8 @@ struct gOpcode
                struct pblit
                {
                        gPixmap *pixmap;
-                       ePoint position;
                        int flags;
+                       eRect position;
                        eRect clip;
                } *blit;
 
@@ -137,6 +140,8 @@ struct gOpcode
                        ePoint value;
                        int rel;
                } *setOffset;
+               
+               gCompositingData *setCompositing;
        } parm;
 };
 
@@ -168,6 +173,8 @@ class gRC: public iObject, public Object
        
        void enableSpinner();
        void disableSpinner();
+       
+       ePtr<gCompositingData> m_compositing;
 
 public:
        gRC();
@@ -230,10 +237,12 @@ public:
        enum
        {
                BT_ALPHATEST = 1,
-               BT_ALPHABLEND = 2
+               BT_ALPHABLEND = 2,
+               BT_SCALE = 4 /* will be automatically set by blitScale */
        };
 
-       void blit(gPixmap *pixmap, ePoint pos, const eRect &what=eRect(), int flags=0);
+       void blit(gPixmap *pixmap, ePoint pos, const eRect &clip=eRect(), int flags=0);
+       void blitScale(gPixmap *pixmap, const eRect &pos, const eRect &clip=eRect(), int flags=0, int aflags = BT_SCALE);
 
        void setPalette(gRGB *colors, int start=0, int len=256);
        void setPalette(gPixmap *source);
@@ -252,6 +261,7 @@ public:
        void waitVSync();
        void flip();
        void notify();
+       void setCompositing(gCompositingData *comp);
 };
 
 class gDC: public iObject
index bbad3aa080ad570248f12633e62ad3535ace73b4..1208c97ec893d0dbc5be5311ff66f62c8f62b4dc 100644 (file)
@@ -426,3 +426,10 @@ void gRegion::moveBy(ePoint offset)
                rects[i].moveBy(offset);
 }
 
+void gRegion::scale(int x_n, int x_d, int y_n, int y_d)
+{
+       int i;
+       for (i=0; i<rects.size(); ++i)
+               rects[i].scale(x_n, x_d, y_n, y_d);
+}
+
index d7217dae32af005d2eb7a8d4f7ddd54331ea7d1b..2052a5cb16c55e33bfbd4709e2393eb9f867c036 100644 (file)
@@ -94,6 +94,8 @@ public:
        bool valid() const { return extends.valid(); }
        
        static gRegion invalidRegion() { return gRegion(eRect::invalidRect()); }
+       
+       void scale(int x_n, int x_d, int y_n, int y_d);
 };
 
 #endif
index 84fec3232335a09e7d87f8864257cd9bbc53c434..f20c1a9fcd6ad9541f9a2952180a4cc295ab7070 100644 (file)
@@ -3,7 +3,7 @@
 #include <lib/gui/ewidgetdesktop.h>
 
 ePixmap::ePixmap(eWidget *parent)
-       :eWidget(parent), m_alphatest(false)
+       :eWidget(parent), m_alphatest(false), m_scale(false)
 {
 }
 
@@ -13,6 +13,15 @@ void ePixmap::setAlphatest(int alphatest)
        setTransparent(alphatest);
 }
 
+void ePixmap::setScale(int scale)
+{
+       if (m_scale != scale)
+       {
+               m_scale = scale;
+               invalidate();
+       }
+}
+
 void ePixmap::setPixmap(gPixmap *pixmap)
 {
        m_pixmap = pixmap;
@@ -76,7 +85,10 @@ int ePixmap::event(int event, void *data, void *data2)
                                flags = gPainter::BT_ALPHATEST;
                        else if (m_alphatest == 2)
                                flags = gPainter::BT_ALPHABLEND;
-                       painter.blit(m_pixmap, ePoint(0, 0), eRect(), flags);
+                       if (m_scale)
+                               painter.blitScale(m_pixmap, eRect(ePoint(0, 0), size()), eRect(), flags);
+                       else
+                               painter.blit(m_pixmap, ePoint(0, 0), eRect(), flags);
                }
 
                return 0;
index 1c4a97c8571add03188a32032349d6c37c821515..6280fb34f36eb1cca4252b9bd10dc186242d578c 100644 (file)
@@ -6,6 +6,7 @@
 class ePixmap: public eWidget
 {
        int m_alphatest;
+       int m_scale;
 public:
        ePixmap(eWidget *parent);
 
@@ -13,6 +14,7 @@ public:
        void setPixmap(ePtr<gPixmap> &pixmap);
        void setPixmapFromFile(const char *filename);
        void setAlphatest(int alphatest); /* 1 for alphatest, 2 for alphablend */
+       void setScale(int scale);
 protected:
        ePtr<gPixmap> m_pixmap;
        int event(int event, void *data=0, void *data2=0);
index 376fa24d84187844bb26644a9c7dc1ab76acdee9..bf0239dffdae8741f1c82122e26bcb52aa693ced 100644 (file)
@@ -113,6 +113,9 @@ void eSubtitleWidget::clearPage()
 void eSubtitleWidget::setPixmap(ePtr<gPixmap> &pixmap, gRegion changed)
 {
        m_pixmap = pixmap;
+       
+       changed.scale(size().width(), pixmap->size().width(), size().height(), pixmap->size().height());
+       
        invalidate(changed);
 }
 
@@ -129,7 +132,7 @@ int eSubtitleWidget::event(int event, void *data, void *data2)
                eWidget::event(event, data, data2);
 
                if (m_pixmap)
-                       painter.blit(m_pixmap, ePoint(0,0));
+                       painter.blitScale(m_pixmap, eRect(ePoint(0, 0), size()));
                else if (m_page_ok)
                {
                        int elements = m_page.m_elements.size();
@@ -192,7 +195,12 @@ int eSubtitleWidget::event(int event, void *data, void *data2)
                else if (m_dvb_page_ok)
                {
                        for (std::list<eDVBSubtitleRegion>::iterator it(m_dvb_page.m_regions.begin()); it != m_dvb_page.m_regions.end(); ++it)
-                               painter.blit(it->m_pixmap, it->m_position);
+                       {
+                                       /* dvb subtitles are living in their 720x576 cage... i think. check this for HD. */
+                               eRect r = eRect(it->m_position, it->m_pixmap->size());
+                               r.scale(size().width(), 720, size().height(), 576);
+                               painter.blitScale(it->m_pixmap, r);
+                       }
                }
                return 0;
        }
index a31f2ed450bef29f8508d532a25757312e5062e6..2fb0ec94b84cb6c64d3f66d2a2709479f68601d5 100644 (file)
@@ -51,4 +51,5 @@ void eWidgetAnimation::startMoveAnimation(ePoint start, ePoint end, int length)
        m_move_start = start;
        m_move_end = end;
        m_active = 1;
+       m_widget->move(m_move_start);
 }
index 05b4ec4db07979d612875f10e306b0038dad335c..fa53235929780d7f5759e52bdbc67d1f8975c41d 100644 (file)
@@ -145,6 +145,9 @@ void eWidgetDesktop::recalcClipRegions(eWidget *root)
                                createBufferForWidget(root, 0);
 
                        comp = root->m_comp_buffer[i]; /* it might have changed. */
+                       
+                       if (!comp) 
+                               continue;  /* WAIT, don't we need to invalidate,whatever */
 
                                        /* CHECKME: don't we need to recalculate everything? after all, our buffer has changed and is likely to be cleared */
                        gRegion visible_before = root->m_visible_with_childs;
index 2b3eab0b7ca32ee733f8f9612a7aa1a2eccd0968..ea1afec402ca933d58da7220d1485bce900fe5f1 100644 (file)
@@ -562,11 +562,11 @@ RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /*
        m_subtitle_widget = new eSubtitleWidget(parent);
        m_subtitle_widget->resize(parent->size());
 
-       eSize size = parent->size();
+       eSize size = eSize(720, 576);
 
        if (!m_pixmap)
        {
-               m_pixmap = new gPixmap(size, 32);
+               m_pixmap = new gPixmap(size, 32, 1); /* allocate accel surface (if possible) */
                ddvd_set_lfb(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4);
                run(); // start the thread
        }
diff --git a/skin.py b/skin.py
index 3ceb2b490e356366add8e47a91c2bb95f1c0c70c..a76f7942c0897e8dd1de8d19d6db5196bd6bedca 100644 (file)
--- a/skin.py
+++ b/skin.py
@@ -145,6 +145,8 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1)
                                  "off": 0,
                                  "blend": 2,
                                }[value])
+               elif attrib == "scale":
+                       guiObject.setScale(1)
                elif attrib == "orientation": # used by eSlider
                        try:
                                guiObject.setOrientation(*