Mainly case changes.

This commit is contained in:
Maciej Suminski 2013-10-14 20:40:36 +02:00
parent 0ac3e1fbf2
commit bc305859b2
62 changed files with 1697 additions and 1617 deletions

View File

@ -325,7 +325,7 @@ void CAIRO_GAL::SetIsFill( bool aIsFillEnabled )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SET_FILL;
groupElement.boolArgument = aIsFillEnabled;
currentGroup->push_back( groupElement );
@ -340,7 +340,7 @@ void CAIRO_GAL::SetIsStroke( bool aIsStrokeEnabled )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SET_STROKE;
groupElement.boolArgument = aIsStrokeEnabled;
currentGroup->push_back( groupElement );
@ -355,7 +355,7 @@ void CAIRO_GAL::SetStrokeColor( const COLOR4D& aColor )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SET_STROKECOLOR;
groupElement.arguments[0] = strokeColor.r;
groupElement.arguments[1] = strokeColor.g;
@ -373,7 +373,7 @@ void CAIRO_GAL::SetFillColor( const COLOR4D& aColor )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SET_FILLCOLOR;
groupElement.arguments[0] = fillColor.r;
groupElement.arguments[1] = fillColor.g;
@ -392,7 +392,7 @@ void CAIRO_GAL::SetLineWidth( double aLineWidth )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SET_LINE_WIDTH;
groupElement.arguments[0] = aLineWidth;
currentGroup->push_back( groupElement );
@ -446,7 +446,7 @@ void CAIRO_GAL::Rotate( double aAngle )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_ROTATE;
groupElement.arguments[0] = aAngle;
currentGroup->push_back( groupElement );
@ -464,7 +464,7 @@ void CAIRO_GAL::Translate( const VECTOR2D& aTranslation )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_TRANSLATE;
groupElement.arguments[0] = aTranslation.x;
groupElement.arguments[1] = aTranslation.y;
@ -483,7 +483,7 @@ void CAIRO_GAL::Scale( const VECTOR2D& aScale )
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SCALE;
groupElement.arguments[0] = aScale.x;
groupElement.arguments[1] = aScale.y;
@ -502,7 +502,7 @@ void CAIRO_GAL::Save()
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_SAVE;
currentGroup->push_back( groupElement );
}
@ -519,7 +519,7 @@ void CAIRO_GAL::Restore()
if( isGrouping )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.command = CMD_RESTORE;
currentGroup->push_back( groupElement );
}
@ -538,7 +538,7 @@ int CAIRO_GAL::BeginGroup()
// a attribute was changed or when grouping stops with the end group method.
storePath();
Group group;
GROUP group;
int groupNumber = getNewGroupNumber();
groups.insert( std::make_pair( groupNumber, group ) );
currentGroup = &groups[groupNumber];
@ -564,7 +564,7 @@ void CAIRO_GAL::DrawGroup( int aGroupNumber )
storePath();
for( Group::iterator it = groups[aGroupNumber].begin();
for( GROUP::iterator it = groups[aGroupNumber].begin();
it != groups[aGroupNumber].end(); ++it )
{
switch( it->command )
@ -649,7 +649,7 @@ void CAIRO_GAL::ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor )
{
storePath();
for( Group::iterator it = groups[aGroupNumber].begin();
for( GROUP::iterator it = groups[aGroupNumber].begin();
it != groups[aGroupNumber].end(); ++it )
{
if( it->command == CMD_SET_FILLCOLOR || it->command == CMD_SET_STROKECOLOR )
@ -675,7 +675,7 @@ void CAIRO_GAL::DeleteGroup( int aGroupNumber )
storePath();
// Delete the Cairo paths
std::deque<GroupElement>::iterator it, end;
std::deque<GROUP_ELEMENT>::iterator it, end;
for( it = groups[aGroupNumber].begin(), end = groups[aGroupNumber].end(); it != end; ++it )
{
@ -730,7 +730,7 @@ void CAIRO_GAL::RestoreScreen()
}
void CAIRO_GAL::SetTarget( RenderTarget aTarget )
void CAIRO_GAL::SetTarget( RENDER_TARGET aTarget )
{
// If the compositor is not set, that means that there is a recaching process going on
// and we do not need the compositor now
@ -766,13 +766,13 @@ void CAIRO_GAL::SetTarget( RenderTarget aTarget )
}
RenderTarget CAIRO_GAL::GetTarget() const
RENDER_TARGET CAIRO_GAL::GetTarget() const
{
return currentTarget;
}
void CAIRO_GAL::ClearTarget( RenderTarget aTarget )
void CAIRO_GAL::ClearTarget( RENDER_TARGET aTarget )
{
// Save the current state
unsigned int currentBuffer = compositor->GetBuffer();
@ -844,7 +844,7 @@ void CAIRO_GAL::storePath()
// add this command to the group list;
if( isStrokeEnabled )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.cairoPath = cairo_copy_path( currentContext );
groupElement.command = CMD_STROKE_PATH;
currentGroup->push_back( groupElement );
@ -852,7 +852,7 @@ void CAIRO_GAL::storePath()
if( isFillEnabled )
{
GroupElement groupElement;
GROUP_ELEMENT groupElement;
groupElement.cairoPath = cairo_copy_path( currentContext );
groupElement.command = CMD_FILL_PATH;
currentGroup->push_back( groupElement );

View File

@ -45,7 +45,7 @@ CACHED_CONTAINER::CACHED_CONTAINER( unsigned int aSize ) :
VERTEX_CONTAINER( aSize ), m_item( NULL )
{
// In the beginning there is only free space
m_freeChunks.insert( Chunk( aSize, 0 ) );
m_freeChunks.insert( CHUNK( aSize, 0 ) );
}
@ -80,7 +80,7 @@ void CACHED_CONTAINER::FinishItem()
int itemOffset = m_item->GetOffset();
// Add the not used memory back to the pool
m_freeChunks.insert( Chunk( m_chunkSize - m_itemSize, itemOffset + m_itemSize ) );
m_freeChunks.insert( CHUNK( m_chunkSize - m_itemSize, itemOffset + m_itemSize ) );
m_freeSpace += ( m_chunkSize - m_itemSize );
// mergeFreeChunks(); // veery slow and buggy
}
@ -152,7 +152,7 @@ void CACHED_CONTAINER::Delete( VERTEX_ITEM* aItem )
// Insert a free memory chunk entry in the place where item was stored
if( size > 0 )
{
m_freeChunks.insert( Chunk( size, offset ) );
m_freeChunks.insert( CHUNK( size, offset ) );
m_freeSpace += size;
// Indicate that the item is not stored in the container anymore
aItem->setSize( 0 );
@ -186,7 +186,7 @@ void CACHED_CONTAINER::Clear()
// Set the size of all the stored VERTEX_ITEMs to 0, so it is clear that they are not held
// in the container anymore
Items::iterator it;
ITEMS::iterator it;
for( it = m_items.begin(); it != m_items.end(); ++it )
{
@ -198,7 +198,7 @@ void CACHED_CONTAINER::Clear()
// Now there is only free space left
m_freeChunks.clear();
m_freeChunks.insert( Chunk( m_freeSpace, 0 ) );
m_freeChunks.insert( CHUNK( m_freeSpace, 0 ) );
}
@ -240,7 +240,7 @@ unsigned int CACHED_CONTAINER::reallocate( unsigned int aSize )
}
// Look for the free space chunk of at least given size
FreeChunkMap::iterator newChunk = m_freeChunks.lower_bound( aSize );
FREE_CHUNK_MAP::iterator newChunk = m_freeChunks.lower_bound( aSize );
if( newChunk == m_freeChunks.end() )
{
@ -277,7 +277,7 @@ unsigned int CACHED_CONTAINER::reallocate( unsigned int aSize )
// Free the space previously used by the chunk
wxASSERT( m_itemSize > 0 );
m_freeChunks.insert( Chunk( m_itemSize, m_chunkOffset ) );
m_freeChunks.insert( CHUNK( m_itemSize, m_chunkOffset ) );
m_freeSpace += m_itemSize;
}
@ -287,7 +287,7 @@ unsigned int CACHED_CONTAINER::reallocate( unsigned int aSize )
// If there is some space left, return it to the pool - add an entry for it
if( chunkSize > aSize )
{
m_freeChunks.insert( Chunk( chunkSize - aSize, chunkOffset + aSize ) );
m_freeChunks.insert( CHUNK( chunkSize - aSize, chunkOffset + aSize ) );
}
m_freeSpace -= aSize;
@ -321,7 +321,7 @@ bool CACHED_CONTAINER::defragment( VERTEX* aTarget )
}
int newOffset = 0;
Items::iterator it, it_end;
ITEMS::iterator it, it_end;
for( it = m_items.begin(), it_end = m_items.end(); it != it_end; ++it )
{
@ -345,7 +345,7 @@ bool CACHED_CONTAINER::defragment( VERTEX* aTarget )
// Now there is only one big chunk of free memory
m_freeChunks.clear();
wxASSERT( m_freeSpace > 0 );
m_freeChunks.insert( Chunk( m_freeSpace, m_currentSize - m_freeSpace ) );
m_freeChunks.insert( CHUNK( m_freeSpace, m_currentSize - m_freeSpace ) );
#if CACHED_CONTAINER_TEST > 0
prof_end( &totalTime );
@ -369,9 +369,9 @@ void CACHED_CONTAINER::mergeFreeChunks()
#endif
// Reversed free chunks map - this one stores chunk size with its offset as the key
std::list<Chunk> freeChunks;
std::list<CHUNK> freeChunks;
FreeChunkMap::const_iterator it, it_end;
FREE_CHUNK_MAP::const_iterator it, it_end;
for( it = m_freeChunks.begin(), it_end = m_freeChunks.end(); it != it_end; ++it )
{
@ -381,7 +381,7 @@ void CACHED_CONTAINER::mergeFreeChunks()
m_freeChunks.clear();
freeChunks.sort();
std::list<Chunk>::const_iterator itf, itf_end;
std::list<CHUNK>::const_iterator itf, itf_end;
unsigned int offset = freeChunks.front().first;
unsigned int size = freeChunks.front().second;
freeChunks.pop_front();
@ -449,7 +449,7 @@ bool CACHED_CONTAINER::resizeContainer( unsigned int aNewSize )
// We have to correct freeChunks after defragmentation
m_freeChunks.clear();
wxASSERT( aNewSize - reservedSpace() > 0 );
m_freeChunks.insert( Chunk( aNewSize - reservedSpace(), reservedSpace() ) );
m_freeChunks.insert( CHUNK( aNewSize - reservedSpace(), reservedSpace() ) );
}
else
{
@ -463,7 +463,7 @@ bool CACHED_CONTAINER::resizeContainer( unsigned int aNewSize )
}
// Add an entry for the new memory chunk at the end of the container
m_freeChunks.insert( Chunk( aNewSize - m_currentSize, m_currentSize ) );
m_freeChunks.insert( CHUNK( aNewSize - m_currentSize, m_currentSize ) );
}
m_vertices = newContainer;

View File

@ -691,7 +691,7 @@ void OPENGL_GAL::RestoreScreen()
}
void OPENGL_GAL::SetTarget( RenderTarget aTarget )
void OPENGL_GAL::SetTarget( RENDER_TARGET aTarget )
{
switch( aTarget )
{
@ -713,13 +713,13 @@ void OPENGL_GAL::SetTarget( RenderTarget aTarget )
}
RenderTarget OPENGL_GAL::GetTarget() const
RENDER_TARGET OPENGL_GAL::GetTarget() const
{
return currentTarget;
}
void OPENGL_GAL::ClearTarget( RenderTarget aTarget )
void OPENGL_GAL::ClearTarget( RENDER_TARGET aTarget )
{
// Save the current state
unsigned int oldTarget = compositor.GetBuffer();

View File

@ -63,7 +63,7 @@ SHADER::~SHADER()
}
bool SHADER::LoadBuiltinShader( unsigned int aShaderNumber, ShaderType aShaderType )
bool SHADER::LoadBuiltinShader( unsigned int aShaderNumber, SHADER_TYPE aShaderType )
{
if( aShaderNumber >= shaders_number )
return false;
@ -72,7 +72,7 @@ bool SHADER::LoadBuiltinShader( unsigned int aShaderNumber, ShaderType aShaderTy
}
bool SHADER::LoadShaderFromFile( const std::string& aShaderSourceName, ShaderType aShaderType )
bool SHADER::LoadShaderFromFile( const std::string& aShaderSourceName, SHADER_TYPE aShaderType )
{
// Load shader sources
const std::string shaderSource = readSource( aShaderSourceName );
@ -219,7 +219,7 @@ std::string SHADER::readSource( std::string aShaderSourceName )
}
bool SHADER::addSource( const std::string& aShaderSource, ShaderType aShaderType )
bool SHADER::addSource( const std::string& aShaderSource, SHADER_TYPE aShaderType )
{
if( isShaderLinked )
{

View File

@ -59,7 +59,7 @@ bool STROKE_FONT::LoadNewStrokeFont( const char* const aNewStrokeFont[], int aNe
for( int j = 0; j < aNewStrokeFontSize; j++ )
{
Glyph glyph;
GLYPH glyph;
double glyphStartX = 0.0;
double glyphEndX = 0.0;
VECTOR2D glyphBoundingX;
@ -118,21 +118,21 @@ bool STROKE_FONT::LoadNewStrokeFont( const char* const aNewStrokeFont[], int aNe
}
BOX2D STROKE_FONT::computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const
BOX2D STROKE_FONT::computeBoundingBox( const GLYPH& aGLYPH, const VECTOR2D& aGLYPHBoundingX ) const
{
BOX2D boundingBox;
std::deque<VECTOR2D> boundingPoints;
boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, 0 ) );
boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.y, 0 ) );
boundingPoints.push_back( VECTOR2D( aGLYPHBoundingX.x, 0 ) );
boundingPoints.push_back( VECTOR2D( aGLYPHBoundingX.y, 0 ) );
for( Glyph::const_iterator pointListIt = aGlyph.begin(); pointListIt != aGlyph.end(); ++pointListIt )
for( GLYPH::const_iterator pointListIt = aGLYPH.begin(); pointListIt != aGLYPH.end(); ++pointListIt )
{
for( std::deque<VECTOR2D>::const_iterator pointIt = pointListIt->begin();
pointIt != pointListIt->end(); ++pointIt )
{
boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, pointIt->y ) );
boundingPoints.push_back( VECTOR2D( aGLYPHBoundingX.x, pointIt->y ) );
}
}
@ -241,15 +241,15 @@ void STROKE_FONT::Draw( std::string aText, const VECTOR2D& aPosition, double aRo
continue;
}
GlyphList::iterator glyphIt = m_glyphs.begin();
GLYPH_LIST::iterator glyphIt = m_glyphs.begin();
std::deque<BOX2D>::iterator bbIt = m_glyphBoundingBoxes.begin();
advance( glyphIt, (int) ( *chIt ) - (int) ' ' );
advance( bbIt, (int) ( *chIt ) - (int) ' ' );
Glyph glyph = *glyphIt;
GLYPH glyph = *glyphIt;
for( Glyph::iterator pointListIt = glyph.begin(); pointListIt != glyph.end();
for( GLYPH::iterator pointListIt = glyph.begin(); pointListIt != glyph.end();
pointListIt++ )
{
std::deque<VECTOR2D> pointListScaled;

View File

@ -22,28 +22,27 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <geometry/seg.h>
template<typename T>
int sgn( T val )
template <typename T>
int sgn( T aVal )
{
return ( T( 0 ) < val ) - ( val < T( 0 ) );
return ( T( 0 ) < aVal ) - ( aVal < T( 0 ) );
}
bool SEG::PointCloserThan( const VECTOR2I& aP, int dist ) const
bool SEG::PointCloserThan( const VECTOR2I& aP, int aDist ) const
{
VECTOR2I d = b - a;
ecoord dist_sq = (ecoord) dist * dist;
VECTOR2I d = B - A;
ecoord dist_sq = (ecoord) aDist * aDist;
SEG::ecoord l_squared = d.Dot( d );
SEG::ecoord t = d.Dot( aP - a );
SEG::ecoord t = d.Dot( aP - A );
if( t <= 0 || !l_squared )
return ( aP - a ).SquaredEuclideanNorm() < dist_sq;
return ( aP - A ).SquaredEuclideanNorm() < dist_sq;
else if( t >= l_squared )
return ( aP - b ).SquaredEuclideanNorm() < dist_sq;
return ( aP - B ).SquaredEuclideanNorm() < dist_sq;
int dxdy = abs( d.x ) - abs( d.y );
@ -51,7 +50,7 @@ bool SEG::PointCloserThan( const VECTOR2I& aP, int dist ) const
{
int ca = -sgn( d.y );
int cb = sgn( d.x );
int cc = -ca * a.x - cb * a.y;
int cc = -ca * A.x - cb * A.y;
ecoord num = ca * aP.x + cb * aP.y + cc;
num *= num;
@ -66,8 +65,8 @@ bool SEG::PointCloserThan( const VECTOR2I& aP, int dist ) const
}
VECTOR2I nearest;
nearest.x = a.x + rescale( t, (ecoord) d.x, l_squared );
nearest.y = a.y + rescale( t, (ecoord) d.y, l_squared );
nearest.x = A.x + rescale( t, (ecoord) d.x, l_squared );
nearest.y = A.y + rescale( t, (ecoord) d.y, l_squared );
return ( nearest - aP ).SquaredEuclideanNorm() <= dist_sq;
}
@ -81,10 +80,10 @@ SEG::ecoord SEG::SquaredDistance( const SEG& aSeg ) const
const VECTOR2I pts[4] =
{
aSeg.NearestPoint( a ) - a,
aSeg.NearestPoint( b ) - b,
NearestPoint( aSeg.a ) - aSeg.a,
NearestPoint( aSeg.b ) - aSeg.b
aSeg.NearestPoint( A ) - A,
aSeg.NearestPoint( B ) - B,
NearestPoint( aSeg.A ) - aSeg.A,
NearestPoint( aSeg.B ) - aSeg.B
};
ecoord m = VECTOR2I::ECOORD_MAX;
@ -98,9 +97,9 @@ SEG::ecoord SEG::SquaredDistance( const SEG& aSeg ) const
OPT_VECTOR2I SEG::Intersect( const SEG& aSeg, bool aIgnoreEndpoints, bool aLines ) const
{
const VECTOR2I e( b - a );
const VECTOR2I f( aSeg.b - aSeg.a );
const VECTOR2I ac( aSeg.a - a );
const VECTOR2I e( B - A );
const VECTOR2I f( aSeg.B - aSeg.A );
const VECTOR2I ac( aSeg.A - A );
ecoord d = f.Cross( e );
ecoord p = f.Cross( ac );
@ -118,16 +117,16 @@ OPT_VECTOR2I SEG::Intersect( const SEG& aSeg, bool aIgnoreEndpoints, bool aLines
if( !aLines && aIgnoreEndpoints && ( q == 0 || q == d ) && ( p == 0 || p == d ) )
return OPT_VECTOR2I();
VECTOR2I ip( aSeg.a.x + rescale( q, (ecoord) f.x, d ),
aSeg.a.y + rescale( q, (ecoord) f.y, d ) );
VECTOR2I ip( aSeg.A.x + rescale( q, (ecoord) f.x, d ),
aSeg.A.y + rescale( q, (ecoord) f.y, d ) );
return ip;
}
bool SEG::ccw( const VECTOR2I& a, const VECTOR2I& b, const VECTOR2I& c ) const
bool SEG::ccw( const VECTOR2I& aA, const VECTOR2I& aB, const VECTOR2I& aC ) const
{
return (ecoord) ( c.y - a.y ) * ( b.x - a.x ) > (ecoord) ( b.y - a.y ) * ( c.x - a.x );
return (ecoord) ( aC.y - aA.y ) * ( aB.x - aA.x ) > (ecoord) ( aB.y - aA.y ) * ( aC.x - aA.x );
}
@ -135,17 +134,17 @@ bool SEG::Collide( const SEG& aSeg, int aClearance ) const
{
// check for intersection
// fixme: move to a method
if( ccw( a, aSeg.a, aSeg.b ) != ccw( b, aSeg.a, aSeg.b ) &&
ccw( a, b, aSeg.a ) != ccw( a, b, aSeg.b ) )
if( ccw( A, aSeg.A, aSeg.B ) != ccw( B, aSeg.A, aSeg.B ) &&
ccw( A, B, aSeg.A ) != ccw( A, B, aSeg.B ) )
return true;
#define CHK( _seg, _pt ) \
if( (_seg).PointCloserThan( _pt, aClearance ) ) return true;
CHK( *this, aSeg.a );
CHK( *this, aSeg.b );
CHK( aSeg, a );
CHK( aSeg, b );
CHK( *this, aSeg.A );
CHK( *this, aSeg.B );
CHK( aSeg, A );
CHK( aSeg, B );
#undef CHK
return false;

View File

@ -50,6 +50,7 @@ static inline bool Collide( const SHAPE_CIRCLE& aA, const SHAPE_CIRCLE& aB, int
return true;
}
static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_CIRCLE& aB, int aClearance,
bool aNeedMTV, VECTOR2I& aMTV )
{
@ -154,7 +155,8 @@ static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_LINE_CHAIN& aB, in
}
bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance, bool aNeedMTV, VECTOR2I& aMTV )
bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance,
bool aNeedMTV, VECTOR2I& aMTV )
{
switch( aA->Type() )
{
@ -163,53 +165,56 @@ bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance, bool aNeed
{
case SH_CIRCLE:
return Collide( *static_cast<const SHAPE_RECT*>( aA ),
*static_cast<const SHAPE_CIRCLE*>( aB ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_CIRCLE*>( aB ), aClearance, aNeedMTV, aMTV );
case SH_LINE_CHAIN:
return Collide( *static_cast<const SHAPE_RECT*>( aA ),
*static_cast<const SHAPE_LINE_CHAIN*>( aB ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_LINE_CHAIN*>( aB ), aClearance, aNeedMTV, aMTV );
default:
break;
}
break;
case SH_CIRCLE:
switch( aB->Type() )
{
case SH_RECT:
return Collide( *static_cast<const SHAPE_RECT*>( aB ),
*static_cast<const SHAPE_CIRCLE*>( aA ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_CIRCLE*>( aA ), aClearance, aNeedMTV, aMTV );
case SH_CIRCLE:
return Collide( *static_cast<const SHAPE_CIRCLE*>( aA ),
*static_cast<const SHAPE_CIRCLE*>( aB ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_CIRCLE*>( aB ), aClearance, aNeedMTV, aMTV );
case SH_LINE_CHAIN:
return Collide( *static_cast<const SHAPE_CIRCLE*>( aA ),
*static_cast<const SHAPE_LINE_CHAIN *>( aB ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_LINE_CHAIN *>( aB ), aClearance, aNeedMTV, aMTV );
default:
break;
}
break;
case SH_LINE_CHAIN:
switch( aB->Type() )
{
case SH_RECT:
return Collide( *static_cast<const SHAPE_RECT*>( aB ),
*static_cast<const SHAPE_LINE_CHAIN*>( aA ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_LINE_CHAIN*>( aA ), aClearance, aNeedMTV, aMTV );
case SH_CIRCLE:
return Collide( *static_cast<const SHAPE_CIRCLE*>( aB ),
*static_cast<const SHAPE_LINE_CHAIN*>( aA ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_LINE_CHAIN*>( aA ), aClearance, aNeedMTV, aMTV );
case SH_LINE_CHAIN:
return Collide( *static_cast<const SHAPE_LINE_CHAIN*>( aA ),
*static_cast<const SHAPE_LINE_CHAIN*>( aB ), aClearance, aNeedMTV, aMTV );
*static_cast<const SHAPE_LINE_CHAIN*>( aB ), aClearance, aNeedMTV, aMTV );
default:
break;
}
break;
default:
break;

View File

@ -25,7 +25,7 @@
#include <geometry/shape_index.h>
template<>
template <>
const SHAPE* shapeFunctor( SHAPE* aItem )
{
return aItem;

View File

@ -31,6 +31,7 @@ using boost::optional;
bool SHAPE_LINE_CHAIN::Collide( const VECTOR2I& aP, int aClearance ) const
{
assert( false );
return false;
}
@ -38,19 +39,20 @@ bool SHAPE_LINE_CHAIN::Collide( const VECTOR2I& aP, int aClearance ) const
bool SHAPE_LINE_CHAIN::Collide( const BOX2I& aBox, int aClearance ) const
{
assert( false );
return false;
}
bool SHAPE_LINE_CHAIN::Collide( const SEG& aSeg, int aClearance ) const
{
BOX2I box_a( aSeg.a, aSeg.b - aSeg.a );
BOX2I box_a( aSeg.A, aSeg.B - aSeg.A );
BOX2I::ecoord_type dist_sq = (BOX2I::ecoord_type) aClearance * aClearance;
for( int i = 0; i < SegmentCount(); i++ )
{
const SEG& s = CSegment( i );
BOX2I box_b( s.a, s.b - s.a );
BOX2I box_b( s.A, s.B - s.A );
BOX2I::ecoord_type d = box_a.SquaredDistance( box_b );
@ -158,7 +160,7 @@ int SHAPE_LINE_CHAIN::Split( const VECTOR2I& aP )
// make sure we are not producing a 'slightly concave' primitive. This might happen
// if aP lies very close to one of already existing points.
if( dist < min_dist && seg.a != aP && seg.b != aP )
if( dist < min_dist && seg.A != aP && seg.B != aP )
{
min_dist = dist;
ii = s;
@ -208,8 +210,8 @@ struct compareOriginDistance
compareOriginDistance( VECTOR2I& aOrigin ) :
m_origin( aOrigin ) {};
bool operator()( const SHAPE_LINE_CHAIN::Intersection& aA,
const SHAPE_LINE_CHAIN::Intersection& aB )
bool operator()( const SHAPE_LINE_CHAIN::INTERSECTION& aA,
const SHAPE_LINE_CHAIN::INTERSECTION& aB )
{
return ( m_origin - aA.p ).EuclideanNorm() < ( m_origin - aB.p ).EuclideanNorm();
}
@ -218,7 +220,7 @@ struct compareOriginDistance
};
int SHAPE_LINE_CHAIN::Intersect( const SEG& aSeg, Intersections& aIp ) const
int SHAPE_LINE_CHAIN::Intersect( const SEG& aSeg, INTERSECTIONS& aIp ) const
{
for( int s = 0; s < SegmentCount(); s++ )
{
@ -226,7 +228,7 @@ int SHAPE_LINE_CHAIN::Intersect( const SEG& aSeg, Intersections& aIp ) const
if( p )
{
Intersection is;
INTERSECTION is;
is.our = CSegment( s );
is.their = aSeg;
is.p = *p;
@ -234,21 +236,21 @@ int SHAPE_LINE_CHAIN::Intersect( const SEG& aSeg, Intersections& aIp ) const
}
}
compareOriginDistance comp( aSeg.a );
compareOriginDistance comp( aSeg.A );
sort( aIp.begin(), aIp.end(), comp );
return aIp.size();
}
int SHAPE_LINE_CHAIN::Intersect( const SHAPE_LINE_CHAIN& aChain, Intersections& aIp ) const
int SHAPE_LINE_CHAIN::Intersect( const SHAPE_LINE_CHAIN& aChain, INTERSECTIONS& aIp ) const
{
BOX2I bb_other = aChain.BBox();
for( int s1 = 0; s1 < SegmentCount(); s1++ )
{
const SEG& a = CSegment( s1 );
const BOX2I bb_cur( a.a, a.b - a.a );
const BOX2I bb_cur( a.A, a.B - a.A );
if( !bb_other.Intersects( bb_cur ) )
continue;
@ -256,14 +258,14 @@ int SHAPE_LINE_CHAIN::Intersect( const SHAPE_LINE_CHAIN& aChain, Intersections&
for( int s2 = 0; s2 < aChain.SegmentCount(); s2++ )
{
const SEG& b = aChain.CSegment( s2 );
Intersection is;
INTERSECTION is;
if( a.Collinear( b ) )
{
if( a.Contains( b.a ) ) { is.p = b.a; aIp.push_back( is ); }
if( a.Contains( b.b ) ) { is.p = b.b; aIp.push_back( is ); }
if( b.Contains( a.a ) ) { is.p = a.a; aIp.push_back( is ); }
if( b.Contains( a.b ) ) { is.p = a.b; aIp.push_back( is ); }
if( a.Contains( b.A ) ) { is.p = b.A; aIp.push_back( is ); }
if( a.Contains( b.B ) ) { is.p = b.B; aIp.push_back( is ); }
if( b.Contains( a.A ) ) { is.p = a.A; aIp.push_back( is ); }
if( b.Contains( a.B ) ) { is.p = a.B; aIp.push_back( is ); }
}
else
{
@ -289,7 +291,7 @@ int SHAPE_LINE_CHAIN::Intersect( const SHAPE_LINE_CHAIN& aChain, Intersections&
const SEG& a = CSegment( s1 );
const SEG& b = aChain.CSegment( s2 );
OPT_VECTOR2I p = a.Intersect( b );
Intersection is;
INTERSECTION is;
if( p )
{
@ -300,16 +302,16 @@ int SHAPE_LINE_CHAIN::Intersect( const SHAPE_LINE_CHAIN& aChain, Intersections&
}
else if( a.Collinear( b ) )
{
if( a.a != b.a && a.a != b.b && b.Contains( a.a ) )
if( a.A != b.A && a.A != b.B && b.Contains( a.A ) )
{
is.p = a.a;
is.p = a.A;
is.our = a;
is.their = b;
aIp.push_back( is );
}
else if( a.b != b.a && a.b != b.b && b.Contains( a.b ) )
else if( a.B != b.A && a.B != b.B && b.Contains( a.B ) )
{
is.p = a.b;
is.p = a.B;
is.our = a;
is.their = b;
aIp.push_back( is );
@ -333,7 +335,7 @@ int SHAPE_LINE_CHAIN::PathLength( const VECTOR2I& aP ) const
if( d <= 1 )
{
sum += ( aP - seg.a ).EuclideanNorm();
sum += ( aP - seg.A ).EuclideanNorm();
return sum;
}
else
@ -358,7 +360,7 @@ bool SHAPE_LINE_CHAIN::PointInside( const VECTOR2I& aP ) const
{
const SEG s = CSegment( i );
if( aP == s.a || aP == s.b ) // edge does not belong to the interior!
if( aP == s.A || aP == s.B ) // edge does not belong to the interior!
return false;
if( s.Side( aP ) != cur )
@ -378,7 +380,7 @@ bool SHAPE_LINE_CHAIN::PointOnEdge( const VECTOR2I& aP ) const
{
const SEG s = CSegment( i );
if( s.a == aP || s.b == aP )
if( s.A == aP || s.B == aP )
return true;
if( s.Distance( aP ) <= 1 )
@ -389,17 +391,17 @@ bool SHAPE_LINE_CHAIN::PointOnEdge( const VECTOR2I& aP ) const
}
const optional<SHAPE_LINE_CHAIN::Intersection> SHAPE_LINE_CHAIN::SelfIntersecting() const
const optional<SHAPE_LINE_CHAIN::INTERSECTION> SHAPE_LINE_CHAIN::SelfIntersecting() const
{
for( int s1 = 0; s1 < SegmentCount(); s1++ )
{
for( int s2 = s1 + 1; s2 < SegmentCount(); s2++ )
{
const VECTOR2I s2a = CSegment( s2 ).a, s2b = CSegment( s2 ).b;
const VECTOR2I s2a = CSegment( s2 ).A, s2b = CSegment( s2 ).B;
if( s1 + 1 != s2 && CSegment( s1 ).Contains( s2a ) )
{
Intersection is;
INTERSECTION is;
is.our = CSegment( s1 );
is.their = CSegment( s2 );
is.p = s2a;
@ -407,7 +409,7 @@ const optional<SHAPE_LINE_CHAIN::Intersection> SHAPE_LINE_CHAIN::SelfIntersectin
}
else if( CSegment( s1 ).Contains( s2b ) )
{
Intersection is;
INTERSECTION is;
is.our = CSegment( s1 );
is.their = CSegment( s2 );
is.p = s2b;
@ -419,7 +421,7 @@ const optional<SHAPE_LINE_CHAIN::Intersection> SHAPE_LINE_CHAIN::SelfIntersectin
if( p )
{
Intersection is;
INTERSECTION is;
is.our = CSegment( s1 );
is.their = CSegment( s2 );
is.p = *p;
@ -429,7 +431,7 @@ const optional<SHAPE_LINE_CHAIN::Intersection> SHAPE_LINE_CHAIN::SelfIntersectin
}
}
return optional<Intersection>();
return optional<INTERSECTION>();
}

View File

@ -28,31 +28,32 @@
#include <climits>
#include <math/math_util.h>
template<>
int rescale( int numerator, int value, int denominator )
template <>
int rescale( int aNumerator, int aValue, int aDenominator )
{
return (int) ( (int64_t) numerator * (int64_t) value / (int64_t) denominator );
return (int) ( (int64_t) aNumerator * (int64_t) aValue / (int64_t) aDenominator );
}
template<>
int64_t rescale( int64_t numerator, int64_t value, int64_t denominator )
template <>
int64_t rescale( int64_t aNumerator, int64_t aValue, int64_t aDenominator )
{
int64_t r = 0;
int64_t sign = ( ( numerator < 0) ? -1 : 1 ) * ( denominator < 0 ? -1 : 1 ) * ( value < 0 ? -1 : 1 );
int64_t sign = ( ( aNumerator < 0 ) ? -1 : 1 ) * ( aDenominator < 0 ? -1 : 1 ) *
( aValue < 0 ? -1 : 1 );
int64_t a = std::abs( numerator );
int64_t b = std::abs( value );
int64_t c = std::abs( denominator );
int64_t a = std::abs( aNumerator );
int64_t b = std::abs( aValue );
int64_t c = std::abs( aDenominator );
r = c / 2;
if( b <= INT_MAX && c <= INT_MAX )
{
if( a <= INT_MAX )
return sign * ( (a * b + r ) / c );
return sign * ( ( a * b + r ) / c );
else
return sign * (a / c * b + (a % c * b + r) / c);
return sign * ( a / c * b + ( a % c * b + r ) / c);
}
else
{

View File

@ -104,8 +104,8 @@ void CONTEXT_MENU::Add( const TOOL_ACTION& aAction )
wxString menuEntry;
if( aAction.HasHotKey() )
menuEntry = wxString( ( aAction.GetMenuItem() + '\t' + getHotKeyDescription( aAction ) ).c_str(),
wxConvUTF8 );
menuEntry = wxString( ( aAction.GetMenuItem() + '\t' +
getHotKeyDescription( aAction ) ).c_str(), wxConvUTF8 );
else
menuEntry = wxString( aAction.GetMenuItem().c_str(), wxConvUTF8 );
@ -134,17 +134,17 @@ std::string CONTEXT_MENU::getHotKeyDescription( const TOOL_ACTION& aAction ) con
std::string description = "";
if( hotkey & MD_ModAlt )
if( hotkey & MD_ALT )
description += "ALT+";
if( hotkey & MD_ModCtrl )
if( hotkey & MD_CTRL )
description += "CTRL+";
if( hotkey & MD_ModShift )
if( hotkey & MD_SHIFT )
description += "SHIFT+";
// TODO dispatch keys such as Fx, TAB, PG_UP/DN, HOME, END, etc.
description += char(hotkey & ~MD_ModifierMask);
description += char( hotkey & ~MD_MODIFIER_MASK );
return description;
}
@ -159,7 +159,7 @@ void CONTEXT_MENU::CMEventHandler::onEvent( wxEvent& aEvent )
// For example, the selection tool can use this to dynamically highlight the current item
// from selection clarification popup.
if( type == wxEVT_MENU_HIGHLIGHT )
evt = TOOL_EVENT( TC_Command, TA_ContextMenuUpdate, aEvent.GetId() );
evt = TOOL_EVENT( TC_COMMAND, TA_CONTEXT_MENU_UPDATE, aEvent.GetId() );
// One of menu entries was selected..
else if( type == wxEVT_COMMAND_MENU_SELECTED )
@ -172,7 +172,7 @@ void CONTEXT_MENU::CMEventHandler::onEvent( wxEvent& aEvent )
else
{
// Handling non-action menu entries (e.g. items in clarification list)
evt = TOOL_EVENT( TC_Command, TA_ContextMenuChoice, aEvent.GetId() );
evt = TOOL_EVENT( TC_COMMAND, TA_CONTEXT_MENU_CHOICE, aEvent.GetId() );
}
}

View File

@ -40,9 +40,9 @@
using boost::optional;
///> Stores information about a mouse button state
struct TOOL_DISPATCHER::ButtonState
struct TOOL_DISPATCHER::BUTTON_STATE
{
ButtonState( TOOL_MouseButtons aButton, const wxEventType& aDownEvent,
BUTTON_STATE( TOOL_MOUSE_BUTTONS aButton, const wxEventType& aDownEvent,
const wxEventType& aUpEvent ) :
button( aButton ),
downEvent( aDownEvent ),
@ -66,7 +66,7 @@ struct TOOL_DISPATCHER::ButtonState
double dragMaxDelta;
///> Determines the mouse button for which information are stored.
TOOL_MouseButtons button;
TOOL_MOUSE_BUTTONS button;
///> The type of wxEvent that determines mouse button press.
wxEventType downEvent;
@ -89,9 +89,9 @@ struct TOOL_DISPATCHER::ButtonState
TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr, PCB_BASE_FRAME* aEditFrame ) :
m_toolMgr( aToolMgr ), m_editFrame( aEditFrame )
{
m_buttons.push_back( new ButtonState( MB_Left, wxEVT_LEFT_DOWN, wxEVT_LEFT_UP ) );
m_buttons.push_back( new ButtonState( MB_Right, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_UP ) );
m_buttons.push_back( new ButtonState( MB_Middle, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_UP ) );
m_buttons.push_back( new BUTTON_STATE( MB_LEFT, wxEVT_LEFT_DOWN, wxEVT_LEFT_UP ) );
m_buttons.push_back( new BUTTON_STATE( MB_RIGHT, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_UP ) );
m_buttons.push_back( new BUTTON_STATE( MB_MIDDLE, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_UP ) );
ResetState();
}
@ -99,14 +99,14 @@ TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr, PCB_BASE_FRAME* aEditF
TOOL_DISPATCHER::~TOOL_DISPATCHER()
{
BOOST_FOREACH( ButtonState* st, m_buttons )
BOOST_FOREACH( BUTTON_STATE* st, m_buttons )
delete st;
}
void TOOL_DISPATCHER::ResetState()
{
BOOST_FOREACH( ButtonState* st, m_buttons )
BOOST_FOREACH( BUTTON_STATE* st, m_buttons )
st->Reset();
}
@ -119,7 +119,7 @@ KIGFX::VIEW* TOOL_DISPATCHER::getView()
bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion )
{
ButtonState* st = m_buttons[aIndex];
BUTTON_STATE* st = m_buttons[aIndex];
wxEventType type = aEvent.GetEventType();
optional<TOOL_EVENT> evt;
bool isClick = false;
@ -137,7 +137,7 @@ bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMoti
st->downPosition = m_lastMousePos;
st->dragMaxDelta = 0;
st->pressed = true;
evt = TOOL_EVENT( TC_Mouse, TA_MouseDown, args );
evt = TOOL_EVENT( TC_MOUSE, TA_MOUSE_DOWN, args );
}
else if( up ) // Handle mouse button release
{
@ -152,13 +152,13 @@ bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMoti
st->dragMaxDelta < DragDistanceThreshold )
isClick = true;
else
evt = TOOL_EVENT( TC_Mouse, TA_MouseUp, args );
evt = TOOL_EVENT( TC_MOUSE, TA_MOUSE_UP, args );
}
else
isClick = true;
if( isClick )
evt = TOOL_EVENT( TC_Mouse, TA_MouseClick, args );
evt = TOOL_EVENT( TC_MOUSE, TA_MOUSE_CLICK, args );
st->dragging = false;
}
@ -174,7 +174,7 @@ bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMoti
if( t - st->downTimestamp > DragTimeThreshold || st->dragMaxDelta > DragDistanceThreshold )
{
evt = TOOL_EVENT( TC_Mouse, TA_MouseDrag, args );
evt = TOOL_EVENT( TC_MOUSE, TA_MOUSE_DRAG, args );
evt->SetMouseDragOrigin( st->dragOrigin );
evt->SetMouseDelta( m_lastMousePos - st->dragOrigin );
}
@ -222,7 +222,7 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
if( !buttonEvents && motion )
{
evt = TOOL_EVENT( TC_Mouse, TA_MouseMotion );
evt = TOOL_EVENT( TC_MOUSE, TA_MOUSE_MOTION );
evt->SetMousePosition( pos );
}
}
@ -237,13 +237,13 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
if( type == wxEVT_KEY_UP )
{
if( key == WXK_ESCAPE ) // ESC is the special key for cancelling tools
evt = TOOL_EVENT( TC_Command, TA_CancelTool );
evt = TOOL_EVENT( TC_COMMAND, TA_CANCEL_TOOL );
else
evt = TOOL_EVENT( TC_Keyboard, TA_KeyUp, key | mods );
evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_UP, key | mods );
}
else
{
evt = TOOL_EVENT( TC_Keyboard, TA_KeyDown, key | mods );
evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_DOWN, key | mods );
}
}

View File

@ -40,14 +40,14 @@ struct FlagString
};
static const std::string flag2string( int flag, const FlagString* exps )
static const std::string flag2string( int aFlag, const FlagString* aExps )
{
std::string rv;
for( int i = 0; exps[i].str.length(); i++ )
for( int i = 0; aExps[i].str.length(); i++ )
{
if( exps[i].flag & flag )
rv += exps[i].str + " ";
if( aExps[i].flag & aFlag )
rv += aExps[i].str + " ";
}
return rv;
@ -66,51 +66,51 @@ const std::string TOOL_EVENT::Format() const
const FlagString categories[] =
{
{ TC_Mouse, "mouse" },
{ TC_Keyboard, "keyboard" },
{ TC_Command, "command" },
{ TC_Message, "message" },
{ TC_View, "view" },
{ TC_MOUSE, "mouse" },
{ TC_KEYBOARD, "keyboard" },
{ TC_COMMAND, "command" },
{ TC_MESSAGE, "message" },
{ TC_VIEW, "view" },
{ 0, "" }
};
const FlagString actions[] =
{
{ TA_MouseClick, "click" },
{ TA_MouseUp, "button-up" },
{ TA_MouseDown, "button-down" },
{ TA_MouseDrag, "drag" },
{ TA_MouseMotion, "motion" },
{ TA_MouseWheel, "wheel" },
{ TA_KeyUp, "key-up" },
{ TA_KeyDown, "key-down" },
{ TA_ViewRefresh, "view-refresh" },
{ TA_ViewZoom, "view-zoom" },
{ TA_ViewPan, "view-pan" },
{ TA_ViewDirty, "view-dirty" },
{ TA_ChangeLayer, "change-layer" },
{ TA_CancelTool, "cancel-tool" },
{ TA_ContextMenuUpdate, "context-menu-update" },
{ TA_ContextMenuChoice, "context-menu-choice" },
{ TA_Action, "action" },
{ 0, "" }
{ TA_MOUSE_CLICK, "click" },
{ TA_MOUSE_UP, "button-up" },
{ TA_MOUSE_DOWN, "button-down" },
{ TA_MOUSE_DRAG, "drag" },
{ TA_MOUSE_MOTION, "motion" },
{ TA_MOUSE_WHEEL, "wheel" },
{ TA_KEY_UP, "key-up" },
{ TA_KEY_DOWN, "key-down" },
{ TA_VIEW_REFRESH, "view-refresh" },
{ TA_VIEW_ZOOM, "view-zoom" },
{ TA_VIEW_PAN, "view-pan" },
{ TA_VIEW_DIRTY, "view-dirty" },
{ TA_CHANGE_LAYER, "change-layer" },
{ TA_CANCEL_TOOL, "cancel-tool" },
{ TA_CONTEXT_MENU_UPDATE, "context-menu-update" },
{ TA_CONTEXT_MENU_CHOICE, "context-menu-choice" },
{ TA_ACTION, "action" },
{ 0, "" }
};
const FlagString buttons[] =
{
{ MB_None, "none" },
{ MB_Left, "left" },
{ MB_Right, "right" },
{ MB_Middle, "middle" },
{ MB_NONE, "none" },
{ MB_LEFT, "left" },
{ MB_RIGHT, "right" },
{ MB_MIDDLE, "middle" },
{ 0, "" }
};
const FlagString modifiers[] =
{
{ MD_ModShift, "shift" },
{ MD_ModCtrl, "ctrl" },
{ MD_ModAlt, "alt" },
{ 0, "" }
{ MD_SHIFT, "shift" },
{ MD_CTRL, "ctrl" },
{ MD_ALT, "alt" },
{ 0, "" }
};
ev = "category: ";
@ -118,20 +118,20 @@ const std::string TOOL_EVENT::Format() const
ev += " action: ";
ev += flag2string( m_actions, actions );
if( m_actions & TA_Mouse )
if( m_actions & TA_MOUSE )
{
ev += " btns: ";
ev += flag2string( m_mouseButtons, buttons );
}
if( m_actions & TA_Keyboard )
if( m_actions & TA_KEYBOARD )
{
char tmp[128];
sprintf( tmp, "key: %d", m_keyCode );
ev += tmp;
}
if( m_actions & ( TA_Mouse | TA_Keyboard ) )
if( m_actions & ( TA_MOUSE | TA_KEYBOARD ) )
{
ev += " mods: ";
ev += flag2string( m_modifiers, modifiers );

View File

@ -30,13 +30,13 @@
#include <tool/context_menu.h>
TOOL_INTERACTIVE::TOOL_INTERACTIVE( TOOL_ID aId, const std::string& aName ) :
TOOL_BASE( TOOL_Interactive, aId, aName )
TOOL_BASE( INTERACTIVE, aId, aName )
{
}
TOOL_INTERACTIVE::TOOL_INTERACTIVE( const std::string& aName ) :
TOOL_BASE( TOOL_Interactive, TOOL_MANAGER::MakeToolId( aName ), aName )
TOOL_BASE( INTERACTIVE, TOOL_MANAGER::MakeToolId( aName ), aName )
{
}

View File

@ -134,7 +134,7 @@ void TOOL_MANAGER::RegisterTool( TOOL_BASE* aTool )
aTool->m_toolMgr = this;
if( aTool->GetType() == TOOL_Interactive )
if( aTool->GetType() == INTERACTIVE )
{
bool initState = static_cast<TOOL_INTERACTIVE*>( aTool )->Init();
@ -158,7 +158,7 @@ bool TOOL_MANAGER::InvokeTool( TOOL_ID aToolId )
{
TOOL_BASE* tool = FindTool( aToolId );
if( tool && tool->GetType() == TOOL_Interactive )
if( tool && tool->GetType() == INTERACTIVE )
return invokeTool( tool );
return false; // there is no tool with the given id
@ -169,7 +169,7 @@ bool TOOL_MANAGER::InvokeTool( const std::string& aToolName )
{
TOOL_BASE* tool = FindTool( aToolName );
if( tool && tool->GetType() == TOOL_Interactive )
if( tool && tool->GetType() == INTERACTIVE )
return invokeTool( tool );
return false; // there is no tool with the given name
@ -192,7 +192,7 @@ bool TOOL_MANAGER::invokeTool( TOOL_BASE* aTool )
{
wxASSERT( aTool != NULL );
TOOL_EVENT evt( TC_Command, TA_Action, aTool->GetName() );
TOOL_EVENT evt( TC_COMMAND, TA_ACTION, aTool->GetName() );
ProcessEvent( evt );
return true;
@ -203,7 +203,7 @@ bool TOOL_MANAGER::runTool( TOOL_ID aToolId )
{
TOOL_BASE* tool = FindTool( aToolId );
if( tool && tool->GetType() == TOOL_Interactive )
if( tool && tool->GetType() == INTERACTIVE )
return runTool( tool );
return false; // there is no tool with the given id
@ -214,7 +214,7 @@ bool TOOL_MANAGER::runTool( const std::string& aToolName )
{
TOOL_BASE* tool = FindTool( aToolName );
if( tool && tool->GetType() == TOOL_Interactive )
if( tool && tool->GetType() == INTERACTIVE )
return runTool( tool );
return false; // there is no tool with the given name
@ -360,13 +360,13 @@ void TOOL_MANAGER::dispatchInternal( TOOL_EVENT& aEvent )
bool TOOL_MANAGER::dispatchStandardEvents( TOOL_EVENT& aEvent )
{
if( aEvent.Action() == TA_KeyUp )
if( aEvent.Action() == TA_KEY_UP )
{
// Check if there is a hotkey associated
if( m_actionMgr->RunHotKey( aEvent.Modifier() | aEvent.KeyCode() ) )
return false; // hotkey event was handled so it does not go any further
}
else if( aEvent.Category() == TC_Command ) // it may be a tool activation event
else if( aEvent.Category() == TC_COMMAND ) // it may be a tool activation event
{
dispatchActivation( aEvent );
// do not return false, as the event has to go on to the destined tool
@ -433,11 +433,11 @@ bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
// or immediately (CMENU_NOW) mode. The latter is used for clarification lists.
if( st->contextMenuTrigger != CMENU_OFF )
{
if( st->contextMenuTrigger == CMENU_BUTTON && !aEvent.IsClick( MB_Right ) )
if( st->contextMenuTrigger == CMENU_BUTTON && !aEvent.IsClick( MB_RIGHT ) )
break;
st->pendingWait = true;
st->waitEvents = TOOL_EVENT( TC_Any, TA_Any );
st->waitEvents = TOOL_EVENT( TC_ANY, TA_ANY );
if( st->contextMenuTrigger == CMENU_NOW )
st->contextMenuTrigger = CMENU_OFF;
@ -446,7 +446,7 @@ bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
GetEditFrame()->PopupMenu( menu->GetMenu() );
//
TOOL_EVENT evt( TC_Command, TA_ContextMenuChoice );
TOOL_EVENT evt( TC_COMMAND, TA_CONTEXT_MENU_CHOICE );
dispatchInternal( evt );
break;
@ -498,7 +498,7 @@ void TOOL_MANAGER::SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView,
{
TOOL_BASE* tool = m_toolIdIndex[toolId]->theTool;
if( tool->GetType() == TOOL_Interactive )
if( tool->GetType() == INTERACTIVE )
static_cast<TOOL_INTERACTIVE*>( tool )->Reset();
}
}

View File

@ -67,7 +67,7 @@ VIEW::VIEW( bool aIsDynamic ) :
VIEW::~VIEW()
{
BOOST_FOREACH( LayerMap::value_type& l, m_layers )
BOOST_FOREACH( LAYER_MAP::value_type& l, m_layers )
{
delete l.second.items;
}
@ -156,7 +156,7 @@ struct queryVisitor
void operator()( VIEW_ITEM* aItem )
{
if( aItem->ViewIsVisible() )
m_cont.push_back( VIEW::LayerItemPair( aItem, m_layer ) );
m_cont.push_back( VIEW::LAYER_ITEM_PAIR( aItem, m_layer ) );
}
Container& m_cont;
@ -164,7 +164,7 @@ struct queryVisitor
};
int VIEW::Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult )
int VIEW::Query( const BOX2I& aRect, std::vector<LAYER_ITEM_PAIR>& aResult )
{
if( m_orderedLayers.empty() )
return 0;
@ -179,7 +179,7 @@ int VIEW::Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult )
if( ( *i )->displayOnly )
continue;
queryVisitor<std::vector<LayerItemPair> > visitor( aResult, ( *i )->id );
queryVisitor<std::vector<LAYER_ITEM_PAIR> > visitor( aResult, ( *i )->id );
( *i )->items->Query( aRect, visitor );
}
@ -424,7 +424,7 @@ void VIEW::UpdateAllLayersColor()
r.SetMaximum();
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = &( ( *i ).second );
@ -555,7 +555,7 @@ void VIEW::UpdateAllLayersOrder()
{
sortLayers();
BOOST_FOREACH( LayerMap::value_type& l, m_layers )
BOOST_FOREACH( LAYER_MAP::value_type& l, m_layers )
{
ChangeLayerDepth( l.first, l.second.renderingOrder );
}
@ -727,7 +727,7 @@ void VIEW::Clear()
r.SetMaximum();
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = &( ( *i ).second );
unlinkItem v;
@ -811,7 +811,7 @@ void VIEW::clearGroupCache()
r.SetMaximum();
clearLayerCache visitor( this );
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = &( ( *i ).second );
l->items->Query( r, visitor );
@ -858,7 +858,7 @@ void VIEW::sortLayers()
m_orderedLayers.resize( m_layers.size() );
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
m_orderedLayers[n++] = &i->second;
sort( m_orderedLayers.begin(), m_orderedLayers.end(), compareRenderingOrder );
@ -974,7 +974,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
prof_start( &totalRealTime, false );
#endif /* __WXDEBUG__ */
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = &( ( *i ).second );

View File

@ -142,7 +142,7 @@ void VIEW_GROUP::ItemsSetVisibility( bool aVisible )
}
void VIEW_GROUP::ItemsViewUpdate( VIEW_ITEM::ViewUpdateFlags aFlags )
void VIEW_GROUP::ItemsViewUpdate( VIEW_ITEM::VIEW_UPDATE_FLAGS aFlags )
{
std::set<VIEW_ITEM*>::const_iterator it, it_end;

View File

@ -39,26 +39,26 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxWindow* aParentPanel ) :
m_state( IDLE ),
m_parentPanel( aParentPanel )
{
m_parentPanel->Connect( wxEVT_MOTION, wxMouseEventHandler(
WX_VIEW_CONTROLS::onMotion ), NULL, this );
m_parentPanel->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler(
WX_VIEW_CONTROLS::onWheel ), NULL, this );
m_parentPanel->Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler(
WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler(
WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_LEFT_UP, wxMouseEventHandler(
WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler(
WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_MOTION,
wxMouseEventHandler( WX_VIEW_CONTROLS::onMotion ), NULL, this );
m_parentPanel->Connect( wxEVT_MOUSEWHEEL,
wxMouseEventHandler( WX_VIEW_CONTROLS::onWheel ), NULL, this );
m_parentPanel->Connect( wxEVT_MIDDLE_UP,
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_MIDDLE_DOWN,
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_LEFT_UP,
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_LEFT_DOWN,
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
#if defined _WIN32 || defined _WIN64
m_parentPanel->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler(
WX_VIEW_CONTROLS::onEnter ), NULL, this );
m_parentPanel->Connect( wxEVT_ENTER_WINDOW,
wxMouseEventHandler( WX_VIEW_CONTROLS::onEnter ), NULL, this );
#endif
m_panTimer.SetOwner( this );
this->Connect( wxEVT_TIMER, wxTimerEventHandler(
WX_VIEW_CONTROLS::onTimer ), NULL, this );
this->Connect( wxEVT_TIMER,
wxTimerEventHandler( WX_VIEW_CONTROLS::onTimer ), NULL, this );
}

View File

@ -217,13 +217,13 @@ public:
virtual void RestoreScreen();
/// @copydoc GAL::SetTarget()
virtual void SetTarget( RenderTarget aTarget );
virtual void SetTarget( RENDER_TARGET aTarget );
/// @copydoc GAL::GetTarget()
virtual RenderTarget GetTarget() const;
virtual RENDER_TARGET GetTarget() const;
/// @copydoc GAL::ClearTarget()
virtual void ClearTarget( RenderTarget aTarget );
virtual void ClearTarget( RENDER_TARGET aTarget );
// -------
// Cursor
@ -267,7 +267,7 @@ private:
boost::shared_ptr<CAIRO_COMPOSITOR> compositor; ///< Object for layers compositing
unsigned int mainBuffer; ///< Handle to the main buffer
unsigned int overlayBuffer; ///< Handle to the overlay buffer
RenderTarget currentTarget; ///< Current rendering target
RENDER_TARGET currentTarget; ///< Current rendering target
bool validCompositor; ///< Compositor initialization flag
// Variables related to wxWidgets
@ -290,7 +290,8 @@ private:
static const int MAX_CAIRO_ARGUMENTS = 6;
/// Definitions for the command recorder
enum GraphicsCommand {
enum GRAPHICS_COMMAND
{
CMD_SET_FILL, ///< Enable/disable filling
CMD_SET_STROKE, ///< Enable/disable stroking
CMD_SET_FILLCOLOR, ///< Set the fill color
@ -310,20 +311,20 @@ private:
/// Type definition for an graphics group element
typedef struct
{
GraphicsCommand command; ///< Command to execute
GRAPHICS_COMMAND command; ///< Command to execute
double arguments[MAX_CAIRO_ARGUMENTS]; ///< Arguments for Cairo commands
bool boolArgument; ///< A bool argument
int intArgument; ///< An int argument
cairo_path_t* cairoPath; ///< Pointer to a Cairo path
} GroupElement;
} GROUP_ELEMENT;
// Variables for the grouping function
bool isGrouping; ///< Is grouping enabled ?
bool isElementAdded; ///< Was an graphic element added ?
typedef std::deque<GroupElement> Group; ///< A graphic group type definition
std::map<int, Group> groups; ///< List of graphic groups
typedef std::deque<GROUP_ELEMENT> GROUP; ///< A graphic group type definition
std::map<int, GROUP> groups; ///< List of graphic groups
unsigned int groupCounter; ///< Counter used for generating keys for groups
Group* currentGroup; ///< Currently used group
GROUP* currentGroup; ///< Currently used group
// Variables related to Cairo <-> wxWidgets
cairo_matrix_t cairoWorldScreenMatrix; ///< Cairo world to screen transformation matrix

View File

@ -34,9 +34,9 @@
namespace KIGFX
{
/**
* RenderTarget: Possible rendering targets
* RENDER_TARGET: Possible rendering targets
*/
enum RenderTarget
enum RENDER_TARGET
{
TARGET_CACHED = 0, ///< Main rendering target (cached)
TARGET_NONCACHED, ///< Auxiliary rendering target (noncached)

View File

@ -589,21 +589,21 @@ public:
*
* @param aTarget is the new target for rendering.
*/
virtual void SetTarget( RenderTarget aTarget ) = 0;
virtual void SetTarget( RENDER_TARGET aTarget ) = 0;
/**
* @brief Gets the currently used target for rendering.
*
* @return The current rendering target.
*/
virtual RenderTarget GetTarget() const = 0;
virtual RENDER_TARGET GetTarget() const = 0;
/**
* @brief Clears the target for rendering.
*
* @param aTarget is the target to be cleared.
*/
virtual void ClearTarget( RenderTarget aTarget ) = 0;
virtual void ClearTarget( RENDER_TARGET aTarget ) = 0;
// -------------
// Grid methods

View File

@ -49,19 +49,19 @@ class CACHED_CONTAINER : public VERTEX_CONTAINER
public:
CACHED_CONTAINER( unsigned int aSize = defaultInitSize );
///< @copydoc VERTEX_CONTAINER::SetItem()
///> @copydoc VERTEX_CONTAINER::SetItem()
virtual void SetItem( VERTEX_ITEM* aItem );
///< @copydoc VERTEX_CONTAINER::FinishItem()
///> @copydoc VERTEX_CONTAINER::FinishItem()
virtual void FinishItem();
///< @copydoc VERTEX_CONTAINER::Allocate()
///> @copydoc VERTEX_CONTAINER::Allocate()
virtual VERTEX* Allocate( unsigned int aSize );
///< @copydoc VERTEX_CONTAINER::Delete()
///> @copydoc VERTEX_CONTAINER::Delete()
virtual void Delete( VERTEX_ITEM* aItem );
///< @copydoc VERTEX_CONTAINER::Clear()
///> @copydoc VERTEX_CONTAINER::Clear()
virtual void Clear();
/**
@ -73,23 +73,23 @@ public:
virtual VERTEX* GetVertices( const VERTEX_ITEM* aItem ) const;
protected:
///< Maps size of free memory chunks to their offsets
typedef std::pair<unsigned int, unsigned int> Chunk;
typedef std::multimap<unsigned int, unsigned int> FreeChunkMap;
///> Maps size of free memory chunks to their offsets
typedef std::pair<unsigned int, unsigned int> CHUNK;
typedef std::multimap<unsigned int, unsigned int> FREE_CHUNK_MAP;
/// List of all the stored items
typedef std::set<VERTEX_ITEM*> Items;
typedef std::set<VERTEX_ITEM*> ITEMS;
///< Stores size & offset of free chunks.
FreeChunkMap m_freeChunks;
///> Stores size & offset of free chunks.
FREE_CHUNK_MAP m_freeChunks;
///< Stored VERTEX_ITEMs
Items m_items;
///> Stored VERTEX_ITEMs
ITEMS m_items;
///< Currently modified item
///> Currently modified item
VERTEX_ITEM* m_item;
///< Properties of currently modified chunk & item
///> Properties of currently modified chunk & item
unsigned int m_chunkSize;
unsigned int m_chunkOffset;
unsigned int m_itemSize;
@ -146,7 +146,7 @@ private:
*
* @param aChunk is the chunk.
*/
inline int getChunkSize( const Chunk& aChunk ) const
inline int getChunkSize( const CHUNK& aChunk ) const
{
return aChunk.first;
}
@ -157,7 +157,7 @@ private:
*
* @param aChunk is the chunk.
*/
inline unsigned int getChunkOffset( const Chunk& aChunk ) const
inline unsigned int getChunkOffset( const CHUNK& aChunk ) const
{
return aChunk.second;
}

View File

@ -89,15 +89,17 @@ public:
protected:
GPU_MANAGER( VERTEX_CONTAINER* aContainer );
///< Drawing status flag.
///> Drawing status flag.
bool m_isDrawing;
///< Container that stores vertices data.
///> Container that stores vertices data.
VERTEX_CONTAINER* m_container;
///< Shader handling
///> Shader handling
SHADER* m_shader;
int m_shaderAttrib; ///< Location of shader attributes (for glVertexAttribPointer)
///> Location of shader attributes (for glVertexAttribPointer)
int m_shaderAttrib;
};
@ -107,19 +109,19 @@ public:
GPU_CACHED_MANAGER( VERTEX_CONTAINER* aContainer );
~GPU_CACHED_MANAGER();
///< @copydoc GPU_MANAGER::Initialize()
///> @copydoc GPU_MANAGER::Initialize()
virtual void Initialize();
///< @copydoc GPU_MANAGER::BeginDrawing()
///> @copydoc GPU_MANAGER::BeginDrawing()
virtual void BeginDrawing();
///< @copydoc GPU_MANAGER::DrawIndices()
///> @copydoc GPU_MANAGER::DrawIndices()
virtual void DrawIndices( unsigned int aOffset, unsigned int aSize );
///< @copydoc GPU_MANAGER::DrawAll()
///> @copydoc GPU_MANAGER::DrawAll()
virtual void DrawAll();
///< @copydoc GPU_MANAGER::EndDrawing()
///> @copydoc GPU_MANAGER::EndDrawing()
virtual void EndDrawing();
/**
@ -130,10 +132,19 @@ public:
virtual void uploadToGpu();
protected:
///> Buffers initialization flag
bool m_buffersInitialized;
///> Pointer to the current indices buffer
boost::scoped_array<GLuint> m_indices;
///> Pointer to the first free cell in the indices buffer
GLuint* m_indicesPtr;
///> Handle to vertices buffer
GLuint m_verticesBuffer;
///> Number of indices stored in the indices buffer
unsigned int m_indicesSize;
};
@ -143,19 +154,19 @@ class GPU_NONCACHED_MANAGER : public GPU_MANAGER
public:
GPU_NONCACHED_MANAGER( VERTEX_CONTAINER* aContainer );
///< @copydoc GPU_MANAGER::Initialize()
///> @copydoc GPU_MANAGER::Initialize()
virtual void Initialize();
///< @copydoc GPU_MANAGER::BeginDrawing()
///> @copydoc GPU_MANAGER::BeginDrawing()
virtual void BeginDrawing();
///< @copydoc GPU_MANAGER::DrawIndices()
///> @copydoc GPU_MANAGER::DrawIndices()
virtual void DrawIndices( unsigned int aOffset, unsigned int aSize );
///< @copydoc GPU_MANAGER::DrawAll()
///> @copydoc GPU_MANAGER::DrawAll()
virtual void DrawAll();
///< @copydoc GPU_MANAGER::EndDrawing()
///> @copydoc GPU_MANAGER::EndDrawing()
virtual void EndDrawing();
};
} // namespace KIGFX

View File

@ -106,7 +106,8 @@ public:
virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
/// @copydoc GAL::DrawSegment()
virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint, double aWidth );
virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint,
double aWidth );
/// @copydoc GAL::DrawCircle()
virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius );
@ -209,13 +210,13 @@ public:
virtual void RestoreScreen();
/// @copydoc GAL::SetTarget()
virtual void SetTarget( RenderTarget aTarget );
virtual void SetTarget( RENDER_TARGET aTarget );
/// @copydoc GAL::GetTarget()
virtual RenderTarget GetTarget() const;
virtual RENDER_TARGET GetTarget() const;
/// @copydoc GAL::ClearTarget()
virtual void ClearTarget( RenderTarget aTarget );
virtual void ClearTarget( RENDER_TARGET aTarget );
// -------
// Cursor
@ -275,8 +276,8 @@ private:
wxEvtHandler* paintListener;
// Vertex buffer objects related fields
typedef std::map< unsigned int, boost::shared_ptr<VERTEX_ITEM> > GroupsMap;
GroupsMap groups; ///< Stores informations about VBO objects (groups)
typedef std::map< unsigned int, boost::shared_ptr<VERTEX_ITEM> > GROUPS_MAP;
GROUPS_MAP groups; ///< Stores informations about VBO objects (groups)
unsigned int groupCounter; ///< Counter used for generating keys for groups
VERTEX_MANAGER* currentManager; ///< Currently used VERTEX_MANAGER (for storing VERTEX_ITEMs)
VERTEX_MANAGER cachedManager; ///< Container for storing cached VERTEX_ITEMs
@ -287,7 +288,7 @@ private:
OPENGL_COMPOSITOR compositor; ///< Handles multiple rendering targets
unsigned int mainBuffer; ///< Main rendering target
unsigned int overlayBuffer; ///< Auxiliary rendering target (for menus etc.)
RenderTarget currentTarget; ///< Current rendering target
RENDER_TARGET currentTarget; ///< Current rendering target
// Shader
SHADER shader; ///< There is only one shader used for different objects

View File

@ -39,7 +39,7 @@ namespace KIGFX
class OPENGL_GAL;
/// Type definition for the shader
enum ShaderType
enum SHADER_TYPE
{
SHADER_TYPE_VERTEX = GL_VERTEX_SHADER, ///< Vertex shader
SHADER_TYPE_FRAGMENT = GL_FRAGMENT_SHADER, ///< Fragment shader
@ -77,7 +77,7 @@ public:
* @param aShaderType is the type of the shader.
* @return True in case of success, false otherwise.
*/
bool LoadBuiltinShader( unsigned int aShaderNumber, ShaderType aShaderType );
bool LoadBuiltinShader( unsigned int aShaderNumber, SHADER_TYPE aShaderType );
/**
* @brief Loads one of the built-in shaders and compiles it.
@ -86,7 +86,7 @@ public:
* @param aShaderType is the type of the shader.
* @return True in case of success, false otherwise.
*/
bool LoadShaderFromFile( const std::string& aShaderSourceName, ShaderType aShaderType );
bool LoadShaderFromFile( const std::string& aShaderSourceName, SHADER_TYPE aShaderType );
/**
* @brief Link the shaders.
@ -193,7 +193,7 @@ private:
* @param aShaderType is the type of the shader.
* @return True in case of success, false otherwise.
*/
bool addSource( const std::string& aShaderSource, ShaderType aShaderType );
bool addSource( const std::string& aShaderSource, SHADER_TYPE aShaderType );
std::deque<GLuint> shaderNumbers; ///< Shader number list
GLuint programNumber; ///< Shader program number

View File

@ -35,7 +35,7 @@
namespace KIGFX
{
// Possible types of shaders
enum SHADER_TYPE
enum SHADER_MODE
{
SHADER_NONE = 0,
SHADER_LINE,

View File

@ -38,8 +38,8 @@ namespace KIGFX
{
class GAL;
typedef std::deque< std::deque<VECTOR2D> > Glyph;
typedef std::deque<Glyph> GlyphList;
typedef std::deque< std::deque<VECTOR2D> > GLYPH;
typedef std::deque<GLYPH> GLYPH_LIST;
/**
* @brief Class STROKE_FONT implements stroke font drawing.
@ -157,7 +157,7 @@ public:
private:
GAL* m_gal; ///< Pointer to the GAL
GlyphList m_glyphs; ///< Glyph list
GLYPH_LIST m_glyphs; ///< Glyph list
std::deque<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs
double m_scaleFactor; ///< Scale factor for the glyph
VECTOR2D m_glyphSize; ///< Size of the glyphs
@ -172,7 +172,7 @@ private:
* @param aGlyphBoundingX is the x-component of the bounding box size.
* @return is the complete bounding box size.
*/
BOX2D computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const;
BOX2D computeBoundingBox( const GLYPH& aGlyph, const VECTOR2D& aGlyphBoundingX ) const;
/**
* @brief Compute the size of a given text.

View File

@ -43,18 +43,18 @@ public:
friend inline std::ostream& operator<<( std::ostream& aStream, const SEG& aSeg );
/* Start and the of the segment. Public, to make access simpler. These are references
* to an object the segment belongs to (e.g. a line chain) or references to locally stored points
* (m_a, m_b).
* to an object the segment belongs to (e.g. a line chain) or references to locally stored
* points (m_a, m_b).
*/
VECTOR2I& a, b;
VECTOR2I& A, B;
/** Default constructor
* Creates an empty (0, 0) segment, locally-referenced
*/
SEG() : a( m_a ), b( m_b )
SEG() : A( m_a ), B( m_b )
{
a = m_a;
b = m_b;
A = m_a;
B = m_b;
m_is_local = true;
m_index = -1;
}
@ -63,238 +63,243 @@ public:
* Constructor
* Creates a segment between (aX1, aY1) and (aX2, aY2), locally referenced
*/
SEG( int aX1, int aY1, int aX2, int aY2 ) : a( m_a ), b( m_b )
SEG( int aX1, int aY1, int aX2, int aY2 ) : A( m_a ), B( m_b )
{
m_a = VECTOR2I( aX1, aY1 );
m_b = VECTOR2I( aX2, aY2 );
a = m_a;
b = m_b;
A = m_a;
B = m_b;
m_is_local = true;
m_index = -1;
}
/**
* Constructor
* Creates a segment between (aA) and (aB), locally referenced
*/
SEG( const VECTOR2I& aA, const VECTOR2I& aB ) : a( m_a ), b( m_b ), m_a( aA ), m_b( aB )
/**
* Constructor
* Creates a segment between (aA) and (aB), locally referenced
*/
SEG( const VECTOR2I& aA, const VECTOR2I& aB ) : A( m_a ), B( m_b ), m_a( aA ), m_b( aB )
{
A = m_a;
B = m_b;
m_is_local = true;
m_index = -1;
}
/**
* Constructor
* Creates a segment between (aA) and (aB), referenced to a multi-segment shape
* @param aA reference to the start point in the parent shape
* @param aB reference to the end point in the parent shape
* @param aIndex index of the segment within the parent shape
*/
SEG ( VECTOR2I& aA, VECTOR2I& aB, int aIndex ) : A( aA ), B( aB )
{
m_is_local = false;
m_index = aIndex;
}
/**
* Copy constructor
*/
SEG ( const SEG& aSeg ) : A( m_a ), B( m_b )
{
if( aSeg.m_is_local )
{
a = m_a;
b = m_b;
m_a = aSeg.m_a;
m_b = aSeg.m_b;
A = m_a;
B = m_b;
m_is_local = true;
m_index = -1;
}
/**
* Constructor
* Creates a segment between (aA) and (aB), referenced to a multi-segment shape
* @param aA reference to the start point in the parent shape
* @param aB reference to the end point in the parent shape
* @param aIndex index of the segment within the parent shape
*/
SEG ( VECTOR2I& aA, VECTOR2I& aB, int aIndex ) : a( aA ), b( aB )
else
{
m_is_local = false;
m_index = aIndex;
}
/**
* Copy constructor
*/
SEG ( const SEG& aSeg ) : a( m_a ), b( m_b )
{
if (aSeg.m_is_local)
{
m_a = aSeg.m_a;
m_b = aSeg.m_b;
a = m_a;
b = m_b;
m_is_local = true;
m_index = -1;
} else {
a = aSeg.a;
b = aSeg.b;
m_index = aSeg.m_index;
m_is_local = false;
}
}
SEG& operator=( const SEG& aSeg )
{
a = aSeg.a;
b = aSeg.b;
m_a = aSeg.m_a;
m_b = aSeg.m_b;
A = aSeg.A;
B = aSeg.B;
m_index = aSeg.m_index;
m_is_local = aSeg.m_is_local;
return *this;
m_is_local = false;
}
}
/**
* Function LineProject()
*
* Computes the perpendicular projection point of aP on a line passing through
* ends of the segment.
* @param aP point to project
* @return projected point
*/
VECTOR2I LineProject( const VECTOR2I& aP ) const;
SEG& operator=( const SEG& aSeg )
{
A = aSeg.A;
B = aSeg.B;
m_a = aSeg.m_a;
m_b = aSeg.m_b;
m_index = aSeg.m_index;
m_is_local = aSeg.m_is_local;
/**
* Function Side()
*
* Determines on which side of directed line passing via segment ends point aP lies.
* @param aP point to determine the orientation wrs to self
* @return: < 0: left, 0 : on the line, > 0 : right
*/
int Side( const VECTOR2I& aP ) const
{
const ecoord det = ( b - a ).Cross( aP - a );
return *this;
}
return det < 0 ? -1 : ( det > 0 ? 1 : 0 );
}
/**
* Function LineProject()
*
* Computes the perpendicular projection point of aP on a line passing through
* ends of the segment.
* @param aP point to project
* @return projected point
*/
VECTOR2I LineProject( const VECTOR2I& aP ) const;
/**
* Function LineDistance()
*
* Returns the closest Euclidean distance between point aP and the line defined by
* the ends of segment (this).
* @param aDetermineSide: when true, the sign of the returned value indicates
* the side of the line at which we are (negative = left)
* @return the distance
*/
int LineDistance( const VECTOR2I& aP, bool aDetermineSide = false ) const;
/**
* Function Side()
*
* Determines on which side of directed line passing via segment ends point aP lies.
* @param aP point to determine the orientation wrs to self
* @return: < 0: left, 0 : on the line, > 0 : right
*/
int Side( const VECTOR2I& aP ) const
{
const ecoord det = ( B - A ).Cross( aP - A );
/**
* Function NearestPoint()
*
* Computes a point on the segment (this) that is closest to point aP.
* @return: nearest point
*/
const VECTOR2I NearestPoint( const VECTOR2I &aP ) const;
return det < 0 ? -1 : ( det > 0 ? 1 : 0 );
}
/**
* Function Intersect()
*
* Computes intersection point of segment (this) with segment aSeg.
* @param aSeg: segment to intersect with
* @param aIgnoreEndpoints: don't treat corner cases (i.e. end of one segment touching the other)
* as intersections.
* @param aLines: treat segments as infinite lines
* @return intersection point, if exists
*/
OPT_VECTOR2I Intersect( const SEG& aSeg, bool aIgnoreEndpoints = false, bool aLines = false ) const;
/**
* Function LineDistance()
*
* Returns the closest Euclidean distance between point aP and the line defined by
* the ends of segment (this).
* @param aDetermineSide: when true, the sign of the returned value indicates
* the side of the line at which we are (negative = left)
* @return the distance
*/
int LineDistance( const VECTOR2I& aP, bool aDetermineSide = false ) const;
/**
* Function IntersectLines()
*
* Computes the intersection point of lines passing through ends of (this) and aSeg
* @param aSeg segment defining the line to intersect with
* @return intersection point, if exists
*/
OPT_VECTOR2I IntersectLines( const SEG& aSeg ) const
{
return Intersect( aSeg, false, true );
}
/**
* Function NearestPoint()
*
* Computes a point on the segment (this) that is closest to point aP.
* @return: nearest point
*/
const VECTOR2I NearestPoint( const VECTOR2I &aP ) const;
bool Collide( const SEG& aSeg, int aClearance ) const;
/**
* Function Intersect()
*
* Computes intersection point of segment (this) with segment aSeg.
* @param aSeg: segment to intersect with
* @param aIgnoreEndpoints: don't treat corner cases (i.e. end of one segment touching the
* other) as intersections.
* @param aLines: treat segments as infinite lines
* @return intersection point, if exists
*/
OPT_VECTOR2I Intersect( const SEG& aSeg, bool aIgnoreEndpoints = false,
bool aLines = false ) const;
/**
* Function Distance()
*
* Computes minimum Euclidean distance to segment aSeg.
* @param aSeg other segment
* @return minimum distance
*/
/**
* Function IntersectLines()
*
* Computes the intersection point of lines passing through ends of (this) and aSeg
* @param aSeg segment defining the line to intersect with
* @return intersection point, if exists
*/
OPT_VECTOR2I IntersectLines( const SEG& aSeg ) const
{
return Intersect( aSeg, false, true );
}
ecoord SquaredDistance( const SEG& aSeg ) const;
bool Collide( const SEG& aSeg, int aClearance ) const;
int Distance( const SEG& aSeg ) const
{
return sqrt( SquaredDistance( aSeg ) );
}
/**
* Function Distance()
*
* Computes minimum Euclidean distance to segment aSeg.
* @param aSeg other segment
* @return minimum distance
*/
/**
* Function Distance()
*
* Computes minimum Euclidean distance to point aP.
* @param aP the point
* @return minimum distance
*/
ecoord SquaredDistance( const VECTOR2I& aP ) const
{
return ( NearestPoint( aP ) - aP ).SquaredEuclideanNorm();
}
ecoord SquaredDistance( const SEG& aSeg ) const;
int Distance( const VECTOR2I& aP ) const
{
return sqrt( SquaredDistance( aP ) );
}
int Distance( const SEG& aSeg ) const
{
return sqrt( SquaredDistance( aSeg ) );
}
/**
* Function Collinear()
*
* Checks if segment aSeg lies on the same line as (this).
* @param aSeg the segment to chech colinearity with
* @return true, when segments are collinear.
*/
bool Collinear( const SEG& aSeg ) const
{
ecoord qa1 = a.y - b.y;
ecoord qb1 = b.x - a.x;
ecoord qc1 = -qa1 * a.x - qb1 * a.y;
ecoord qa2 = aSeg.a.y - aSeg.b.y;
ecoord qb2 = aSeg.b.x - aSeg.a.x;
ecoord qc2 = -qa2 * aSeg.a.x - qb2 * aSeg.a.y;
/**
* Function Distance()
*
* Computes minimum Euclidean distance to point aP.
* @param aP the point
* @return minimum distance
*/
ecoord SquaredDistance( const VECTOR2I& aP ) const
{
return ( NearestPoint( aP ) - aP ).SquaredEuclideanNorm();
}
return ( qa1 == qa2 ) && ( qb1 == qb2 ) && ( qc1 == qc2 );
}
int Distance( const VECTOR2I& aP ) const
{
return sqrt( SquaredDistance( aP ) );
}
/**
* Function Length()
*
* Returns the length (this)
* @return length
*/
int Length() const
{
return ( a - b ).EuclideanNorm();
}
/**
* Function Collinear()
*
* Checks if segment aSeg lies on the same line as (this).
* @param aSeg the segment to chech colinearity with
* @return true, when segments are collinear.
*/
bool Collinear( const SEG& aSeg ) const
{
ecoord qa1 = A.y - B.y;
ecoord qb1 = B.x - A.x;
ecoord qc1 = -qa1 * A.x - qb1 * A.y;
ecoord qa2 = aSeg.A.y - aSeg.B.y;
ecoord qb2 = aSeg.B.x - aSeg.A.x;
ecoord qc2 = -qa2 * aSeg.A.x - qb2 * aSeg.A.y;
ecoord SquaredLength() const
{
return ( a - b ).SquaredEuclideanNorm();
}
return ( qa1 == qa2 ) && ( qb1 == qb2 ) && ( qc1 == qc2 );
}
/**
* Function Index()
*
* Return the index of this segment in its parent shape (applicable only to non-local segments)
* @return index value
*/
int Index() const
{
return m_index;
}
/**
* Function Length()
*
* Returns the length (this)
* @return length
*/
int Length() const
{
return ( A - B ).EuclideanNorm();
}
bool Contains( const VECTOR2I& aP ) const;
ecoord SquaredLength() const
{
return ( A - B ).SquaredEuclideanNorm();
}
bool PointCloserThan( const VECTOR2I& aP, int aDist ) const;
/**
* Function Index()
*
* Return the index of this segment in its parent shape (applicable only to non-local segments)
* @return index value
*/
int Index() const
{
return m_index;
}
// friend std::ostream& operator<<( std::ostream& stream, const SEG& aSeg );
private:
bool ccw( const VECTOR2I& aA, const VECTOR2I& aB, const VECTOR2I &aC ) const;
bool Contains( const VECTOR2I& aP ) const;
///> locally stored start/end coordinates (used when m_is_local == true)
VECTOR2I m_a, m_b;
bool PointCloserThan( const VECTOR2I& aP, int aDist ) const;
///> index withing the parent shape (used when m_is_local == false)
int m_index;
// friend std::ostream& operator<<( std::ostream& stream, const SEG& aSeg );
private:
bool ccw( const VECTOR2I& aA, const VECTOR2I& aB, const VECTOR2I &aC ) const;
///> locality flag
bool m_is_local;
///> locally stored start/end coordinates (used when m_is_local == true)
VECTOR2I m_a, m_b;
///> index withing the parent shape (used when m_is_local == false)
int m_index;
///> locality flag
bool m_is_local;
};
inline VECTOR2I SEG::LineProject( const VECTOR2I& aP ) const
{
// fixme: numerical errors for large integers
@ -302,45 +307,47 @@ inline VECTOR2I SEG::LineProject( const VECTOR2I& aP ) const
return VECTOR2I( 0, 0 );
}
inline int SEG::LineDistance( const VECTOR2I& aP, bool aDetermineSide ) const
{
ecoord p = a.y - b.y;
ecoord q = b.x - a.x;
ecoord r = -p * a.x - q * a.y;
ecoord p = A.y - B.y;
ecoord q = B.x - A.x;
ecoord r = -p * A.x - q * A.y;
ecoord dist = ( p * aP.x + q * aP.y + r ) / sqrt( p * p + q * q );
return aDetermineSide ? dist : abs( dist );
}
inline const VECTOR2I SEG::NearestPoint( const VECTOR2I& aP ) const
{
VECTOR2I d = b - a;
VECTOR2I d = B - A;
ecoord l_squared = d.Dot( d );
if( l_squared == 0 )
return a;
return A;
ecoord t = d.Dot( aP - a );
ecoord t = d.Dot( aP - A );
if( t < 0 )
return a;
return A;
else if( t > l_squared )
return b;
return B;
int xp = rescale( t, (ecoord)d.x, l_squared );
int yp = rescale( t, (ecoord)d.y, l_squared );
return a + VECTOR2I( xp, yp );
return A + VECTOR2I( xp, yp );
}
inline std::ostream& operator<<( std::ostream& aStream, const SEG& aSeg )
{
if( aSeg.m_is_local )
aStream << "[ local " << aSeg.a << " - " << aSeg.b << " ]";
aStream << "[ local " << aSeg.A << " - " << aSeg.B << " ]";
return aStream;
}
#endif // __SEG_H

View File

@ -31,11 +31,11 @@
#include <geometry/seg.h>
/**
* Enum ShapeType
* Enum SHAPE_TYPE
* Lists all supported shapes
*/
enum ShapeType
enum SHAPE_TYPE
{
SH_RECT = 0, ///> axis-aligned rectangle
SH_SEGMENT, ///> line segment
@ -50,101 +50,108 @@ enum ShapeType
*/
class SHAPE
{
protected:
typedef VECTOR2I::extended_type ecoord;
protected:
typedef VECTOR2I::extended_type ecoord;
public:
/**
* Constructor
*
* Creates an empty shape of type aType
*/
public:
/**
* Constructor
*
* Creates an empty shape of type aType
*/
SHAPE ( ShapeType aType ) : m_type( aType ) { };
SHAPE ( SHAPE_TYPE aType ) : m_type( aType )
{}
// Destructor
virtual ~SHAPE() {};
// Destructor
virtual ~SHAPE()
{}
/**
* Function Type()
*
* Returns the type of the shape.
* @retval the type
*/
ShapeType Type() const { return m_type; }
/**
* Function Type()
*
* Returns the type of the shape.
* @retval the type
*/
SHAPE_TYPE Type() const
{
return m_type;
}
/**
* Function Clone()
*
* Returns a dynamically allocated copy of the shape
* @retval copy of the shape
*/
virtual SHAPE* Clone() const
{
assert( false );
return NULL;
};
/**
* Function Clone()
*
* Returns a dynamically allocated copy of the shape
* @retval copy of the shape
*/
virtual SHAPE* Clone() const
{
assert( false );
return NULL;
};
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the point aP than aClearance, indicating
* a collision.
* @return true, if there is a collision.
*/
virtual bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const
{
return Collide( SEG( aP, aP ), aClearance );
}
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the point aP than aClearance,
* indicating a collision.
* @return true, if there is a collision.
*/
virtual bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const
{
return Collide( SEG( aP, aP ), aClearance );
}
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the shape aShape than aClearance, indicating
* a collision.
* @param aShape shape to check collision against
* @param aClearance minimum clearance
* @param aMTV minimum translation vector
* @return true, if there is a collision.
*/
virtual bool Collide( const SHAPE* aShape, int aClerance, VECTOR2I& aMTV ) const;
virtual bool Collide( const SHAPE* aShape, int aClerance = 0 ) const;
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the shape aShape than aClearance,
* indicating a collision.
* @param aShape shape to check collision against
* @param aClearance minimum clearance
* @param aMTV minimum translation vector
* @return true, if there is a collision.
*/
virtual bool Collide( const SHAPE* aShape, int aClerance, VECTOR2I& aMTV ) const;
virtual bool Collide( const SHAPE* aShape, int aClerance = 0 ) const;
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the segment aSeg than aClearance, indicating
* a collision.
* @return true, if there is a collision.
*/
virtual bool Collide( const SEG& aSeg, int aClearance = 0 ) const = 0;
/**
* Function Collide()
*
* Checks if the boundary of shape (this) lies closer to the segment aSeg than aClearance,
* indicating a collision.
* @return true, if there is a collision.
*/
virtual bool Collide( const SEG& aSeg, int aClearance = 0 ) const = 0;
/**
* Function Collide()
*
* Computes a bounding box of the shape, with a margin of aClearance
* a collision.
* @aClearance how much the bounding box is expanded wrs to the minimum enclosing rectangle for the shape.
* @return the bounding box.
*/
virtual const BOX2I BBox( int aClearance = 0 ) const = 0;
/**
* Function Collide()
*
* Computes a bounding box of the shape, with a margin of aClearance
* a collision.
* @aClearance how much the bounding box is expanded wrs to the minimum enclosing rectangle
* for the shape.
* @return the bounding box.
*/
virtual const BOX2I BBox( int aClearance = 0 ) const = 0;
/**
* Function Centre()
*
* Computes a center-of-mass of the shape
* @return the center-of-mass point
*/
virtual VECTOR2I Centre() const
{
return BBox( 0 ).Centre(); // if nothing better is available....
}
/**
* Function Centre()
*
* Computes a center-of-mass of the shape
* @return the center-of-mass point
*/
virtual VECTOR2I Centre() const
{
return BBox( 0 ).Centre(); // if nothing better is available....
}
private:
///> type of our shape
ShapeType m_type;
private:
///> type of our shape
SHAPE_TYPE m_type;
};
bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance, bool aNeedMTV, VECTOR2I& aMTV );
bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance,
bool aNeedMTV, VECTOR2I& aMTV );
#endif // __SHAPE_H

View File

@ -31,12 +31,15 @@ class SHAPE_CIRCLE : public SHAPE
{
public:
SHAPE_CIRCLE() :
SHAPE( SH_CIRCLE ), m_radius( 0 ) {};
SHAPE( SH_CIRCLE ), m_radius( 0 )
{}
SHAPE_CIRCLE( const VECTOR2I& aCenter, int aRadius ) :
SHAPE( SH_CIRCLE ), m_radius( aRadius ), m_center( aCenter ) {};
SHAPE( SH_CIRCLE ), m_radius( aRadius ), m_center( aCenter )
{}
~SHAPE_CIRCLE() {};
~SHAPE_CIRCLE()
{}
const BOX2I BBox( int aClearance = 0 ) const
{

View File

@ -36,16 +36,16 @@ const SHAPE* defaultShapeFunctor( const T aItem )
template <class T, const SHAPE* (ShapeFunctor) (const T) = defaultShapeFunctor<T> >
class SHAPE_INDEX_LIST
{
struct ShapeEntry
struct SHAPE_ENTRY
{
ShapeEntry( T aParent )
SHAPE_ENTRY( T aParent )
{
shape = ShapeFunctor( aParent );
bbox = shape->BBox( 0 );
parent = aParent;
}
~ShapeEntry()
~SHAPE_ENTRY()
{
}
@ -54,21 +54,24 @@ class SHAPE_INDEX_LIST
BOX2I bbox;
};
typedef std::vector<ShapeEntry> ShapeVec;
typedef typename std::vector<ShapeEntry>::iterator ShapeVecIter;
typedef std::vector<SHAPE_ENTRY> SHAPE_VEC;
typedef typename std::vector<SHAPE_ENTRY>::iterator SHAPE_VEC_ITER;
public:
// "Normal" iterator interface, for STL algorithms.
class iterator
{
public:
iterator() {};
iterator()
{}
iterator( ShapeVecIter aCurrent ) :
m_current( aCurrent ) {};
iterator( SHAPE_VEC_ITER aCurrent ) :
m_current( aCurrent )
{}
iterator( const iterator& aB ) :
m_current( aB.m_current ) {};
m_current( aB.m_current )
{}
T operator*() const
{
@ -103,7 +106,7 @@ public:
}
private:
ShapeVecIter m_current;
SHAPE_VEC_ITER m_current;
};
// "Query" iterator, for iterating over a set of spatially matching shapes.
@ -114,7 +117,7 @@ public:
{
}
query_iterator( ShapeVecIter aCurrent, ShapeVecIter aEnd, SHAPE* aShape,
query_iterator( SHAPE_VEC_ITER aCurrent, SHAPE_VEC_ITER aEnd, SHAPE* aShape,
int aMinDistance, bool aExact ) :
m_end( aEnd ),
m_current( aCurrent ),
@ -122,80 +125,80 @@ public:
m_minDistance( aMinDistance ),
m_exact( aExact )
{
if( aShape )
{
m_refBBox = aShape->BBox();
next();
}
}
query_iterator( const query_iterator& aB ) :
m_end( aB.m_end ),
m_current( aB.m_current ),
m_shape( aB.m_shape ),
m_minDistance( aB.m_minDistance ),
m_exact( aB.m_exact ),
m_refBBox( aB.m_refBBox )
{
}
T operator*() const
{
return (*m_current).parent;
}
query_iterator& operator++()
{
++m_current;
if( aShape )
{
m_refBBox = aShape->BBox();
next();
return *this;
}
}
query_iterator& operator++( int aDummy )
{
++m_current;
next();
return *this;
}
query_iterator( const query_iterator& aB ) :
m_end( aB.m_end ),
m_current( aB.m_current ),
m_shape( aB.m_shape ),
m_minDistance( aB.m_minDistance ),
m_exact( aB.m_exact ),
m_refBBox( aB.m_refBBox )
{
}
bool operator==( const query_iterator& aRhs ) const
{
return m_current == aRhs.m_current;
}
T operator*() const
{
return (*m_current).parent;
}
bool operator!=( const query_iterator& aRhs ) const
{
return m_current != aRhs.m_current;
}
query_iterator& operator++()
{
++m_current;
next();
return *this;
}
const query_iterator& operator=( const query_iterator& aRhs )
{
m_end = aRhs.m_end;
m_current = aRhs.m_current;
m_shape = aRhs.m_shape;
m_minDistance = aRhs.m_minDistance;
m_exact = aRhs.m_exact;
m_refBBox = aRhs.m_refBBox;
return *this;
}
query_iterator& operator++( int aDummy )
{
++m_current;
next();
return *this;
}
private:
void next()
bool operator==( const query_iterator& aRhs ) const
{
return m_current == aRhs.m_current;
}
bool operator!=( const query_iterator& aRhs ) const
{
return m_current != aRhs.m_current;
}
const query_iterator& operator=( const query_iterator& aRhs )
{
m_end = aRhs.m_end;
m_current = aRhs.m_current;
m_shape = aRhs.m_shape;
m_minDistance = aRhs.m_minDistance;
m_exact = aRhs.m_exact;
m_refBBox = aRhs.m_refBBox;
return *this;
}
private:
void next()
{
while( m_current != m_end )
{
while( m_current != m_end )
if( m_refBBox.Distance( m_current->bbox ) <= m_minDistance )
{
if( m_refBBox.Distance( m_current->bbox ) <= m_minDistance )
{
if( !m_exact || m_current->shape->Collide( m_shape, m_minDistance ) )
return;
}
++m_current;
if( !m_exact || m_current->shape->Collide( m_shape, m_minDistance ) )
return;
}
}
ShapeVecIter m_end;
ShapeVecIter m_current;
++m_current;
}
}
SHAPE_VEC_ITER m_end;
SHAPE_VEC_ITER m_current;
BOX2I m_refBBox;
bool m_exact;
SHAPE* m_shape;
@ -204,14 +207,14 @@ public:
void Add( T aItem )
{
ShapeEntry s( aItem );
SHAPE_ENTRY s( aItem );
m_shapes.push_back( s );
}
void Remove( const T aItem )
{
ShapeVecIter i;
SHAPE_VEC_ITER i;
for( i = m_shapes.begin(); i != m_shapes.end(); ++i )
{
@ -233,7 +236,7 @@ public:
template <class Visitor>
int Query( const SHAPE* aShape, int aMinDistance, Visitor& aV, bool aExact = true ) // const
{
ShapeVecIter i;
SHAPE_VEC_ITER i;
int n = 0;
VECTOR2I::extended_type minDistSq = (VECTOR2I::extended_type) aMinDistance * aMinDistance;
@ -282,7 +285,7 @@ public:
}
private:
ShapeVec m_shapes;
SHAPE_VEC m_shapes;
};
#endif

View File

@ -38,504 +38,510 @@
* Class SHAPE_LINE_CHAIN
*
* Represents a polyline (an zero-thickness chain of connected line segments).
* I purposedly didn't name it "polyline" to avoid confusion with the existing CPolyLine class in pcbnew.
* I purposedly didn't name it "polyline" to avoid confusion with the existing CPolyLine
* class in pcbnew.
*
* SHAPE_LINE_CHAIN class shall not be used for polygons!
*/
class SHAPE_LINE_CHAIN : public SHAPE {
private:
typedef std::vector<VECTOR2I>::iterator point_iter;
typedef std::vector<VECTOR2I>::const_iterator point_citer;
class SHAPE_LINE_CHAIN : public SHAPE
{
private:
typedef std::vector<VECTOR2I>::iterator point_iter;
typedef std::vector<VECTOR2I>::const_iterator point_citer;
public:
public:
/**
* Struct INTERSECTION
*
* Represents an intersection between two line segments
*/
struct INTERSECTION
{
/// segment belonging from the (this) argument of Intersect()
SEG our;
/// segment belonging from the aOther argument of Intersect()
SEG their;
/// point of intersection between our and their.
VECTOR2I p;
};
/**
* Struct Intersection
*
* Represents an intersection between two line segments
*/
struct Intersection
typedef std::vector<INTERSECTION> INTERSECTIONS;
/**
* Constructor
* Initializes an empty line chain.
*/
SHAPE_LINE_CHAIN() :
SHAPE( SH_LINE_CHAIN ), m_closed( false )
{}
/**
* Copy Constructor
*/
SHAPE_LINE_CHAIN( const SHAPE_LINE_CHAIN& aShape ) :
SHAPE( SH_LINE_CHAIN ), m_points( aShape.m_points ), m_closed( aShape.m_closed )
{}
/**
* Constructor
* Initializes a 2-point line chain (a single segment)
*/
SHAPE_LINE_CHAIN( const VECTOR2I& aA, const VECTOR2I& aB ) :
SHAPE( SH_LINE_CHAIN ), m_closed( false )
{
m_points.resize( 2 );
m_points[0] = aA;
m_points[1] = aB;
}
SHAPE_LINE_CHAIN( const VECTOR2I& aA, const VECTOR2I& aB, const VECTOR2I& aC ) :
SHAPE( SH_LINE_CHAIN ), m_closed( false )
{
m_points.resize( 3 );
m_points[0] = aA;
m_points[1] = aB;
m_points[2] = aC;
}
SHAPE_LINE_CHAIN(const VECTOR2I* aV, int aCount ) :
SHAPE( SH_LINE_CHAIN ),
m_closed( false )
{
m_points.resize( aCount );
for( int i = 0; i < aCount; i++ )
m_points[i] = *aV++;
}
~SHAPE_LINE_CHAIN()
{}
/**
* Function Clear()
* Removes all points from the line chain.
*/
void Clear()
{
m_points.clear();
m_closed = false;
}
/**
* Function SetClosed()
*
* Marks the line chain as closed (i.e. with a segment connecting the last point with
* the first point).
* @param aClosed: whether the line chain is to be closed or not.
*/
void SetClosed( bool aClosed )
{
m_closed = aClosed;
}
/**
* Function IsClosed()
*
* @return aClosed: true, when our line is closed.
*/
bool IsClosed() const
{
return m_closed;
}
/**
* Function SegmentCount()
*
* Returns number of segments in this line chain.
* @return number of segments
*/
int SegmentCount() const
{
int c = m_points.size() - 1;
if( m_closed )
c++;
return std::max( 0, c );
}
/**
* Function PointCount()
*
* Returns the number of points (vertices) in this line chain
* @return number of points
*/
int PointCount() const
{
return m_points.size();
}
/**
* Function Segment()
*
* Returns a segment referencing to the segment (index) in the line chain.
* Modifying ends of the returned segment will modify corresponding points in the line chain.
* @param aIndex: index of the segment in the line chain. Negative values are counted from
* the end (i.e. -1 means the last segment in the line chain)
* @return SEG referenced to given segment in the line chain
*/
SEG Segment( int aIndex )
{
if( aIndex < 0 )
aIndex += SegmentCount();
if( aIndex == ( m_points.size() - 1 ) && m_closed )
return SEG( m_points[aIndex], m_points[0], aIndex );
else
return SEG( m_points[aIndex], m_points[aIndex + 1], aIndex );
}
/**
* Function CSegment()
*
* Returns a read-only segment referencing to the segment (index) in the line chain.
* @param aIndex: index of the segment in the line chain. Negative values are counted from
* the end (i.e. -1 means the last segment in the line chain)
* @return SEG referenced to given segment in the line chain
*/
const SEG CSegment( int aIndex ) const
{
if( aIndex < 0 )
aIndex += SegmentCount();
if( aIndex == ( m_points.size() - 1 ) && m_closed )
return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
const_cast<VECTOR2I&>( m_points[0] ), aIndex );
else
return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
const_cast<VECTOR2I&>( m_points[aIndex + 1] ), aIndex );
}
/**
* Function Point()
*
* Returns a reference to a given point in the line chain.
* @param aIndex index of the point
* @return reference to the point
*/
VECTOR2I& Point( int aIndex )
{
if( aIndex < 0 )
aIndex += PointCount();
return m_points[aIndex];
}
/**
* Function CPoint()
*
* Returns a const reference to a given point in the line chain.
* @param aIndex index of the point
* @return const reference to the point
*/
const VECTOR2I& CPoint( int aIndex ) const
{
if( aIndex < 0 )
aIndex += PointCount();
return m_points[aIndex];
}
/// @copydoc SHAPE::BBox()
const BOX2I BBox( int aClearance = 0 ) const
{
BOX2I bbox;
bbox.Compute( m_points );
return bbox;
}
/**
* Function Collide()
*
* Checks if point aP lies closer to us than aClearance.
* @param aP the point to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const;
/**
* Function Collide()
*
* Checks if box aBox lies closer to us than aClearance.
* @param aP the box to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const BOX2I& aBox, int aClearance = 0 ) const;
/**
* Function Collide()
*
* Checks if segment aSeg lies closer to us than aClearance.
* @param aSeg the segment to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const SEG& aSeg, int aClearance = 0 ) const;
/**
* Function Distance()
*
* Computes the minimum distance between the line chain and a point aP.
* @param aP the point
* @return minimum distance.
*/
int Distance( const VECTOR2I& aP ) const;
/**
* Function Reverse()
*
* Reverses point order in the line chain.
* @return line chain with reversed point order (original A-B-C-D: returned D-C-B-A)
*/
const SHAPE_LINE_CHAIN Reverse() const;
/**
* Function Length()
*
* Returns length of the line chain in Euclidean metric.
* @return length of the line chain
*/
int Length() const;
/**
* Function Append()
*
* Appends a new point at the end of the line chain.
* @param aX is X coordinate of the new point
* @param aY is Y coordinate of the new point
*/
void Append( int aX, int aY )
{
VECTOR2I v( aX, aY );
Append( v );
}
/**
* Function Append()
*
* Appends a new point at the end of the line chain.
* @param aP the new point
*/
void Append( const VECTOR2I& aP )
{
if( m_points.size() == 0 )
m_bbox = BOX2I( aP, VECTOR2I( 0, 0 ) );
if( m_points.size() == 0 || CPoint( -1 ) != aP )
{
/// segment belonging from the (this) argument of Intersect()
SEG our;
/// segment belonging from the aOther argument of Intersect()
SEG their;
/// point of intersection between our and their.
VECTOR2I p;
};
m_points.push_back( aP );
m_bbox.Merge( aP );
}
}
typedef std::vector<Intersection> Intersections;
/**
* Function Append()
*
* Appends another line chain at the end.
* @param aOtherLine the line chain to be appended.
*/
void Append( const SHAPE_LINE_CHAIN& aOtherLine )
{
if( aOtherLine.PointCount() == 0 )
return;
/**
* Constructor
* Initializes an empty line chain.
*/
SHAPE_LINE_CHAIN():
SHAPE( SH_LINE_CHAIN ), m_closed( false ) {};
/**
* Copy Constructor
*/
SHAPE_LINE_CHAIN( const SHAPE_LINE_CHAIN& aShape ) :
SHAPE( SH_LINE_CHAIN ), m_points( aShape.m_points ), m_closed( aShape.m_closed ) {};
/**
* Constructor
* Initializes a 2-point line chain (a single segment)
*/
SHAPE_LINE_CHAIN( const VECTOR2I& aA, const VECTOR2I& aB ) :
SHAPE( SH_LINE_CHAIN ),
m_closed( false )
{
m_points.resize( 2 );
m_points[0] = aA;
m_points[1] = aB;
}
SHAPE_LINE_CHAIN( const VECTOR2I& aA, const VECTOR2I& aB, const VECTOR2I& aC ):
SHAPE( SH_LINE_CHAIN ),
m_closed( false )
{
m_points.resize( 3 );
m_points[0] = aA;
m_points[1] = aB;
m_points[2] = aC;
}
SHAPE_LINE_CHAIN(const VECTOR2I* aV, int aCount ) :
SHAPE( SH_LINE_CHAIN ),
m_closed( false )
else if( PointCount() == 0 || aOtherLine.CPoint( 0 ) != CPoint( -1 ) )
{
m_points.resize( aCount );
for( int i = 0; i < aCount; i++ )
m_points[i] = *aV++;
const VECTOR2I p = aOtherLine.CPoint( 0 );
m_points.push_back( p );
m_bbox.Merge( p );
}
~SHAPE_LINE_CHAIN() {};
/**
* Function Clear()
* Removes all points from the line chain.
*/
void Clear()
for( int i = 1; i < aOtherLine.PointCount(); i++ )
{
m_points.clear();
m_closed = false;
const VECTOR2I p = aOtherLine.CPoint( i );
m_points.push_back( p );
m_bbox.Merge( p );
}
}
/**
* Function Replace()
*
* Replaces points with indices in range [start_index, end_index] with a single
* point aP.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
* @param aP replacement point
*/
void Replace( int aStartIndex, int aEndIndex, const VECTOR2I& aP );
/**
* Function Replace()
*
* Replaces points with indices in range [start_index, end_index] with the points from
* line chain aLine.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
* @param aLine replacement line chain.
*/
void Replace( int aStartIndex, int aEndIndex, const SHAPE_LINE_CHAIN& aLine );
/**
* Function Remove()
*
* Removes the range of points [start_index, end_index] from the line chain.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
*/
void Remove( int aStartIndex, int aEndIndex );
/**
* Function Split()
*
* Inserts the point aP belonging to one of the our segments, splitting the adjacent
* segment in two.
* @param aP the point to be inserted
* @return index of the newly inserted point (or a negative value if aP does not lie on
* our line)
*/
int Split( const VECTOR2I& aP );
/**
* Function Find()
*
* Searches for point aP.
* @param aP the point to be looked for
* @return index of the correspoinding point in the line chain or negative when not found.
*/
int Find ( const VECTOR2I& aP ) const;
/**
* Function Slice()
*
* Returns a subset of this line chain containing the [start_index, end_index] range of points.
* @param aStartIndex start of the point range to be returned (inclusive)
* @param aEndIndex end of the point range to be returned (inclusive)
* @return cut line chain.
*/
const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex = -1 ) const;
struct compareOriginDistance
{
compareOriginDistance( VECTOR2I& aOrigin ):
m_origin( aOrigin )
{}
bool operator()( const INTERSECTION& aA, const INTERSECTION& aB )
{
return ( m_origin - aA.p ).EuclideanNorm() < ( m_origin - aB.p ).EuclideanNorm();
}
/**
* Function SetClosed()
*
* Marks the line chain as closed (i.e. with a segment connecting the last point with the first point).
* @param aClosed: whether the line chain is to be closed or not.
*/
void SetClosed( bool aClosed )
VECTOR2I m_origin;
};
/**
* Function Intersect()
*
* Finds all intersection points between our line chain and the segment aSeg.
* @param aSeg the segment chain to find intersections with
* @param aIp reference to a vector to store found intersections. Intersection points
* are sorted with increasing distances from point aSeg.a.
* @return number of intersections found
*/
int Intersect( const SEG& aSeg, INTERSECTIONS& aIp ) const;
/**
* Function Intersect()
*
* Finds all intersection points between our line chain and the line chain aChain.
* @param aChain the line chain to find intersections with
* @param aIp reference to a vector to store found intersections. Intersection points
* are sorted with increasing path lengths from the starting point of aChain.
* @return number of intersections found
*/
int Intersect( const SHAPE_LINE_CHAIN& aChain, INTERSECTIONS& aIp ) const;
/**
* Function PathLength()
*
* Computes the walk path length from the beginning of the line chain and
* the point aP belonging to our line.
* @return: path length in Euclidean metric or negative if aP does not belong to
* the line chain.
*/
int PathLength( const VECTOR2I& aP ) const;
/**
* Function PointInside()
*
* Checks if point aP lies inside a convex polygon defined by the line chain. For closed
* shapes only.
* @param aP point to check
* @return true if the point is inside the shape (edge is not treated as being inside).
*/
bool PointInside( const VECTOR2I& aP ) const;
/**
* Function PointOnEdge()
*
* Checks if point aP lies on an edge or vertex of the line chain.
* @param aP point to check
* @return true if the point lies on the edge.
*/
bool PointOnEdge( const VECTOR2I& aP ) const;
/**
* Function SelfIntersecting()
*
* Checks if the line chain is self-intersecting.
* @return (optional) first found self-intersection point.
*/
const boost::optional<INTERSECTION> SelfIntersecting() const;
/**
* Function Simplify()
*
* Simplifies the line chain by removing colinear adjacent segments and duplicate vertices.
* @return reference to self.
*/
SHAPE_LINE_CHAIN& Simplify();
/**
* Function NearestPoint()
*
* Finds a point on the line chain that is closest to point aP.
* @return the nearest point.
*/
const VECTOR2I NearestPoint( const VECTOR2I& aP ) const;
/// @copydoc SHAPE::Format()
const std::string Format() const;
bool operator!=( const SHAPE_LINE_CHAIN& aRhs ) const
{
if( PointCount() != aRhs.PointCount() )
return true;
for( int i = 0; i < PointCount(); i++ )
{
m_closed = aClosed;
}
/**
* Function IsClosed()
*
* @return aClosed: true, when our line is closed.
*/
bool IsClosed() const
{
return m_closed;
}
/**
* Function SegmentCount()
*
* Returns number of segments in this line chain.
* @return number of segments
*/
int SegmentCount() const
{
int c = m_points.size() - 1;
if( m_closed )
c++;
return std::max( 0, c );
}
/**
* Function PointCount()
*
* Returns the number of points (vertices) in this line chain
* @return number of points
*/
int PointCount() const
{
return m_points.size();
}
/**
* Function Segment()
*
* Returns a segment referencing to the segment (index) in the line chain.
* Modifying ends of the returned segment will modify corresponding points in the line chain.
* @param aIndex: index of the segment in the line chain. Negative values are counted from the end (i.e. -1 means
* the last segment in the line chain)
* @return SEG referenced to given segment in the line chain
*/
SEG Segment( int aIndex )
{
if( aIndex < 0 )
aIndex += SegmentCount();
if( aIndex == ( m_points.size() - 1 ) && m_closed )
return SEG( m_points[aIndex], m_points[0], aIndex );
else
return SEG( m_points[aIndex], m_points[aIndex + 1], aIndex );
}
/**
* Function CSegment()
*
* Returns a read-only segment referencing to the segment (index) in the line chain.
* @param aIndex: index of the segment in the line chain. Negative values are counted from the end (i.e. -1 means
* the last segment in the line chain)
* @return SEG referenced to given segment in the line chain
*/
const SEG CSegment( int aIndex ) const
{
if( aIndex < 0 )
aIndex += SegmentCount();
if( aIndex == ( m_points.size() - 1 ) && m_closed )
return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
const_cast<VECTOR2I&>( m_points[0] ), aIndex );
else
return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
const_cast<VECTOR2I&>( m_points[aIndex + 1] ), aIndex );
}
/**
* Function Point()
*
* Returns a reference to a given point in the line chain.
* @param aIndex index of the point
* @return reference to the point
*/
VECTOR2I& Point( int aIndex )
{
if( aIndex < 0 )
aIndex += PointCount();
return m_points[aIndex];
}
/**
* Function CPoint()
*
* Returns a const reference to a given point in the line chain.
* @param aIndex index of the point
* @return const reference to the point
*/
const VECTOR2I& CPoint( int aIndex ) const
{
if( aIndex < 0 )
aIndex += PointCount();
return m_points[aIndex];
}
/// @copydoc SHAPE::BBox()
const BOX2I BBox( int aClearance = 0 ) const
{
BOX2I bbox;
bbox.Compute( m_points );
return bbox;
}
/**
* Function Collide()
*
* Checks if point aP lies closer to us than aClearance.
* @param aP the point to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const;
/**
* Function Collide()
*
* Checks if box aBox lies closer to us than aClearance.
* @param aP the box to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const BOX2I& aBox, int aClearance = 0 ) const;
/**
* Function Collide()
*
* Checks if segment aSeg lies closer to us than aClearance.
* @param aSeg the segment to check for collisions with
* @param aClearance minimum distance that does not qualify as a collision.
* @return true, when a collision has been found
*/
bool Collide( const SEG& aSeg, int aClearance = 0 ) const;
/**
* Function Distance()
*
* Computes the minimum distance between the line chain and a point aP.
* @param aP the point
* @return minimum distance.
*/
int Distance( const VECTOR2I& aP ) const;
/**
* Function Reverse()
*
* Reverses point order in the line chain.
* @return line chain with reversed point order (original A-B-C-D: returned D-C-B-A)
*/
const SHAPE_LINE_CHAIN Reverse() const;
/**
* Function Length()
*
* Returns length of the line chain in Euclidean metric.
* @return length of the line chain
*/
int Length() const;
/**
* Function Append()
*
* Appends a new point at the end of the line chain.
* @param aX is X coordinate of the new point
* @param aY is Y coordinate of the new point
*/
void Append( int aX, int aY )
{
VECTOR2I v( aX, aY );
Append( v );
}
/**
* Function Append()
*
* Appends a new point at the end of the line chain.
* @param aP the new point
*/
void Append( const VECTOR2I& aP )
{
if( m_points.size() == 0 )
m_bbox = BOX2I( aP, VECTOR2I( 0, 0 ) );
if( m_points.size() == 0 || CPoint( -1 ) != aP )
{
m_points.push_back( aP );
m_bbox.Merge( aP );
}
}
/**
* Function Append()
*
* Appends another line chain at the end.
* @param aOtherLine the line chain to be appended.
*/
void Append( const SHAPE_LINE_CHAIN& aOtherLine )
{
if( aOtherLine.PointCount() == 0 )
return;
else if( PointCount() == 0 || aOtherLine.CPoint( 0 ) != CPoint( -1 ) )
{
const VECTOR2I p = aOtherLine.CPoint( 0 );
m_points.push_back( p );
m_bbox.Merge( p );
}
for( int i = 1; i < aOtherLine.PointCount(); i++ )
{
const VECTOR2I p = aOtherLine.CPoint( i );
m_points.push_back( p );
m_bbox.Merge( p );
}
}
/**
* Function Replace()
*
* Replaces points with indices in range [start_index, end_index] with a single
* point aP.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
* @param aP replacement point
*/
void Replace( int aStartIndex, int aEndIndex, const VECTOR2I& aP );
/**
* Function Replace()
*
* Replaces points with indices in range [start_index, end_index] with the points from
* line chain aLine.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
* @param aLine replacement line chain.
*/
void Replace( int aStartIndex, int aEndIndex, const SHAPE_LINE_CHAIN& aLine );
/**
* Function Remove()
*
* Removes the range of points [start_index, end_index] from the line chain.
* @param aStartIndex start of the point range to be replaced (inclusive)
* @param aEndIndex end of the point range to be replaced (inclusive)
*/
void Remove( int aStartIndex, int aEndIndex );
/**
* Function Split()
*
* Inserts the point aP belonging to one of the our segments, splitting the adjacent
* segment in two.
* @param aP the point to be inserted
* @return index of the newly inserted point (or a negative value if aP does not lie on our line)
*/
int Split( const VECTOR2I& aP );
/**
* Function Find()
*
* Searches for point aP.
* @param aP the point to be looked for
* @return index of the correspoinding point in the line chain or negative when not found.
*/
int Find ( const VECTOR2I& aP ) const;
/**
* Function Slice()
*
* Returns a subset of this line chain containing the [start_index, end_index] range of points.
* @param aStartIndex start of the point range to be returned (inclusive)
* @param aEndIndex end of the point range to be returned (inclusive)
* @return cut line chain.
*/
const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex = -1) const;
struct compareOriginDistance
{
compareOriginDistance( VECTOR2I& aOrigin ):
m_origin( aOrigin ) {};
bool operator()( const Intersection& aA, const Intersection& aB )
{
return ( m_origin - aA.p ).EuclideanNorm() < ( m_origin - aB.p ).EuclideanNorm();
}
VECTOR2I m_origin;
};
/**
* Function Intersect()
*
* Finds all intersection points between our line chain and the segment aSeg.
* @param aSeg the segment chain to find intersections with
* @param aIp reference to a vector to store found intersections. Intersection points
* are sorted with increasing distances from point aSeg.a.
* @return number of intersections found
*/
int Intersect ( const SEG& aSeg, Intersections& aIp ) const;
/**
* Function Intersect()
*
* Finds all intersection points between our line chain and the line chain aChain.
* @param aChain the line chain to find intersections with
* @param aIp reference to a vector to store found intersections. Intersection points
* are sorted with increasing path lengths from the starting point of aChain.
* @return number of intersections found
*/
int Intersect( const SHAPE_LINE_CHAIN& aChain, Intersections& aIp ) const;
/**
* Function PathLength()
*
* Computes the walk path length from the beginning of the line chain and
* the point aP belonging to our line.
* @return: path length in Euclidean metric or negative if aP does not belong to the line chain.
*/
int PathLength( const VECTOR2I& aP ) const;
/**
* Function PointInside()
*
* Checks if point aP lies inside a convex polygon defined by the line chain. For closed
* shapes only.
* @param aP point to check
* @return true if the point is inside the shape (edge is not treated as being inside).
*/
bool PointInside( const VECTOR2I& aP ) const;
/**
* Function PointOnEdge()
*
* Checks if point aP lies on an edge or vertex of the line chain.
* @param aP point to check
* @return true if the point lies on the edge.
*/
bool PointOnEdge( const VECTOR2I& aP ) const;
/**
* Function SelfIntersecting()
*
* Checks if the line chain is self-intersecting.
* @return (optional) first found self-intersection point.
*/
const boost::optional<Intersection> SelfIntersecting() const;
/**
* Function Simplify()
*
* Simplifies the line chain by removing colinear adjacent segments and duplicate vertices.
* @return reference to self.
*/
SHAPE_LINE_CHAIN& Simplify();
/**
* Function NearestPoint()
*
* Finds a point on the line chain that is closest to point aP.
* @return the nearest point.
*/
const VECTOR2I NearestPoint( const VECTOR2I& aP ) const;
/// @copydoc SHAPE::Format()
const std::string Format() const;
bool operator!=( const SHAPE_LINE_CHAIN& aRhs ) const
{
if( PointCount() != aRhs.PointCount() )
if( CPoint( i ) != aRhs.CPoint( i ) )
return true;
for( int i = 0; i < PointCount(); i++ )
{
if( CPoint( i ) != aRhs.CPoint( i ) )
return true;
}
return false;
}
private:
/// array of vertices
std::vector<VECTOR2I> m_points;
return false;
}
/// is the line chain closed?
bool m_closed;
private:
/// array of vertices
std::vector<VECTOR2I> m_points;
/// cached bounding box
BOX2I m_bbox;
/// is the line chain closed?
bool m_closed;
/// cached bounding box
BOX2I m_bbox;
};
#endif // __SHAPE_LINE_CHAIN

View File

@ -32,126 +32,130 @@
class SHAPE_RECT : public SHAPE
{
public:
/**
* Constructor
* Creates an empty (0-sized) rectangle
*/
SHAPE_RECT() :
SHAPE( SH_RECT ), m_w( 0 ), m_h( 0 ) {};
public:
/**
* Constructor
* Creates an empty (0-sized) rectangle
*/
SHAPE_RECT() :
SHAPE( SH_RECT ), m_w( 0 ), m_h( 0 )
{}
/**
* Constructor
* Creates a rectangle defined by top-left corner (aX0, aY0), width aW and height aH.
*/
SHAPE_RECT( int aX0, int aY0, int aW, int aH ) :
SHAPE( SH_RECT ), m_p0( aX0, aY0 ), m_w( aW ), m_h( aH ) {};
/**
* Constructor
* Creates a rectangle defined by top-left corner (aX0, aY0), width aW and height aH.
*/
SHAPE_RECT( int aX0, int aY0, int aW, int aH ) :
SHAPE( SH_RECT ), m_p0( aX0, aY0 ), m_w( aW ), m_h( aH )
{}
/**
* Constructor
* Creates a rectangle defined by top-left corner aP0, width aW and height aH.
*/
SHAPE_RECT( const VECTOR2I& aP0, int aW, int aH ) :
SHAPE( SH_RECT ), m_p0( aP0 ), m_w( aW ), m_h( aH ) {};
/**
* Constructor
* Creates a rectangle defined by top-left corner aP0, width aW and height aH.
*/
SHAPE_RECT( const VECTOR2I& aP0, int aW, int aH ) :
SHAPE( SH_RECT ), m_p0( aP0 ), m_w( aW ), m_h( aH )
{}
/// @copydoc SHAPE::BBox()
const BOX2I BBox( int aClearance = 0 ) const
/// @copydoc SHAPE::BBox()
const BOX2I BBox( int aClearance = 0 ) const
{
BOX2I bbox( VECTOR2I( m_p0.x - aClearance, m_p0.y - aClearance ),
VECTOR2I( m_w + 2 * aClearance, m_h + 2 * aClearance ) );
//printf("bb : %s\n",bbox.Format().c_str());
return bbox;
}
/**
* Function Diagonal()
*
* Returns length of the diagonal of the rectangle
* @return diagonal length
*/
int Diagonal() const
{
return VECTOR2I( m_w, m_h ).EuclideanNorm();
}
/// @copydoc SHAPE::Collide()
bool Collide( const SEG& aSeg, int aClearance = 0 ) const
{
//VECTOR2I pmin = VECTOR2I( std::min( aSeg.a.x, aSeg.b.x ), std::min( aSeg.a.y, aSeg.b.y ) );
//VECTOR2I pmax = VECTOR2I( std::max( aSeg.a.x, aSeg.b.x ), std::max( aSeg.a.y, aSeg.b.y ));
//BOX2I r( pmin, VECTOR2I( pmax.x - pmin.x, pmax.y - pmin.y ) );
//if( BBox( 0 ).SquaredDistance( r ) > aClearance * aClearance )
// return false;
if( BBox( 0 ).Contains( aSeg.A ) || BBox( 0 ).Contains( aSeg.B ) )
return true;
VECTOR2I vts[] = { VECTOR2I( m_p0.x, m_p0.y ),
VECTOR2I( m_p0.x, m_p0.y + m_h ),
VECTOR2I( m_p0.x + m_w, m_p0.y + m_h ),
VECTOR2I( m_p0.x + m_w, m_p0.y ),
VECTOR2I( m_p0.x, m_p0.y ) };
for( int i = 0; i < 4; i++ )
{
BOX2I bbox( VECTOR2I( m_p0.x - aClearance, m_p0.y - aClearance ),
VECTOR2I( m_w + 2 * aClearance, m_h + 2 * aClearance ) );
//printf("bb : %s\n",bbox.Format().c_str());
return bbox;
}
SEG s( vts[i], vts[i + 1], i );
/**
* Function Diagonal()
*
* Returns length of the diagonal of the rectangle
* @return diagonal length
*/
int Diagonal() const
{
return VECTOR2I( m_w, m_h ).EuclideanNorm();
}
/// @copydoc SHAPE::Collide()
bool Collide( const SEG& aSeg, int aClearance = 0 ) const
{
//VECTOR2I pmin = VECTOR2I( std::min( aSeg.a.x, aSeg.b.x ), std::min( aSeg.a.y, aSeg.b.y ) );
//VECTOR2I pmax = VECTOR2I( std::max( aSeg.a.x, aSeg.b.x ), std::max( aSeg.a.y, aSeg.b.y ));
//BOX2I r( pmin, VECTOR2I( pmax.x - pmin.x, pmax.y - pmin.y ) );
//if( BBox( 0 ).SquaredDistance( r ) > aClearance * aClearance )
// return false;
if( BBox( 0 ).Contains( aSeg.a ) || BBox( 0 ).Contains( aSeg.b ) )
if( s.Distance( aSeg ) <= aClearance )
return true;
VECTOR2I vts[] = { VECTOR2I( m_p0.x, m_p0.y ),
VECTOR2I( m_p0.x, m_p0.y + m_h ),
VECTOR2I( m_p0.x + m_w, m_p0.y + m_h ),
VECTOR2I( m_p0.x + m_w, m_p0.y ),
VECTOR2I( m_p0.x, m_p0.y ) };
for( int i = 0; i < 4; i++ )
{
SEG s( vts[i], vts[i + 1], i );
if( s.Distance( aSeg ) <= aClearance )
return true;
}
return false;
};
/**
* Function GetPosition()
*
* @return top-left corner of the rectangle
*/
const VECTOR2I& GetPosition() const
{
return m_p0;
}
/**
* Function GetSize()
*
* @return size of the rectangle
*/
const VECTOR2I GetSize() const
{
return VECTOR2I( m_w, m_h );
}
return false;
}
/**
* Function GetWidth()
*
* @return width of the rectangle
*/
const int GetWidth() const
{
return m_w;
}
/**
* Function GetPosition()
*
* @return top-left corner of the rectangle
*/
const VECTOR2I& GetPosition() const
{
return m_p0;
}
/**
* Function GetHeight()
*
* @return height of the rectangle
*/
const int GetHeight() const
{
return m_h;
}
/**
* Function GetSize()
*
* @return size of the rectangle
*/
const VECTOR2I GetSize() const
{
return VECTOR2I( m_w, m_h );
}
private:
///> Top-left corner
VECTOR2I m_p0;
/**
* Function GetWidth()
*
* @return width of the rectangle
*/
const int GetWidth() const
{
return m_w;
}
///> Width
int m_w;
/**
* Function GetHeight()
*
* @return height of the rectangle
*/
const int GetHeight() const
{
return m_h;
}
///> Height
int m_h;
};
private:
///> Top-left corner
VECTOR2I m_p0;
///> Width
int m_w;
///> Height
int m_h;
};
#endif // __SHAPE_RECT_H

View File

@ -35,17 +35,17 @@
*/
template <typename T>
T rescale( T numerator, T value, T denominator )
T rescale( T aNumerator, T aValue, T aDenominator )
{
return numerator * value / denominator;
return aNumerator * aValue / aDenominator;
}
// explicit specializations for integer types, taking care of overflow.
template <>
int rescale( int numerator, int value, int denominator );
int rescale( int aNumerator, int aValue, int aDenominator );
template <>
int64_t rescale( int64_t numerator, int64_t value, int64_t denominator );
int64_t rescale( int64_t aNumerator, int64_t aValue, int64_t aDenominator );
#endif // __MATH_UTIL_H

View File

@ -55,7 +55,7 @@ template <class T>
class MATRIX3x3;
template <class T>
std::ostream& operator<<( std::ostream& stream, const MATRIX3x3<T>& matrix );
std::ostream& operator<<( std::ostream& aStream, const MATRIX3x3<T>& aMatrix );
template <class T>
class MATRIX3x3
@ -92,7 +92,7 @@ public:
*
* The diagonal components of the matrix are set to 1.
*/
void SetIdentity( void );
void SetIdentity();
/**
* @brief Set the translation components of the matrix.
@ -106,7 +106,7 @@ public:
*
* @return is the translation (2D-vector).
*/
VECTOR2<T> GetTranslation( void ) const;
VECTOR2<T> GetTranslation() const;
/**
* @brief Set the rotation components of the matrix.
@ -129,14 +129,14 @@ public:
*
* @return the scale factors, specified as 2D-vector.
*/
VECTOR2<T> GetScale( void ) const;
VECTOR2<T> GetScale() const;
/**
* @brief Compute the determinant of the matrix.
*
* @return the determinant value.
*/
T Determinant( void ) const;
T Determinant() const;
/**
* @brief Determine the inverse of the matrix.
@ -148,33 +148,33 @@ public:
*
* @return the inverse matrix.
*/
MATRIX3x3 Inverse( void ) const;
MATRIX3x3 Inverse() const;
/**
* @brief Get the transpose of the matrix.
*
* @return the transpose matrix.
*/
MATRIX3x3 Transpose( void ) const;
MATRIX3x3 Transpose() const;
/**
* @brief Output to a stream.
*/
friend std::ostream& operator<<<T>( std::ostream& stream, const MATRIX3x3<T>& matrix );
friend std::ostream& operator<<<T>( std::ostream& aStream, const MATRIX3x3<T>& aMatrix );
};
// Operators
//! @brief Matrix multiplication
template <class T> MATRIX3x3<T> const operator*( MATRIX3x3<T> const& a, MATRIX3x3<T> const& b );
template <class T> MATRIX3x3<T> const operator*( MATRIX3x3<T> const& aA, MATRIX3x3<T> const& aB );
//! @brief Multiplication with a 2D vector, the 3rd z-component is assumed to be 1
template <class T> VECTOR2<T> const operator*( MATRIX3x3<T> const& a, VECTOR2<T> const& b );
template <class T> VECTOR2<T> const operator*( MATRIX3x3<T> const& aA, VECTOR2<T> const& aB );
//! @brief Multiplication with a scalar
template <class T, class S> MATRIX3x3<T> const operator*( MATRIX3x3<T> const& a, T scalar );
template <class T, class S> MATRIX3x3<T> const operator*( T scalar, MATRIX3x3<T> const& matrix );
template <class T, class S> MATRIX3x3<T> const operator*( MATRIX3x3<T> const& aA, T aScalar );
template <class T, class S> MATRIX3x3<T> const operator*( T aScalar, MATRIX3x3<T> const& aMatrix );
// ----------------------
// --- Implementation ---
@ -235,11 +235,12 @@ void MATRIX3x3<T>::SetTranslation( VECTOR2<T> aTranslation )
template <class T>
VECTOR2<T> MATRIX3x3<T>::GetTranslation( void ) const
VECTOR2<T> MATRIX3x3<T>::GetTranslation() const
{
VECTOR2<T> result;
result.x = m_data[0][2];
result.y = m_data[1][2];
return result;
}
@ -265,15 +266,16 @@ void MATRIX3x3<T>::SetScale( VECTOR2<T> aScale )
template <class T>
VECTOR2<T> MATRIX3x3<T>::GetScale( void ) const
VECTOR2<T> MATRIX3x3<T>::GetScale() const
{
VECTOR2<T> result( m_data[0][0], m_data[1][1] );
return result;
}
template <class T>
MATRIX3x3<T> const operator*( MATRIX3x3<T> const& a, MATRIX3x3<T> const& b )
MATRIX3x3<T> const operator*( MATRIX3x3<T> const& aA, MATRIX3x3<T> const& aB )
{
MATRIX3x3<T> result;
@ -281,8 +283,9 @@ MATRIX3x3<T> const operator*( MATRIX3x3<T> const& a, MATRIX3x3<T> const& b )
{
for( int j = 0; j < 3; j++ )
{
result.m_data[i][j] = a.m_data[i][0] * b.m_data[0][j] + a.m_data[i][1] * b.m_data[1][j]
+ a.m_data[i][2] * b.m_data[2][j];
result.m_data[i][j] = aA.m_data[i][0] * aB.m_data[0][j] +
aA.m_data[i][1] * aB.m_data[1][j] +
aA.m_data[i][2] * aB.m_data[2][j];
}
}
@ -291,21 +294,20 @@ MATRIX3x3<T> const operator*( MATRIX3x3<T> const& a, MATRIX3x3<T> const& b )
template <class T>
VECTOR2<T> const operator*( MATRIX3x3<T> const& matrix,
VECTOR2<T> const& vector )
VECTOR2<T> const operator*( MATRIX3x3<T> const& aMatrix, VECTOR2<T> const& aVector )
{
VECTOR2<T> result( 0, 0 );
result.x = matrix.m_data[0][0] * vector.x + matrix.m_data[0][1] * vector.y
+ matrix.m_data[0][2];
result.y = matrix.m_data[1][0] * vector.x + matrix.m_data[1][1] * vector.y
+ matrix.m_data[1][2];
result.x = aMatrix.m_data[0][0] * aVector.x + aMatrix.m_data[0][1] * aVector.y
+ aMatrix.m_data[0][2];
result.y = aMatrix.m_data[1][0] * aVector.x + aMatrix.m_data[1][1] * aVector.y
+ aMatrix.m_data[1][2];
return result;
}
template <class T>
T MATRIX3x3<T>::Determinant( void ) const
T MATRIX3x3<T>::Determinant() const
{
return m_data[0][0] * ( m_data[1][1] * m_data[2][2] - m_data[1][2] * m_data[2][1] )
- m_data[0][1] * ( m_data[1][0] * m_data[2][2] - m_data[1][2] * m_data[2][0] )
@ -314,7 +316,7 @@ T MATRIX3x3<T>::Determinant( void ) const
template <class T, class S>
MATRIX3x3<T> const operator*( MATRIX3x3<T> const& matrix, S scalar )
MATRIX3x3<T> const operator*( MATRIX3x3<T> const& aMatrix, S aScalar )
{
MATRIX3x3<T> result;
@ -322,7 +324,7 @@ MATRIX3x3<T> const operator*( MATRIX3x3<T> const& matrix, S scalar )
{
for( int j = 0; j < 3; j++ )
{
result.m_data[i][j] = matrix.m_data[i][j] * scalar;
result.m_data[i][j] = aMatrix.m_data[i][j] * aScalar;
}
}
@ -331,9 +333,9 @@ MATRIX3x3<T> const operator*( MATRIX3x3<T> const& matrix, S scalar )
template <class T, class S>
MATRIX3x3<T> const operator*( S scalar, MATRIX3x3<T> const& matrix )
MATRIX3x3<T> const operator*( S aScalar, MATRIX3x3<T> const& aMatrix )
{
return matrix * scalar;
return aMatrix * aScalar;
}

View File

@ -62,7 +62,7 @@ struct VECTOR2_TRAITS<int>
template <class T>
class VECTOR2;
template <class T>
std::ostream& operator<<( std::ostream& stream, const VECTOR2<T>& vector );
std::ostream& operator<<( std::ostream& aStream, const VECTOR2<T>& aVector );
/**
* Class VECTOR2
@ -351,6 +351,8 @@ VECTOR2<T>& VECTOR2<T>::operator-=( const T& aScalar )
y -= aScalar;
return *this;
}
template <class T>
VECTOR2<T> VECTOR2<T>::Rotate( double aAngle ) const
{

View File

@ -108,9 +108,9 @@ public:
* Yield with a value - passes a value of given type to the caller.
* Useful for implementing generator objects.
*/
void Yield( ReturnType& retVal )
void Yield( ReturnType& aRetVal )
{
m_retVal = retVal;
m_retVal = aRetVal;
boost::context::jump_fcontext( m_self, m_saved, 0 );
}
@ -130,7 +130,7 @@ public:
* @return true, if the coroutine has yielded and false if it has finished its
* execution (returned).
*/
bool Call( ArgType args )
bool Call( ArgType aArgs )
{
// fixme: Clean up stack stuff. Add a guard
m_stack = malloc( c_defaultStackSize );
@ -138,7 +138,7 @@ public:
// align to 16 bytes
void* sp = (void*) ( ( ( (ptrdiff_t) m_stack ) + m_stackSize - 0xf ) & ( ~0x0f ) );
m_args = &args;
m_args = &aArgs;
m_self = boost::context::make_fcontext( sp, m_stackSize, callerStub );
m_saved = new boost::context::fcontext_t();
@ -186,10 +186,10 @@ private:
static const int c_defaultStackSize = 2000000; // fixme: make configurable
/* real entry point of the coroutine */
static void callerStub( intptr_t data )
static void callerStub( intptr_t aData )
{
// get pointer to self
COROUTINE<ReturnType, ArgType>* cor = reinterpret_cast<COROUTINE<ReturnType, ArgType>*>( data );
COROUTINE<ReturnType, ArgType>* cor = reinterpret_cast<COROUTINE<ReturnType, ArgType>*>( aData );
// call the coroutine method
cor->m_retVal = cor->m_func( *cor->m_args );

View File

@ -45,17 +45,17 @@ public:
}
template <class T>
DELEGATE( T* object, ReturnType(T::* ptr)( Arg ) )
DELEGATE( T* aObject, ReturnType(T::* aPtr)( Arg ) )
{
m_ptr = reinterpret_cast<MemberPointer>( ptr );
m_object = reinterpret_cast<void*>( object );
m_ptr = reinterpret_cast<MemberPointer>( aPtr );
m_object = reinterpret_cast<void*>( aObject );
};
ReturnType operator()( Arg a ) const
ReturnType operator()( Arg aA ) const
{
DELEGATE<ReturnType, Arg>* casted = reinterpret_cast<DELEGATE<ReturnType, Arg>*>( m_object );
return (casted->*m_ptr)( a );
return (casted->*m_ptr)( aA );
}
private:
@ -79,10 +79,10 @@ public:
}
template <class T>
DELEGATE0( T* object, ReturnType(T::* ptr)() )
DELEGATE0( T* aObject, ReturnType(T::* aPtr)() )
{
m_ptr = reinterpret_cast<MemberPointer>( ptr );
m_object = reinterpret_cast<void*>( object );
m_ptr = reinterpret_cast<MemberPointer>( aPtr );
m_object = reinterpret_cast<void*>( aObject );
};

View File

@ -45,7 +45,7 @@
class TOOL_ACTION
{
public:
TOOL_ACTION( const std::string& aName, TOOL_ActionScope aScope = AS_CONTEXT,
TOOL_ACTION( const std::string& aName, TOOL_ACTION_SCOPE aScope = AS_CONTEXT,
int aDefaultHotKey = 0, const std::string& aMenuItem = std::string( "" ),
const std::string& aMenuDesc = std::string( "" ) ) :
m_name( aName ), m_scope( aScope ), m_defaultHotKey( aDefaultHotKey ),
@ -148,7 +148,7 @@ public:
*/
TOOL_EVENT MakeEvent() const
{
return TOOL_EVENT( TC_Command, TA_Action, m_name, m_scope );
return TOOL_EVENT( TC_COMMAND, TA_ACTION, m_name, m_scope );
}
const std::string& GetMenuItem() const
@ -190,7 +190,7 @@ private:
std::string m_name;
/// Scope of the action (ie. the event that is issued after activation).
TOOL_ActionScope m_scope;
TOOL_ACTION_SCOPE m_scope;
/// Default hot key that activates the action.
const int m_defaultHotKey;

View File

@ -40,13 +40,13 @@ class VIEW;
class VIEW_CONTROLS;
};
enum TOOL_Type
enum TOOL_TYPE
{
///> Tool that interacts with the user
TOOL_Interactive = 0x01,
INTERACTIVE = 0x01,
///> Tool that runs in the background without any user intervention
TOOL_Batch = 0x02
BATCH = 0x02
};
/// Unique identifier for tools
@ -62,7 +62,7 @@ typedef DELEGATE<int, TOOL_EVENT&> TOOL_STATE_FUNC;
class TOOL_BASE
{
public:
TOOL_BASE( TOOL_Type aType, TOOL_ID aId, const std::string& aName = std::string( "" ) ) :
TOOL_BASE( TOOL_TYPE aType, TOOL_ID aId, const std::string& aName = std::string( "" ) ) :
m_type( aType ),
m_toolId( aId ),
m_toolName( aName ),
@ -75,7 +75,7 @@ public:
* Returns the type of the tool.
* @return The type of the tool.
*/
TOOL_Type GetType() const
TOOL_TYPE GetType() const
{
return m_type;
}
@ -158,7 +158,7 @@ protected:
* Returns the model object if it matches the requested type.
*/
template <typename T>
T* getModel( KICAD_T modelType ) const
T* getModel( KICAD_T aModelType ) const
{
EDA_ITEM* m = getModelInt();
@ -166,7 +166,7 @@ protected:
}
///> Stores the type of the tool.
TOOL_Type m_type;
TOOL_TYPE m_type;
///> Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
TOOL_ID m_toolId;

View File

@ -32,7 +32,8 @@
class TOOL_MANAGER;
class PCB_BASE_FRAME;
namespace KIGFX {
namespace KIGFX
{
class VIEW;
};
@ -102,25 +103,25 @@ private:
int mods = 0;
if( aState->ControlDown() )
mods |= MD_ModCtrl;
mods |= MD_CTRL;
if( aState->AltDown() )
mods |= MD_ModAlt;
mods |= MD_ALT;
if( aState->ShiftDown() )
mods |= MD_ModShift;
mods |= MD_SHIFT;
return mods;
}
///> Stores all the informations regarding a mouse button state.
struct ButtonState;
struct BUTTON_STATE;
///> The last mouse cursor position (in world coordinates).
VECTOR2D m_lastMousePos;
///> State of mouse buttons.
std::vector<ButtonState*> m_buttons;
std::vector<BUTTON_STATE*> m_buttons;
///> Returns the instance of VIEW, used by the application.
KIGFX::VIEW* getView();

View File

@ -40,77 +40,77 @@ class TOOL_MANAGER;
* Internal (GUI-independent) event definitions.
* Enums are mostly self-explanatory.
*/
enum TOOL_EventCategory
enum TOOL_EVENT_CATEGORY
{
TC_None = 0x00,
TC_Mouse = 0x01,
TC_Keyboard = 0x02,
TC_Command = 0x04,
TC_Message = 0x08,
TC_View = 0x10,
TC_Any = 0xffffffff
TC_NONE = 0x00,
TC_MOUSE = 0x01,
TC_KEYBOARD = 0x02,
TC_COMMAND = 0x04,
TC_MESSAGE = 0x08,
TC_VIEW = 0x10,
TC_ANY = 0xffffffff
};
enum TOOL_Actions
enum TOOL_ACTIONS
{
// UI input events
TA_None = 0x0000,
TA_MouseClick = 0x0001,
TA_MouseUp = 0x0002,
TA_MouseDown = 0x0004,
TA_MouseDrag = 0x0008,
TA_MouseMotion = 0x0010,
TA_MouseWheel = 0x0020,
TA_Mouse = 0x003f,
TA_KeyUp = 0x0040,
TA_KeyDown = 0x0080,
TA_Keyboard = TA_KeyUp | TA_KeyDown,
TA_NONE = 0x0000,
TA_MOUSE_CLICK = 0x0001,
TA_MOUSE_UP = 0x0002,
TA_MOUSE_DOWN = 0x0004,
TA_MOUSE_DRAG = 0x0008,
TA_MOUSE_MOTION = 0x0010,
TA_MOUSE_WHEEL = 0x0020,
TA_MOUSE = 0x003f,
TA_KEY_UP = 0x0040,
TA_KEY_DOWN = 0x0080,
TA_KEYBOARD = TA_KEY_UP | TA_KEY_DOWN,
// View related events
TA_ViewRefresh = 0x0100,
TA_ViewZoom = 0x0200,
TA_ViewPan = 0x0400,
TA_ViewDirty = 0x0800,
TA_ChangeLayer = 0x1000,
TA_VIEW_REFRESH = 0x0100,
TA_VIEW_ZOOM = 0x0200,
TA_VIEW_PAN = 0x0400,
TA_VIEW_DIRTY = 0x0800,
TA_CHANGE_LAYER = 0x1000,
// Tool cancel event. Issued automagically when the user hits escape or selects End Tool from
// the context menu.
TA_CancelTool = 0x2000,
TA_CANCEL_TOOL = 0x2000,
// Context menu update. Issued whenever context menu is open and the user hovers the mouse
// over one of choices. Used in dynamic highligting in disambiguation menu
TA_ContextMenuUpdate = 0x4000,
TA_CONTEXT_MENU_UPDATE = 0x4000,
// Context menu choice. Sent if the user picked something from the context menu or
// closed it without selecting anything.
TA_ContextMenuChoice = 0x8000,
TA_CONTEXT_MENU_CHOICE = 0x8000,
// Tool action (allows to control tools)
TA_Action = 0x10000,
TA_ACTION = 0x10000,
TA_Any = 0xffffffff
TA_ANY = 0xffffffff
};
enum TOOL_MouseButtons
enum TOOL_MOUSE_BUTTONS
{
MB_None = 0x0,
MB_Left = 0x1,
MB_Right = 0x2,
MB_Middle = 0x4,
MB_ButtonMask = MB_Left | MB_Right | MB_Middle,
MB_Any = 0xffffffff
MB_NONE = 0x0,
MB_LEFT = 0x1,
MB_RIGHT = 0x2,
MB_MIDDLE = 0x4,
MB_BUTTON_MASK = MB_LEFT | MB_RIGHT | MB_MIDDLE,
MB_ANY = 0xffffffff
};
enum TOOL_Modifiers
enum TOOL_MODIFIERS
{
MD_ModShift = 0x1000,
MD_ModCtrl = 0x2000,
MD_ModAlt = 0x4000,
MD_ModifierMask = MD_ModShift | MD_ModCtrl | MD_ModAlt,
MD_SHIFT = 0x1000,
MD_CTRL = 0x2000,
MD_ALT = 0x4000,
MD_MODIFIER_MASK = MD_SHIFT | MD_CTRL | MD_ALT,
};
/// Scope of tool actions
enum TOOL_ActionScope
enum TOOL_ACTION_SCOPE
{
AS_CONTEXT = 1, ///> Action belongs to a particular tool (i.e. a part of a pop-up menu)
AS_ACTIVE, ///> All active tools
@ -141,8 +141,8 @@ public:
*/
const std::string Format() const;
TOOL_EVENT( TOOL_EventCategory aCategory = TC_None, TOOL_Actions aAction = TA_None,
TOOL_ActionScope aScope = AS_GLOBAL ) :
TOOL_EVENT( TOOL_EVENT_CATEGORY aCategory = TC_NONE, TOOL_ACTIONS aAction = TA_NONE,
TOOL_ACTION_SCOPE aScope = AS_GLOBAL ) :
m_category( aCategory ),
m_actions( aAction ),
m_scope( aScope ),
@ -150,52 +150,50 @@ public:
m_keyCode( 0 ),
m_modifiers( 0 ) {}
TOOL_EVENT( TOOL_EventCategory aCategory,
TOOL_Actions aAction,
int aExtraParam,
TOOL_ActionScope aScope = AS_GLOBAL ) :
TOOL_EVENT( TOOL_EVENT_CATEGORY aCategory, TOOL_ACTIONS aAction, int aExtraParam,
TOOL_ACTION_SCOPE aScope = AS_GLOBAL ) :
m_category( aCategory ),
m_actions( aAction ),
m_scope( aScope )
{
if( aCategory == TC_Mouse )
if( aCategory == TC_MOUSE )
{
m_mouseButtons = aExtraParam & MB_ButtonMask;
m_mouseButtons = aExtraParam & MB_BUTTON_MASK;
}
else if( aCategory == TC_Keyboard )
else if( aCategory == TC_KEYBOARD )
{
m_keyCode = aExtraParam & ~MD_ModifierMask; // Filter out modifiers
m_keyCode = aExtraParam & ~MD_MODIFIER_MASK; // Filter out modifiers
}
else if( aCategory == TC_Command )
else if( aCategory == TC_COMMAND )
{
m_commandId = aExtraParam;
}
if( aCategory & ( TC_Mouse | TC_Keyboard ) )
if( aCategory & ( TC_MOUSE | TC_KEYBOARD ) )
{
m_modifiers = aExtraParam & MD_ModifierMask;
m_modifiers = aExtraParam & MD_MODIFIER_MASK;
}
}
TOOL_EVENT( TOOL_EventCategory aCategory, TOOL_Actions aAction,
const std::string& aExtraParam, TOOL_ActionScope aScope = AS_GLOBAL ) :
TOOL_EVENT( TOOL_EVENT_CATEGORY aCategory, TOOL_ACTIONS aAction,
const std::string& aExtraParam, TOOL_ACTION_SCOPE aScope = AS_GLOBAL ) :
m_category( aCategory ),
m_actions( aAction ),
m_scope( aScope ),
m_mouseButtons( 0 )
{
if( aCategory == TC_Command )
if( aCategory == TC_COMMAND )
m_commandStr = aExtraParam;
}
///> Returns the category (eg. mouse/keyboard/action) of an event..
TOOL_EventCategory Category() const
TOOL_EVENT_CATEGORY Category() const
{
return m_category;
}
///> Returns more specific information about the type of an event.
TOOL_Actions Action() const
TOOL_ACTIONS Action() const
{
return m_actions;
}
@ -204,59 +202,59 @@ public:
///> where dragging has started.
const VECTOR2D Delta() const
{
assert( m_category == TC_Mouse ); // this should be used only with mouse events
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
return m_mouseDelta;
}
///> Returns mouse cursor position in world coordinates.
const VECTOR2D& Position() const
{
assert( m_category == TC_Mouse ); // this should be used only with mouse events
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
return m_mousePos;
}
///> Returns the point where dragging has started.
const VECTOR2D& DragOrigin() const
{
assert( m_category == TC_Mouse ); // this should be used only with mouse events
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
return m_mouseDragOrigin;
}
///> Returns information about mouse buttons state.
int Buttons() const
{
assert( m_category == TC_Mouse ); // this should be used only with mouse events
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
return m_mouseButtons;
}
bool IsClick( int aButtonMask = MB_Any ) const
bool IsClick( int aButtonMask = MB_ANY ) const
{
return ( m_actions == TA_MouseClick )
return ( m_actions == TA_MOUSE_CLICK )
&& ( ( m_mouseButtons & aButtonMask ) == aButtonMask );
}
bool IsDrag( int aButtonMask = MB_Any ) const
bool IsDrag( int aButtonMask = MB_ANY ) const
{
return ( m_actions == TA_MouseDrag ) && ( ( m_mouseButtons & aButtonMask ) == aButtonMask );
return ( m_actions == TA_MOUSE_DRAG ) && ( ( m_mouseButtons & aButtonMask ) == aButtonMask );
}
bool IsMouseUp( int aButtonMask = MB_Any ) const
bool IsMouseUp( int aButtonMask = MB_ANY ) const
{
return ( m_actions == TA_MouseUp ) && ( ( m_mouseButtons & aButtonMask ) == aButtonMask );
return ( m_actions == TA_MOUSE_UP ) && ( ( m_mouseButtons & aButtonMask ) == aButtonMask );
}
bool IsMotion() const
{
return m_actions == TA_MouseMotion;
return m_actions == TA_MOUSE_MOTION;
}
bool IsCancel() const
{
return m_actions == TA_CancelTool;
return m_actions == TA_CANCEL_TOOL;
}
///> Returns information about key modifiers state (Ctrl, Alt, etc.)
int Modifier( int aMask = MD_ModifierMask ) const
int Modifier( int aMask = MD_MODIFIER_MASK ) const
{
return m_modifiers & aMask;
}
@ -268,12 +266,12 @@ public:
bool IsKeyUp() const
{
return m_actions == TA_KeyUp;
return m_actions == TA_KEY_UP;
}
bool IsKeyDown() const
{
return m_actions == TA_KeyDown;
return m_actions == TA_KEY_DOWN;
}
void SetMouseDragOrigin( const VECTOR2D& aP )
@ -306,7 +304,7 @@ public:
if( !( m_actions & aEvent.m_actions ) )
return false;
if( m_category == TC_Command )
if( m_category == TC_COMMAND )
{
if( m_commandStr && aEvent.m_commandStr )
return *m_commandStr == *aEvent.m_commandStr;
@ -334,9 +332,9 @@ public:
private:
friend class TOOL_MANAGER;
TOOL_EventCategory m_category;
TOOL_Actions m_actions;
TOOL_ActionScope m_scope;
TOOL_EVENT_CATEGORY m_category;
TOOL_ACTIONS m_actions;
TOOL_ACTION_SCOPE m_scope;
///> Difference between mouse cursor position and
///> the point where dragging event has started
@ -377,7 +375,8 @@ public:
typedef std::deque<TOOL_EVENT>::const_iterator const_iterator;
///> Default constructor. Creates an empty list.
TOOL_EVENT_LIST() {};
TOOL_EVENT_LIST()
{}
///> Constructor for a list containing only one TOOL_EVENT.
TOOL_EVENT_LIST( const TOOL_EVENT& aSingleEvent )
@ -393,10 +392,10 @@ public:
*/
const std::string Format() const;
boost::optional<const TOOL_EVENT&> Matches( const TOOL_EVENT& b ) const
boost::optional<const TOOL_EVENT&> Matches( const TOOL_EVENT& aEvent ) const
{
for( const_iterator i = m_events.begin(); i != m_events.end(); ++i )
if( i->Matches( b ) )
if( i->Matches( aEvent ) )
return *i;
return boost::optional<const TOOL_EVENT&>();
@ -442,12 +441,12 @@ public:
m_events.clear();
}
TOOL_EVENT_LIST& operator=( const TOOL_EVENT_LIST& b )
TOOL_EVENT_LIST& operator=( const TOOL_EVENT_LIST& aEventList )
{
m_events.clear();
for( std::deque<TOOL_EVENT>::const_iterator i = b.m_events.begin();
i != b.m_events.end(); ++i )
for( std::deque<TOOL_EVENT>::const_iterator i = aEventList.m_events.begin();
i != aEventList.m_events.end(); ++i )
{
m_events.push_back( *i );
}
@ -455,20 +454,20 @@ public:
return *this;
}
TOOL_EVENT_LIST& operator=( const TOOL_EVENT& b )
TOOL_EVENT_LIST& operator=( const TOOL_EVENT& aEvent )
{
m_events.clear();
m_events.push_back( b );
m_events.push_back( aEvent );
return *this;
}
TOOL_EVENT_LIST& operator||( const TOOL_EVENT& b )
TOOL_EVENT_LIST& operator||( const TOOL_EVENT& aEvent )
{
Add( b );
Add( aEvent );
return *this;
}
TOOL_EVENT_LIST& operator||( const TOOL_EVENT_LIST& b )
TOOL_EVENT_LIST& operator||( const TOOL_EVENT_LIST& aEvent )
{
return *this;
}
@ -477,22 +476,23 @@ private:
std::deque<TOOL_EVENT> m_events;
};
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT& b )
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_EVENT& aEventB )
{
TOOL_EVENT_LIST l;
l.Add( a );
l.Add( b );
l.Add( aEventA );
l.Add( aEventB );
return l;
}
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT_LIST& b )
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent,
const TOOL_EVENT_LIST& aEventList )
{
TOOL_EVENT_LIST l( b );
TOOL_EVENT_LIST l( aEventList );
l.Add( a );
l.Add( aEvent );
return l;
}

View File

@ -83,7 +83,7 @@ public:
*/
template <class T>
void Go( int (T::* aStateFunc)( TOOL_EVENT& ),
const TOOL_EVENT_LIST& aConditions = TOOL_EVENT( TC_Any, TA_Any ) );
const TOOL_EVENT_LIST& aConditions = TOOL_EVENT( TC_ANY, TA_ANY ) );
/**
* Function Wait()
@ -91,7 +91,7 @@ public:
* Suspends execution of the tool until an event specified in aEventList arrives.
* No parameters means waiting for any event.
*/
OPT_TOOL_EVENT Wait( const TOOL_EVENT_LIST& aEventList = TOOL_EVENT (TC_Any, TA_Any) );
OPT_TOOL_EVENT Wait( const TOOL_EVENT_LIST& aEventList = TOOL_EVENT( TC_ANY, TA_ANY ) );
/** functions below are not yet implemented - their interface may change */
/*template <class Parameters, class ReturnValue>
@ -111,10 +111,10 @@ protected:
const TOOL_EVENT evCommand( int aCommandId = -1 );
const TOOL_EVENT evCommand( std::string aCommandStr = "" );
const TOOL_EVENT evMotion();
const TOOL_EVENT evClick( int aButton = MB_Any );
const TOOL_EVENT evDrag( int aButton = MB_Any );
const TOOL_EVENT evButtonUp( int aButton = MB_Any );
const TOOL_EVENT evButtonDown(int aButton = MB_Any );
const TOOL_EVENT evClick( int aButton = MB_ANY );
const TOOL_EVENT evDrag( int aButton = MB_ANY );
const TOOL_EVENT evButtonUp( int aButton = MB_ANY );
const TOOL_EVENT evButtonDown(int aButton = MB_ANY );
private:
void goInternal( TOOL_STATE_FUNC& aState, const TOOL_EVENT_LIST& aConditions );
@ -123,7 +123,7 @@ private:
// hide TOOL_MANAGER implementation
template <class T>
void TOOL_INTERACTIVE::Go( int (T::* aStateFunc)( TOOL_EVENT& ),
const TOOL_EVENT_LIST& aConditions )
const TOOL_EVENT_LIST& aConditions )
{
TOOL_STATE_FUNC sptr( static_cast<T*>( this ), aStateFunc );

View File

@ -60,7 +60,7 @@ class VIEW
public:
friend class VIEW_ITEM;
typedef std::pair<VIEW_ITEM*, int> LayerItemPair;
typedef std::pair<VIEW_ITEM*, int> LAYER_ITEM_PAIR;
/**
* Constructor.
@ -94,7 +94,7 @@ public:
* first).
* @return Number of found items.
*/
int Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult );
int Query( const BOX2I& aRect, std::vector<LAYER_ITEM_PAIR>& aResult );
/**
* Function SetRequired()
@ -131,7 +131,10 @@ public:
* Returns the GAL this view is using to draw graphical primitives.
* @return Pointer to the currently used GAL instance.
*/
GAL* GetGAL() const { return m_gal; }
GAL* GetGAL() const
{
return m_gal;
}
/**
* Function SetPainter()
@ -144,7 +147,10 @@ public:
* Returns the painter object used by the view for drawing VIEW_ITEMS.
* @return Pointer to the currently used Painter instance.
*/
PAINTER* GetPainter() const { return m_painter; };
PAINTER* GetPainter() const
{
return m_painter;
}
/**
* Function SetViewport()
@ -189,7 +195,10 @@ public:
* Function GetScale()
* @return Current scalefactor of this VIEW
*/
double GetScale() const { return m_scale; }
double GetScale() const
{
return m_scale;
}
/**
* Function SetCenter()
@ -204,7 +213,10 @@ public:
* Returns the center point of this VIEW (in world space coordinates)
* @return center point of the view
*/
const VECTOR2D& GetCenter() const { return m_center; }
const VECTOR2D& GetCenter() const
{
return m_center;
}
/**
* Function ToWorld()
@ -291,7 +303,7 @@ public:
* @param aLayer is the layer.
* @param aTarget is the rendering target.
*/
inline void SetLayerTarget( int aLayer, RenderTarget aTarget )
inline void SetLayerTarget( int aLayer, RENDER_TARGET aTarget )
{
m_layers[aLayer].target = aTarget;
}
@ -410,7 +422,10 @@ public:
* Tells if the VIEW is dynamic (ie. can be changed, for example displaying PCBs in a window)
* or static (that cannot be modified, eg. displaying image/PDF).
*/
bool IsDynamic() const { return m_dynamic; }
bool IsDynamic() const
{
return m_dynamic;
}
/**
* Function IsDirty()
@ -488,15 +503,15 @@ private:
VIEW_RTREE* items; ///* R-tree indexing all items on this layer.
int renderingOrder; ///* rendering order of this layer
int id; ///* layer ID
RenderTarget target; ///* where the layer should be rendered
std::set<int> requiredLayers; ///* layers that are required to be enabled to show the layer
RENDER_TARGET target; ///* where the layer should be rendered
std::set<int> requiredLayers; ///* layers that have to be enabled to show the layer
};
// Convenience typedefs
typedef boost::unordered_map<int, VIEW_LAYER> LayerMap;
typedef LayerMap::iterator LayerMapIter;
typedef std::vector<VIEW_LAYER*> LayerOrder;
typedef std::vector<VIEW_LAYER*>::iterator LayerOrderIter;
typedef boost::unordered_map<int, VIEW_LAYER> LAYER_MAP;
typedef LAYER_MAP::iterator LAYER_MAP_ITER;
typedef std::vector<VIEW_LAYER*> LAYER_ORDER;
typedef std::vector<VIEW_LAYER*>::iterator LAYER_ORDER_ITER;
// Function objects that need to access VIEW/VIEW_ITEM private/protected members
struct clearLayerCache;
@ -573,9 +588,9 @@ private:
void updateLayers( VIEW_ITEM* aItem );
/// Determines rendering order of layers. Used in display order sorting function.
static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j )
static bool compareRenderingOrder( VIEW_LAYER* aI, VIEW_LAYER* aJ )
{
return i->renderingOrder > j->renderingOrder;
return aI->renderingOrder > aJ->renderingOrder;
}
/// Checks if every layer required by the aLayerId layer is enabled.
@ -585,10 +600,10 @@ private:
bool m_enableOrderModifier;
/// Contains set of possible displayed layers and its properties
LayerMap m_layers;
LAYER_MAP m_layers;
/// Sorted list of pointers to members of m_layers
LayerOrder m_orderedLayers;
LAYER_ORDER m_orderedLayers;
/// Stores set of layers that are displayed on the top
std::set<unsigned int> m_topLayers;

View File

@ -48,8 +48,11 @@ class VIEW_CONTROLS
public:
VIEW_CONTROLS( VIEW* aView ) : m_view( aView ), m_forceCursorPosition( false ),
m_snappingEnabled( false ), m_grabMouse( false ), m_autoPanEnabled( false ),
m_autoPanMargin( 0.1 ), m_autoPanSpeed( 0.15 ) {};
virtual ~VIEW_CONTROLS() {};
m_autoPanMargin( 0.1 ), m_autoPanSpeed( 0.15 )
{}
virtual ~VIEW_CONTROLS()
{}
/**
* Function SetSnapping()
@ -134,6 +137,11 @@ public:
m_forceCursorPosition = aEnabled;
}
/**
* Function ShowCursor()
* Enables or disables display of cursor.
* @param aEnabled decides if the cursor should be shown.
*/
virtual void ShowCursor( bool aEnabled );
protected:

View File

@ -164,17 +164,32 @@ public:
*
* @param aFlags determines the way in which items will be updated.
*/
virtual void ItemsViewUpdate( VIEW_ITEM::ViewUpdateFlags aFlags );
virtual void ItemsViewUpdate( VIEW_ITEM::VIEW_UPDATE_FLAGS aFlags );
protected:
/// These functions cannot be used with VIEW_GROUP as they are intended only to work with
/// singular VIEW_ITEMs (there is only one-to-one relation between item/layer combination and
/// its group).
int getGroup( int aLayer ) const { return -1; };
std::vector<int> getAllGroups() const { return std::vector<int>(); };
void setGroup( int aLayer, int aGroup ) {};
void deleteGroups() {};
bool storesGroups() const { return false; };
int getGroup( int aLayer ) const
{
return -1;
}
std::vector<int> getAllGroups() const
{
return std::vector<int>();
}
void setGroup( int aLayer, int aGroup )
{}
void deleteGroups()
{}
bool storesGroups() const
{
return false;
}
/// Layer on which the group is drawn
int m_layer;

View File

@ -155,14 +155,14 @@ class VIEW_ITEM
{
public:
/**
* Enum ViewUpdateFlags.
* Enum VIEW_UPDATE_FLAGS.
* Defines the how severely the shape/appearance of the item has been changed:
* - APPEARANCE: shape or layer set of the item have not been affected,
* only colors or visibility.
* - GEOMETRY: shape or layer set of the item have changed, VIEW may need to reindex it.
* - ALL: all flags above */
enum ViewUpdateFlags {
enum VIEW_UPDATE_FLAGS {
APPEARANCE = 0x01, /// Visibility flag has changed
COLOR = 0x02, /// Color has changed
GEOMETRY = 0x04, /// Position or shape has changed
@ -212,7 +212,8 @@ public:
* @param aLayer: current drawing layer
* @param aGal: pointer to the GAL device we are drawing on
*/
virtual void ViewDraw( int aLayer, GAL* aGal ) const {};
virtual void ViewDraw( int aLayer, GAL* aGal ) const
{}
/**
* Function ViewGetLayers()

View File

@ -48,7 +48,8 @@ class WX_VIEW_CONTROLS : public VIEW_CONTROLS, public wxEvtHandler
{
public:
WX_VIEW_CONTROLS( VIEW* aView, wxWindow* aParentPanel );
~WX_VIEW_CONTROLS() {};
~WX_VIEW_CONTROLS()
{}
/// Handler functions
void onWheel( wxMouseEvent& aEvent );
@ -80,10 +81,10 @@ public:
}
/// @copydoc VIEW_CONTROLS::GetMousePosition()
virtual const VECTOR2D GetMousePosition() const;
const VECTOR2D GetMousePosition() const;
/// @copydoc VIEW_CONTROLS::GetCursorPosition()
virtual const VECTOR2D GetCursorPosition() const;
const VECTOR2D GetCursorPosition() const;
/// Event that forces mouse move event in the dispatcher (eg. used in autopanning, when mouse
/// cursor does not move in screen coordinates, but does in world coordinates)
@ -91,7 +92,7 @@ public:
private:
/// Possible states for WX_VIEW_CONTROLS
enum State
enum STATE
{
IDLE = 1, /// Nothing is happening
DRAG_PANNING, /// Panning with mouse button pressed
@ -109,7 +110,7 @@ private:
bool handleAutoPanning( const wxMouseEvent& aEvent );
/// Current state of VIEW_CONTROLS
State m_state;
STATE m_state;
/// Panel that is affected by VIEW_CONTROLS
wxWindow* m_parentPanel;

View File

@ -82,7 +82,7 @@ public:
*/
DIRECTION_45( const SEG& aSeg )
{
construct( aSeg.b - aSeg.a );
construct( aSeg.B - aSeg.A );
}
/**

View File

@ -118,22 +118,22 @@ bool PNS_LINE::MergeObtuseSegments()
if( s1.Distance( ip ) <= 1 || s2.Distance( ip ) <= 1 )
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
else
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
if( DIRECTION_45( s1opt ).IsObtuse( DIRECTION_45( s2opt ) ) )
{
SHAPE_LINE_CHAIN opt_path;
opt_path.Append( s1opt.a );
opt_path.Append( s1opt.b );
opt_path.Append( s2opt.b );
opt_path.Append( s1opt.A );
opt_path.Append( s1opt.B );
opt_path.Append( s2opt.B );
PNS_LINE opt_track( *this, opt_path );
@ -204,12 +204,10 @@ bool PNS_LINE::MergeSegments()
if( n > 0 )
{
SHAPE_LINE_CHAIN path_straight = DIRECTION_45().BuildInitialTrace( s1.a,
s2.a,
false );
SHAPE_LINE_CHAIN path_diagonal = DIRECTION_45().BuildInitialTrace( s1.a,
s2.a,
true );
SHAPE_LINE_CHAIN path_straight = DIRECTION_45().BuildInitialTrace( s1.A,
s2.A, false );
SHAPE_LINE_CHAIN path_diagonal = DIRECTION_45().BuildInitialTrace( s1.A,
s2.A, true );
}
if( DIRECTION_45( s1 ) == DIRECTION_45( s2 ) )
@ -219,8 +217,8 @@ bool PNS_LINE::MergeSegments()
// printf("Colinear: np %d step %d n1 %d n2 %d\n", n_segs, step, n, n+step);
SHAPE_LINE_CHAIN opt_path;
opt_path.Append( s1.a );
opt_path.Append( s2.b );
opt_path.Append( s1.A );
opt_path.Append( s2.B );
PNS_LINE tmp( *this, opt_path );
@ -239,22 +237,22 @@ bool PNS_LINE::MergeSegments()
if( s1.Distance( ip ) <= 1 || s2.Distance( ip ) <= 1 )
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
else
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
if( DIRECTION_45( s1opt ).IsObtuse( DIRECTION_45( s2opt ) ) )
{
SHAPE_LINE_CHAIN opt_path;
opt_path.Append( s1opt.a );
opt_path.Append( s1opt.b );
opt_path.Append( s2opt.b );
opt_path.Append( s1opt.A );
opt_path.Append( s1opt.B );
opt_path.Append( s2opt.B );
PNS_LINE opt_track( *this, opt_path );
@ -319,14 +317,14 @@ void PNS_LINE::NewWalkaround( const SHAPE_LINE_CHAIN& aObstacle,
SHAPE_LINE_CHAIN& aPostPath,
bool aCw ) const
{
typedef SHAPE_LINE_CHAIN::Intersection Intersection;
typedef SHAPE_LINE_CHAIN::INTERSECTION INTERSECTION;
SHAPE_LINE_CHAIN l_orig( m_line );
SHAPE_LINE_CHAIN l_hull;
vector<bool> outside, on_edge, inside;
SHAPE_LINE_CHAIN path;
vector<Intersection> isects;
vector<INTERSECTION> isects;
// don't calculate walkaround for empty lines
if( m_line.PointCount() < 2 )
@ -345,7 +343,7 @@ void PNS_LINE::NewWalkaround( const SHAPE_LINE_CHAIN& aObstacle,
else
l_hull = aObstacle;
BOOST_FOREACH( Intersection isect, isects ) {
BOOST_FOREACH( INTERSECTION isect, isects ) {
l_orig.Split( isect.p );
l_hull.Split( isect.p );
}
@ -379,7 +377,7 @@ void PNS_LINE::NewWalkaround( const SHAPE_LINE_CHAIN& aObstacle,
for( int i = l_orig.PointCount() - 1; i >= 1; i-- )
if( inside[i] && outside[i - 1] )
{
SHAPE_LINE_CHAIN::Intersections ips;
SHAPE_LINE_CHAIN::INTERSECTIONS ips;
l_hull.Intersect( SEG( l_orig.CPoint( i ), l_orig.CPoint( i - 1 ) ), ips );
l_orig.Remove( i, -1 );
l_orig.Append( ips[0].p );
@ -488,55 +486,50 @@ bool PNS_LINE::onEdge( const SHAPE_LINE_CHAIN& obstacle, VECTOR2I p, int& ei,
}
bool PNS_LINE::walkScan( const SHAPE_LINE_CHAIN& line,
const SHAPE_LINE_CHAIN& obstacle,
bool reverse,
VECTOR2I& ip,
int& index_o,
int& index_l,
bool& is_vertex ) const
bool PNS_LINE::walkScan( const SHAPE_LINE_CHAIN& aLine, const SHAPE_LINE_CHAIN& aObstacle,
bool aReverse, VECTOR2I& aIp, int& aIndexO, int& aIndexL, bool& aIsVertex ) const
{
int sc = line.SegmentCount();
int sc = aLine.SegmentCount();
for( int i = 0; i < line.SegmentCount(); i++ )
for( int i = 0; i < aLine.SegmentCount(); i++ )
{
printf( "check-seg rev %d %d/%d %d\n", reverse, i, sc, sc - 1 - i );
SEG tmp = line.CSegment( reverse ? sc - 1 - i : i );
SEG s( tmp.a, tmp.b );
printf( "check-seg rev %d %d/%d %d\n", aReverse, i, sc, sc - 1 - i );
SEG tmp = aLine.CSegment( aReverse ? sc - 1 - i : i );
SEG s( tmp.A, tmp.B );
if( reverse )
if( aReverse )
{
s.a = tmp.b;
s.b = tmp.a;
s.A = tmp.B;
s.B = tmp.A;
}
if( onEdge( obstacle, s.a, index_o, is_vertex ) )
if( onEdge( aObstacle, s.A, aIndexO, aIsVertex ) )
{
index_l = (reverse ? sc - 1 - i : i);
ip = s.a;
printf( "vertex %d on-%s %d\n", index_l,
is_vertex ? "vertex" : "edge", index_o );
aIndexL = (aReverse ? sc - 1 - i : i);
aIp = s.A;
printf( "vertex %d on-%s %d\n", aIndexL,
aIsVertex ? "vertex" : "edge", aIndexO );
return true;
}
if( onEdge( obstacle, s.b, index_o, is_vertex ) )
if( onEdge( aObstacle, s.B, aIndexO, aIsVertex ) )
{
index_l = (reverse ? sc - 1 - i - 1 : i + 1);
ip = s.b;
printf( "vertex %d on-%s %d\n", index_l,
is_vertex ? "vertex" : "edge", index_o );
aIndexL = (aReverse ? sc - 1 - i - 1 : i + 1);
aIp = s.B;
printf( "vertex %d on-%s %d\n", aIndexL,
aIsVertex ? "vertex" : "edge", aIndexO );
return true;
}
SHAPE_LINE_CHAIN::Intersections ips;
int n_is = obstacle.Intersect( s, ips );
SHAPE_LINE_CHAIN::INTERSECTIONS ips;
int n_is = aObstacle.Intersect( s, ips );
if( n_is > 0 )
{
index_o = ips[0].our.Index();
index_l = reverse ? sc - 1 - i : i;
printf( "segment-%d intersects edge-%d\n", index_l, index_o );
ip = ips[0].p;
aIndexO = ips[0].our.Index();
aIndexL = aReverse ? sc - 1 - i : i;
printf( "segment-%d intersects edge-%d\n", aIndexL, aIndexO );
aIp = ips[0].p;
return true;
}
}
@ -545,11 +538,8 @@ bool PNS_LINE::walkScan( const SHAPE_LINE_CHAIN& line,
}
bool PNS_LINE::Walkaround( SHAPE_LINE_CHAIN obstacle,
SHAPE_LINE_CHAIN& pre,
SHAPE_LINE_CHAIN& walk,
SHAPE_LINE_CHAIN& post,
bool cw ) const
bool PNS_LINE::Walkaround( SHAPE_LINE_CHAIN aObstacle, SHAPE_LINE_CHAIN& aPre,
SHAPE_LINE_CHAIN& aWalk, SHAPE_LINE_CHAIN& aPost, bool aCw ) const
{
const SHAPE_LINE_CHAIN& line = GetCLine();
VECTOR2I ip_start;
@ -562,60 +552,55 @@ bool PNS_LINE::Walkaround( SHAPE_LINE_CHAIN obstacle,
if( line.SegmentCount() < 1 )
return false;
if( obstacle.PointInside( line.CPoint( 0 ) ) ||
obstacle.PointInside( line.CPoint( -1 ) ) )
if( aObstacle.PointInside( line.CPoint( 0 ) ) ||
aObstacle.PointInside( line.CPoint( -1 ) ) )
return false;
// printf("forward:\n");
bool found = walkScan( line,
obstacle,
false,
ip_start,
index_o_start,
index_l_start,
is_vertex_start );
bool found = walkScan( line, aObstacle, false, ip_start, index_o_start,
index_l_start, is_vertex_start );
// printf("reverse:\n");
found |= walkScan( line, obstacle, true, ip_end, index_o_end, index_l_end, is_vertex_end );
found |= walkScan( line, aObstacle, true, ip_end, index_o_end, index_l_end, is_vertex_end );
if( !found || ip_start == ip_end )
{
pre = line;
aPre = line;
return true;
}
pre = line.Slice( 0, index_l_start );
pre.Append( ip_start );
walk.Clear();
walk.Append( ip_start );
aPre = line.Slice( 0, index_l_start );
aPre.Append( ip_start );
aWalk.Clear();
aWalk.Append( ip_start );
if( cw )
if( aCw )
{
int is = ( index_o_start + 1 ) % obstacle.PointCount();
int ie = ( is_vertex_end ? index_o_end : index_o_end + 1 ) % obstacle.PointCount();
int is = ( index_o_start + 1 ) % aObstacle.PointCount();
int ie = ( is_vertex_end ? index_o_end : index_o_end + 1 ) % aObstacle.PointCount();
while( 1 )
{
printf( "is %d\n", is );
walk.Append( obstacle.CPoint( is ) );
aWalk.Append( aObstacle.CPoint( is ) );
if( is == ie )
break;
is++;
if( is == obstacle.PointCount() )
if( is == aObstacle.PointCount() )
is = 0;
}
}
else
{
int is = index_o_start;
int ie = ( is_vertex_end ? index_o_end : index_o_end ) % obstacle.PointCount();
int ie = ( is_vertex_end ? index_o_end : index_o_end ) % aObstacle.PointCount();
while( 1 )
{
printf( "is %d\n", is );
walk.Append( obstacle.CPoint( is ) );
aWalk.Append( aObstacle.CPoint( is ) );
if( is == ie )
break;
@ -623,15 +608,15 @@ bool PNS_LINE::Walkaround( SHAPE_LINE_CHAIN obstacle,
is--;
if( is < 0 )
is = obstacle.PointCount() - 1;
is = aObstacle.PointCount() - 1;
}
}
walk.Append( ip_end );
aWalk.Append( ip_end );
post.Clear();
post.Append( ip_end );
post.Append( line.Slice( is_vertex_end ? index_l_end : index_l_end + 1, -1 ) );
aPost.Clear();
aPost.Append( ip_end );
aPost.Append( line.Slice( is_vertex_end ? index_l_end : index_l_end + 1, -1 ) );
// for(int i = (index_o_start + 1) % obstacle.PointCount();
// i != (index_o_end + 1) % obstacle.PointCount(); i=(i+1) % obstacle.PointCount())
@ -714,8 +699,8 @@ bool PNS_LINE::Is45Degree()
const SEG& s = m_line.CSegment( i );
double angle = 180.0 / M_PI *
atan2( (double) s.b.y - (double) s.a.y,
(double) s.b.x - (double) s.a.x );
atan2( (double) s.B.y - (double) s.A.y,
(double) s.B.x - (double) s.A.x );
if( angle < 0 )
angle += 360.0;

View File

@ -100,7 +100,7 @@ void PNS_LINE_PLACER::SetInitialDirection( const DIRECTION_45& aDirection )
bool PNS_LINE_PLACER::handleSelfIntersections()
{
SHAPE_LINE_CHAIN::Intersections ips;
SHAPE_LINE_CHAIN::INTERSECTIONS ips;
SHAPE_LINE_CHAIN& head = m_head.GetLine();
SHAPE_LINE_CHAIN& tail = m_tail.GetLine();
@ -119,7 +119,7 @@ bool PNS_LINE_PLACER::handleSelfIntersections()
// if there is more than one intersection, find the one that is
// closest to the beginning of the tail.
BOOST_FOREACH( SHAPE_LINE_CHAIN::Intersection i, ips )
BOOST_FOREACH( SHAPE_LINE_CHAIN::INTERSECTION i, ips )
{
if( i.our.Index() < n )
{
@ -147,7 +147,7 @@ bool PNS_LINE_PLACER::handleSelfIntersections()
// Clip till the last tail segment before intersection.
// Set the direction to the one of this segment.
const SEG last = tail.CSegment( n - 1 );
m_p_start = last.a;
m_p_start = last.A;
m_direction = DIRECTION_45( last );
tail.Remove( n, -1 );
return true;
@ -190,7 +190,7 @@ bool PNS_LINE_PLACER::handlePullback()
{
const SEG last = tail.CSegment( -1 );
m_direction = DIRECTION_45( last );
m_p_start = last.a;
m_p_start = last.A;
TRACE( 0, "Placer: pullback triggered [%d] [%s %s]",
n % last_tail.Format().c_str() % first_head.Format().c_str() );
@ -240,7 +240,7 @@ bool PNS_LINE_PLACER::reduceTail( const VECTOR2I& aEnd )
// calculate a replacement route and check if it matches
// the direction of the segment to be replaced
SHAPE_LINE_CHAIN replacement = dir.BuildInitialTrace( s.a, aEnd );
SHAPE_LINE_CHAIN replacement = dir.BuildInitialTrace( s.A, aEnd );
PNS_LINE tmp( m_tail, replacement );
@ -249,7 +249,7 @@ bool PNS_LINE_PLACER::reduceTail( const VECTOR2I& aEnd )
if( DIRECTION_45( replacement.Segment( 0 ) ) == dir )
{
new_start = s.a;
new_start = s.A;
new_direction = dir;
reduce_index = i;
}
@ -326,18 +326,18 @@ bool PNS_LINE_PLACER::mergeHead()
}
if( !n_tail )
tail.Append( head.CSegment( 0 ).a );
tail.Append( head.CSegment( 0 ).A );
for( int i = 0; i < n_head - 2; i++ )
{
tail.Append( head.CSegment( i ).b );
tail.Append( head.CSegment( i ).B );
}
tail.Simplify();
SEG last = tail.CSegment( -1 );
m_p_start = last.b;
m_p_start = last.B;
m_direction = DIRECTION_45( last ).Right();
head.Remove( 0, n_head - 2 );

View File

@ -284,7 +284,7 @@ PNS_NODE::OptObstacle PNS_NODE::NearestObstacle( const PNS_LINE* aItem, int aKin
VECTOR2I ip_first, ip_last;
int dist_max = INT_MIN;
vector<SHAPE_LINE_CHAIN::Intersection> isect_list;
vector<SHAPE_LINE_CHAIN::INTERSECTION> isect_list;
int clearance = GetClearance( obs.item, &aLine );
@ -298,7 +298,7 @@ PNS_NODE::OptObstacle PNS_NODE::NearestObstacle( const PNS_LINE* aItem, int aKin
viaHull.Intersect( hull, isect_list );
BOOST_FOREACH( SHAPE_LINE_CHAIN::Intersection isect, isect_list )
BOOST_FOREACH( SHAPE_LINE_CHAIN::INTERSECTION isect, isect_list )
{
int dist = aLine.GetCLine().Length() +
( isect.p - aLine.GetVia().GetPos() ).EuclideanNorm();
@ -324,7 +324,7 @@ PNS_NODE::OptObstacle PNS_NODE::NearestObstacle( const PNS_LINE* aItem, int aKin
hull.Intersect( aLine.GetCLine(), isect_list );
BOOST_FOREACH( SHAPE_LINE_CHAIN::Intersection isect, isect_list )
BOOST_FOREACH( SHAPE_LINE_CHAIN::INTERSECTION isect, isect_list )
{
int dist = aLine.GetCLine().PathLength( isect.p );
@ -473,14 +473,14 @@ void PNS_NODE::addLine( PNS_LINE* aLine )
{
SEG s = l.CSegment( i );
if( s.a != s.b )
if( s.A != s.B )
{
PNS_SEGMENT* pseg = new PNS_SEGMENT( *aLine, s );
pseg->SetOwner( this );
linkJoint( s.a, pseg->GetLayers(), aLine->GetNet(), pseg );
linkJoint( s.b, pseg->GetLayers(), aLine->GetNet(), pseg );
linkJoint( s.A, pseg->GetLayers(), aLine->GetNet(), pseg );
linkJoint( s.B, pseg->GetLayers(), aLine->GetNet(), pseg );
aLine->LinkSegment( pseg );
@ -492,7 +492,7 @@ void PNS_NODE::addLine( PNS_LINE* aLine )
void PNS_NODE::addSegment( PNS_SEGMENT* aSeg )
{
if( aSeg->GetSeg().a == aSeg->GetSeg().b )
if( aSeg->GetSeg().A == aSeg->GetSeg().B )
{
TRACEn( 0, "attempting to add a segment with same end coordinates, ignoring." )
return;
@ -500,8 +500,8 @@ void PNS_NODE::addSegment( PNS_SEGMENT* aSeg )
aSeg->SetOwner( this );
linkJoint( aSeg->GetSeg().a, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
linkJoint( aSeg->GetSeg().b, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
linkJoint( aSeg->GetSeg().A, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
linkJoint( aSeg->GetSeg().B, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
m_index->Add( aSeg );
}
@ -555,8 +555,8 @@ void PNS_NODE::doRemove( PNS_ITEM* aItem )
void PNS_NODE::removeSegment( PNS_SEGMENT* aSeg )
{
unlinkJoint( aSeg->GetSeg().a, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
unlinkJoint( aSeg->GetSeg().b, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
unlinkJoint( aSeg->GetSeg().A, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
unlinkJoint( aSeg->GetSeg().B, aSeg->GetLayers(), aSeg->GetNet(), aSeg );
doRemove( aSeg );
}
@ -629,7 +629,7 @@ void PNS_NODE::followLine( PNS_SEGMENT* current, bool scanDirection, int& pos,
for( ; ; )
{
const VECTOR2I p =
(scanDirection ^ prevReversed) ? current->GetSeg().b : current->GetSeg().a;
(scanDirection ^ prevReversed) ? current->GetSeg().B : current->GetSeg().A;
const OptJoint jt = FindJoint( p, current->GetLayer(), current->GetNet() );
assert( jt );
@ -645,7 +645,7 @@ void PNS_NODE::followLine( PNS_SEGMENT* current, bool scanDirection, int& pos,
current = jt->NextSegment( current );
prevReversed =
( jt->GetPos() == (scanDirection ? current->GetSeg().b : current->GetSeg().a ) );
( jt->GetPos() == (scanDirection ? current->GetSeg().B : current->GetSeg().A ) );
}
}
@ -870,8 +870,8 @@ void PNS_NODE::Dump( bool aLong )
case PNS_ITEM::SEGMENT:
{
const PNS_SEGMENT* seg = static_cast<const PNS_SEGMENT*>(item);
printf( " -> seg %s %s\n", seg->GetSeg().a.Format().c_str(),
seg->GetSeg().b.Format().c_str() );
printf( " -> seg %s %s\n", seg->GetSeg().A.Format().c_str(),
seg->GetSeg().B.Format().c_str() );
break;
}
@ -897,10 +897,10 @@ void PNS_NODE::Dump( bool aLong )
for( vector<PNS_SEGMENT*>::iterator j = seg_refs->begin(); j != seg_refs->end(); ++j )
{
printf( "%s ", (*j)->GetSeg().a.Format().c_str() );
printf( "%s ", (*j)->GetSeg().A.Format().c_str() );
if( j + 1 == seg_refs->end() )
printf( "%s\n", (*j)->GetSeg().b.Format().c_str() );
printf( "%s\n", (*j)->GetSeg().B.Format().c_str() );
all_segs.erase( *j );
}

View File

@ -311,22 +311,22 @@ bool PNS_OPTIMIZER::mergeObtuse( PNS_LINE* aLine )
if( s1.Distance( ip ) <= 1 || s2.Distance( ip ) <= 1 )
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
else
{
s1opt = SEG( s1.a, ip );
s2opt = SEG( ip, s2.b );
s1opt = SEG( s1.A, ip );
s2opt = SEG( ip, s2.B );
}
if( DIRECTION_45( s1opt ).IsObtuse( DIRECTION_45( s2opt ) ) )
{
SHAPE_LINE_CHAIN opt_path;
opt_path.Append( s1opt.a );
opt_path.Append( s1opt.b );
opt_path.Append( s2opt.b );
opt_path.Append( s1opt.A );
opt_path.Append( s1opt.B );
opt_path.Append( s2opt.B );
PNS_LINE opt_track( *aLine, opt_path );
@ -446,7 +446,7 @@ bool PNS_OPTIMIZER::mergeStep( PNS_LINE* aLine, SHAPE_LINE_CHAIN& aCurrentPath,
for( int i = 0; i < 2; i++ )
{
bool postureMatch = true;
SHAPE_LINE_CHAIN bypass = DIRECTION_45().BuildInitialTrace( s1.a, s2.b, i );
SHAPE_LINE_CHAIN bypass = DIRECTION_45().BuildInitialTrace( s1.A, s2.B, i );
cost[i] = INT_MAX;

View File

@ -392,10 +392,10 @@ const VECTOR2I PNS_ROUTER::SnapToItem( PNS_ITEM* item, VECTOR2I aP, bool& aSplit
aSplitsSegment = false;
if( (aP - s.a).EuclideanNorm() < w / 2 )
anchor = s.a;
else if( (aP - s.b).EuclideanNorm() < w / 2 )
anchor = s.b;
if( ( aP - s.A ).EuclideanNorm() < w / 2 )
anchor = s.A;
else if( ( aP - s.B ).EuclideanNorm() < w / 2 )
anchor = s.B;
else
{
anchor = s.NearestPoint( aP );
@ -559,8 +559,8 @@ void PNS_ROUTER::splitAdjacentSegments( PNS_NODE* aNode, PNS_ITEM* aSeg, const V
s_new[0] = s_old->Clone();
s_new[1] = s_old->Clone();
s_new[0]->SetEnds( s_old->GetSeg().a, aP );
s_new[1]->SetEnds( aP, s_old->GetSeg().b );
s_new[0]->SetEnds( s_old->GetSeg().A, aP );
s_new[1]->SetEnds( aP, s_old->GetSeg().B );
aNode->Remove( s_old );
aNode->Add( s_new[0] );
@ -598,8 +598,8 @@ void PNS_ROUTER::commitRouting( PNS_NODE* aNode )
TRACK* track = new TRACK( m_board );
const SEG& s = seg->GetSeg();
track->SetStart( wxPoint( s.a.x, s.a.y ) );
track->SetEnd( wxPoint( s.b.x, s.b.y ) );
track->SetStart( wxPoint( s.A.x, s.A.y ) );
track->SetEnd( wxPoint( s.B.x, s.B.y ) );
track->SetWidth( seg->GetWidth() );
track->SetLayer( seg->GetLayers().Start() );
track->SetNet( seg->GetNet() );

View File

@ -44,8 +44,8 @@ public:
{
m_net = aNet;
m_shape.Clear();
m_shape.Append( aSeg.a );
m_shape.Append( aSeg.b );
m_shape.Append( aSeg.A );
m_shape.Append( aSeg.B );
};
PNS_SEGMENT( const PNS_LINE& aParentLine, const SEG& aSeg ) :
@ -55,8 +55,8 @@ public:
m_layers = aParentLine.GetLayers();
m_width = aParentLine.GetWidth();
m_shape.Clear();
m_shape.Append( aSeg.a );
m_shape.Append( aSeg.b );
m_shape.Append( aSeg.A );
m_shape.Append( aSeg.B );
};

View File

@ -128,8 +128,8 @@ bool PNS_SHOVE::tryShove( PNS_NODE* aNode, PNS_LINE* aHead, PNS_LINE* aObstacle,
if( aNode->CheckColliding( &hs, aObstacle ) )
{
VECTOR2I v1 = hs.GetSeg().b - hs.GetSeg().a;
VECTOR2I v2 = aObstacleSeg.GetSeg().b - aObstacleSeg.GetSeg().a;
VECTOR2I v1 = hs.GetSeg().B - hs.GetSeg().A;
VECTOR2I v2 = aObstacleSeg.GetSeg().B - aObstacleSeg.GetSeg().A;
VECTOR2I::extended_type det = v1.Cross( v2 );

View File

@ -196,8 +196,8 @@ PNS_WALKAROUND::WalkaroundStatus PNS_WALKAROUND::Route( const PNS_LINE& aInitial
const SEG s = l.Segment( i );
VECTOR2I nearest = s.NearestPoint( m_cursorPos );
VECTOR2I::extended_type dist_a = ( s.a - m_cursorPos ).SquaredEuclideanNorm();
VECTOR2I::extended_type dist_b = ( s.b - m_cursorPos ).SquaredEuclideanNorm();
VECTOR2I::extended_type dist_a = ( s.A - m_cursorPos ).SquaredEuclideanNorm();
VECTOR2I::extended_type dist_b = ( s.B - m_cursorPos ).SquaredEuclideanNorm();
VECTOR2I::extended_type dist_n = ( nearest - m_cursorPos ).SquaredEuclideanNorm();
if( dist_n <= dist_a && dist_n < dist_b )

View File

@ -127,10 +127,10 @@ void ROUTER_PREVIEW_ITEM::ViewDraw( int aLayer, KIGFX::GAL* aGal ) const
aGal->SetIsFill( false );
for( int s = 0; s < m_line.SegmentCount(); s++ )
aGal->DrawLine( m_line.CSegment( s ).a, m_line.CSegment( s ).b );
aGal->DrawLine( m_line.CSegment( s ).A, m_line.CSegment( s ).B );
if( m_line.IsClosed() )
aGal->DrawLine( m_line.CSegment( -1 ).b, m_line.CSegment( 0 ).a );
aGal->DrawLine( m_line.CSegment( -1 ).B, m_line.CSegment( 0 ).A );
break;
case PR_VIA:

View File

@ -87,7 +87,7 @@ void ROUTER_TOOL::Reset()
if( getView() )
m_router->SetView( getView() );
Go( &ROUTER_TOOL::Main, TOOL_EVENT( TC_Command, TA_Action, GetName() ) );
Go( &ROUTER_TOOL::Main, TOOL_EVENT( TC_COMMAND, TA_ACTION, GetName() ) );
}
@ -323,7 +323,7 @@ void ROUTER_TOOL::startRouting()
updateEndItem( *evt );
m_router->Move( m_endSnapPoint, m_endItem );
}
else if( evt->IsClick( MB_Left ) )
else if( evt->IsClick( MB_LEFT ) )
{
updateEndItem( *evt );
@ -396,7 +396,7 @@ int ROUTER_TOOL::Main( TOOL_EVENT& aEvent )
break; // Finish
else if( evt->IsMotion() )
updateStartItem( *evt );
else if( evt->IsClick( MB_Left ) )
else if( evt->IsClick( MB_LEFT ) )
{
updateStartItem( *evt );
startRouting();

View File

@ -182,7 +182,7 @@ public:
* them properly.
* @return Flag required to refresh items.
*/
KIGFX::VIEW_ITEM::ViewUpdateFlags GetUpdateFlag() const
KIGFX::VIEW_ITEM::VIEW_UPDATE_FLAGS GetUpdateFlag() const
{
if( m_flips % 2 == 1 ) // If number of flips is odd, then we need to change layers
return KIGFX::VIEW_ITEM::LAYERS;

View File

@ -102,7 +102,7 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
}
// Dispatch TOOL_ACTIONs
else if( evt->Category() == TC_Command )
else if( evt->Category() == TC_COMMAND )
{
VECTOR2D cursorPos = getView()->ToWorld( getViewControls()->GetCursorPosition() );
@ -118,7 +118,7 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
}
}
else if( evt->IsMotion() || evt->IsDrag( MB_Left ) )
else if( evt->IsMotion() || evt->IsDrag( MB_LEFT ) )
{
if( dragging )
{
@ -143,7 +143,7 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
dragPosition = evt->Position();
}
else if( evt->IsMouseUp( MB_Left ) || evt->IsClick( MB_Left ) )
else if( evt->IsMouseUp( MB_LEFT ) || evt->IsClick( MB_LEFT ) )
break; // Finish
}

View File

@ -92,7 +92,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
{
// Should selected items be added to the current selection or
// become the new selection (discarding previously selected items)
m_additive = evt->Modifier( MD_ModShift );
m_additive = evt->Modifier( MD_SHIFT );
if( evt->IsCancel() )
{
@ -103,11 +103,11 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
}
// single click? Select single object
if( evt->IsClick( MB_Left ) )
if( evt->IsClick( MB_LEFT ) )
selectSingle( evt->Position() );
// drag with LMB? Select multiple objects (or at least draw a selection box) or drag them
if( evt->IsDrag( MB_Left ) )
if( evt->IsDrag( MB_LEFT ) )
{
if( m_selection.Empty() || m_additive )
{
@ -299,7 +299,7 @@ bool SELECTION_TOOL::selectMultiple()
break;
}
if( evt->IsDrag( MB_Left ) )
if( evt->IsDrag( MB_LEFT ) )
{
if( !m_additive )
clearSelection();
@ -311,17 +311,17 @@ bool SELECTION_TOOL::selectMultiple()
m_selArea->ViewUpdate( VIEW_ITEM::GEOMETRY );
}
if( evt->IsMouseUp( MB_Left ) )
if( evt->IsMouseUp( MB_LEFT ) )
{
// End drawing the selection box
m_selArea->ViewSetVisible( false );
// Mark items within the selection box as selected
std::vector<VIEW::LayerItemPair> selectedItems;
std::vector<VIEW::LAYER_ITEM_PAIR> selectedItems;
BOX2I selectionBox = m_selArea->ViewBBox();
view->Query( selectionBox, selectedItems ); // Get the list of selected items
std::vector<VIEW::LayerItemPair>::iterator it, it_end;
std::vector<VIEW::LAYER_ITEM_PAIR>::iterator it, it_end;
for( it = selectedItems.begin(), it_end = selectedItems.end(); it != it_end; ++it )
{
@ -369,7 +369,7 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector )
while( OPT_TOOL_EVENT evt = Wait() )
{
if( evt->Action() == TA_ContextMenuUpdate )
if( evt->Action() == TA_CONTEXT_MENU_UPDATE )
{
if( current )
current->ClearBrightened();
@ -385,7 +385,7 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector )
else
current = NULL;
}
else if( evt->Action() == TA_ContextMenuChoice )
else if( evt->Action() == TA_CONTEXT_MENU_CHOICE )
{
optional<int> id = evt->GetCommandId();