Game Development Reference

In-Depth Information

that is at least three times the pixel width, plus the extra up to 3 bytes to

ensure divisibility by 4. We set two variables
x
and
y
to the starting value.

Then we create two distance variables for the
x
distance,
dx
, and the
y

distance,
dy
.

We set
xinc
and
yinc
to 1. The value for
xinc
indicates whether
xe
is

greater than
xs
. If so, then we will reach
xe
by 1 to
xs
, a
dx
number of

times. If, however,
xs
>
xe
, then we must subtract 1 from
xs
,
dx
number

of times. We check
dx
to indicate which direction we are working in. If
dx

is less than 0, then the
xinc
is made to be -1 and the value for
dx
is

negated. A similar technique is used for the
y
values.

The COLORREF parameter passed to the function is simply a 32-bit

integer. The values for red, green and blue are embedded in this value,

and we retrieve them with the code:

red= col&0xFF;

green=(col&0xFF00)>>8;

blue=(col&0xFF0000)>>16;

Now we use a switch statement to select based on bit depth. In our code

we only support 24 bits, but it gives us flexibility for the future to support

alternative bit depths.

void CCanvas::DrawLine(int xs,int ys,int xe,int ye,COLORREF col){

int x, y, d, dx, dy, c,m, xinc, yinc, width;

BYTE red,blue,green;

if (!ClipLine(xs,ys,xe,ye)) return;

//If ClipLine returns false then start and end are out off the

//canvas so there is nothing to draw

//m_swidth is the DWORD aligned storage width

width=m_swidth;

//x and y are set to the starting point

x=xs; y=ys;

//dx and dy are the distances in the x and y directions

//respectively

dx=xe-xs; dy=ye-ys;

//ptr is the memory location of x,y

BYTE* ptr=GetPixelAddress(x,y);

xinc=1; yinc=1;

if (dx<0){xinc=-1; dx=-dx;}

if (dy<0){yinc=-1; dy=-dy; width=-width;}

Search Nedrilad ::

Custom Search