7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2024-11-24 13:15:01 +00:00
kicad/include/font/text_attributes.h
Dhineshkumar S 43b1bc52db Fix switching bold option on and off alters text thickness
Currently, unselecting the bold option resets the thickness to the
standard size instead of reverting to the original thickness.
To address this, the original thickness should be preserved so it
can be restored when bold is turned off.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18975
2024-11-13 02:14:19 +00:00

170 lines
4.6 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2021 Ola Rinta-Koski
* Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TEXT_ATTRIBUTES_H
#define TEXT_ATTRIBUTES_H
#include <math/vector2d.h>
#include <gal/color4d.h>
#include <geometry/eda_angle.h>
#include <gal/gal.h>
namespace KIFONT
{
class FONT;
};
// Graphic Text alignments:
//
// NB: values -1,0,1 are used in computations, do not change them
//
// This is API surface mapped to common.types.HorizontalAlignment
enum GR_TEXT_H_ALIGN_T
{
GR_TEXT_H_ALIGN_LEFT = -1,
GR_TEXT_H_ALIGN_CENTER = 0,
GR_TEXT_H_ALIGN_RIGHT = 1,
GR_TEXT_H_ALIGN_INDETERMINATE
};
// This is API surface mapped to common.types.VertialAlignment
enum GR_TEXT_V_ALIGN_T
{
GR_TEXT_V_ALIGN_TOP = -1,
GR_TEXT_V_ALIGN_CENTER = 0,
GR_TEXT_V_ALIGN_BOTTOM = 1,
GR_TEXT_V_ALIGN_INDETERMINATE
};
/**
* Get the reverse alignment: left-right are swapped,
* others are unchanged.
*/
constexpr GR_TEXT_H_ALIGN_T GetFlippedAlignment( GR_TEXT_H_ALIGN_T aAlign )
{
// Could use the -1/1 promise of the enum too.
switch( aAlign )
{
case GR_TEXT_H_ALIGN_LEFT:
return GR_TEXT_H_ALIGN_RIGHT;
case GR_TEXT_H_ALIGN_RIGHT:
return GR_TEXT_H_ALIGN_LEFT;
case GR_TEXT_H_ALIGN_CENTER:
case GR_TEXT_H_ALIGN_INDETERMINATE:
break;
}
return aAlign;
};
/**
* Get the reverse alignment: top-bottom are swapped,
* others are unchanged.
*/
constexpr GR_TEXT_V_ALIGN_T GetFlippedAlignment( GR_TEXT_V_ALIGN_T aAlign )
{
switch( aAlign )
{
case GR_TEXT_V_ALIGN_BOTTOM:
return GR_TEXT_V_ALIGN_TOP;
case GR_TEXT_V_ALIGN_TOP:
return GR_TEXT_V_ALIGN_BOTTOM;
case GR_TEXT_V_ALIGN_CENTER:
case GR_TEXT_V_ALIGN_INDETERMINATE:
break;
}
return aAlign;
};
/**
* Convert an integral value to horizontal alignment.
*
* * x < 0: Left align
* * x == 0: Center
* * x > 0: Right align
*/
constexpr GR_TEXT_H_ALIGN_T ToHAlignment( int x )
{
if( x < 0 )
return GR_TEXT_H_ALIGN_LEFT;
else if( x > 0 )
return GR_TEXT_H_ALIGN_RIGHT;
return GR_TEXT_H_ALIGN_CENTER;
}
class GAL_API TEXT_ATTRIBUTES
{
public:
TEXT_ATTRIBUTES( KIFONT::FONT* aFont = nullptr );
int Compare( const TEXT_ATTRIBUTES& aRhs ) const;
bool operator==( const TEXT_ATTRIBUTES& aRhs ) const { return Compare( aRhs ) == 0; }
bool operator>( const TEXT_ATTRIBUTES& aRhs ) const { return Compare( aRhs ) > 0; }
bool operator<( const TEXT_ATTRIBUTES& aRhs ) const { return Compare( aRhs ) < 0; }
KIFONT::FONT* m_Font;
GR_TEXT_H_ALIGN_T m_Halign;
GR_TEXT_V_ALIGN_T m_Valign;
EDA_ANGLE m_Angle;
double m_LineSpacing;
int m_StrokeWidth;
bool m_Italic;
bool m_Bold;
bool m_Underlined;
KIGFX::COLOR4D m_Color;
bool m_Visible;
bool m_Mirrored;
bool m_Multiline;
VECTOR2I m_Size;
// If true, keep rotation angle between -90...90 degrees for readability
bool m_KeepUpright;
int m_StoredStrokeWidth;
};
extern GAL_API std::ostream& operator<<( std::ostream& aStream, const TEXT_ATTRIBUTES& aAttributes );
template<>
struct std::hash<TEXT_ATTRIBUTES>
{
std::size_t operator()( const TEXT_ATTRIBUTES& aAttributes ) const
{
return hash_val( aAttributes.m_Font, aAttributes.m_Halign, aAttributes.m_Valign,
aAttributes.m_Angle.AsDegrees(), aAttributes.m_LineSpacing,
aAttributes.m_StrokeWidth, aAttributes.m_Italic, aAttributes.m_Bold,
aAttributes.m_Underlined, aAttributes.m_Color, aAttributes.m_Visible,
aAttributes.m_Mirrored, aAttributes.m_Multiline, aAttributes.m_Size.x,
aAttributes.m_Size.y );
}
};
#endif //TEXT_ATTRIBUTES_H