diff --git a/include/eepp/graphics/batchrenderer.hpp b/include/eepp/graphics/batchrenderer.hpp index 988fb9677..15996c24a 100755 --- a/include/eepp/graphics/batchrenderer.hpp +++ b/include/eepp/graphics/batchrenderer.hpp @@ -262,7 +262,7 @@ class EE_API BatchRenderer { void rotate( const Vector2f& center, Vector2f* point, const Float& angle ); - void setBlendMode( EE_DRAW_MODE Mode, const bool& Force ); + void setDrawMode( const EE_DRAW_MODE & Mode, const bool& Force ); }; }} diff --git a/include/eepp/graphics/fonthelper.hpp b/include/eepp/graphics/fonthelper.hpp index 22e8c4cca..b927e0a00 100644 --- a/include/eepp/graphics/fonthelper.hpp +++ b/include/eepp/graphics/fonthelper.hpp @@ -9,28 +9,28 @@ enum EE_FONT_TYPE { }; enum EE_FONT_HALIGN { - FONT_DRAW_LEFT = (0 << 0), - FONT_DRAW_RIGHT = (1 << 0), - FONT_DRAW_CENTER = (2 << 0), - FONT_DRAW_HALIGN_MASK = (3 << 0) + TEXT_ALIGN_LEFT = (0 << 0), + TEXT_ALIGN_RIGHT = (1 << 0), + TEXT_ALIGN_CENTER = (2 << 0), + TEXT_HALIGN_MASK = (3 << 0) }; enum EE_FONT_VALIGN { - FONT_DRAW_TOP = (0 << 2), - FONT_DRAW_BOTTOM = (1 << 2), - FONT_DRAW_MIDDLE = (2 << 2), - FONT_DRAW_VALIGN_MASK = (3 << 2) + TEXT_ALIGN_TOP = (0 << 2), + TEXT_ALIGN_BOTTOM = (1 << 2), + TEXT_ALIGN_MIDDLE = (2 << 2), + TEXT_VALIGN_MASK = (3 << 2) }; inline Uint32 fontHAlignGet( Uint32 Flags ) { - return Flags & FONT_DRAW_HALIGN_MASK; + return Flags & TEXT_HALIGN_MASK; } inline Uint32 fontVAlignGet( Uint32 Flags ) { - return Flags & FONT_DRAW_VALIGN_MASK; + return Flags & TEXT_VALIGN_MASK; } -#define FONT_DRAW_ALIGN_MASK ( FONT_DRAW_VALIGN_MASK | FONT_DRAW_HALIGN_MASK ) +#define TEXT_ALIGN_MASK ( TEXT_VALIGN_MASK | TEXT_HALIGN_MASK ) #define EE_TTF_FONT_MAGIC ( ( 'E' << 0 ) | ( 'E' << 8 ) | ( 'F' << 16 ) | ( 'N' << 24 ) ) diff --git a/include/eepp/graphics/text.hpp b/include/eepp/graphics/text.hpp index 36a27ef4e..64523a6b3 100644 --- a/include/eepp/graphics/text.hpp +++ b/include/eepp/graphics/text.hpp @@ -40,6 +40,8 @@ class EE_API Text { void setFillColor(const ColorA& color); + void setFillColor(const ColorA& color, Uint32 from, Uint32 to); + void setOutlineColor(const ColorA& color); void setOutlineThickness(Float thickness); @@ -90,11 +92,11 @@ class EE_API Text { /** @return Every cached text line width */ const std::vector& getLinesWidth(); - /** Set the font draw flags */ - void setFlags( const Uint32& flags ); + /** Set the text draw align */ + void setAlign( const Uint32& align ); - /** @return The font draw flags */ - const Uint32& getFlags() const; + /** @return The text align */ + const Uint32& getAlign() const; /** @return The number of lines that the cached text contains */ const int& getNumLines(); @@ -119,12 +121,13 @@ class EE_API Text { mutable Rectf mBounds; ///< Bounding rectangle of the text (in local coordinates) mutable bool mGeometryNeedUpdate; ///< Does the geometry need to be recomputed? mutable bool mCachedWidthNeedUpdate; + mutable bool mColorsNeedUpdate; Float mCachedWidth; int mNumLines; int mLargestLineCharCount; ColorA mFontShadowColor; - Uint32 mFlags; + Uint32 mAlign; Uint32 mFontHeight; std::vector mVertices; @@ -136,12 +139,16 @@ class EE_API Text { void ensureGeometryUpdate(); + void ensureColorUpdate(); + /** Force to cache the width of the current text */ void cacheWidth(); - static void addLine(std::vector& vertices, std::vector& colors, Float lineLength, Float lineTop, const EE::System::ColorA& color, Float offset, Float thickness, Float outlineThickness, Sizei textureSize, Int32 centerDiffX); + static void addLine(std::vector& vertice, Float lineLength, Float lineTop, Float offset, Float thickness, Float outlineThickness, Sizei textureSize, Int32 centerDiffX); - static void addGlyphQuad(std::vector& vertices, std::vector& colors, Vector2f position, const EE::System::ColorA& color, const EE::Graphics::Glyph& glyph, Float italic, Float outlineThickness, Sizei textureSize, Int32 centerDiffX); + static void addGlyphQuad(std::vector& vertices, Vector2f position, const EE::Graphics::Glyph& glyph, Float italic, Float outlineThickness, Sizei textureSize, Int32 centerDiffX); + + Uint32 getTotalVertices(); }; }} diff --git a/include/eepp/ui/uihelper.hpp b/include/eepp/ui/uihelper.hpp index 5b1c10421..38db2f9ff 100644 --- a/include/eepp/ui/uihelper.hpp +++ b/include/eepp/ui/uihelper.hpp @@ -28,10 +28,10 @@ enum UI_CONTROL_FLAGS_VALUES { UI_CTRL_FLAG_FREE_USE = (1<<31) }; -#define UI_HALIGN_LEFT FONT_DRAW_LEFT -#define UI_HALIGN_MASK FONT_DRAW_HALIGN_MASK -#define UI_VALIGN_TOP FONT_DRAW_TOP -#define UI_VALIGN_MASK FONT_DRAW_VALIGN_MASK +#define UI_HALIGN_LEFT TEXT_ALIGN_LEFT +#define UI_HALIGN_MASK TEXT_HALIGN_MASK +#define UI_VALIGN_TOP TEXT_ALIGN_TOP +#define UI_VALIGN_MASK TEXT_VALIGN_MASK inline Uint32 HAlignGet( Uint32 Flags ) { return Flags & UI_HALIGN_MASK; @@ -42,10 +42,10 @@ inline Uint32 VAlignGet( Uint32 Flags ) { } enum UI_FLAGS { - UI_HALIGN_RIGHT = FONT_DRAW_RIGHT, - UI_HALIGN_CENTER = FONT_DRAW_CENTER, - UI_VALIGN_BOTTOM = FONT_DRAW_BOTTOM, - UI_VALIGN_CENTER = FONT_DRAW_MIDDLE, + UI_HALIGN_RIGHT = TEXT_ALIGN_RIGHT, + UI_HALIGN_CENTER = TEXT_ALIGN_CENTER, + UI_VALIGN_BOTTOM = TEXT_ALIGN_BOTTOM, + UI_VALIGN_CENTER = TEXT_ALIGN_MIDDLE, UI_AUTO_SIZE = (1 << 4), UI_SKIN_KEEP_SIZE_ON_DRAW = (1 << 5), UI_FILL_BACKGROUND = (1 << 6), diff --git a/include/eepp/ui/uiwinmenu.hpp b/include/eepp/ui/uiwinmenu.hpp index 4048fc2c7..c90882543 100644 --- a/include/eepp/ui/uiwinmenu.hpp +++ b/include/eepp/ui/uiwinmenu.hpp @@ -34,10 +34,6 @@ class EE_API UIWinMenu : public UIWidget { void setMarginBetweenButtons(const Uint32 & marginBetweenButtons); - UITooltipStyleConfig getFontStyleConfig() const; - - void setFontStyleConfig(const UITooltipStyleConfig & fontStyleConfig); - UIWinMenuStyleConfig getStyleConfig() const; void setStyleConfig(const UIWinMenuStyleConfig & styleConfig); diff --git a/src/eepp/graphics/batchrenderer.cpp b/src/eepp/graphics/batchrenderer.cpp index 4c2269674..9afd33fbe 100755 --- a/src/eepp/graphics/batchrenderer.cpp +++ b/src/eepp/graphics/batchrenderer.cpp @@ -92,7 +92,7 @@ void BatchRenderer::addVertexs( const unsigned int& num ) { flush(); } -void BatchRenderer::setBlendMode( EE_DRAW_MODE Mode, const bool& Force ) { +void BatchRenderer::setDrawMode( const EE_DRAW_MODE& Mode, const bool& Force ) { if ( Force && mCurrentMode != Mode ) { flush(); mCurrentMode = Mode; @@ -191,7 +191,7 @@ void BatchRenderer::batchQuadEx( Float x, Float y, Float width, Float height, Fl originPoint.x += x; originPoint.y += y; - setBlendMode( DM_QUADS, mForceBlendMode ); + setDrawMode( DM_QUADS, mForceBlendMode ); if ( GLi->quadsSupported() ) { mTVertex = &mVertex[ mNumVertex ]; @@ -270,7 +270,7 @@ void BatchRenderer::batchQuadFree( const Float& x0, const Float& y0, const Float if ( mNumVertex + ( GLi->quadsSupported() ? 3 : 5 ) >= mVertexSize ) return; - setBlendMode( DM_QUADS, mForceBlendMode ); + setDrawMode( DM_QUADS, mForceBlendMode ); if ( GLi->quadsSupported() ) { mTVertex = &mVertex[ mNumVertex ]; @@ -354,7 +354,7 @@ void BatchRenderer::batchQuadFreeEx( const Float& x0, const Float& y0, const Flo mQ.scale( Scale, QCenter ); } - setBlendMode( DM_QUADS, mForceBlendMode ); + setDrawMode( DM_QUADS, mForceBlendMode ); if ( GLi->quadsSupported() ) { mTVertex = &mVertex[ mNumVertex ]; @@ -424,7 +424,7 @@ void BatchRenderer::batchQuadFreeEx( const Float& x0, const Float& y0, const Flo } void BatchRenderer::quadsBegin() { - setBlendMode( DM_QUADS, true ); + setDrawMode( DM_QUADS, true ); quadsSetSubset( 0, 0, 1, 1 ); quadsSetColor( ColorA() ); } @@ -465,7 +465,7 @@ void BatchRenderer::rotate( const Vector2f& center, Vector2f* point, const Float } void BatchRenderer::pointsBegin() { - setBlendMode( DM_POINTS, true ); + setDrawMode( DM_POINTS, true ); quadsSetSubset( 0, 0, 1, 1 ); pointSetColor( ColorA() ); } @@ -478,7 +478,7 @@ void BatchRenderer::batchPoint( const Float& x, const Float& y ) { if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_POINTS, mForceBlendMode ); + setDrawMode( DM_POINTS, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x; @@ -490,7 +490,7 @@ void BatchRenderer::batchPoint( const Float& x, const Float& y ) { } void BatchRenderer::linesBegin() { - setBlendMode( DM_LINES, true ); + setDrawMode( DM_LINES, true ); quadsSetSubset( 0, 0, 1, 1 ); pointSetColor( ColorA() ); } @@ -507,7 +507,7 @@ void BatchRenderer::batchLine( const Float& x0, const Float& y0, const Float& x1 if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_LINES, mForceBlendMode ); + setDrawMode( DM_LINES, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -525,7 +525,7 @@ void BatchRenderer::batchLine( const Float& x0, const Float& y0, const Float& x1 } void BatchRenderer::lineLoopBegin() { - setBlendMode( DM_LINE_LOOP, true ); + setDrawMode( DM_LINE_LOOP, true ); quadsSetSubset( 0, 0, 1, 1 ); pointSetColor( ColorA() ); } @@ -542,7 +542,7 @@ void BatchRenderer::batchLineLoop( const Float& x0, const Float& y0, const Float if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_LINE_LOOP, mForceBlendMode ); + setDrawMode( DM_LINE_LOOP, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -567,7 +567,7 @@ void BatchRenderer::batchLineLoop( const Float& x0, const Float& y0 ) { if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_LINE_LOOP, mForceBlendMode ); + setDrawMode( DM_LINE_LOOP, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -583,7 +583,7 @@ void BatchRenderer::batchLineLoop( const Vector2f& vector1 ) { } void BatchRenderer::lineStripBegin() { - setBlendMode( DM_LINE_STRIP, true ); + setDrawMode( DM_LINE_STRIP, true ); quadsSetSubset( 0, 0, 1, 1 ); pointSetColor( ColorA() ); } @@ -600,7 +600,7 @@ void BatchRenderer::batchLineStrip( const Float& x0, const Float& y0, const Floa if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_LINE_STRIP, mForceBlendMode ); + setDrawMode( DM_LINE_STRIP, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -625,7 +625,7 @@ void BatchRenderer::batchLineStrip( const Float& x0, const Float& y0 ) { if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_LINE_STRIP, mForceBlendMode ); + setDrawMode( DM_LINE_STRIP, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -641,7 +641,7 @@ void BatchRenderer::batchLineStrip( const Vector2f& vector1 ) { } void BatchRenderer::triangleFanBegin() { - setBlendMode( DM_TRIANGLE_FAN, true ); + setDrawMode( DM_TRIANGLE_FAN, true ); triangleFanSetSubset( 0, 0, 0, 1, 1, 1 ); triangleFanSetColor( ColorA() ); } @@ -665,7 +665,7 @@ void BatchRenderer::batchTriangleFan( const Float& x0, const Float& y0, const Fl if ( mNumVertex + 3 >= mVertexSize ) return; - setBlendMode( DM_TRIANGLE_FAN, mForceBlendMode ); + setDrawMode( DM_TRIANGLE_FAN, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -692,7 +692,7 @@ void BatchRenderer::batchTriangleFan( const Float& x0, const Float& y0 ) { if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_TRIANGLE_FAN, mForceBlendMode ); + setDrawMode( DM_TRIANGLE_FAN, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -704,7 +704,7 @@ void BatchRenderer::batchTriangleFan( const Float& x0, const Float& y0 ) { } void BatchRenderer::trianglesBegin() { - setBlendMode( DM_TRIANGLES, true ); + setDrawMode( DM_TRIANGLES, true ); trianglesSetSubset( 0, 0, 0, 1, 1, 1 ); trianglesSetColor( ColorA() ); } @@ -728,7 +728,7 @@ void BatchRenderer::batchTriangle( const Float& x0, const Float& y0, const Float if ( mNumVertex + 2 >= mVertexSize ) return; - setBlendMode( DM_TRIANGLES, mForceBlendMode ); + setDrawMode( DM_TRIANGLES, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x0; @@ -759,7 +759,7 @@ void BatchRenderer::batchPolygon( const Polygon2f& Polygon ) { if ( Polygon.getSize() > mVertexSize ) return; - setBlendMode( DM_POLYGON, mForceBlendMode ); + setDrawMode( DM_POLYGON, mForceBlendMode ); for ( Uint32 i = 0; i < Polygon.getSize(); i++ ) { mTVertex = &mVertex[ mNumVertex ]; @@ -777,7 +777,7 @@ void BatchRenderer::batchPolygonByPoint( const Float& x, const Float& y ) { if ( mNumVertex + 1 >= mVertexSize ) return; - setBlendMode( DM_POLYGON, mForceBlendMode ); + setDrawMode( DM_POLYGON, mForceBlendMode ); mTVertex = &mVertex[ mNumVertex ]; mTVertex->pos.x = x; diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 789678a37..bc0742545 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -7,178 +7,6 @@ #include #include -namespace EE { namespace Graphics { - // Add an underline or strikethrough line to the vertex array - void Text::addLine(std::vector& vertices, std::vector& colors, Float lineLength, Float lineTop, const EE::System::ColorA& color, Float offset, Float thickness, Float outlineThickness, Sizei textureSize, Int32 centerDiffX) { - Float top = std::floor(lineTop + offset - (thickness / 2) + 0.5f); - Float bottom = top + std::floor(thickness + 0.5f); - Float u1 = 0; - Float v1 = 0; - Float u2 = 1 / (Float)textureSize.getWidth(); - Float v2 = 1 / (Float)textureSize.getHeight(); - VertexCoords vc; - - if ( GLi->quadsSupported() ) { - vc.texCoords.x = u1; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + -outlineThickness; - vc.position.y = top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + -outlineThickness; - vc.position.y = bottom + outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + lineLength + outlineThickness; - vc.position.y = bottom + outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + lineLength + outlineThickness; - vc.position.y = top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - } else { - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + -outlineThickness; - vc.position.y = bottom + outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + -outlineThickness; - vc.position.y = top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + lineLength + outlineThickness; - vc.position.y = top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + -outlineThickness; - vc.position.y = bottom + outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + lineLength + outlineThickness; - vc.position.y = bottom + outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + lineLength + outlineThickness; - vc.position.y = top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - } - } - - // Add a glyph quad to the vertex array - void Text::addGlyphQuad(std::vector& vertices, std::vector& colors, Vector2f position, const EE::System::ColorA& color, const EE::Graphics::Glyph& glyph, Float italic, Float outlineThickness, Sizei textureSize, Int32 centerDiffX) { - Float left = glyph.bounds.Left; - Float top = glyph.bounds.Top; - Float right = glyph.bounds.Left + glyph.bounds.Right; - Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; - - Float u1 = static_cast(glyph.textureRect.Left) / (Float)textureSize.getWidth(); - Float v1 = static_cast(glyph.textureRect.Top) / (Float)textureSize.getHeight(); - Float u2 = static_cast(glyph.textureRect.Left + glyph.textureRect.Right) / (Float)textureSize.getWidth(); - Float v2 = static_cast(glyph.textureRect.Top + glyph.textureRect.Bottom) / (Float)textureSize.getHeight(); - VertexCoords vc; - - if ( GLi->quadsSupported() ) { - - vc.texCoords.x = u1; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + position.x + left - italic * top - outlineThickness; - vc.position.y = position.y + top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; - vc.position.y = position.y + bottom - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + position.x + right - italic * bottom - outlineThickness; - vc.position.y = position.y + bottom - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; - vc.position.y = position.y + top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - } else { - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; - vc.position.y = position.y + bottom - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + position.x + left - italic * top - outlineThickness; - vc.position.y = position.y + top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; - vc.position.y = position.y + top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u1; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; - vc.position.y = position.y + bottom - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v2; - vc.position.x = centerDiffX + position.x + right - italic * bottom - outlineThickness; - vc.position.y = position.y + bottom - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - - vc.texCoords.x = u2; - vc.texCoords.y = v1; - vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; - vc.position.y = position.y + top - outlineThickness; - colors.push_back( color ); - vertices.push_back( vc ); - } - } -}} - namespace EE { namespace Graphics { Text::Text() : @@ -192,11 +20,12 @@ Text::Text() : mOutlineThickness (0), mGeometryNeedUpdate(false), mCachedWidthNeedUpdate(false), + mColorsNeedUpdate(false), mCachedWidth(0), mNumLines(0), mLargestLineCharCount(0), mFontShadowColor( ColorA( 0, 0, 0, 255 ) ), - mFlags(0), + mAlign(0), mFontHeight(0) { } @@ -212,11 +41,12 @@ Text::Text(const String& string, Font * font, unsigned int characterSize) : mOutlineThickness(0), mGeometryNeedUpdate(true), mCachedWidthNeedUpdate(true), + mColorsNeedUpdate(true), mCachedWidth(0), mNumLines(0), mLargestLineCharCount(0), mFontShadowColor( ColorA( 0, 0, 0, 255 ) ), - mFlags(0), + mAlign(0), mFontHeight( mFont->getFontHeight( mRealCharacterSize ) ) { } @@ -231,11 +61,12 @@ Text::Text(Font * font, unsigned int characterSize) : mOutlineThickness(0), mGeometryNeedUpdate(true), mCachedWidthNeedUpdate(true), + mColorsNeedUpdate(true), mCachedWidth(0), mNumLines(0), mLargestLineCharCount(0), mFontShadowColor( ColorA( 0, 0, 0, 255 ) ), - mFlags(0), + mAlign(0), mFontHeight( mFont->getFontHeight( mRealCharacterSize ) ) { } @@ -245,16 +76,18 @@ void Text::create(Font * font, const String & text, ColorA FontColor, ColorA Fon mString = text; mCharacterSize = characterSize; mRealCharacterSize = PixelDensity::dpToPxI(mCharacterSize); - setColor( FontColor ); + setFillColor( FontColor ); setShadowColor( FontShadowColor ); mGeometryNeedUpdate = true; mCachedWidthNeedUpdate = true; + mColorsNeedUpdate = true; ensureGeometryUpdate(); } void Text::setString(const String& string) { if (mString != string) { mString = string; + mColorsNeedUpdate = true; mGeometryNeedUpdate = true; mCachedWidthNeedUpdate = true; } @@ -273,7 +106,7 @@ void Text::setFont(Font * font) { } void Text::setCharacterSize(unsigned int size) { - if (mCharacterSize != size) { + if ( NULL != mFont && mCharacterSize != size) { mCharacterSize = size; mRealCharacterSize = PixelDensity::dpToPxI( mCharacterSize ); @@ -287,6 +120,7 @@ void Text::setCharacterSize(unsigned int size) { void Text::setStyle(Uint32 style) { if (mStyle != style) { mStyle = style; + mColorsNeedUpdate = true; mGeometryNeedUpdate = true; mCachedWidthNeedUpdate = true; } @@ -299,30 +133,21 @@ void Text::setColor(const ColorA & color) { void Text::setFillColor(const ColorA& color) { if (color != mFillColor) { mFillColor = color; - - // Change vertex colors directly, no need to update whole geometry - // (if geometry is updated anyway, we can skip this step) - if (!mGeometryNeedUpdate) { - mColors.assign( mVertices.size(), mFillColor ); - } + mColorsNeedUpdate = true; } } void Text::setOutlineColor(const ColorA& color) { if (color != mOutlineColor) { mOutlineColor = color; - - // Change vertex colors directly, no need to update whole geometry - // (if geometry is updated anyway, we can skip this step) - if (!mGeometryNeedUpdate) { - mOutlineColors.assign( mOutlineVertices.size(), mOutlineColor ); - } + mColorsNeedUpdate = true; } } void Text::setOutlineThickness(Float thickness) { if (thickness != mOutlineThickness) { mOutlineThickness = thickness; + mColorsNeedUpdate = true; mGeometryNeedUpdate = true; mCachedWidthNeedUpdate = true; } @@ -454,7 +279,6 @@ void Text::draw(const Float & X, const Float & Y, const Vector2f & Scale, const if ( Col.a != 255 ) { ColorA ShadowColor = getShadowColor(); - ShadowColor.a = (Uint8)( (Float)ShadowColor.a * ( (Float)Col.a / (Float)255 ) ); setFillColor( ShadowColor ); @@ -462,6 +286,8 @@ void Text::draw(const Float & X, const Float & Y, const Vector2f & Scale, const setFillColor( getShadowColor() ); } + mColors.assign( mColors.size(), getFillColor() ); + Float pd = PixelDensity::dpToPx(1); draw( X + pd, Y + pd, Scale, Angle, Effect ); @@ -469,6 +295,7 @@ void Text::draw(const Float & X, const Float & Y, const Vector2f & Scale, const mStyle = f; setFillColor( Col ); + mColors.assign( mColors.size(), getFillColor() ); } if ( Angle != 0.0f || Scale != 1.0f ) { @@ -536,9 +363,7 @@ void Text::ensureGeometryUpdate() { // Clear the previous geometry mVertices.clear(); - mColors.clear();; mOutlineVertices.clear(); - mOutlineColors.clear(); mBounds = Rectf(); // No font or text: nothing to draw @@ -575,14 +400,15 @@ void Text::ensureGeometryUpdate() { Float centerDiffX = 0; unsigned int Line = 0; + ensureColorUpdate(); cacheWidth(); - switch ( fontHAlignGet( mFlags ) ) { - case FONT_DRAW_CENTER: + switch ( fontHAlignGet( mAlign ) ) { + case TEXT_ALIGN_CENTER: centerDiffX = (Float)( (Int32)( ( mCachedWidth - mLinesWidth[ Line ] ) * 0.5f ) ); Line++; break; - case FONT_DRAW_RIGHT: + case TEXT_ALIGN_RIGHT: centerDiffX = mCachedWidth - mLinesWidth[ Line ]; Line++; break; @@ -597,26 +423,26 @@ void Text::ensureGeometryUpdate() { // If we're using the underlined style and there's a new line, draw a line if (underlined && (curChar == L'\n')) { - addLine(mVertices, mColors, x, y, mFillColor, underlineOffset, underlineThickness, 0, textureSize, centerDiffX); + addLine(mVertices, x, y, underlineOffset, underlineThickness, 0, textureSize, centerDiffX); if (mOutlineThickness != 0) - addLine(mOutlineVertices, mOutlineColors, x, y, mOutlineColor, underlineOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); + addLine(mOutlineVertices, x, y, underlineOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); } // If we're using the strike through style and there's a new line, draw a line across all characters if (strikeThrough && (curChar == L'\n')) { - addLine(mVertices, mColors, x, y, mFillColor, strikeThroughOffset, underlineThickness, 0, textureSize, centerDiffX); + addLine(mVertices, x, y, strikeThroughOffset, underlineThickness, 0, textureSize, centerDiffX); if (mOutlineThickness != 0) - addLine(mOutlineVertices, mOutlineColors, x, y, mOutlineColor, strikeThroughOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); + addLine(mOutlineVertices, x, y, strikeThroughOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); } if ( curChar == L'\n' ) { - switch ( fontHAlignGet( mFlags ) ) { - case FONT_DRAW_CENTER: + switch ( fontHAlignGet( mAlign ) ) { + case TEXT_ALIGN_CENTER: centerDiffX = (Float)( (Int32)( ( mCachedWidth - mLinesWidth[ Line ] ) * 0.5f ) ); break; - case FONT_DRAW_RIGHT: + case TEXT_ALIGN_RIGHT: centerDiffX = mCachedWidth - mLinesWidth[ Line ]; break; } @@ -655,7 +481,7 @@ void Text::ensureGeometryUpdate() { Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; // Add the outline glyph to the vertices - addGlyphQuad(mOutlineVertices, mOutlineColors, Vector2f(x, y), mOutlineColor, glyph, italic, mOutlineThickness, textureSize, centerDiffX); + addGlyphQuad(mOutlineVertices, Vector2f(x, y), glyph, italic, mOutlineThickness, textureSize, centerDiffX); // Update the current bounds with the outlined glyph bounds minX = std::min(minX, x + left - italic * bottom - mOutlineThickness); @@ -668,7 +494,7 @@ void Text::ensureGeometryUpdate() { const Glyph& glyph = mFont->getGlyph(curChar, mRealCharacterSize, bold); // Add the glyph to the vertices - addGlyphQuad(mVertices, mColors, Vector2f(x, y), mFillColor, glyph, italic, 0, textureSize, centerDiffX); + addGlyphQuad(mVertices, Vector2f(x, y), glyph, italic, 0, textureSize, centerDiffX); // Update the current bounds with the non outlined glyph bounds if (mOutlineThickness == 0) { @@ -689,18 +515,18 @@ void Text::ensureGeometryUpdate() { // If we're using the underlined style, add the last line if (underlined && (x > 0)) { - addLine(mVertices, mColors, x, y, mFillColor, underlineOffset, underlineThickness, 0, textureSize, centerDiffX); + addLine(mVertices, x, y, underlineOffset, underlineThickness, 0, textureSize, centerDiffX); if (mOutlineThickness != 0) - addLine(mOutlineVertices, mOutlineColors, x, y, mOutlineColor, underlineOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); + addLine(mOutlineVertices, x, y, underlineOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); } // If we're using the strike through style, add the last line across all characters if (strikeThrough && (x > 0)) { - addLine(mVertices, mColors, x, y, mFillColor, strikeThroughOffset, underlineThickness, 0, textureSize, centerDiffX); + addLine(mVertices, x, y, strikeThroughOffset, underlineThickness, 0, textureSize, centerDiffX); if (mOutlineThickness != 0) - addLine(mOutlineVertices, mOutlineColors, x, y, mOutlineColor, strikeThroughOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); + addLine(mOutlineVertices, x, y, strikeThroughOffset, underlineThickness, mOutlineThickness, textureSize, centerDiffX); } // Update the bounding rectangle @@ -710,6 +536,22 @@ void Text::ensureGeometryUpdate() { mBounds.Bottom = maxY - minY; } +void Text::ensureColorUpdate() { + if ( mColorsNeedUpdate ) { + Uint32 tv = getTotalVertices(); + + if ( mColors.size() < tv ) { + mColors.resize( tv, mFillColor ); + } + + if ( 0 != mOutlineThickness && ( mOutlineColors.size() < tv ) ) { + mOutlineColors.resize( tv, mOutlineColor ); + } + + mColorsNeedUpdate = false; + } +} + const ColorA& Text::getShadowColor() const { return mFontShadowColor; } @@ -730,15 +572,15 @@ const std::vector& Text::getLinesWidth() { return mLinesWidth; } -void Text::setFlags( const Uint32& flags ) { - if ( mFlags != flags ) { - mFlags = flags; +void Text::setAlign( const Uint32& align ) { + if ( mAlign != align ) { + mAlign = align; mGeometryNeedUpdate = true; } } -const Uint32& Text::getFlags() const { - return mFlags; +const Uint32& Text::getAlign() const { + return mAlign; } void Text::cacheWidth() { @@ -762,4 +604,287 @@ void Text::setStyleConfig( const FontStyleConfig& styleConfig ) { setOutlineColor( styleConfig.OutlineColor ); } +void Text::setFillColor( const ColorA& color, Uint32 from, Uint32 to ) { + if ( mString.empty() ) + return; + + ensureColorUpdate(); + + bool underlined = (mStyle & Underlined) != 0; + bool strikeThrough = (mStyle & StrikeThrough) != 0; + std::vector colors( GLi->quadVertexs(), color ); + std::size_t s = mString.size(); + + if ( to >= s ) { + to = s - 1; + } + + if ( from <= to && from < s && to <= s ) { + size_t rto = to + 1; + Int32 rpos = from; + Int32 lpos = 0; + Uint32 i; + Uint32 qsize = sizeof(ColorA) * GLi->quadVertexs(); + String::StringBaseType curChar; + + // Spaces, new lines and tabs are not rendered, and not counted as a color + // We need to skip those characters as nonexistent chars + for ( i = 0; i < from; i++ ) { + curChar = mString[i]; + + if ( ' ' == curChar || '\n' == curChar || '\t' == curChar ) { + if ( rpos > 0 ) { + rpos--; + + if ( '\n' == curChar) { + if ( underlined ) + rpos++; + + if ( strikeThrough ) + rpos++; + } + } + } + } + + for ( Uint32 i = from; i < rto; i++ ) { + curChar = mString[i]; + + lpos = rpos; + rpos++; + + // Same here + if ( ' ' == curChar || '\n' == curChar || '\t' == curChar ) { + if ( rpos > 0 ) { + rpos--; + + if ( '\n' == curChar) { + if ( underlined ) { + memcpy( &(mColors[ rpos * GLi->quadVertexs() ]), &colors[0], qsize ); + rpos++; + } + + if ( strikeThrough ) { + memcpy( &(mColors[ rpos * GLi->quadVertexs() ]), &colors[0], qsize ); + rpos++; + } + } + } + } + + memcpy( &(mColors[ lpos * GLi->quadVertexs() ]), &colors[0], qsize ); + } + + if ( rto == s ) { + if ( underlined ) { + lpos++; + Uint32 pos = lpos * GLi->quadVertexs(); + + if ( pos < mColors.size() ) + memcpy( &(mColors[ lpos * GLi->quadVertexs() ]), &colors[0], qsize ); + } + + if ( strikeThrough ) { + lpos++; + Uint32 pos = lpos * GLi->quadVertexs(); + + if ( pos < mColors.size() ) + memcpy( &(mColors[ lpos * GLi->quadVertexs() ]), &colors[0], qsize ); + } + } + } +} + +// Add an underline or strikethrough line to the vertex array +void Text::addLine(std::vector& vertices, Float lineLength, Float lineTop, Float offset, Float thickness, Float outlineThickness, Sizei textureSize, Int32 centerDiffX) { + Float top = std::floor(lineTop + offset - (thickness / 2) + 0.5f); + Float bottom = top + std::floor(thickness + 0.5f); + Float u1 = 0; + Float v1 = 0; + Float u2 = 1 / (Float)textureSize.getWidth(); + Float v2 = 1 / (Float)textureSize.getHeight(); + VertexCoords vc; + + if ( GLi->quadsSupported() ) { + vc.texCoords.x = u1; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + -outlineThickness; + vc.position.y = top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + -outlineThickness; + vc.position.y = bottom + outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + lineLength + outlineThickness; + vc.position.y = bottom + outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + lineLength + outlineThickness; + vc.position.y = top - outlineThickness; + vertices.push_back( vc ); + } else { + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + -outlineThickness; + vc.position.y = bottom + outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + -outlineThickness; + vc.position.y = top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + lineLength + outlineThickness; + vc.position.y = top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + -outlineThickness; + vc.position.y = bottom + outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + lineLength + outlineThickness; + vc.position.y = bottom + outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + lineLength + outlineThickness; + vc.position.y = top - outlineThickness; + vertices.push_back( vc ); + } +} + +// Add a glyph quad to the vertex array +void Text::addGlyphQuad(std::vector& vertices, Vector2f position, const EE::Graphics::Glyph& glyph, Float italic, Float outlineThickness, Sizei textureSize, Int32 centerDiffX) { + Float left = glyph.bounds.Left; + Float top = glyph.bounds.Top; + Float right = glyph.bounds.Left + glyph.bounds.Right; + Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; + + Float u1 = static_cast(glyph.textureRect.Left) / (Float)textureSize.getWidth(); + Float v1 = static_cast(glyph.textureRect.Top) / (Float)textureSize.getHeight(); + Float u2 = static_cast(glyph.textureRect.Left + glyph.textureRect.Right) / (Float)textureSize.getWidth(); + Float v2 = static_cast(glyph.textureRect.Top + glyph.textureRect.Bottom) / (Float)textureSize.getHeight(); + VertexCoords vc; + + if ( GLi->quadsSupported() ) { + + vc.texCoords.x = u1; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + position.x + left - italic * top - outlineThickness; + vc.position.y = position.y + top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; + vc.position.y = position.y + bottom - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + position.x + right - italic * bottom - outlineThickness; + vc.position.y = position.y + bottom - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; + vc.position.y = position.y + top - outlineThickness; + vertices.push_back( vc ); + } else { + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; + vc.position.y = position.y + bottom - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + position.x + left - italic * top - outlineThickness; + vc.position.y = position.y + top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; + vc.position.y = position.y + top - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u1; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + position.x + left - italic * bottom - outlineThickness; + vc.position.y = position.y + bottom - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v2; + vc.position.x = centerDiffX + position.x + right - italic * bottom - outlineThickness; + vc.position.y = position.y + bottom - outlineThickness; + vertices.push_back( vc ); + + vc.texCoords.x = u2; + vc.texCoords.y = v1; + vc.position.x = centerDiffX + position.x + right - italic * top - outlineThickness; + vc.position.y = position.y + top - outlineThickness; + vertices.push_back( vc ); + } +} + +Uint32 Text::getTotalVertices() { + bool underlined = (mStyle & Underlined) != 0; + bool strikeThrough = (mStyle & StrikeThrough) != 0; + size_t sl = mString.size(); + size_t sv = sl * GLi->quadVertexs(); + + Uint32 * c = &mString[0]; + Uint32 skiped = 0; + bool lineHasChars = false; + + while ( '\0' != *c ) { + lineHasChars = true; + + if ( ' ' == *c || '\n' == *c || '\t' == *c ) { + lineHasChars = false; + skiped++; + + if ( '\n' == *c ) { + if ( underlined ) + skiped--; + + if ( strikeThrough ) + skiped--; + } + } + + c++; + } + + if ( lineHasChars ) { + if ( underlined ) + skiped--; + + if ( strikeThrough ) + skiped--; + } + + sv -= skiped * GLi->quadVertexs(); + + return sv; +} + }} diff --git a/src/eepp/ui/uiselectbutton.cpp b/src/eepp/ui/uiselectbutton.cpp index d5cdad1e9..f166786da 100644 --- a/src/eepp/ui/uiselectbutton.cpp +++ b/src/eepp/ui/uiselectbutton.cpp @@ -55,15 +55,15 @@ void UISelectButton::onStateChange() { } } - if ( getParent()->getType() & UI_TYPE_WINMENU ) { + if ( getParent()->isType( UI_TYPE_WINMENU ) ) { UIWinMenu * Menu = reinterpret_cast ( getParent() ); if ( mSkinState->getState() == UISkinState::StateSelected ) { - getTextBox()->setFontColor( Menu->getFontStyleConfig().getFontSelectedColor() ); + getTextBox()->setFontColor( Menu->getStyleConfig().getFontSelectedColor() ); } else if ( mSkinState->getState() == UISkinState::StateMouseEnter ) { - getTextBox()->setFontColor( Menu->getFontStyleConfig().getFontOverColor() ); + getTextBox()->setFontColor( Menu->getStyleConfig().getFontOverColor() ); } else { - getTextBox()->setFontColor( Menu->getFontStyleConfig().getFontColor() ); + getTextBox()->setFontColor( Menu->getStyleConfig().getFontColor() ); } } else { if ( mSkinState->getState() == UISkinState::StateSelected ) { diff --git a/src/eepp/ui/uitextinputpassword.cpp b/src/eepp/ui/uitextinputpassword.cpp index 9f085620b..ddae33a8b 100644 --- a/src/eepp/ui/uitextinputpassword.cpp +++ b/src/eepp/ui/uitextinputpassword.cpp @@ -40,7 +40,7 @@ void UITextInputPassword::draw() { ); } - mPassCache->setFlags( getFlags() ); + mPassCache->setAlign( getFlags() ); mPassCache->draw( (Float)mScreenPos.x + mRealAlignOffset.x + (Float)mRealPadding.Left, (Float)mScreenPos.y + mRealAlignOffset.y + (Float)mRealPadding.Top, Vector2f::One, 0.f, getBlendMode() ); if ( mFlags & UI_CLIP_ENABLE ) { diff --git a/src/eepp/ui/uitextview.cpp b/src/eepp/ui/uitextview.cpp index c0d203579..4aa0a5ee9 100644 --- a/src/eepp/ui/uitextview.cpp +++ b/src/eepp/ui/uitextview.cpp @@ -62,7 +62,7 @@ void UITextView::draw() { ); } - mTextCache->setFlags( getFlags() ); + mTextCache->setAlign( getFlags() ); mTextCache->draw( (Float)mScreenPos.x + mRealAlignOffset.x + (Float)mRealPadding.Left, (Float)mScreenPos.y + mRealAlignOffset.y + (Float)mRealPadding.Top, Vector2f::One, 0.f, getBlendMode() ); if ( mFlags & UI_CLIP_ENABLE ) { diff --git a/src/eepp/ui/uitooltip.cpp b/src/eepp/ui/uitooltip.cpp index 090536346..71051fa21 100644 --- a/src/eepp/ui/uitooltip.cpp +++ b/src/eepp/ui/uitooltip.cpp @@ -94,7 +94,7 @@ void UITooltip::draw() { UIControlAnim::draw(); if ( mTextCache->getTextWidth() ) { - mTextCache->setFlags( getFlags() ); + mTextCache->setAlign( getFlags() ); mTextCache->draw( (Float)mScreenPos.x + mAlignOffset.x, (Float)mScreenPos.y + mAlignOffset.y, Vector2f::One, 0.f, getBlendMode() ); } } diff --git a/src/eepp/ui/uiwinmenu.cpp b/src/eepp/ui/uiwinmenu.cpp index 991fe1c5a..0e704c6a3 100644 --- a/src/eepp/ui/uiwinmenu.cpp +++ b/src/eepp/ui/uiwinmenu.cpp @@ -120,15 +120,6 @@ void UIWinMenu::setMarginBetweenButtons(const Uint32 & marginBetweenButtons) { refreshButtons(); } -UITooltipStyleConfig UIWinMenu::getFontStyleConfig() const { - return UITooltipStyleConfig(mStyleConfig); -} - -void UIWinMenu::setFontStyleConfig(const UITooltipStyleConfig & fontStyleConfig) { - mStyleConfig = fontStyleConfig; - refreshButtons(); -} - UIWinMenuStyleConfig UIWinMenu::getStyleConfig() const { return mStyleConfig; } diff --git a/src/examples/fonts/fonts.cpp b/src/examples/fonts/fonts.cpp index 34dbdcdf1..3bbc0fe4d 100644 --- a/src/examples/fonts/fonts.cpp +++ b/src/examples/fonts/fonts.cpp @@ -4,12 +4,12 @@ EE::Window::Window * win = NULL; FontTrueType * fontTest; -Uint32 nextGliph = 0; -Clock timer; +FontTrueType * fontTest2; Text text; +Text text2; +Text text3; -void mainLoop() -{ +void mainLoop() { // Clear the screen buffer win->clear(); @@ -22,68 +22,65 @@ void mainLoop() win->close(); } -/* - Float YPos = 32; + text.draw( ( win->getWidth() - text.getTextWidth() ) * 0.5f, 32 ); - // Draw the text on screen - TTFCache.draw( win->getWidth() * 0.5f - TTFCache.getTextWidth() * 0.5f, YPos ); - - TTFOCache.draw( ( win->getWidth() - TTFOCache.getTextWidth() ) * 0.5f, ( YPos += TTFCache.getTextHeight() + 24 ) ); - - TTF2Cache.draw( ( win->getWidth() - TTF2Cache.getTextWidth() ) * 0.5f, ( YPos += TTFOCache.getTextHeight() + 24 ) ); - - TexFCache.draw( ( win->getWidth() - TexFCache.getTextWidth() ) * 0.5f, ( YPos += TTF2Cache.getTextHeight() + 24 ) ); - - TexF2Cache.draw( ( win->getWidth() - TexF2Cache.getTextWidth() ) * 0.5f, ( YPos += TexFCache.getTextHeight() + 24 ) ); - - // Draw the cached text - TxtCache.draw( ( win->getWidth() - TxtCache.getTextWidth() ) * 0.5f, ( YPos += TexF2Cache.getTextHeight() + 24 ) ); + text2.draw( ( win->getWidth() - text2.getTextWidth() ) * 0.5f, 300 ); // Text rotated and scaled - TTFCache.draw( ( win->getWidth() - TTFCache.getTextWidth() ) * 0.5f, 512 + 32, Vector2f( 0.75f, 0.75f ), 12.5f ); -*/ - /*if ( timer.getElapsedTime().asMilliseconds() > 50 ) { - fontTest.getGlyph( nextGliph, 48, false ); - nextGliph++; - timer.restart(); - }*/ + text2.draw( ( win->getWidth() - text2.getTextWidth() ) * 0.5f, 430, Vector2f(1.1f,1.1f), 12.5f ); - text.draw( ( win->getWidth() - text.getTextWidth() ) * 0.5f, 0 ); + text3.draw( ( win->getWidth() - text3.getTextWidth() ) * 0.5f, 560 ); // Draw frame win->display(); } -EE_MAIN_FUNC int main (int argc, char * argv []) -{ +EE_MAIN_FUNC int main (int argc, char * argv []) { // Create a new window win = Engine::instance()->createWindow( WindowSettings( 960, 640, "eepp - Fonts" ), ContextSettings( true ) ); // Set window background color - win->setClearColor( RGB(255,255,255) ); + win->setClearColor( Color(230,230,230) ); // Check if created if ( win->isOpen() ) { // Get the application path std::string AppPath = Sys::getProcessPath(); - // Save the TTF font so then it can be loaded as a TextureFont - //TTF->save( AppPath + "assets/temp/DejaVuSansMono.png", AppPath + "assets/temp/DejaVuSansMono.fnt" ); - // Create a new text string String Txt( "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ); fontTest = FontTrueType::New( "DejaVuSansMono" ); fontTest->loadFromFile( AppPath + "assets/fonts/DejaVuSansMono.ttf" ); fontTest->shrinkText( Txt, 24, false, 2, win->getWidth() - 96 ); + text.setFont( fontTest ); text.setCharacterSize( 24 ); - text.setFillColor( 0xFFFFFFFF ); - text.setOutlineThickness( 2 ); - text.setFlags( FONT_DRAW_CENTER ); + text.setAlign( TEXT_ALIGN_CENTER ); text.setString( Txt ); - win->setClearColor( RGB(230,230,230) ); + // Set the font color to a substring of the text + // Create a gradient + size_t size = Txt.size(); + + for ( size_t i = 0; i < size; i++ ) { + text.setFillColor( ColorA(255*i/size,0,0,255), i, i+1 ); + } + + fontTest2 = FontTrueType::New( "Arial" ); + fontTest2->loadFromFile( AppPath + "assets/fonts/arial.ttf" ); + + text2.setFont( fontTest2 ); + text2.setString( "Lorem ipsum dolor sit amet, consectetur adipisicing elit." ); + text2.setCharacterSize( 32 ); + text2.setFillColor( Color::Black ); + + text3.setFont( fontTest ); + text3.setString( text2.getString() ); + text3.setOutlineThickness( 2 ); + text3.setCharacterSize( 24 ); + text3.setFillColor( ColorA(255,255,255,255) ); + text3.setOutlineColor( ColorA(0,0,0,255) ); // Application loop win->runMainLoop( &mainLoop ); diff --git a/src/test/eetest.cpp b/src/test/eetest.cpp index 691d5ee6b..b03856b55 100644 --- a/src/test/eetest.cpp +++ b/src/test/eetest.cpp @@ -1353,7 +1353,7 @@ void EETest::screen4() { mVBO->draw(); mVBO->unbind(); - mFBOText.setFlags( FONT_DRAW_CENTER ); + mFBOText.setAlign( TEXT_ALIGN_CENTER ); mFBOText.draw( 128.f - (Float)(Int32)( mFBOText.getTextWidth() * 0.5f ), 25.f - (Float)(Int32)( mFBOText.getTextHeight() * 0.5f ) ); } @@ -1435,7 +1435,7 @@ void EETest::render() { ColorA ColRR2( 100, 100, 100, 220 ); ColorA ColRR3( 100, 100, 100, 220 ); - mEEText.setFlags( FONT_DRAW_CENTER ); + mEEText.setAlign( TEXT_ALIGN_CENTER ); PR.setColor( ColorA(150, 150, 150, 220) ); PR.setFillMode( DRAW_FILL );