From: Felix Domke Date: Wed, 3 Jun 2009 17:00:24 +0000 (+0200) Subject: Merge branch 'master' of git.opendreambox.org:/git/enigma2 X-Git-Tag: 2.6.0~266 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/b23e0f70b3b0e6815b784f29cbe7d09982116c41?hp=cb7672200eece518f92ab0f0cb0afa9275065c7e Merge branch 'master' of git.opendreambox.org:/git/enigma2 --- diff --git a/lib/gdi/Makefile.am b/lib/gdi/Makefile.am index 46ed948a..1280556e 100644 --- a/lib/gdi/Makefile.am +++ b/lib/gdi/Makefile.am @@ -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 diff --git a/lib/gdi/accel.cpp b/lib/gdi/accel.cpp index d9c80e2e..bf9a5a44 100644 --- a/lib/gdi/accel.cpp +++ b/lib/gdi/accel.cpp @@ -9,7 +9,9 @@ #include 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 +#include +#include +#include +#include +#include +#include + +#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 index 00000000..e373a02e --- /dev/null +++ b/lib/gdi/compositing.cpp @@ -0,0 +1,9 @@ +#include +#include + +DEFINE_REF(gCompositingData); + +gContext::~gContext() +{ +} + diff --git a/lib/gdi/compositing.h b/lib/gdi/compositing.h new file mode 100644 index 00000000..706a5927 --- /dev/null +++ b/lib/gdi/compositing.h @@ -0,0 +1,34 @@ +#ifndef __lib_gdi_compositing_h +#define __lib_gdi_compositing_h + +#include + +#include + +class gDC; + +struct gContext +{ + ePtr m_pixmap; + int m_reg_int[256]; + float m_reg_float[256]; + ~gContext(); +}; + +struct gCompositingElement +{ + std::vector m_code; + gContext m_context; +}; + +class gCompositingData: public Object +{ +DECLARE_REF(gCompositingData); +public: + int execute(void); /* returns ticks until next execution */ +private: + std::vector m_elements; + gContext m_globals; +}; + +#endif diff --git a/lib/gdi/erect.h b/lib/gdi/erect.h index d95b8c0f..83981403 100644 --- a/lib/gdi/erect.h +++ b/lib/gdi/erect.h @@ -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; diff --git a/lib/gdi/fb.cpp b/lib/gdi/fb.cpp index bb6041e0..cde3e357 100644 --- a/lib/gdi/fb.cpp +++ b/lib/gdi/fb.cpp @@ -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) diff --git a/lib/gdi/fb.h b/lib/gdi/fb.h index fa4a4829..54473805 100644 --- a/lib/gdi/fb.h +++ b/lib/gdi/fb.h @@ -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(); diff --git a/lib/gdi/gfbdc.cpp b/lib/gdi/gfbdc.cpp index d2f8dad2..80dd2479 100644 --- a/lib/gdi/gfbdc.cpp +++ b/lib/gdi/gfbdc.cpp @@ -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; diff --git a/lib/gdi/gpixmap.cpp b/lib/gdi/gpixmap.cpp index e01e5e43..6f741d85 100644 --- a/lib/gdi/gpixmap.cpp +++ b/lib/gdi/gpixmap.cpp @@ -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; idata_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)) diff --git a/lib/gdi/gpixmap.h b/lib/gdi/gpixmap.h index e3798bf7..87fb5029 100644 --- a/lib/gdi/gpixmap.h +++ b/lib/gdi/gpixmap.h @@ -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); diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 86d53fd3..5ef68332 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -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; } diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index 7071425e..3b6ed325 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -22,6 +22,7 @@ #include #include #include +#include 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 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 diff --git a/lib/gdi/region.cpp b/lib/gdi/region.cpp index bbad3aa0..1208c97e 100644 --- a/lib/gdi/region.cpp +++ b/lib/gdi/region.cpp @@ -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 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; diff --git a/lib/gui/epixmap.h b/lib/gui/epixmap.h index 1c4a97c8..6280fb34 100644 --- a/lib/gui/epixmap.h +++ b/lib/gui/epixmap.h @@ -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 &pixmap); void setPixmapFromFile(const char *filename); void setAlphatest(int alphatest); /* 1 for alphatest, 2 for alphablend */ + void setScale(int scale); protected: ePtr m_pixmap; int event(int event, void *data=0, void *data2=0); diff --git a/lib/gui/esubtitle.cpp b/lib/gui/esubtitle.cpp index 376fa24d..bf0239df 100644 --- a/lib/gui/esubtitle.cpp +++ b/lib/gui/esubtitle.cpp @@ -113,6 +113,9 @@ void eSubtitleWidget::clearPage() void eSubtitleWidget::setPixmap(ePtr &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::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; } diff --git a/lib/gui/ewidgetanimation.cpp b/lib/gui/ewidgetanimation.cpp index a31f2ed4..2fb0ec94 100644 --- a/lib/gui/ewidgetanimation.cpp +++ b/lib/gui/ewidgetanimation.cpp @@ -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); } diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index 05b4ec4d..fa532359 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -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; diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp index 2b3eab0b..ea1afec4 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp @@ -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 3ceb2b49..a76f7942 100644 --- 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(*