+ 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);
+ }
+}
+
+
+void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag)
+{
+ for (unsigned int i=0; i<clip.rects.size(); ++i)
+ {
+ eRect area=eRect(pos, src.size());
+ area&=clip.rects[i];
+ area&=eRect(ePoint(0, 0), size());
+
+ if ((area.width()<0) || (area.height()<0))
+ continue;
+
+ eRect srcarea=area;
+ srcarea.moveBy(-pos.x(), -pos.y());
+
+ if ((surface->data_phys && src.surface->data_phys) && (gAccel::getInstance()))
+ if (!gAccel::getInstance()->blit(surface, src.surface, area.topLeft(), srcarea, flag))
+ continue;
+
+ if ((surface->bpp == 8) && (src.surface->bpp==8))
+ {
+ __u8 *srcptr=(__u8*)src.surface->data;
+ __u8 *dstptr=(__u8*)surface->data;
+
+ srcptr+=srcarea.left()*src.surface->bypp+srcarea.top()*src.surface->stride;
+ dstptr+=area.left()*surface->bypp+area.top()*surface->stride;
+ for (int y=0; y<area.height(); y++)