1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

fix scaling with color key

This commit is contained in:
FunkyFr3sh 2021-05-06 16:10:09 +02:00
parent f61cadc80a
commit e58691dd2c

View File

@ -155,81 +155,53 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR
DDCOLORKEY color_key; DDCOLORKEY color_key;
color_key.dwColorSpaceLowValue = color_key.dwColorSpaceLowValue =
(dwFlags & DDBLT_KEYSRCOVERRIDE) ? (dwFlags & DDBLT_KEYSRCOVERRIDE) ?
lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue;
color_key.dwColorSpaceHighValue = color_key.dwColorSpaceHighValue =
(dwFlags & DDBLT_KEYSRCOVERRIDE) ? (dwFlags & DDBLT_KEYSRCOVERRIDE) ?
lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue; lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue;
if (!is_stretch_blt) float scale_w = (float)src_w / dst_w;
float scale_h = (float)src_h / dst_h;
if (This->bpp == 8)
{ {
int width = dst_w > src_w ? src_w : dst_w; int y1, x1;
int height = dst_h > src_h ? src_h : dst_h; for (y1 = 0; y1 < dst_h; y1++)
if (This->bpp == 8)
{ {
int y1, x1; int ydst = This->width * (y1 + dst_y);
for (y1 = 0; y1 < height; y1++) int ysrc = src_surface->width * ((int)(y1 * scale_h) + src_y);
for (x1 = 0; x1 < dst_w; x1++)
{ {
int ydst = This->width * (y1 + dst_y); unsigned char c = ((unsigned char*)src_buf)[(int)(x1 * scale_w) + src_x + ysrc];
int ysrc = src_surface->width * (y1 + src_y);
for (x1 = 0; x1 < width; x1++) if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
{ {
unsigned char c = ((unsigned char *)src_buf)[x1 + src_x + ysrc]; ((unsigned char*)dst_buf)[x1 + dst_x + ydst] = c;
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
{
((unsigned char *)dst_buf)[x1 + dst_x + ydst] = c;
}
}
}
}
else if (This->bpp == 16)
{
int y1, x1;
for (y1 = 0; y1 < height; y1++)
{
int ydst = This->width * (y1 + dst_y);
int ysrc = src_surface->width * (y1 + src_y);
for (x1 = 0; x1 < width; x1++)
{
unsigned short c = ((unsigned short *)src_buf)[x1 + src_x + ysrc];
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
{
((unsigned short *)dst_buf)[x1 + dst_x + ydst] = c;
}
} }
} }
} }
} }
else else if (This->bpp == 16)
{ {
dprintfex("NOT_IMPLEMENTED DDBLT_KEYSRC / DDBLT_KEYSRCOVERRIDE does not support stretching\n"); int y1, x1;
for (y1 = 0; y1 < dst_h; y1++)
{
int ydst = This->width * (y1 + dst_y);
int ysrc = src_surface->width * ((int)(y1 * scale_h) + src_y);
/* Use GdiTransparentBlt temporary until own code was written */ for (x1 = 0; x1 < dst_w; x1++)
{
unsigned short c = ((unsigned short*)src_buf)[(int)(x1 * scale_w) + src_x + ysrc];
HDC src_dc; if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
dds_GetDC(src_surface, &src_dc); {
((unsigned short*)dst_buf)[x1 + dst_x + ydst] = c;
HDC dst_dc; }
dds_GetDC(This, &dst_dc); }
}
GdiTransparentBlt(
dst_dc,
dst_x,
dst_y,
dst_w,
dst_h,
src_dc,
src_x,
src_y,
src_w,
src_h,
color_key.dwColorSpaceLowValue);
} }
} }
else else