clut.data = 0;
if (!data)
- data = malloc(y * stride);
+ data = new unsigned char [y * stride];
type = 1;
}
if (data_phys)
gAccel::getInstance()->accelFree(data_phys);
else
- free(data);
+ delete [] (unsigned char*)data;
- delete[] clut.data;
+ delete [] clut.data;
}
}
}
}
+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);
+ }
+}
+
+
void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag)
{
for (unsigned int i=0; i<clip.rects.size(); ++i)
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;
- flag &= ~ blitAlphaBlend;
-
+
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++)
{
- if (flag & blitAlphaTest)
+ if (flag & (blitAlphaTest|blitAlphaBlend))
{
// no real alphatest yet
int width=area.width();
{
__u32 *srcptr=(__u32*)src.surface->data;
__u32 *dstptr=(__u32*)surface->data;
-
+
srcptr+=srcarea.left()+srcarea.top()*src.surface->stride/4;
dstptr+=area.left()+area.top()*surface->stride/4;
for (int y=0; y<area.height(); y++)
} else if (flag & blitAlphaBlend)
{
// uh oh. this is only until hardware accel is working.
-
+
int width=area.width();
// ARGB color space!
unsigned char *src=(unsigned char*)srcptr;
unsigned char dr = dst[2];
unsigned char dg = dst[1];
unsigned char db = dst[0];
-
+
dst[3] = BLEND(0xFF, da, sa);
dst[2] = BLEND(sr, dr, sa);
dst[1] = BLEND(sg, dg, sa);
dst[0] = BLEND(sb, db, sa);
-
+#undef BLEND
+
src += 4; dst += 4;
}
} else
pal[i]=0x010101*i;
pal[i]^=0xFF000000;
}
-
+
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++)
{
+ int width=area.width();
+ unsigned char *psrc=(unsigned char*)srcptr;
+ __u32 *dst=(__u32*)dstptr;
if (flag & blitAlphaTest)
- {
- // no real alphatest yet
- int width=area.width();
- unsigned char *src=(unsigned char*)srcptr;
- __u32 *dst=(__u32*)dstptr;
- // use duff's device here!
- while (width--)
- {
- if (!(pal[*src]&0x80000000))
- {
- src++;
- dst++;
- } else
- *dst++=pal[*src++];
- }
- } else
- {
- int width=area.width();
- unsigned char *src=(unsigned char*)srcptr;
- __u32 *dst=(__u32*)dstptr;
- while (width--)
- *dst++=pal[*src++];
- }
+ blit_8i_to_32_at(dst, psrc, pal, width);
+ else if (flag & blitAlphaBlend)
+ blit_8i_to_32_ab(dst, psrc, pal, width);
+ else
+ blit_8i_to_32(dst, psrc, pal, width);
srcptr+=src.surface->stride;
dstptr+=surface->stride;
}
} else
- eFatal("cannot blit %dbpp from %dbpp", surface->bpp, src.surface->bpp);
+ eWarning("cannot blit %dbpp from %dbpp", surface->bpp, src.surface->bpp);
}
}