1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2019-2020 CERN
5  * Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
25  */
26 
27 #ifndef __SCH_PAINTER_H
28 #define __SCH_PAINTER_H
29 
30 #include <sch_symbol.h>
31 
32 #include <painter.h>
33 
34 
35 class LIB_PIN;
36 class LIB_SHAPE;
37 class LIB_ITEM;
38 class LIB_SYMBOL;
39 class LIB_FIELD;
40 class LIB_TEXT;
41 class SCH_SYMBOL;
42 class SCH_FIELD;
43 class SCH_JUNCTION;
44 class SCH_LABEL;
45 class SCH_TEXT;
46 class SCH_HIERLABEL;
47 class SCH_GLOBALLABEL;
48 class SCH_SHEET;
49 class SCH_SHEET_PIN;
50 class SCH_MARKER;
51 class SCH_NO_CONNECT;
52 class SCH_LINE;
53 class SCH_BUS_ENTRY_BASE;
54 class SCH_BITMAP;
55 class SCHEMATIC;
56 
57 namespace KIGFX
58 {
59 class GAL;
60 class SCH_PAINTER;
61 
62 
63 /**
64  * Store schematic specific render settings.
65  */
66 class SCH_RENDER_SETTINGS : public RENDER_SETTINGS
67 {
68 public:
69     friend class SCH_PAINTER;
70 
71     SCH_RENDER_SETTINGS();
72 
73     void LoadColors( const COLOR_SETTINGS* aSettings ) override;
74 
75     /// @copydoc RENDER_SETTINGS::GetColor()
76     virtual COLOR4D GetColor( const VIEW_ITEM* aItem, int aLayer ) const override;
77 
IsBackgroundDark()78     bool IsBackgroundDark() const override
79     {
80         auto luma = m_layerColors[ LAYER_SCHEMATIC_BACKGROUND ].GetBrightness();
81 
82         return luma < 0.5;
83     }
84 
GetBackgroundColor()85     const COLOR4D& GetBackgroundColor() override
86     {
87         return m_layerColors[ LAYER_SCHEMATIC_BACKGROUND ];
88     }
89 
SetBackgroundColor(const COLOR4D & aColor)90     void SetBackgroundColor( const COLOR4D& aColor ) override
91     {
92         m_layerColors[ LAYER_SCHEMATIC_BACKGROUND ] = aColor;
93     }
94 
GetDanglineSymbolThickness()95     float GetDanglineSymbolThickness() const
96     {
97         return (float) m_defaultPenWidth / 3.0F;
98     }
99 
GetGridColor()100     const COLOR4D& GetGridColor() override { return m_layerColors[ LAYER_SCHEMATIC_GRID ]; }
101 
GetCursorColor()102     const COLOR4D& GetCursorColor() override { return m_layerColors[ LAYER_SCHEMATIC_CURSOR ]; }
103 
104     bool   m_IsSymbolEditor;
105 
106     int    m_ShowUnit;                // Show all units if 0
107     int    m_ShowConvert;             // Show all conversions if 0
108 
109     bool   m_ShowHiddenText;
110     bool   m_ShowHiddenPins;
111     bool   m_ShowPinsElectricalType;
112     bool   m_ShowDisabled;
113     bool   m_ShowGraphicsDisabled;
114     bool   m_ShowUmbilicals;
115 
116     bool   m_OverrideItemColors;
117 
118     double m_LabelSizeRatio;         // Proportion of font size to label box
119     double m_TextOffsetRatio;        // Proportion of font size to offset text above/below
120                                      // wires, buses, etc.
121 
122     int    m_PinSymbolSize;
123     int    m_JunctionSize;
124 };
125 
126 
127 /**
128  * Contains methods for drawing schematic-specific items.
129  */
130 class SCH_PAINTER : public PAINTER
131 {
132 public:
133     SCH_PAINTER( GAL* aGal );
134 
135     /// @copydoc PAINTER::Draw()
136     virtual bool Draw( const VIEW_ITEM*, int ) override;
137 
138     /// @copydoc PAINTER::GetSettings()
GetSettings()139     virtual SCH_RENDER_SETTINGS* GetSettings() override
140     {
141         return &m_schSettings;
142     }
143 
SetSchematic(SCHEMATIC * aSchematic)144     void SetSchematic( SCHEMATIC* aSchematic )
145     {
146         m_schematic = aSchematic;
147     }
148 
149 private:
150     void draw( LIB_PIN* aPin, int aLayer );
151     void draw( const LIB_SHAPE* aCircle, int aLayer );
152     void draw( const LIB_SYMBOL* aSymbol, int, bool aDrawFields = true, int aUnit = 0,
153                int aConvert = 0 );
154     void draw( const LIB_FIELD* aField, int aLayer );
155     void draw( const LIB_TEXT* aText, int aLayer );
156     void draw( SCH_SYMBOL* aSymbol, int aLayer );
157     void draw( const SCH_JUNCTION* aJct, int aLayer );
158     void draw( const SCH_FIELD* aField, int aLayer );
159     void draw( const SCH_TEXT* aText, int aLayer );
160     void draw( SCH_HIERLABEL* aLabel, int aLayer );
161     void draw( SCH_GLOBALLABEL* aLabel, int aLayer );
162     void draw( const SCH_SHEET* aSheet, int aLayer );
163     void draw( const SCH_NO_CONNECT* aNC, int aLayer );
164     void draw( const SCH_MARKER* aMarker, int aLayer );
165     void draw( const SCH_BITMAP* aBitmap, int aLayer );
166     void draw( const SCH_LINE* aLine, int aLayer );
167     void draw( const SCH_BUS_ENTRY_BASE* aEntry, int aLayer );
168 
169     void drawPinDanglingSymbol( const VECTOR2I& aPos, const COLOR4D& aColor,
170                                 bool aDrawingShadows );
171     void drawDanglingSymbol( const wxPoint& aPos, const COLOR4D& aColor, int aWidth,
172                              bool aDrawingShadows );
173 
174     int internalPinDecoSize( const LIB_PIN &aPin );
175     int externalPinDecoSize( const LIB_PIN &aPin );
176 
177     bool isUnitAndConversionShown( const LIB_ITEM* aItem ) const;
178 
179     float getShadowWidth() const;
180     COLOR4D getRenderColor( const EDA_ITEM* aItem, int aLayer, bool aDrawingShadows ) const;
181     float getLineWidth( const LIB_ITEM* aItem, bool aDrawingShadows ) const;
182     float getLineWidth( const SCH_ITEM* aItem, bool aDrawingShadows ) const;
183     float getTextThickness( const SCH_TEXT* aItem, bool aDrawingShadows ) const;
184     float getTextThickness( const SCH_FIELD* aItem, bool aDrawingShadows ) const;
185     float getTextThickness( const LIB_FIELD* aItem, bool aDrawingShadows ) const;
186     float getTextThickness( const LIB_TEXT* aItem, bool aDrawingShadows ) const;
187 
188     bool setDeviceColors( const LIB_ITEM* aItem, int aLayer );
189 
190     void triLine ( const VECTOR2D &a, const VECTOR2D &b, const VECTOR2D &c );
191     void strokeText( const wxString& aText, const VECTOR2D& aPosition, double aRotationAngle );
192     void boxText( const wxString& aText, const VECTOR2D& aPosition, double aAngle );
193 
194 private:
195     SCH_RENDER_SETTINGS m_schSettings;
196 
197     SCHEMATIC* m_schematic;
198 };
199 
200 }; // namespace KIGFX
201 
202 
203 #endif // __SCH_PAINTER_H
204