Skip to content

Commit

Permalink
Change how color space works
Browse files Browse the repository at this point in the history
  • Loading branch information
elishacloud committed Mar 19, 2024
1 parent 56bf41e commit 53ef66f
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 33 deletions.
2 changes: 1 addition & 1 deletion Dllmain/BuildNo.rc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define BUILD_NUMBER 6972
#define BUILD_NUMBER 6973
48 changes: 19 additions & 29 deletions ddraw/IDirectDrawSurfaceX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -619,12 +619,13 @@ HRESULT m_IDirectDrawSurfaceX::Blt(LPRECT lpDestRect, LPDIRECTDRAWSURFACE7 lpDDS
else if (dwFlags & (DDBLT_KEYDEST | DDBLT_KEYSRC))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: color key not found!");
Flags &= ~BLT_COLORKEY;
hr = DDERR_INVALIDPARAMS;
break;
}

D3DTEXTUREFILTERTYPE Filter = ((dwFlags & DDBLT_DDFX) && (lpDDBltFx->dwDDFX & DDBLTFX_ARITHSTRETCHY)) ? D3DTEXF_LINEAR : D3DTEXF_NONE;

hr = CopySurface(lpDDSrcSurfaceX, lpSrcRect, lpDestRect, Filter, ColorKey, Flags);
hr = CopySurface(lpDDSrcSurfaceX, lpSrcRect, lpDestRect, Filter, ColorKey.dwColorSpaceLowValue, Flags);

} while (false);

Expand Down Expand Up @@ -2668,35 +2669,26 @@ HRESULT m_IDirectDrawSurfaceX::SetColorKey(DWORD dwFlags, LPDDCOLORKEY lpDDColor
return DDERR_INVALIDPARAMS;
}

// Check for color space
if (lpDDColorKey && (dwFlags & DDCKEY_COLORSPACE) && lpDDColorKey->dwColorSpaceLowValue != lpDDColorKey->dwColorSpaceHighValue)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: color space not supported!");
return DDERR_NOCOLORKEYHW;
}

