More USE_WX_ZOOM bug fixes.
* Changed line clipping function in gr_basic.cpp when USE_WX_ZOOM is enabled. * Set wxDC clipping region to client size when drawing outside of paint event handler. * Updated kicad and eeschema CMake files as the common library now requires linking to the polygon library.
This commit is contained in:
parent
d8700916f8
commit
ac82654563
|
@ -525,7 +525,15 @@ void WinEDA_DrawPanel::OnSize( wxSizeEvent& event )
|
||||||
|
|
||||||
|
|
||||||
/** Function SetBoundaryBox()
|
/** Function SetBoundaryBox()
|
||||||
* set the m_ClipBox member to the current displayed rectangle dimensions
|
* Set the clip box to the current displayed rectangle dimensions.
|
||||||
|
*
|
||||||
|
* When using wxDC for scaling, the clip box coordinates are in drawing (logical)
|
||||||
|
* units. In other words, the area of the drawing that will be displayed on the
|
||||||
|
* screen. When using Kicad's scaling, the clip box coordinates are in screen
|
||||||
|
* (device) units according to the current scroll position.
|
||||||
|
*
|
||||||
|
* @param dc - The device context use for drawing with the correct scale and
|
||||||
|
* offsets already configured. See DoPrepareDC().
|
||||||
*/
|
*/
|
||||||
void WinEDA_DrawPanel::SetBoundaryBox( wxDC* dc )
|
void WinEDA_DrawPanel::SetBoundaryBox( wxDC* dc )
|
||||||
{
|
{
|
||||||
|
@ -561,7 +569,22 @@ void WinEDA_DrawPanel::SetBoundaryBox( wxDC* dc )
|
||||||
m_ClipBox.m_Pos.y = dc->DeviceToLogicalY( 0 );
|
m_ClipBox.m_Pos.y = dc->DeviceToLogicalY( 0 );
|
||||||
m_ClipBox.m_Size.x = dc->DeviceToLogicalXRel( m_ClipBox.m_Size.x );
|
m_ClipBox.m_Size.x = dc->DeviceToLogicalXRel( m_ClipBox.m_Size.x );
|
||||||
m_ClipBox.m_Size.y = dc->DeviceToLogicalYRel( m_ClipBox.m_Size.y );
|
m_ClipBox.m_Size.y = dc->DeviceToLogicalYRel( m_ClipBox.m_Size.y );
|
||||||
m_ClipBox.Inflate( dc->DeviceToLogicalXRel( 2 ) );
|
|
||||||
|
/* Set to one (1) to draw bounding box validate bounding box calculation. */
|
||||||
|
#if 0
|
||||||
|
EDA_Rect bBox = m_ClipBox;
|
||||||
|
m_ClipBox.Inflate( -dc->DeviceToLogicalXRel( 1 ) );
|
||||||
|
GRRect( NULL, dc, bBox.GetOrigin().x, bBox.GetOrigin().y,
|
||||||
|
bBox.GetEnd().x, bBox.GetEnd().y, 0, LIGHTMAGENTA );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_ClipBox.Inflate( dc->DeviceToLogicalXRel( 1 ) );
|
||||||
|
|
||||||
|
/* Always set the clipping region to the screen size. This prevents this bug:
|
||||||
|
* <http://trac.wxwidgets.org/ticket/10446> from occurring on WXMSW if you happen
|
||||||
|
* to be zoomed way in and your drawing coodinates get too large.
|
||||||
|
*/
|
||||||
|
dc->SetClippingRegion( m_ClipBox );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Screen->m_ScrollbarPos.x = GetScrollPos( wxHORIZONTAL );
|
Screen->m_ScrollbarPos.x = GetScrollPos( wxHORIZONTAL );
|
||||||
|
@ -637,10 +660,18 @@ void WinEDA_DrawPanel::OnPaint( wxPaintEvent& event )
|
||||||
m_ClipBox.m_Pos.y = paintDC.DeviceToLogicalY( PaintClipBox.y );
|
m_ClipBox.m_Pos.y = paintDC.DeviceToLogicalY( PaintClipBox.y );
|
||||||
m_ClipBox.m_Size.x = paintDC.DeviceToLogicalXRel( PaintClipBox.width );
|
m_ClipBox.m_Size.x = paintDC.DeviceToLogicalXRel( PaintClipBox.width );
|
||||||
m_ClipBox.m_Size.y = paintDC.DeviceToLogicalYRel( PaintClipBox.height );
|
m_ClipBox.m_Size.y = paintDC.DeviceToLogicalYRel( PaintClipBox.height );
|
||||||
m_ClipBox.Inflate( paintDC.DeviceToLogicalXRel( 2 ) );
|
|
||||||
|
#if 0
|
||||||
|
EDA_Rect bBox = m_ClipBox;
|
||||||
|
m_ClipBox.Inflate( -paintDC.DeviceToLogicalXRel( 1 ) );
|
||||||
|
GRRect( NULL, &paintDC, bBox.GetOrigin().x, bBox.GetOrigin().y,
|
||||||
|
bBox.GetEnd().x, bBox.GetEnd().y, 0, LIGHTMAGENTA );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_ClipBox.Inflate( paintDC.DeviceToLogicalXRel( 1 ) );
|
||||||
PaintClipBox = m_ClipBox;
|
PaintClipBox = m_ClipBox;
|
||||||
#else
|
#else
|
||||||
/* When using Kicads scaling the clipping region coordinates are in screen
|
/* When using Kicad's scaling the clipping region coordinates are in screen
|
||||||
* (device) units.
|
* (device) units.
|
||||||
*/
|
*/
|
||||||
m_ClipBox.SetX( PaintClipBox.GetX() );
|
m_ClipBox.SetX( PaintClipBox.GetX() );
|
||||||
|
@ -766,10 +797,8 @@ void WinEDA_DrawPanel::DrawGrid( wxDC* DC )
|
||||||
|| DC->LogicalToDeviceXRel( wxRound( screen_grid_size.y ) ) < 5 )
|
|| DC->LogicalToDeviceXRel( wxRound( screen_grid_size.y ) ) < 5 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
org.x = DC->DeviceToLogicalX( 0 );
|
org = m_ClipBox.m_Pos;
|
||||||
org.y = DC->DeviceToLogicalY( 0 );
|
size = m_ClipBox.m_Size;
|
||||||
size.SetWidth( DC->DeviceToLogicalXRel( size.GetWidth() ) );
|
|
||||||
size.SetHeight( DC->DeviceToLogicalYRel( size.GetHeight() ) );
|
|
||||||
#else
|
#else
|
||||||
wxRealPoint dgrid = screen_grid_size;
|
wxRealPoint dgrid = screen_grid_size;
|
||||||
screen->Scale( dgrid ); // dgrid = grid size in pixels
|
screen->Scale( dgrid ); // dgrid = grid size in pixels
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "base_struct.h"
|
#include "base_struct.h"
|
||||||
#include "class_base_screen.h"
|
#include "class_base_screen.h"
|
||||||
#include "bezier_curves.h"
|
#include "bezier_curves.h"
|
||||||
|
#include "math_for_graphics.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef FILLED
|
#ifndef FILLED
|
||||||
|
@ -137,6 +138,71 @@ int GRMapY( int y )
|
||||||
#define WHEN_INSIDE
|
#define WHEN_INSIDE
|
||||||
|
|
||||||
|
|
||||||
|
#if defined( USE_WX_ZOOM )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if any part of a line falls within the bounds of a rectangle.
|
||||||
|
*
|
||||||
|
* Please note that this is only accurate for lines that are one pixel wide.
|
||||||
|
*
|
||||||
|
* @param aRect - The rectangle to test.
|
||||||
|
* @param x1 - X coordinate of one end of a line.
|
||||||
|
* @param y1 - Y coordinate of one end of a line.
|
||||||
|
* @param x2 - X coordinate of the other end of a line.
|
||||||
|
* @param y2 - Y coordinate of the other end of a line.
|
||||||
|
*
|
||||||
|
* @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 )
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
/* Left clip rectangle line. */
|
||||||
|
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ax1 = rect.GetTopRight().x;
|
||||||
|
ay1 = rect.GetTopRight().y;
|
||||||
|
|
||||||
|
|
||||||
|
/* Top clip rectangle line. */
|
||||||
|
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ax2 = rect.GetBottomRight().x;
|
||||||
|
ay2 = rect.GetBottomRight().y;
|
||||||
|
|
||||||
|
/* Right clip rectangle line. */
|
||||||
|
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ax1 = rect.GetBottomLeft().x;
|
||||||
|
ay1 = rect.GetBottomLeft().y;
|
||||||
|
|
||||||
|
/* Bottom clip rectangle line. */
|
||||||
|
if( TestForIntersectionOfStraightLineSegments( x1, y1, x2, y2, ax1, ay1, ax2, ay2 ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* Set this to one to verify that diagonal lines get clipped properly. */
|
||||||
|
#if 0
|
||||||
|
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 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function clip_line
|
* Function clip_line
|
||||||
* @return bool - true when WHEN_OUTSIDE fires, else false.
|
* @return bool - true when WHEN_OUTSIDE fires, else false.
|
||||||
|
@ -240,6 +306,8 @@ static inline bool clip_line( int& x1, int& y1, int& x2, int& y2 )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void WinClipAndDrawLine( EDA_Rect* ClipBox, wxDC* DC,
|
static void WinClipAndDrawLine( EDA_Rect* ClipBox, wxDC* DC,
|
||||||
int x1, int y1, int x2, int y2,
|
int x1, int y1, int x2, int y2,
|
||||||
|
@ -261,7 +329,11 @@ static void WinClipAndDrawLine( EDA_Rect* ClipBox, wxDC* DC,
|
||||||
xcliphi += width;
|
xcliphi += width;
|
||||||
ycliphi += width;
|
ycliphi += width;
|
||||||
|
|
||||||
|
#if defined( USE_WX_ZOOM )
|
||||||
|
if ( clipLine( ClipBox, x1, y1, x2, y2 ) )
|
||||||
|
#else
|
||||||
if( clip_line( x1, y1, x2, y2 ) )
|
if( clip_line( x1, y1, x2, y2 ) )
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +862,11 @@ void GRSCSegm( EDA_Rect* ClipBox,
|
||||||
xcliphi += width;
|
xcliphi += width;
|
||||||
ycliphi += width;
|
ycliphi += width;
|
||||||
|
|
||||||
|
#if defined( USE_WX_ZOOM )
|
||||||
|
if( clipLine( ClipBox, x1, y1, x2, y2 ) )
|
||||||
|
#else
|
||||||
if( clip_line( x1, y1, x2, y2 ) )
|
if( clip_line( x1, y1, x2, y2 ) )
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ if(APPLE)
|
||||||
set_target_properties(eeschema PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
set_target_properties(eeschema PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
target_link_libraries(eeschema common bitmaps ${wxWidgets_LIBRARIES} ${GDI_PLUS_LIBRARIES})
|
target_link_libraries(eeschema common bitmaps polygon ${wxWidgets_LIBRARIES} ${GDI_PLUS_LIBRARIES})
|
||||||
|
|
||||||
install(TARGETS eeschema
|
install(TARGETS eeschema
|
||||||
DESTINATION ${KICAD_BIN}
|
DESTINATION ${KICAD_BIN}
|
||||||
|
|
|
@ -49,7 +49,7 @@ install(TARGETS KiCad
|
||||||
DESTINATION ${KICAD_BIN}
|
DESTINATION ${KICAD_BIN}
|
||||||
COMPONENT binary)
|
COMPONENT binary)
|
||||||
else(APPLE)
|
else(APPLE)
|
||||||
target_link_libraries(kicad common bitmaps ${wxWidgets_LIBRARIES} ${GDI_PLUS_LIBRARIES})
|
target_link_libraries(kicad common bitmaps polygon ${wxWidgets_LIBRARIES} ${GDI_PLUS_LIBRARIES})
|
||||||
install(TARGETS kicad
|
install(TARGETS kicad
|
||||||
DESTINATION ${KICAD_BIN}
|
DESTINATION ${KICAD_BIN}
|
||||||
COMPONENT binary)
|
COMPONENT binary)
|
||||||
|
|
Loading…
Reference in New Issue