I guess i just wasnt as cool as you

Try this acwin:
http://www.thethoughtradar.com/AGS/acwin.zipIt allows true alpha blending.
Only done preliminary testing but seems to work perfectly fine.
Heres the code for Alan's version
[code]
void Manual_Draw(BITMAP *src, BITMAP *dest, int destx, int desty, int trans)
{
trans = 100 - trans;
long srcWidth, srcHeight, destWidth, destHeight, destColDepth;
acquire_bitmap(src);
acquire_bitmap(dest);
unsigned char **srccharbuffer = src->line; //8bit
unsigned short **srcshortbuffer = (unsigned short**)srccharbuffer; //16bit;
unsigned long **srclongbuffer = (unsigned long**)srccharbuffer; //32bit
unsigned char **destcharbuffer = dest->line; //8bit
unsigned short **destshortbuffer = (unsigned short**)destcharbuffer; //16bit;
unsigned long **destlongbuffer = (unsigned long**)destcharbuffer; //32bit
int transColor = bitmap_mask_color (src);
srcWidth = src->w;
srcHeight = src->h;
destWidth = dest->w;
destHeight = dest->h;
destColDepth = bitmap_color_depth(dest);
if (srcWidth + destx > destWidth) srcWidth = destWidth - destx;
if (srcHeight + desty > destHeight) srcHeight = destHeight - desty;
int startx = MAX(0, (-1 * destx));
int starty = MAX(0, (-1 * desty));
int srca, srcr, srcg, srcb, desta, destr, destg, destb, finalr, finalg, finalb, finala, col;
for(int x = startx; x < srcWidth; x ++)
{
for(int y = starty; y < srcHeight; y ++)
{
int srcyy = y;
int srcxx = x;
int destyy = y + desty;
int destxx = x + destx;
if (destColDepth == 8)
{
if (srccharbuffer[srcyy][srcxx] != transColor) destcharbuffer[destyy][destxx] = srccharbuffer[srcyy][srcxx];
}
else if (destColDepth == 16)
{
if (srcshortbuffer[srcyy][srcxx] != transColor) destshortbuffer[destyy][destxx] = srcshortbuffer[srcyy][srcxx];
}
else if (destColDepth == 32)
{
//if (srclongbuffer[srcyy][srcxx] != transColor) destlongbuffer[destyy][destxx] = srclongbuffer[srcyy][srcxx];
srca = (geta32(srclongbuffer[srcyy][srcxx])) * trans / 100;
if (srca != 0) {
srcr = getr32(srclongbuffer[srcyy][srcxx]);
srcg = getg32(srclongbuffer[srcyy][srcxx]);
srcb = getb32(srclongbuffer[srcyy][srcxx]);
destr = getr32(destlongbuffer[destyy][destxx]);
destg = getg32(destlongbuffer[destyy][destxx]);
destb = getb32(destlongbuffer[destyy][destxx]);
desta = geta32(destlongbuffer[destyy][destxx]);
finalr = srcr;
finalg = srcg;
finalb = srcb;
finala = 255-(255-srca)*(255-desta)/255;
finalr = srca*finalr/finala + desta*destr*(255-srca)/finala/255;
finalg = srca*finalg/finala + desta*destg*(255-srca)/finala/255;
finalb = srca*finalb/finala + desta*destb*(255-srca)/finala/255;
col = makeacol32(finalr, finalg, finalb, finala);
destlongbuffer[destyy][destxx] = col;
}
}
}
}
release_bitmap (src);
release_bitmap (dest);
}
void DrawingSurface_DrawImage(ScriptDrawingSurface* sds, int xx, int yy, int slot, int trans, int width, int height)
{
if ((slot < 0) || (slot >= MAX_SPRITES) || (spriteset[slot] == NULL))
quit("!DrawingSurface.DrawImage: invalid sprite slot number specified");
if ((trans < 0) || (trans > 100))
quit("!DrawingSurface.DrawImage: invalid transparency setting");
// 100% transparency, don't draw anything
if (trans == 100)
return;
BITMAP *sourcePic = spriteset[slot];
bool needToFreeBitmap = false;
if (width != SCR_NO_VALUE)
{
// Resize specified
if ((width < 1) || (height < 1))
return;
sds->MultiplyCoordinates(&width, &height);
// resize the sprite to the requested size
block newPic = create_bitmap_ex(bitmap_color_depth(sourcePic), width, height);
stretch_blit(sourcePic, newPic,
0, 0, spritewidth[slot], spriteheight[slot],
0, 0, width, height);
sourcePic = newPic;
needToFreeBitmap = true;
update_polled_stuff();
}
BITMAP* dest = sds->GetBitmapSurface();
if (bitmap_color_depth(sourcePic) != bitmap_color_depth(dest)) {
debug_log("RawDrawImage: Sprite %d colour depth %d-bit not same as background depth %d-bit", slot, bitmap_color_depth(spriteset[slot]), bitmap_color_depth(abuf));
}
Manual_Draw(sourcePic, dest, xx, yy, trans);
if (needToFreeBitmap)
destroy_bitmap(sourcePic);
}
[/code]