Jump to content
  • Advertisement


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


DDraw ddsd.lpSurface and ddsd.lPitch??

This topic is 5963 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

void Line(int x1, int y1, int x2, int y2) { buffer = (UCHAR*)ddsd.lpSurface; memoffset = ddsd.lPitch; int x = x1, y = y1; for(int i = 0; i <= y2 - y1; i++) { for(int j = 0; j <= x2 - x1; j++) { buffer[x + y*memoffset] = 5;//fills in the pixel in this memory spot x+=1; } x=x1; y+=1; } } I have some questions about how this works. First off I know ddsd.lpSurface is of type (void*) but why do we cast it to (UCHAR*)?? Also why do we use x+y*ddsd.lPitch?? These are kindof confusing to me. Thanks all. DDraw. She has double D''''s

Share this post

Link to post
Share on other sites
Well, I don''t have aclue about why we convert it to uchar, but I can answer question #2.

Ok, the whole surface is one big array. for example, pixel 0,0 is element 0 in the array. pixel 1,0 is element 1 in the array.
pixel 0,1 is element(assuming 640*480 resolution) is element 640 in the array. So, y*lpitch(this is suposed to be 640 but sometimes is not, not sure why) will get you how many pixels down the # is in the array, then adding x to it will add that many elements to it. Let me show this in a simple table of pixels:

1 ,2, 3, 4, 5, 6, 7, 8, 9,10

a lot more than 10, but you get the idea I hope

Sponge Factory

Share this post

Link to post
Share on other sites
The reason the width is not equal to pitch all the time is that for speed purposes it is cometimes faster to force the scanlines to align on dword or quadword boundaries. The reason you cast it is because presumably you want to work with it in one byte increments (usually the easiest way) you could do it in 16bit or 32 bit chunks too if you found it to be easier this way.

Share this post

Link to post
Share on other sites
the reason you have to "convert" the void* pointer to something else (UCHAR* or BYTE* or even DWORD* for 32bit screenmodes) is, that... well - lookup void in any dictionary.

void* means: i have a pointer, but i dont know to what kind of data it points.
you have to tell the compiler if you want to write a byte, or 2 or 4, or... maybe 8 (double).

got me?

just try:

BYTE some_array[123];
void* ptr = (void*) &(some_array[0]); // make void-pointer point to the array...

*ptr = 1; // <- you get the compiler error HERE

next thing is - if you have

BYTE* p1 = (BYTE*) &(some_array[0]);
DWORD* p2 = (DWORD*) &(some_array[0]);

then p1[3] and p2[3] does not reference the same address.
get a c++ book, read it and you know why.


--- foobar
We push more polygons before breakfast than most people do in a day

[edited by - foobar on March 21, 2002 1:53:43 PM]

Share this post

Link to post
Share on other sites

  • Advertisement

Important Information

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

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!