USE_WX_ZOOM clean up and other minor improvements.
* Make USE_WX_ZOOM clipping routine actually clip rather than just test if line needs drawn. * Clean up as many USE_WX_ZOOM #ifdefs as possible. * Minor coordinate rounding improvements. * Minor scrolling and panning improvements. * Remove unused KicadGraphicContext object code.
This commit is contained in:
+205
-34
@@ -38,6 +38,13 @@
|
||||
*/
|
||||
|
||||
|
||||
/* Definitions for enabling and disabling debugging features in gr_basic.cpp.
|
||||
* Please remember to set these back to 0 before making SVN commits.
|
||||
*/
|
||||
#define DEBUG_DUMP_CLIP_ERROR_COORDS 0 // Set to 1 to dump clip algorithm errors.
|
||||
#define DEBUG_DUMP_CLIP_COORDS 0 // Set to 1 to dump clipped coordinates.
|
||||
|
||||
|
||||
// For draw mode = XOR GR_XOR or GR_NXOR by background color
|
||||
int g_XorMode = GR_NXOR;
|
||||
|
||||
@@ -72,9 +79,9 @@ static wxDC* lastDC = NULL;
|
||||
|
||||
/* Local functions: */
|
||||
static void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1,
|
||||
int x2, int y2, int Color );
|
||||
int x2, int y2, int Color );
|
||||
static void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1,
|
||||
int x2, int y2, int width, int Color );
|
||||
int x2, int y2, int width, int Color );
|
||||
|
||||
/*
|
||||
* Macro clipping the trace of a line:
|
||||
@@ -138,8 +145,6 @@ int GRMapY( int y )
|
||||
#define WHEN_INSIDE
|
||||
|
||||
|
||||
#if defined( USE_WX_ZOOM )
|
||||
|
||||
/**
|
||||
* Test if any part of a line falls within the bounds of a rectangle.
|
||||
*
|
||||
@@ -153,56 +158,224 @@ int GRMapY( int y )
|
||||
*
|
||||
* @return - False if any part of the line lies within the rectangle.
|
||||
*/
|
||||
static bool clipLine( EDA_Rect* aClipBox, int x1, int y1, int x2, int y2 )
|
||||
static bool clipLine( EDA_Rect* aClipBox, int& x1, int& y1, int& x2, int& y2 )
|
||||
{
|
||||
if( aClipBox->Inside( x1, y1 ) || aClipBox->Inside( x2, y2 ) )
|
||||
if( aClipBox->Inside( x1, y1 ) && aClipBox->Inside( x2, y2 ) )
|
||||
return false;
|
||||
|
||||
int ax1, ay1, ax2, ay2;
|
||||
wxRect rect =*aClipBox;
|
||||
ax1 = rect.GetBottomLeft().x;
|
||||
ay1 = rect.GetBottomLeft().y;
|
||||
ax2 = rect.GetTopLeft().x;
|
||||
ay2 = rect.GetTopLeft().y;
|
||||
wxRect rect = *aClipBox;
|
||||
int minX = rect.GetLeft();
|
||||
int maxX = rect.GetRight();
|
||||
int minY = rect.GetTop();
|
||||
int maxY = rect.GetBottom();
|
||||
int clippedX, clippedY;
|
||||
|
||||
/* Left clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||
#if DEBUG_DUMP_CLIP_COORDS
|
||||
int tmpX1, tmpY1, tmpX2, tmpY2;
|
||||
tmpX1 = x1;
|
||||
tmpY1 = y1;
|
||||
tmpX2 = x2;
|
||||
tmpY2 = y2;
|
||||
#endif
|
||||
|
||||
if( aClipBox->Inside( x1, y1 ) )
|
||||
{
|
||||
if( x1 == x2 ) /* Vertical line, clip Y. */
|
||||
{
|
||||
if( y2 < minY )
|
||||
{
|
||||
y2 = minY;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( y2 > maxY )
|
||||
{
|
||||
y2 = maxY;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if( y1 == y2 ) /* Horizontal line, clip X. */
|
||||
{
|
||||
if( x2 < minX )
|
||||
{
|
||||
x2 = minX;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( x2 > maxX )
|
||||
{
|
||||
x2 = maxX;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we're here, it's a diagonal line. */
|
||||
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, minX, maxY,
|
||||
&clippedX, &clippedY ) /* Left */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, maxX, minY,
|
||||
&clippedX, &clippedY ) /* Top */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, maxX, minY, maxX, maxY,
|
||||
&clippedX, &clippedY ) /* Right */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, maxY, maxX, maxY,
|
||||
&clippedX, &clippedY ) ) /* Bottom */
|
||||
{
|
||||
if( x2 != clippedX )
|
||||
x2 = clippedX;
|
||||
if( y2 != clippedY )
|
||||
y2 = clippedY;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If we're here, something has gone terribly wrong. */
|
||||
#if DEBUG_DUMP_CLIP_ERROR_COORDS
|
||||
wxLogDebug( wxT( "Line (%d,%d):(%d,%d) in rectangle (%d,%d,%d,%d) clipped to (%d,%d,%d,%d)" ),
|
||||
tmpX1, tmpY1, tmpX2, tmpY2, minX, minY, maxX, maxY, x1, y1, x2, y2 );
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
else if( aClipBox->Inside( x2, y2 ) )
|
||||
{
|
||||
if( x1 == x2 ) /* Vertical line, clip Y. */
|
||||
{
|
||||
if( y2 < minY )
|
||||
{
|
||||
y2 = minY;
|
||||
return false;
|
||||
}
|
||||
|
||||
ax1 = rect.GetTopRight().x;
|
||||
ay1 = rect.GetTopRight().y;
|
||||
if( y2 > maxY )
|
||||
{
|
||||
y2 = maxY;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if( y1 == y2 ) /* Horizontal line, clip X. */
|
||||
{
|
||||
if( x2 < minX )
|
||||
{
|
||||
x2 = minX;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( x2 > maxX )
|
||||
{
|
||||
x2 = maxX;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Top clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, minX, maxY,
|
||||
&clippedX, &clippedY ) /* Left */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, maxX, minY,
|
||||
&clippedX, &clippedY ) /* Top */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, maxX, minY, maxX, maxY,
|
||||
&clippedX, &clippedY ) /* Right */
|
||||
|| TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, maxY, maxX, maxY,
|
||||
&clippedX, &clippedY ) ) /* Bottom */
|
||||
{
|
||||
if( x1 != clippedX )
|
||||
x1 = clippedX;
|
||||
if( y1 != clippedY )
|
||||
y1 = clippedY;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If we're here, something has gone terribly wrong. */
|
||||
#if DEBUG_DUMP_CLIP_ERROR_COORDS
|
||||
wxLogDebug( wxT( "Line (%d,%d):(%d,%d) in rectangle (%d,%d,%d,%d) clipped to (%d,%d,%d,%d)" ),
|
||||
tmpX1, tmpY1, tmpX2, tmpY2, minX, minY, maxX, maxY, x1, y1, x2, y2 );
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
int* intersectX;
|
||||
int* intersectY;
|
||||
int intersectX1, intersectY1, intersectX2, intersectY2;
|
||||
bool haveFirstPoint = false;
|
||||
|
||||
ax2 = rect.GetBottomRight().x;
|
||||
ay2 = rect.GetBottomRight().y;
|
||||
intersectX = &intersectX1;
|
||||
intersectY = &intersectY1;
|
||||
|
||||
/* Right clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||
return false;
|
||||
/* Left clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, minX, maxY,
|
||||
intersectX, intersectY ) )
|
||||
{
|
||||
intersectX = &intersectX2;
|
||||
intersectY = &intersectY2;
|
||||
haveFirstPoint = true;
|
||||
}
|
||||
|
||||
ax1 = rect.GetBottomLeft().x;
|
||||
ay1 = rect.GetBottomLeft().y;
|
||||
/* Top clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, minY, maxX, minY,
|
||||
intersectX, intersectY ) )
|
||||
{
|
||||
intersectX = &intersectX2;
|
||||
intersectY = &intersectY2;
|
||||
if( haveFirstPoint )
|
||||
{
|
||||
x1 = intersectX1;
|
||||
y1 = intersectY1;
|
||||
x2 = intersectX2;
|
||||
y2 = intersectY2;
|
||||
return false;
|
||||
}
|
||||
haveFirstPoint = true;
|
||||
}
|
||||
|
||||
/* Bottom clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||
return false;
|
||||
/* Right clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, maxX, minY, maxX, maxY,
|
||||
intersectX, intersectY ) )
|
||||
{
|
||||
intersectX = &intersectX2;
|
||||
intersectY = &intersectY2;
|
||||
if( haveFirstPoint )
|
||||
{
|
||||
x1 = intersectX1;
|
||||
y1 = intersectY1;
|
||||
x2 = intersectX2;
|
||||
y2 = intersectY2;
|
||||
return false;
|
||||
}
|
||||
haveFirstPoint = true;
|
||||
}
|
||||
|
||||
/* Bottom clip rectangle line. */
|
||||
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, minX, maxY, maxX, maxY,
|
||||
intersectX, intersectY ) )
|
||||
{
|
||||
intersectX = &intersectX2;
|
||||
intersectY = &intersectY2;
|
||||
if( haveFirstPoint )
|
||||
{
|
||||
x1 = intersectX1;
|
||||
y1 = intersectY1;
|
||||
x2 = intersectX2;
|
||||
y2 = intersectY2;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we're here and only one line of the clip box has been intersected,
|
||||
* something has gone terribly wrong. */
|
||||
#if DEBUG_DUMP_CLIP_ERROR_COORDS
|
||||
if( haveFirstPoint )
|
||||
wxLogDebug( wxT( "Line (%d,%d):(%d,%d) in rectangle (%d,%d,%d,%d) clipped to (%d,%d,%d,%d)" ),
|
||||
tmpX1, tmpY1, tmpX2, tmpY2, minX, minY, maxX, maxY, x1, y1, x2, y2 );
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Set this to one to verify that diagonal lines get clipped properly. */
|
||||
#if 0
|
||||
#if DEBUG_DUMP_CLIP_COORDS
|
||||
if( !( x1 == x2 || y1 == y2 ) )
|
||||
wxLogDebug( wxT( "Clipped line (%d,%d):(%d,%d) from rectangle (%d,%d,%d,%d)" ),
|
||||
x1, y1, x2, y2, rect.x, rect.y, rect.x + rect.width, rect.y + rect.height );
|
||||
tmpX1, tmpY1, tmpX2, tmpY2, minX, minY, maxX, maxY );
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Function clip_line
|
||||
* @return bool - true when WHEN_OUTSIDE fires, else false.
|
||||
@@ -306,8 +479,6 @@ static inline bool clip_line( int& x1, int& y1, int& x2, int& y2 )
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static void WinClipAndDrawLine( EDA_Rect* ClipBox, wxDC* DC,
|
||||
int x1, int y1, int x2, int y2,
|
||||
|
||||
Reference in New Issue
Block a user