void InitToolbox ( void ); void InitWindow ( void ); void Line2 ( short, short, short, short, short ); void main ( void ); Ptr baseAddr; short rowBytes; void InitToolbox ( void ) { InitGraf ( &qd.thePort ); InitFonts (); InitWindows (); InitMenus (); InitCursor (); } void InitWindow ( void ) { WindowPtr window; Rect windowRect = { 0, 0, 480, 640 }; window = NewCWindow ( nil, &windowRect, "\p", true, 0, (WindowPtr)-1L, false, 0L ); ShowWindow ( window ); SetPort ( window ); } void Line2 ( short x1, short y1, short x2, short y2, short color ) { double curX, curY, deltaDot, colorIndex; short drawX, drawY, curColor; // short temp; if (( x1 == x2 ) || ( y1 == y2 ) || (( x2 - x1 ) & 0x7FFF) == (( y2 - y1 ) & 0x7FFF )) { MoveTo ( x1, y1 ); LineTo ( x2, y2 ); return; } deltaDot = (float)( y2 - y1 ) / (float)( x2 - x1 ); curX = x1; curY = y1; colorIndex = 0; if ( deltaDot < 1 && deltaDot > -1 ) { for ( curX = x1; curX < x2; ++curX ) { curColor = 10 * ( colorIndex >= 0 ? colorIndex : -colorIndex ); drawX = curX; drawY = curY; if ( drawX >= 0 && drawX < 640 && drawY >= 0 && drawY < 480 ) baseAddr [ rowBytes * drawY + drawX ] = color - curColor; if ( colorIndex > 0 ) { if ( drawX >= 0 && drawX < 640 && ( drawY + 1 ) >= 0 && ( drawY + 1 ) < 480 ) baseAddr [ rowBytes * ( drawY + 1 ) + drawX ] = color - 10 + curColor; } else if ( colorIndex < 0 ) { if ( drawX >= 0 && drawX < 640 && ( drawY - 1 ) >= 0 && ( drawY - 1 ) < 480 ) baseAddr [ rowBytes * ( drawY - 1 ) + drawX ] = color - 10 + curColor; } curY += deltaDot; colorIndex += deltaDot; if ( colorIndex >= 1 ) colorIndex--; else if ( colorIndex <= -1 ) colorIndex++; } } else { deltaDot = (float)(( x2 - x1 ) & 0x7FFF ) / (float)( y2 - y1 ); for ( curY = y1; curY < y2; ++curY ) { curColor = 10 * ( colorIndex >= 0 ? colorIndex : -colorIndex ); drawX = curX; drawY = curY; if ( drawX >= 0 && drawX < 640 && drawY >= 0 && drawY < 480 ) baseAddr [ rowBytes * drawY + drawX ] = color - curColor; if ( colorIndex > 0 ) { if (( drawX + 1 ) >= 0 && ( drawX + 1 ) < 640 && drawY >= 0 && drawY < 480 ) baseAddr [ rowBytes * drawY + drawX + 1 ] = color - 10 + curColor; } else if ( colorIndex < 0 ) { if (( drawX + 1 ) >= 0 && ( drawX + 1 ) < 640 && drawY >= 0 && drawY < 480 ) baseAddr [ rowBytes * drawY + drawX + 1 ] = color - 10 + curColor; } curX += deltaDot; colorIndex += deltaDot; if ( colorIndex >= 1 ) colorIndex--; else if ( colorIndex <= -1 ) colorIndex++; } } } void main ( void ) { InitToolbox (); InitWindow (); baseAddr = GetPixBaseAddr((**GetMainDevice()).gdPMap); rowBytes = (**(**GetMainDevice()).gdPMap).rowBytes & 0x3FFF; MoveTo ( 10, 470 ); TextSize ( 48 ); DrawString ( "\pAnti-Aliased Lines" ); Line2 ( 0, 0, 640, 480, 255 ); while ( !Button ()) { WaitNextEvent ( everyEvent, nil, 0L, 0L ); } FlushEvents ( everyEvent, 0 ); }