From cfb2dbd8800a2fe62a17aeca102b07695bf679ee Mon Sep 17 00:00:00 2001 From: Vincent-FK Date: Sat, 14 Mar 2020 11:36:38 +0100 Subject: [PATCH] correct 2 bugs in scrolling text: not displayed if waitEndTime<=0 and reset current position to 0 correctly Signed-off-by: Vincent-FK --- .../Component/ReloadableScrollingText.cpp | 88 +++++++++++-------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp index 81a1421..bd8eb5f 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp @@ -86,6 +86,11 @@ void ReloadableScrollingText::update(float dt) { //currentPosition_ += scrollingSpeed_ * dt * scaleX_; currentPosition_ += (scrollForward_?1.0f:-1.0f) * scrollingSpeed_ * dt * scaleX_; + + // Sanity check + if(currentPosition_ < -startPosition_ * scaleX_){ + currentPosition_ = -startPosition_ * scaleX_; + } } else if (direction_ == "vertical") { @@ -176,7 +181,7 @@ void ReloadableScrollingText::reloadTexture( ) if (systemMode_) { - // check the master collection for the system artifact + // check the master collection for the system artifact loadText( collectionName, type_, type_, "", true ); // check collection for the system artifact @@ -193,7 +198,7 @@ void ReloadableScrollingText::reloadTexture( ) if (selectedItem->leaf) // item is a leaf { - // check the master collection for the artifact + // check the master collection for the artifact loadText( collectionName, type_, basename, "", false ); // check the collection for the artifact @@ -206,7 +211,7 @@ void ReloadableScrollingText::reloadTexture( ) else // item is a submenu { - // check the master collection for the artifact + // check the master collection for the artifact loadText( collectionName, type_, basename, "", false ); // check the collection for the artifact @@ -219,7 +224,7 @@ void ReloadableScrollingText::reloadTexture( ) if (text_.empty( )) { loadText( selectedItem->name, type_, type_, "", true ); - } + } } @@ -420,7 +425,7 @@ void ReloadableScrollingText::loadText( std::string collection, std::string type return; } - std::string line; + std::string line; while(std::getline(includeStream, line)) { @@ -454,7 +459,7 @@ void ReloadableScrollingText::draw( ) { Component::draw( ); - if (!text_.empty( ) && waitEndTime_ <= 0.0f && baseViewInfo.Alpha > 0.0f) + if (!text_.empty( ) && baseViewInfo.Alpha > 0.0f) { Font *font; @@ -463,7 +468,6 @@ void ReloadableScrollingText::draw( ) else // If not, use the general font settings font = fontInst_; - //SDL_Texture *t = font->getTexture( ); SDL_Surface *t = font->getTexture( ); float imageHeight = 0; @@ -494,31 +498,37 @@ void ReloadableScrollingText::draw( ) float scale = 1.0f; - // determine image width that can fit the container from 1st line - for ( unsigned int i = 0; i < text_[0].size( ); ++i ) + // Horizontal mode only: + // Compute 1st line image width that fits inside the the container width to get the origin position + if (direction_ == "horizontal") { - Font::GlyphInfo glyph; - if ( font->getRect( text_[0][i], glyph ) ) - { - if ( glyph.minX < 0 ) - { - imageWidth += glyph.minX; - } + for ( unsigned int i = 0; i < text_[0].size( ); ++i ) + { + Font::GlyphInfo glyph; + if ( font->getRect( text_[0][i], glyph ) ) + { + if ( glyph.minX < 0 ) + { + imageWidth += glyph.minX; + } - if ( (imageWidth + glyph.advance)*scale > imageMaxWidth ) - { - break; - } - imageWidth += glyph.advance; + int char_width = static_cast( glyph.rect.w?glyph.rect.w:glyph.advance ); - /*printf("textData_[%d]=%c, glyph.advance= %f - %d\n", i, textData_[i], glyph.advance, glyph.advance); - printf("imageWidth=%f \n", imageWidth);*/ - } - else{ - /*std::stringstream ss; - ss << "Could not find Glyph info for char: " << textData_[i]; - Logger::write(Logger::ZONE_WARNING, "Text", ss.str());*/ - } + if ( (imageWidth + char_width) * scale * scaleX_ > imageMaxWidth ) + { + break; + } + imageWidth += char_width; + + /*printf("textData_[%d]=%c, glyph.advance= %f - %d\n", i, textData_[i], glyph.advance, glyph.advance); + printf("imageWidth=%f \n", imageWidth);*/ + } + else{ + /*std::stringstream ss; + ss << "Could not find Glyph info for char: " << textData_[i]; + Logger::write(Logger::ZONE_WARNING, "Text", ss.str());*/ + } + } } float oldWidth = baseViewInfo.Width; @@ -576,7 +586,8 @@ void ReloadableScrollingText::draw( ) { SDL_Rect charRect = glyph.rect; rect.h = static_cast( charRect.h * scale * scaleY_ ); - rect.w = static_cast( charRect.w?charRect.w:glyph.advance * scale * scaleX_ ); + int char_width = static_cast( charRect.w?charRect.w:glyph.advance ); + rect.w = static_cast( char_width * scale * scaleX_ ); rect.y = static_cast( yOrigin ); /*if (font->getAscent( ) < glyph.maxY) @@ -586,19 +597,19 @@ void ReloadableScrollingText::draw( ) rect.y += static_cast( (font->getAscent( ) - glyph.maxY) * scale * scaleY_ ); // Check if glyph falls partially outside the box at the back end - if ((rect.x + static_cast( glyph.advance * scale * scaleX_ )) >= (static_cast( xOrigin ) + imageMaxWidth)) + if ((rect.x + static_cast( char_width * scale * scaleX_ )) >= (static_cast( xOrigin ) + imageMaxWidth)) { rect.w = static_cast( xOrigin ) + static_cast( imageMaxWidth ) - rect.x; charRect.w = static_cast( rect.w / scale / scaleX_ ); } // Print the glyph if it falls (partially) within the box - if ( position + glyph.advance * scale * scaleX_ > currentPosition_ ) + if ( position + char_width * scale * scaleX_ > currentPosition_ ) { // Check if glyph falls partially outside the box at the front end if ( position < currentPosition_ ) { - rect.w = static_cast( glyph.advance * scale * scaleX_ + position - currentPosition_ ); + rect.w = static_cast( char_width * scale * scaleX_ + position - currentPosition_ ); charRect.x = static_cast( charRect.x + charRect.w - rect.w / scale / scaleX_ ); charRect.w = static_cast( rect.w / scale / scaleX_ ); } @@ -607,7 +618,7 @@ void ReloadableScrollingText::draw( ) SDL::renderCopy(t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo); rect.x += rect.w; } - else if ((rect.x + static_cast( glyph.advance * scale * scaleX_ )) >= (static_cast( xOrigin ) + imageMaxWidth)) + else if ((rect.x + static_cast( char_width * scale * scaleX_ )) >= (static_cast( xOrigin ) + imageMaxWidth)) { rect.x = static_cast( xOrigin ) + static_cast( imageMaxWidth ) + 10; // Stop handling the rest of the string } @@ -615,7 +626,7 @@ void ReloadableScrollingText::draw( ) rect.x += glyph.advance * scale * scaleX_; }*/ } - position += glyph.advance * scale * scaleX_; + position += char_width * scale * scaleX_; } } @@ -634,7 +645,9 @@ void ReloadableScrollingText::draw( ) { imageWidth += glyph.minX; } - imageWidth += glyph.advance; + + int char_width = static_cast( glyph.rect.w?glyph.rect.w:glyph.advance ); + imageWidth += char_width; } } } @@ -667,6 +680,7 @@ void ReloadableScrollingText::draw( ) currentPosition_ <= -startPosition_ * scaleX_) { waitStartTime_ = startTime_; + currentPosition_ = -startPosition_ * scaleX_; scrollForward_ = true; } @@ -889,7 +903,7 @@ bool ReloadableScrollingText::mustRender( ) { if ( Component::mustRender( ) ) return true; - if (!text_.empty( ) && waitEndTime_ <= 0.0f && baseViewInfo.Alpha > 0.0f) + if (!text_.empty( ) && baseViewInfo.Alpha > 0.0f) { return true; }