If your application writes to display memory, bitmaps stored in memory do not necessarily occupy a contiguous block of memory. In this case, the width and pitch of a line in a bitmap can be different. The width is the distance between two addresses in memory that represent the beginning of a line and the end of the line of a stored bitmap. This distance represents only the width of the bitmap in memory; it does not include any extra memory required to reach the beginning of the next line of the bitmap. The pitch is the distance between two addresses in memory that represent the beginning of a line and the beginning of the next line in a stored bitmap.
For rectangular memory, for example, the pitch of the display memory will include the width of the bitmap plus part of a cache. The following figure shows the difference between width and pitch in rectangular memory:
In this figure, the front buffer and back buffer are both 640´480´8, and the cache is 384´480´8. To reach the address of the next line to write to the buffer, you must add 640 and 384 to get 1024, which is the beginning of the next line.
Therefore, when rendering directly into surface memory, always use the pitch returned by the IDirectDrawSurface2::Lock method (or the IDirectDrawSurface2::GetDC method). Do not assume a pitch based solely on the display mode. If your application works on some display adapters but looks garbled on others, this may be the cause of your problem.