// Set color key
if (!lpDDColorKey)
{
surfaceDesc2.ddsCaps.dwCaps &= ~dds;
}
else
{
// You must add the flag DDCKEY_COLORSPACE, otherwise DirectDraw will collapse the range to one value
DDCOLORKEY ColorKey = { lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceLowValue };

// Set color key flag
surfaceDesc2.ddsCaps.dwCaps |= dds;

// Get ColorKey
DDCOLORKEY ColorKey = {};
if (!(dwFlags & DDCKEY_COLORSPACE))
{
// You must add the flag DDCKEY_COLORSPACE, otherwise DirectDraw will collapse the range to one value
ColorKey.dwColorSpaceLowValue = *(DWORD*)lpDDColorKey;
ColorKey.dwColorSpaceHighValue = *(DWORD*)lpDDColorKey;
}
else
{
ColorKey = *lpDDColorKey;
}

// Make sure HighValue is not lower than LowValue
if (ColorKey.dwColorSpaceHighValue < ColorKey.dwColorSpaceLowValue)
{
ColorKey.dwColorSpaceHighValue = ColorKey.dwColorSpaceLowValue;
}

// Set color key
switch (dds)
{
Expand Down Expand Up @@ -5178,7 +5170,7 @@ HRESULT m_IDirectDrawSurfaceX::SaveSurfaceToFile(const char *filename, D3DXIMAGE
}

// Copy surface
HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface, RECT* pSourceRect, RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter, DDCOLORKEY ColorKey, DWORD dwFlags)
HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface, RECT* pSourceRect, RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter, D3DCOLOR ColorKey, DWORD dwFlags)
{
// Check parameters
if (!pSourceSurface)
Expand Down Expand Up @@ -5474,8 +5466,6 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface

// Set color variables
DWORD ByteMask = (ByteCount == 1) ? 0x000000FF : (ByteCount == 2) ? 0x0000FFFF : (ByteCount == 3) ? 0x00FFFFFF : 0xFFFFFFFF;
DWORD ColorKeyLow = ColorKey.dwColorSpaceLowValue & ByteMask;
DWORD ColorKeyHigh = ColorKey.dwColorSpaceHighValue & ByteMask;

// Simple copy with ColorKey and Mirroring
if (!IsStretchRect && !FormatMismatch)
Expand All @@ -5489,7 +5479,7 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface
for (LONG x = 0; x < DestRectWidth; x++)
{
BYTE PixelColor = SrcBufferLoop[IsMirrorLeftRight ? DestRectWidth - x - 1 : x];
if (!IsColorKey || PixelColor < ColorKeyLow || PixelColor > ColorKeyHigh)
if (!IsColorKey || PixelColor != ColorKey)
{
DestBufferLoop[x] = PixelColor;
}
Expand All @@ -5508,7 +5498,7 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface
for (LONG x = 0; x < DestRectWidth; x++)
{
WORD PixelColor = SrcBufferLoop[IsMirrorLeftRight ? DestRectWidth - x - 1 : x];
if (!IsColorKey || PixelColor < ColorKeyLow || PixelColor > ColorKeyHigh)
if (!IsColorKey || PixelColor != ColorKey)
{
DestBufferLoop[x] = PixelColor;
}
Expand All @@ -5528,7 +5518,7 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface
{
LONG w = IsMirrorLeftRight ? DestRectWidth - x - 1 : x;
DWORD PixelColor = (*(DWORD*)(SrcBufferLoop + w)) & ByteMask;
if (!IsColorKey || PixelColor < ColorKeyLow || PixelColor > ColorKeyHigh)
if (!IsColorKey || PixelColor != ColorKey)
{
DestBufferLoop[x] = SrcBufferLoop[w];
}
Expand All @@ -5547,7 +5537,7 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface
for (LONG x = 0; x < DestRectWidth; x++)
{
DWORD PixelColor = SrcBufferLoop[IsMirrorLeftRight ? DestRectWidth - x - 1 : x];
if (!IsColorKey || PixelColor < ColorKeyLow || PixelColor > ColorKeyHigh)
if (!IsColorKey || PixelColor != ColorKey)
{
DestBufferLoop[x] = PixelColor;
}
Expand Down Expand Up @@ -5576,7 +5566,7 @@ HRESULT m_IDirectDrawSurfaceX::CopySurface(m_IDirectDrawSurfaceX* pSourceSurface
BYTE* NewPixel = (IsMirrorLeftRight) ? SrcBuffer + ((SrcRectWidth - r - 1) * SrcByteCount) : SrcBuffer + (r * SrcByteCount);
DWORD PixelColor = (*(DWORD*)NewPixel) & ByteMask;

if (!IsColorKey || PixelColor < ColorKeyLow || PixelColor > ColorKeyHigh)
if (!IsColorKey || PixelColor != ColorKey)
{
if (FormatR5G6B5toX8R8G8B8)
{
Expand Down
2 changes: 1 addition & 1 deletion ddraw/IDirectDrawSurfaceX.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ class m_IDirectDrawSurfaceX : public IUnknown, public AddressLookupTableDdrawObj
// Copying surface textures
HRESULT SaveDXTDataToDDS(const void* data, size_t dataSize, const char* filename, int dxtVersion) const;
HRESULT SaveSurfaceToFile(const char* filename, D3DXIMAGE_FILEFORMAT format);
HRESULT CopySurface(m_IDirectDrawSurfaceX* pSourceSurface, RECT* pSourceRect, RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter, DDCOLORKEY ColorKey, DWORD dwFlags);
HRESULT CopySurface(m_IDirectDrawSurfaceX* pSourceSurface, RECT* pSourceRect, RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter, D3DCOLOR ColorKey, DWORD dwFlags);
HRESULT CopyFromEmulatedSurface(LPRECT lpDestRect);
HRESULT CopyToEmulatedSurface(LPRECT lpDestRect);
HRESULT CopyEmulatedPaletteSurface(LPRECT lpDestRect);
Expand Down
4 changes: 2 additions & 2 deletions ddraw/IDirectDrawTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ void ConvertCaps(DDCAPS &Caps7, D3DCAPS9 &Caps9)
Caps7.dwCaps2 = (Caps9.Caps2 & (D3DCAPS2_FULLSCREENGAMMA /*| D3DCAPS2_CANCALIBRATEGAMMA*/ | D3DCAPS2_CANMANAGERESOURCE | D3DCAPS2_DYNAMICTEXTURES /*| D3DCAPS2_CANAUTOGENMIPMAP | D3DCAPS2_CANSHARERESOURCE*/)) |
(/*DDCAPS2_CANBOBINTERLEAVED | DDCAPS2_CANBOBNONINTERLEAVED | DDCAPS2_NONLOCALVIDMEM |*/ DDCAPS2_WIDESURFACES | /*DDCAPS2_CANFLIPODDEVEN |*/ DDCAPS2_COPYFOURCC | DDCAPS2_NOPAGELOCKREQUIRED |
DDCAPS2_PRIMARYGAMMA | DDCAPS2_CANRENDERWINDOWED /*| DDCAPS2_FLIPINTERVAL*/ | DDCAPS2_FLIPNOVSYNC);
Caps7.dwCKeyCaps = (DDCKEYCAPS_DESTBLT | DDCKEYCAPS_DESTBLTCLRSPACE | /*DDCKEYCAPS_DESTOVERLAY | DDCKEYCAPS_DESTOVERLAYCLRSPACE |*/ DDCKEYCAPS_SRCBLT | DDCKEYCAPS_SRCBLTCLRSPACE
/*| DDCKEYCAPS_SRCOVERLAY | DDCKEYCAPS_SRCOVERLAYCLRSPACE*/);
Caps7.dwCKeyCaps = (DDCKEYCAPS_DESTBLT | /*DDCKEYCAPS_DESTBLTCLRSPACE | DDCKEYCAPS_DESTOVERLAY | DDCKEYCAPS_DESTOVERLAYCLRSPACE |*/ DDCKEYCAPS_SRCBLT /*| DDCKEYCAPS_SRCBLTCLRSPACE
| DDCKEYCAPS_SRCOVERLAY | DDCKEYCAPS_SRCOVERLAYCLRSPACE*/);
Caps7.dwFXCaps = (DDFXCAPS_BLTARITHSTRETCHY | DDFXCAPS_BLTMIRRORLEFTRIGHT | DDFXCAPS_BLTMIRRORUPDOWN | DDFXCAPS_BLTSHRINKX | DDFXCAPS_BLTSHRINKY | DDFXCAPS_BLTSTRETCHX |
DDFXCAPS_BLTSTRETCHY /*| DDFXCAPS_OVERLAYARITHSTRETCHY | DDFXCAPS_OVERLAYSHRINKX | DDFXCAPS_OVERLAYSHRINKY | DDFXCAPS_OVERLAYSTRETCHX | DDFXCAPS_OVERLAYSTRETCHY |
DDFXCAPS_OVERLAYMIRRORLEFTRIGHT | DDFXCAPS_OVERLAYMIRRORUPDOWN | DDFXCAPS_OVERLAYDEINTERLACE*/);
Expand Down

0 comments on commit 53ef66f

Please sign in to comment.