Changed the implementation from offsets to factors.

This commit is contained in:
Maximilian Wagenbach 2017-09-04 14:46:49 +02:00
parent 73892dfa12
commit 65d26be74d
2 changed files with 72 additions and 74 deletions

View File

@ -145,34 +145,32 @@ public:
void setCharacterSize(unsigned int size); void setCharacterSize(unsigned int size);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Set the additional line spacing offset /// \brief Set the line spacing factor
/// ///
/// The spacing between lines is defined by the font. /// The default spacing between lines is defined by the font.
/// This method enables you to set an additional spacing /// This method enables you to set a factor for the spacing
/// between lines. By default the additional line /// between lines. By default the line spacing offset is 1.
/// spacing offset is 0.
/// ///
/// \param spacing New additional line spacing offset, in pixel /// \param spacing New line spacing factor
/// ///
/// \see getLineSpacing /// \see getLineSpacing
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void setLineSpacing(float spacing); void setLineSpacing(float spacingFactor);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Set the additional letter spacing offset /// \brief Set the letter spacing factor
/// ///
/// The spacing between letters is defined by the font. /// The default spacing between letters is defined by the font.
/// This method enables you to set an additional spacing /// This method enables you to set a factor to the spacing
/// between letters. By default the additional letter /// between letters. By default the letter spacing factor is 1.
/// spacing offset is 0.
/// ///
/// \param spacing New additional letter spacing offset, in pixel /// \param spacing New letter spacing factor
/// ///
/// \see getLetterSpacing /// \see getLetterSpacing
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void setLetterSpacing(float spacing); void setLetterSpacing(float spacingFactor);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Set the text's style /// \brief Set the text's style
@ -291,9 +289,9 @@ public:
unsigned int getCharacterSize() const; unsigned int getCharacterSize() const;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the size of the additional letter spacing offset /// \brief Get the size of the letter spacing factor
/// ///
/// \return Size of the additional letter spacing offset, in pixel /// \return Size of the letter spacing factor
/// ///
/// \see setLetterSpacing /// \see setLetterSpacing
/// ///
@ -301,9 +299,9 @@ public:
float getLetterSpacing() const; float getLetterSpacing() const;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the size of the additional line spacing offset /// \brief Get the size of the line spacing factor
/// ///
/// \return Size of the additional line spacing offset, in pixel /// \return Size of the line spacing factor
/// ///
/// \see setLineSpacing /// \see setLineSpacing
/// ///
@ -432,20 +430,20 @@ private:
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Member data // Member data
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
String m_string; ///< String to display String m_string; ///< String to display
const Font* m_font; ///< Font used to display the string const Font* m_font; ///< Font used to display the string
unsigned int m_characterSize; ///< Base size of characters, in pixels unsigned int m_characterSize; ///< Base size of characters, in pixels
float m_letterSpacing; ///< Additional spacing offset between letters, in pixel float m_letterSpacingFactor; ///< Spacing factor between letters
float m_lineSpacing; ///< Additional spacing offset between lines, in pixel float m_lineSpacingFactor; ///< Spacing factor between lines
Uint32 m_style; ///< Text style (see Style enum) Uint32 m_style; ///< Text style (see Style enum)
Color m_fillColor; ///< Text fill color Color m_fillColor; ///< Text fill color
Color m_outlineColor; ///< Text outline color Color m_outlineColor; ///< Text outline color
float m_outlineThickness; ///< Thickness of the text's outline float m_outlineThickness; ///< Thickness of the text's outline
mutable VertexArray m_vertices; ///< Vertex array containing the fill geometry mutable VertexArray m_vertices; ///< Vertex array containing the fill geometry
mutable VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry mutable VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry
mutable FloatRect m_bounds; ///< Bounding rectangle of the text (in local coordinates) mutable FloatRect m_bounds; ///< Bounding rectangle of the text (in local coordinates)
mutable bool m_geometryNeedUpdate; ///< Does the geometry need to be recomputed? mutable bool m_geometryNeedUpdate; ///< Does the geometry need to be recomputed?
mutable Uint64 m_fontTextureId; ///< The font texture id mutable Uint64 m_fontTextureId; ///< The font texture id
}; };
} // namespace sf } // namespace sf

View File

