Jump to content
  • Advertisement
Sign in to follow this  
ChocoboX

surface pitch equal to zero ????

This topic is 4877 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to write a really simple function that copies a surface onto another. blend_result->Lock(NULL, &srf_desc, DDLOCK_WAIT, NULL); bmp_stretch->Lock(NULL, &bmp_desc, DDLOCK_WAIT, NULL); final->Lock(NULL, &res_desc, DDLOCK_WAIT, NULL); srf_data = (WORD*)srf_desc.lpSurface; bmp_data = (WORD*)bmp_desc.lpSurface; res_data = (WORD*)res_desc.lpSurface; fprintf(logfile, "blend result pitch/2 = %d\n" "final pitch/2 = %d\n" "bmp_stretch pitch/2 = %d\n", (int)srf_desc.lPitch/2, (int)res_desc.lPitch/2, (int)bmp_desc.lPitch/2); log.txt : blend result pitch/2 = 0 final pitch/2 = 0 bmp_stretch pitch/2 = 0 blend_result and final are both filled with color, while bmp_stretch contains the pixels of a bitmap.All the surfaces are 1024 x 768 and so is my screen resolution.My screen bpp is set to 16-bit (565).blend_result and final are filled with color using this function : void clearSurface(LPDIRECTDRAWSURFACE7 surface, WORD color) { memset(&clr_color, 0, sizeof(DDBLTFX)); clr_color.dwSize = sizeof(DDBLTFX); clr_color.dwFillColor = color; surface->Blt(NULL,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT, &clr_color); } Also, when I try : for(int y = 0; y < SCREEN_HEIGHT; y++) for(int x = 0; x < SCREEN_WIDTH; x++) srf_data[y * SCREEN_WIDTH + x] = res_data[y * SCREEN_WIDTH + x]; blend_result->Unlock(NULL); bmp_stretch->Unlock(NULL); final->Unlock(NULL); } The app hangs and comes back to the desktop.I know I have to use the surface pitch instead of my screen width for the pixel plotting formula, but since they are zero it's not of any use.Even if I use the pitch the app jumps back to the desktop again.Please help me out.

Share this post


Link to post
Share on other sites
Advertisement
Are you sure the Lock() calls are succeeding? Most of the DirectX functions return a HRESULT value to indicate success or failure. It is recommended to test the return values so you can track any error as soon as they occur. The can be tested using something like:


HRESULT hr = blend_result->Lock(NULL, &srf_desc, DDLOCK_WAIT, NULL);
if (FAILED(hr))
{
fprintf(logfile, "[Error] Failed to lock blend_result [0x%08x]!\n", hr);
return;
}

That could explain the crash and pitch being zero, if Lock() fails, you won't have a valid surface pointer so it will cause an access violation when trying to use it.

And yes, you must use the surface's pitch value and not the screen width or surface creation width since the graphic card can add padding to the scanlines thus making them larger what you would expect them to be.

Share this post


Link to post
Share on other sites
Indeed one of my surfaces isn't getting locked.I can't express my gratitude towards you.Thank you.I'll actually change the way I code.From now on not a single expression won't be error-checked.
But why isn't the lock succeeding? How can I fix this ?

Share this post


Link to post
Share on other sites
The return code should tell you why it isn't succeeding. Enter the return code into the DX Error Lookup tool. That should give you some idea of where the problem is.

Share this post


Link to post
Share on other sites
The error's E_INVALIDARG (0x80070057) .
srf_desc,bmp_desc and res_desc are all of type DDSURFACEDESC2.
Why is the function returning this ?

Share this post


Link to post
Share on other sites
I've found the problem.When initliazing the surfaces I used the same DDSURFACEDESC three times.I didn't know that the Lock function reads data from the surface description when you pass it.It actually reads and writes to it.Thanks everybody, really. Thanks !!! This taught me a great lesson : always check for errors

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!