KiCad PCB EDA Suite
Loading...
Searching...
No Matches
ds_painter.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) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
5 *
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
25
26#include <common.h>
27#include <pgm_base.h>
28#include <base_screen.h>
29#include <eda_draw_frame.h>
30#include <title_block.h>
31#include <build_version.h>
35
38
39#include <wx/app.h>
40
41using namespace KIGFX;
42
43static const wxString productName = wxT( "KiCad E.D.A. " );
44
46{
47 m_backgroundColor = COLOR4D( 1.0, 1.0, 1.0, 1.0 );
50 m_brightenedColor = COLOR4D( 0.0, 1.0, 0.0, 0.9 );
51 m_pageBorderColor = COLOR4D( 0.4, 0.4, 0.4, 1.0 );
52
53 update();
54}
55
56
58{
59 for( int layer = SCH_LAYER_ID_START; layer < SCH_LAYER_ID_END; layer ++)
60 m_layerColors[ layer ] = aSettings->GetColor( layer );
61
62 for( int layer = GAL_LAYER_ID_START; layer < GAL_LAYER_ID_END; layer ++)
63 m_layerColors[ layer ] = aSettings->GetColor( layer );
64
68}
69
70
71COLOR4D DS_RENDER_SETTINGS::GetColor( const VIEW_ITEM* aItem, int aLayer ) const
72{
73 const EDA_ITEM* item = dynamic_cast<const EDA_ITEM*>( aItem );
74
75 if( item )
76 {
77 // Selection disambiguation
78 if( item->IsBrightened() )
79 return m_brightenedColor;
80
81 if( item->IsSelected() )
82 return m_selectedColor;
83
84 if( item->Type() == WSG_TEXT_T )
85 {
86 COLOR4D color = static_cast<const DS_DRAW_ITEM_TEXT*>( item )->GetTextColor();
87
89 return color;
90 }
91 }
92
93 return m_normalColor;
94}
95
96
97void DS_DRAW_ITEM_LIST::GetTextVars( wxArrayString* aVars )
98{
99 aVars->push_back( wxT( "KICAD_VERSION" ) );
100 aVars->push_back( wxT( "#" ) );
101 aVars->push_back( wxT( "##" ) );
102 aVars->push_back( wxT( "SHEETNAME" ) );
103 aVars->push_back( wxT( "SHEETPATH" ) );
104 aVars->push_back( wxT( "FILENAME" ) );
105 aVars->push_back( wxT( "PAPER" ) );
106 aVars->push_back( wxT( "LAYER" ) );
108}
109
110
111// Returns the full text corresponding to the aTextbase, after replacing any text variable
112// references.
113wxString DS_DRAW_ITEM_LIST::BuildFullText( const wxString& aTextbase )
114{
115 std::function<bool( wxString* )> wsResolver =
116 [ this ]( wxString* token ) -> bool
117 {
118 bool tokenUpdated = false;
119
120 if( token->IsSameAs( wxT( "KICAD_VERSION" ) ) && PgmOrNull() )
121 {
122 // TODO: it'd be nice to get the Python script name/version here for when
123 // PgmOrNull() is null...
124
125 *token = wxString::Format( wxT( "%s%s %s" ),
127 Pgm().App().GetAppName(),
128 GetBuildVersion() );
129 tokenUpdated = true;
130 }
131 else if( token->IsSameAs( wxT( "#" ) ) )
132 {
133 *token = wxString::Format( wxT( "%s" ), m_pageNumber );
134 tokenUpdated = true;
135 }
136 else if( token->IsSameAs( wxT( "##" ) ) )
137 {
138 *token = wxString::Format( wxT( "%d" ), m_sheetCount );
139 tokenUpdated = true;
140 }
141 else if( token->IsSameAs( wxT( "SHEETNAME" ) ) )
142 {
143 *token = m_sheetName;
144 tokenUpdated = true;
145 }
146 else if( token->IsSameAs( wxT( "SHEETPATH" ) ) )
147 {
148 *token = m_sheetPath;
149 tokenUpdated = true;
150 }
151 else if( token->IsSameAs( wxT( "FILENAME" ) ) )
152 {
153 wxFileName fn( m_fileName );
154 *token = fn.GetFullName();
155 tokenUpdated = true;
156 }
157 else if( token->IsSameAs( wxT( "PAPER" ) ) )
158 {
159 *token = m_paperFormat;
160 tokenUpdated = true;
161 }
162 else if( token->IsSameAs( wxT( "LAYER" ) ) )
163 {
164 *token = m_sheetLayer;
165 tokenUpdated = true;
166 }
167 else if( m_titleBlock )
168 {
169 // no need for tokenUpdated; TITLE_BLOCK::TextVarResolver() does a full
170 // resolve
171 if( m_titleBlock->TextVarResolver( token, m_project ) )
172 return true;
173 }
174 else if( m_properties && m_properties->count( *token ) )
175 {
176 *token = m_properties->at( *token );
177 tokenUpdated = true;
178 }
179
180 if( tokenUpdated )
181 {
182 *token = ExpandTextVars( *token, m_project );
183 return true;
184 }
185
186 if( m_project && m_project->TextVarResolver( token ) )
187 return true;
188
189 return false;
190 };
191
192 return ExpandTextVars( aTextbase, &wsResolver );
193}
194
195
196bool KIGFX::DS_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer )
197{
198 auto item = dynamic_cast<const EDA_ITEM*>( aItem );
199
200 if( !item )
201 return false;
202
203 switch( item->Type() )
204 {
205 case WSG_LINE_T: draw( (DS_DRAW_ITEM_LINE*) item, aLayer ); break;
206 case WSG_POLY_T: draw( (DS_DRAW_ITEM_POLYPOLYGONS*) item, aLayer ); break;
207 case WSG_RECT_T: draw( (DS_DRAW_ITEM_RECT*) item, aLayer ); break;
208 case WSG_TEXT_T: draw( (DS_DRAW_ITEM_TEXT*) item, aLayer ); break;
209 case WSG_BITMAP_T: draw( (DS_DRAW_ITEM_BITMAP*) item, aLayer ); break;
210 case WSG_PAGE_T: draw( (DS_DRAW_ITEM_PAGE*) item, aLayer ); break;
211 default: return false;
212 }
213
214 return true;
215}
216
217
218void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_LINE* aItem, int aLayer ) const
219{
220 m_gal->SetIsStroke( true );
221 m_gal->SetIsFill( false );
222 m_gal->SetStrokeColor( m_renderSettings.GetColor( aItem, aLayer ) );
223 m_gal->SetLineWidth( std::max( aItem->GetPenWidth(), m_renderSettings.GetDefaultPenWidth() ) );
224 m_gal->DrawLine( VECTOR2D( aItem->GetStart() ), VECTOR2D( aItem->GetEnd() ) );
225}
226
227
228void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_RECT* aItem, int aLayer ) const
229{
230 m_gal->SetIsStroke( true );
231 m_gal->SetIsFill( false );
232 m_gal->SetStrokeColor( m_renderSettings.GetColor( aItem, aLayer ) );
233 m_gal->SetLineWidth( std::max( aItem->GetPenWidth(), m_renderSettings.GetDefaultPenWidth() ) );
234 m_gal->DrawRectangle( VECTOR2D( aItem->GetStart() ), VECTOR2D( aItem->GetEnd() ) );
235}
236
237
238void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_POLYPOLYGONS* aItem, int aLayer ) const
239{
240 m_gal->SetFillColor( m_renderSettings.GetColor( aItem, aLayer ) );
241 m_gal->SetIsFill( true );
242 m_gal->SetIsStroke( false );
243
245
246 for( int idx = 0; idx < item->GetPolygons().OutlineCount(); ++idx )
247 {
248 SHAPE_LINE_CHAIN& outline = item->GetPolygons().Outline( idx );
249 m_gal->DrawPolygon( outline );
250 }
251}
252
253
254void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_TEXT* aItem, int aLayer ) const
255{
256 KIFONT::FONT* font = aItem->GetFont();
257
258 if( !font )
259 {
260 font = KIFONT::FONT::GetFont( m_renderSettings.GetDefaultFont(), aItem->IsBold(),
261 aItem->IsItalic() );
262 }
263
264 const COLOR4D& color = m_renderSettings.GetColor( aItem, aLayer );
265
266 m_gal->SetStrokeColor( color );
267 m_gal->SetFillColor( color );
268
269 TEXT_ATTRIBUTES attrs = aItem->GetAttributes();
270 attrs.m_StrokeWidth = std::max( aItem->GetEffectiveTextPenWidth(),
271 m_renderSettings.GetDefaultPenWidth() );
272
273 font->Draw( m_gal, aItem->GetShownText( true ), aItem->GetTextPos(), attrs,
274 aItem->GetFontMetrics() );
275}
276
277
278void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_BITMAP* aItem, int aLayer ) const
279{
280 m_gal->Save();
281 auto* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( aItem->GetPeer() );
282
283 VECTOR2D position = aItem->GetPosition();
284 m_gal->Translate( position );
285
286 // If we've failed to read the bitmap data, don't try to draw it
287 if( !( bitmap && bitmap->m_ImageBitmap
288 && bitmap->m_ImageBitmap->GetImageData() ) )
289 {
290 return;
291 }
292
293 // When the image scale factor is not 1.0, we need to modify the actual scale
294 // as the image scale factor is similar to a local zoom
295 double img_scale = bitmap->m_ImageBitmap->GetScale();
296
297 if( img_scale != 1.0 )
298 m_gal->Scale( VECTOR2D( img_scale, img_scale ) );
299
300 m_gal->DrawBitmap( *bitmap->m_ImageBitmap );
301
302#if 0 // For bounding box debug purpose only
303 BOX2I bbox = aItem->GetBoundingBox();
304 m_gal->SetIsFill( true );
305 m_gal->SetIsStroke( true );
306 m_gal->SetFillColor( COLOR4D( 1, 1, 1, 0.4 ) );
307 m_gal->SetStrokeColor( COLOR4D( 0, 0, 0, 1 ) );
308
309 if( img_scale != 1.0 )
310 m_gal->Scale( VECTOR2D( 1.0, 1.0 ) );
311
312 m_gal->DrawRectangle( VECTOR2D( bbox.GetOrigin() ) - position,
313 VECTOR2D( bbox.GetEnd() ) - position );
314#endif
315
316 m_gal->Restore();
317}
318
319
320void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_PAGE* aItem, int aLayer ) const
321{
322 VECTOR2D origin = VECTOR2D( 0.0, 0.0 );
323 VECTOR2D end = VECTOR2D( aItem->GetPageSize().x,
324 aItem->GetPageSize().y );
325
326 m_gal->SetIsStroke( true );
327
328 // Use a gray color for the border color
329 m_gal->SetStrokeColor( m_renderSettings.m_pageBorderColor );
330 m_gal->SetIsFill( false );
331 m_gal->SetLineWidth( m_renderSettings.GetDefaultPenWidth() );
332
333 m_gal->DrawRectangle( origin, end );
334
335 // Draw the corner marker
336 double marker_size = aItem->GetMarkerSize();
337
338 m_gal->SetStrokeColor( m_renderSettings.m_pageBorderColor );
339 VECTOR2D pos = VECTOR2D( aItem->GetMarkerPos().x, aItem->GetMarkerPos().y );
340
341 // Draw a circle and a X
342 m_gal->DrawCircle( pos, marker_size );
343 m_gal->DrawLine( VECTOR2D( pos.x - marker_size, pos.y - marker_size),
344 VECTOR2D( pos.x + marker_size, pos.y + marker_size ) );
345 m_gal->DrawLine( VECTOR2D( pos.x + marker_size, pos.y - marker_size),
346 VECTOR2D( pos.x - marker_size, pos.y + marker_size ) );
347}
348
349
350void KIGFX::DS_PAINTER::DrawBorder( const PAGE_INFO* aPageInfo, int aScaleFactor ) const
351{
352 VECTOR2D origin = VECTOR2D( 0.0, 0.0 );
353 VECTOR2D end = VECTOR2D( aPageInfo->GetWidthMils() * aScaleFactor,
354 aPageInfo->GetHeightMils() * aScaleFactor );
355
356 m_gal->SetIsStroke( true );
357 // Use a gray color for the border color
358 m_gal->SetStrokeColor( m_renderSettings.m_pageBorderColor );
359 m_gal->SetIsFill( false );
360 m_gal->DrawRectangle( origin, end );
361}
int color
Definition: DXF_plotter.cpp:58
BASE_SCREEN class implementation.
wxString GetBuildVersion()
Get the full KiCad version string.
const Vec & GetOrigin() const
Definition: box2.h:184
const Vec GetEnd() const
Definition: box2.h:186
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
virtual int GetPenWidth() const
Definition: ds_draw_item.h:70
DS_DATA_ITEM * GetPeer() const
Definition: ds_draw_item.h:63
const KIFONT::METRICS & GetFontMetrics() const
VECTOR2I GetPosition() const override
Definition: ds_draw_item.h:373
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
const VECTOR2I & GetStart() const
Definition: ds_draw_item.h:144
const VECTOR2I & GetEnd() const
Definition: ds_draw_item.h:146
static void GetTextVars(wxArrayString *aVars)
Definition: ds_painter.cpp:97
wxString BuildFullText(const wxString &aTextbase)
Definition: ds_painter.cpp:113
A rectangle with thick segment showing the page limits and a marker showing the coordinate origin.
Definition: ds_draw_item.h:266
const VECTOR2I & GetMarkerPos() const
Definition: ds_draw_item.h:280
double GetMarkerSize() const
Definition: ds_draw_item.h:283
VECTOR2I GetPageSize() const
Definition: ds_draw_item.h:278
SHAPE_POLY_SET & GetPolygons()
Definition: ds_draw_item.h:182
Non filled rectangle with thick segment.
Definition: ds_draw_item.h:218
const VECTOR2I & GetEnd() const
Definition: ds_draw_item.h:233
const VECTOR2I & GetStart() const
Definition: ds_draw_item.h:231
A graphic text.
Definition: ds_draw_item.h:313
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
bool IsSelected() const
Definition: eda_item.h:106
bool IsBrightened() const
Definition: eda_item.h:108
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:219
bool IsItalic() const
Definition: eda_text.h:141
KIFONT::FONT * GetFont() const
Definition: eda_text.h:199
const TEXT_ATTRIBUTES & GetAttributes() const
Definition: eda_text.h:183
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition: eda_text.cpp:305
bool IsBold() const
Definition: eda_text.h:144
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition: eda_text.h:106
FONT is an abstract base class for both outline and stroke fonts.
Definition: font.h:131
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false)
Definition: font.cpp:146
void Draw(KIGFX::GAL *aGal, const wxString &aText, const VECTOR2I &aPosition, const VECTOR2I &aCursor, const TEXT_ATTRIBUTES &aAttributes, const METRICS &aFontMetrics) const
Draw a string.
Definition: font.cpp:251
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
Definition: color4d.h:268
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition: color4d.h:382
void DrawBorder(const PAGE_INFO *aPageInfo, int aScaleFactor) const
Definition: ds_painter.cpp:350
void draw(const DS_DRAW_ITEM_LINE *aItem, int aLayer) const
Definition: ds_painter.cpp:218
virtual bool Draw(const VIEW_ITEM *, int) override
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
Definition: ds_painter.cpp:196
void LoadColors(const COLOR_SETTINGS *aSettings) override
Definition: ds_painter.cpp:57
virtual COLOR4D GetColor(const VIEW_ITEM *aItem, int aLayer) const override
Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer using curr...
Definition: ds_painter.cpp:71
virtual void update()
Precalculates extra colors for layers (e.g.
COLOR4D m_layerColors[LAYER_ID_COUNT]
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:82
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:53
int GetHeightMils() const
Definition: page_info.h:132
int GetWidthMils() const
Definition: page_info.h:129
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
static void GetContextualTextVars(wxArrayString *aVars)
Definition: title_block.cpp:74
@ RED
Definition: color4d.h:59
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject)
Definition: common.cpp:58
The common library.
PGM_BASE * PgmOrNull()
similar to PGM_BASE& Pgm(), but return a reference that can be nullptr when running a shared lib from...
Definition: cvpcb.cpp:125
static const wxString productName
Definition: ds_painter.cpp:43
@ GAL_LAYER_ID_START
Definition: layer_ids.h:192
@ GAL_LAYER_ID_END
Definition: layer_ids.h:261
@ SCH_LAYER_ID_END
Definition: layer_ids.h:396
@ SCH_LAYER_ID_START
Definition: layer_ids.h:347
@ LAYER_SCHEMATIC_DRAWINGSHEET
Definition: layer_ids.h:388
@ LAYER_SCHEMATIC_BACKGROUND
Definition: layer_ids.h:382
@ LAYER_SCHEMATIC_GRID
Definition: layer_ids.h:380
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:247
see class PGM_BASE
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:115
@ WSG_POLY_T
Definition: typeinfo.h:221
@ WSG_LINE_T
Definition: typeinfo.h:219
@ WSG_TEXT_T
Definition: typeinfo.h:222
@ WSG_PAGE_T
Definition: typeinfo.h:224
@ WSG_RECT_T
Definition: typeinfo.h:220
@ WSG_BITMAP_T
Definition: typeinfo.h:223
VECTOR2< double > VECTOR2D
Definition: vector2d.h:587