Skip to content

Commit c21b2dd

Browse files
committed
Modify surface desc flags directly
1 parent 7919dc5 commit c21b2dd

File tree

2 files changed

+65
-65
lines changed

2 files changed

+65
-65
lines changed

Dllmain/BuildNo.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
#define BUILD_NUMBER 8113
1+
#define BUILD_NUMBER 8114

ddraw/IDirectDrawSurfaceX.cpp

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3526,15 +3526,13 @@ HRESULT m_IDirectDrawSurfaceX::SetSurfaceDesc2(LPDDSURFACEDESC2 lpDDSurfaceDesc2
35263526
{
35273527
Flag = Flag || (surfaceDesc2.dwWidth != lpDDSurfaceDesc2->dwWidth);
35283528
SurfaceFlags &= ~DDSD_WIDTH;
3529-
ResetDisplayFlags &= ~DDSD_WIDTH;
35303529
surfaceDesc2.dwFlags |= DDSD_WIDTH;
35313530
surfaceDesc2.dwWidth = lpDDSurfaceDesc2->dwWidth;
35323531
}
35333532
if ((SurfaceFlags & DDSD_HEIGHT) && lpDDSurfaceDesc2->dwHeight)
35343533
{
35353534
Flag = Flag || (surfaceDesc2.dwHeight != lpDDSurfaceDesc2->dwHeight);
35363535
SurfaceFlags &= ~DDSD_HEIGHT;
3537-
ResetDisplayFlags &= ~DDSD_HEIGHT;
35383536
surfaceDesc2.dwFlags |= DDSD_HEIGHT;
35393537
surfaceDesc2.dwHeight = lpDDSurfaceDesc2->dwHeight;
35403538
}
@@ -5077,89 +5075,100 @@ void m_IDirectDrawSurfaceX::UpdateSurfaceDesc()
50775075
{
50785076
// Get surface flags
50795077
bool IsChanged = false;
5080-
DWORD Flags = surfaceDesc2.dwFlags;
5081-
if (ShouldResetDisplayFlags)
50825078
{
5083-
Flags &= ~ResetDisplayFlags;
5084-
}
5085-
5086-
// Add missing flags
5087-
if (SUCCEEDED(CheckInterface(__FUNCTION__, false, false, false)) &&
5088-
((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5089-
((Flags & DDSD_REFRESHRATE) && !surfaceDesc2.dwRefreshRate)))
5090-
{
5091-
// Get resolution
5092-
DWORD Width, Height, RefreshRate, BPP;
5093-
ddrawParent->GetSurfaceDisplay(Width, Height, BPP, RefreshRate);
5094-
5095-
// Set Height and Width
5096-
if (Width && Height &&
5097-
(Flags & (DDSD_WIDTH | DDSD_HEIGHT)) != (DDSD_WIDTH | DDSD_HEIGHT))
5079+
DWORD Flags = surfaceDesc2.dwFlags;
5080+
if (ShouldResetDisplayFlags)
50985081
{
5099-
ResetDisplayFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5100-
Flags |= DDSD_WIDTH | DDSD_HEIGHT;
5101-
surfaceDesc2.dwWidth = Width;
5102-
surfaceDesc2.dwHeight = Height;
5103-
surfaceDesc2.lPitch = 0;
5104-
IsChanged = true;
5082+
Flags &= ~ResetDisplayFlags;
51055083
}
5106-
// Set Refresh Rate
5107-
if (RefreshRate && ((Flags & DDSD_REFRESHRATE) || IsPrimaryOrBackBuffer()))
5108-
{
5109-
Flags |= DDSD_REFRESHRATE;
5110-
surfaceDesc2.dwRefreshRate = RefreshRate;
5111-
}
5112-
// Set PixelFormat
5113-
if (BPP && !(Flags & DDSD_PIXELFORMAT))
5114-
{
5115-
ResetDisplayFlags |= DDSD_PIXELFORMAT;
5116-
Flags |= DDSD_PIXELFORMAT;
5117-
ddrawParent->GetDisplayPixelFormat(surfaceDesc2.ddpfPixelFormat, BPP);
5118-
surfaceDesc2.lPitch = 0;
5119-
IsChanged = true;
5120-
}
5121-
// Reset MipMap level pitch
5122-
if (IsChanged && MipMaps.size())
5084+
5085+
// Add missing flags
5086+
if (SUCCEEDED(CheckInterface(__FUNCTION__, false, false, false)) &&
5087+
((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5088+
((Flags & DDSD_REFRESHRATE) && !surfaceDesc2.dwRefreshRate)))
51235089
{
5124-
for (auto& entry : MipMaps)
5090+
// Get resolution
5091+
DWORD Width, Height, RefreshRate, BPP;
5092+
ddrawParent->GetSurfaceDisplay(Width, Height, BPP, RefreshRate);
5093+
5094+
// Set Height and Width
5095+
if (Width && Height &&
5096+
(Flags & (DDSD_WIDTH | DDSD_HEIGHT)) != (DDSD_WIDTH | DDSD_HEIGHT))
51255097
{
5126-
entry.dwWidth = 0;
5127-
entry.dwHeight = 0;
5128-
entry.lPitch = 0;
5098+
ResetDisplayFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5099+
Flags |= DDSD_WIDTH | DDSD_HEIGHT;
5100+
surfaceDesc2.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5101+
surfaceDesc2.dwWidth = Width;
5102+
surfaceDesc2.dwHeight = Height;
5103+
surfaceDesc2.lPitch = 0;
5104+
IsChanged = true;
51295105
}
5106+
// Set Refresh Rate
5107+
if (RefreshRate && ((Flags & DDSD_REFRESHRATE) || IsPrimaryOrBackBuffer()))
5108+
{
5109+
Flags |= DDSD_REFRESHRATE;
5110+
surfaceDesc2.dwFlags |= DDSD_REFRESHRATE;
5111+
surfaceDesc2.dwRefreshRate = RefreshRate;
5112+
}
5113+
// Set PixelFormat
5114+
if (BPP && !(Flags & DDSD_PIXELFORMAT))
5115+
{
5116+
ResetDisplayFlags |= DDSD_PIXELFORMAT;
5117+
Flags |= DDSD_PIXELFORMAT;
5118+
surfaceDesc2.dwFlags |= DDSD_PIXELFORMAT;
5119+
ddrawParent->GetDisplayPixelFormat(surfaceDesc2.ddpfPixelFormat, BPP);
5120+
surfaceDesc2.lPitch = 0;
5121+
IsChanged = true;
5122+
}
5123+
// Reset MipMap level pitch
5124+
if (IsChanged && MipMaps.size())
5125+
{
5126+
for (auto& entry : MipMaps)
5127+
{
5128+
entry.dwWidth = 0;
5129+
entry.dwHeight = 0;
5130+
entry.lPitch = 0;
5131+
}
5132+
}
5133+
}
5134+
5135+
// Clear reset flag
5136+
if ((Flags & ResetDisplayFlags) == ResetDisplayFlags)
5137+
{
5138+
ShouldResetDisplayFlags = false;
51305139
}
51315140
}
51325141
// Remove surface memory pointer
51335142
if (!surface.UsingSurfaceMemory)
51345143
{
5135-
Flags &= ~DDSD_LPSURFACE;
5144+
surfaceDesc2.dwFlags &= ~DDSD_LPSURFACE;
51365145
surfaceDesc2.lpSurface = nullptr;
51375146
}
51385147
// Unset lPitch
5139-
if ((((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5140-
!(Flags & DDSD_PITCH)) && !(Flags & DDSD_LINEARSIZE)) || !surfaceDesc2.lPitch)
5148+
if ((((surfaceDesc2.dwFlags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5149+
!(surfaceDesc2.dwFlags & DDSD_PITCH)) && !(surfaceDesc2.dwFlags & DDSD_LINEARSIZE)) || !surfaceDesc2.lPitch)
51415150
{
5142-
Flags &= ~(DDSD_PITCH | DDSD_LINEARSIZE);
5151+
surfaceDesc2.dwFlags &= ~(DDSD_PITCH | DDSD_LINEARSIZE);
51435152
surfaceDesc2.lPitch = 0;
51445153
}
51455154
// Set lPitch
5146-
if ((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) == (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) &&
5147-
!(Flags & DDSD_LINEARSIZE) && !(Flags & DDSD_PITCH))
5155+
if ((surfaceDesc2.dwFlags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) == (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) &&
5156+
!(surfaceDesc2.dwFlags & DDSD_LINEARSIZE) && !(surfaceDesc2.dwFlags & DDSD_PITCH))
51485157
{
51495158
DWORD Pitch = ComputePitch(GetDisplayFormat(surfaceDesc2.ddpfPixelFormat), surfaceDesc2.dwWidth, surfaceDesc2.dwHeight);
51505159
if (Pitch)
51515160
{
5152-
Flags |= DDSD_PITCH;
5161+
surfaceDesc2.dwFlags |= DDSD_PITCH;
51535162
surfaceDesc2.lPitch = Pitch;
51545163
}
51555164
}
51565165
// Set surface format
5157-
if (surface.Format == D3DFMT_UNKNOWN && (Flags & DDSD_PIXELFORMAT))
5166+
if (surface.Format == D3DFMT_UNKNOWN && (surfaceDesc2.dwFlags & DDSD_PIXELFORMAT))
51585167
{
51595168
surface.Format = GetDisplayFormat(surfaceDesc2.ddpfPixelFormat);
51605169
}
51615170
// Set attached stencil surface size
5162-
if (IsChanged && (Flags & (DDSD_WIDTH | DDSD_HEIGHT)) == (DDSD_WIDTH | DDSD_HEIGHT))
5171+
if (IsChanged && (surfaceDesc2.dwFlags & (DDSD_WIDTH | DDSD_HEIGHT)) == (DDSD_WIDTH | DDSD_HEIGHT))
51635172
{
51645173
m_IDirectDrawSurfaceX* lpAttachedSurfaceX = GetAttachedDepthStencil();
51655174
if (lpAttachedSurfaceX && (surfaceDesc2.dwWidth != lpAttachedSurfaceX->surfaceDesc2.dwWidth ||
@@ -5176,15 +5185,6 @@ void m_IDirectDrawSurfaceX::UpdateSurfaceDesc()
51765185
}
51775186
}
51785187
}
5179-
5180-
// Add flags to surface desc
5181-
surfaceDesc2.dwFlags |= Flags;
5182-
5183-
// Clear reset flag
5184-
if ((Flags & ResetDisplayFlags) == ResetDisplayFlags)
5185-
{
5186-
ShouldResetDisplayFlags = false;
5187-
}
51885188
}
51895189

51905190
void m_IDirectDrawSurfaceX::SetAsRenderTarget()

0 commit comments

Comments
 (0)