KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_bitmap.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2011 jean-pierre.charras
5 * Copyright (C) 2011-2021 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
29#include <sch_draw_panel.h>
30#include <plotters/plotter.h>
32#include <bitmaps.h>
33#include <base_units.h>
34#include <common.h>
35#include <eda_draw_frame.h>
36#include <core/mirror.h>
37#include <sch_bitmap.h>
38#include <trigo.h>
39
40#include <wx/mstream.h>
41
42
44 SCH_ITEM( nullptr, SCH_BITMAP_T )
45{
46 m_pos = pos;
47 m_layer = LAYER_NOTES; // used only to draw/plot a rectangle,
48 // when a bitmap cannot be drawn or plotted
50}
51
52
53SCH_BITMAP::SCH_BITMAP( const SCH_BITMAP& aSchBitmap ) :
54 SCH_ITEM( aSchBitmap )
55{
56 m_pos = aSchBitmap.m_pos;
57 m_layer = aSchBitmap.m_layer;
58 m_bitmapBase = new BITMAP_BASE( *aSchBitmap.m_bitmapBase );
59}
60
61
63{
64 wxCHECK_MSG( Type() == aItem.Type(), *this,
65 wxT( "Cannot assign object type " ) + aItem.GetClass() + wxT( " to type " ) +
66 GetClass() );
67
68 if( &aItem != this )
69 {
70 SCH_ITEM::operator=( aItem );
71
72 SCH_BITMAP* bitmap = (SCH_BITMAP*) &aItem;
73
74 delete m_bitmapBase;
75 m_bitmapBase = new BITMAP_BASE( *bitmap->m_bitmapBase );
76 m_pos = bitmap->m_pos;
77 }
78
79 return *this;
80}
81
82
83bool SCH_BITMAP::ReadImageFile( const wxString& aFullFilename )
84{
85 if( m_bitmapBase->ReadImageFile( aFullFilename ) )
86 {
88 return true;
89 }
90
91 return false;
92}
93
94
95bool SCH_BITMAP::ReadImageFile( wxMemoryBuffer& aBuffer )
96{
97 if( m_bitmapBase->ReadImageFile( aBuffer ) )
98 {
100 return true;
101 }
102
103 return false;
104}
105
106
108{
109 return new SCH_BITMAP( *this );
110}
111
112
114{
115 SCH_ITEM::SwapFlags( aItem );
116
117 wxCHECK_RET( aItem->Type() == SCH_BITMAP_T,
118 wxString::Format( wxT( "SCH_BITMAP object cannot swap data with %s object." ),
119 aItem->GetClass() ) );
120
121 SCH_BITMAP* item = (SCH_BITMAP*) aItem;
122 std::swap( m_pos, item->m_pos );
123 std::swap( m_bitmapBase, item->m_bitmapBase );
124}
125
126
128{
130
131 bbox.Move( m_pos );
132
133 return bbox;
134}
135
136
137void SCH_BITMAP::Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
138{
139 VECTOR2I pos = m_pos + aOffset;
140
141 m_bitmapBase->DrawBitmap( aSettings->GetPrintDC(), pos, aSettings->GetBackgroundColor() );
142}
143
144
146{
147 return m_bitmapBase->GetSize();
148}
149
150
152{
153 MIRROR( m_pos.y, aCenter );
154 m_bitmapBase->Mirror( true );
155}
156
157
159{
160 MIRROR( m_pos.x, aCenter );
161 m_bitmapBase->Mirror( false );
162}
163
164
165void SCH_BITMAP::Rotate( const VECTOR2I& aCenter )
166{
167 RotatePoint( m_pos, aCenter, ANGLE_90 );
168 m_bitmapBase->Rotate( false );
169}
170
171
172#if defined(DEBUG)
173void SCH_BITMAP::Show( int nestLevel, std::ostream& os ) const
174{
175 // XML output:
176 wxString s = GetClass();
177
178 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << "/>\n";
179}
180#endif
181
182
183bool SCH_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
184{
185 BOX2I rect = GetBoundingBox();
186
187 rect.Inflate( aAccuracy );
188
189 return rect.Contains( aPosition );
190}
191
192
193bool SCH_BITMAP::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
194{
195 BOX2I rect = aRect;
196
197 rect.Inflate( aAccuracy );
198
199 if( aContained )
200 return rect.Contains( GetBoundingBox() );
201
202 return rect.Intersects( GetBoundingBox() );
203}
204
205
206void SCH_BITMAP::Plot( PLOTTER* aPlotter, bool aBackground ) const
207{
208 if( aBackground )
209 {
210 m_bitmapBase->PlotImage( aPlotter, m_pos,
211 aPlotter->RenderSettings()->GetLayerColor( GetLayer() ),
212 aPlotter->RenderSettings()->GetDefaultPenWidth() );
213 }
214}
215
216
218{
219 return BITMAPS::image;
220}
221
222
223void SCH_BITMAP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
224{
225 aList.emplace_back( _( "Bitmap" ), wxEmptyString );
226
227 aList.emplace_back( _( "PPI" ), wxString::Format( wxT( "%d "), GetImage()->GetPPI() ) );
228 aList.emplace_back( _( "Scale" ), wxString::Format( wxT( "%f "), GetImageScale() ) );
229
230 aList.emplace_back( _( "Width" ), aFrame->MessageTextFromValue( GetSize().x ) );
231 aList.emplace_back( _( "Height" ), aFrame->MessageTextFromValue( GetSize().y ) );
232}
233
234
235void SCH_BITMAP::ViewGetLayers( int aLayers[], int& aCount ) const
236{
237 aCount = 2;
238 aLayers[0] = LAYER_DRAW_BITMAPS;
239 aLayers[1] = LAYER_SELECTION_SHADOWS;
240}
241
242
243static struct SCH_BITMAP_DESC
244{
246 {
250 }
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:48
void Rotate(bool aRotateCCW)
Rotate image CW or CCW.
void PlotImage(PLOTTER *aPlotter, const VECTOR2I &aPos, const KIGFX::COLOR4D &aDefaultColor, int aDefaultPensize) const
Plot bitmap on plotter.
const BOX2I GetBoundingBox() const
Return the orthogonal, bounding box of this object for display purposes.
void Mirror(bool aVertically)
Mirror image vertically (i.e.
void DrawBitmap(wxDC *aDC, const VECTOR2I &aPos, const KIGFX::COLOR4D &aBackgroundColor=KIGFX::COLOR4D::UNSPECIFIED)
void SetPixelSizeIu(double aPixSize)
Definition: bitmap_base.h:65
bool ReadImageFile(const wxString &aFullFilename)
Reads and stores in memory an image file.
int GetPPI() const
Definition: bitmap_base.h:117
VECTOR2I GetSize() const
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:270
void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
Definition: box2.h:112
bool Contains(const Vec &aPoint) const
Definition: box2.h:142
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:507
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
virtual const COLOR4D & GetBackgroundColor() const =0
Return current background color settings.
wxDC * GetPrintDC() const
Base plotter engine class.
Definition: plotter.h:104
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:135
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:74
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:76
Object to handle a bitmap image that can be inserted in a schematic.
Definition: sch_bitmap.h:41
double GetImageScale() const
Definition: sch_bitmap.h:67
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
Print a schematic item.
Definition: sch_bitmap.cpp:137
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: sch_bitmap.cpp:107
SCH_BITMAP(const VECTOR2I &pos=VECTOR2I(0, 0))
Definition: sch_bitmap.cpp:43
void Rotate(const VECTOR2I &aCenter) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
Definition: sch_bitmap.cpp:165
VECTOR2I m_pos
Definition: sch_bitmap.h:162
BITMAP_BASE * GetImage() const
Definition: sch_bitmap.h:54
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Definition: sch_bitmap.cpp:235
BITMAP_BASE * m_bitmapBase
Definition: sch_bitmap.h:163
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: sch_bitmap.cpp:127
wxString GetClass() const override
Return the class name.
Definition: sch_bitmap.h:82
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
Definition: sch_bitmap.cpp:151
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: sch_bitmap.cpp:223
VECTOR2I GetSize() const
Definition: sch_bitmap.cpp:145
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: sch_bitmap.cpp:217
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: sch_bitmap.cpp:183
SCH_BITMAP & operator=(const SCH_ITEM &aItem)
Definition: sch_bitmap.cpp:62
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition: sch_bitmap.cpp:113
bool ReadImageFile(const wxString &aFullFilename)
Read and store an image file.
Definition: sch_bitmap.cpp:83
void Plot(PLOTTER *aPlotter, bool aBackground) const override
Plot the schematic item to aPlotter.
Definition: sch_bitmap.cpp:206
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
Definition: sch_bitmap.cpp:158
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:150
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition: sch_item.cpp:71
virtual wxString GetClass() const override
Return the class name.
Definition: sch_item.h:160
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:257
void SwapFlags(SCH_ITEM *aItem)
Swap the non-temp and non-edit flags.
Definition: sch_item.cpp:267
SCH_LAYER_ID m_layer
Definition: sch_item.h:510
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A lower-precision version of StringFromValue().
The common library.
#define _(s)
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:439
@ LAYER_DRAW_BITMAPS
to handle and draw images bitmaps
Definition: layer_ids.h:224
@ LAYER_NOTES
Definition: layer_ids.h:363
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:387
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:40
#define TYPE_HASH(x)
Definition: property.h:64
#define REGISTER_TYPE(x)
Definition: property_mgr.h:356
static struct SCH_BITMAP_DESC _SCH_BITMAP_DESC
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
@ SCH_BITMAP_T
Definition: typeinfo.h:147