From 8de61a22fbbba1a458dd72461e2ec2ea63621204 Mon Sep 17 00:00:00 2001 From: jief Date: Tue, 7 Nov 2023 17:40:28 +0100 Subject: [PATCH] XIcon::GetBest now returns a reference, which save time and memory. Added some const. Remove GetIconP from XTheme. --- MdePkg/Include/Protocol/GraphicsOutput.h | 2 +- Xcode/cpp_tests/src/main.cpp | 118 ++++++++++++++++++++++- rEFIt_UEFI/Platform/Utils.cpp | 4 + rEFIt_UEFI/Platform/Utils.h | 3 +- rEFIt_UEFI/entry_scan/lockedgraphics.cpp | 2 +- rEFIt_UEFI/gui/REFIT_MAINMENU_SCREEN.cpp | 36 +++---- rEFIt_UEFI/gui/REFIT_MENU_SCREEN.cpp | 10 +- rEFIt_UEFI/libeg/VectorGraphics.cpp | 8 +- rEFIt_UEFI/libeg/XIcon.cpp | 38 +------- rEFIt_UEFI/libeg/XIcon.h | 2 +- rEFIt_UEFI/libeg/XImage.cpp | 14 +-- rEFIt_UEFI/libeg/XImage.h | 10 +- rEFIt_UEFI/libeg/XPointer.cpp | 2 +- rEFIt_UEFI/libeg/XPointer.h | 4 +- rEFIt_UEFI/libeg/XTheme.cpp | 43 +++------ rEFIt_UEFI/libeg/XTheme.h | 2 - 16 files changed, 178 insertions(+), 120 deletions(-) diff --git a/MdePkg/Include/Protocol/GraphicsOutput.h b/MdePkg/Include/Protocol/GraphicsOutput.h index 935f2f0bd..e53b80de1 100644 --- a/MdePkg/Include/Protocol/GraphicsOutput.h +++ b/MdePkg/Include/Protocol/GraphicsOutput.h @@ -210,7 +210,7 @@ typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT)( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL + IN JCONST EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, diff --git a/Xcode/cpp_tests/src/main.cpp b/Xcode/cpp_tests/src/main.cpp index 8cc1260c3..969bbf638 100755 --- a/Xcode/cpp_tests/src/main.cpp +++ b/Xcode/cpp_tests/src/main.cpp @@ -12,7 +12,8 @@ #include "../../../PosixCompilation/xcode_utf_fixed.h" #include "../../../rEFIt_UEFI/cpp_unit_test/all_tests.h" -#include "../../../rEFIt_UEFI/cpp_foundation/XToolsCommon.h" +//#include "../../../rEFIt_UEFI/cpp_foundation/XToolsCommon.h" +#include "../../../rEFIt_UEFI/libeg/XImage.h" //#include "../../../rEFIt_UEFI/Platform/platformdata.h" //class Boolean @@ -34,6 +35,91 @@ // void setValue(bool a) {flag = a;} //}; +// The following is by no means a FULL solution! +#include +#include +#include + +template +class Property { +public: + Property(){} + operator const T& () const { + // Call override getter if we have it + if (getter) return getter(); + return get(); + } + const T& operator = (const T& other) { + // Call override setter if we have it + if (setter) return setter(other); + return set(other); + } + bool operator == (const T& other) const { + // Static cast makes sure our getter operator is called, so we could use overrides if those are in place + return static_cast(*this) == other; + } + // Use this to always get without overrides, useful for use with overriding implementations + const T& get() const { + return t; + } + // Use this to always set without overrides, useful for use with overriding implementations + const T& set(const T& other) { + return t = other; + } + // Assign getter and setter to these properties + std::function getter; + std::function setter; +private: + T t; +}; + +// Basic usage, no override +struct Test { + Property prop; +}; + +// Override getter and setter +struct TestWithOverride { + TestWithOverride(){ + prop.setter = [&](const int& other){ + std::cout << "Custom setter called" << std::endl; + return prop.set(other); + }; + prop.setter = std::bind(&TestWithOverride::setProp,this,std::placeholders::_1); + prop.getter = std::bind(&TestWithOverride::getProp,this); + } + Property prop; +private: + const int& getProp() const { + std::cout << "Custom getter called" << std::endl; + return prop.get(); + } + const int& setProp(const int& other){ + std::cout << "Custom setter called" << std::endl; + return prop.set(other); + } +}; + +class MyFloat { +public: + float f; + MyFloat() { f = 0.0f; } + MyFloat(float _f) : f(_f) {} + float get() { return 1; } +}; +template +class MutableRef : public T { +public: + T* t; + const T& operator = (const T* other) { + t = other; + return *t; + } + operator T& () { + return *t; + } +}; + extern "C" int main(int argc, const char * argv[]) { @@ -41,6 +127,36 @@ extern "C" int main(int argc, const char * argv[]) (void)argv; setlocale(LC_ALL, "en_US"); // to allow printf unicode char + MyFloat test = 5.0f; + + MutableRef Background; + + Background = &test; + test = 6; + float test2 = Background.get(); + + Test t; + TestWithOverride t1; + t.prop = 1; + assert(t.prop == 1); + t1.prop = 1; + assert(t1.prop == 1); + /* + Expected output: + 1. No aborts on assertions + 2. Text: + Custom setter called + Custom getter called + */ + + + + + + + + + // xcode_utf_fixed_tests(); const int i = 2; (void)i; diff --git a/rEFIt_UEFI/Platform/Utils.cpp b/rEFIt_UEFI/Platform/Utils.cpp index 5186c7d39..87a3af3a3 100755 --- a/rEFIt_UEFI/Platform/Utils.cpp +++ b/rEFIt_UEFI/Platform/Utils.cpp @@ -142,6 +142,8 @@ UINT32 GetCrc32(UINT8 *Buffer, UINTN Size) return x; } +#ifndef UNIT_TESTS_MACOS + extern "C" { #include } @@ -155,6 +157,8 @@ void displayFreeMemory(const XString8& prefix) DebugLog(1, "--> %s: Firmware has %llu free pages (%llu in lower 4 GB)\n", prefix.c_str(), TotalMemory, LowMemory); } +#endif + XBool haveError = false; diff --git a/rEFIt_UEFI/Platform/Utils.h b/rEFIt_UEFI/Platform/Utils.h index 0b36a25ae..7b96bd429 100755 --- a/rEFIt_UEFI/Platform/Utils.h +++ b/rEFIt_UEFI/Platform/Utils.h @@ -130,9 +130,10 @@ extern XBool haveError; #endif // __cplusplus - +#ifndef UNIT_TESTS_MACOS extern "C" { void displayFreeMemory(const XString8& prefix); } +#endif #endif // _UTILS_H_ diff --git a/rEFIt_UEFI/entry_scan/lockedgraphics.cpp b/rEFIt_UEFI/entry_scan/lockedgraphics.cpp index 9dfc3edb7..d13e3e2f0 100644 --- a/rEFIt_UEFI/entry_scan/lockedgraphics.cpp +++ b/rEFIt_UEFI/entry_scan/lockedgraphics.cpp @@ -74,7 +74,7 @@ static LOCKED_GRAPHICS *LockedGraphics; // The screen lock static XBool ScreenIsLocked; -static EFI_STATUS EFIAPI LockedGOPBlt(IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL) +static EFI_STATUS EFIAPI LockedGOPBlt(IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN const EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL) { return EFI_SUCCESS; } diff --git a/rEFIt_UEFI/gui/REFIT_MAINMENU_SCREEN.cpp b/rEFIt_UEFI/gui/REFIT_MAINMENU_SCREEN.cpp index bc55407d7..4ade95a0c 100644 --- a/rEFIt_UEFI/gui/REFIT_MAINMENU_SCREEN.cpp +++ b/rEFIt_UEFI/gui/REFIT_MAINMENU_SCREEN.cpp @@ -120,13 +120,9 @@ void REFIT_MAINMENU_SCREEN::DrawMainMenuLabel(IN CONST XStringW& Text, IN INTN X INTN X = XPos - (TextWidth >> 1) - (BadgeDim + 16); INTN Y = YPos - ((BadgeDim - ThemeX->TextHeight) >> 1); Back.CopyRect(ThemeX->Background, X, Y); - XBool free = false; - XImage *CurrSel = Entries[ScrollState.CurrentSelection].Image.GetBest(!Daylight, &free); - Back.Compose(0, 0, *CurrSel, false, BadgeDim/128.f); + const XImage& CurrSel = Entries[ScrollState.CurrentSelection].Image.GetBest(!Daylight); + Back.Compose(0, 0, CurrSel, false, BadgeDim/128.f); Back.DrawOnBack(X, Y, Back); - if (free) { - delete CurrSel; - } } OldX = XPos; @@ -238,8 +234,7 @@ void REFIT_MAINMENU_SCREEN::DrawMainMenuEntry(REFIT_ABSTRACT_MENU_ENTRY *Entry, } // const XImage& MainImage = (!ThemeX->Daylight && !MainIcon.ImageNight.isEmpty())? MainIcon.ImageNight : MainIcon.Image; - XBool free = false; - XImage *MainImage = MainIcon.GetBest(!Daylight, &free); + const XImage& MainImage = MainIcon.GetBest(!Daylight); INTN CompWidth = (Entry->Row == 0) ? ThemeX->row0TileSize : ThemeX->row1TileSize; INTN CompHeight = CompWidth; @@ -264,9 +259,9 @@ void REFIT_MAINMENU_SCREEN::DrawMainMenuEntry(REFIT_ABSTRACT_MENU_ENTRY *Entry, XImage Back(CompWidth, CompHeight); Back.CopyRect(ThemeX->Background, XPos, YPos); - INTN OffsetX = (CompWidth - MainImage->GetWidth()) / 2; + INTN OffsetX = (CompWidth - MainImage.GetWidth()) / 2; OffsetX = (OffsetX > 0) ? OffsetX: 0; - INTN OffsetY = (CompHeight - MainImage->GetHeight()) / 2; + INTN OffsetY = (CompHeight - MainImage.GetHeight()) / 2; OffsetY = (OffsetY > 0) ? OffsetY: 0; INTN OffsetTX = (CompWidth - TopImage.GetWidth()) / 2; @@ -279,28 +274,24 @@ void REFIT_MAINMENU_SCREEN::DrawMainMenuEntry(REFIT_ABSTRACT_MENU_ENTRY *Entry, float composeScale = (ThemeX->NonSelectedGrey && !selected)? -1.f: 1.f; if(ThemeX->SelectionOnTop) { //place main image in centre. It may be OS or Drive - Back.Compose(OffsetX, OffsetY, *MainImage, false, composeScale); + Back.Compose(OffsetX, OffsetY, MainImage, false, composeScale); } else { Back.Compose(OffsetTX, OffsetTY, TopImage, false); //selection first - Back.Compose(OffsetX, OffsetY, *MainImage, false, composeScale); + Back.Compose(OffsetX, OffsetY, MainImage, false, composeScale); } Entry->Place.XPos = XPos; Entry->Place.YPos = YPos; - Entry->Place.Width = MainImage->GetWidth(); - Entry->Place.Height = MainImage->GetHeight(); + Entry->Place.Width = MainImage.GetWidth(); + Entry->Place.Height = MainImage.GetHeight(); - if (free) { - delete MainImage; - } // place the badge image float fBadgeScale = ThemeX->BadgeScale/16.f; if ((Entry->Row == 0) && BadgeIcon && !BadgeIcon->isEmpty()) { // const XImage& BadgeImage = (!ThemeX->Daylight && !BadgeIcon->ImageNight.isEmpty()) ? &BadgeIcon->ImageNight : BadgeImage = &BadgeIcon->Image; - free = false; - XImage* BadgeImage = BadgeIcon->GetBest(!Daylight, &free); - INTN BadgeWidth = (INTN)(BadgeImage->GetWidth() * fBadgeScale); - INTN BadgeHeight = (INTN)(BadgeImage->GetHeight() * fBadgeScale); + const XImage& BadgeImage = BadgeIcon->GetBest(!Daylight); + INTN BadgeWidth = (INTN)(BadgeImage.GetWidth() * fBadgeScale); + INTN BadgeHeight = (INTN)(BadgeImage.GetHeight() * fBadgeScale); if ((BadgeWidth + 8) < CompWidth && (BadgeHeight + 8) < CompHeight) { @@ -319,8 +310,7 @@ void REFIT_MAINMENU_SCREEN::DrawMainMenuEntry(REFIT_ABSTRACT_MENU_ENTRY *Entry, OffsetY += CompHeight - 8 - BadgeHeight; } // DBG(" badge offset=[%lld,%lld]\n", OffsetX, OffsetY); - Back.Compose(OffsetX, OffsetY, *BadgeImage, false, fBadgeScale); - if (free) delete BadgeImage; + Back.Compose(OffsetX, OffsetY, BadgeImage, false, fBadgeScale); } } diff --git a/rEFIt_UEFI/gui/REFIT_MENU_SCREEN.cpp b/rEFIt_UEFI/gui/REFIT_MENU_SCREEN.cpp index 89f0c1594..dc74119ed 100644 --- a/rEFIt_UEFI/gui/REFIT_MENU_SCREEN.cpp +++ b/rEFIt_UEFI/gui/REFIT_MENU_SCREEN.cpp @@ -1608,20 +1608,18 @@ void REFIT_MENU_SCREEN::GraphicsMenuStyle(IN UINTN Function, IN CONST CHAR16 *Pa if (!TitleImage.isEmpty()) { INTN FilmXPos = (INTN)(EntriesPosX - (TitleImage.Image.GetWidth() + (int)(TITLEICON_SPACING * ThemeX->Scale))); INTN FilmYPos = (INTN)EntriesPosY; - XBool free; - XImage *tImage = TitleImage.GetBest(!Daylight, &free); + const XImage& tImage = TitleImage.GetBest(!Daylight); // TitleImage.Image.Draw(FilmXPos, FilmYPos); //TODO - account night and svg // update FilmPlace only if not set by InitAnime if (FilmC->FilmPlace.Width == 0 || FilmC->FilmPlace.Height == 0) { FilmC->FilmPlace.XPos = FilmXPos; FilmC->FilmPlace.YPos = FilmYPos; - FilmC->FilmPlace.Width = tImage->GetWidth(); - FilmC->FilmPlace.Height = tImage->GetHeight(); + FilmC->FilmPlace.Width = tImage.GetWidth(); + FilmC->FilmPlace.Height = tImage.GetHeight(); } - tImage->Draw(FilmXPos, FilmYPos); - if (free) delete tImage; + tImage.Draw(FilmXPos, FilmYPos); } if (InfoLines.size() > 0) { diff --git a/rEFIt_UEFI/libeg/VectorGraphics.cpp b/rEFIt_UEFI/libeg/VectorGraphics.cpp index a8abf3eb9..8d9de63ba 100755 --- a/rEFIt_UEFI/libeg/VectorGraphics.cpp +++ b/rEFIt_UEFI/libeg/VectorGraphics.cpp @@ -338,13 +338,13 @@ if ( nsvg__nbDanglingPtr() > 0 ) { SelectionBackgroundPixel.Blue = (SelectionColor >> 8) & 0xFF; SelectionBackgroundPixel.Reserved = (SelectionColor >> 0) & 0xFF; //TODO make SelectionImages to be XIcon - SelectionImages[0] = *GetIconP(BUILTIN_SELECTION_BIG)->GetBest(!Daylight); - SelectionImages[2] = *GetIconP(BUILTIN_SELECTION_SMALL)->GetBest(!Daylight); - SelectionImages[4] = *GetIconP(BUILTIN_ICON_SELECTION)->GetBest(!Daylight); + SelectionImages[0] = GetIcon(BUILTIN_SELECTION_BIG).GetBest(!Daylight); + SelectionImages[2] = GetIcon(BUILTIN_SELECTION_SMALL).GetBest(!Daylight); + SelectionImages[4] = GetIcon(BUILTIN_ICON_SELECTION).GetBest(!Daylight); //buttons for (INTN i = BUILTIN_RADIO_BUTTON; i <= BUILTIN_CHECKBOX_CHECKED; ++i) { - Buttons[i - BUILTIN_RADIO_BUTTON] = *GetIconP(i)->GetBest(!Daylight); + Buttons[i - BUILTIN_RADIO_BUTTON] = GetIcon(i).GetBest(!Daylight); } //for (int i=0 ; i<6 ; i+=2 ) { //SelectionImages[i].Draw(i*100, 0); diff --git a/rEFIt_UEFI/libeg/XIcon.cpp b/rEFIt_UEFI/libeg/XIcon.cpp index 64d5b9eff..7cd22df12 100644 --- a/rEFIt_UEFI/libeg/XIcon.cpp +++ b/rEFIt_UEFI/libeg/XIcon.cpp @@ -250,43 +250,9 @@ EFI_STATUS XIcon::LoadXImage(const EFI_FILE *BaseDir, const XStringW& IconName) return Status; } -XImage* XIcon::GetBest(XBool night, XBool *free) +const XImage& XIcon::GetBest(XBool night) const { -#if 1 - if (ImageSVG) { - NSVGimage* sImage = (NSVGimage*)ImageSVGnight; - if (!night || !ImageSVGnight) sImage = (NSVGimage*)ImageSVG; - float Scale = sImage->scale; - NSVGrasterizer* rast = nsvgCreateRasterizer(); - float Height = sImage->height * Scale; - float Width = sImage->width * Scale; - int iWidth = (int)(Width + 0.5f); - int iHeight = (int)(Height + 0.5f); - XImage* NewImage = new XImage(iWidth, iHeight); //TODO creating new XImage we have to delete it after use - if (sImage->shapes == NULL) { - if (free) *free = true; - return NewImage; - } - float bounds[4]; - nsvg__imageBounds(sImage, bounds); - - float tx = 0.f, ty = 0.f; - float realWidth = (bounds[2] - bounds[0]) * Scale; - float realHeight = (bounds[3] - bounds[1]) * Scale; - tx = (Width - realWidth) * 0.5f; - ty = (Height - realHeight) * 0.5f; - - nsvgRasterize(rast, sImage, tx, ty, Scale, Scale, (UINT8*)NewImage->GetPixelPtr(0,0), iWidth, iHeight, iWidth*4); - nsvgDeleteRasterizer(rast); -// if (night) ImageNight = *NewImage; -// else Image = *NewImage; -// delete NewImage; - if (free) *free = true; - return NewImage; - } -#endif - XImage* RetImage = (night && !ImageNight.isEmpty())? &ImageNight : &Image; - if (free) *free = false; + const XImage& RetImage = (night && !ImageNight.isEmpty())? ImageNight : Image; return RetImage; } diff --git a/rEFIt_UEFI/libeg/XIcon.h b/rEFIt_UEFI/libeg/XIcon.h index e01c90f49..1bf4017ab 100644 --- a/rEFIt_UEFI/libeg/XIcon.h +++ b/rEFIt_UEFI/libeg/XIcon.h @@ -41,7 +41,7 @@ public: // Default are not valid, as usual. We delete them. If needed, proper ones can be created // Icon(const Icon&) = delete; XIcon& operator=(const XIcon&); // = delete; - XImage* GetBest(XBool night, XBool *free = nullptr); + const XImage& GetBest(XBool night) const; }; diff --git a/rEFIt_UEFI/libeg/XImage.cpp b/rEFIt_UEFI/libeg/XImage.cpp index 11d589b47..20d49f754 100644 --- a/rEFIt_UEFI/libeg/XImage.cpp +++ b/rEFIt_UEFI/libeg/XImage.cpp @@ -530,7 +530,7 @@ void XImage::GetArea(INTN x, INTN y, UINTN W, UINTN H) } } -void XImage::DrawWithoutCompose(INTN x, INTN y, UINTN width, UINTN height) +void XImage::DrawWithoutCompose(INTN x, INTN y, UINTN width, UINTN height) const { if (isEmpty()) { return; @@ -556,27 +556,27 @@ void XImage::DrawWithoutCompose(INTN x, INTN y, UINTN width, UINTN height) } //output combined image if (GraphicsOutput != NULL) { - GraphicsOutput->Blt(GraphicsOutput, (*this).GetPixelPtr(0, 0), + GraphicsOutput->Blt(GraphicsOutput, PixelData.data(), EfiBltBufferToVideo, 0, 0, x, y, AreaWidth, AreaHeight, GetWidth()*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); } else if (UgaDraw != NULL) { - UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)(*this).GetPixelPtr(0, 0), EfiUgaBltBufferToVideo, + UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)GetPixelPtr(0, 0), EfiUgaBltBufferToVideo, 0, 0, x, y, AreaWidth, AreaHeight, GetWidth()*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); } } -void XImage::Draw(INTN x, INTN y) +void XImage::Draw(INTN x, INTN y) const { Draw(x, y, 0, true); } -void XImage::Draw(INTN x, INTN y, float scale) +void XImage::Draw(INTN x, INTN y, float scale) const { Draw(x, y, scale, true); } -void XImage::Draw(INTN x, INTN y, float scale, XBool Opaque) +void XImage::Draw(INTN x, INTN y, float scale, XBool Opaque) const { //prepare images if (isEmpty()) { @@ -601,7 +601,7 @@ void XImage::Draw(INTN x, INTN y, float scale, XBool Opaque) } -void XImage::DrawOnBack(INTN XPos, INTN YPos, const XImage& Plate) +void XImage::DrawOnBack(INTN XPos, INTN YPos, const XImage& Plate) const { XImage BackLayer(Width, Height); BackLayer.CopyRect(Plate, XPos, YPos); //assume Plate is big enough [XPos+Width, YPos+Height] diff --git a/rEFIt_UEFI/libeg/XImage.h b/rEFIt_UEFI/libeg/XImage.h index f663a7940..69886ad4b 100644 --- a/rEFIt_UEFI/libeg/XImage.h +++ b/rEFIt_UEFI/libeg/XImage.h @@ -90,11 +90,11 @@ public: void GetArea(const EG_RECT& Rect); void GetArea(INTN x, INTN y, UINTN W, UINTN H); - void Draw(INTN x, INTN y, float scale, XBool Opaque); - void Draw(INTN x, INTN y, float scale); //can accept 0 scale as 1.f - void Draw(INTN x, INTN y); - void DrawWithoutCompose(INTN x, INTN y, UINTN width = 0, UINTN height = 0); - void DrawOnBack(INTN x, INTN y, const XImage& Plate); + void Draw(INTN x, INTN y, float scale, XBool Opaque) const; + void Draw(INTN x, INTN y, float scale) const; //can accept 0 scale as 1.f + void Draw(INTN x, INTN y) const; + void DrawWithoutCompose(INTN x, INTN y, UINTN width = 0, UINTN height = 0) const; + void DrawOnBack(INTN x, INTN y, const XImage& Plate) const; //I changed the name because LoadImage is too widely used // will be used instead of old egLoadImage EFI_STATUS LoadXImage(const EFI_FILE *Dir, const XStringW& FileName); //for example LoadImage(ThemeDir, L"icons\\" + Name); diff --git a/rEFIt_UEFI/libeg/XPointer.cpp b/rEFIt_UEFI/libeg/XPointer.cpp index a65a940e7..58ab86db9 100644 --- a/rEFIt_UEFI/libeg/XPointer.cpp +++ b/rEFIt_UEFI/libeg/XPointer.cpp @@ -77,7 +77,7 @@ EFI_STATUS XPointer::MouseBirth() PointerImage = nullptr; } // Now update image because of other theme has other image - PointerImage = new XImage(*ThemeX->GetIconP(BUILTIN_ICON_POINTER)->GetBest(night)); + PointerImage = new XImage(ThemeX->GetIcon(BUILTIN_ICON_POINTER).GetBest(night)); oldImage.setSizeInPixels(PointerImage->GetWidth(), PointerImage->GetHeight()); LastClickTime = 0; diff --git a/rEFIt_UEFI/libeg/XPointer.h b/rEFIt_UEFI/libeg/XPointer.h index 6e6082057..232814b60 100644 --- a/rEFIt_UEFI/libeg/XPointer.h +++ b/rEFIt_UEFI/libeg/XPointer.h @@ -32,7 +32,9 @@ public: XPointer(const XPointer&) = delete; XPointer& operator=(const XPointer&) = delete; - ~XPointer() {}; + ~XPointer() { + delete PointerImage; + }; public: diff --git a/rEFIt_UEFI/libeg/XTheme.cpp b/rEFIt_UEFI/libeg/XTheme.cpp index 0826c7bfc..4e2e283fa 100644 --- a/rEFIt_UEFI/libeg/XTheme.cpp +++ b/rEFIt_UEFI/libeg/XTheme.cpp @@ -795,18 +795,6 @@ const XIcon& XTheme::GetIcon(const XString8& Name) return NullIcon; //if name is not found } -XIcon* XTheme::GetIconP(const XString8& Name) -{ - for (size_t i = 0; i < Icons.size(); i++) - { - if (Icons[i].Name == Name) //night icon has same name as daylight icon - { - return GetIconP(Icons[i].Id); - } - } - return &NullIcon; //if name is not found -} - XBool XTheme::CheckNative(INTN Id) { for (size_t i = 0; i < Icons.size(); i++) @@ -824,11 +812,6 @@ const XIcon& XTheme::GetIcon(INTN Id) return GetIconAlt(Id, -1); } -XIcon* XTheme::GetIconP(INTN Id) -{ - return &GetIconAlt(Id, -1); -} - /* * Get Icon with this ID=id, for example VOL_INTERNAL_HFS * if not found then search for ID=Alt with Native attribute set, for example VOL_INTERNAL @@ -1160,17 +1143,17 @@ void XTheme::FillByDir() //assume ThemeDir is defined by InitTheme() procedure SelectionBackgroundPixel.Blue = (SelectionColor >> 8) & 0xFF; SelectionBackgroundPixel.Reserved = (SelectionColor >> 0) & 0xFF; //TODO - make them XIcon - SelectionImages[2] = *GetIconP(BUILTIN_SELECTION_SMALL)->GetBest(!Daylight); - SelectionImages[0] = *GetIconP(BUILTIN_SELECTION_BIG)->GetBest(!Daylight); + SelectionImages[2] = GetIcon(BUILTIN_SELECTION_SMALL).GetBest(!Daylight); + SelectionImages[0] = GetIcon(BUILTIN_SELECTION_BIG).GetBest(!Daylight); if (BootCampStyle) { - SelectionImages[4] = *GetIconP(BUILTIN_ICON_SELECTION)->GetBest(!Daylight); + SelectionImages[4] = GetIcon(BUILTIN_ICON_SELECTION).GetBest(!Daylight); } //and buttons - Buttons[0] = *GetIconP(BUILTIN_RADIO_BUTTON)->GetBest(!Daylight); - Buttons[1] = *GetIconP(BUILTIN_RADIO_BUTTON_SELECTED)->GetBest(!Daylight); - Buttons[2] = *GetIconP(BUILTIN_CHECKBOX)->GetBest(!Daylight); - Buttons[3] = *GetIconP(BUILTIN_CHECKBOX_CHECKED)->GetBest(!Daylight); + Buttons[0] = GetIcon(BUILTIN_RADIO_BUTTON).GetBest(!Daylight); + Buttons[1] = GetIcon(BUILTIN_RADIO_BUTTON_SELECTED).GetBest(!Daylight); + Buttons[2] = GetIcon(BUILTIN_CHECKBOX).GetBest(!Daylight); + Buttons[3] = GetIcon(BUILTIN_CHECKBOX_CHECKED).GetBest(!Daylight); //load banner and background Banner.LoadXImage(ThemeDir, BannerFileName); @@ -1196,14 +1179,14 @@ void XTheme::InitBar() UpButtonImage.LoadXImage(ThemeDir, "scrollbar\\up_button"); DownButtonImage.LoadXImage(ThemeDir, "scrollbar\\down_button"); } else { - ScrollbarBackgroundImage = *GetIconP("scrollbar_background"_XS8)->GetBest(!Daylight); + ScrollbarBackgroundImage = GetIcon("scrollbar_background"_XS8).GetBest(!Daylight); BarStartImage.setEmpty(); BarEndImage.setEmpty(); - ScrollbarImage = *GetIconP("scrollbar_holder"_XS8)->GetBest(!Daylight); //"_night" is already accounting - ScrollStartImage = *GetIconP("scrollbar_start"_XS8)->GetBest(!Daylight); - ScrollEndImage = *GetIconP("scrollbar_end"_XS8)->GetBest(!Daylight); - UpButtonImage = *GetIconP("scrollbar_up_button"_XS8)->GetBest(!Daylight); - DownButtonImage = *GetIconP("scrollbar_down_button"_XS8)->GetBest(!Daylight); + ScrollbarImage = GetIcon("scrollbar_holder"_XS8).GetBest(!Daylight); //"_night" is already accounting + ScrollStartImage = GetIcon("scrollbar_start"_XS8).GetBest(!Daylight); + ScrollEndImage = GetIcon("scrollbar_end"_XS8).GetBest(!Daylight); + UpButtonImage = GetIcon("scrollbar_up_button"_XS8).GetBest(!Daylight); + DownButtonImage = GetIcon("scrollbar_down_button"_XS8).GetBest(!Daylight); } //some help with embedded scroll diff --git a/rEFIt_UEFI/libeg/XTheme.h b/rEFIt_UEFI/libeg/XTheme.h index 923168697..730c412f2 100644 --- a/rEFIt_UEFI/libeg/XTheme.h +++ b/rEFIt_UEFI/libeg/XTheme.h @@ -160,9 +160,7 @@ public: // const XImage& GetIcon(const char* Name); // const XImage& GetIcon(const CHAR16* Name); const XIcon& GetIcon(const XString8& Name); //get by name - XIcon* GetIconP(const XString8& Name); const XIcon& GetIcon(INTN Id); //get by id - XIcon* GetIconP(INTN Id); //not const XIcon& GetIconAlt(INTN Id, INTN Alt); //if id not found const XIcon& LoadOSIcon(const CHAR16* OSIconName); //TODO make XString provider const XIcon& LoadOSIcon(const XString8& Full);