From d6e7de7596b7bd3a01ced9db798f1fb0ef4f89d4 Mon Sep 17 00:00:00 2001 From: Pieter Hulshoff Date: Tue, 3 Dec 2019 19:26:22 +0100 Subject: [PATCH] Changed screenscaling so it scales the entire screen rather than individual objects. This is needed to prevent incorrect scaling between objects with a fixed width/height and aspect scaled items. --- .../Source/Graphics/Component/Component.cpp | 2 +- RetroFE/Source/Graphics/Component/Image.cpp | 10 +-- RetroFE/Source/Graphics/Component/Image.h | 4 +- .../Graphics/Component/ImageBuilder.cpp | 4 +- .../Source/Graphics/Component/ImageBuilder.h | 2 +- .../Graphics/Component/ReloadableMedia.cpp | 10 +-- .../Graphics/Component/ReloadableMedia.h | 4 +- .../Component/ReloadableScrollingText.cpp | 90 +++++++++---------- .../Component/ReloadableScrollingText.h | 4 +- .../Graphics/Component/ReloadableText.cpp | 6 +- .../Graphics/Component/ReloadableText.h | 5 +- .../Graphics/Component/ScrollingList.cpp | 16 ++-- .../Source/Graphics/Component/ScrollingList.h | 4 - RetroFE/Source/Graphics/Component/Text.cpp | 6 +- RetroFE/Source/Graphics/Component/Text.h | 4 +- RetroFE/Source/Graphics/Component/Video.cpp | 6 +- RetroFE/Source/Graphics/Component/Video.h | 4 +- .../Graphics/Component/VideoBuilder.cpp | 4 +- .../Source/Graphics/Component/VideoBuilder.h | 2 +- .../Graphics/Component/VideoComponent.cpp | 6 +- .../Graphics/Component/VideoComponent.h | 4 +- RetroFE/Source/Graphics/Page.cpp | 16 +++- RetroFE/Source/Graphics/Page.h | 52 ++++++----- RetroFE/Source/Graphics/PageBuilder.cpp | 80 ++++++++--------- RetroFE/Source/Graphics/PageBuilder.h | 2 + RetroFE/Source/Graphics/ViewInfo.h | 2 - RetroFE/Source/SDL.cpp | 45 ++++++++-- RetroFE/Source/SDL.h | 2 +- RetroFE/Source/Version.cpp | 2 +- 29 files changed, 204 insertions(+), 194 deletions(-) diff --git a/RetroFE/Source/Graphics/Component/Component.cpp b/RetroFE/Source/Graphics/Component/Component.cpp index 3f35a7b..22cf78d 100644 --- a/RetroFE/Source/Graphics/Component/Component.cpp +++ b/RetroFE/Source/Graphics/Component/Component.cpp @@ -230,7 +230,7 @@ void Component::draw() static_cast(baseViewInfo.BackgroundGreen*255), static_cast(baseViewInfo.BackgroundBlue*255)); - SDL::renderCopy(backgroundTexture_, baseViewInfo.BackgroundAlpha, NULL, &rect, baseViewInfo); + SDL::renderCopy(backgroundTexture_, baseViewInfo.BackgroundAlpha, NULL, &rect, baseViewInfo, page.getScaleX(), page.getScaleY()); } } diff --git a/RetroFE/Source/Graphics/Component/Image.cpp b/RetroFE/Source/Graphics/Component/Image.cpp index c145a12..2bf0f9a 100644 --- a/RetroFE/Source/Graphics/Component/Image.cpp +++ b/RetroFE/Source/Graphics/Component/Image.cpp @@ -19,13 +19,11 @@ #include "../../Utility/Log.h" #include -Image::Image(std::string file, std::string altFile, Page &p, float scaleX, float scaleY) +Image::Image(std::string file, std::string altFile, Page &p) : Component(p) , texture_(NULL) , file_(file) , altFile_(altFile) - , scaleX_(scaleX) - , scaleY_(scaleY) { allocateGraphicsMemory(); } @@ -66,8 +64,8 @@ void Image::allocateGraphicsMemory() { SDL_SetTextureBlendMode(texture_, SDL_BLENDMODE_BLEND); SDL_QueryTexture(texture_, NULL, NULL, &width, &height); - baseViewInfo.ImageWidth = width * scaleX_; - baseViewInfo.ImageHeight = height * scaleY_; + baseViewInfo.ImageWidth = width; + baseViewInfo.ImageHeight = height; } SDL_UnlockMutex(SDL::getMutex()); @@ -91,6 +89,6 @@ void Image::draw() rect.h = static_cast(baseViewInfo.ScaledHeight()); rect.w = static_cast(baseViewInfo.ScaledWidth()); - SDL::renderCopy(texture_, baseViewInfo.Alpha, NULL, &rect, baseViewInfo); + SDL::renderCopy(texture_, baseViewInfo.Alpha, NULL, &rect, baseViewInfo, page.getScaleX(), page.getScaleY()); } } diff --git a/RetroFE/Source/Graphics/Component/Image.h b/RetroFE/Source/Graphics/Component/Image.h index 6a1da3f..1c2ebf9 100644 --- a/RetroFE/Source/Graphics/Component/Image.h +++ b/RetroFE/Source/Graphics/Component/Image.h @@ -22,7 +22,7 @@ class Image : public Component { public: - Image(std::string file, std::string altFile, Page &p, float scaleX, float scaleY); + Image(std::string file, std::string altFile, Page &p); virtual ~Image(); void freeGraphicsMemory(); void allocateGraphicsMemory(); @@ -32,6 +32,4 @@ protected: SDL_Texture *texture_; std::string file_; std::string altFile_; - float scaleX_; - float scaleY_; }; diff --git a/RetroFE/Source/Graphics/Component/ImageBuilder.cpp b/RetroFE/Source/Graphics/Component/ImageBuilder.cpp index 5008273..90a9437 100644 --- a/RetroFE/Source/Graphics/Component/ImageBuilder.cpp +++ b/RetroFE/Source/Graphics/Component/ImageBuilder.cpp @@ -18,7 +18,7 @@ #include "../../Utility/Log.h" #include -Image * ImageBuilder::CreateImage(std::string path, Page &p, std::string name, float scaleX, float scaleY) +Image * ImageBuilder::CreateImage(std::string path, Page &p, std::string name) { Image *image = NULL; std::vector extensions; @@ -35,7 +35,7 @@ Image * ImageBuilder::CreateImage(std::string path, Page &p, std::string name, f if(Utils::findMatchingFile(prefix, extensions, file)) { - image = new Image(file, "", p, scaleX, scaleY); + image = new Image(file, "", p); } return image; diff --git a/RetroFE/Source/Graphics/Component/ImageBuilder.h b/RetroFE/Source/Graphics/Component/ImageBuilder.h index be3dc31..b8c0b53 100644 --- a/RetroFE/Source/Graphics/Component/ImageBuilder.h +++ b/RetroFE/Source/Graphics/Component/ImageBuilder.h @@ -24,5 +24,5 @@ class ImageBuilder { public: - Image * CreateImage(std::string path, Page &p, std::string name, float scaleX, float scaleY); + Image * CreateImage(std::string path, Page &p, std::string name); }; diff --git a/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp b/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp index c826004..c2c93d9 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableMedia.cpp @@ -28,7 +28,7 @@ #include #include -ReloadableMedia::ReloadableMedia(Configuration &config, bool systemMode, bool layoutMode, bool commonMode, bool menuMode, std::string type, Page &p, int displayOffset, bool isVideo, Font *font, float scaleX, float scaleY) +ReloadableMedia::ReloadableMedia(Configuration &config, bool systemMode, bool layoutMode, bool commonMode, bool menuMode, std::string type, Page &p, int displayOffset, bool isVideo, Font *font) : Component(p) , config_(config) , systemMode_(systemMode) @@ -41,8 +41,6 @@ ReloadableMedia::ReloadableMedia(Configuration &config, bool systemMode, bool la , FfntInst_(font) , textFallback_(false) , type_(type) - , scaleX_(scaleX) - , scaleY_(scaleY) , displayOffset_(displayOffset) , volume_(1.0) @@ -383,7 +381,7 @@ void ReloadableMedia::reloadTexture() // if image and artwork was not specified, fall back to displaying text if(!loadedComponent_ && textFallback_) { - loadedComponent_ = new Text(selectedItem->fullTitle, page, FfntInst_, scaleX_, scaleY_); + loadedComponent_ = new Text(selectedItem->fullTitle, page, FfntInst_); baseViewInfo.ImageWidth = loadedComponent_->baseViewInfo.ImageWidth; baseViewInfo.ImageHeight = loadedComponent_->baseViewInfo.ImageHeight; } @@ -435,11 +433,11 @@ Component *ReloadableMedia::findComponent(std::string collection, std::string ty if(type == "video") { - component = videoBuild.createVideo(imagePath, page, basename, scaleX_, scaleY_); + component = videoBuild.createVideo(imagePath, page, basename); } else { - component = imageBuild.CreateImage(imagePath, page, basename, scaleX_, scaleY_); + component = imageBuild.CreateImage(imagePath, page, basename); } return component; diff --git a/RetroFE/Source/Graphics/Component/ReloadableMedia.h b/RetroFE/Source/Graphics/Component/ReloadableMedia.h index 66a3a89..d9fa83f 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableMedia.h +++ b/RetroFE/Source/Graphics/Component/ReloadableMedia.h @@ -27,7 +27,7 @@ class Image; class ReloadableMedia : public Component { public: - ReloadableMedia(Configuration &config, bool systemMode, bool layoutMode, bool commonMode, bool menuMode, std::string type, Page &page, int displayOffset, bool isVideo, Font *font, float scaleX, float scaleY); + ReloadableMedia(Configuration &config, bool systemMode, bool layoutMode, bool commonMode, bool menuMode, std::string type, Page &page, int displayOffset, bool isVideo, Font *font); virtual ~ReloadableMedia(); void update(float dt); void draw(); @@ -52,8 +52,6 @@ private: Font *FfntInst_; bool textFallback_; std::string type_; - float scaleX_; - float scaleY_; std::string currentCollection_; Page *page_; int displayOffset_; diff --git a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp index 53d61ef..cf8b0e4 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.cpp @@ -28,7 +28,7 @@ #include -ReloadableScrollingText::ReloadableScrollingText(Configuration &config, bool systemMode, bool layoutMode, bool menuMode, std::string type, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, std::string alignment, Page &p, int displayOffset, Font *font, float scaleX, float scaleY, std::string direction, float scrollingSpeed, float startPosition, float startTime, float endTime ) +ReloadableScrollingText::ReloadableScrollingText(Configuration &config, bool systemMode, bool layoutMode, bool menuMode, std::string type, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, std::string alignment, Page &p, int displayOffset, Font *font, std::string direction, float scrollingSpeed, float startPosition, float startTime, float endTime ) : Component(p) , config_(config) , systemMode_(systemMode) @@ -42,8 +42,6 @@ ReloadableScrollingText::ReloadableScrollingText(Configuration &config, bool sys , pluralPrefix_(pluralPrefix) , pluralPostfix_(pluralPostfix) , alignment_(alignment) - , scaleX_(scaleX) - , scaleY_(scaleY) , direction_(direction) , scrollingSpeed_(scrollingSpeed) , startPosition_(startPosition) @@ -81,11 +79,11 @@ void ReloadableScrollingText::update(float dt) { if (direction_ == "horizontal") { - currentPosition_ += scrollingSpeed_ * dt * scaleX_; + currentPosition_ += scrollingSpeed_ * dt; } else if (direction_ == "vertical") { - currentPosition_ += scrollingSpeed_ * dt * scaleY_; + currentPosition_ += scrollingSpeed_ * dt; } } @@ -131,11 +129,11 @@ void ReloadableScrollingText::reloadTexture( ) if (direction_ == "horizontal") { - currentPosition_ = -startPosition_ * scaleX_; + currentPosition_ = -startPosition_; } else if (direction_ == "vertical") { - currentPosition_ = -startPosition_ * scaleY_; + currentPosition_ = -startPosition_; } waitStartTime_ = startTime_; waitEndTime_ = 0.0f; @@ -481,7 +479,7 @@ void ReloadableScrollingText::draw( ) imageMaxHeight = baseViewInfo.MaxHeight; } - float scale = (float)baseViewInfo.FontSize / (float)font->getHeight( ) / scaleY_; + float scale = (float)baseViewInfo.FontSize / (float)font->getHeight( ); float xOrigin = baseViewInfo.XRelativeToOrigin( ); float yOrigin = baseViewInfo.YRelativeToOrigin( ); @@ -516,43 +514,43 @@ void ReloadableScrollingText::draw( ) if (font->getRect( text_[l][i], glyph) && glyph.rect.h > 0) { SDL_Rect charRect = glyph.rect; - rect.h = static_cast( charRect.h * scale * scaleY_ ); - rect.w = static_cast( charRect.w * scale * scaleX_ ); + rect.h = static_cast( charRect.h * scale ); + rect.w = static_cast( charRect.w * scale ); rect.y = static_cast( yOrigin ); if (font->getAscent( ) < glyph.maxY) { - rect.y += static_cast( (font->getAscent( ) - glyph.maxY) * scale * scaleY_ ); + rect.y += static_cast( (font->getAscent( ) - glyph.maxY) * scale ); } // 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( glyph.advance * scale )) >= (static_cast( xOrigin ) + imageMaxWidth)) { rect.w = static_cast( xOrigin ) + static_cast( imageMaxWidth ) - rect.x; - charRect.w = static_cast( rect.w / scale / scaleX_ ); + charRect.w = static_cast( rect.w / scale ); } // Print the glyph if it falls (partially) within the box - if ( position + glyph.advance * scale * scaleX_ > currentPosition_ ) + if ( position + glyph.advance * scale > 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_ ); - charRect.x = static_cast( charRect.x + charRect.w - rect.w / scale / scaleX_ ); - charRect.w = static_cast( rect.w / scale / scaleX_ ); + rect.w = static_cast( glyph.advance * scale + position - currentPosition_ ); + charRect.x = static_cast( charRect.x + charRect.w - rect.w / scale ); + charRect.w = static_cast( rect.w / scale ); } if (rect.w > 0) { - SDL::renderCopy(t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo); + SDL::renderCopy(t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo, page.getScaleX(), page.getScaleY()); rect.x += rect.w; } - else if ((rect.x + static_cast( glyph.advance * scale * scaleX_ )) >= (static_cast( xOrigin ) + imageMaxWidth)) + else if ((rect.x + static_cast( glyph.advance * scale )) >= (static_cast( xOrigin ) + imageMaxWidth)) { rect.x = static_cast( xOrigin ) + static_cast( imageMaxWidth ) + 10; // Stop handling the rest of the string } } - position += glyph.advance * scale * scaleX_; + position += glyph.advance * scale; } } @@ -572,11 +570,11 @@ void ReloadableScrollingText::draw( ) } // Reset scrolling position when we're done - if (currentPosition_ > imageWidth * scale * scaleX_) + if (currentPosition_ > imageWidth * scale) { waitStartTime_ = startTime_; waitEndTime_ = endTime_; - currentPosition_ = -startPosition_ * scaleX_; + currentPosition_ = -startPosition_; } } @@ -588,7 +586,7 @@ void ReloadableScrollingText::draw( ) Font::GlyphInfo glyph; if (font->getRect( ' ', glyph) ) { - spaceWidth = static_cast( glyph.advance * scale * scaleX_); + spaceWidth = static_cast( glyph.advance * scale); } } @@ -615,7 +613,7 @@ void ReloadableScrollingText::draw( ) Font::GlyphInfo glyph; if (font->getRect( word[i], glyph) ) { - wordWidth += static_cast( glyph.advance * scale * scaleX_ ); + wordWidth += static_cast( glyph.advance * scale ); } } // Determine if the word will fit on the line @@ -668,7 +666,7 @@ void ReloadableScrollingText::draw( ) } // Do not scroll if the text fits fully inside the box, and start position is 0 - if (text.size() * font->getHeight( ) * scale * scaleY_ <= imageMaxHeight && startPosition_ == 0.0f) + if (text.size() * font->getHeight( ) * scale <= imageMaxHeight && startPosition_ == 0.0f) { currentPosition_ = 0.0f; waitStartTime_ = 0.0f; @@ -688,18 +686,18 @@ void ReloadableScrollingText::draw( ) rect.x = static_cast( xOrigin ); if (alignment_ == "right") { - rect.x = static_cast( xOrigin + imageMaxWidth - textWidth[l] - (textWords[l] - 1) * spaceWidth * scale * scaleX_ ); + rect.x = static_cast( xOrigin + imageMaxWidth - textWidth[l] - (textWords[l] - 1) * spaceWidth * scale ); } if (alignment_ == "centered") { - rect.x = static_cast( xOrigin + imageMaxWidth / 2 - textWidth[l] / 2 - (textWords[l] - 1) * spaceWidth * scale * scaleX_ / 2 ); + rect.x = static_cast( xOrigin + imageMaxWidth / 2 - textWidth[l] / 2 - (textWords[l] - 1) * spaceWidth * scale / 2 ); } std::istringstream iss(text[l]); std::string word; unsigned int wordCount = textWords[l]; unsigned int spaceFill = static_cast( imageMaxWidth ) - textWidth[l]; - unsigned int yAdvance = static_cast( font->getHeight( ) * scale * scaleY_ ); + unsigned int yAdvance = static_cast( font->getHeight( ) * scale ); while (iss >> word) { @@ -710,34 +708,34 @@ void ReloadableScrollingText::draw( ) if (font->getRect( word[i], glyph) && glyph.rect.h > 0) { SDL_Rect charRect = glyph.rect; - rect.h = static_cast( charRect.h * scale * scaleY_ ); - rect.w = static_cast( charRect.w * scale * scaleX_ ); - yAdvance = static_cast( font->getHeight( ) * scale * scaleY_ ); + rect.h = static_cast( charRect.h * scale ); + rect.w = static_cast( charRect.w * scale ); + yAdvance = static_cast( font->getHeight( ) * scale ); // Check if glyph falls partially outside the box at the bottom end if ((rect.y + rect.h) >= (static_cast( yOrigin ) + imageMaxHeight)) { rect.h = static_cast( yOrigin ) + static_cast( imageMaxHeight ) - rect.y; - charRect.h = static_cast( rect.h / scale / scaleY_ ); + charRect.h = static_cast( rect.h / scale ); } // Print the glyph if it falls (partially) within the box - if ( position + font->getHeight( ) * scale * scaleY_ > currentPosition_ ) + if ( position + font->getHeight( ) * scale > currentPosition_ ) { // Check if glyph falls partially outside the box at the front end if ( position < currentPosition_ ) { - yAdvance -= rect.h - static_cast( font->getHeight( ) * scale * scaleX_ + position - currentPosition_ ); - rect.h = static_cast( font->getHeight( ) * scale * scaleX_ + position - currentPosition_ ); - charRect.y = static_cast( charRect.y + charRect.h - rect.h / scale / scaleX_ ); - charRect.h = static_cast( rect.h / scale / scaleX_ ); + yAdvance -= rect.h - static_cast( font->getHeight( ) * scale + position - currentPosition_ ); + rect.h = static_cast( font->getHeight( ) * scale + position - currentPosition_ ); + charRect.y = static_cast( charRect.y + charRect.h - rect.h / scale ); + charRect.h = static_cast( rect.h / scale ); } if (rect.h > 0) { - SDL::renderCopy(t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo); + SDL::renderCopy(t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo, page.getScaleX(), page.getScaleY()); } } - rect.x += static_cast( glyph.advance * scale * scaleX_ ); + rect.x += static_cast( glyph.advance * scale ); } } @@ -762,31 +760,31 @@ void ReloadableScrollingText::draw( ) if (font->getRect( ' ', glyph) && glyph.rect.h > 0) { - rect.h = static_cast( glyph.rect.h * scale * scaleY_ ); + rect.h = static_cast( glyph.rect.h * scale ); // Check if the glyph falls (partially) within the box at the front end - if ((position + font->getHeight( ) * scale * scaleY_ > currentPosition_) && + if ((position + font->getHeight( ) * scale > currentPosition_) && (position < currentPosition_)) { - yAdvance -= rect.h - static_cast( font->getHeight( ) * scale * scaleX_ + position - currentPosition_ ); + yAdvance -= rect.h - static_cast( font->getHeight( ) * scale + position - currentPosition_ ); } } } - if ( position + font->getHeight( ) * scale * scaleY_ > currentPosition_ ) + if ( position + font->getHeight( ) * scale > currentPosition_ ) { rect.y += yAdvance; } - position += font->getHeight( ) * scale * scaleY_; + position += font->getHeight( ) * scale; } // Reset scrolling position when we're done - if (currentPosition_ > text.size( ) * font->getHeight( ) * scale * scaleX_) + if (currentPosition_ > text.size( ) * font->getHeight( ) * scale) { waitStartTime_ = startTime_; waitEndTime_ = endTime_; - currentPosition_ = -startPosition_ * scaleY_; + currentPosition_ = -startPosition_; } } diff --git a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.h b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.h index 200391c..8ad4109 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableScrollingText.h +++ b/RetroFE/Source/Graphics/Component/ReloadableScrollingText.h @@ -24,7 +24,7 @@ class ReloadableScrollingText : public Component { public: - ReloadableScrollingText(Configuration &config, bool systemMode, bool layoutMode, bool menuMode, std::string type, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, std::string alignment, Page &page, int displayOffset, Font *font, float scaleX, float scaleY, std::string direction, float scrollingSpeed, float startPosition, float startTime, float endTime ); + ReloadableScrollingText(Configuration &config, bool systemMode, bool layoutMode, bool menuMode, std::string type, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, std::string alignment, Page &page, int displayOffset, Font *font, std::string direction, float scrollingSpeed, float startPosition, float startTime, float endTime ); virtual ~ReloadableScrollingText( ); void update(float dt); void draw( ); @@ -49,8 +49,6 @@ private: std::string pluralPostfix_; std::string alignment_; std::vector text_; - float scaleX_; - float scaleY_; std::string direction_; float scrollingSpeed_; float startPosition_; diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.cpp b/RetroFE/Source/Graphics/Component/ReloadableText.cpp index 4d80672..e64a95f 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableText.cpp +++ b/RetroFE/Source/Graphics/Component/ReloadableText.cpp @@ -25,7 +25,7 @@ #include #include -ReloadableText::ReloadableText(std::string type, Page &page, Configuration &config, bool systemMode, Font *font, std::string layoutKey, std::string timeFormat, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, float scaleX, float scaleY) +ReloadableText::ReloadableText(std::string type, Page &page, Configuration &config, bool systemMode, Font *font, std::string layoutKey, std::string timeFormat, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix) : Component(page) , config_(config) , systemMode_(systemMode) @@ -39,8 +39,6 @@ ReloadableText::ReloadableText(std::string type, Page &page, Configuration &conf , singlePostfix_(singlePostfix) , pluralPrefix_(pluralPrefix) , pluralPostfix_(pluralPostfix) - , scaleX_(scaleX) - , scaleY_(scaleY) { allocateGraphicsMemory(); } @@ -282,7 +280,7 @@ void ReloadableText::ReloadTexture() ss << text; } - imageInst_ = new Text(ss.str(), page, fontInst_, scaleX_, scaleY_); + imageInst_ = new Text(ss.str(), page, fontInst_); } } diff --git a/RetroFE/Source/Graphics/Component/ReloadableText.h b/RetroFE/Source/Graphics/Component/ReloadableText.h index db79477..0cb0032 100644 --- a/RetroFE/Source/Graphics/Component/ReloadableText.h +++ b/RetroFE/Source/Graphics/Component/ReloadableText.h @@ -25,7 +25,7 @@ class ReloadableText : public Component { public: - ReloadableText(std::string type, Page &page, Configuration &config, bool systemMode, Font *font, std::string layoutKey, std::string timeFormat, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix, float scaleX, float scaleY); + ReloadableText(std::string type, Page &page, Configuration &config, bool systemMode, Font *font, std::string layoutKey, std::string timeFormat, std::string textFormat, std::string singlePrefix, std::string singlePostfix, std::string pluralPrefix, std::string pluralPostfix); virtual ~ReloadableText(); void update(float dt); void draw(); @@ -49,7 +49,4 @@ private: std::string singlePostfix_; std::string pluralPrefix_; std::string pluralPostfix_; - - float scaleX_; - float scaleY_; }; diff --git a/RetroFE/Source/Graphics/Component/ScrollingList.cpp b/RetroFE/Source/Graphics/Component/ScrollingList.cpp index 20b852b..cc613e5 100644 --- a/RetroFE/Source/Graphics/Component/ScrollingList.cpp +++ b/RetroFE/Source/Graphics/Component/ScrollingList.cpp @@ -44,8 +44,6 @@ ScrollingList::ScrollingList( Configuration &c, Page &p, bool layoutMode, bool commonMode, - float scaleX, - float scaleY, Font *font, std::string layoutKey, std::string imageType ) @@ -63,8 +61,6 @@ ScrollingList::ScrollingList( Configuration &c, , minScrollTime_( 0.500 ) , scrollPeriod_( 0 ) , config_( c ) - , scaleX_( scaleX ) - , scaleY_( scaleY ) , fontInst_( font ) , layoutKey_( layoutKey ) , imageType_( imageType ) @@ -86,8 +82,6 @@ ScrollingList::ScrollingList( const ScrollingList © ) , minScrollTime_( copy.minScrollTime_ ) , scrollPeriod_( copy.startScrollTime_ ) , config_( copy.config_ ) - , scaleX_( copy.scaleX_ ) - , scaleY_( copy.scaleY_ ) , fontInst_( copy.fontInst_ ) , layoutKey_( copy.layoutKey_ ) , imageType_( copy.imageType_ ) @@ -776,7 +770,7 @@ bool ScrollingList::allocateTexture( unsigned int index, Item *item ) else config_.getMediaPropertyAbsolutePath( collectionName, imageType_, false, imagePath ); } - t = imageBuild.CreateImage( imagePath, page, names[n], scaleX_, scaleY_ ); + t = imageBuild.CreateImage( imagePath, page, names[n] ); // check sub-collection path for art if ( !t && !commonMode_ ) { @@ -789,7 +783,7 @@ bool ScrollingList::allocateTexture( unsigned int index, Item *item ) { config_.getMediaPropertyAbsolutePath( item->collectionInfo->name, imageType_, false, imagePath ); } - t = imageBuild.CreateImage( imagePath, page, names[n], scaleX_, scaleY_ ); + t = imageBuild.CreateImage( imagePath, page, names[n] ); } } @@ -814,16 +808,16 @@ bool ScrollingList::allocateTexture( unsigned int index, Item *item ) else config_.getMediaPropertyAbsolutePath( item->name, imageType_, true, imagePath ); } - t = imageBuild.CreateImage( imagePath, page, imageType_, scaleX_, scaleY_ ); + t = imageBuild.CreateImage( imagePath, page, imageType_ ); } // check rom directory path for art if ( !t ) - t = imageBuild.CreateImage( item->filepath, page, imageType_, scaleX_, scaleY_ ); + t = imageBuild.CreateImage( item->filepath, page, imageType_ ); if ( !t ) { - t = new Text(item->title, page, fontInst_, scaleX_, scaleY_ ); + t = new Text(item->title, page, fontInst_ ); } if ( t ) diff --git a/RetroFE/Source/Graphics/Component/ScrollingList.h b/RetroFE/Source/Graphics/Component/ScrollingList.h index 98f0002..fc8556c 100644 --- a/RetroFE/Source/Graphics/Component/ScrollingList.h +++ b/RetroFE/Source/Graphics/Component/ScrollingList.h @@ -37,8 +37,6 @@ public: Page &p, bool layoutMode, bool commonMode, - float scaleX, - float scaleY, Font *font, std::string layoutKey, std::string imageType ); @@ -123,8 +121,6 @@ private: float scrollPeriod_; Configuration &config_; - float scaleX_; - float scaleY_; Font *fontInst_; std::string layoutKey_; std::string imageType_; diff --git a/RetroFE/Source/Graphics/Component/Text.cpp b/RetroFE/Source/Graphics/Component/Text.cpp index fb8d9a0..f8b44ce 100644 --- a/RetroFE/Source/Graphics/Component/Text.cpp +++ b/RetroFE/Source/Graphics/Component/Text.cpp @@ -22,12 +22,10 @@ #include -Text::Text( std::string text, Page &p, Font *font, float scaleX, float scaleY ) +Text::Text( std::string text, Page &p, Font *font ) : Component(p) , textData_(text) , fontInst_(font) - , scaleX_(scaleX) - , scaleY_(scaleY) { allocateGraphicsMemory( ); } @@ -159,7 +157,7 @@ void Text::draw( ) } - SDL::renderCopy( t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo ); + SDL::renderCopy( t, baseViewInfo.Alpha, &charRect, &rect, baseViewInfo, page.getScaleX(), page.getScaleY() ); rect.x += static_cast( glyph.advance * scale ); diff --git a/RetroFE/Source/Graphics/Component/Text.h b/RetroFE/Source/Graphics/Component/Text.h index 69162aa..16a5105 100644 --- a/RetroFE/Source/Graphics/Component/Text.h +++ b/RetroFE/Source/Graphics/Component/Text.h @@ -29,7 +29,7 @@ class Text : public Component { public: - Text( std::string text, Page &p, Font *font, float scaleX, float scaleY ); + Text( std::string text, Page &p, Font *font ); virtual ~Text( ); void setText( std::string text, int id = -1 ); void allocateGraphicsMemory( ); @@ -41,6 +41,4 @@ public: private: std::string textData_; Font *fontInst_; - float scaleX_; - float scaleY_; }; diff --git a/RetroFE/Source/Graphics/Component/Video.cpp b/RetroFE/Source/Graphics/Component/Video.cpp index 6ce0bfe..d6b4918 100644 --- a/RetroFE/Source/Graphics/Component/Video.cpp +++ b/RetroFE/Source/Graphics/Component/Video.cpp @@ -26,14 +26,12 @@ bool Video::enabled_ = true; -Video::Video(std::string file, std::string altFile, int numLoops, Page &p, float scaleX, float scaleY) +Video::Video(std::string file, std::string altFile, int numLoops, Page &p) : Component(p) , video_(NULL) , file_(file) , altFile_(altFile) , numLoops_(numLoops) - , scaleX_(scaleX) - , scaleY_(scaleY) , volume_(1.0) { @@ -105,7 +103,7 @@ void Video::allocateGraphicsMemory( ) IVideo *video = new GStreamerVideo(); video->initialize(); ((GStreamerVideo *)(video))->setNumLoops(numLoops_); - video_ = new VideoComponent( video, page, file, scaleX_, scaleY_ ); + video_ = new VideoComponent( video, page, file ); } } diff --git a/RetroFE/Source/Graphics/Component/Video.h b/RetroFE/Source/Graphics/Component/Video.h index c6404aa..89e401d 100644 --- a/RetroFE/Source/Graphics/Component/Video.h +++ b/RetroFE/Source/Graphics/Component/Video.h @@ -22,7 +22,7 @@ class Video : public Component { public: - Video( std::string file, std::string altFile, int numLoops, Page &page, float scaleX, float scaleY ); + Video( std::string file, std::string altFile, int numLoops, Page &page ); virtual ~Video( ); static void setEnabled(bool enabled); void update(float dt); @@ -38,8 +38,6 @@ protected: std::string file_; std::string altFile_; int numLoops_; - float scaleX_; - float scaleY_; private: static bool enabled_; diff --git a/RetroFE/Source/Graphics/Component/VideoBuilder.cpp b/RetroFE/Source/Graphics/Component/VideoBuilder.cpp index 30b615c..cb7c2ea 100644 --- a/RetroFE/Source/Graphics/Component/VideoBuilder.cpp +++ b/RetroFE/Source/Graphics/Component/VideoBuilder.cpp @@ -21,7 +21,7 @@ #include -VideoComponent * VideoBuilder::createVideo(std::string path, Page &page, std::string name, float scaleX, float scaleY) +VideoComponent * VideoBuilder::createVideo(std::string path, Page &page, std::string name) { VideoComponent *component = NULL; std::vector extensions; @@ -40,7 +40,7 @@ VideoComponent * VideoBuilder::createVideo(std::string path, Page &page, std::st if(video) { - component = new VideoComponent(video, page, file, scaleX, scaleY); + component = new VideoComponent(video, page, file); } } diff --git a/RetroFE/Source/Graphics/Component/VideoBuilder.h b/RetroFE/Source/Graphics/Component/VideoBuilder.h index bd9954e..c1bea27 100644 --- a/RetroFE/Source/Graphics/Component/VideoBuilder.h +++ b/RetroFE/Source/Graphics/Component/VideoBuilder.h @@ -24,7 +24,7 @@ class VideoBuilder { public: - VideoComponent * createVideo(std::string path, Page &page, std::string name, float scaleX, float scaleY); + VideoComponent * createVideo(std::string path, Page &page, std::string name); private: VideoFactory factory_; diff --git a/RetroFE/Source/Graphics/Component/VideoComponent.cpp b/RetroFE/Source/Graphics/Component/VideoComponent.cpp index 76423b9..8f01b7e 100644 --- a/RetroFE/Source/Graphics/Component/VideoComponent.cpp +++ b/RetroFE/Source/Graphics/Component/VideoComponent.cpp @@ -21,12 +21,10 @@ #include "../../Video/GStreamerVideo.h" #include "../../SDL.h" -VideoComponent::VideoComponent(IVideo *videoInst, Page &p, std::string videoFile, float scaleX, float scaleY) +VideoComponent::VideoComponent(IVideo *videoInst, Page &p, std::string videoFile) : Component(p) , videoFile_(videoFile) , videoInst_(videoInst) - , scaleX_(scaleX) - , scaleY_(scaleY) , isPlaying_(false) , volume_(1.0) { @@ -99,7 +97,7 @@ void VideoComponent::draw() if(texture) { - SDL::renderCopy(texture, baseViewInfo.Alpha, NULL, &rect, baseViewInfo); + SDL::renderCopy(texture, baseViewInfo.Alpha, NULL, &rect, baseViewInfo, page.getScaleX(), page.getScaleY()); } } diff --git a/RetroFE/Source/Graphics/Component/VideoComponent.h b/RetroFE/Source/Graphics/Component/VideoComponent.h index 3fc9714..a70991f 100644 --- a/RetroFE/Source/Graphics/Component/VideoComponent.h +++ b/RetroFE/Source/Graphics/Component/VideoComponent.h @@ -25,7 +25,7 @@ class VideoComponent : public Component { public: - VideoComponent(IVideo *videoInst, Page &p, std::string videoFile, float scaleX, float scaleY); + VideoComponent(IVideo *videoInst, Page &p, std::string videoFile); virtual ~VideoComponent(); void update(float dt); void draw(); @@ -39,8 +39,6 @@ private: std::string videoFile_; std::string name_; IVideo *videoInst_; - float scaleX_; - float scaleY_; bool isPlaying_; double volume_; }; diff --git a/RetroFE/Source/Graphics/Page.cpp b/RetroFE/Source/Graphics/Page.cpp index b132601..46742d9 100644 --- a/RetroFE/Source/Graphics/Page.cpp +++ b/RetroFE/Source/Graphics/Page.cpp @@ -28,7 +28,7 @@ #include -Page::Page(Configuration &config) +Page::Page(Configuration &config, float scaleX, float scaleY) : config_(config) , menuDepth_(0) , scrollActive_(false) @@ -39,6 +39,8 @@ Page::Page(Configuration &config) , highlightSoundChunk_(NULL) , selectSoundChunk_(NULL) , minShowTime_(0) + , scaleX_(scaleX) + , scaleY_(scaleY) { } @@ -1546,3 +1548,15 @@ bool Page::hasSubs() { return collections_.back().collection->hasSubs; } + + +float Page::getScaleX() +{ + return scaleX_; +} + + +float Page::getScaleY() +{ + return scaleY_; +} diff --git a/RetroFE/Source/Graphics/Page.h b/RetroFE/Source/Graphics/Page.h index 8be8747..d38e32b 100644 --- a/RetroFE/Source/Graphics/Page.h +++ b/RetroFE/Source/Graphics/Page.h @@ -40,7 +40,7 @@ public: }; - Page(Configuration &c); + Page(Configuration &c, float scaleX, float scaleY); virtual ~Page(); void deInitialize(); virtual void onNewItemSelected(); @@ -98,30 +98,32 @@ public: bool isSelectPlaying(); std::string getCollectionName(); CollectionInfo *getCollection(); - void setMinShowTime(float value); + void setMinShowTime(float value); float getMinShowTime(); - void menuScroll(); - void highlightEnter(); - void highlightExit(); - void playlistEnter(); - void playlistExit(); - void menuJumpEnter(); - void menuJumpExit(); - void attractEnter( ); - void attract( ); - void attractExit( ); - void triggerEvent( std::string action ); - void setText( std::string text, int id ); - void addPlaylist(); - void removePlaylist(); - void updateLastPlayedPlaylist( Item *item ); - void reallocateMenuSpritePoints(); - bool isMenuScrolling(); - bool isPlaying(); - void resetScrollPeriod(); - void updateScrollPeriod(); - void scroll(bool forward); - bool hasSubs(); + void menuScroll(); + void highlightEnter(); + void highlightExit(); + void playlistEnter(); + void playlistExit(); + void menuJumpEnter(); + void menuJumpExit(); + void attractEnter( ); + void attract( ); + void attractExit( ); + void triggerEvent( std::string action ); + void setText( std::string text, int id ); + void addPlaylist(); + void removePlaylist(); + void updateLastPlayedPlaylist( Item *item ); + void reallocateMenuSpritePoints(); + bool isMenuScrolling(); + bool isPlaying(); + void resetScrollPeriod(); + void updateScrollPeriod(); + void scroll(bool forward); + bool hasSubs(); + float getScaleX(); + float getScaleY(); private: void playlistChange(); @@ -160,6 +162,8 @@ private: float minShowTime_; float elapsedTime_; CollectionInfo::Playlists_T::iterator playlist_; + float scaleX_; + float scaleY_; }; diff --git a/RetroFE/Source/Graphics/PageBuilder.cpp b/RetroFE/Source/Graphics/PageBuilder.cpp index b957bac..ce58b3e 100644 --- a/RetroFE/Source/Graphics/PageBuilder.cpp +++ b/RetroFE/Source/Graphics/PageBuilder.cpp @@ -57,6 +57,8 @@ PageBuilder::PageBuilder(std::string layoutKey, std::string layoutPage, Configur , scaleY_(1) , screenHeight_(0) , screenWidth_(0) + , layoutHeight_(0) + , layoutWidth_(0) , fontSize_(24) , fontCache_(fc) , isMenu_(isMenu) @@ -156,8 +158,6 @@ Page *PageBuilder::buildPage( std::string collectionName ) xml_attribute<> *fontSizeXml = root->first_attribute("loadFontSize"); xml_attribute<> *minShowTimeXml = root->first_attribute("minShowTime"); - int layoutHeight; - int layoutWidth; if(!layoutWidthXml || !layoutHeightXml) { Logger::write(Logger::ZONE_ERROR, "Layout", " tag must specify a width and height"); @@ -189,23 +189,23 @@ Page *PageBuilder::buildPage( std::string collectionName ) fontSize_ = Utils::convertInt(fontSizeXml->value()); } - layoutWidth = Utils::convertInt(layoutWidthXml->value()); - layoutHeight = Utils::convertInt(layoutHeightXml->value()); + layoutWidth_ = Utils::convertInt(layoutWidthXml->value()); + layoutHeight_ = Utils::convertInt(layoutHeightXml->value()); - if(layoutWidth == 0 || layoutHeight == 0) + if(layoutWidth_ == 0 || layoutHeight_ == 0) { Logger::write(Logger::ZONE_ERROR, "Layout", "Layout width and height cannot be set to 0"); return NULL; } - scaleX_ = (float)screenWidth_ / (float)layoutWidth; - scaleY_ = (float)screenHeight_ / (float)layoutHeight; + scaleX_ = (float)screenWidth_ / (float)layoutWidth_; + scaleY_ = (float)screenHeight_ / (float)layoutHeight_; std::stringstream ss; - ss << layoutWidth << "x" << layoutHeight << " (scale " << scaleX_ << "x" << scaleY_ << ")"; + ss << layoutWidth_ << "x" << layoutHeight_ << " (scale " << scaleX_ << "x" << scaleY_ << ")"; Logger::write(Logger::ZONE_INFO, "Layout", "Layout resolution " + ss.str()); - page = new Page(config_); + page = new Page(config_, scaleX_, scaleY_); if(minShowTimeXml) { @@ -310,15 +310,15 @@ float PageBuilder::getHorizontalAlignment(xml_attribute<> *attribute, float valu } else if(!str.compare("center")) { - value = static_cast(screenWidth_) / 2; + value = static_cast(layoutWidth_) / 2; } else if(!str.compare("right") || !str.compare("stretch")) { - value = static_cast(screenWidth_); + value = static_cast(layoutWidth_); } else { - value = Utils::convertFloat(str) * scaleX_; + value = Utils::convertFloat(str); } } @@ -343,15 +343,15 @@ float PageBuilder::getVerticalAlignment(xml_attribute<> *attribute, float valueI } else if(!str.compare("center")) { - value = static_cast(screenHeight_ / 2); + value = static_cast(layoutHeight_ / 2); } else if(!str.compare("bottom") || !str.compare("stretch")) { - value = static_cast(screenHeight_); + value = static_cast(layoutHeight_); } else { - value = Utils::convertFloat(str) * scaleY_; + value = Utils::convertFloat(str); } } return value; @@ -410,7 +410,7 @@ bool PageBuilder::buildComponents(xml_node<> *layout, Page *page) std::string altImagePath; altImagePath = Utils::combinePath(Configuration::absolutePath, "layouts", layoutName, std::string(src->value())); - Image *c = new Image(imagePath, altImagePath, *page, scaleX_, scaleY_); + Image *c = new Image(imagePath, altImagePath, *page); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -453,7 +453,7 @@ bool PageBuilder::buildComponents(xml_node<> *layout, Page *page) altVideoPath = Utils::combinePath(Configuration::absolutePath, "layouts", layoutName, std::string(srcXml->value())); int numLoops = numLoopsXml ? Utils::convertInt(numLoopsXml->value()) : 1; - Video *c = new Video(videoPath, altVideoPath, numLoops, *page, scaleX_, scaleY_); + Video *c = new Video(videoPath, altVideoPath, numLoops, *page); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -489,7 +489,7 @@ bool PageBuilder::buildComponents(xml_node<> *layout, Page *page) else { Font *font = addFont(componentXml, NULL); - Text *c = new Text(value->value(), *page, font, scaleX_, scaleY_); + Text *c = new Text(value->value(), *page, font); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -507,7 +507,7 @@ bool PageBuilder::buildComponents(xml_node<> *layout, Page *page) for(xml_node<> *componentXml = layout->first_node("statusText"); componentXml; componentXml = componentXml->next_sibling("statusText")) { Font *font = addFont(componentXml, NULL); - Text *c = new Text("", *page, font, scaleX_, scaleY_); + Text *c = new Text("", *page, font); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && (Utils::toLower(menuScrollReload->value()) == "true" || @@ -661,7 +661,7 @@ void PageBuilder::loadReloadableImages(xml_node<> *layout, std::string tagName, { pluralPostfix = pluralPostfixXml->value(); } - c = new ReloadableText(type->value(), *page, config_, systemMode, font, layoutKey, timeFormat, textFormat, singlePrefix, singlePostfix, pluralPrefix, pluralPostfix, scaleX_, scaleY_); + c = new ReloadableText(type->value(), *page, config_, systemMode, font, layoutKey, timeFormat, textFormat, singlePrefix, singlePostfix, pluralPrefix, pluralPostfix); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -733,7 +733,7 @@ void PageBuilder::loadReloadableImages(xml_node<> *layout, std::string tagName, { pluralPostfix = pluralPostfixXml->value(); } - c = new ReloadableScrollingText(config_, systemMode, layoutMode, menuMode, type->value(), singlePrefix, singlePostfix, pluralPrefix, pluralPostfix, textFormat, alignment, *page, selectedOffset, font, scaleX_, scaleY_, direction, scrollingSpeed, startPosition, startTime, endTime); + c = new ReloadableScrollingText(config_, systemMode, layoutMode, menuMode, type->value(), singlePrefix, singlePostfix, pluralPrefix, pluralPostfix, textFormat, alignment, *page, selectedOffset, font, direction, scrollingSpeed, startPosition, startTime, endTime); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -747,7 +747,7 @@ void PageBuilder::loadReloadableImages(xml_node<> *layout, std::string tagName, else { Font *font = addFont(componentXml, NULL); - c = new ReloadableMedia(config_, systemMode, layoutMode, commonMode, menuMode, type->value(), *page, selectedOffset, (tagName == "reloadableVideo"), font, scaleX_, scaleY_); + c = new ReloadableMedia(config_, systemMode, layoutMode, commonMode, menuMode, type->value(), *page, selectedOffset, (tagName == "reloadableVideo"), font); c->setId( id ); xml_attribute<> *menuScrollReload = componentXml->first_attribute("menuScrollReload"); if (menuScrollReload && @@ -1009,7 +1009,7 @@ ScrollingList * PageBuilder::buildMenu(xml_node<> *menuXml, Page &page) // on default, text will be rendered to the menu. Preload it into cache. Font *font = addFont(itemDefaults, NULL); - menu = new ScrollingList(config_, page, layoutMode, commonMode, scaleX_, scaleY_, font, layoutKey, imageType); + menu = new ScrollingList(config_, page, layoutMode, commonMode, font, layoutKey, imageType); if(scrollTimeXml) { @@ -1282,8 +1282,8 @@ void PageBuilder::buildViewInfo(xml_node<> *componentXml, ViewInfo &info, xml_no float yOriginRelative = getVerticalAlignment(yOrigin, 0); // the origins need to be saved as a percent since the heights and widths can be scaled - info.XOrigin = xOriginRelative / screenWidth_; - info.YOrigin = yOriginRelative / screenHeight_; + info.XOrigin = xOriginRelative / layoutWidth_; + info.YOrigin = yOriginRelative / layoutHeight_; if(!height && !width) @@ -1301,17 +1301,17 @@ void PageBuilder::buildViewInfo(xml_node<> *componentXml, ViewInfo &info, xml_no info.MinWidth = getHorizontalAlignment(minWidth, 0); info.MaxHeight = getVerticalAlignment(maxHeight, FLT_MAX); info.MaxWidth = getVerticalAlignment(maxWidth, FLT_MAX); - info.Alpha = alpha ? Utils::convertFloat(alpha->value()) : 1.f; - info.Angle = angle ? Utils::convertFloat(angle->value()) : 0.f; - info.Layer = layer ? Utils::convertInt(layer->value()) : 0; - info.Reflection = reflection ? reflection->value() : ""; - info.ReflectionDistance = reflectionDistance ? Utils::convertInt(reflectionDistance->value()) : 0; - info.ReflectionScale = reflectionScale ? Utils::convertFloat(reflectionScale->value()) : 0.25f; - info.ReflectionAlpha = reflectionAlpha ? Utils::convertFloat(reflectionAlpha->value()) : 1.f; - info.ContainerX = containerX ? Utils::convertFloat(containerX->value()) * scaleX_ : 0.f; - info.ContainerY = containerY ? Utils::convertFloat(containerY->value()) * scaleY_ : 0.f; - info.ContainerWidth = containerWidth ? Utils::convertFloat(containerWidth->value()) * scaleX_ : -1.f; - info.ContainerHeight = containerHeight ? Utils::convertFloat(containerHeight->value()) * scaleY_ : -1.f; + info.Alpha = alpha ? Utils::convertFloat(alpha->value()) : 1.f; + info.Angle = angle ? Utils::convertFloat(angle->value()) : 0.f; + info.Layer = layer ? Utils::convertInt(layer->value()) : 0; + info.Reflection = reflection ? reflection->value() : ""; + info.ReflectionDistance = reflectionDistance ? Utils::convertInt(reflectionDistance->value()) : 0; + info.ReflectionScale = reflectionScale ? Utils::convertFloat(reflectionScale->value()) : 0.25f; + info.ReflectionAlpha = reflectionAlpha ? Utils::convertFloat(reflectionAlpha->value()) : 1.f; + info.ContainerX = containerX ? Utils::convertFloat(containerX->value()) : 0.f; + info.ContainerY = containerY ? Utils::convertFloat(containerY->value()) : 0.f; + info.ContainerWidth = containerWidth ? Utils::convertFloat(containerWidth->value()) : -1.f; + info.ContainerHeight = containerHeight ? Utils::convertFloat(containerHeight->value()) : -1.f; if(fontColor) { @@ -1427,8 +1427,8 @@ void PageBuilder::getAnimationEvents(xml_node<> *node, TweenSet &tweens) // x origin gets translated to a percent case TWEEN_PROPERTY_X_ORIGIN: - fromValue = getHorizontalAlignment(from, 0) / screenWidth_; - toValue = getHorizontalAlignment(to, 0) / screenWidth_; + fromValue = getHorizontalAlignment(from, 0) / layoutWidth_; + toValue = getHorizontalAlignment(to, 0) / layoutWidth_; break; case TWEEN_PROPERTY_HEIGHT: @@ -1444,8 +1444,8 @@ void PageBuilder::getAnimationEvents(xml_node<> *node, TweenSet &tweens) // y origin gets translated to a percent case TWEEN_PROPERTY_Y_ORIGIN: - fromValue = getVerticalAlignment(from, 0) / screenHeight_; - toValue = getVerticalAlignment(to, 0) / screenHeight_; + fromValue = getVerticalAlignment(from, 0) / layoutHeight_; + toValue = getVerticalAlignment(to, 0) / layoutHeight_; break; case TWEEN_PROPERTY_MAX_WIDTH: diff --git a/RetroFE/Source/Graphics/PageBuilder.h b/RetroFE/Source/Graphics/PageBuilder.h index 87451fd..a3525e9 100644 --- a/RetroFE/Source/Graphics/PageBuilder.h +++ b/RetroFE/Source/Graphics/PageBuilder.h @@ -46,6 +46,8 @@ private: float scaleY_; int screenHeight_; int screenWidth_; + int layoutHeight_; + int layoutWidth_; SDL_Color fontColor_; std::string fontName_; int fontSize_; diff --git a/RetroFE/Source/Graphics/ViewInfo.h b/RetroFE/Source/Graphics/ViewInfo.h index d59fa93..7df6237 100644 --- a/RetroFE/Source/Graphics/ViewInfo.h +++ b/RetroFE/Source/Graphics/ViewInfo.h @@ -59,8 +59,6 @@ public: float Angle; float Alpha; unsigned int Layer; - float HorizontalScale; - float VerticalScale; float BackgroundRed; float BackgroundGreen; float BackgroundBlue; diff --git a/RetroFE/Source/SDL.cpp b/RetroFE/Source/SDL.cpp index 6dceb05..1e92a2d 100644 --- a/RetroFE/Source/SDL.cpp +++ b/RetroFE/Source/SDL.cpp @@ -273,15 +273,15 @@ SDL_Window* SDL::getWindow( ) // Render a copy of a texture -bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect *dest, ViewInfo &viewInfo ) +bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect *dest, ViewInfo &viewInfo, float scaleX, float scaleY ) { SDL_Rect srcRect; SDL_Rect dstRect; SDL_Rect srcRectCopy; SDL_Rect dstRectCopy; - double scaleX; - double scaleY; + double imageScaleX; + double imageScaleY; dstRect.w = dest->w; dstRect.h = dest->h; @@ -317,8 +317,8 @@ bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect } // Define the scale - scaleX = (dstRect.w > 0) ? static_cast( srcRect.w ) / static_cast( dstRect.w ) : 0.0; - scaleY = (dstRect.h > 0) ? static_cast( srcRect.h ) / static_cast( dstRect.h ) : 0.0; + imageScaleX = (dstRect.w > 0) ? static_cast( srcRect.w ) / static_cast( dstRect.w ) : 0.0; + imageScaleY = (dstRect.h > 0) ? static_cast( srcRect.h ) / static_cast( dstRect.h ) : 0.0; // Make a copy srcRectCopy.x = srcRect.x; @@ -364,18 +364,37 @@ bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect } // Define source width and height - srcRect.w = static_cast( dstRect.w * scaleX ); - srcRect.h = static_cast( dstRect.h * scaleY ); + srcRect.w = static_cast( dstRect.w * imageScaleX ); + srcRect.h = static_cast( dstRect.h * imageScaleY ); } + dstRectCopy.x = dstRect.x; + dstRectCopy.y = dstRect.y; + dstRectCopy.w = dstRect.w; + dstRectCopy.h = dstRect.h; + + dstRect.x *= scaleX; + dstRect.y *= scaleY; + dstRect.w *= scaleX; + dstRect.h *= scaleY; + SDL_SetTextureAlphaMod( texture, static_cast( alpha * 255 ) ); SDL_RenderCopyEx( getRenderer( ), texture, &srcRect, &dstRect, viewInfo.Angle, NULL, SDL_FLIP_NONE ); + dstRect.x = dstRectCopy.x; + dstRect.y = dstRectCopy.y; + dstRect.w = dstRectCopy.w; + dstRect.h = dstRectCopy.h; + if ( viewInfo.Reflection == "top" ) { dstRect.h = static_cast( static_cast(dstRect.h ) * viewInfo.ReflectionScale); dstRect.y = dstRect.y - dstRect.h - viewInfo.ReflectionDistance; + dstRect.x *= scaleX; + dstRect.y *= scaleY; + dstRect.w *= scaleX; + dstRect.h *= scaleY; SDL_SetTextureAlphaMod( texture, static_cast( viewInfo.ReflectionAlpha * alpha * 255 ) ); SDL_RenderCopyEx( getRenderer( ), texture, src, &dstRect, viewInfo.Angle, NULL, SDL_FLIP_VERTICAL ); } @@ -384,6 +403,10 @@ bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect { dstRect.y = dstRect.y + dstRect.h + viewInfo.ReflectionDistance; dstRect.h = static_cast( static_cast(dstRect.h ) * viewInfo.ReflectionScale); + dstRect.x *= scaleX; + dstRect.y *= scaleY; + dstRect.w *= scaleX; + dstRect.h *= scaleY; SDL_SetTextureAlphaMod( texture, static_cast( viewInfo.ReflectionAlpha * alpha * 255 ) ); SDL_RenderCopyEx( getRenderer( ), texture, src, &dstRect, viewInfo.Angle, NULL, SDL_FLIP_VERTICAL ); } @@ -392,6 +415,10 @@ bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect { dstRect.w = static_cast( static_cast(dstRect.w ) * viewInfo.ReflectionScale); dstRect.x = dstRect.x - dstRect.w - viewInfo.ReflectionDistance; + dstRect.x *= scaleX; + dstRect.y *= scaleY; + dstRect.w *= scaleX; + dstRect.h *= scaleY; SDL_SetTextureAlphaMod( texture, static_cast( viewInfo.ReflectionAlpha * alpha * 255 ) ); SDL_RenderCopyEx( getRenderer( ), texture, src, &dstRect, viewInfo.Angle, NULL, SDL_FLIP_HORIZONTAL ); } @@ -400,6 +427,10 @@ bool SDL::renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect { dstRect.x = dstRect.x + dstRect.w + viewInfo.ReflectionDistance; dstRect.w = static_cast( static_cast(dstRect.w ) * viewInfo.ReflectionScale); + dstRect.x *= scaleX; + dstRect.y *= scaleY; + dstRect.w *= scaleX; + dstRect.h *= scaleY; SDL_SetTextureAlphaMod( texture, static_cast( viewInfo.ReflectionAlpha * alpha * 255 ) ); SDL_RenderCopyEx( getRenderer( ), texture, src, &dstRect, viewInfo.Angle, NULL, SDL_FLIP_HORIZONTAL ); } diff --git a/RetroFE/Source/SDL.h b/RetroFE/Source/SDL.h index 033692e..d106cb5 100644 --- a/RetroFE/Source/SDL.h +++ b/RetroFE/Source/SDL.h @@ -32,7 +32,7 @@ public: static SDL_Renderer *getRenderer( ); static SDL_mutex *getMutex( ); static SDL_Window *getWindow( ); - static bool renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect *dest, ViewInfo &viewInfo ); + static bool renderCopy( SDL_Texture *texture, float alpha, SDL_Rect *src, SDL_Rect *dest, ViewInfo &viewInfo, float scaleX, float scaleY ); static int getWindowWidth( ) { return windowWidth_; diff --git a/RetroFE/Source/Version.cpp b/RetroFE/Source/Version.cpp index 202d2f0..939c152 100644 --- a/RetroFE/Source/Version.cpp +++ b/RetroFE/Source/Version.cpp @@ -21,7 +21,7 @@ std::string retrofe_version_major = "0"; std::string retrofe_version_minor = "9"; -std::string retrofe_version_build = "15"; +std::string retrofe_version_build = "16"; std::string Version::getString( )