KiCad PCB EDA Suite
gr_text.cpp File Reference
#include <gr_basic.h>
#include <plotter.h>
#include <eda_text.h>
#include <trigo.h>
#include <base_screen.h>
#include <gr_text.h>
#include <math/util.h>
#include <basic_gal.h>

Go to the source code of this file.

Functions

int GetPenSizeForBold (int aTextSize)
 
int GetPenSizeForNormal (int aTextSize)
 
int Clamp_Text_PenSize (int aPenSize, int aSize, bool aBold)
 Don't allow text to become cluttered up in its own fatness. More...
 
float Clamp_Text_PenSize (float aPenSize, int aSize, bool aBold)
 
int Clamp_Text_PenSize (int aPenSize, const wxSize &aSize, bool aBold)
 
int GraphicTextWidth (const wxString &aText, const wxSize &aSize, bool aItalic, bool aBold)
 The full X size is GraphicTextWidth + the thickness of graphic lines. More...
 
void GRText (wxDC *aDC, const wxPoint &aPos, const COLOR4D &aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
 Draw a graphic text (like footprint texts). More...
 
void GRHaloText (wxDC *aDC, const wxPoint &aPos, const COLOR4D &aBgColor, const COLOR4D &aColor1, const COLOR4D &aColor2, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
 Draw graphic text with a border so that it can be read on different backgrounds. More...
 

Function Documentation

◆ Clamp_Text_PenSize() [1/3]

int Clamp_Text_PenSize ( int  aPenSize,
int  aSize,
bool  aBold 
)

Don't allow text to become cluttered up in its own fatness.

As a rule, pen width should not be >1/4em, otherwise the character will be cluttered up in its own fatness.

Bold fonts are generally around aSize/5 in width, so we limit them to aSize/4, and normal text to aSize/6.

Parameters
aPenSizeis the pen size to clamp.
aSizeis the character size (height or width).
aBolduse true if text accept bold pen size.
Returns
the max pen size allowed.

Definition at line 68 of file gr_text.cpp.

69 {
70  double scale = aBold ? 4.0 : 6.0;
71  int maxWidth = KiROUND( (double) aSize / scale );
72 
73  return std::min( aPenSize, maxWidth );
74 }
const int scale
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND(), and scale.

Referenced by Clamp_Text_PenSize(), KIGFX::SCH_PAINTER::draw(), EDA_TEXT::GetEffectiveTextPenWidth(), LIB_PIN::PlotPinTexts(), LIB_PIN::printPinTexts(), and DIALOG_TEXT_PROPERTIES::TransferDataFromWindow().

◆ Clamp_Text_PenSize() [2/3]

float Clamp_Text_PenSize ( float  aPenSize,
int  aSize,
bool  aBold 
)

Definition at line 77 of file gr_text.cpp.

78 {
79  float scale = aBold ? 4.0 : 6.0;
80  float maxWidth = (float) aSize / scale;
81 
82  return std::min( aPenSize, maxWidth );
83 }
const int scale

References scale.

◆ Clamp_Text_PenSize() [3/3]

int Clamp_Text_PenSize ( int  aPenSize,
const wxSize &  aSize,
bool  aBold 
)

Definition at line 86 of file gr_text.cpp.

87 {
88  int size = std::min( std::abs( aSize.x ), std::abs( aSize.y ) );
89 
90  return Clamp_Text_PenSize( aPenSize, size, aBold );
91 }
int Clamp_Text_PenSize(int aPenSize, int aSize, bool aBold)
Don't allow text to become cluttered up in its own fatness.
Definition: gr_text.cpp:68

References Clamp_Text_PenSize().

◆ GetPenSizeForBold()

int GetPenSizeForBold ( int  aTextSize)
Parameters
aTextSizeis the char size (height or width).
Returns
the "best" value for a pen size to draw/plot a bold text.

Definition at line 47 of file gr_text.cpp.

48 {
49  return KiROUND( aTextSize / 5.0 );
50 }
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND().

Referenced by EDA_TEXT::GetEffectiveTextPenWidth(), GRText(), SCH_LEGACY_PLUGIN::loadText(), SCH_EAGLE_PLUGIN::loadTextAttributes(), DS_DATA_ITEM_TEXT::SyncDrawItems(), and DIALOG_LABEL_EDITOR::TransferDataFromWindow().

◆ GetPenSizeForNormal()

int GetPenSizeForNormal ( int  aTextSize)
Parameters
aTextSize= the char size (height or width).
Returns
the "best" value for a pen size to draw/plot a non-bold text.

Definition at line 53 of file gr_text.cpp.

54 {
55  return KiROUND( aTextSize / 8.0 );
56 }
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND().

Referenced by EDA_TEXT::GetEffectiveTextPenWidth().

◆ GraphicTextWidth()

int GraphicTextWidth ( const wxString &  aText,
const wxSize &  aSize,
bool  italic,
bool  bold 
)

The full X size is GraphicTextWidth + the thickness of graphic lines.

Returns
the X size of the graphic text.

Definition at line 94 of file gr_text.cpp.

95 {
96  basic_gal.SetFontItalic( aItalic );
97  basic_gal.SetFontBold( aBold );
98  basic_gal.SetGlyphSize( VECTOR2D( aSize ) );
99 
100  VECTOR2D tsize = basic_gal.GetTextLineSize( aText );
101 
102  return KiROUND( tsize.x );
103 }
void SetFontBold(bool aBold)
Set bold property of current font.
VECTOR2D GetTextLineSize(const UTF8 &aText) const
Compute the X and Y size of a given text.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:622
void SetFontItalic(bool aItalic)
Set italic property of current font.
void SetGlyphSize(const VECTOR2D &aSize)
Set the font glyph size.
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73
BASIC_GAL basic_gal(basic_displayOptions)

References basic_gal, KIGFX::GAL::GetTextLineSize(), KiROUND(), KIGFX::GAL::SetFontBold(), KIGFX::GAL::SetFontItalic(), KIGFX::GAL::SetGlyphSize(), and VECTOR2< T >::x.

Referenced by SVG_PLOTTER::Text().

◆ GRHaloText()

void GRHaloText ( wxDC *  aDC,
const wxPoint &  aPos,
const COLOR4D aBgColor,
const COLOR4D aColor1,
const COLOR4D aColor2,
const wxString &  aText,
double  aOrient,
const wxSize &  aSize,
enum EDA_TEXT_HJUSTIFY_T  aH_justify,
enum EDA_TEXT_VJUSTIFY_T  aV_justify,
int  aWidth,
bool  aItalic,
bool  aBold,
void(*)(int x0, int y0, int xf, int yf, void *aData)  aCallback = nullptr,
void *  aCallbackData = nullptr,
PLOTTER aPlotter = nullptr 
)

Draw graphic text with a border so that it can be read on different backgrounds.

See GRText for most of the parameters. If aBgColor is a dark color text is drawn in aColor2 with aColor1 border. Otherwise colors are swapped.

Definition at line 174 of file gr_text.cpp.

180 {
181  COLOR4D color1 = aColor1;
182  COLOR4D color2 = aColor2;
183 
184  // Swap color if contrast would be better
185  // TODO: Maybe calculate contrast some way other than brightness
186  if( aBgColor.GetBrightness() > 0.5 )
187  {
188  COLOR4D c = color1;
189  color1 = color2;
190  color2 = c;
191  }
192 
193  // Draw the background
194  GRText( aDC, aPos, color1, aText, aOrient, aSize, aH_justify, aV_justify, aWidth, aItalic,
195  aBold, aCallback, aCallbackData, aPlotter );
196 
197  // Draw the text
198  GRText( aDC, aPos, color2, aText, aOrient, aSize, aH_justify, aV_justify, aWidth / 4, aItalic,
199  aBold, aCallback, aCallbackData, aPlotter );
200 }
double GetBrightness() const
Returns the brightness value of the color ranged from 0.0 to 1.0.
Definition: color4d.h:327
void GRText(wxDC *aDC, const wxPoint &aPos, const COLOR4D &aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
Draw a graphic text (like footprint texts).
Definition: gr_text.cpp:130
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103

References KIGFX::COLOR4D::GetBrightness(), and GRText().

◆ GRText()

void GRText ( wxDC *  aDC,
const wxPoint &  aPos,
const COLOR4D aColor,
const wxString &  aText,
double  aOrient,
const wxSize &  aSize,
enum EDA_TEXT_HJUSTIFY_T  aH_justify,
enum EDA_TEXT_VJUSTIFY_T  aV_justify,
int  aWidth,
bool  aItalic,
bool  aBold,
void(*)(int x0, int y0, int xf, int yf, void *aData)  aCallback,
void *  aCallbackData,
PLOTTER aPlotter 
)

Draw a graphic text (like footprint texts).

Draw a graphic text (like footprint text)

Parameters
aDCis the current Device Context. NULL if draw within a 3D GL Canvas.
aPosis the text position (according to h_justify, v_justify).
aColoris the text color.
aTextis the text to draw.
aOrientis the angle in 0.1 degree.
aSizeis the text size (size.x or size.y can be < 0 for mirrored texts).
aH_justifyis the horizontal justification (Left, center, right).
aV_justifyis the vertical justification (bottom, center, top).
aWidthis the line width (pen width) (use default width if aWidth = 0). if width < 0 : draw segments in sketch mode, width = abs(width) Use a value min(aSize.x, aSize.y) / 5 for a bold text.
aItalicis the true to simulate an italic font.
aBolduse true to use a bold font. Useful only with default width value (aWidth = 0).
aCallback(int x0, int y0, int xf, int yf, void* aData ) is a function called (if non null) to draw each segment. used to draw 3D texts or for plotting. NULL for normal drawings
aCallbackDatais the auxiliary parameter aData for the callback function. can be nullptr if no auxiliary parameter is needed
aPlotteris a PLOTTER instance, when this function is used to plot the text. NULL to draw this text.

Definition at line 130 of file gr_text.cpp.

135 {
136  bool fill_mode = true;
137 
138  if( aWidth == 0 && aBold ) // Use default values if aWidth == 0
139  aWidth = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
140 
141  if( aWidth < 0 )
142  {
143  aWidth = -aWidth;
144  fill_mode = false;
145  }
146 
147  basic_gal.SetIsFill( fill_mode );
148  basic_gal.SetLineWidth( aWidth );
149 
150  EDA_TEXT dummy;
151  dummy.SetItalic( aItalic );
152  dummy.SetBold( aBold );
153  dummy.SetHorizJustify( aH_justify );
154  dummy.SetVertJustify( aV_justify );
155 
156  wxSize size = aSize;
157  dummy.SetMirrored( size.x < 0 );
158 
159  if( size.x < 0 )
160  size.x = - size.x;
161 
162  dummy.SetTextSize( size );
163 
165  basic_gal.SetPlotter( aPlotter );
166  basic_gal.SetCallback( aCallback, aCallbackData );
167  basic_gal.m_DC = aDC;
168  basic_gal.m_Color = aColor;
169  basic_gal.SetClipBox( nullptr );
170  basic_gal.StrokeText( aText, VECTOR2D( aPos ), aOrient * M_PI/1800 );
171 }
int GetPenSizeForBold(int aTextSize)
Definition: gr_text.cpp:47
void SetCallback(void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aData)
Definition: basic_gal.h:81
virtual void SetTextAttributes(const EDA_TEXT *aText)
Loads attributes of the given text (bold/italic/underline/mirrored and so on).
virtual void SetLineWidth(float aLineWidth)
Set the line width.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:119
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:71
VECTOR2< double > VECTOR2D
Definition: vector2d.h:622
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
COLOR4D m_Color
Definition: basic_gal.h:156
virtual void StrokeText(const wxString &aText, const VECTOR2D &aPosition, double aRotationAngle)
Draw a vector type text using preloaded Newstroke font.
void SetPlotter(PLOTTER *aPlotter)
Definition: basic_gal.h:76
wxDC * m_DC
Definition: basic_gal.h:155
BASIC_GAL basic_gal(basic_displayOptions)
void SetClipBox(EDA_RECT *aClipBox)
Set a clip box for drawings If NULL, no clip will be made.
Definition: basic_gal.h:90

References basic_gal, dummy(), GetPenSizeForBold(), BASIC_GAL::m_Color, BASIC_GAL::m_DC, BASIC_GAL::SetCallback(), BASIC_GAL::SetClipBox(), KIGFX::GAL::SetIsFill(), KIGFX::GAL::SetLineWidth(), BASIC_GAL::SetPlotter(), KIGFX::GAL::SetTextAttributes(), and KIGFX::GAL::StrokeText().

Referenced by BOARD_ADAPTER::addFootprintShapesWithClearance(), BOARD_ADAPTER::addShapeWithClearance(), GRHaloText(), LIB_TEXT::print(), SCH_FIELD::Print(), LIB_FIELD::print(), EDA_TEXT::printOneLineOfText(), LIB_PIN::printPinElectricalTypeName(), LIB_PIN::printPinTexts(), PLOTTER::Text(), PCB_TEXT::TransformTextShapeWithClearanceToPolygon(), FP_TEXT::TransformTextShapeWithClearanceToPolygon(), and EDA_TEXT::TransformToSegmentList().