Clément Wolf 2 hete
szülő
commit
ac9405c529

+ 2 - 0
src/App/Osu/Chat.cpp

@@ -152,6 +152,8 @@ Chat::Chat(Osu *osu) : OsuScreen(osu) {
     updateLayout(m_osu->getScreenSize());
 }
 
+Chat::~Chat() { delete m_button_container; }
+
 void Chat::draw(Graphics *g) {
     const bool isAnimating = anim->isAnimating(&m_fAnimation);
     if(!m_bVisible && !isAnimating) return;

+ 1 - 0
src/App/Osu/Chat.h

@@ -36,6 +36,7 @@ struct ChatChannel {
 class Chat : public OsuScreen {
    public:
     Chat(Osu *osu);
+    ~Chat();
 
     virtual void draw(Graphics *g);
     virtual void mouse_update(bool *propagate_clicks);

+ 1 - 1
src/App/Osu/DatabaseBeatmap.cpp

@@ -151,7 +151,7 @@ DatabaseBeatmap::DatabaseBeatmap(Osu *osu, std::vector<DatabaseBeatmap *> *diffi
 
 DatabaseBeatmap::~DatabaseBeatmap() {
     for(size_t i = 0; i < m_difficulties->size(); i++) {
-        delete(*m_difficulties)[i];
+        delete((*m_difficulties)[i]);
     }
     SAFE_DELETE(m_difficulties);
 }

+ 60 - 48
src/App/Osu/MainMenu.cpp

@@ -255,13 +255,13 @@ MainMenu::MainMenu(Osu *osu) : OsuScreen(osu) {
     m_pauseButton->setClickCallback(fastdelegate::MakeDelegate(this, &MainMenu::onPausePressed));
     addBaseUIElement(m_pauseButton);
 
-    m_updateAvailableButton =
-        new UIButton(m_osu, 0, 0, 0, 0, "",
-                     Osu::debug->getBool() ? "Debug mode, update check disabled" : "Checking for updates ...");
-    m_updateAvailableButton->setUseDefaultSkin();
-    m_updateAvailableButton->setClickCallback(fastdelegate::MakeDelegate(this, &MainMenu::onUpdatePressed));
-    m_updateAvailableButton->setColor(0x2200ff00);
-    m_updateAvailableButton->setTextColor(0x22ffffff);
+    if(env->getOS() == Environment::OS::OS_WINDOWS) {
+        m_updateAvailableButton = new UIButton(m_osu, 0, 0, 0, 0, "", "Checking for updates ...");
+        m_updateAvailableButton->setUseDefaultSkin();
+        m_updateAvailableButton->setClickCallback(fastdelegate::MakeDelegate(this, &MainMenu::onUpdatePressed));
+        m_updateAvailableButton->setColor(0x2200ff00);
+        m_updateAvailableButton->setTextColor(0x22ffffff);
+    }
 
     m_versionButton = new CBaseUIButton(0, 0, 0, 0, "", "");
     UString versionString = UString::format("Version %.2f", Osu::version->getFloat());
@@ -273,6 +273,9 @@ MainMenu::MainMenu(Osu *osu) : OsuScreen(osu) {
 }
 
 MainMenu::~MainMenu() {
+    SAFE_DELETE(preloaded_beatmapset);
+    SAFE_DELETE(m_updateAvailableButton);
+
     anim->deleteExistingAnimation(&m_fUpdateButtonAnim);
 
     anim->deleteExistingAnimation(&m_fMainMenuAnimFriendEyeFollowX);
@@ -287,8 +290,6 @@ MainMenu::~MainMenu() {
     anim->deleteExistingAnimation(&m_fStartupAnim);
     anim->deleteExistingAnimation(&m_fStartupAnim2);
 
-    SAFE_DELETE(m_updateAvailableButton);
-
     // if the user didn't click on the update notification during this session, quietly remove it so it's not annoying
     if(m_bWasCleanShutdown) writeVersionFile();
 }
@@ -446,7 +447,7 @@ void MainMenu::draw(Graphics *g) {
     OsuScreen::draw(g);
 
     // draw update check button
-    {
+    if(m_updateAvailableButton != nullptr) {
         if(m_osu->getUpdateHandler()->getStatus() == UpdateHandler::STATUS::STATUS_SUCCESS_INSTALLATION) {
             g->push3DScene(McRect(m_updateAvailableButton->getPos().x, m_updateAvailableButton->getPos().y,
                                   m_updateAvailableButton->getSize().x, m_updateAvailableButton->getSize().y));
@@ -921,7 +922,10 @@ void MainMenu::mouse_update(bool *propagate_clicks) {
 
     // update and focus handling
     OsuScreen::mouse_update(propagate_clicks);
-    m_updateAvailableButton->mouse_update(propagate_clicks);
+
+    if(m_updateAvailableButton != nullptr) {
+        m_updateAvailableButton->mouse_update(propagate_clicks);
+    }
 
     // handle automatic menu closing
     if(m_fMainMenuButtonCloseTime != 0.0f && engine->getTime() > m_fMainMenuButtonCloseTime) {
@@ -998,39 +1002,41 @@ void MainMenu::mouse_update(bool *propagate_clicks) {
     }
 
     // handle update checker and status text
-    switch(m_osu->getUpdateHandler()->getStatus()) {
-        case UpdateHandler::STATUS::STATUS_UP_TO_DATE:
-            if(m_updateAvailableButton->isVisible()) {
-                m_updateAvailableButton->setText("");
-                m_updateAvailableButton->setVisible(false);
-            }
-            break;
-        case UpdateHandler::STATUS::STATUS_CHECKING_FOR_UPDATE:
-            m_updateAvailableButton->setText("Checking for updates ...");
-            break;
-        case UpdateHandler::STATUS::STATUS_DOWNLOADING_UPDATE:
-            m_updateAvailableButton->setText("Downloading ...");
-            break;
-        case UpdateHandler::STATUS::STATUS_INSTALLING_UPDATE:
-            m_updateAvailableButton->setText("Installing ...");
-            break;
-        case UpdateHandler::STATUS::STATUS_SUCCESS_INSTALLATION:
-            if(engine->getTime() > m_fUpdateButtonTextTime && anim->isAnimating(&m_fUpdateButtonAnim) &&
-               m_fUpdateButtonAnim > 0.175f) {
-                m_fUpdateButtonTextTime = m_fUpdateButtonAnimTime;
-
-                m_updateAvailableButton->setColor(0xff00ff00);
-                m_updateAvailableButton->setTextColor(0xffffffff);
-
-                if(m_updateAvailableButton->getText().find("ready") != -1)
-                    m_updateAvailableButton->setText("Click here to restart now!");
-                else
-                    m_updateAvailableButton->setText("A new version of neosu is ready!");
-            }
-            break;
-        case UpdateHandler::STATUS::STATUS_ERROR:
-            m_updateAvailableButton->setText("Update Error! Click to retry ...");
-            break;
+    if(m_updateAvailableButton != nullptr) {
+        switch(m_osu->getUpdateHandler()->getStatus()) {
+            case UpdateHandler::STATUS::STATUS_UP_TO_DATE:
+                if(m_updateAvailableButton->isVisible()) {
+                    m_updateAvailableButton->setText("");
+                    m_updateAvailableButton->setVisible(false);
+                }
+                break;
+            case UpdateHandler::STATUS::STATUS_CHECKING_FOR_UPDATE:
+                m_updateAvailableButton->setText("Checking for updates ...");
+                break;
+            case UpdateHandler::STATUS::STATUS_DOWNLOADING_UPDATE:
+                m_updateAvailableButton->setText("Downloading ...");
+                break;
+            case UpdateHandler::STATUS::STATUS_INSTALLING_UPDATE:
+                m_updateAvailableButton->setText("Installing ...");
+                break;
+            case UpdateHandler::STATUS::STATUS_SUCCESS_INSTALLATION:
+                if(engine->getTime() > m_fUpdateButtonTextTime && anim->isAnimating(&m_fUpdateButtonAnim) &&
+                   m_fUpdateButtonAnim > 0.175f) {
+                    m_fUpdateButtonTextTime = m_fUpdateButtonAnimTime;
+
+                    m_updateAvailableButton->setColor(0xff00ff00);
+                    m_updateAvailableButton->setTextColor(0xffffffff);
+
+                    if(m_updateAvailableButton->getText().find("ready") != -1)
+                        m_updateAvailableButton->setText("Click here to restart now!");
+                    else
+                        m_updateAvailableButton->setText("A new version of neosu is ready!");
+                }
+                break;
+            case UpdateHandler::STATUS::STATUS_ERROR:
+                m_updateAvailableButton->setText("Update Error! Click to retry ...");
+                break;
+        }
     }
 
     if(m_osu->getUpdateHandler()->getStatus() == UpdateHandler::STATUS::STATUS_SUCCESS_INSTALLATION &&
@@ -1072,7 +1078,7 @@ void MainMenu::selectRandomBeatmap() {
         if(nb_mapsets == 0) return;
 
         m_osu->getSongBrowser()->getSelectedBeatmap()->deselect();
-        SAFE_DELETE(preloaded_beatmap);
+        SAFE_DELETE(preloaded_beatmapset);
 
         for(int i = 0; i < 10; i++) {
             auto mapset_folder = songs_folder;
@@ -1088,12 +1094,15 @@ void MainMenu::selectRandomBeatmap() {
             auto beatmap_diffs = beatmap->getDifficulties();
             if(beatmap_diffs.size() == 0) {
                 debugLog("Beatmap '%s' has no difficulties!\n", mapset_folder.c_str());
+                delete beatmap;
                 continue;
             }
 
+            preloaded_beatmapset = beatmap;
             preloaded_beatmap = beatmap_diffs[rand() % beatmap_diffs.size()];
             preloaded_beatmap->do_not_store = true;
             m_osu->getSongBrowser()->onDifficultySelected(preloaded_beatmap, false);
+
             return;
         }
 
@@ -1183,9 +1192,12 @@ void MainMenu::updateLayout() {
     m_pauseButton->setRelPos(m_osu->getScreenWidth() - m_pauseButton->getSize().x * 2 - 10 * dpiScale,
                              m_pauseButton->getSize().y + 10 * dpiScale);
 
-    m_updateAvailableButton->setSize(375 * dpiScale, 50 * dpiScale);
-    m_updateAvailableButton->setPos(m_osu->getScreenWidth() / 2 - m_updateAvailableButton->getSize().x / 2,
-                                    m_osu->getScreenHeight() - m_updateAvailableButton->getSize().y - 10 * dpiScale);
+    if(m_updateAvailableButton != nullptr) {
+        m_updateAvailableButton->setSize(375 * dpiScale, 50 * dpiScale);
+        m_updateAvailableButton->setPos(
+            m_osu->getScreenWidth() / 2 - m_updateAvailableButton->getSize().x / 2,
+            m_osu->getScreenHeight() - m_updateAvailableButton->getSize().y - 10 * dpiScale);
+    }
 
     m_versionButton->onResized();  // HACKHACK: framework, setSizeToContent() does not update string metrics
     m_versionButton->setSizeToContent(8 * dpiScale, 8 * dpiScale);

+ 2 - 1
src/App/Osu/MainMenu.h

@@ -59,6 +59,7 @@ class MainMenu : public OsuScreen, public MouseListener {
     virtual void mouse_update(bool *propagate_clicks);
 
     DatabaseBeatmap *preloaded_beatmap = nullptr;
+    DatabaseBeatmap *preloaded_beatmapset = nullptr;
     void selectRandomBeatmap();
 
     virtual void onKeyDown(KeyboardEvent &e);
@@ -128,7 +129,7 @@ class MainMenu : public OsuScreen, public MouseListener {
     std::vector<MainMenuButton *> m_menuElements;
 
     MainMenuPauseButton *m_pauseButton;
-    UIButton *m_updateAvailableButton;
+    UIButton *m_updateAvailableButton = nullptr;
     CBaseUIButton *m_versionButton;
 
     bool m_bDrawVersionNotificationArrow;

+ 7 - 0
src/App/Osu/OptionsMenu.cpp

@@ -1387,6 +1387,13 @@ OptionsMenu::OptionsMenu(Osu *osu) : ScreenBackable(osu) {
         onHighQualitySlidersConVarChange("", osu_options_high_quality_sliders.getString());
 }
 
+OptionsMenu::~OptionsMenu() {
+    // TODO @kiwec: remove them from containers first
+    // SAFE_DELETE(m_asioBufferSizeSlider);
+    // SAFE_DELETE(m_wasapiBufferSizeSlider);
+    // SAFE_DELETE(m_wasapiPeriodSizeSlider);
+}
+
 void OptionsMenu::draw(Graphics *g) {
     const bool isAnimating = anim->isAnimating(&m_fAnimation);
     if(!m_bVisible && !isAnimating) return;

+ 1 - 0
src/App/Osu/OptionsMenu.h

@@ -37,6 +37,7 @@ class ConVar;
 class OptionsMenu : public ScreenBackable, public NotificationOverlayKeyListener {
    public:
     OptionsMenu(Osu *osu);
+    ~OptionsMenu();
 
     virtual void draw(Graphics *g);
     virtual void mouse_update(bool *propagate_clicks);

+ 0 - 1
src/App/Osu/Osu.cpp

@@ -514,7 +514,6 @@ Osu::~Osu() {
     SAFE_DELETE(m_windowManager);
 
     for(int i = 0; i < m_screens.size(); i++) {
-        debugLog("%i\n", i);
         SAFE_DELETE(m_screens[i]);
     }
 

+ 0 - 1
src/App/Osu/OsuScreen.h

@@ -20,7 +20,6 @@ class OsuScreen : public CBaseUIContainer {
         m_osu = osu;
         m_bVisible = false;
     }
-    virtual ~OsuScreen() { ; }
 
     virtual void onResolutionChange(Vector2 newResolution) { (void)newResolution; }
 

+ 23 - 0
src/App/Osu/RoomScreen.cpp

@@ -192,6 +192,29 @@ RoomScreen::RoomScreen(Osu *osu) : OsuScreen(osu) {
     updateLayout(m_osu->getScreenSize());
 }
 
+RoomScreen::~RoomScreen() {
+    m_settings->getContainer()->empty();
+    SAFE_DELETE(m_room_name);
+    SAFE_DELETE(m_change_password_btn);
+    SAFE_DELETE(m_host);
+    SAFE_DELETE(m_room_name_iptl);
+    SAFE_DELETE(m_room_name_ipt);
+    SAFE_DELETE(m_select_map_btn);
+    SAFE_DELETE(m_select_mods_btn);
+    SAFE_DELETE(m_change_win_condition_btn);
+    SAFE_DELETE(m_win_condition);
+    SAFE_DELETE(map_label);
+    SAFE_DELETE(m_map_title);
+    SAFE_DELETE(m_map_stars);
+    SAFE_DELETE(m_map_attributes);
+    SAFE_DELETE(m_map_attributes2);
+    SAFE_DELETE(mods_label);
+    SAFE_DELETE(m_freemod);
+    SAFE_DELETE(m_no_mods_selected);
+    SAFE_DELETE(m_mods);
+    SAFE_DELETE(m_ready_btn);
+}
+
 void RoomScreen::draw(Graphics *g) {
     if(!m_bVisible) return;
 

+ 1 - 0
src/App/Osu/RoomScreen.h

@@ -27,6 +27,7 @@ class UIModList : public CBaseUIContainer {
 class RoomScreen : public OsuScreen {
    public:
     RoomScreen(Osu *osu);
+    ~RoomScreen();
 
     virtual void draw(Graphics *g) override;
     virtual void mouse_update(bool *propagate_clicks) override;

+ 48 - 1
src/App/Osu/SongBrowser.cpp

@@ -610,7 +610,54 @@ SongBrowser::~SongBrowser() {
     engine->getResourceManager()->destroyResource(m_dynamicStarCalculator);
     engine->getResourceManager()->destroyResource(m_backgroundSearchMatcher);
 
-    // leak memory, who cares we're closing neosu anyway
+    m_songBrowser->getContainer()->empty();
+
+    for(size_t i = 0; i < m_songButtons.size(); i++) {
+        delete m_songButtons[i];
+    }
+    for(size_t i = 0; i < m_collectionButtons.size(); i++) {
+        delete m_collectionButtons[i];
+    }
+    for(size_t i = 0; i < m_artistCollectionButtons.size(); i++) {
+        delete m_artistCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_difficultyCollectionButtons.size(); i++) {
+        delete m_difficultyCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_bpmCollectionButtons.size(); i++) {
+        delete m_bpmCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_creatorCollectionButtons.size(); i++) {
+        delete m_creatorCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_dateaddedCollectionButtons.size(); i++) {
+        delete m_dateaddedCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_lengthCollectionButtons.size(); i++) {
+        delete m_lengthCollectionButtons[i];
+    }
+    for(size_t i = 0; i < m_titleCollectionButtons.size(); i++) {
+        delete m_titleCollectionButtons[i];
+    }
+
+    m_scoreBrowser->getContainer()->empty();
+    for(size_t i = 0; i < m_scoreButtonCache.size(); i++) {
+        delete m_scoreButtonCache[i];
+    }
+    SAFE_DELETE(m_scoreBrowserScoresStillLoadingElement);
+    SAFE_DELETE(m_scoreBrowserNoRecordsYetElement);
+
+    for(size_t i = 0; i < m_sortingMethods.size(); i++) {
+        delete m_sortingMethods[i].comparator;
+    }
+
+    SAFE_DELETE(m_search);
+    SAFE_DELETE(m_topbarLeft);
+    SAFE_DELETE(m_topbarRight);
+    SAFE_DELETE(m_bottombar);
+    SAFE_DELETE(m_scoreBrowser);
+    SAFE_DELETE(m_songBrowser);
+    SAFE_DELETE(m_db);
 }
 
 void SongBrowser::draw(Graphics *g) {

+ 5 - 13
src/Engine/Font.cpp

@@ -7,13 +7,6 @@
 
 #include "Font.h"
 
-#include <freetype/freetype.h>
-#include <freetype/ftbitmap.h>
-#include <freetype/ftglyph.h>
-#include <freetype/ftoutln.h>
-#include <freetype/fttrigon.h>
-#include <ft2build.h>
-
 #include "ConVar.h"
 #include "Engine.h"
 #include "ResourceManager.h"
@@ -23,9 +16,6 @@ ConVar r_drawstring_max_string_length("r_drawstring_max_string_length", 65536, F
                                       "maximum number of characters per call, sanity/memory buffer limit");
 ConVar r_debug_drawstring_unbind("r_debug_drawstring_unbind", false, FCVAR_NONE);
 
-static void renderFTGlyphToTextureAtlas(FT_Library library, FT_Face face, wchar_t ch, TextureAtlas *textureAtlas,
-                                        bool antialiasing,
-                                        std::unordered_map<wchar_t, McFont::GLYPH_METRICS> *glyphMetrics);
 static unsigned char *unpackMonoBitmap(FT_Bitmap bitmap);
 
 const wchar_t McFont::UNKNOWN_CHAR;
@@ -251,9 +241,9 @@ bool McFont::hasGlyph(wchar_t ch) const { return (m_vGlyphMetrics.find(ch) != m_
 
 // helper functions
 
-static void renderFTGlyphToTextureAtlas(FT_Library library, FT_Face face, wchar_t ch, TextureAtlas *textureAtlas,
-                                        bool antialiasing,
-                                        std::unordered_map<wchar_t, McFont::GLYPH_METRICS> *glyphMetrics) {
+void McFont::renderFTGlyphToTextureAtlas(FT_Library library, FT_Face face, wchar_t ch, TextureAtlas *textureAtlas,
+                                         bool antialiasing,
+                                         std::unordered_map<wchar_t, McFont::GLYPH_METRICS> *glyphMetrics) {
     // load current glyph
     if(FT_Load_Glyph(face, FT_Get_Char_Index(face, ch), antialiasing ? FT_LOAD_TARGET_NORMAL : FT_LOAD_TARGET_MONO)) {
         // engine->showMessageError("Font Error", "FT_Load_Glyph() failed!");
@@ -282,6 +272,8 @@ static void renderFTGlyphToTextureAtlas(FT_Library library, FT_Face face, wchar_
     const int width = bitmap.width;
     const int height = bitmap.rows;
 
+    debugLog("Creating texture for font %s (%dpt)\n", m_sFilePath.c_str(), m_iFontSize);
+
     // build texture
     Vector2 atlasPos;
     if(width > 0 && height > 0) {

+ 10 - 11
src/Engine/Font.h

@@ -1,12 +1,10 @@
-//================ Copyright (c) 2015, PG, All rights reserved. =================//
-//
-// Purpose:		freetype font wrapper
-//
-// $NoKeywords: $fnt
-//===============================================================================//
-
-#ifndef FONT_H
-#define FONT_H
+#pragma once
+#include <freetype/freetype.h>
+#include <freetype/ftbitmap.h>
+#include <freetype/ftglyph.h>
+#include <freetype/ftoutln.h>
+#include <freetype/fttrigon.h>
+#include <ft2build.h>
 
 #include "Resource.h"
 
@@ -70,6 +68,9 @@ class McFont : public Resource {
     bool addGlyph(wchar_t ch);
 
     void addAtlasGlyphToVao(Graphics *g, wchar_t ch, float &advanceX, VertexArrayObject *vao);
+    void renderFTGlyphToTextureAtlas(FT_Library library, FT_Face face, wchar_t ch, TextureAtlas *textureAtlas,
+                                     bool antialiasing,
+                                     std::unordered_map<wchar_t, McFont::GLYPH_METRICS> *glyphMetrics);
 
     int m_iFontSize;
     bool m_bAntialiasing;
@@ -86,5 +87,3 @@ class McFont : public Resource {
 
     GLYPH_METRICS m_errorGlyph;
 };
-
-#endif

+ 1 - 0
src/Util/cbase.h

@@ -134,6 +134,7 @@ struct zarray {
             nb = nb_initial;
         }
     }
+    ~zarray() { free(memory); }
 
     void push_back(T t) {
         if(nb + 1 > max) {