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 )
{
basic_gal.SetItalic( aItalic );
basic_gal.SetBold( aBold );
basic_gal.SetFontItalic( aItalic );
basic_gal.SetFontBold( aBold );
basic_gal.SetGlyphSize( VECTOR2D( aSize ) );
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
{
basic_gal.SetItalic( m_Italic );
basic_gal.SetBold( m_Bold );
basic_gal.SetFontItalic( m_Italic );
basic_gal.SetFontBold( m_Bold );
basic_gal.SetGlyphSize( VECTOR2D( m_Size ) );
VECTOR2D tsize = basic_gal.GetTextLineSize( aLine );

View File

@ -76,12 +76,12 @@ GAL::~GAL()
void GAL::SetTextAttributes( const EDA_TEXT* aText )
{
strokeFont.SetGlyphSize( VECTOR2D( aText->GetSize() ) );
strokeFont.SetHorizontalJustify( aText->GetHorizJustify() );
strokeFont.SetVerticalJustify( aText->GetVertJustify() );
strokeFont.SetBold( aText->IsBold() );
strokeFont.SetItalic( aText->IsItalic() );
strokeFont.SetMirrored( aText->IsMirrored() );
SetGlyphSize( VECTOR2D( aText->GetSize() ) );
SetHorizontalJustify( aText->GetHorizJustify() );
SetVerticalJustify( aText->GetVertJustify() );
SetFontBold( aText->IsBold() );
SetFontItalic( aText->IsItalic() );
SetTextMirrored( aText->IsMirrored() );
}
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;
STROKE_FONT::STROKE_FONT( GAL* aGal ) :
m_gal( aGal ),
m_bold( false ),
m_italic( false ),
m_mirrored( false ),
m_overbar( false )
m_gal( aGal )
{
// 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
{
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
int lineHeight = getInterline( );
int lineCount = linesCount( aText );
const VECTOR2D& glyphSize = m_gal->GetGlyphSize();
// align the 1st line of text
switch( m_verticalJustify )
switch( m_gal->GetHorizontalJustify() )
{
case GR_TEXT_VJUSTIFY_TOP:
m_gal->Translate( VECTOR2D( 0, m_glyphSize.y ) );
m_gal->Translate( VECTOR2D( 0, glyphSize.y ) );
break;
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;
case GR_TEXT_VJUSTIFY_BOTTOM:
@ -202,7 +195,7 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
if( lineCount > 1 )
{
switch( m_verticalJustify )
switch( m_gal->GetVerticalJustify() )
{
case GR_TEXT_VJUSTIFY_TOP:
break;
@ -220,7 +213,7 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
m_gal->SetIsStroke( true );
//m_gal->SetIsFill( false );
if( m_bold )
if( m_gal->IsFontBold() )
m_gal->SetLineWidth( m_gal->GetLineWidth() * BOLD_FACTOR );
// 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 )
{
// By default the overbar is turned off
m_overbar = false;
bool overbar = false;
double xOffset;
VECTOR2D glyphSize( m_glyphSize );
VECTOR2D glyphSize( m_gal->GetGlyphSize() );
double overbar_italic_comp = computeOverbarVerticalPosition() * ITALIC_TILT;
if( m_mirrored )
if( m_gal->IsTextMirrored() )
overbar_italic_comp = -overbar_italic_comp;
// Compute the text size
@ -272,19 +265,19 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
m_gal->Save();
// Adjust the text position to the given horizontal justification
switch( m_horizontalJustify )
switch( m_gal->GetHorizontalJustify() )
{
case GR_TEXT_HJUSTIFY_CENTER:
m_gal->Translate( VECTOR2D( -textSize.x / 2.0, 0 ) );
break;
case GR_TEXT_HJUSTIFY_RIGHT:
if( !m_mirrored )
if( !m_gal->IsTextMirrored() )
m_gal->Translate( VECTOR2D( -textSize.x, 0 ) );
break;
case GR_TEXT_HJUSTIFY_LEFT:
if( m_mirrored )
if( m_gal->IsTextMirrored() )
m_gal->Translate( VECTOR2D( -textSize.x, 0 ) );
break;
@ -292,13 +285,13 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
break;
}
if( m_mirrored )
if( m_gal->IsTextMirrored() )
{
// 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
// (textSize.x)
xOffset = textSize.x - m_gal->GetLineWidth();
glyphSize.x = -m_glyphSize.x;
glyphSize.x = -glyphSize.x;
}
else
{
@ -319,7 +312,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
break;
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
}
@ -332,7 +325,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
GLYPH& glyph = m_glyphs[dd];
BOX2D& bbox = m_glyphBoundingBoxes[dd];
if( m_overbar )
if( overbar )
{
double overbar_start_x = xOffset;
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 );
if( m_italic )
if( m_gal->IsFontItalic() )
{
// FIXME should be done other way - referring to the lowest Y value of point
// because now italic fonts are translated a bit
if( m_mirrored )
if( m_gal->IsTextMirrored() )
pointPos.x += pointPos.y * STROKE_FONT::ITALIC_TILT;
else
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
// 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
{
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* 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 ymin = 0.0;
@ -460,7 +453,7 @@ VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, VECTOR2D a
result.x += aGlyphThickness;
// For italic correction, take in account italic tilt
if( m_italic )
if( m_gal->IsFontItalic() )
result.x += result.y * STROKE_FONT::ITALIC_TILT;
if( aTopLimit )

View File

@ -314,42 +314,115 @@ public:
*/
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 )
{
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 )
{
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 )
{
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
// --------------
@ -929,6 +1002,16 @@ protected:
/// Depth level on which the grid is drawn
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

View File

@ -74,74 +74,6 @@ public:
*/
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
* Changes Graphics Abstraction Layer used for drawing items for a new one.
@ -194,13 +126,6 @@ private:
GAL* m_gal; ///< Pointer to the GAL
GLYPH_LIST m_glyphs; ///< Glyph list
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
@ -216,7 +141,7 @@ private:
* This is the distance between the text base line and the overbar.
* @return the relative position of the overbar axis.
*/
double computeOverbarVerticalPosition() const;
double computeOverbarVerticalPosition() const;
/**
* @brief Returns a single line height using current settings.

View File

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