@ -74,20 +74,20 @@ namespace sf
{ {
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
Text::Text() : Text::Text() :
m_string (), m_string (),
m_font (NULL), m_font (NULL),
m_characterSize (30), m_characterSize (30),
m_letterSpacing (0.f), m_letterSpacingFactor(1.f),
m_lineSpacing (0.f), m_lineSpacingFactor (1.f),
m_style (Regular), m_style (Regular),
m_fillColor (255, 255, 255), m_fillColor (255, 255, 255),
m_outlineColor (0, 0, 0), m_outlineColor (0, 0, 0),
m_outlineThickness (0), m_outlineThickness (0),
m_vertices (Triangles), m_vertices (Triangles),
m_outlineVertices (Triangles), m_outlineVertices (Triangles),
m_bounds (), m_bounds (),
m_geometryNeedUpdate(false), m_geometryNeedUpdate (false),
m_fontTextureId (0) m_fontTextureId (0)
{ {
} }
@ -95,20 +95,20 @@ m_fontTextureId (0)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
Text::Text(const String& string, const Font& font, unsigned int characterSize) : Text::Text(const String& string, const Font& font, unsigned int characterSize) :
m_string (string), m_string (string),
m_font (&font), m_font (&font),
m_characterSize (characterSize), m_characterSize (characterSize),
m_letterSpacing (0.f), m_letterSpacingFactor(1.f),
m_lineSpacing (0.f), m_lineSpacingFactor (1.f),
m_style (Regular), m_style (Regular),
m_fillColor (255, 255, 255), m_fillColor (255, 255, 255),
m_outlineColor (0, 0, 0), m_outlineColor (0, 0, 0),
m_outlineThickness (0), m_outlineThickness (0),
m_vertices (Triangles), m_vertices (Triangles),
m_outlineVertices (Triangles), m_outlineVertices (Triangles),
m_bounds (), m_bounds (),
m_geometryNeedUpdate(true), m_geometryNeedUpdate (true),
m_fontTextureId (0) m_fontTextureId (0)
{ {
} }
@ -148,22 +148,22 @@ void Text::setCharacterSize(unsigned int size)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void Text::setLetterSpacing(float spacing) void Text::setLetterSpacing(float spacingFactor)
{ {
if (m_letterSpacing != spacing) if (m_letterSpacingFactor != spacingFactor)
{ {
m_letterSpacing = spacing; m_letterSpacingFactor = spacingFactor;
m_geometryNeedUpdate = true; m_geometryNeedUpdate = true;
} }
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void Text::setLineSpacing(float spacing) void Text::setLineSpacing(float spacingFactor)
{ {
if (m_lineSpacing != spacing) if (m_lineSpacingFactor != spacingFactor)
{ {
m_lineSpacing = spacing; m_lineSpacingFactor = spacingFactor;
m_geometryNeedUpdate = true; m_geometryNeedUpdate = true;
} }
} }
@ -258,14 +258,14 @@ unsigned int Text::getCharacterSize() const
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
float Text::getLetterSpacing() const float Text::getLetterSpacing() const
{ {
return m_letterSpacing; return m_letterSpacingFactor;
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
float Text::getLineSpacing() const float Text::getLineSpacing() const
{ {
return m_lineSpacing; return m_lineSpacingFactor;
} }
@ -317,8 +317,8 @@ Vector2f Text::findCharacterPos(std::size_t index) const
// Precompute the variables needed by the algorithm // Precompute the variables needed by the algorithm
bool isBold = m_style & Bold; bool isBold = m_style & Bold;
float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor;
float lineSpacing = m_font->getLineSpacing(m_characterSize)+ m_lineSpacing; float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor;
// Compute the position // Compute the position
Vector2f position; Vector2f position;
@ -340,7 +340,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const
} }
// For regular characters, add the advance offset of the glyph // For regular characters, add the advance offset of the glyph
position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance + m_letterSpacing; position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance * m_letterSpacingFactor;
} }
// Transform the position to global coordinates // Transform the position to global coordinates
@ -425,8 +425,8 @@ void Text::ensureGeometryUpdate() const
float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; float strikeThroughOffset = xBounds.top + xBounds.height / 2.f;
// Precompute the variables needed by the algorithm // Precompute the variables needed by the algorithm
float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor;
float lineSpacing = m_font->getLineSpacing(m_characterSize) + m_lineSpacing; float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor;
float x = 0.f; float x = 0.f;
float y = static_cast<float>(m_characterSize); float y = static_cast<float>(m_characterSize);
@ -525,7 +525,7 @@ void Text::ensureGeometryUpdate() const
} }
// Advance to the next character // Advance to the next character
x += glyph.advance + m_letterSpacing; x += glyph.advance * m_letterSpacingFactor;
} }
// If we're using the underlined style, add the last line // If we're using the underlined style, add the last line