diff --git a/include/eepp/ui/uisprite.hpp b/include/eepp/ui/uisprite.hpp index e56ce4b8d..5b7213723 100644 --- a/include/eepp/ui/uisprite.hpp +++ b/include/eepp/ui/uisprite.hpp @@ -30,19 +30,21 @@ class EE_API UISprite : public UIWidget { Graphics::Sprite* getSprite() const; - void setSprite( Graphics::Sprite* sprite ); + Drawable* getDrawable() const; + + UISprite* setSprite( Graphics::Sprite* sprite ); Color getColor() const; - void setColor( const Color& color ); + UISprite* setColor( const Color& color ); const RenderMode& getRenderMode() const; - void setRenderMode( const RenderMode& render ); + UISprite* setRenderMode( const RenderMode& render ); const Vector2f& getAlignOffset() const; - void setIsSpriteOwner( const bool& dealloc ); + UISprite* setIsSpriteOwner( const bool& dealloc ); bool getDeallocSprite(); diff --git a/src/eepp/ui/tools/uiaudioplayer.cpp b/src/eepp/ui/tools/uiaudioplayer.cpp index 30ba84a5a..494894b68 100644 --- a/src/eepp/ui/tools/uiaudioplayer.cpp +++ b/src/eepp/ui/tools/uiaudioplayer.cpp @@ -4,6 +4,8 @@ #include #include +#include + namespace EE::UI::Tools { static const auto AUDIO_PLAYER_LAYOUT = R"xml( diff --git a/src/eepp/ui/tools/uiimageviewer.cpp b/src/eepp/ui/tools/uiimageviewer.cpp index 11ed8b50b..8c7b5f09d 100644 --- a/src/eepp/ui/tools/uiimageviewer.cpp +++ b/src/eepp/ui/tools/uiimageviewer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -154,21 +155,28 @@ void UIImageViewer::loadImageAsync( std::string_view path, bool isContents, bool if ( format == Image::Format::Unknown ) return; - Drawable* image = nullptr; + Sprite* image = nullptr; if ( mClosing ) return; if ( format != Image::Format::GIF ) { - image = isContents - ? TextureFactory::instance()->loadFromMemory( - reinterpret_cast( path.c_str() ), path.size() ) - : TextureFactory::instance()->loadFromFile( path ); + auto tex = isContents ? TextureFactory::instance()->loadFromMemory( + reinterpret_cast( path.c_str() ), + path.size() ) + : TextureFactory::instance()->loadFromFile( path ); + Sprite* sprite = Sprite::New(); + sprite->createStatic( tex ); + sprite->setAsTextureOwner( true ); + sprite->setAsTextureRegionOwner( true ); + image = sprite; } else { IOStream* stream = isContents ? (IOStream*)new IOStreamMemory( path.c_str(), path.size() ) : (IOStream*)new IOStreamFile( path ); Sprite* sprite = Sprite::fromGif( *stream ); + sprite->setAsTextureOwner( true ); + sprite->setAsTextureRegionOwner( true ); sprite->setAutoAnimate( false ); image = sprite; delete stream; @@ -178,12 +186,7 @@ void UIImageViewer::loadImageAsync( std::string_view path, bool isContents, bool return; if ( image ) { - - if ( isContents ) - mCurFileSize = path.size(); - else - mCurFileSize = FileSystem::fileSize( path ); - + mCurFileSize = isContents ? path.size() : FileSystem::fileSize( path ); mCurFileType = format; runOnMainThread( [this, image] { @@ -309,6 +312,36 @@ Uint32 UIImageViewer::onKeyDown( const KeyEvent& event ) { return 1; } else if ( event.getKeyCode() == KEY_T ) { resetImageView(); + } else if ( event.getKeyCode() == KEY_X ) { + auto sprite = static_cast( mImage->getDrawable() ); + auto mode = sprite->getRenderMode(); + if ( mode == RENDER_NORMAL ) + mode = RENDER_FLIPPED; + else if ( mode == RENDER_MIRROR ) + mode = RENDER_FLIPPED_MIRRORED; + else if ( mode == RENDER_FLIPPED_MIRRORED ) + mode = RENDER_MIRROR; + else + mode = RENDER_NORMAL; + sprite->setRenderMode( mode ); + invalidateDraw(); + } else if ( event.getKeyCode() == KEY_C ) { + auto sprite = static_cast( mImage->getDrawable() ); + auto mode = sprite->getRenderMode(); + if ( mode == RENDER_NORMAL ) + mode = RENDER_MIRROR; + else if ( mode == RENDER_FLIPPED ) + mode = RENDER_FLIPPED_MIRRORED; + else if ( mode == RENDER_FLIPPED_MIRRORED ) + mode = RENDER_FLIPPED; + else + mode = RENDER_NORMAL; + sprite->setRenderMode( mode ); + invalidateDraw(); + } else if ( event.getKeyCode() == KEY_R ) { + mImage->setRotation( mImage->getRotation() + 90.0f ); + } else if ( event.getKeyCode() == KEY_T ) { + resetImageView(); } return UIWidget::onKeyDown( event ); } diff --git a/src/eepp/ui/uisprite.cpp b/src/eepp/ui/uisprite.cpp index 2a5420cac..f0328d339 100644 --- a/src/eepp/ui/uisprite.cpp +++ b/src/eepp/ui/uisprite.cpp @@ -37,7 +37,7 @@ Uint32 UISprite::deallocSprite() { return mNodeFlags & NODE_FLAG_FREE_USE; } -void UISprite::setSprite( Graphics::Sprite* sprite ) { +UISprite* UISprite::setSprite( Graphics::Sprite* sprite ) { if ( deallocSprite() ) eeSAFE_DELETE( mSprite ); @@ -45,6 +45,7 @@ void UISprite::setSprite( Graphics::Sprite* sprite ) { mSprite->setAutoAnimate( false ); updateSize(); + return this; } void UISprite::draw() { @@ -104,6 +105,10 @@ Graphics::Sprite* UISprite::getSprite() const { return mSprite; } +Drawable* UISprite::getDrawable() const { + return mSprite; +} + Color UISprite::getColor() const { if ( NULL != mSprite ) return mSprite->getColor(); @@ -111,20 +116,22 @@ Color UISprite::getColor() const { return Color::White; } -void UISprite::setColor( const Color& color ) { +UISprite* UISprite::setColor( const Color& color ) { if ( NULL != mSprite ) mSprite->setColor( color ); setAlpha( color.a ); + return this; } const RenderMode& UISprite::getRenderMode() const { return mRender; } -void UISprite::setRenderMode( const RenderMode& render ) { +UISprite* UISprite::setRenderMode( const RenderMode& render ) { mRender = render; invalidateDraw(); + return this; } void UISprite::updateSize() { @@ -180,8 +187,9 @@ const Vector2f& UISprite::getAlignOffset() const { return mAlignOffset; } -void UISprite::setIsSpriteOwner( const bool& dealloc ) { +UISprite* UISprite::setIsSpriteOwner( const bool& dealloc ) { writeNodeFlag( NODE_FLAG_FREE_USE, dealloc ? 1 : 0 ); + return this; } bool UISprite::getDeallocSprite() { diff --git a/src/eepp/window/engine.cpp b/src/eepp/window/engine.cpp index e9fcf635c..ad2567e5c 100644 --- a/src/eepp/window/engine.cpp +++ b/src/eepp/window/engine.cpp @@ -66,8 +66,6 @@ Engine::Engine() : Engine::~Engine() { GlobalBatchRenderer::destroySingleton(); - TextureAtlasManager::destroySingleton(); - NinePatchManager::destroySingleton(); Scene::SceneManager::destroySingleton(); @@ -78,6 +76,8 @@ Engine::~Engine() { FontManager::destroySingleton(); + TextureAtlasManager::destroySingleton(); + TextureFactory::destroySingleton(); Graphics::Renderer::destroySingleton();