X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fgdi%2Fgpixmap.cpp;h=6f741d8563f2f606b1b74efe786423f8dd6c9748;hb=3207029344392a328d02dcf362783a294708844f;hp=e01e5e434cd1ddcd14653f8d750479e2d4a36d37;hpb=bce53d4a67d1655a496eebe5912c8573e880114e;p=vuplus_dvbapp diff --git a/lib/gdi/gpixmap.cpp b/lib/gdi/gpixmap.cpp index e01e5e4..6f741d8 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))