mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
support mirror blt with DDBLT_KEYSRC
This commit is contained in:
parent
3e9c38dade
commit
1923e2bb0c
@ -162,43 +162,65 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR
|
|||||||
(dwFlags & DDBLT_KEYSRCOVERRIDE) ?
|
(dwFlags & DDBLT_KEYSRCOVERRIDE) ?
|
||||||
lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue;
|
lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue;
|
||||||
|
|
||||||
|
BOOL got_fx = (dwFlags & DDBLT_DDFX) && lpDDBltFx;
|
||||||
|
BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT);
|
||||||
|
BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN);
|
||||||
|
|
||||||
float scale_w = (float)src_w / dst_w;
|
float scale_w = (float)src_w / dst_w;
|
||||||
float scale_h = (float)src_h / dst_h;
|
float scale_h = (float)src_h / dst_h;
|
||||||
|
|
||||||
if (This->bpp == 8)
|
if (This->bpp == 8)
|
||||||
{
|
{
|
||||||
int y1, x1;
|
for (int y = 0; y < dst_h; y++)
|
||||||
for (y1 = 0; y1 < dst_h; y1++)
|
|
||||||
{
|
{
|
||||||
int ydst = This->width * (y1 + dst_y);
|
int scaled_y = (int)(y * scale_h);
|
||||||
int ysrc = src_surface->width * ((int)(y1 * scale_h) + src_y);
|
|
||||||
|
|
||||||
for (x1 = 0; x1 < dst_w; x1++)
|
if (mirror_up_down)
|
||||||
|
scaled_y = src_h - 1 - scaled_y;
|
||||||
|
|
||||||
|
int rc_src_y = src_surface->width * (scaled_y + src_y);
|
||||||
|
int rc_dst_y = This->width * (y + dst_y);
|
||||||
|
|
||||||
|
for (int x = 0; x < dst_w; x++)
|
||||||
{
|
{
|
||||||
unsigned char c = ((unsigned char*)src_buf)[(int)(x1 * scale_w) + src_x + ysrc];
|
int scaled_x = (int)(x * scale_w);
|
||||||
|
|
||||||
|
if (mirror_left_right)
|
||||||
|
scaled_x = src_w - 1 - scaled_x;
|
||||||
|
|
||||||
|
unsigned char c = ((unsigned char*)src_buf)[scaled_x + src_x + rc_src_y];
|
||||||
|
|
||||||
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
|
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
|
||||||
{
|
{
|
||||||
((unsigned char*)dst_buf)[x1 + dst_x + ydst] = c;
|
((unsigned char*)dst_buf)[x + dst_x + rc_dst_y] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (This->bpp == 16)
|
else if (This->bpp == 16)
|
||||||
{
|
{
|
||||||
int y1, x1;
|
for (int y = 0; y < dst_h; y++)
|
||||||
for (y1 = 0; y1 < dst_h; y1++)
|
|
||||||
{
|
{
|
||||||
int ydst = This->width * (y1 + dst_y);
|
int scaled_y = (int)(y * scale_h);
|
||||||
int ysrc = src_surface->width * ((int)(y1 * scale_h) + src_y);
|
|
||||||
|
|
||||||
for (x1 = 0; x1 < dst_w; x1++)
|
if (mirror_up_down)
|
||||||
|
scaled_y = src_h - 1 - scaled_y;
|
||||||
|
|
||||||
|
int rc_src_y = src_surface->width * (scaled_y + src_y);
|
||||||
|
int rc_dst_y = This->width * (y + dst_y);
|
||||||
|
|
||||||
|
for (int x = 0; x < dst_w; x++)
|
||||||
{
|
{
|
||||||
unsigned short c = ((unsigned short*)src_buf)[(int)(x1 * scale_w) + src_x + ysrc];
|
int scaled_x = (int)(x * scale_w);
|
||||||
|
|
||||||
|
if (mirror_left_right)
|
||||||
|
scaled_x = src_w - 1 - scaled_x;
|
||||||
|
|
||||||
|
unsigned short c = ((unsigned short*)src_buf)[scaled_x + src_x + rc_src_y];
|
||||||
|
|
||||||
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
|
if (c < color_key.dwColorSpaceLowValue || c > color_key.dwColorSpaceHighValue)
|
||||||
{
|
{
|
||||||
((unsigned short*)dst_buf)[x1 + dst_x + ydst] = c;
|
((unsigned short*)dst_buf)[x + dst_x + rc_dst_y] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -508,38 +530,36 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI
|
|||||||
{
|
{
|
||||||
if (This->bpp == 8)
|
if (This->bpp == 8)
|
||||||
{
|
{
|
||||||
int y1, x1;
|
for (int y = 0; y < dst_h; y++)
|
||||||
for (y1 = 0; y1 < dst_h; y1++)
|
|
||||||
{
|
{
|
||||||
int ydst = This->width * (y1 + dst_y);
|
int rc_dst_y = This->width * (y + dst_y);
|
||||||
int ysrc = src_surface->width * (y1 + src_y);
|
int rc_src_y = src_surface->width * (y + src_y);
|
||||||
|
|
||||||
for (x1 = 0; x1 < dst_w; x1++)
|
for (int x = 0; x < dst_w; x++)
|
||||||
{
|
{
|
||||||
unsigned char c = ((unsigned char *)src_buf)[x1 + src_x + ysrc];
|
unsigned char c = ((unsigned char *)src_buf)[x + src_x + rc_src_y];
|
||||||
|
|
||||||
if (c < src_surface->color_key.dwColorSpaceLowValue || c > src_surface->color_key.dwColorSpaceHighValue)
|
if (c < src_surface->color_key.dwColorSpaceLowValue || c > src_surface->color_key.dwColorSpaceHighValue)
|
||||||
{
|
{
|
||||||
((unsigned char *)dst_buf)[x1 + dst_x + ydst] = c;
|
((unsigned char *)dst_buf)[x + dst_x + rc_dst_y] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (This->bpp == 16)
|
else if (This->bpp == 16)
|
||||||
{
|
{
|
||||||
int y1, x1;
|
for (int y = 0; y < dst_h; y++)
|
||||||
for (y1 = 0; y1 < dst_h; y1++)
|
|
||||||
{
|
{
|
||||||
int ydst = This->width * (y1 + dst_y);
|
int rc_dst_y = This->width * (y + dst_y);
|
||||||
int ysrc = src_surface->width * (y1 + src_y);
|
int rc_src_y = src_surface->width * (y + src_y);
|
||||||
|
|
||||||
for (x1 = 0; x1 < dst_w; x1++)
|
for (int x = 0; x < dst_w; x++)
|
||||||
{
|
{
|
||||||
unsigned short c = ((unsigned short *)src_buf)[x1 + src_x + ysrc];
|
unsigned short c = ((unsigned short *)src_buf)[x + src_x + rc_src_y];
|
||||||
|
|
||||||
if (c < src_surface->color_key.dwColorSpaceLowValue || c > src_surface->color_key.dwColorSpaceHighValue)
|
if (c < src_surface->color_key.dwColorSpaceLowValue || c > src_surface->color_key.dwColorSpaceHighValue)
|
||||||
{
|
{
|
||||||
((unsigned short *)dst_buf)[x1 + dst_x + ydst] = c;
|
((unsigned short *)dst_buf)[x + dst_x + rc_dst_y] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user