/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2021 Ola Rinta-Koski * Copyright (C) 2021-2022 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include using namespace KIFONT; STROKE_GLYPH::STROKE_GLYPH( const STROKE_GLYPH& aGlyph ) { for( const std::vector& pointList : aGlyph ) push_back( pointList ); m_boundingBox = aGlyph.m_boundingBox; } void STROKE_GLYPH::AddPoint( const VECTOR2D& aPoint ) { if( !m_penIsDown ) { std::vector v; push_back( v ); m_penIsDown = true; } back().push_back( aPoint ); } void STROKE_GLYPH::RaisePen() { if( m_penIsDown ) back().shrink_to_fit(); m_penIsDown = false; } void STROKE_GLYPH::Finalize() { if( !empty() && !back().empty() ) back().shrink_to_fit(); } std::unique_ptr STROKE_GLYPH::Transform( const VECTOR2D& aGlyphSize, const VECTOR2D& aOffset, double aTilt ) { std::unique_ptr glyph = std::make_unique( *this ); VECTOR2D end = glyph->m_boundingBox.GetEnd(); end.x *= aGlyphSize.x; end.y *= aGlyphSize.y; if( aTilt ) end.x -= end.y * aTilt; glyph->m_boundingBox.SetEnd( end ); glyph->m_boundingBox.Offset( aOffset ); for( std::vector& pointList : *glyph.get() ) { for( VECTOR2D& point : pointList ) { point.x *= aGlyphSize.x; point.y *= aGlyphSize.y; if( aTilt ) point.x -= point.y * aTilt; point.x += aOffset.x; point.y += aOffset.y; } } return glyph; } void STROKE_GLYPH::Mirror( const VECTOR2D& aMirrorOrigin ) { double originX = aMirrorOrigin.x; VECTOR2D pos = m_boundingBox.GetPosition(); VECTOR2D end = m_boundingBox.GetEnd(); pos.x = originX - ( pos.x - originX ); end.x = originX - ( end.x - originX ); m_boundingBox.SetOrigin( pos ); m_boundingBox.SetEnd( end ); for( std::vector& pointList : *this ) { for( VECTOR2D& point : pointList ) point.x = originX - ( point.x - originX ); } }