• ### Announcements

#### Archived

This topic is now archived and is closed to further replies.

# need help with locking dd surf

## Recommended Posts

When I lock a dd surface, how can I get to pixel (x,y)?? Let''s say that I lock rectangle rc, and in ddsd I have the surface description. What''s the formula to get to the memory for pixel (x,y), relative to the upper-left corner of rc. The bpp is 16bits. I tried:  *(WORD*)((BYTE*)ddsd.lpSurface+y*ddsd.lPitch+x*2)  but i get something weird. Please help me, someone. Octavian E-mail: octav@octavsoft.com Webpage: http://www.octavsoft.com

##### Share on other sites
Try this ...

  WORD *pixbuffer = (WORD *)ddsd.lpSurfacepixbuffer[x+y*ddsd.lPitch];

This is all assuming that you locked the surface with the proper perameters such as DDLOCK_SURFACEMEMORYPTR in the flags when you lock the surface...

Also note that x and y are the co-ordinates on the screen - I hope this helps ...

Sincerely,

Destroyer

===============================
In a world without boundaries -
Who needs gates or windows ?
=============================== [/source]

Edited by - Destroyer on June 25, 2001 4:30:02 PM

##### Share on other sites
In 16bpp mode if you are going to cast the buffer to a word* you will need to divide the pitch by 2. If you are going to cast to a byte* you need to mult x by 2:

WORD *pixbuffer = (WORD *)ddsd.lpSurface;
pixbuffer += (x + (y * (ddsd.lpitch/2)));
*pixbuffer = color;

or

BYTE *pixbuffer = (BYTE *)ddsd.lpSurface;
pixbuffer += ((x*2) + (y * ddsd.lpitch));
*pixbuffer = color;

Lots of room for optimization here, but you get the picture.

##### Share on other sites
Uh oh...

Thats the first I''ve heard about dividing or multipying by 2 - why do you have to do that ?

Destroyer

##### Share on other sites
I figured it out in the end. Aldacron is right, because each pixel is 2 bytes (1 word) in 16 bpp. he pitch is always in bytes, so the width has to be multiplied with 2 or the oder way around. The fastest one would be:
*( (WORD*) ( (BYTE*) surf + y * ddsd1.lPitch ) + x )
cause there is no divide or multiplication.

Octavian
E-mail: octav@octavsoft.com
Webpage: http://www.octavsoft.com