+ unsigned int i;
+ for (i=0; i<region.rects.size(); ++i)
+ {
+ const eRect &area = region.rects[i];
+ if (area.empty())
+ continue;
+
+ if (surface->bpp == 32)
+ {
+ __u32 col;
+
+ col = color.argb();
+ col^=0xFF000000;
+
+ if (surface->data_phys && gAccel::getInstance())
+ if (!gAccel::getInstance()->fill(surface, area, col))
+ continue;
+
+ for (int y=area.top(); y<area.bottom(); y++)
+ {
+ __u32 *dst=(__u32*)(((__u8*)surface->data)+y*surface->stride+area.left()*surface->bypp);
+ int x=area.width();
+ while (x--)
+ *dst++=col;
+ }
+ } else
+ eWarning("couldn't rgbfill %d bpp", surface->bpp);
+ }
+}
+
+static void blit_8i_to_32(__u32 *dst, __u8 *src, __u32 *pal, int width)
+{
+ while (width--)
+ *dst++=pal[*src++];
+}
+
+static void blit_8i_to_32_at(__u32 *dst, __u8 *src, __u32 *pal, int width)
+{
+ while (width--)
+ {
+ if (!(pal[*src]&0x80000000))
+ {
+ src++;
+ dst++;
+ } else
+ *dst++=pal[*src++];
+ }
+}
+
+ /* WARNING, this function is not endian safe! */
+static void blit_8i_to_32_ab(__u32 *dst, __u8 *src, __u32 *pal, int width)
+{
+ while (width--)
+ {
+#define BLEND(x, y, a) (y + (((x-y) * a)>>8))
+ __u32 srccol = pal[*src++];
+ __u32 dstcol = *dst;
+ unsigned char sb = srccol & 0xFF;
+ unsigned char sg = (srccol >> 8) & 0xFF;
+ unsigned char sr = (srccol >> 16) & 0xFF;
+ unsigned char sa = (srccol >> 24) & 0xFF;
+
+ unsigned char db = dstcol & 0xFF;
+ unsigned char dg = (dstcol >> 8) & 0xFF;
+ unsigned char dr = (dstcol >> 16) & 0xFF;
+ unsigned char da = (dstcol >> 24) & 0xFF;
+
+ da = BLEND(0xFF, da, sa) & 0xFF;
+ dr = BLEND(sr, dr, sa) & 0xFF;
+ dg = BLEND(sg, dg, sa) & 0xFF;
+ db = BLEND(sb, db, sa) & 0xFF;
+
+#undef BLEND
+ *dst++ = db | (dg << 8) | (dr << 16) | (da << 24);
+ }
+}
+
+#define FIX 0x10000
+
+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);
+