Moved text settings from STROKE_FONT to GAL.

This commit is contained in:
Maciej Suminski 2016-05-02 15:56:12 +02:00
parent da312db7a4
commit b143ce6b0f
7 changed files with 139 additions and 138 deletions

View File

@ -87,8 +87,8 @@ int Clamp_Text_PenSize( int aPenSize, wxSize aSize, bool aBold )
int GraphicTextWidth( const wxString& aText, const wxSize& aSize, bool aItalic, bool aBold ) int GraphicTextWidth( const wxString& aText, const wxSize& aSize, bool aItalic, bool aBold )
{ {
basic_gal.SetItalic( aItalic ); basic_gal.SetFontItalic( aItalic );
basic_gal.SetBold( aBold ); basic_gal.SetFontBold( aBold );
basic_gal.SetGlyphSize( VECTOR2D( aSize ) ); basic_gal.SetGlyphSize( VECTOR2D( aSize ) );
VECTOR2D tsize = basic_gal.GetTextLineSize( aText ); VECTOR2D tsize = basic_gal.GetTextLineSize( aText );

View File

@ -97,8 +97,8 @@ void EDA_TEXT::SetOrientation( double aOrientation )
int EDA_TEXT::LenSize( const wxString& aLine ) const int EDA_TEXT::LenSize( const wxString& aLine ) const
{ {
basic_gal.SetItalic( m_Italic ); basic_gal.SetFontItalic( m_Italic );
basic_gal.SetBold( m_Bold ); basic_gal.SetFontBold( m_Bold );
basic_gal.SetGlyphSize( VECTOR2D( m_Size ) ); basic_gal.SetGlyphSize( VECTOR2D( m_Size ) );
VECTOR2D tsize = basic_gal.GetTextLineSize( aLine ); VECTOR2D tsize = basic_gal.GetTextLineSize( aLine );

View File

@ -76,12 +76,12 @@ GAL::~GAL()
void GAL::SetTextAttributes( const EDA_TEXT* aText ) void GAL::SetTextAttributes( const EDA_TEXT* aText )
{ {
strokeFont.SetGlyphSize( VECTOR2D( aText->GetSize() ) ); SetGlyphSize( VECTOR2D( aText->GetSize() ) );
strokeFont.SetHorizontalJustify( aText->GetHorizJustify() ); SetHorizontalJustify( aText->GetHorizJustify() );
strokeFont.SetVerticalJustify( aText->GetVertJustify() ); SetVerticalJustify( aText->GetVertJustify() );
strokeFont.SetBold( aText->IsBold() ); SetFontBold( aText->IsBold() );
strokeFont.SetItalic( aText->IsItalic() ); SetFontItalic( aText->IsItalic() );
strokeFont.SetMirrored( aText->IsMirrored() ); SetTextMirrored( aText->IsMirrored() );
} }
VECTOR2D GAL::GetTextLineSize( const UTF8& aText ) const VECTOR2D GAL::GetTextLineSize( const UTF8& aText ) const

View File

@ -39,16 +39,8 @@ const double STROKE_FONT::STROKE_FONT_SCALE = 1.0 / 21.0;
const double STROKE_FONT::ITALIC_TILT = 1.0 / 8; const double STROKE_FONT::ITALIC_TILT = 1.0 / 8;
STROKE_FONT::STROKE_FONT( GAL* aGal ) : STROKE_FONT::STROKE_FONT( GAL* aGal ) :
m_gal( aGal ), m_gal( aGal )
m_bold( false ),
m_italic( false ),
m_mirrored( false ),
m_overbar( false )
{ {
// Default values
m_glyphSize = VECTOR2D( 10.0, 10.0 );
m_verticalJustify = GR_TEXT_VJUSTIFY_BOTTOM;
m_horizontalJustify = GR_TEXT_HJUSTIFY_LEFT;
} }
@ -139,7 +131,7 @@ double STROKE_FONT::GetInterline( double aGlyphHeight, double aGlyphThickness )
int STROKE_FONT::getInterline() const int STROKE_FONT::getInterline() const
{ {
return KiROUND( GetInterline( m_glyphSize.y, m_gal->GetLineWidth() ) ); return KiROUND( GetInterline( m_gal->GetGlyphSize().y, m_gal->GetLineWidth() ) );
} }
@ -181,16 +173,17 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
// Single line height // Single line height
int lineHeight = getInterline( ); int lineHeight = getInterline( );
int lineCount = linesCount( aText ); int lineCount = linesCount( aText );
const VECTOR2D& glyphSize = m_gal->GetGlyphSize();
// align the 1st line of text // align the 1st line of text
switch( m_verticalJustify ) switch( m_gal->GetHorizontalJustify() )
{ {
case GR_TEXT_VJUSTIFY_TOP: case GR_TEXT_VJUSTIFY_TOP:
m_gal->Translate( VECTOR2D( 0, m_glyphSize.y ) ); m_gal->Translate( VECTOR2D( 0, glyphSize.y ) );
break; break;
case GR_TEXT_VJUSTIFY_CENTER: case GR_TEXT_VJUSTIFY_CENTER:
m_gal->Translate( VECTOR2D( 0, m_glyphSize.y / 2.0 ) ); m_gal->Translate( VECTOR2D( 0, glyphSize.y / 2.0 ) );
break; break;
case GR_TEXT_VJUSTIFY_BOTTOM: case GR_TEXT_VJUSTIFY_BOTTOM:
@ -202,7 +195,7 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
if( lineCount > 1 ) if( lineCount > 1 )
{ {
switch( m_verticalJustify ) switch( m_gal->GetVerticalJustify() )
{ {
case GR_TEXT_VJUSTIFY_TOP: case GR_TEXT_VJUSTIFY_TOP:
break; break;
@ -220,7 +213,7 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
m_gal->SetIsStroke( true ); m_gal->SetIsStroke( true );
//m_gal->SetIsFill( false ); //m_gal->SetIsFill( false );
if( m_bold ) if( m_gal->IsFontBold() )
m_gal->SetLineWidth( m_gal->GetLineWidth() * BOLD_FACTOR ); m_gal->SetLineWidth( m_gal->GetLineWidth() * BOLD_FACTOR );
// Split multiline strings into separate ones and draw them line by line // Split multiline strings into separate ones and draw them line by line
@ -249,13 +242,13 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
void STROKE_FONT::drawSingleLineText( const UTF8& aText ) void STROKE_FONT::drawSingleLineText( const UTF8& aText )
{ {
// By default the overbar is turned off // By default the overbar is turned off
m_overbar = false; bool overbar = false;
double xOffset; double xOffset;
VECTOR2D glyphSize( m_glyphSize ); VECTOR2D glyphSize( m_gal->GetGlyphSize() );
double overbar_italic_comp = computeOverbarVerticalPosition() * ITALIC_TILT; double overbar_italic_comp = computeOverbarVerticalPosition() * ITALIC_TILT;
if( m_mirrored ) if( m_gal->IsTextMirrored() )
overbar_italic_comp = -overbar_italic_comp; overbar_italic_comp = -overbar_italic_comp;
// Compute the text size // Compute the text size
@ -272,19 +265,19 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
m_gal->Save(); m_gal->Save();
// Adjust the text position to the given horizontal justification // Adjust the text position to the given horizontal justification
switch( m_horizontalJustify ) switch( m_gal->GetHorizontalJustify() )
{ {
case GR_TEXT_HJUSTIFY_CENTER: case GR_TEXT_HJUSTIFY_CENTER:
m_gal->Translate( VECTOR2D( -textSize.x / 2.0, 0 ) ); m_gal->Translate( VECTOR2D( -textSize.x / 2.0, 0 ) );
break; break;
case GR_TEXT_HJUSTIFY_RIGHT: case GR_TEXT_HJUSTIFY_RIGHT:
if( !m_mirrored ) if( !m_gal->IsTextMirrored() )
m_gal->Translate( VECTOR2D( -textSize.x, 0 ) ); m_gal->Translate( VECTOR2D( -textSize.x, 0 ) );
break; break;
case GR_TEXT_HJUSTIFY_LEFT: case GR_TEXT_HJUSTIFY_LEFT:
if( m_mirrored ) if( m_gal->IsTextMirrored() )
m_gal->Translate( VECTOR2D( -textSize.x, 0 ) ); m_gal->Translate( VECTOR2D( -textSize.x, 0 ) );
break; break;
@ -292,13 +285,13 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
break; break;
} }
if( m_mirrored ) if( m_gal->IsTextMirrored() )
{ {
// In case of mirrored text invert the X scale of points and their X direction // In case of mirrored text invert the X scale of points and their X direction
// (m_glyphSize.x) and start drawing from the position where text normally should end // (m_glyphSize.x) and start drawing from the position where text normally should end
// (textSize.x) // (textSize.x)
xOffset = textSize.x - m_gal->GetLineWidth(); xOffset = textSize.x - m_gal->GetLineWidth();
glyphSize.x = -m_glyphSize.x; glyphSize.x = -glyphSize.x;
} }
else else
{ {
@ -319,7 +312,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
break; break;
if( *chIt != '~' ) // It was a single tilda, it toggles overbar if( *chIt != '~' ) // It was a single tilda, it toggles overbar
m_overbar = !m_overbar; overbar = !overbar;
// If it is a double tilda, just process the second one // If it is a double tilda, just process the second one
} }
@ -332,7 +325,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
GLYPH& glyph = m_glyphs[dd]; GLYPH& glyph = m_glyphs[dd];
BOX2D& bbox = m_glyphBoundingBoxes[dd]; BOX2D& bbox = m_glyphBoundingBoxes[dd];
if( m_overbar ) if( overbar )
{ {
double overbar_start_x = xOffset; double overbar_start_x = xOffset;
double overbar_start_y = - computeOverbarVerticalPosition(); double overbar_start_y = - computeOverbarVerticalPosition();
@ -365,11 +358,11 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
{ {
VECTOR2D pointPos( pointIt->x * glyphSize.x + xOffset, pointIt->y * glyphSize.y ); VECTOR2D pointPos( pointIt->x * glyphSize.x + xOffset, pointIt->y * glyphSize.y );
if( m_italic ) if( m_gal->IsFontItalic() )
{ {
// FIXME should be done other way - referring to the lowest Y value of point // FIXME should be done other way - referring to the lowest Y value of point
// because now italic fonts are translated a bit // because now italic fonts are translated a bit
if( m_mirrored ) if( m_gal->IsTextMirrored() )
pointPos.x += pointPos.y * STROKE_FONT::ITALIC_TILT; pointPos.x += pointPos.y * STROKE_FONT::ITALIC_TILT;
else else
pointPos.x -= pointPos.y * STROKE_FONT::ITALIC_TILT; pointPos.x -= pointPos.y * STROKE_FONT::ITALIC_TILT;
@ -401,13 +394,13 @@ double STROKE_FONT::computeOverbarVerticalPosition() const
{ {
// Compute the Y position of the overbar. This is the distance between // Compute the Y position of the overbar. This is the distance between
// the text base line and the overbar axis. // the text base line and the overbar axis.
return ComputeOverbarVerticalPosition( m_glyphSize.y, m_gal->GetLineWidth() ); return ComputeOverbarVerticalPosition( m_gal->GetGlyphSize().y, m_gal->GetLineWidth() );
} }
VECTOR2D STROKE_FONT::computeTextLineSize( const UTF8& aText ) const VECTOR2D STROKE_FONT::computeTextLineSize( const UTF8& aText ) const
{ {
return ComputeStringBoundaryLimits( aText, m_glyphSize, m_gal->GetLineWidth() ); return ComputeStringBoundaryLimits( aText, m_gal->GetGlyphSize(), m_gal->GetLineWidth() );
} }
@ -415,7 +408,7 @@ VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, VECTOR2D a
double aGlyphThickness, double aGlyphThickness,
double* aTopLimit, double* aBottomLimit ) const double* aTopLimit, double* aBottomLimit ) const
{ {
VECTOR2D result = VECTOR2D( 0.0, m_glyphSize.y ); VECTOR2D result = VECTOR2D( 0.0, m_gal->GetGlyphSize().y );
double ymax = 0.0; double ymax = 0.0;
double ymin = 0.0; double ymin = 0.0;
@ -460,7 +453,7 @@ VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, VECTOR2D a
result.x += aGlyphThickness; result.x += aGlyphThickness;
// For italic correction, take in account italic tilt // For italic correction, take in account italic tilt
if( m_italic ) if( m_gal->IsFontItalic() )
result.x += result.y * STROKE_FONT::ITALIC_TILT; result.x += result.y * STROKE_FONT::ITALIC_TILT;
if( aTopLimit ) if( aTopLimit )

View File

@ -314,42 +314,115 @@ public:
*/ */
virtual void SetTextAttributes( const EDA_TEXT* aText ); virtual void SetTextAttributes( const EDA_TEXT* aText );
/// @copydoc STROKE_FONT::SetGlyphSize() /**
* @brief Set the font glyph size.
*
* @param aGlyphSize is the new font glyph size.
*/
inline void SetGlyphSize( const VECTOR2D aGlyphSize ) inline void SetGlyphSize( const VECTOR2D aGlyphSize )
{ {
strokeFont.SetGlyphSize( aGlyphSize ); textProperties.m_glyphSize = aGlyphSize;
} }
/// @copydoc STROKE_FONT::SetBold() /**
inline void SetBold( const bool aBold ) * @return the current font glyph size.
*/
const VECTOR2D& GetGlyphSize() const
{ {
strokeFont.SetBold( aBold ); return textProperties.m_glyphSize;
} }
/// @copydoc STROKE_FONT::SetItalic() /**
inline void SetItalic( const bool aItalic ) * @brief Set bold property of current font.
*
* @param aBold tells if the font should be bold or not.
*/
inline void SetFontBold( const bool aBold )
{ {
strokeFont.SetItalic( aItalic ); textProperties.m_bold = aBold;
} }
/// @copydoc STROKE_FONT::SetMirrored() /**
inline void SetMirrored( const bool aMirrored ) * @brief Returns true if current font has 'bold' attribute enabled.
*/
inline bool IsFontBold() const
{ {
strokeFont.SetMirrored( aMirrored ); return textProperties.m_bold;
} }
/// @copydoc STROKE_FONT::SetHorizontalJustify() /**
* @brief Set italic property of current font.
*
* @param aItalic tells if the font should be italic or not.
*/
inline void SetFontItalic( const bool aItalic )
{
textProperties.m_italic = aItalic;
}
/**
* @brief Returns true if current font has 'italic' attribute enabled.
*/
inline bool IsFontItalic() const
{
return textProperties.m_italic;
}
/**
* @brief Set a mirrored property of text.
*
* @param aMirrored tells if the text should be mirrored or not.
*/
inline void SetTextMirrored( const bool aMirrored )
{
textProperties.m_mirrored = aMirrored;
}
/**
* @brief Returns true if text should displayed mirrored.
*/
inline bool IsTextMirrored() const
{
return textProperties.m_mirrored;
}
/**
* @brief Set the horizontal justify for text drawing.
*
* @param aHorizontalJustify is the horizontal justify value.
*/
inline void SetHorizontalJustify( const EDA_TEXT_HJUSTIFY_T aHorizontalJustify ) inline void SetHorizontalJustify( const EDA_TEXT_HJUSTIFY_T aHorizontalJustify )
{ {
strokeFont.SetHorizontalJustify( aHorizontalJustify ); textProperties.m_horizontalJustify = aHorizontalJustify;
} }
/// @copydoc STROKE_FONT::SetVerticalJustify() /**
* @brief Returns current text horizontal justification setting.
*/
inline EDA_TEXT_HJUSTIFY_T GetHorizontalJustify() const
{
return textProperties.m_horizontalJustify;
}
/**
* @brief Set the vertical justify for text drawing.
*
* @param aVerticalJustify is the vertical justify value.
*/
inline void SetVerticalJustify( const EDA_TEXT_VJUSTIFY_T aVerticalJustify ) inline void SetVerticalJustify( const EDA_TEXT_VJUSTIFY_T aVerticalJustify )
{ {
strokeFont.SetVerticalJustify( aVerticalJustify ); textProperties.m_verticalJustify = aVerticalJustify;
} }
/**
* @brief Returns current text vertical justification setting.
*/
inline EDA_TEXT_VJUSTIFY_T GetVerticalJustify() const
{
return textProperties.m_verticalJustify;
}
// -------------- // --------------
// Transformation // Transformation
// -------------- // --------------
@ -929,6 +1002,16 @@ protected:
/// Depth level on which the grid is drawn /// Depth level on which the grid is drawn
static const int GRID_DEPTH; static const int GRID_DEPTH;
private:
struct TEXT_PROPERTIES
{
VECTOR2D m_glyphSize; ///< Size of the glyphs
EDA_TEXT_HJUSTIFY_T m_horizontalJustify; ///< Horizontal justification
EDA_TEXT_VJUSTIFY_T m_verticalJustify; ///< Vertical justification
bool m_bold;
bool m_italic;
bool m_mirrored;
} textProperties;
}; };
} // namespace KIGFX } // namespace KIGFX

View File

@ -74,74 +74,6 @@ public:
*/ */
void Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle ); void Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle );
/**
* @brief Set the glyph size.
*
* @param aGlyphSize is the glyph size.
*/
inline void SetGlyphSize( const VECTOR2D aGlyphSize )
{
m_glyphSize = aGlyphSize;
}
/**
* @return the current glyph size.
*/
VECTOR2D GetGlyphSize() const
{
return m_glyphSize;
}
/**
* @brief Set a bold property of current font.
*
* @param aBold tells if the font should be bold or not.
*/
inline void SetBold( const bool aBold )
{
m_bold = aBold;
}
/**
* @brief Set an italic property of current font.
*
* @param aItalic tells if the font should be italic or not.
*/
inline void SetItalic( const bool aItalic )
{
m_italic = aItalic;
}
/**
* @brief Set a mirrored property of text.
*
* @param aMirrored tells if the text should be mirrored or not.
*/
inline void SetMirrored( const bool aMirrored )
{
m_mirrored = aMirrored;
}
/**
* @brief Set the horizontal justify for text drawing.
*
* @param aHorizontalJustify is the horizontal justify value.
*/
inline void SetHorizontalJustify( const EDA_TEXT_HJUSTIFY_T aHorizontalJustify )
{
m_horizontalJustify = aHorizontalJustify;
}
/**
* @brief Set the vertical justify for text drawing.
*
* @param aVerticalJustify is the vertical justify value.
*/
inline void SetVerticalJustify( const EDA_TEXT_VJUSTIFY_T aVerticalJustify )
{
m_verticalJustify = aVerticalJustify;
}
/** /**
* Function SetGAL * Function SetGAL
* Changes Graphics Abstraction Layer used for drawing items for a new one. * Changes Graphics Abstraction Layer used for drawing items for a new one.
@ -194,13 +126,6 @@ private:
GAL* m_gal; ///< Pointer to the GAL GAL* m_gal; ///< Pointer to the GAL
GLYPH_LIST m_glyphs; ///< Glyph list GLYPH_LIST m_glyphs; ///< Glyph list
std::vector<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs std::vector<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs
VECTOR2D m_glyphSize; ///< Size of the glyphs
EDA_TEXT_HJUSTIFY_T m_horizontalJustify; ///< Horizontal justification
EDA_TEXT_VJUSTIFY_T m_verticalJustify; ///< Vertical justification
bool m_bold;
bool m_italic;
bool m_mirrored;
bool m_overbar; ///< Properties of text
/** /**
* @brief Compute the X and Y size of a given text. The text is expected to be * @brief Compute the X and Y size of a given text. The text is expected to be

View File

@ -307,9 +307,9 @@ void PCB_PAINTER::draw( const TRACK* aTrack, int aLayer )
m_gal->SetStrokeColor( labelColor ); m_gal->SetStrokeColor( labelColor );
m_gal->SetLineWidth( width / 10.0 ); m_gal->SetLineWidth( width / 10.0 );
m_gal->SetBold( false ); m_gal->SetFontBold( false );
m_gal->SetItalic( false ); m_gal->SetFontItalic( false );
m_gal->SetMirrored( false ); m_gal->SetTextMirrored( false );
m_gal->SetGlyphSize( VECTOR2D( textSize * 0.7, textSize * 0.7 ) ); m_gal->SetGlyphSize( VECTOR2D( textSize * 0.7, textSize * 0.7 ) );
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER ); m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER ); m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
@ -487,9 +487,9 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
// Default font settings // Default font settings
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER ); m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER ); m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
m_gal->SetBold( false ); m_gal->SetFontBold( false );
m_gal->SetItalic( false ); m_gal->SetFontItalic( false );
m_gal->SetMirrored( false ); m_gal->SetTextMirrored( false );
// Set a proper color for the label // Set a proper color for the label
const COLOR4D& color = m_pcbSettings.GetColor( aPad, aPad->GetLayer() ); const COLOR4D& color = m_pcbSettings.GetColor( aPad, aPad->GetLayer() );