54#include <api/common/types/base_types.pb.h>
97 m_IuScale( aIuScale ),
98 m_render_cache_font( nullptr )
117 m_IuScale( aText.m_IuScale )
133 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aText.
m_render_cache )
136 m_render_cache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
138 m_render_cache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
168 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aText.
m_render_cache )
171 m_render_cache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
173 m_render_cache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
193 types::TextAttributes* attrs =
text.mutable_attributes();
196 attrs->set_font_name(
GetFont()->GetName().ToStdString() );
198 attrs->set_horizontal_alignment(
199 ToProtoEnum<GR_TEXT_H_ALIGN_T, types::HorizontalAlignment>(
GetHorizJustify() ) );
201 attrs->set_vertical_alignment(
202 ToProtoEnum<GR_TEXT_V_ALIGN_T, types::VerticalAlignment>(
GetVertJustify() ) );
208 attrs->set_bold(
IsBold() );
214 PackVector2( *attrs->mutable_size(),
GetTextSize() );
216 aContainer.PackFrom(
text );
225 if( !aContainer.UnpackTo( &
text ) )
228 SetText( wxString(
text.text().c_str(), wxConvUTF8 ) );
232 if(
text.has_attributes() )
243 attrs.
m_Size = UnpackVector2(
text.attributes().size() );
245 if( !
text.attributes().font_name().empty() )
248 wxString(
text.attributes().font_name().c_str(), wxConvUTF8 ), attrs.
m_Bold,
255 attrs.
m_Halign = FromProtoEnum<GR_TEXT_H_ALIGN_T, types::HorizontalAlignment>(
256 text.attributes().horizontal_alignment() );
258 attrs.
m_Valign = FromProtoEnum<GR_TEXT_V_ALIGN_T, types::VerticalAlignment>(
259 text.attributes().vertical_alignment() );
462 penWidth = aDefaultPenWidth;
466 else if( penWidth <= 1 )
529 aEnforceMinTextSize =
false;
531 if( aEnforceMinTextSize )
536 aNewSize =
VECTOR2I( std::clamp( aNewSize.
x, min, max ),
537 std::clamp( aNewSize.
y, min, max ) );
589 if( aOffset.
x == 0 && aOffset.
y == 0 )
597 outline->Move( aOffset );
599 glyph = stroke->Transform( { 1.0, 1.0 }, aOffset, 0,
ANGLE_0,
false, { 0, 0 } );
661std::vector<std::unique_ptr<KIFONT::GLYPH>>*
710 m_render_cache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( aPoly ) );
727 if( cache_it !=
m_bbox_cache.end() && cache_it->second.m_pos == drawPos )
728 return cache_it->second.m_bbox;
731 wxArrayString strings;
739 if( strings.GetCount() )
741 if( aLine >= 0 && ( aLine <
static_cast<int>( strings.GetCount() ) ) )
742 text = strings.Item( aLine );
744 text = strings.Item( 0 );
755 int overbarOffset = 0;
761 int fudgeFactor =
KiROUND( extents.
y * 0.17 );
764 textsize.
y += fudgeFactor;
769 if(
text.Contains( wxT(
"~{" ) ) )
770 overbarOffset = extents.
y / 6;
777 for(
unsigned ii = 1; ii < strings.GetCount(); ii++ )
779 text = strings.Item( ii );
782 textsize.
x = std::max( textsize.
x, extents.
x );
787 textsize.
y +=
KiROUND( ( strings.GetCount() - 1 )
791 textsize.
y += overbarOffset;
819 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
826 bbox.
Offset( 0, -fudgeFactor );
835 bbox.
Offset( 0, fudgeFactor );
839 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
875 std::vector<VECTOR2I> positions;
876 wxArrayString strings;
879 positions.reserve( strings.Count() );
883 for(
unsigned ii = 0; ii < strings.Count(); ii++ )
884 printOneLineOfText( aSettings, aOffset, aColor, aFillMode, strings[ii], positions[ii] );
911 pos.
y -= ( aLineCount - 1 ) * offset.
y / 2;
915 pos.
y -= ( aLineCount - 1 ) * offset.
y;
919 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
930 for(
int ii = 0; ii < aLineCount; ii++ )
932 aPositions.push_back( (
VECTOR2I) pos );
940 const wxString& aText,
const VECTOR2I& aPos )
946 penWidth = -penWidth;
973 wxString stylemsg[4] = {
980 return stylemsg[style];
989 return wxEmptyString;
1001 std::vector<std::string> fontNames;
1002 Fontconfig()->ListFonts( fontNames, std::string(
Pgm().GetLanguageTag().utf8_str() ) );
1004 for(
int ii = 0; ii < (int) fontNames.size(); ++ii )
1020 else if( aIdx == -2 )
1026 std::vector<std::string> fontNames;
1027 Fontconfig()->ListFonts( fontNames, std::string(
Pgm().GetLanguageTag().utf8_str() ) );
1029 if( aIdx >= 0 && aIdx <
static_cast<int>( fontNames.size() ) )
1054 aFormatter->
Print(
"(effects" );
1056 aFormatter->
Print(
"(font" );
1059 aFormatter->
Print(
"(face %s)", aFormatter->
Quotew(
GetFont()->NameAsToken() ).c_str() );
1062 aFormatter->
Print(
"(size %s %s)",
1068 aFormatter->
Print(
"(line_spacing %s)",
1074 aFormatter->
Print(
"(thickness %s)",
1086 aFormatter->
Print(
"(color %d %d %d %s)",
1093 aFormatter->
Print(
")");
1098 aFormatter->
Print(
"(justify");
1107 aFormatter->
Print(
" mirror" );
1109 aFormatter->
Print(
")" );
1120 aFormatter->
Print(
")" );
1128 std::shared_ptr<SHAPE_COMPOUND> shape = std::make_shared<SHAPE_COMPOUND>();
1136 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
1160 shape->AddShape(
new SHAPE_SEGMENT( aPt1, aPt2, penWidth ) );
1167 for(
const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
1168 triShape->
Append( point.x, point.y );
1170 shape->AddShape( triShape );
1185 shape->AddShape(
new SHAPE_SEGMENT( aPt1, aPt2, penWidth ) );
1190 shape->AddShape( aPoly.Clone() );
1205 wxCHECK( aOther, 1 );
1234 return( uri.Create( aURL ) && uri.HasScheme() );
1240 const wxString& str1 =
GetText();
1241 const wxString& str2 = aOther.
GetText();
1243 int m = str1.length();
1244 int n = str2.length();
1246 if( n == 0 || m == 0 )
1250 std::vector<std::vector<int>>
distance(m + 1, std::vector<int>(n + 1));
1253 for(
int i = 0; i <= m; i++ )
1255 for(
int j = 0; j <= n; j++ )
1259 for(
int i = 1; i <= m; i++ )
1261 for(
int j = 1; j <= n; j++ )
1263 if( str1[i - 1] == str2[j - 1] )
1276 int maxLen = std::max( m, n );
1277 double similarity = 1.0 - (
static_cast<double>(
distance[m][n] ) / maxLen );
1285 double retval = 1.0;
1301 return aHref.StartsWith( wxT(
"#" ), aDestination );
1307 return wxT(
"#" ) + aDestination;
1328 if( h_inst.Choices().GetCount() == 0)
1337 if( v_inst.Choices().GetCount() == 0)
1349 PROPERTY_DISPLAY::PT_DEGREE ) );
1351 const wxString textProps =
_HKI(
"Text Properties" );
1366 PROPERTY_DISPLAY::PT_SIZE ),
1383 PROPERTY_DISPLAY::PT_SIZE ),
1388 PROPERTY_DISPLAY::PT_SIZE ),
1392 _HKI(
"Horizontal Justification" ),
1396 _HKI(
"Vertical Justification" ),
constexpr EDA_IU_SCALE unityScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr void SetOrigin(const Vec &pos)
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr const Vec GetCenter() const
constexpr void SetSize(const SizeVec &size)
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr void SetX(coord_type val)
constexpr BOX2< Vec > GetInflated(coord_type aDx, coord_type aDy) const
Get a new rectangle that is this one, inflated by aDx and aDy.
constexpr void SetY(coord_type val)
constexpr void Offset(coord_type dx, coord_type dy)
constexpr bool Intersects(const BOX2< Vec > &aRect) const
static bool Replace(const EDA_SEARCH_DATA &aSearchData, wxString &aText)
Perform a text replace on aText using the find and replace criteria in aSearchData on items that supp...
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
int GetTextHeight() const
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
void SetTextColor(const COLOR4D &aColor)
const VECTOR2I & GetTextPos() const
COLOR4D GetTextColor() const
wxString GetTextStyleName() const
std::map< int, BBOX_CACHE_ENTRY > m_bbox_cache
bool IsDefaultFormatting() const
static bool IsGotoPageHref(const wxString &aHref, wxString *aDestination=nullptr)
Check if aHref is a valid internal hyperlink.
std::vector< std::unique_ptr< KIFONT::GLYPH > > m_render_cache
wxString GetFontName() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
bool IsMultilineAllowed() const
virtual const wxString & GetText() const
Return the string associated with the text object.
int GetInterline() const
Return the distance between two lines of text.
bool IsKeepUpright() const
virtual bool IsVisible() const
void SetTextPos(const VECTOR2I &aPoint)
bool m_shown_text_has_text_var_refs
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
KIFONT::FONT * GetFont() const
bool ResolveFont(const std::vector< wxString > *aEmbeddedFonts)
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
BOX2I GetTextBox(int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
void SetMirrored(bool isMirrored)
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
const KIFONT::FONT * m_render_cache_font
virtual EDA_ANGLE GetDrawRotation() const
wxString m_unresolvedFontName
virtual VECTOR2I GetDrawPos() const
EDA_TEXT & operator=(const EDA_TEXT &aItem)
void printOneLineOfText(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset, const COLOR4D &aColor, OUTLINE_MODE aFillMode, const wxString &aText, const VECTOR2I &aPos)
Print each line of this EDA_TEXT.
virtual bool HasHyperlink() const
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
wxString GetHyperlink() const
void Offset(const VECTOR2I &aOffset)
virtual void Format(OUTPUTFORMATTER *aFormatter, int aControlBits) const
Output the object to aFormatter in s-expression form.
GR_TEXT_H_ALIGN_T GetHorizJustify() const
void SetTextWidth(int aWidth)
void SetBoldFlag(bool aBold)
Set only the italic flag, without changing the font.
bool Replace(const EDA_SEARCH_DATA &aSearchData)
Helper function used in search and replace dialog.
void SetupRenderCache(const wxString &aResolvedText, const KIFONT::FONT *aFont, const EDA_ANGLE &aAngle, const VECTOR2I &aOffset)
int Compare(const EDA_TEXT *aOther) const
std::reference_wrapper< const EDA_IU_SCALE > m_IuScale
virtual void SetVisible(bool aVisible)
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
void GetLinePositions(std::vector< VECTOR2I > &aPositions, int aLineCount) const
Populate aPositions with the position of each line of a multiline text, according to the vertical jus...
static wxString GotoPageHref(const wxString &aDestination)
Generate a href to a page in the current schematic.
virtual void ClearBoundingBoxCache()
virtual KIFONT::FONT * getDrawFont() const
double GetLineSpacing() const
double Similarity(const EDA_TEXT &aOther) const
VECTOR2I m_render_cache_offset
void SetLineSpacing(double aLineSpacing)
void AddRenderCacheGlyph(const SHAPE_POLY_SET &aPoly)
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
virtual bool TextHitTest(const VECTOR2I &aPoint, int aAccuracy=0) const
Test if aPoint is within the bounds of this object.
void SetTextHeight(int aHeight)
virtual void cacheShownText()
EDA_ANGLE m_render_cache_angle
static GR_TEXT_H_ALIGN_T MapHorizJustify(int aHorizJustify)
virtual void ClearRenderCache()
const TEXT_ATTRIBUTES & GetAttributes() const
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
static bool ValidateHyperlink(const wxString &aURL)
Check if aURL is a valid hyperlink.
void SetItalicFlag(bool aItalic)
Set only the italic flag, without changing the font.
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
wxString m_render_cache_text
double GetTextAngleDegrees() const
virtual const KIFONT::METRICS & getFontMetrics() const
std::shared_ptr< SHAPE_COMPOUND > GetEffectiveTextShape(bool aTriangulate=true, const BOX2I &aBBox=BOX2I(), const EDA_ANGLE &aAngle=ANGLE_0) const
build a list of segments (SHAPE_SEGMENT) to describe a text shape.
void SetTextAngleDegrees(double aOrientation)
void SetHyperlink(wxString aLink)
static GR_TEXT_V_ALIGN_T MapVertJustify(int aVertJustify)
void SetKeepUpright(bool aKeepUpright)
void CopyText(const EDA_TEXT &aSrc)
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
virtual void SetText(const wxString &aText)
double Levenshtein(const EDA_TEXT &aOther) const
Return the levenstein distance between two texts.
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetFontIndex(int aIdx)
int GetTextThickness() const
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset, const COLOR4D &aColor, OUTLINE_MODE aDisplay_mode=FILLED)
Print this text object to the device context aDC.
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SwapText(EDA_TEXT &aTradingPartner)
void SetMultilineAllowed(bool aAllow)
void SetFont(KIFONT::FONT *aFont)
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
TEXT_ATTRIBUTES m_attributes
static ENUM_MAP< T > & Instance()
FONT is an abstract base class for both outline and stroke fonts.
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
virtual bool IsStroke() const
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.
const wxString & GetName() const
virtual bool IsOutline() const
VECTOR2I StringBoundaryLimits(const wxString &aText, const VECTOR2I &aSize, int aThickness, bool aBold, bool aItalic, const METRICS &aFontMetrics) const
Compute the boundary limits of aText (the bounding box of all shapes).
virtual double GetInterline(double aGlyphHeight, const METRICS &aFontMetrics) const =0
Compute the distance (interline) between 2 lines of text (for multiline texts).
static const METRICS & Default()
Class OUTLINE_FONT implements outline font drawing.
void GetLinesAsGlyphs(std::vector< std::unique_ptr< GLYPH > > *aGlyphs, const wxString &aText, const VECTOR2I &aPosition, const TEXT_ATTRIBUTES &aAttrs, const METRICS &aFontMetrics) const
A color representation with 4 components: red, green, blue, alpha.
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs)
Draw polygons representing font glyphs.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
const wxString & GetDefaultFont() const
wxDC * GetPrintDC() const
PROPERTY_BASE & SetIsHiddenFromRulesEditor(bool aHide=true)
Provide class metadata.Helper macro to map type hashes to names.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
void Append(int aX, int aY)
Append a new point at the end of the polygon.
int Compare(const TEXT_ATTRIBUTES &aRhs) const
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
#define CTL_OMIT_HYPERLINK
Omit the hyperlink attribute in .kicad_xxx files.
#define CTL_OMIT_HIDE
Omit the hide attribute in .kicad_xxx files.
#define CTL_OMIT_COLOR
Omit the color attribute in .kicad_xxx files.
static constexpr EDA_ANGLE ANGLE_0
std::ostream & operator<<(std::ostream &aStream, const EDA_TEXT &aText)
static struct EDA_TEXT_DESC _EDA_TEXT_DESC
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
#define DEFAULT_SIZE_TEXT
This is the "default-of-the-default" hardcoded text size; individual application define their own def...
static constexpr double ITALIC_TILT
Tilt factor for italic style (this is the scaling factor on dY relative coordinates to give a tilted ...
FONTCONFIG * Fontconfig()
int GetPenSizeForBold(int aTextSize)
int GetPenSizeForNormal(int aTextSize)
void GRPrintText(wxDC *aDC, const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics)
Print a graphic text through wxDC.
int ClampTextPenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
Some functions to handle hotkeys in KiCad.
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
Converts aValue from internal units to a string appropriate for writing to file.
PGM_BASE & Pgm()
The global program "get" accessor.
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
wxString UnescapeString(const wxString &aSource)
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
@ GR_TEXT_H_ALIGN_INDETERMINATE
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ GR_TEXT_V_ALIGN_INDETERMINATE
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
VECTOR2< int32_t > VECTOR2I