From 45d94c4877af970a45f2a939d63f56d0cb71b20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 29 Feb 2020 21:51:14 +0100 Subject: [PATCH] Switch all images to dynamic lookup in the atlas by string ID. SLN fix It works, but with the wrong images and the wrong characters! Fix another bug in atlastool's binary output Get Android building again. Oops, didn't mean to disable this permanently. Error checking Minor cleanup Gotta tweak my git ignores... Regenerate metadata --- .gitignore | 4 +- CMakeLists.txt | 5 +- Core/Core.vcxproj | 3 - Core/Core.vcxproj.filters | 6 - Core/Dialog/PSPDialog.cpp | 5 + Core/Dialog/PSPDialog.h | 6 +- Core/Dialog/PSPMsgDialog.cpp | 8 +- Core/Dialog/PSPNetconfDialog.cpp | 2 +- Core/Dialog/PSPOskDialog.cpp | 10 +- Core/Dialog/PSPSaveDialog.cpp | 8 +- Core/Util/PPGeDraw.cpp | 55 ++++--- Core/Util/PPGeDraw.h | 10 +- UI/ComboKeyMappingScreen.cpp | 28 ++-- UI/ControlMappingScreen.cpp | 29 ++-- UI/CwCheatScreen.cpp | 4 +- UI/DisplayLayoutEditor.cpp | 12 +- UI/DisplayLayoutEditor.h | 8 +- UI/DisplayLayoutScreen.cpp | 14 +- UI/EmuScreen.cpp | 38 +++-- UI/GamepadEmu.cpp | 89 +++++------ UI/GamepadEmu.h | 37 ++--- UI/InstallZipScreen.cpp | 1 - UI/MainScreen.cpp | 57 +++---- UI/MiscScreens.cpp | 25 ++-- UI/NativeApp.cpp | 39 +++-- UI/OnScreenDisplay.cpp | 2 +- UI/SavedataScreen.cpp | 1 - UI/TouchControlLayoutScreen.cpp | 71 ++++----- UI/TouchControlVisibilityScreen.cpp | 45 +++--- UI/TouchControlVisibilityScreen.h | 3 +- UI/UI.vcxproj | 4 +- UI/UI.vcxproj.filters | 4 +- UWP/UI_UWP/UI_UWP.vcxproj | 2 - UWP/UI_UWP/UI_UWP.vcxproj.filters | 2 - Windows/PPSSPP.sln | 6 +- android/.gitignore | 5 - android/assets/ppge_atlas.meta | Bin 0 -> 1119232 bytes android/assets/ui_atlas.meta | Bin 0 -> 1087712 bytes android/jni/Android.mk | 2 - assets/ppge_atlas.meta | Bin 1119200 -> 1119232 bytes assets/ui_atlas.meta | Bin 1087680 -> 1087712 bytes build_ppgeatlas.sh | 2 +- buildatlas.sh | 3 +- ext/native/gfx/texture_atlas.cpp | 110 ++++++++++++-- ext/native/gfx/texture_atlas.h | 88 +++++++++-- ext/native/gfx_es2/draw_buffer.cpp | 150 +++++++++++-------- ext/native/gfx_es2/draw_buffer.h | 16 +- ext/native/tools/atlastool.cpp | 27 ++-- ext/native/tools/atlastool/atlastool.vcxproj | 1 + ext/native/ui/view.cpp | 56 ++++--- ext/native/ui/view.h | 49 +++--- 51 files changed, 676 insertions(+), 476 deletions(-) create mode 100644 android/assets/ppge_atlas.meta create mode 100644 android/assets/ui_atlas.meta diff --git a/.gitignore b/.gitignore index 9187343927..c60be9a5f9 100644 --- a/.gitignore +++ b/.gitignore @@ -28,8 +28,6 @@ Windows/ARM64 Windows/ipch Windows/bin-release Windows/win-version.h -ui_atlas.zim.png -ui_atlas_high.zim.png android/assets ext/_Output android/lint.xml @@ -87,9 +85,9 @@ __testfinish.txt __testfailure.bmp GameLogNotes.txt screenshots -android/ui_atlas.zim android/assets/lang android/assets/flash0 +ui_atlas.zim.png ppge_atlas.zim.png local.properties r.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 00e5e3ec0f..99a330ed5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -863,7 +863,6 @@ list(APPEND NativeAppSource UI/CwCheatScreen.cpp UI/InstallZipScreen.cpp UI/ProfilerDraw.cpp - UI/ui_atlas.cpp UI/TextureUtil.cpp UI/ComboKeyMappingScreen.cpp ) @@ -1754,8 +1753,6 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Util/BlockAllocator.h Core/Util/PPGeDraw.cpp Core/Util/PPGeDraw.h - Core/Util/ppge_atlas.cpp - Core/Util/ppge_atlas.h ${CORE_NEON} ${GPU_SOURCES} ext/disarm.cpp @@ -1927,6 +1924,7 @@ endif() set(NativeAssets android/assets/ui_atlas.zim + android/assets/ui_atlas.meta assets/lang assets/shaders assets/Roboto-Condensed.ttf @@ -1935,6 +1933,7 @@ set(NativeAssets assets/gamecontrollerdb.txt assets/langregion.ini assets/ppge_atlas.zim + assets/ppge_atlas.meta assets/rargray.png assets/unknown.png assets/zip.png diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 021cbfb153..720673025c 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -71,7 +71,6 @@ - StaticLibrary @@ -834,7 +833,6 @@ - MaxSpeed true @@ -1166,7 +1164,6 @@ - diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index d1257aa716..19698164c2 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -336,9 +336,6 @@ Util - - Util - HLE\Libraries @@ -1000,9 +997,6 @@ Util - - Util - HLE\Libraries diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 64b5d6197d..9ddc44f630 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -144,8 +144,13 @@ void PSPDialog::DoState(PointerWrap &p) p.Do(isFading); p.Do(fadeIn); p.Do(fadeValue); + + // I don't think we should save these two... Let's just ignore them for now for compat. + int okButtonImg = 0; p.Do(okButtonImg); + int cancelButtonImg = 0; p.Do(cancelButtonImg); + p.Do(okButtonFlag); p.Do(cancelButtonFlag); diff --git a/Core/Dialog/PSPDialog.h b/Core/Dialog/PSPDialog.h index d7875078c3..4de49d27f0 100644 --- a/Core/Dialog/PSPDialog.h +++ b/Core/Dialog/PSPDialog.h @@ -17,6 +17,8 @@ #pragma once +#include "gfx/texture_atlas.h" + #include "Common/Common.h" #include "Common/CommonTypes.h" #include "Common/Swap.h" @@ -112,8 +114,8 @@ protected: bool fadeIn; u32 fadeValue; - int okButtonImg; - int cancelButtonImg; + ImageID okButtonImg; + ImageID cancelButtonImg; int okButtonFlag; int cancelButtonFlag; }; diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index 7ef30d7691..404c375734 100755 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -225,14 +225,14 @@ int PSPMsgDialog::Update(int animSpeed) { UpdateButtons(); UpdateFade(animSpeed); - okButtonImg = I_CIRCLE; - cancelButtonImg = I_CROSS; + okButtonImg = ImageID("I_CIRCLE"); + cancelButtonImg = ImageID("I_CROSS"); okButtonFlag = CTRL_CIRCLE; cancelButtonFlag = CTRL_CROSS; if (messageDialog.common.buttonSwap == 1) { - okButtonImg = I_CROSS; - cancelButtonImg = I_CIRCLE; + okButtonImg = ImageID("I_CROSS"); + cancelButtonImg = ImageID("I_CIRCLE"); okButtonFlag = CTRL_CROSS; cancelButtonFlag = CTRL_CIRCLE; } diff --git a/Core/Dialog/PSPNetconfDialog.cpp b/Core/Dialog/PSPNetconfDialog.cpp index a4f4df8083..9d7a37fc49 100644 --- a/Core/Dialog/PSPNetconfDialog.cpp +++ b/Core/Dialog/PSPNetconfDialog.cpp @@ -71,7 +71,7 @@ int PSPNetconfDialog::Update(int animSpeed) { auto di = GetI18NCategory("Dialog"); auto err = GetI18NCategory("Error"); const float WRAP_WIDTH = 254.0f; - const int confirmBtnImage = g_Config.iButtonPreference == PSP_SYSTEMPARAM_BUTTON_CROSS ? I_CROSS : I_CIRCLE; + const ImageID confirmBtnImage = g_Config.iButtonPreference == PSP_SYSTEMPARAM_BUTTON_CROSS ? ImageID("I_CROSS") : ImageID("I_CIRCLE"); const int confirmBtn = g_Config.iButtonPreference == PSP_SYSTEMPARAM_BUTTON_CROSS ? CTRL_CROSS : CTRL_CIRCLE; if (status == SCE_UTILITY_STATUS_INITIALIZE) { diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index b1b7cde8af..683aaf135a 100755 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -919,15 +919,15 @@ int PSPOskDialog::Update(int animSpeed) { auto di = GetI18NCategory("Dialog"); - PPGeDrawImage(I_SQUARE, 365, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(ImageID("I_SQUARE"), 365, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); PPGeDrawText(di->T("Space"), 390, 222, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); if (g_Config.iButtonPreference != PSP_SYSTEMPARAM_BUTTON_CIRCLE) { - PPGeDrawImage(I_CROSS, 45, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawImage(I_CIRCLE, 45, 247, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(ImageID("I_CROSS"), 45, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(ImageID("I_CIRCLE"), 45, 247, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); } else { - PPGeDrawImage(I_CIRCLE, 45, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawImage(I_CROSS, 45, 247, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(ImageID("I_CIRCLE"), 45, 222, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(ImageID("I_CROSS"), 45, 247, 16, 16, 0, CalcFadedColor(0xFFFFFFFF)); } PPGeDrawText(di->T("Select"), 75, 222, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index e0a27decaf..17fdebd950 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -610,13 +610,13 @@ int PSPSaveDialog::Update(int animSpeed) UpdateButtons(); UpdateFade(animSpeed); - okButtonImg = I_CIRCLE; - cancelButtonImg = I_CROSS; + okButtonImg = ImageID("I_CIRCLE"); + cancelButtonImg = ImageID("I_CROSS"); okButtonFlag = CTRL_CIRCLE; cancelButtonFlag = CTRL_CROSS; if (param.GetPspParam()->common.buttonSwap == 1) { - okButtonImg = I_CROSS; - cancelButtonImg = I_CIRCLE; + okButtonImg = ImageID("I_CROSS"); + cancelButtonImg = ImageID("I_CIRCLE"); okButtonFlag = CTRL_CROSS; cancelButtonFlag = CTRL_CIRCLE; } diff --git a/Core/Util/PPGeDraw.cpp b/Core/Util/PPGeDraw.cpp index d0bd9ae4c7..ccd9abc453 100644 --- a/Core/Util/PPGeDraw.cpp +++ b/Core/Util/PPGeDraw.cpp @@ -18,6 +18,8 @@ #include #include "base/stringutil.h" +#include "file/vfs.h" +#include "gfx/texture_atlas.h" #include "image/zim_load.h" #include "image/png_load.h" #include "util/text/utf8.h" @@ -36,6 +38,8 @@ #include "Core/MemMapHelpers.h" #include "Core/System.h" +Atlas g_ppge_atlas; + static u32 atlasPtr; static int atlasWidth; static int atlasHeight; @@ -190,6 +194,12 @@ void __PPGeInit() return; } + size_t atlas_data_size; + uint8_t *atlas_data; + atlas_data = VFSReadFile("ppge_atlas.meta", &atlas_data_size); + g_ppge_atlas.Load(atlas_data, atlas_data_size); + delete[] atlas_data; + u32 atlasSize = height[0] * width[0] / 2; // it's a 4-bit paletted texture in ram atlasWidth = width[0]; atlasHeight = height[0]; @@ -617,7 +627,7 @@ static AtlasTextMetrics BreakLines(const char *text, const AtlasFont &atlasfont, void PPGeMeasureText(float *w, float *h, int *n, const char *text, float scale, int WrapType, int wrapWidth) { - const AtlasFont &atlasfont = *ppge_atlas.fonts[0]; + const AtlasFont &atlasfont = g_ppge_atlas.fonts[0]; AtlasTextMetrics metrics = BreakLines(text, atlasfont, 0, 0, 0, scale, scale, WrapType, wrapWidth, true); if (w) *w = metrics.maxWidth; if (h) *h = metrics.lineHeight; @@ -626,7 +636,7 @@ void PPGeMeasureText(float *w, float *h, int *n, void PPGePrepareText(const char *text, float x, float y, int align, float scale, float lineHeightScale, int WrapType, int wrapWidth) { - const AtlasFont &atlasfont = *ppge_atlas.fonts[0]; + const AtlasFont &atlasfont = g_ppge_atlas.fonts[0]; char_lines_metrics = BreakLines(text, atlasfont, x, y, align, scale, lineHeightScale, WrapType, wrapWidth, false); } @@ -731,15 +741,16 @@ void PPGeDrawTextWrapped(const char *text, float x, float y, float wrapWidth, fl } // Draws a "4-patch" for button-like things that can be resized -void PPGeDraw4Patch(int atlasImage, float x, float y, float w, float h, u32 color) -{ +void PPGeDraw4Patch(ImageID atlasImage, float x, float y, float w, float h, u32 color) { if (!dlPtr) return; - const AtlasImage &img = ppge_images[atlasImage]; - float borderx = img.w / 20; - float bordery = img.h / 20; - float u1 = img.u1, uhalf = (img.u1 + img.u2) / 2, u2 = img.u2; - float v1 = img.v1, vhalf = (img.v1 + img.v2) / 2, v2 = img.v2; + const AtlasImage *img = g_ppge_atlas.getImage(atlasImage); + if (!img) + return; + float borderx = img->w / 20; + float bordery = img->h / 20; + float u1 = img->u1, uhalf = (img->u1 + img->u2) / 2, u2 = img->u2; + float v1 = img->v1, vhalf = (img->v1 + img->v2) / 2, v2 = img->v2; float xmid1 = x + borderx; float xmid2 = x + w - borderx; float ymid1 = y + bordery; @@ -771,8 +782,7 @@ void PPGeDraw4Patch(int atlasImage, float x, float y, float w, float h, u32 colo EndVertexDataAndDraw(GE_PRIM_RECTANGLES); } -void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color) -{ +void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color) { if (!dlPtr) return; @@ -787,29 +797,32 @@ void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color) } // Just blits an image to the screen, multiplied with the color. -void PPGeDrawImage(int atlasImage, float x, float y, int align, u32 color) +void PPGeDrawImage(ImageID atlasImage, float x, float y, int align, u32 color) { if (!dlPtr) return; - const AtlasImage &img = ppge_atlas.images[atlasImage]; - float w = img.w; - float h = img.h; + const AtlasImage *img = g_ppge_atlas.getImage(atlasImage); + if (!img) { + return; + } + float w = img->w; + float h = img->h; BeginVertexData(); - Vertex(x, y, img.u1, img.v1, atlasWidth, atlasHeight, color); - Vertex(x + w, y + h, img.u2, img.v2, atlasWidth, atlasHeight, color); + Vertex(x, y, img->u1, img->v1, atlasWidth, atlasHeight, color); + Vertex(x + w, y + h, img->u2, img->v2, atlasWidth, atlasHeight, color); EndVertexDataAndDraw(GE_PRIM_RECTANGLES); } -void PPGeDrawImage(int atlasImage, float x, float y, float w, float h, int align, u32 color) +void PPGeDrawImage(ImageID atlasImage, float x, float y, float w, float h, int align, u32 color) { if (!dlPtr) return; - const AtlasImage &img = ppge_atlas.images[atlasImage]; + const AtlasImage *img = g_ppge_atlas.getImage(atlasImage); BeginVertexData(); - Vertex(x, y, img.u1, img.v1, atlasWidth, atlasHeight, color); - Vertex(x + w, y + h, img.u2, img.v2, atlasWidth, atlasHeight, color); + Vertex(x, y, img->u1, img->v1, atlasWidth, atlasHeight, color); + Vertex(x + w, y + h, img->u2, img->v2, atlasWidth, atlasHeight, color); EndVertexDataAndDraw(GE_PRIM_RECTANGLES); } diff --git a/Core/Util/PPGeDraw.h b/Core/Util/PPGeDraw.h index df18dd0dbc..a599c45e37 100644 --- a/Core/Util/PPGeDraw.h +++ b/Core/Util/PPGeDraw.h @@ -19,7 +19,9 @@ #include #include -#include "ppge_atlas.h" + +#include "gfx/texture_atlas.h" + #include "Common/CommonTypes.h" class PointerWrap; @@ -98,11 +100,11 @@ void PPGeDrawText(const char *text, float x, float y, int align, float scale = 1 void PPGeDrawTextWrapped(const char *text, float x, float y, float wrapWidth, float wrapHeight, int align, float scale = 1.0f, u32 color = 0xFFFFFFFF); // Draws a "4-patch" for button-like things that can be resized. -void PPGeDraw4Patch(int atlasImage, float x, float y, float w, float h, u32 color = 0xFFFFFFFF); +void PPGeDraw4Patch(ImageID atlasImage, float x, float y, float w, float h, u32 color = 0xFFFFFFFF); // Just blits an image to the screen, multiplied with the color. -void PPGeDrawImage(int atlasImage, float x, float y, int align, u32 color = 0xFFFFFFFF); -void PPGeDrawImage(int atlasImage, float x, float y, float w, float h, int align, u32 color = 0xFFFFFFFF); +void PPGeDrawImage(ImageID atlasImage, float x, float y, int align, u32 color = 0xFFFFFFFF); +void PPGeDrawImage(ImageID atlasImage, float x, float y, float w, float h, int align, u32 color = 0xFFFFFFFF); void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, u32 color); class PPGeImage { diff --git a/UI/ComboKeyMappingScreen.cpp b/UI/ComboKeyMappingScreen.cpp index 37178dde9b..cdfc3e47f9 100644 --- a/UI/ComboKeyMappingScreen.cpp +++ b/UI/ComboKeyMappingScreen.cpp @@ -17,7 +17,6 @@ #include "TouchControlVisibilityScreen.h" #include "Core/Config.h" -#include "UI/ui_atlas.h" #include "i18n/i18n.h" #include "ComboKeyMappingScreen.h" #include "base/colorutil.h" @@ -25,6 +24,7 @@ #include "base/timeutil.h" #include "file/path.h" #include "gfx_es2/draw_buffer.h" +#include "gfx/texture_atlas.h" #include "math/curves.h" #include "base/stringutil.h" #include "ui/ui_context.h" @@ -41,11 +41,11 @@ void Combo_keyScreen::CreateViews() { LinearLayout *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(120, FILL_PARENT)); auto di = GetI18NCategory("Dialog"); - static const int comboKeyImages[5] = { - I_1, I_2, I_3, I_4, I_5, + static const ImageID comboKeyImages[5] = { + ImageID("I_1"), ImageID("I_2"), ImageID("I_3"), ImageID("I_4"), ImageID("I_5"), }; - comboselect = new ChoiceStrip(ORIENT_VERTICAL, new AnchorLayoutParams(10, 10, NONE, NONE)); + comboselect = new ChoiceStrip(ORIENT_VERTICAL, new AnchorLayoutParams(10, 10, NONE, NONE)); comboselect->SetSpacing(10); for (int i = 0; i < 5; i++) { comboselect->AddChoice(comboKeyImages[i]); @@ -95,15 +95,15 @@ void Combo_keyScreen::CreateViews() { break; } - std::map keyImages; - keyImages["Circle"] = I_CIRCLE; - keyImages["Cross"] = I_CROSS; - keyImages["Square"] = I_SQUARE; - keyImages["Triangle"] = I_TRIANGLE; - keyImages["L"] = I_L; - keyImages["R"] = I_R; - keyImages["Start"] = I_START; - keyImages["Select"] = I_SELECT; + std::map keyImages; + keyImages["Circle"] = ImageID("I_CIRCLE"); + keyImages["Cross"] = ImageID("I_CROSS"); + keyImages["Square"] = ImageID("I_SQUARE"); + keyImages["Triangle"] = ImageID("I_TRIANGLE"); + keyImages["L"] = ImageID("I_L"); + keyImages["R"] = ImageID("I_R"); + keyImages["Start"] = ImageID("I_START"); + keyImages["Select"] = ImageID("I_SELECT"); keyToggles["Circle"] = &array[13]; keyToggles["Cross"] = &array[14]; keyToggles["Square"] = &array[15]; @@ -117,7 +117,7 @@ void Combo_keyScreen::CreateViews() { keyToggles["Start"] = &array[3]; keyToggles["Select"] = &array[0]; - std::map::iterator imageFinder; + std::map::iterator imageFinder; auto mc = GetI18NCategory("MappableControls"); diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index e9649eace1..39a9d5104d 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -22,6 +22,7 @@ #include "base/colorutil.h" #include "base/logging.h" #include "base/display.h" +#include "gfx/texture_atlas.h" #include "i18n/i18n.h" #include "input/keycodes.h" #include "input/input_state.h" @@ -35,7 +36,6 @@ #include "Core/System.h" #include "Common/KeyMap.h" #include "Core/Config.h" -#include "UI/ui_atlas.h" #include "UI/ControlMappingScreen.h" #include "UI/GameSettingsScreen.h" @@ -90,15 +90,15 @@ void ControlMapper::Refresh() { Clear(); auto mc = GetI18NCategory("MappableControls"); - std::map keyImages; - keyImages["Circle"] = I_CIRCLE; - keyImages["Cross"] = I_CROSS; - keyImages["Square"] = I_SQUARE; - keyImages["Triangle"] = I_TRIANGLE; - keyImages["Start"] = I_START; - keyImages["Select"] = I_SELECT; - keyImages["L"] = I_L; - keyImages["R"] = I_R; + std::map keyImages; + keyImages["Circle"] = ImageID("I_CIRCLE"); + keyImages["Cross"] = ImageID("I_CROSS"); + keyImages["Square"] = ImageID("I_SQUARE"); + keyImages["Triangle"] = ImageID("I_TRIANGLE"); + keyImages["Start"] = ImageID("I_START"); + keyImages["Select"] = ImageID("I_SELECT"); + keyImages["L"] = ImageID("I_L"); + keyImages["R"] = ImageID("I_R"); using namespace UI; @@ -465,8 +465,11 @@ private: void JoystickHistoryView::Draw(UIContext &dc) { if (xAxis_ > -1 && yAxis_ > -1) { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[I_CROSS]; - float minRadius = std::min(bounds_.w, bounds_.h) * 0.5f - image.w; + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(ImageID("I_CROSS")); + if (!image) { + return; + } + float minRadius = std::min(bounds_.w, bounds_.h) * 0.5f - image->w; dc.BeginNoTex(); dc.Draw()->RectOutline(bounds_.centerX() - minRadius, bounds_.centerY() - minRadius, minRadius * 2.0f, minRadius * 2.0f, 0x80FFFFFF); dc.Flush(); @@ -479,7 +482,7 @@ void JoystickHistoryView::Draw(UIContext &dc) { if (alpha < 0.0f) { alpha = 0.0f; } - dc.Draw()->DrawImage(I_CROSS, x, y, 0.8f, colorAlpha(0xFFFFFF, alpha), ALIGN_CENTER); + dc.Draw()->DrawImage(ImageID("I_CROSS"), x, y, 0.8f, colorAlpha(0xFFFFFF, alpha), ALIGN_CENTER); a++; } dc.Flush(); diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index 095ec55fb6..f6fefceb45 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include + #include "input/input_state.h" #include "ui/ui.h" #include "util/text/utf8.h" @@ -28,7 +29,6 @@ #include "Core/MIPS/JitCommon/JitCommon.h" #include "UI/OnScreenDisplay.h" -#include "UI/ui_atlas.h" #include "UI/MainScreen.h" #include "UI/EmuScreen.h" @@ -316,7 +316,7 @@ void CheatCheckBox::Draw(UIContext &dc) { int paddingX = 16; int paddingY = 12; - int image = *toggle_ ? dc.theme->checkOn : dc.theme->checkOff; + ImageID image = *toggle_ ? dc.theme->checkOn : dc.theme->checkOff; UI::Style style = dc.theme->itemStyle; if (!IsEnabled()) diff --git a/UI/DisplayLayoutEditor.cpp b/UI/DisplayLayoutEditor.cpp index 882266112f..77da5f407e 100644 --- a/UI/DisplayLayoutEditor.cpp +++ b/UI/DisplayLayoutEditor.cpp @@ -17,13 +17,17 @@ #include #include "ui/ui_context.h" -#include "ui_atlas.h" #include "UI/DisplayLayoutEditor.h" void MultiTouchDisplay::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[img_]; - w = image.w * scale_; - h = image.h * scale_; + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(img_); + if (image) { + w = image->w * scale_; + h = image->h * scale_; + } else { + w = 0.0f; + h = 0.0f; + } } void MultiTouchDisplay::Touch(const TouchInput &input) { diff --git a/UI/DisplayLayoutEditor.h b/UI/DisplayLayoutEditor.h index a6cfefb1cf..6cdd7a454d 100644 --- a/UI/DisplayLayoutEditor.h +++ b/UI/DisplayLayoutEditor.h @@ -16,13 +16,15 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #pragma once + +#include "gfx/texture_atlas.h" #include "gfx_es2/draw_buffer.h" #include "ui/view.h" #include "ui/viewgroup.h" class MultiTouchDisplay : public UI::View { public: - MultiTouchDisplay(int img, float scale, UI::LayoutParams *layoutParams) + MultiTouchDisplay(ImageID img, float scale, UI::LayoutParams *layoutParams) : UI::View(layoutParams), pointerDownMask_(0), scale_(scale), img_(img), angle_(0.0f), flipImageH_(false) { } virtual void Touch(const TouchInput &input) override; @@ -37,14 +39,14 @@ protected: float scale_; private: - int img_; + ImageID img_; float angle_; bool flipImageH_; }; class PSPDisplay : public MultiTouchDisplay { public: - PSPDisplay(int img, float scale, UI::LayoutParams *layoutParams) + PSPDisplay(ImageID img, float scale, UI::LayoutParams *layoutParams) : MultiTouchDisplay(img, scale, layoutParams) { } }; diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index 6a5cedbff5..7cf6bbe7cd 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -18,11 +18,11 @@ #include #include "base/colorutil.h" +#include "gfx/texture_atlas.h" #include "gfx_es2/draw_buffer.h" #include "i18n/i18n.h" #include "ui/ui_context.h" #include "ui/view.h" -#include "ui_atlas.h" #include "DisplayLayoutScreen.h" #include "Core/Config.h" @@ -40,8 +40,8 @@ static float local_dp_yres; class DragDropDisplay : public MultiTouchDisplay { public: - DragDropDisplay(float &x, float &y, int img, float &scale) - : MultiTouchDisplay(img, scale, new UI::AnchorLayoutParams(x*local_dp_xres, y*local_dp_yres, UI::NONE, UI::NONE, true)), + DragDropDisplay(float &x, float &y, ImageID img, float &scale) + : MultiTouchDisplay(img, scale, new UI::AnchorLayoutParams(x * local_dp_xres, y * local_dp_yres, UI::NONE, UI::NONE, true)), x_(x), y_(y), theScale_(scale) { scale_ = theScale_; } @@ -73,7 +73,9 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { using namespace UI; int mode = mode_ ? mode_->GetSelection() : 0; - if (g_Config.iSmallDisplayZoomType == (int)SmallDisplayZoom::AUTO) { mode = -1; } + if (g_Config.iSmallDisplayZoomType == (int)SmallDisplayZoom::AUTO) { + mode = -1; + } const Bounds &screen_bounds = screenManager()->getUIContext()->GetBounds(); if ((touch.flags & TOUCH_MOVE) && picked_ != 0) { @@ -304,11 +306,11 @@ void DisplayLayoutScreen::CreateViews() { mode_->AddChoice(di->T("Resize")); mode_->SetSelection(0); } - displayRepresentation_ = new DragDropDisplay(g_Config.fSmallDisplayOffsetX, g_Config.fSmallDisplayOffsetY, I_PSP_DISPLAY, displayRepresentationScale_); + displayRepresentation_ = new DragDropDisplay(g_Config.fSmallDisplayOffsetX, g_Config.fSmallDisplayOffsetY, ImageID("I_PSP_DISPLAY"), displayRepresentationScale_); displayRepresentation_->SetVisibility(V_VISIBLE); } else { // Stretching label = new HighlightLabel(gr->T("Stretching"), new AnchorLayoutParams(WRAP_CONTENT, 64.0f, local_dp_xres / 2.0f, local_dp_yres / 2.0f, NONE, NONE, true)); - displayRepresentation_ = new DragDropDisplay(g_Config.fSmallDisplayOffsetX, g_Config.fSmallDisplayOffsetY, I_PSP_DISPLAY, displayRepresentationScale_); + displayRepresentation_ = new DragDropDisplay(g_Config.fSmallDisplayOffsetX, g_Config.fSmallDisplayOffsetY, ImageID("I_PSP_DISPLAY"), displayRepresentationScale_); displayRepresentation_->SetVisibility(V_INVISIBLE); float width = previewWidth; float height = previewHeight; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index c4e3574ede..6e5b51acd2 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -24,6 +24,7 @@ #include "base/timeutil.h" #include "profiler/profiler.h" +#include "gfx/texture_atlas.h" #include "gfx_es2/gpu_features.h" #include "gfx_es2/draw_text.h" @@ -62,7 +63,6 @@ #include "Core/MIPS/MIPS.h" #include "Core/HLE/__sceAudio.h" -#include "UI/ui_atlas.h" #include "UI/BackgroundAudio.h" #include "UI/OnScreenDisplay.h" #include "UI/GamepadEmu.h" @@ -988,12 +988,13 @@ void EmuScreen::CreateViews() { TextView *loadingTextView = root_->Add(new TextView(sc->T(PSP_GetLoading()), new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 40, true))); loadingTextView_ = loadingTextView; - static const int symbols[4] = { - I_CROSS, - I_CIRCLE, - I_SQUARE, - I_TRIANGLE + static const ImageID symbols[4] = { + ImageID("I_CROSS"), + ImageID("I_CIRCLE"), + ImageID("I_SQUARE"), + ImageID("I_TRIANGLE"), }; + Spinner *loadingSpinner = root_->Add(new Spinner(symbols, ARRAY_SIZE(symbols), new AnchorLayoutParams(NONE, NONE, 45, 45, true))); loadingSpinner_ = loadingSpinner; @@ -1140,19 +1141,22 @@ void EmuScreen::checkPowerDown() { } static void DrawDebugStats(DrawBuffer *draw2d) { + FontID ubuntu24("UBUNTU24"); + char statbuf[4096]; __DisplayGetDebugStats(statbuf, sizeof(statbuf)); draw2d->SetFontScale(.7f, .7f); - draw2d->DrawText(UBUNTU24, statbuf, 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); - draw2d->DrawText(UBUNTU24, statbuf, 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); __SasGetDebugStats(statbuf, sizeof(statbuf)); - draw2d->DrawText(UBUNTU24, statbuf, PSP_CoreParameter().pixelWidth / 2 + 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); - draw2d->DrawText(UBUNTU24, statbuf, PSP_CoreParameter().pixelWidth / 2 + 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, PSP_CoreParameter().pixelWidth / 2 + 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, PSP_CoreParameter().pixelWidth / 2 + 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); draw2d->SetFontScale(1.0f, 1.0f); } static void DrawAudioDebugStats(DrawBuffer *draw2d) { + FontID ubuntu24("UBUNTU24"); char statbuf[1024] = { 0 }; const AudioDebugStats *stats = __AudioGetDebugStats(); snprintf(statbuf, sizeof(statbuf), @@ -1167,12 +1171,13 @@ static void DrawAudioDebugStats(DrawBuffer *draw2d) { stats->instantSampleRate, stats->lastPushSize); draw2d->SetFontScale(0.7f, 0.7f); - draw2d->DrawText(UBUNTU24, statbuf, 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); - draw2d->DrawText(UBUNTU24, statbuf, 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, 11, 31, 0xc0000000, FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, statbuf, 10, 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); draw2d->SetFontScale(1.0f, 1.0f); } static void DrawFPS(DrawBuffer *draw2d, const Bounds &bounds) { + FontID ubuntu24("UBUNTU24"); float vps, fps, actual_fps; __DisplayGetFPS(&vps, &fps, &actual_fps); char fpsbuf[256]; @@ -1188,12 +1193,13 @@ static void DrawFPS(DrawBuffer *draw2d, const Bounds &bounds) { } draw2d->SetFontScale(0.7f, 0.7f); - draw2d->DrawText(UBUNTU24, fpsbuf, bounds.x2() - 8, 12, 0xc0000000, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); - draw2d->DrawText(UBUNTU24, fpsbuf, bounds.x2() - 10, 10, 0xFF3fFF3f, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, fpsbuf, bounds.x2() - 8, 12, 0xc0000000, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); + draw2d->DrawText(ubuntu24, fpsbuf, bounds.x2() - 10, 10, 0xFF3fFF3f, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); draw2d->SetFontScale(1.0f, 1.0f); } static void DrawFrameTimes(UIContext *ctx) { + FontID ubuntu24("UBUNTU24"); int valid, pos; double *sleepHistory; double *history = __DisplayGetFrameTimes(&valid, &pos, &sleepHistory); @@ -1216,8 +1222,8 @@ static void DrawFrameTimes(UIContext *ctx) { ctx->Flush(); ctx->Begin(); ctx->Draw()->SetFontScale(0.5f, 0.5f); - ctx->Draw()->DrawText(UBUNTU24, "33.3ms", width, bottom - 0.0333*scale, 0xFF3f3Fff, ALIGN_BOTTOMLEFT | FLAG_DYNAMIC_ASCII); - ctx->Draw()->DrawText(UBUNTU24, "16.7ms", width, bottom - 0.0167*scale, 0xFF3f3Fff, ALIGN_BOTTOMLEFT | FLAG_DYNAMIC_ASCII); + ctx->Draw()->DrawText(ubuntu24, "33.3ms", width, bottom - 0.0333*scale, 0xFF3f3Fff, ALIGN_BOTTOMLEFT | FLAG_DYNAMIC_ASCII); + ctx->Draw()->DrawText(ubuntu24, "16.7ms", width, bottom - 0.0167*scale, 0xFF3f3Fff, ALIGN_BOTTOMLEFT | FLAG_DYNAMIC_ASCII); ctx->Draw()->SetFontScale(1.0f, 1.0f); } diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 33074604af..421914a7b2 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -22,11 +22,11 @@ #include "Core/System.h" #include "Core/HLE/sceCtrl.h" #include "UI/GamepadEmu.h" -#include "UI/ui_atlas.h" #include "base/colorutil.h" #include "base/display.h" #include "base/NativeApp.h" #include "base/timeutil.h" +#include "gfx/texture_atlas.h" #include "math/math_util.h" #include "ui/ui_context.h" @@ -70,9 +70,14 @@ float GamepadView::GetButtonOpacity() { } void MultiTouchButton::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[bgImg_]; - w = image.w * scale_; - h = image.h * scale_; + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(bgImg_); + if (image) { + w = image->w * scale_; + h = image->h * scale_; + } else { + w = 0.0f; + h = 0.0f; + } } void MultiTouchButton::Touch(const TouchInput &input) { @@ -123,7 +128,7 @@ void MultiTouchButton::Draw(UIContext &dc) { int y = bounds_.centerY(); // Hack round the fact that the center of the rectangular picture the triangle is contained in // is not at the "weight center" of the triangle. - if (img_ == I_TRIANGLE) + if (img_ == ImageID("I_TRIANGLE")) y -= 2.8f * scale; dc.Draw()->DrawImageRotated(img_, bounds_.centerX(), y, scale, angle_ * (M_PI * 2 / 360.0f), color); } @@ -222,7 +227,7 @@ bool PSPButton::IsDown() { return (__CtrlPeekButtons() & pspButtonBit_) != 0; } -PSPDpad::PSPDpad(int arrowIndex, int arrowDownIndex, int overlayIndex, float scale, float spacing, UI::LayoutParams *layoutParams) +PSPDpad::PSPDpad(ImageID arrowIndex, ImageID arrowDownIndex, ImageID overlayIndex, float scale, float spacing, UI::LayoutParams *layoutParams) : GamepadView(layoutParams), arrowIndex_(arrowIndex), arrowDownIndex_(arrowDownIndex), overlayIndex_(overlayIndex), scale_(scale), spacing_(spacing), dragPointerId_(-1), down_(0) { } @@ -347,20 +352,18 @@ void PSPDpad::Draw(UIContext &dc) { uint32_t color = colorAlpha(0xFFFFFF, imgOpacity); dc.Draw()->DrawImageRotated(arrowIndex_, x, y, imgScale, angle + PI, colorBg, false); - if (overlayIndex_ != -1) + if (overlayIndex_.isValid()) dc.Draw()->DrawImageRotated(overlayIndex_, x2, y2, imgScale, angle + PI, color); } } -PSPStick::PSPStick(int bgImg, int stickImg, int stickDownImg, int stick, float scale, UI::LayoutParams *layoutParams) +PSPStick::PSPStick(ImageID bgImg, ImageID stickImg, ImageID stickDownImg, int stick, float scale, UI::LayoutParams *layoutParams) : GamepadView(layoutParams), dragPointerId_(-1), bgImg_(bgImg), stickImageIndex_(stickImg), stickDownImg_(stickDownImg), stick_(stick), scale_(scale), centerX_(-1), centerY_(-1) { stick_size_ = 50; } void PSPStick::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[bgImg_]; - w = image.w; - h = image.h; + dc.Draw()->GetAtlas()->measureImage(bgImg_, &w, &h); } void PSPStick::Draw(UIContext &dc) { @@ -591,34 +594,34 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause) { const int halfW = xres / 2; - const int roundImage = g_Config.iTouchButtonStyle ? I_ROUND_LINE : I_ROUND; + const ImageID roundImage = g_Config.iTouchButtonStyle ? ImageID("I_ROUND_LINE") : ImageID("I_ROUND"); - const int rectImage = g_Config.iTouchButtonStyle ? I_RECT_LINE : I_RECT; - const int shoulderImage = g_Config.iTouchButtonStyle ? I_SHOULDER_LINE : I_SHOULDER; - const int dirImage = g_Config.iTouchButtonStyle ? I_DIR_LINE : I_DIR; - const int stickImage = g_Config.iTouchButtonStyle ? I_STICK_LINE : I_STICK; - const int stickBg = g_Config.iTouchButtonStyle ? I_STICK_BG_LINE : I_STICK_BG; - static const int comboKeyImages[5] = { I_1, I_2, I_3, I_4, I_5 }; + const ImageID rectImage = g_Config.iTouchButtonStyle ? ImageID("I_RECT_LINE") : ImageID("I_RECT"); + const ImageID shoulderImage = g_Config.iTouchButtonStyle ? ImageID("I_SHOULDER_LINE") : ImageID("I_SHOULDER"); + const ImageID dirImage = g_Config.iTouchButtonStyle ? ImageID("I_DIR_LINE") : ImageID("I_DIR"); + const ImageID stickImage = g_Config.iTouchButtonStyle ? ImageID("I_STICK_LINE") : ImageID("I_STICK"); + const ImageID stickBg = g_Config.iTouchButtonStyle ? ImageID("I_STICK_BG_LINE") : ImageID("I_STICK_BG"); + static const ImageID comboKeyImages[5] = { ImageID("I_1"), ImageID("I_2"), ImageID("I_3"), ImageID("I_4"), ImageID("I_5") }; - auto addPSPButton = [=](int buttonBit, int bgImg, int bgDownImg, int img, const ConfigTouchPos &touch, ButtonOffset off = { 0, 0 }) -> PSPButton * { + auto addPSPButton = [=](int buttonBit, ImageID bgImg, ImageID bgDownImg, ImageID img, const ConfigTouchPos &touch, ButtonOffset off = { 0, 0 }) -> PSPButton * { if (touch.show) { return root->Add(new PSPButton(buttonBit, bgImg, bgDownImg, img, touch.scale, buttonLayoutParams(touch, off))); } return nullptr; }; - auto addComboKey = [=](int buttonBit, bool toggle, int bgImg, int bgDownImg, int img, const ConfigTouchPos &touch) -> ComboKey * { + auto addComboKey = [=](int buttonBit, bool toggle, ImageID bgImg, ImageID bgDownImg, ImageID img, const ConfigTouchPos &touch) -> ComboKey * { if (touch.show) { return root->Add(new ComboKey(buttonBit, toggle, bgImg, bgDownImg, img, touch.scale, buttonLayoutParams(touch))); } return nullptr; }; - auto addBoolButton = [=](bool *value, int bgImg, int bgDownImg, int img, const ConfigTouchPos &touch) -> BoolButton * { + auto addBoolButton = [=](bool *value, ImageID bgImg, ImageID bgDownImg, ImageID img, const ConfigTouchPos &touch) -> BoolButton * { if (touch.show) { return root->Add(new BoolButton(value, bgImg, bgDownImg, img, touch.scale, buttonLayoutParams(touch))); } return nullptr; }; - auto addFPSLimitButton = [=](FPSLimit value, int bgImg, int bgDownImg, int img, const ConfigTouchPos &touch) -> FPSLimitButton * { + auto addFPSLimitButton = [=](FPSLimit value, ImageID bgImg, ImageID bgDownImg, ImageID img, const ConfigTouchPos &touch) -> FPSLimitButton * { if (touch.show) { return root->Add(new FPSLimitButton(value, bgImg, bgDownImg, img, touch.scale, buttonLayoutParams(touch))); } @@ -626,23 +629,23 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause) { }; if (!System_GetPropertyBool(SYSPROP_HAS_BACK_BUTTON) || g_Config.bShowTouchPause) { - root->Add(new BoolButton(pause, roundImage, I_ROUND, I_ARROW, 1.0f, new AnchorLayoutParams(halfW, 20, NONE, NONE, true)))->SetAngle(90); + root->Add(new BoolButton(pause, roundImage, ImageID("I_ROUND"), ImageID("I_ARROW"), 1.0f, new AnchorLayoutParams(halfW, 20, NONE, NONE, true)))->SetAngle(90); } // touchActionButtonCenter.show will always be true, since that's the default. if (g_Config.bShowTouchCircle) - addPSPButton(CTRL_CIRCLE, roundImage, I_ROUND, I_CIRCLE, g_Config.touchActionButtonCenter, circleOffset); + addPSPButton(CTRL_CIRCLE, roundImage, ImageID("I_ROUND"), ImageID("I_CIRCLE"), g_Config.touchActionButtonCenter, circleOffset); if (g_Config.bShowTouchCross) - addPSPButton(CTRL_CROSS, roundImage, I_ROUND, I_CROSS, g_Config.touchActionButtonCenter, crossOffset); + addPSPButton(CTRL_CROSS, roundImage, ImageID("I_ROUND"), ImageID("I_CROSS"), g_Config.touchActionButtonCenter, crossOffset); if (g_Config.bShowTouchTriangle) - addPSPButton(CTRL_TRIANGLE, roundImage, I_ROUND, I_TRIANGLE, g_Config.touchActionButtonCenter, triangleOffset); + addPSPButton(CTRL_TRIANGLE, roundImage, ImageID("I_ROUND"), ImageID("I_TRIANGLE"), g_Config.touchActionButtonCenter, triangleOffset); if (g_Config.bShowTouchSquare) - addPSPButton(CTRL_SQUARE, roundImage, I_ROUND, I_SQUARE, g_Config.touchActionButtonCenter, squareOffset); + addPSPButton(CTRL_SQUARE, roundImage, ImageID("I_ROUND"), ImageID("I_SQUARE"), g_Config.touchActionButtonCenter, squareOffset); - addPSPButton(CTRL_START, rectImage, I_RECT, I_START, g_Config.touchStartKey); - addPSPButton(CTRL_SELECT, rectImage, I_RECT, I_SELECT, g_Config.touchSelectKey); + addPSPButton(CTRL_START, rectImage, ImageID("I_RECT"), ImageID("I_START"), g_Config.touchStartKey); + addPSPButton(CTRL_SELECT, rectImage, ImageID("I_RECT"), ImageID("I_SELECT"), g_Config.touchSelectKey); - BoolButton *unthrottle = addBoolButton(&PSP_CoreParameter().unthrottle, rectImage, I_RECT, I_ARROW, g_Config.touchUnthrottleKey); + BoolButton *unthrottle = addBoolButton(&PSP_CoreParameter().unthrottle, rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchUnthrottleKey); if (unthrottle) { unthrottle->SetAngle(180.0f); unthrottle->OnChange.Add([](UI::EventParams &e) { @@ -654,36 +657,36 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause) { } if (g_Config.touchRapidFireKey.show) { - auto rapidFire = root->Add(new RapidFireButton(rectImage, I_RECT, I_ARROW, g_Config.touchRapidFireKey.scale, buttonLayoutParams(g_Config.touchRapidFireKey))); + auto rapidFire = root->Add(new RapidFireButton(rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchRapidFireKey.scale, buttonLayoutParams(g_Config.touchRapidFireKey))); rapidFire->SetAngle(90.0f, 180.0f); } - FPSLimitButton *speed1 = addFPSLimitButton(FPSLimit::CUSTOM1, rectImage, I_RECT, I_ARROW, g_Config.touchSpeed1Key); + FPSLimitButton *speed1 = addFPSLimitButton(FPSLimit::CUSTOM1, rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchSpeed1Key); if (speed1) speed1->SetAngle(170.0f, 180.0f); - FPSLimitButton *speed2 = addFPSLimitButton(FPSLimit::CUSTOM2, rectImage, I_RECT, I_ARROW, g_Config.touchSpeed2Key); + FPSLimitButton *speed2 = addFPSLimitButton(FPSLimit::CUSTOM2, rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchSpeed2Key); if (speed2) speed2->SetAngle(190.0f, 180.0f); - addPSPButton(CTRL_LTRIGGER, shoulderImage, I_SHOULDER, I_L, g_Config.touchLKey); - PSPButton *rTrigger = addPSPButton(CTRL_RTRIGGER, shoulderImage, I_SHOULDER, I_R, g_Config.touchRKey); + addPSPButton(CTRL_LTRIGGER, shoulderImage, ImageID("I_SHOULDER"), ImageID("I_L"), g_Config.touchLKey); + PSPButton *rTrigger = addPSPButton(CTRL_RTRIGGER, shoulderImage, ImageID("I_SHOULDER"), ImageID("I_R"), g_Config.touchRKey); if (rTrigger) rTrigger->FlipImageH(true); if (g_Config.touchDpad.show) - root->Add(new PSPDpad(dirImage, I_DIR, I_ARROW, g_Config.touchDpad.scale, g_Config.fDpadSpacing, buttonLayoutParams(g_Config.touchDpad))); + root->Add(new PSPDpad(dirImage, ImageID("I_DIR"), ImageID("I_ARROW"), g_Config.touchDpad.scale, g_Config.fDpadSpacing, buttonLayoutParams(g_Config.touchDpad))); if (g_Config.touchAnalogStick.show) - root->Add(new PSPStick(stickBg, stickImage, I_STICK, 0, g_Config.touchAnalogStick.scale, buttonLayoutParams(g_Config.touchAnalogStick))); + root->Add(new PSPStick(stickBg, stickImage, ImageID("I_STICK"), 0, g_Config.touchAnalogStick.scale, buttonLayoutParams(g_Config.touchAnalogStick))); if (g_Config.touchRightAnalogStick.show) - root->Add(new PSPStick(stickBg, stickImage, I_STICK, 1, g_Config.touchRightAnalogStick.scale, buttonLayoutParams(g_Config.touchRightAnalogStick))); + root->Add(new PSPStick(stickBg, stickImage, ImageID("I_STICK"), 1, g_Config.touchRightAnalogStick.scale, buttonLayoutParams(g_Config.touchRightAnalogStick))); - addComboKey(g_Config.iCombokey0, g_Config.bComboToggle0, roundImage, I_ROUND, comboKeyImages[0], g_Config.touchCombo0); - addComboKey(g_Config.iCombokey1, g_Config.bComboToggle1, roundImage, I_ROUND, comboKeyImages[1], g_Config.touchCombo1); - addComboKey(g_Config.iCombokey2, g_Config.bComboToggle2, roundImage, I_ROUND, comboKeyImages[2], g_Config.touchCombo2); - addComboKey(g_Config.iCombokey3, g_Config.bComboToggle3, roundImage, I_ROUND, comboKeyImages[3], g_Config.touchCombo3); - addComboKey(g_Config.iCombokey4, g_Config.bComboToggle4, roundImage, I_ROUND, comboKeyImages[4], g_Config.touchCombo4); + addComboKey(g_Config.iCombokey0, g_Config.bComboToggle0, roundImage, ImageID("I_ROUND"), comboKeyImages[0], g_Config.touchCombo0); + addComboKey(g_Config.iCombokey1, g_Config.bComboToggle1, roundImage, ImageID("I_ROUND"), comboKeyImages[1], g_Config.touchCombo1); + addComboKey(g_Config.iCombokey2, g_Config.bComboToggle2, roundImage, ImageID("I_ROUND"), comboKeyImages[2], g_Config.touchCombo2); + addComboKey(g_Config.iCombokey3, g_Config.bComboToggle3, roundImage, ImageID("I_ROUND"), comboKeyImages[3], g_Config.touchCombo3); + addComboKey(g_Config.iCombokey4, g_Config.bComboToggle4, roundImage, ImageID("I_ROUND"), comboKeyImages[4], g_Config.touchCombo4); return root; } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 51b8e2f6b4..83c985cba9 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -43,7 +43,7 @@ protected: class MultiTouchButton : public GamepadView { public: - MultiTouchButton(int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) + MultiTouchButton(ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) : GamepadView(layoutParams), scale_(scale), bgImg_(bgImg), bgDownImg_(bgDownImg), img_(img) { } @@ -61,9 +61,9 @@ protected: float scale_; private: - int bgImg_; - int bgDownImg_; - int img_; + ImageID bgImg_; + ImageID bgDownImg_; + ImageID img_; float bgAngle_ = 0.0f; float angle_ = 0.0f; bool flipImageH_ = false; @@ -71,7 +71,7 @@ private: class BoolButton : public MultiTouchButton { public: - BoolButton(bool *value, int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) + BoolButton(bool *value, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams), value_(value) { } @@ -86,7 +86,7 @@ private: class FPSLimitButton : public MultiTouchButton { public: - FPSLimitButton(FPSLimit limit, int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) + FPSLimitButton(FPSLimit limit, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams), limit_(limit) { } @@ -99,7 +99,7 @@ private: class RapidFireButton : public MultiTouchButton { public: - RapidFireButton(int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) + RapidFireButton(ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams) { } void Touch(const TouchInput &input) override; @@ -108,7 +108,7 @@ public: class PSPButton : public MultiTouchButton { public: - PSPButton(int pspButtonBit, int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) + PSPButton(int pspButtonBit, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit) { } void Touch(const TouchInput &input) override; @@ -120,7 +120,7 @@ private: class PSPDpad : public GamepadView { public: - PSPDpad(int arrowIndex, int arrowDownIndex, int overlayIndex, float scale, float spacing, UI::LayoutParams *layoutParams); + PSPDpad(ImageID arrowIndex, ImageID arrowDownIndex, ImageID overlayIndex, float scale, float spacing, UI::LayoutParams *layoutParams); void Touch(const TouchInput &input) override; void Draw(UIContext &dc) override; @@ -128,9 +128,9 @@ public: private: void ProcessTouch(float x, float y, bool down); - int arrowIndex_; - int arrowDownIndex_; - int overlayIndex_; + ImageID arrowIndex_; + ImageID arrowDownIndex_; + ImageID overlayIndex_; float scale_; float spacing_; @@ -141,7 +141,7 @@ private: class PSPStick : public GamepadView { public: - PSPStick(int bgImg, int stickImg, int stickDownImg, int stick, float scale, UI::LayoutParams *layoutParams); + PSPStick(ImageID bgImg, ImageID stickImg, ImageID stickDownImg, int stick, float scale, UI::LayoutParams *layoutParams); void Touch(const TouchInput &input) override; void Draw(UIContext &dc) override; @@ -151,9 +151,10 @@ private: void ProcessTouch(float x, float y, bool down); int dragPointerId_; - int bgImg_; - int stickImageIndex_; - int stickDownImg_; + ImageID bgImg_; + ImageID stickImageIndex_; + ImageID stickDownImg_; + int stick_; float stick_size_; float scale_; @@ -172,8 +173,8 @@ const int baseActionButtonSpacing = 60; class ComboKey : public MultiTouchButton { public: - ComboKey(int pspButtonBit, bool toggle, int bgImg, int bgDownImg, int img, float scale, UI::LayoutParams *layoutParams) - : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit), toggle_(toggle) { + ComboKey(int pspButtonBit, bool toggle, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) + : MultiTouchButton(bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit) { } void Touch(const TouchInput &input) override; private: diff --git a/UI/InstallZipScreen.cpp b/UI/InstallZipScreen.cpp index a815e01b7a..2a7bda7d1c 100644 --- a/UI/InstallZipScreen.cpp +++ b/UI/InstallZipScreen.cpp @@ -20,7 +20,6 @@ #include "ui/ui.h" #include "ui/view.h" #include "ui/viewgroup.h" -#include "UI/ui_atlas.h" #include "file/file_util.h" #include "Common/StringUtils.h" diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 7fdb8f49c1..9568948291 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -23,6 +23,7 @@ #include "base/display.h" #include "base/timeutil.h" #include "file/path.h" +#include "gfx/texture_atlas.h" #include "gfx_es2/draw_buffer.h" #include "math/curves.h" #include "base/stringutil.h" @@ -48,7 +49,6 @@ #include "UI/DisplayLayoutScreen.h" #include "UI/SavedataScreen.h" #include "UI/Store.h" -#include "UI/ui_atlas.h" #include "Core/Config.h" #include "Core/Loaders.h" #include "GPU/GPUInterface.h" @@ -372,25 +372,32 @@ void GameButton::Draw(UIContext &dc) { dc.Draw()->Flush(); } if (ginfo->hasConfig && !ginfo->id.empty()) { - if (gridStyle_) { - dc.Draw()->DrawImage(I_GEAR, x, y + h - ui_images[I_GEAR].h, 1.0f); - } else { - dc.Draw()->DrawImage(I_GEAR, x - ui_images[I_GEAR].w, y, 1.0f); + const AtlasImage *gearImage = dc.Draw()->GetAtlas()->getImage(ImageID("I_GEAR")); + if (gearImage) { + if (gridStyle_) { + dc.Draw()->DrawImage(ImageID("I_GEAR"), x, y + h - gearImage->h, 1.0f); + } else { + dc.Draw()->DrawImage(ImageID("I_GEAR"), x - gearImage->w, y, 1.0f); + } } } if (g_Config.bShowRegionOnGameIcon && ginfo->region >= 0 && ginfo->region < GAMEREGION_MAX && ginfo->region != GAMEREGION_OTHER) { - static const int regionIcons[GAMEREGION_MAX] = { - I_FLAG_JP, - I_FLAG_US, - I_FLAG_EU, - I_FLAG_HK, - I_FLAG_AS, - I_FLAG_KO + const ImageID regionIcons[GAMEREGION_MAX] = { + ImageID("I_FLAG_JP"), + ImageID("I_FLAG_US"), + ImageID("I_FLAG_EU"), + ImageID("I_FLAG_HK"), + ImageID("I_FLAG_AS"), + ImageID("I_FLAG_KO"), + ImageID::invalid(), }; - if (gridStyle_) { - dc.Draw()->DrawImage(regionIcons[ginfo->region], x + w - ui_images[regionIcons[ginfo->region]].w - 5, y + h - ui_images[regionIcons[ginfo->region]].h - 5, 1.0f); - } else { - dc.Draw()->DrawImage(regionIcons[ginfo->region], x - 2 - ui_images[regionIcons[ginfo->region]].w - 3, y + h - ui_images[regionIcons[ginfo->region]].h - 5, 1.0f); + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(regionIcons[ginfo->region]); + if (image) { + if (gridStyle_) { + dc.Draw()->DrawImage(regionIcons[ginfo->region], x + w - image->w - 5, y + h - image->h - 5, 1.0f); + } else { + dc.Draw()->DrawImage(regionIcons[ginfo->region], x - 2 - image->w - 3, y + h - image->h - 5, 1.0f); + } } } if (gridStyle_ && g_Config.bShowIDOnGameIcon) { @@ -439,9 +446,9 @@ void DirButton::Draw(UIContext &dc) { const std::string text = GetText(); - int image = I_FOLDER; + ImageID image = ImageID("I_FOLDER"); if (text == "..") { - image = I_UP_DIRECTORY; + image = ImageID("I_UP_DIRECTORY"); } float tw, th; @@ -452,7 +459,7 @@ void DirButton::Draw(UIContext &dc) { if (compact) { // No icon, except "up" dc.PushScissor(bounds_); - if (image == I_FOLDER) { + if (image == ImageID("I_FOLDER")) { dc.DrawText(text.c_str(), bounds_.x + 5, bounds_.centerY(), style.fgColor, ALIGN_VCENTER); } else { dc.Draw()->DrawImage(image, bounds_.centerX(), bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); @@ -577,8 +584,8 @@ void GameBrowser::Refresh() { } ChoiceStrip *layoutChoice = topBar->Add(new ChoiceStrip(ORIENT_HORIZONTAL)); - layoutChoice->AddChoice(I_GRID); - layoutChoice->AddChoice(I_LINES); + layoutChoice->AddChoice(ImageID("I_GRID")); + layoutChoice->AddChoice(ImageID("I_LINES")); layoutChoice->SetSelection(*gridStyle_ ? 0 : 1); layoutChoice->OnChoice.Handle(this, &GameBrowser::LayoutChange); Add(topBar); @@ -945,11 +952,11 @@ void MainScreen::CreateViews() { rightColumnItems->SetSpacing(0.0f); LinearLayout *logos = new LinearLayout(ORIENT_HORIZONTAL); if (System_GetPropertyBool(SYSPROP_APP_GOLD)) { - logos->Add(new ImageView(I_ICONGOLD, IS_DEFAULT, new AnchorLayoutParams(64, 64, 10, 10, NONE, NONE, false))); + logos->Add(new ImageView(ImageID("I_ICONGOLD"), IS_DEFAULT, new AnchorLayoutParams(64, 64, 10, 10, NONE, NONE, false))); } else { - logos->Add(new ImageView(I_ICON, IS_DEFAULT, new AnchorLayoutParams(64, 64, 10, 10, NONE, NONE, false))); + logos->Add(new ImageView(ImageID("I_ICON"), IS_DEFAULT, new AnchorLayoutParams(64, 64, 10, 10, NONE, NONE, false))); } - logos->Add(new ImageView(I_LOGO, IS_DEFAULT, new LinearLayoutParams(Margins(-12, 0, 0, 0)))); + logos->Add(new ImageView(ImageID("I_LOGO"), IS_DEFAULT, new LinearLayoutParams(Margins(-12, 0, 0, 0)))); rightColumnItems->Add(logos); TextView *ver = rightColumnItems->Add(new TextView(versionString, new LinearLayoutParams(Margins(70, -6, 0, 0)))); ver->SetSmall(true); @@ -963,7 +970,7 @@ void MainScreen::CreateViews() { if (!System_GetPropertyBool(SYSPROP_APP_GOLD)) { Choice *gold = rightColumnItems->Add(new Choice(mm->T("Buy PPSSPP Gold"))); gold->OnClick.Handle(this, &MainScreen::OnSupport); - gold->SetIcon(I_ICONGOLD); + gold->SetIcon(ImageID("I_ICONGOLD")); } #if !PPSSPP_PLATFORM(UWP) diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 106be32e5b..7fc27f301c 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -32,7 +32,6 @@ #include "ui/ui.h" #include "util/random/rng.h" #include "file/vfs.h" -#include "UI/ui_atlas.h" #include "UI/ControlMappingScreen.h" #include "UI/DisplayLayoutScreen.h" #include "UI/EmuScreen.h" @@ -49,17 +48,15 @@ #include "GPU/GPUState.h" #include "GPU/Common/PostShader.h" -#include "ui_atlas.h" - #ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif -static const int symbols[4] = { - I_CROSS, - I_CIRCLE, - I_SQUARE, - I_TRIANGLE +static const ImageID symbols[4] = { + ImageID("I_CROSS"), + ImageID("I_CIRCLE"), + ImageID("I_SQUARE"), + ImageID("I_TRIANGLE"), }; static const uint32_t colors[4] = { @@ -120,7 +117,7 @@ void DrawBackground(UIContext &dc, float alpha) { dc.Flush(); dc.RebindTexture(); } else { - ImageID img = I_BG; + ImageID img = ImageID("I_BG"); ui_draw2d.DrawImageStretch(img, dc.GetBounds(), bgColor); } @@ -493,11 +490,11 @@ void LogoScreen::render() { // Manually formatting UTF-8 is fun. \xXX doesn't work everywhere. snprintf(temp, sizeof(temp), "%s Henrik Rydg%c%crd", cr->T("created", "Created by"), 0xC3, 0xA5); if (System_GetPropertyBool(SYSPROP_APP_GOLD)) { - dc.Draw()->DrawImage(I_ICONGOLD, bounds.centerX() - 120, bounds.centerY() - 30, 1.2f, textColor, ALIGN_CENTER); + dc.Draw()->DrawImage(ImageID("I_ICONGOLD"), bounds.centerX() - 120, bounds.centerY() - 30, 1.2f, textColor, ALIGN_CENTER); } else { - dc.Draw()->DrawImage(I_ICON, bounds.centerX() - 120, bounds.centerY() - 30, 1.2f, textColor, ALIGN_CENTER); + dc.Draw()->DrawImage(ImageID("I_ICON"), bounds.centerX() - 120, bounds.centerY() - 30, 1.2f, textColor, ALIGN_CENTER); } - dc.Draw()->DrawImage(I_LOGO, bounds.centerX() + 40, bounds.centerY() - 30, 1.5f, textColor, ALIGN_CENTER); + dc.Draw()->DrawImage(ImageID("I_LOGO"), bounds.centerX() + 40, bounds.centerY() - 30, 1.5f, textColor, ALIGN_CENTER); //dc.Draw()->DrawTextShadow(UBUNTU48, "PPSSPP", xres / 2, yres / 2 - 30, textColor, ALIGN_CENTER); dc.SetFontScale(1.0f, 1.0f); dc.SetFontStyle(dc.theme->uiFont); @@ -544,9 +541,9 @@ void CreditsScreen::CreateViews() { root_->Add(new Button(cr->T("Twitter @PPSSPP_emu"), new AnchorLayoutParams(260, 64, NONE, NONE, 10, rightYOffset + 158, false)))->OnClick.Handle(this, &CreditsScreen::OnTwitter); #endif if (System_GetPropertyBool(SYSPROP_APP_GOLD)) { - root_->Add(new ImageView(I_ICONGOLD, IS_DEFAULT, new AnchorLayoutParams(100, 64, 10, 10, NONE, NONE, false))); + root_->Add(new ImageView(ImageID("I_ICONGOLD"), IS_DEFAULT, new AnchorLayoutParams(100, 64, 10, 10, NONE, NONE, false))); } else { - root_->Add(new ImageView(I_ICON, IS_DEFAULT, new AnchorLayoutParams(100, 64, 10, 10, NONE, NONE, false))); + root_->Add(new ImageView(ImageID("I_ICON"), IS_DEFAULT, new AnchorLayoutParams(100, 64, 10, 10, NONE, NONE, false))); } } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index c6b6708565..c37968bb7d 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -51,6 +51,7 @@ #include "file/zip_read.h" #include "net/http_client.h" #include "net/resolve.h" +#include "gfx/texture_atlas.h" #include "gfx_es2/draw_text.h" #include "gfx_es2/gpu_features.h" #include "i18n/i18n.h" @@ -90,7 +91,6 @@ #include "Core/WebServer.h" #include "GPU/GPUInterface.h" -#include "ui_atlas.h" #include "UI/EmuScreen.h" #include "UI/GameInfoCache.h" #include "UI/HostTypes.h" @@ -121,6 +121,8 @@ static UI::Theme ui_theme; +Atlas g_ui_atlas; + #if defined(ARM) && defined(__ANDROID__) #include "../../android/jni/ArmEmitterTest.h" #elif defined(ARM64) && defined(__ANDROID__) @@ -750,20 +752,20 @@ static UI::Style MakeStyle(uint32_t fg, uint32_t bg) { static void UIThemeInit() { #if defined(USING_WIN_UI) || PPSSPP_PLATFORM(UWP) || defined(USING_QT_UI) - ui_theme.uiFont = UI::FontStyle(UBUNTU24, g_Config.sFont.c_str(), 22); - ui_theme.uiFontSmall = UI::FontStyle(UBUNTU24, g_Config.sFont.c_str(), 15); - ui_theme.uiFontSmaller = UI::FontStyle(UBUNTU24, g_Config.sFont.c_str(), 12); + ui_theme.uiFont = UI::FontStyle(FontID("UBUNTU24"), g_Config.sFont.c_str(), 22); + ui_theme.uiFontSmall = UI::FontStyle(FontID("UBUNTU24"), g_Config.sFont.c_str(), 15); + ui_theme.uiFontSmaller = UI::FontStyle(FontID("UBUNTU24"), g_Config.sFont.c_str(), 12); #else - ui_theme.uiFont = UI::FontStyle(UBUNTU24, "", 20); - ui_theme.uiFontSmall = UI::FontStyle(UBUNTU24, "", 14); - ui_theme.uiFontSmaller = UI::FontStyle(UBUNTU24, "", 11); + ui_theme.uiFont = UI::FontStyle(FontID("UBUNTU24"), "", 20); + ui_theme.uiFontSmall = UI::FontStyle(FontID("UBUNTU24"), "", 14); + ui_theme.uiFontSmaller = UI::FontStyle(FontID("UBUNTU24"), "", 11); #endif - ui_theme.checkOn = I_CHECKEDBOX; - ui_theme.checkOff = I_SQUARE; - ui_theme.whiteImage = I_SOLIDWHITE; - ui_theme.sliderKnob = I_CIRCLE; - ui_theme.dropShadow4Grid = I_DROP_SHADOW; + ui_theme.checkOn = ImageID("I_CHECKEDBOX"); + ui_theme.checkOff = ImageID("I_SQUARE"); + ui_theme.whiteImage = ImageID("I_SOLIDWHITE"); + ui_theme.sliderKnob = ImageID("I_CIRCLE"); + ui_theme.dropShadow4Grid = ImageID("I_DROP_SHADOW"); ui_theme.itemStyle = MakeStyle(g_Config.uItemStyleFg, g_Config.uItemStyleBg); ui_theme.itemFocusedStyle = MakeStyle(g_Config.uItemFocusedStyleFg, g_Config.uItemFocusedStyleBg); @@ -799,8 +801,17 @@ bool NativeInitGraphics(GraphicsContext *graphicsContext) { _assert_msg_(G3D, g_draw, "No draw context available!"); _assert_msg_(G3D, g_draw->GetVshaderPreset(VS_COLOR_2D) != nullptr, "Failed to compile presets"); - ui_draw2d.SetAtlas(&ui_atlas); - ui_draw2d_front.SetAtlas(&ui_atlas); + // Load the atlas. + + size_t atlas_data_size = 0; + if (!g_ui_atlas.IsMetadataLoaded()) { + const uint8_t *atlas_data = VFSReadFile("ui_atlas.meta", &atlas_data_size); + bool load_success = g_ui_atlas.Load(atlas_data, atlas_data_size); + _assert_msg_(G3D, load_success, "Failed to load ui_atlas.meta"); + delete[] atlas_data; + } + ui_draw2d.SetAtlas(&g_ui_atlas); + ui_draw2d_front.SetAtlas(&g_ui_atlas); UIThemeInit(); diff --git a/UI/OnScreenDisplay.cpp b/UI/OnScreenDisplay.cpp index d308c43d90..66517ad1c0 100644 --- a/UI/OnScreenDisplay.cpp +++ b/UI/OnScreenDisplay.cpp @@ -1,8 +1,8 @@ #include "UI/OnScreenDisplay.h" -#include "UI/ui_atlas.h" #include "base/colorutil.h" #include "base/timeutil.h" +#include "gfx/texture_atlas.h" #include "gfx_es2/draw_buffer.h" #include "ui/ui_context.h" diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index a89fc0d90e..e9c58fb5ab 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -31,7 +31,6 @@ #include "UI/SavedataScreen.h" #include "UI/MainScreen.h" #include "UI/GameInfoCache.h" -#include "UI/ui_atlas.h" #include "UI/PauseScreen.h" #include "Common/FileUtil.h" diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 0e8f12618a..69092ea667 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -22,7 +22,6 @@ #include "gfx_es2/draw_buffer.h" #include "i18n/i18n.h" #include "ui/ui_context.h" -#include "ui_atlas.h" #include "TouchControlLayoutScreen.h" #include "TouchControlVisibilityScreen.h" @@ -42,7 +41,7 @@ static u32 GetButtonColor() { class DragDropButton : public MultiTouchButton { public: - DragDropButton(ConfigTouchPos &pos, int bgImg, int img) + DragDropButton(ConfigTouchPos &pos, ImageID bgImg, ImageID img) : MultiTouchButton(bgImg, bgImg, img, pos.scale, new UI::AnchorLayoutParams(fromFullscreenCoord(pos.x), pos.y * local_dp_yres, UI::NONE, UI::NONE, true)), x_(pos.x), y_(pos.y), theScale_(pos.scale) { scale_ = theScale_; @@ -90,16 +89,9 @@ private: class PSPActionButtons : public DragDropButton { public: PSPActionButtons(ConfigTouchPos &pos, float &spacing) - : DragDropButton(pos, -1, -1), spacing_(spacing) { + : DragDropButton(pos, ImageID::invalid(), ImageID::invalid()), spacing_(spacing) { using namespace UI; - roundId_ = g_Config.iTouchButtonStyle ? I_ROUND_LINE : I_ROUND; - - circleId_ = I_CIRCLE; - crossId_ = I_CROSS; - triangleId_ = I_TRIANGLE; - squareId_ = I_SQUARE; - - circleVisible_ = triangleVisible_ = squareVisible_ = crossVisible_ = true; + roundId_ = g_Config.iTouchButtonStyle ? ImageID("I_ROUND_LINE") : ImageID("I_ROUND"); }; void setCircleVisibility(bool visible){ @@ -152,20 +144,23 @@ public: }; void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[roundId_]; + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(roundId_); - w = (2 * baseActionButtonSpacing * spacing_) + image.w * scale_; - h = (2 * baseActionButtonSpacing * spacing_) + image.h * scale_; + w = (2.0f * baseActionButtonSpacing * spacing_) + image->w * scale_; + h = (2.0f * baseActionButtonSpacing * spacing_) + image->h * scale_; } float GetSpacing() const override { return spacing_; } void SetSpacing(float s) override { spacing_ = s; } private: - bool circleVisible_, crossVisible_, triangleVisible_, squareVisible_; + bool circleVisible_ = true, crossVisible_ = true, triangleVisible_ = true, squareVisible_ = true; - int roundId_; - int circleId_, crossId_, triangleId_, squareId_; + ImageID roundId_ = ImageID::invalid(); + ImageID circleId_ = ImageID("I_CIRCLE"); + ImageID crossId_ = ImageID("I_CROSS"); + ImageID triangleId_ = ImageID("I_TRIANGLE"); + ImageID squareId_ = ImageID("I_SQUARE"); float &spacing_; }; @@ -173,7 +168,7 @@ private: class PSPDPadButtons : public DragDropButton { public: PSPDPadButtons(ConfigTouchPos &pos, float &spacing) - : DragDropButton(pos, -1, -1), spacing_(spacing) { + : DragDropButton(pos, ImageID::invalid(), ImageID::invalid()), spacing_(spacing) { } void Draw(UIContext &dc) override { @@ -185,7 +180,7 @@ public: static const float xoff[4] = {1, 0, -1, 0}; static const float yoff[4] = {0, 1, 0, -1}; - int dirImage = g_Config.iTouchButtonStyle ? I_DIR_LINE : I_DIR; + ImageID dirImage = g_Config.iTouchButtonStyle ? ImageID("I_DIR_LINE") : ImageID("I_DIR"); for (int i = 0; i < 4; i++) { float r = D_pad_Radius * spacing_; @@ -196,14 +191,14 @@ public: float angle = i * M_PI / 2; dc.Draw()->DrawImageRotated(dirImage, x, y, scale_, angle + PI, colorBg, false); - dc.Draw()->DrawImageRotated(I_ARROW, x2, y2, scale_, angle + PI, color); + dc.Draw()->DrawImageRotated(ImageID("I_ARROW"), x2, y2, scale_, angle + PI, color); } } void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[I_DIR]; - w = 2 * D_pad_Radius * spacing_ + image.w * scale_; - h = 2 * D_pad_Radius * spacing_ + image.h * scale_; + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(ImageID("I_DIR")); + w = 2 * D_pad_Radius * spacing_ + image->w * scale_; + h = 2 * D_pad_Radius * spacing_ + image->h * scale_; }; float GetSpacing() const override { return spacing_; } @@ -414,57 +409,57 @@ void TouchControlLayoutScreen::CreateViews() { controls_.push_back(actionButtons); - int rectImage = g_Config.iTouchButtonStyle ? I_RECT_LINE : I_RECT; - int shoulderImage = g_Config.iTouchButtonStyle ? I_SHOULDER_LINE : I_SHOULDER; - int dirImage = g_Config.iTouchButtonStyle ? I_DIR_LINE : I_DIR; - int stickImage = g_Config.iTouchButtonStyle ? I_STICK_LINE : I_STICK; - int stickBg = g_Config.iTouchButtonStyle ? I_STICK_BG_LINE : I_STICK_BG; - int roundImage = g_Config.iTouchButtonStyle ? I_ROUND_LINE : I_ROUND; + ImageID rectImage = g_Config.iTouchButtonStyle ? ImageID("I_RECT_LINE") : ImageID("I_RECT"); + ImageID shoulderImage = g_Config.iTouchButtonStyle ? ImageID("I_SHOULDER_LINE") : ImageID("I_SHOULDER"); + ImageID dirImage = g_Config.iTouchButtonStyle ? ImageID("I_DIR_LINE") : ImageID("I_DIR"); + ImageID stickImage = g_Config.iTouchButtonStyle ? ImageID("I_STICK_LINE") : ImageID("I_STICK"); + ImageID stickBg = g_Config.iTouchButtonStyle ? ImageID("I_STICK_BG_LINE") : ImageID("I_STICK_BG"); + ImageID roundImage = g_Config.iTouchButtonStyle ? ImageID("I_ROUND_LINE") : ImageID("I_ROUND"); - const int comboKeyImages[5] = { I_1, I_2, I_3, I_4, I_5 }; + const ImageID comboKeyImages[5] = { ImageID("I_1"), ImageID("I_2"), ImageID("I_3"), ImageID("I_4"), ImageID("I_5") }; if (g_Config.touchDpad.show) { controls_.push_back(new PSPDPadButtons(g_Config.touchDpad, g_Config.fDpadSpacing)); } if (g_Config.touchSelectKey.show) { - controls_.push_back(new DragDropButton(g_Config.touchSelectKey, rectImage, I_SELECT)); + controls_.push_back(new DragDropButton(g_Config.touchSelectKey, rectImage, ImageID("I_SELECT"))); } if (g_Config.touchStartKey.show) { - controls_.push_back(new DragDropButton(g_Config.touchStartKey, rectImage, I_START)); + controls_.push_back(new DragDropButton(g_Config.touchStartKey, rectImage, ImageID("I_START"))); } if (g_Config.touchUnthrottleKey.show) { - DragDropButton *unthrottle = new DragDropButton(g_Config.touchUnthrottleKey, rectImage, I_ARROW); + DragDropButton *unthrottle = new DragDropButton(g_Config.touchUnthrottleKey, rectImage, ImageID("I_ARROW")); unthrottle->SetAngle(180.0f); controls_.push_back(unthrottle); } if (g_Config.touchSpeed1Key.show) { - DragDropButton *speed1 = new DragDropButton(g_Config.touchSpeed1Key, rectImage, I_ARROW); + DragDropButton *speed1 = new DragDropButton(g_Config.touchSpeed1Key, rectImage, ImageID("I_ARROW")); speed1->SetAngle(170.0f, 180.0f); controls_.push_back(speed1); } if (g_Config.touchSpeed2Key.show) { - DragDropButton *speed2 = new DragDropButton(g_Config.touchSpeed2Key, rectImage, I_ARROW); + DragDropButton *speed2 = new DragDropButton(g_Config.touchSpeed2Key, rectImage, ImageID("I_ARROW")); speed2->SetAngle(190.0f, 180.0f); controls_.push_back(speed2); } if (g_Config.touchRapidFireKey.show) { - DragDropButton *rapidFire = new DragDropButton(g_Config.touchRapidFireKey, rectImage, I_ARROW); + DragDropButton *rapidFire = new DragDropButton(g_Config.touchRapidFireKey, rectImage, ImageID("I_ARROW")); rapidFire->SetAngle(90.0f, 180.0f); controls_.push_back(rapidFire); } if (g_Config.touchLKey.show) { - controls_.push_back(new DragDropButton(g_Config.touchLKey, shoulderImage, I_L)); + controls_.push_back(new DragDropButton(g_Config.touchLKey, shoulderImage, ImageID("I_L"))); } if (g_Config.touchRKey.show) { - DragDropButton *rbutton = new DragDropButton(g_Config.touchRKey, shoulderImage, I_R); + DragDropButton *rbutton = new DragDropButton(g_Config.touchRKey, shoulderImage, ImageID("I_R")); rbutton->FlipImageH(true); controls_.push_back(rbutton); } diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index 1fd0f89fbd..04b68b4abd 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -15,9 +15,10 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "gfx/texture_atlas.h" + #include "TouchControlVisibilityScreen.h" #include "Core/Config.h" -#include "UI/ui_atlas.h" #include "i18n/i18n.h" static const int leftColumnWidth = 140; @@ -70,26 +71,26 @@ void TouchControlVisibilityScreen::CreateViews() { GridLayout *grid = vert->Add(new GridLayout(gridsettings, new LayoutParams(FILL_PARENT, WRAP_CONTENT))); toggles_.clear(); - toggles_.push_back({ "Circle", &g_Config.bShowTouchCircle, I_CIRCLE }); - toggles_.push_back({ "Cross", &g_Config.bShowTouchCross, I_CROSS }); - toggles_.push_back({ "Square", &g_Config.bShowTouchSquare, I_SQUARE }); - toggles_.push_back({ "Triangle", &g_Config.bShowTouchTriangle, I_TRIANGLE }); - toggles_.push_back({ "L", &g_Config.touchLKey.show, I_L }); - toggles_.push_back({ "R", &g_Config.touchRKey.show, I_R }); - toggles_.push_back({ "Start", &g_Config.touchStartKey.show, I_START }); - toggles_.push_back({ "Select", &g_Config.touchSelectKey.show, I_SELECT }); - toggles_.push_back({ "Dpad", &g_Config.touchDpad.show, -1 }); - toggles_.push_back({ "Analog Stick", &g_Config.touchAnalogStick.show, -1 }); - toggles_.push_back({ "Right Analog Stick\n(not used by most games)", &g_Config.touchRightAnalogStick.show, -1 }); - toggles_.push_back({ "Unthrottle", &g_Config.touchUnthrottleKey.show, -1 }); - toggles_.push_back({ "Combo0", &g_Config.touchCombo0.show, I_1 }); - toggles_.push_back({ "Combo1", &g_Config.touchCombo1.show, I_2 }); - toggles_.push_back({ "Combo2", &g_Config.touchCombo2.show, I_3 }); - toggles_.push_back({ "Combo3", &g_Config.touchCombo3.show, I_4 }); - toggles_.push_back({ "Combo4", &g_Config.touchCombo4.show, I_5 }); - toggles_.push_back({ "Alt speed 1", &g_Config.touchSpeed1Key.show, -1 }); - toggles_.push_back({ "Alt speed 2", &g_Config.touchSpeed2Key.show, -1 }); - toggles_.push_back({ "RapidFire", &g_Config.touchRapidFireKey.show, -1 }); + toggles_.push_back({ "Circle", &g_Config.bShowTouchCircle, ImageID("I_CIRCLE") }); + toggles_.push_back({ "Cross", &g_Config.bShowTouchCross, ImageID("I_CROSS") }); + toggles_.push_back({ "Square", &g_Config.bShowTouchSquare, ImageID("I_SQUARE") }); + toggles_.push_back({ "Triangle", &g_Config.bShowTouchTriangle, ImageID("I_TRIANGLE") }); + toggles_.push_back({ "L", &g_Config.touchLKey.show, ImageID("I_L") }); + toggles_.push_back({ "R", &g_Config.touchRKey.show, ImageID("I_R") }); + toggles_.push_back({ "Start", &g_Config.touchStartKey.show, ImageID("I_START") }); + toggles_.push_back({ "Select", &g_Config.touchSelectKey.show, ImageID("I_SELECT") }); + toggles_.push_back({ "Dpad", &g_Config.touchDpad.show, ImageID::invalid() }); + toggles_.push_back({ "Analog Stick", &g_Config.touchAnalogStick.show, ImageID::invalid() }); + toggles_.push_back({ "Right Analog Stick\n(not used by most games)", &g_Config.touchRightAnalogStick.show, ImageID::invalid() }); + toggles_.push_back({ "Unthrottle", &g_Config.touchUnthrottleKey.show, ImageID::invalid() }); + toggles_.push_back({ "Combo0", &g_Config.touchCombo0.show, ImageID("I_1") }); + toggles_.push_back({ "Combo1", &g_Config.touchCombo1.show, ImageID("I_2") }); + toggles_.push_back({ "Combo2", &g_Config.touchCombo2.show, ImageID("I_3") }); + toggles_.push_back({ "Combo3", &g_Config.touchCombo3.show, ImageID("I_4") }); + toggles_.push_back({ "Combo4", &g_Config.touchCombo4.show, ImageID("I_5") }); + toggles_.push_back({ "Alt speed 1", &g_Config.touchSpeed1Key.show, ImageID::invalid() }); + toggles_.push_back({ "Alt speed 2", &g_Config.touchSpeed2Key.show, ImageID::invalid() }); + toggles_.push_back({ "RapidFire", &g_Config.touchRapidFireKey.show, ImageID::invalid() }); auto mc = GetI18NCategory("MappableControls"); @@ -101,7 +102,7 @@ void TouchControlVisibilityScreen::CreateViews() { row->Add(checkbox); Choice *choice; - if (toggle.img != -1) { + if (toggle.img.isValid()) { choice = new CheckBoxChoice(toggle.img, checkbox, new LinearLayoutParams(1.0f)); } else { choice = new CheckBoxChoice(mc->T(toggle.key), checkbox, new LinearLayoutParams(1.0f)); diff --git a/UI/TouchControlVisibilityScreen.h b/UI/TouchControlVisibilityScreen.h index 88455a343e..82efd442b3 100644 --- a/UI/TouchControlVisibilityScreen.h +++ b/UI/TouchControlVisibilityScreen.h @@ -17,6 +17,7 @@ #pragma once +#include "gfx/texture_atlas.h" #include "MiscScreens.h" namespace UI { @@ -26,7 +27,7 @@ namespace UI { struct TouchButtonToggle { const char *key; bool *show; - int img; + ImageID img; }; class TouchControlVisibilityScreen : public UIDialogScreenWithBackground { diff --git a/UI/UI.vcxproj b/UI/UI.vcxproj index ea06201cf5..7c7952131c 100644 --- a/UI/UI.vcxproj +++ b/UI/UI.vcxproj @@ -65,7 +65,6 @@ - @@ -98,7 +97,6 @@ - @@ -426,4 +424,4 @@ - \ No newline at end of file + diff --git a/UI/UI.vcxproj.filters b/UI/UI.vcxproj.filters index 1b79119b4e..bd5b259df2 100644 --- a/UI/UI.vcxproj.filters +++ b/UI/UI.vcxproj.filters @@ -4,7 +4,6 @@ - Screens @@ -78,7 +77,6 @@ - Screens @@ -155,4 +153,4 @@ {faee5dce-633b-4ba6-b19d-ea70ee3c1c38} - \ No newline at end of file + diff --git a/UWP/UI_UWP/UI_UWP.vcxproj b/UWP/UI_UWP/UI_UWP.vcxproj index 98c5b54a0b..120a7b5f86 100644 --- a/UWP/UI_UWP/UI_UWP.vcxproj +++ b/UWP/UI_UWP/UI_UWP.vcxproj @@ -409,7 +409,6 @@ - @@ -444,7 +443,6 @@ - Create Create diff --git a/UWP/UI_UWP/UI_UWP.vcxproj.filters b/UWP/UI_UWP/UI_UWP.vcxproj.filters index 89c1fdc6d8..8a4208e1ec 100644 --- a/UWP/UI_UWP/UI_UWP.vcxproj.filters +++ b/UWP/UI_UWP/UI_UWP.vcxproj.filters @@ -32,7 +32,6 @@ - @@ -67,6 +66,5 @@ - diff --git a/Windows/PPSSPP.sln b/Windows/PPSSPP.sln index 84a3d5bcd4..daf8a56189 100644 --- a/Windows/PPSSPP.sln +++ b/Windows/PPSSPP.sln @@ -322,8 +322,7 @@ Global {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|ARM.ActiveCfg = Debug|x64 {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|ARM64.ActiveCfg = Debug|x64 {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|Win32.ActiveCfg = Debug|x64 - {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|x64.ActiveCfg = Debug|x64 - {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|x64.Build.0 = Debug|x64 + {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Debug|x64.ActiveCfg = Release|x64 {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Release|ARM.ActiveCfg = Release|x64 {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Release|ARM64.ActiveCfg = Release|x64 {FBE46262-7C2C-400C-92F9-F8A9E72594DD}.Release|Win32.ActiveCfg = Release|x64 @@ -332,8 +331,7 @@ Global {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|ARM.ActiveCfg = Debug|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|ARM64.ActiveCfg = Debug|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|Win32.ActiveCfg = Debug|x64 - {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|x64.ActiveCfg = Debug|x64 - {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|x64.Build.0 = Debug|x64 + {B7DED405-40A2-48F8-9382-538F10D442F1}.Debug|x64.ActiveCfg = Release|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|ARM.ActiveCfg = Release|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|ARM64.ActiveCfg = Release|x64 {B7DED405-40A2-48F8-9382-538F10D442F1}.Release|Win32.ActiveCfg = Release|x64 diff --git a/android/.gitignore b/android/.gitignore index 4aa0d52b74..749e376c96 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -7,8 +7,3 @@ gen obj .externalNativeBuild android.iml -#ui_atlas.zim -ui_atlas.zim.png -#assets/ui_atlas.zim -#jni/ui_atlas.cpp -#jni/ui_atlas.h diff --git a/android/assets/ppge_atlas.meta b/android/assets/ppge_atlas.meta new file mode 100644 index 0000000000000000000000000000000000000000..fe26c5199ce051d460c22757cba6a11044a77545 GIT binary patch literal 1119232 zcmeFa3AkNVdH=r@kPrd{5+Fd-qoRUFjfgl9$hwFM$PfVm5pg3ZR2(9rqN1)k)Cdl7 z4v6(=5h8U!ts1K4E)^{uY|)?9)N!|Bi>>XSI#jd{|IhbbYoD|4?IGvfoO|w&?DIT3 z`{umoUF)6KyXLXePaJc6?#8pT{&4p{%DM0u=bp#=?W^vuZ+MP>#^X*s<+RiEgS+?$ zN6*!(^gNJX=>hNfQy+KY{LV%7clM$hrjIPJ+#89Q|=cps!5)psAm zJG6s$`l-i{o&3bRuJJ+M#eI))?uYR0S04!8o7Xw_lw+Q9^65`G>~Q|u^V8znkRf{i zF;BtsK^_V3JYH*e;va-KuJ0twU7R}w*y5IROJM4hyF0hveVp5$=Tu<#;e9`z)A(CL zK9T1s{N3ig_5sd)fWO^JsN{L!J)9fky@BTw{CySgHqU}x)7w4VxxM)N4&LrC=U%|y z59fUt&#U?SYmad5?|A}$yOVj^@Swl{01nR|Kh?S4@%}x}3(w~JyYX9|OZZ#wCqw(s z_M`7__`2N>NyLcPV@Auv?=|BtTnBvr zvEAM76!p2IUHAid<43#p-GQ$M{{z5JA6qQ^u*YiGy4Pw~?6um3`v8xdo%HVq^S+VtYw+SYzCQpSPN0s1 z_^s$u{fCe3DFrxi%7gjMwb1!M;A@f3>x{l7ZVB+00$&X7E0E(pz_)FNzMogm202SG+05^z#?se;)lTKtH!oK5`F#%X=5#cY-ha z_8i;8ErY)sDEEHQ_c8SI0O0F^OTT9&{kV(p<92?2%R8daw!wEd`ENSPwZzw7A-f0h zhQExzm*5fI3vRL(JWPZ;bP~SLZ+2Sk{Ey%@j#uUHZRMj|;g`FDoAGn~R(@M>t*TEBn}6_R+>a;=}kJ-TH^~mV8eE z|21PvWFIAVZG4^68{fa4I^Tl-$d5jRj#h#%|6GCo(T_iuGVxt^9`DcdF2-GW8}Rpz z?I-&vbkN%$A_yZ6Bx@x%T3QHfUJ3;v`8 z490k6o1nk* zlKxtUf`{$3A50nib^<=FbL;Sof5asG3lhHnA#}?wuzj=BFrM^(3h^EKOWBX)j-AU7 z-5tOszcpDtq7S&yCwP`$czuG${hz|*LvX8~9Toj#UhM%9{E$l}0`A22?H)eQ|=xak){A+9k8a;Mo zANk*%_&@TqcuL&&Uq;VrKko!z{;_+C&&3n@4!;X(XViYG{5t+(VCcpjK>RlQ!M@)I z{%fFbZ^%6pJnXi0Hg#-K{Sl+wOq&l}?Z;Wj1^&X*dEc9IY_ESo}YTwpn{3Eb$@Ev)F zzc1fk!~6ajF8n{je!zE%&)_@abExA#894aG-6$LXQ4A@?{}%ZF2>8GE*1maSn#%XI zTb=Sn|3#_%5`0I!5qx(Dk7T3zFN8np4{BQ_fBAsq@5WPn%lVJ{9POX#|0+3@>OU?f z_&5FT?w;VQUg{4w=lZMikI($kK1E`P8FB=e#vJw^2a{H81#$2_2UWueDotYb}Rc0k3mNAuL@uK!#_NJt@!RA z%_Bdq^e6oY{{NwS+0DW1p5!-An;di%; zyYNondlElsALBa`f67yhzc&0|3jA4#KZjgo|KZWdPyES01wSG2=N_Krw<^m|{trA{ zmF0KoQLeoLyep1!rR@CnjDKvhFaJℑFGW*-r(3V$xrPF3CTEqYi}-#5_@eJbbgVpJ629`jD82s{ zK9wJ=9CvOt`11eVD1XRLSO9<6ci0R0NxpuwwV&jNsr@}B*@rte+lT5`{LcAfn|4L| ziL~9OALJ9>YH+i^D17Xu6#l`KUxKgx!CA@v!hd34$VYb8%JQ-DC7X1^?g-Cq75DS!&xB;=l4A!PPz}eo}w@Iry@%{{dh81>lPRJLUetODG#1 zlrIHe^e+ak_!v|F%=%{JCgJYDkdfO+S$}SD%m3na$*<#wDPJ~>eoTJ5z(4%?f8cxg z^WQ*E;_r6K|Ekq*aJ4V4MVZ7mr}(g7EWu-HUs}&k_S0HR8Hz7qvvV&7|JgadK)d2| zOSzxo^K;R!^2?awbL-{sMQm=pf;X~O|IR%e_-68NwO{b&iQyhOD~4PAUJxap-P}Uh z!RAWI{Q>A{cis{HZU+B5w9oJtPDJm@8&88zHF!>;-w)mI)Zq0D~+jRN`Y-=ez&`w%@M0^R?rvAU|x&Y>|1M45G2Vef7 z{srx?@(=$X)J^`OHcI)U@vr^^{I~IY#h>Cx%EuNa!zEw&RYblmY{cN=KjRm~M8R9w zKm~W=uPUGV!)>X4(cun{ss3-~@dfyAOE2(m{rrl)4ENsy2fCF<$2_GTsMAJo5i6tP8ivzm7gctoxdcq9*rJ>YH&cA>bj2s@R2WMAT6<;%aup-XYc zVi)hF(FN82H~7Ece~13%*R-Sl_q@?x9o~KhcB}mGJanY?rHgOlZw0=qv9nUPO+VK? zn(|fu-w+?f|DNEB_ z|3UaiK|i(?9?x5HoCJ@IiCF)D{LSP%8Lsvpy_VRymmGmx{VJdO-3t@E^`g6gUoM~J zc_+^yJR6~91N244uke3&J$beCqH#*uiS+ZDOuyh?%=UM4w!ik~#Gm>X@E5<4;DJ80 z+2>^VZ5e)hZ@7(*QGZwj{i+{)<4@(opMN&IqeFiYzfqjI9r`3+^)K!ToVc&}p|R1n z;!gnogTOBaPWu>EVIRcpK%Db}3t#%n_;5I@pZKQazu~Re7jatsmv9yI{gnQX<_GXU zkN(4|Y#+egHL(kyRq9dK8PJ9e$1{2V6#IABM}Wp}kss#qk&%-4E^K=JDrCaDil?7KV# zII-N3zu5RzAb;5p|2z`A#|PW^f%{kKhv%`md?wKR*%|+wjDKv#e?!8z+)DF9zXDHV zKp7t1M*N`s@J!+>v9mm%NBL=m|1<0tc)w2@`Xc^aC=XG7wJ6me-j&Mlhp*Uf{W4;E zP%c=}_g30J>i1)*eD%L4l%MI3#23YH#TSi%y0c=E{|⪼43yNw^eMi@x_w*u0?(^ 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

Iy%%#D^BY54*Xh`u`f>pN2pCgUs)m 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 literal 0 HcmV?d00001 diff --git a/android/jni/Android.mk b/android/jni/Android.mk index da3f9312bb..2021abeeda 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -183,7 +183,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/MIPS/IR/IRInterpreter.cpp \ $(SRC)/Core/MIPS/IR/IRPassSimplify.cpp \ $(SRC)/Core/MIPS/IR/IRRegCache.cpp \ - $(SRC)/UI/ui_atlas.cpp \ $(SRC)/ext/libkirk/AES.c \ $(SRC)/ext/libkirk/amctrl.c \ $(SRC)/ext/libkirk/SHA1.c \ @@ -417,7 +416,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/Util/AudioFormat.cpp \ $(SRC)/Core/Util/GameManager.cpp \ $(SRC)/Core/Util/BlockAllocator.cpp \ - $(SRC)/Core/Util/ppge_atlas.cpp \ $(SRC)/Core/Util/PPGeDraw.cpp \ $(SRC)/git-version.cpp diff --git a/assets/ppge_atlas.meta b/assets/ppge_atlas.meta index 7650d69de6fe95e1cc7330ffcb2b6ad4ae58b24c..fe26c5199ce051d460c22757cba6a11044a77545 100644 GIT binary patch delta 32422 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 diff --git a/assets/ui_atlas.meta b/assets/ui_atlas.meta index 1ebc7dc265a931b563d7b0049c0f135cb86ce101..e6b9cf53a22caf9bdf0c0ecc61a836feadaf5394 100644 GIT binary patch delta 32215 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
c6s9!6TI)Ax-Kng3qn;|J77 ztd(ID@dU*-Q$y`{LM`~5R{?Z3yghqF6(^4p8=bNy*#Y{1@^=#PpGu%)7s&iwh!$BT zFrEG`marA4=qf*~sB8GDccpOL+&z5zm5+{vUDO8dACXbkSWp}C+=b^+N)2ZCCNIVI z1F9hLb$GZE%m$%BELg7N(+{AM$~z^FtJd>b;BNRX27-}54g4^~sO8Pp8kxq1-fnF~ zx;EzBDWeUx8X!*i?3D00!RMza62LxX1UtG*Ass;dzYCRMDbkp9$oxZM5*xDrkeX~z z{T~yGyF@g^;aNV~<6rYsC9uNSJrp3q;E*Qv8?i0^AwuY^Zw;t2728{@csi4Y|B#dT zTHYL_B0bzD0>4P(LHR#L8aus%cE-`bZxbqxRWtFk3EGL311fnqrRqP07?As?YQYLN zLN?3WGgKH$rwtYdvA3Zn2i}c3vAIkrE1svN{}kJpPJ0*$3#Lv8K^pn$1ZF54OJ@1z zgu=ik7Hnbz&oIu|5}%IZg6(c1IJve@&mS4`Wk@owz(Ar7XKScDpu@K27;+ItFn>oQ z2p_|NxgK0>sE(F*f$CAFzBIhqMiC5fBHL3DU}3NBiC#D}fhAZ2I6!K_D#sQow2v2d zEX#~<;LX87(Yijz7An%yy$!vM4Sf3FMxus|HFTEKeSOb0<*=ugLks5t0O1;$qH+Y& z!M4PK%)7GC4`|7|%b2M_&37f&h3`Wd+Z`Am?WHM5D0>%~#jh3!Ah`3c)PqAM?q$Ts z22dQUu%PG5}$7wSzqO!zfAe}B1&$u-O;3*qj7ISBIjRYDqc3ZZ@$Ui{J|vnc1iTvt(b*> zUm?YBRpCFHqRAjZ*=%UK3!?THXo~M}^FL@DU*><{<{M~IzRXyOosOpbA0X?p3B#iq zkJ_)I$$x=?h=23XK7dQpLsR_10L8ta%1?81FD}h5d6dy+4Bj%8#%K!uwGk`7<03x@ z$~N-Z=quU3bS6{$16Tc5F_8TeeYv>C3i5x#cz-Jn&?-<>{`s5sOb*{$Cc)EDT$;_$ z6wK^+)NBA%?Ntm{er<;RHJe89bp;0V#UM&1_?H-8O=Eq~1<-f~pa-FWmZ{^olS z=I@Lq0%iFpSlruu`8pcMmu5rmli+O+D*G)4$`=50_!`Wo%?2p|4do%?P7O?8m7Y!=$kB~39&#VQ-IWt=W%De$8XFHaW6|BGs#Tbhj++g&& zjLYf`Rw9^~Eqj|I`6BuX#Pqr@K$L8-qEoE cP-UgqFF@2Fi~8Z;oGGh#ykf=y9DNJ_4`?g40{{R3 delta 21722 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 +#include +#include +#include "base/logging.h" #include "gfx/texture_atlas.h" -const AtlasFont *Atlas::getFontByName(const char *name) const -{ - for (int i = 0; i < num_fonts; i++) { - if (!strcmp(name, fonts[i]->name)) - return fonts[i]; +class ByteReader { +public: + ByteReader(const uint8_t *data, size_t size) : data_(data), offset_(0), size_(size) {} + + template + T Read() { + T x; + memcpy(&x, data_ + offset_, sizeof(T)); + offset_ += sizeof(T); + return x; } - return 0; + + template + void ReadInto(T *t) { + memcpy(t, data_ + offset_, sizeof(T)); + offset_ += sizeof(T); + } + + template + T *ReadMultipleAlloc(size_t count) { + T *t = new T[count]; + memcpy(t, data_ + offset_, sizeof(T) * count); + offset_ += sizeof(T) * count; + return t; + } + +private: + const uint8_t *data_; + size_t offset_; + size_t size_; +}; + +bool Atlas::Load(const uint8_t *data, size_t data_size) { + ByteReader reader(data, data_size); + + AtlasHeader header = reader.Read(); + num_images = header.numImages; + num_fonts = header.numFonts; + if (header.magic != ATLAS_MAGIC) { + return false; + } + + images = reader.ReadMultipleAlloc(num_images); + fonts = new AtlasFont[num_fonts]; + for (int i = 0; i < num_fonts; i++) { + AtlasFontHeader font_header = reader.Read(); + fonts[i].padding = font_header.padding; + fonts[i].height = font_header.height; + fonts[i].ascend = font_header.ascend; + fonts[i].distslope = font_header.distslope; + fonts[i].numRanges = font_header.numRanges; + fonts[i].numChars = font_header.numChars; + fonts[i].ranges = reader.ReadMultipleAlloc(font_header.numRanges); + fonts[i].charData = reader.ReadMultipleAlloc(font_header.numChars); + memcpy(fonts[i].name, font_header.name, sizeof(font_header.name)); + } + return true; } -const AtlasImage *Atlas::getImageByName(const char *name) const -{ +const AtlasFont *Atlas::getFont(FontID id) const { + if (id.isInvalid()) + return nullptr; + + for (int i = 0; i < num_fonts; i++) { + if (!strcmp(id.id, fonts[i].name)) + return &fonts[i]; + } + return nullptr; +} + +const AtlasImage *Atlas::getImage(ImageID name) const { + if (name.isInvalid()) + return nullptr; + for (int i = 0; i < num_images; i++) { - if (!strcmp(name, images[i].name)) + if (!strcmp(name.id, images[i].name)) return &images[i]; } - return 0; + return nullptr; +} + +bool Atlas::measureImage(ImageID id, float *w, float *h) const { + const AtlasImage *image = getImage(id); + if (image) { + *w = (float)image->w; + *h = (float)image->h; + return true; + } else { + *w = 0.0f; + *h = 0.0f; + return false; + } } const AtlasChar *AtlasFont::getChar(int utf32) const { @@ -31,3 +109,13 @@ const AtlasChar *AtlasFont::getChar(int utf32) const { } return 0; } + +Atlas::~Atlas() { + delete[] images; + delete[] fonts; +} + +AtlasFont::~AtlasFont() { + delete[] ranges; + delete[] charData; +} diff --git a/ext/native/gfx/texture_atlas.h b/ext/native/gfx/texture_atlas.h index 250fea42b3..dfcf734dae 100644 --- a/ext/native/gfx/texture_atlas.h +++ b/ext/native/gfx/texture_atlas.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + #define ATLAS_MAGIC ('A' + ('T' << 8) + ('L' << 16) | ('A' << 24)) // Metadata file structure v0: @@ -14,7 +17,57 @@ // For each char: // AtlasChar -typedef int ImageID; +struct Atlas; + +struct ImageID { +public: + ImageID() : id(nullptr) {} + explicit ImageID(const char *_id) : id(_id) {} + + static inline ImageID invalid() { + return ImageID{ nullptr }; + } + + bool isValid() const { + return id != nullptr; + } + + bool isInvalid() const { + return id == nullptr; + } + + bool operator ==(const ImageID &other) { + return (id == other.id) || !strcmp(id, other.id); + } + + bool operator !=(const ImageID &other) { + if (id == other.id) { + return false; + } + return strcmp(id, other.id) != 0; + } + +private: + const char *id; + friend struct Atlas; +}; + +struct FontID { +public: + explicit FontID(const char *_id) : id(_id) {} + + static inline FontID invalid() { + return FontID{ nullptr }; + } + + bool isInvalid() const { + return id == nullptr; + } + +private: + const char *id; + friend struct Atlas; +}; struct AtlasChar { // texcoords @@ -40,9 +93,12 @@ struct AtlasFontHeader { float distslope; int numRanges; int numChars; + char name[32]; }; struct AtlasFont { + ~AtlasFont(); + float padding; float height; float ascend; @@ -50,19 +106,14 @@ struct AtlasFont { const AtlasChar *charData; const AtlasCharRange *ranges; int numRanges; - const char *name; + int numChars; + char name[32]; // Returns 0 on no match. const AtlasChar *getChar(int utf32) const ; }; struct AtlasImage { - float u1, v1, u2, v2; - int w, h; - const char *name; -}; - -struct AtlasImage2 { float u1, v1, u2, v2; int w, h; char name[32]; @@ -76,13 +127,20 @@ struct AtlasHeader { }; struct Atlas { - const char *filename; - const AtlasFont **fonts; - int num_fonts; - const AtlasImage *images; - int num_images; + ~Atlas(); + bool Load(const uint8_t *data, size_t data_size); + bool IsMetadataLoaded() { + return images != nullptr; + } + + AtlasFont *fonts = nullptr; + int num_fonts = 0; + AtlasImage *images = nullptr; + int num_images = 0; // These are inefficient linear searches, try not to call every frame. - const AtlasFont *getFontByName(const char *name) const; - const AtlasImage *getImageByName(const char *name) const; + const AtlasFont *getFont(FontID id) const; + const AtlasImage *getImage(ImageID id) const; + + bool measureImage(ImageID id, float *w, float *h) const; }; diff --git a/ext/native/gfx_es2/draw_buffer.cpp b/ext/native/gfx_es2/draw_buffer.cpp index b329534a93..e9ff42c8db 100644 --- a/ext/native/gfx_es2/draw_buffer.cpp +++ b/ext/native/gfx_es2/draw_buffer.cpp @@ -173,8 +173,10 @@ void DrawBuffer::Rect(float x, float y, float w, float h, V(x, y + h, 0, color, u, v + uh); } -void DrawBuffer::Line(int atlas_image, float x1, float y1, float x2, float y2, float thickness, uint32_t color) { - const AtlasImage &image = atlas->images[atlas_image]; +void DrawBuffer::Line(ImageID atlas_image, float x1, float y1, float x2, float y2, float thickness, uint32_t color) { + const AtlasImage *image = atlas->getImage(atlas_image); + if (!image) + return; // No caps yet! // Pre-rotated - we are making a thick line here @@ -190,24 +192,34 @@ void DrawBuffer::Line(int atlas_image, float x1, float y1, float x2, float y2, f float x[4] = { x1 - dx, x2 - dx, x1 + dx, x2 + dx }; float y[4] = { y1 - dy, y2 - dy, y1 + dy, y2 + dy }; - V(x[0], y[0], color, image.u1, image.v1); - V(x[1], y[1], color, image.u2, image.v1); - V(x[2], y[2], color, image.u1, image.v2); - V(x[2], y[2], color, image.u1, image.v2); - V(x[1], y[1], color, image.u2, image.v1); - V(x[3], y[3], color, image.u2, image.v2); + V(x[0], y[0], color, image->u1, image->v1); + V(x[1], y[1], color, image->u2, image->v1); + V(x[2], y[2], color, image->u1, image->v2); + V(x[2], y[2], color, image->u1, image->v2); + V(x[1], y[1], color, image->u2, image->v1); + V(x[3], y[3], color, image->u2, image->v2); } -void DrawBuffer::MeasureImage(ImageID atlas_image, float *w, float *h) { - const AtlasImage &image = atlas->images[atlas_image]; - *w = (float)image.w; - *h = (float)image.h; +bool DrawBuffer::MeasureImage(ImageID atlas_image, float *w, float *h) { + const AtlasImage *image = atlas->getImage(atlas_image); + if (image) { + *w = (float)image->w; + *h = (float)image->h; + return true; + } else { + *w = 0; + *h = 0; + return false; + } } void DrawBuffer::DrawImage(ImageID atlas_image, float x, float y, float scale, Color color, int align) { - const AtlasImage &image = atlas->images[atlas_image]; - float w = (float)image.w * scale; - float h = (float)image.h * scale; + const AtlasImage *image = atlas->getImage(atlas_image); + if (!image) + return; + + float w = (float)image->w * scale; + float h = (float)image->h * scale; if (align & ALIGN_HCENTER) x -= w / 2; if (align & ALIGN_RIGHT) x -= w; if (align & ALIGN_VCENTER) y -= h / 2; @@ -216,13 +228,15 @@ void DrawBuffer::DrawImage(ImageID atlas_image, float x, float y, float scale, C } void DrawBuffer::DrawImageStretch(ImageID atlas_image, float x1, float y1, float x2, float y2, Color color) { - const AtlasImage &image = atlas->images[atlas_image]; - V(x1, y1, color, image.u1, image.v1); - V(x2, y1, color, image.u2, image.v1); - V(x2, y2, color, image.u2, image.v2); - V(x1, y1, color, image.u1, image.v1); - V(x2, y2, color, image.u2, image.v2); - V(x1, y2, color, image.u1, image.v2); + const AtlasImage *image = atlas->getImage(atlas_image); + if (!image) + return; + V(x1, y1, color, image->u1, image->v1); + V(x2, y1, color, image->u2, image->v1); + V(x2, y2, color, image->u2, image->v2); + V(x1, y1, color, image->u1, image->v1); + V(x2, y2, color, image->u2, image->v2); + V(x1, y2, color, image->u1, image->v2); } inline void rot(float *v, float angle, float xc, float yc) { @@ -235,9 +249,9 @@ inline void rot(float *v, float angle, float xc, float yc) { } void DrawBuffer::DrawImageRotated(ImageID atlas_image, float x, float y, float scale, float angle, Color color, bool mirror_h) { - const AtlasImage &image = atlas->images[atlas_image]; - float w = (float)image.w * scale; - float h = (float)image.h * scale; + const AtlasImage *image = atlas->getImage(atlas_image); + float w = (float)image->w * scale; + float h = (float)image->h * scale; float x1 = x - w / 2; float x2 = x + w / 2; float y1 = y - h / 2; @@ -250,20 +264,20 @@ void DrawBuffer::DrawImageRotated(ImageID atlas_image, float x, float y, float s {x2, y2}, {x1, y2}, }; - float u1 = image.u1; - float u2 = image.u2; + float u1 = image->u1; + float u2 = image->u2; if (mirror_h) { float temp = u1; u1 = u2; u2 = temp; } const float uv[6][2] = { - {u1, image.v1}, - {u2, image.v1}, - {u2, image.v2}, - {u1, image.v1}, - {u2, image.v2}, - {u1, image.v2}, + {u1, image->v1}, + {u2, image->v1}, + {u2, image->v2}, + {u1, image->v1}, + {u2, image->v2}, + {u1, image->v2}, }; for (int i = 0; i < 6; i++) { rot(v[i], angle, x, y); @@ -306,13 +320,17 @@ void DrawBuffer::DrawTexRect(float x1, float y1, float x2, float y2, float u1, f } void DrawBuffer::DrawImage4Grid(ImageID atlas_image, float x1, float y1, float x2, float y2, Color color, float corner_scale) { - const AtlasImage &image = atlas->images[atlas_image]; + const AtlasImage *image = atlas->getImage(atlas_image); - float u1 = image.u1, v1 = image.v1, u2 = image.u2, v2 = image.v2; + if (!image) { + return; + } + + float u1 = image->u1, v1 = image->v1, u2 = image->u2, v2 = image->v2; float um = (u2 + u1) * 0.5f; float vm = (v2 + v1) * 0.5f; - float iw2 = (image.w * 0.5f) * corner_scale; - float ih2 = (image.h * 0.5f) * corner_scale; + float iw2 = (image->w * 0.5f) * corner_scale; + float ih2 = (image->h * 0.5f) * corner_scale; float xa = x1 + iw2; float xb = x2 - iw2; float ya = y1 + ih2; @@ -332,13 +350,13 @@ void DrawBuffer::DrawImage4Grid(ImageID atlas_image, float x1, float y1, float x } void DrawBuffer::DrawImage2GridH(ImageID atlas_image, float x1, float y1, float x2, Color color, float corner_scale) { - const AtlasImage &image = atlas->images[atlas_image]; - float um = (image.u1 + image.u2) * 0.5f; - float iw2 = (image.w * 0.5f) * corner_scale; + const AtlasImage *image = atlas->getImage(atlas_image); + float um = (image->u1 + image->u2) * 0.5f; + float iw2 = (image->w * 0.5f) * corner_scale; float xa = x1 + iw2; float xb = x2 - iw2; - float u1 = image.u1, v1 = image.v1, u2 = image.u2, v2 = image.v2; - float y2 = y1 + image.h; + float u1 = image->u1, v1 = image->v1, u2 = image->u2, v2 = image->v2; + float y2 = y1 + image->h; DrawTexRect(x1, y1, xa, y2, u1, v1, um, v2, color); DrawTexRect(xa, y1, xb, y2, um, v1, um, v2, color); DrawTexRect(xb, y1, x2, y2, um, v1, u2, v2, color); @@ -374,8 +392,13 @@ float AtlasWordWrapper::MeasureWidth(const char *str, size_t bytes) { return w; } -void DrawBuffer::MeasureTextCount(int font, const char *text, int count, float *w, float *h) { - const AtlasFont &atlasfont = *atlas->fonts[font]; +void DrawBuffer::MeasureTextCount(FontID font, const char *text, int count, float *w, float *h) { + const AtlasFont *atlasfont = atlas->getFont(font); + if (!atlasfont) { + *w = 0.0f; + *h = 0.0f; + return; + } unsigned int cval; float wacc = 0; @@ -402,17 +425,17 @@ void DrawBuffer::MeasureTextCount(int font, const char *text, int count, float * // Ignore lone ampersands continue; } - const AtlasChar *c = atlasfont.getChar(cval); + const AtlasChar *c = atlasfont->getChar(cval); if (c) { wacc += c->wx * fontscalex; } } if (w) *w = std::max(wacc, maxX); - if (h) *h = atlasfont.height * fontscaley * lines; + if (h) *h = atlasfont->height * fontscaley * lines; } -void DrawBuffer::MeasureTextRect(int font, const char *text, int count, const Bounds &bounds, float *w, float *h, int align) { - if (!text || (uint32_t)font >= (uint32_t)atlas->num_fonts) { +void DrawBuffer::MeasureTextRect(FontID font_id, const char *text, int count, const Bounds &bounds, float *w, float *h, int align) { + if (!text || font_id.isInvalid()) { *w = 0; *h = 0; return; @@ -420,17 +443,20 @@ void DrawBuffer::MeasureTextRect(int font, const char *text, int count, const Bo std::string toMeasure = std::string(text, count); if (align & FLAG_WRAP_TEXT) { - AtlasWordWrapper wrapper(*atlas->fonts[font], fontscalex, toMeasure.c_str(), bounds.w); + const AtlasFont *font = atlas->getFont(font_id); + if (!font) + return; + AtlasWordWrapper wrapper(*font, fontscalex, toMeasure.c_str(), bounds.w); toMeasure = wrapper.Wrapped(); } - MeasureTextCount(font, toMeasure.c_str(), (int)toMeasure.length(), w, h); + MeasureTextCount(font_id, toMeasure.c_str(), (int)toMeasure.length(), w, h); } -void DrawBuffer::MeasureText(int font, const char *text, float *w, float *h) { +void DrawBuffer::MeasureText(FontID font, const char *text, float *w, float *h) { return MeasureTextCount(font, text, (int)strlen(text), w, h); } -void DrawBuffer::DrawTextShadow(int font, const char *text, float x, float y, Color color, int flags) { +void DrawBuffer::DrawTextShadow(FontID font, const char *text, float x, float y, Color color, int flags) { uint32_t alpha = (color >> 1) & 0xFF000000; DrawText(font, text, x + 2, y + 2, alpha, flags); DrawText(font, text, x, y, color, flags); @@ -449,7 +475,7 @@ void DrawBuffer::DoAlign(int flags, float *x, float *y, float *w, float *h) { // TODO: Actually use the rect properly, take bounds. -void DrawBuffer::DrawTextRect(int font, const char *text, float x, float y, float w, float h, Color color, int align) { +void DrawBuffer::DrawTextRect(FontID font, const char *text, float x, float y, float w, float h, Color color, int align) { if (align & ALIGN_HCENTER) { x += w / 2; } else if (align & ALIGN_RIGHT) { @@ -463,7 +489,7 @@ void DrawBuffer::DrawTextRect(int font, const char *text, float x, float y, floa std::string toDraw = text; if (align & FLAG_WRAP_TEXT) { - AtlasWordWrapper wrapper(*atlas->fonts[font], fontscalex, toDraw.c_str(), w); + AtlasWordWrapper wrapper(*atlas->getFont(font), fontscalex, toDraw.c_str(), w); toDraw = wrapper.Wrapped(); } @@ -493,7 +519,7 @@ void DrawBuffer::DrawTextRect(int font, const char *text, float x, float y, floa } // ROTATE_* doesn't yet work right. -void DrawBuffer::DrawText(int font, const char *text, float x, float y, Color color, int align) { +void DrawBuffer::DrawText(FontID font, const char *text, float x, float y, Color color, int align) { // rough estimate size_t textLen = strlen(text); if (count_ + textLen * 6 > MAX_VERTS) { @@ -503,7 +529,9 @@ void DrawBuffer::DrawText(int font, const char *text, float x, float y, Color co } } - const AtlasFont &atlasfont = *atlas->fonts[font]; + const AtlasFont *atlasfont = atlas->getFont(font); + if (!atlasfont) + return; unsigned int cval; float w, h; MeasureText(font, text, &w, &h); @@ -512,10 +540,10 @@ void DrawBuffer::DrawText(int font, const char *text, float x, float y, Color co } if (align & ROTATE_90DEG_LEFT) { - x -= atlasfont.ascend * fontscaley; + x -= atlasfont->ascend * fontscaley; // y += h; } else { - y += atlasfont.ascend * fontscaley; + y += atlasfont->ascend * fontscaley; } float sx = x; UTF8 utf(text); @@ -527,7 +555,7 @@ void DrawBuffer::DrawText(int font, const char *text, float x, float y, Color co if (cval == 0xA0) { cval = ' '; } else if (cval == '\n') { - y += atlasfont.height * fontscaley; + y += atlasfont->height * fontscaley; x = sx; continue; } else if (cval == '\t') { @@ -536,9 +564,9 @@ void DrawBuffer::DrawText(int font, const char *text, float x, float y, Color co // Ignore lone ampersands continue; } - const AtlasChar *ch = atlasfont.getChar(cval); + const AtlasChar *ch = atlasfont->getChar(cval); if (!ch) - ch = atlasfont.getChar('?'); + ch = atlasfont->getChar('?'); if (ch) { const AtlasChar &c = *ch; float cx1, cy1, cx2, cy2; diff --git a/ext/native/gfx_es2/draw_buffer.h b/ext/native/gfx_es2/draw_buffer.h index d90f8ae774..211fc4fb95 100644 --- a/ext/native/gfx_es2/draw_buffer.h +++ b/ext/native/gfx_es2/draw_buffer.h @@ -79,7 +79,7 @@ public: void vLine(float x, float y1, float y2, uint32_t color); void vLineAlpha50(float x, float y1, float y2, uint32_t color); - void Line(int atlas_image, float x1, float y1, float x2, float y2, float thickness, uint32_t color); + void Line(ImageID atlas_image, float x1, float y1, float x2, float y2, float thickness, uint32_t color); void RectOutline(float x, float y, float w, float h, uint32_t color, int align = ALIGN_TOPLEFT); @@ -109,7 +109,7 @@ public: atlas = _atlas; } const Atlas *GetAtlas() const { return atlas; } - void MeasureImage(ImageID atlas_image, float *w, float *h); + bool MeasureImage(ImageID atlas_image, float *w, float *h); void DrawImage(ImageID atlas_image, float x, float y, float scale, Color color = COLOR(0xFFFFFF), int align = ALIGN_TOPLEFT); void DrawImageStretch(ImageID atlas_image, float x1, float y1, float x2, float y2, Color color = COLOR(0xFFFFFF)); void DrawImageStretch(ImageID atlas_image, const Bounds &bounds, Color color = COLOR(0xFFFFFF)) { @@ -125,15 +125,15 @@ public: // This is only 6 triangles, much cheaper. void DrawImage2GridH(ImageID atlas_image, float x1, float y1, float x2, Color color = COLOR(0xFFFFFF), float scale = 1.0); - void MeasureText(int font, const char *text, float *w, float *h); + void MeasureText(FontID font, const char *text, float *w, float *h); // NOTE: Count is in plain chars not utf-8 chars! - void MeasureTextCount(int font, const char *text, int count, float *w, float *h); - void MeasureTextRect(int font, const char *text, int count, const Bounds &bounds, float *w, float *h, int align = 0); + void MeasureTextCount(FontID font, const char *text, int count, float *w, float *h); + void MeasureTextRect(FontID font, const char *text, int count, const Bounds &bounds, float *w, float *h, int align = 0); - void DrawTextRect(int font, const char *text, float x, float y, float w, float h, Color color = 0xFFFFFFFF, int align = 0); - void DrawText(int font, const char *text, float x, float y, Color color = 0xFFFFFFFF, int align = 0); - void DrawTextShadow(int font, const char *text, float x, float y, Color color = 0xFFFFFFFF, int align = 0); + void DrawTextRect(FontID font, const char *text, float x, float y, float w, float h, Color color = 0xFFFFFFFF, int align = 0); + void DrawText(FontID font, const char *text, float x, float y, Color color = 0xFFFFFFFF, int align = 0); + void DrawTextShadow(FontID font, const char *text, float x, float y, Color color = 0xFFFFFFFF, int align = 0); void SetFontScale(float xs, float ys) { fontscalex = xs; diff --git a/ext/native/tools/atlastool.cpp b/ext/native/tools/atlastool.cpp index 336b677e92..c0fac7431d 100644 --- a/ext/native/tools/atlastool.cpp +++ b/ext/native/tools/atlastool.cpp @@ -631,6 +631,8 @@ struct FontDesc { header.height = ascend + descend; header.ascend = ascend; header.distslope = distmult / 256.0; + strncpy(header.name, name.c_str(), sizeof(header.name)); + header.name[sizeof(header.name) - 1] = '\0'; header.numChars = numChars; header.numRanges = (int)ranges.size(); return header; @@ -642,11 +644,11 @@ struct FontDesc { for (size_t r = 0; r < ranges.size(); r++) { int first_char_id = ranges[r].start; int last_char_id = ranges[r].end; - start_index += last_char_id - first_char_id; AtlasCharRange range; range.start = first_char_id; range.end = last_char_id; range.start_index = start_index; + start_index += last_char_id - first_char_id; out_ranges.push_back(range); } return out_ranges; @@ -679,8 +681,8 @@ struct ImageDesc { Effect effect; int result_index; - AtlasImage2 ToAtlasImage2(float tw, float th, const vector &results) { - AtlasImage2 img; + AtlasImage ToAtlasImage(float tw, float th, const vector &results) { + AtlasImage img; int i = result_index; float toffx = 0.5f / tw; float toffy = 0.5f / th; @@ -965,6 +967,14 @@ int main(int argc, char **argv) { dest.SaveZIM(image_name.c_str(), ZIM_RGBA4444 | ZIM_ZLIB_COMPRESSED); } + // Also save PNG for debugging. + printf("Writing .PNG %s\n", (image_name + ".png").c_str()); + dest.SavePNG((image_name + ".png").c_str()); + + printf("Done. Outputting source and meta files %s_atlas.cpp/h/meta.\n", out_prefix.c_str()); + // Sort items by ID. + sort(results.begin(), results.end()); + // Save all the metadata. { FILE *meta = fopen(meta_name.c_str(), "wb"); @@ -976,8 +986,7 @@ int main(int argc, char **argv) { fwrite(&header, 1, sizeof(header), meta); // For each image for (int i = 0; i < (int)images.size(); i++) { - auto &image = images[i]; - AtlasImage2 atlas_image = image.ToAtlasImage2(dest.width(), dest.height(), results); + AtlasImage atlas_image = images[i].ToAtlasImage(dest.width(), dest.height(), results); fwrite(&atlas_image, 1, sizeof(atlas_image), meta); } // For each font @@ -994,14 +1003,6 @@ int main(int argc, char **argv) { fclose(meta); } - // Also save PNG for debugging. - printf("Writing .PNG %s\n", (image_name + ".png").c_str()); - dest.SavePNG((image_name + ".png").c_str()); - - printf("Done. Outputting source files %s_atlas.cpp/h.\n", out_prefix.c_str()); - // Sort items by ID. - sort(results.begin(), results.end()); - FILE *cpp_file = fopen((out_prefix + "_atlas.cpp").c_str(), "wb"); fprintf(cpp_file, "// C++ generated by atlastool from %s (hrydgard@gmail.com)\n\n", argv[1]); fprintf(cpp_file, "#include \"%s\"\n\n", (out_prefix + "_atlas.h").c_str()); diff --git a/ext/native/tools/atlastool/atlastool.vcxproj b/ext/native/tools/atlastool/atlastool.vcxproj index 592c7dac88..20c96b3f1a 100644 --- a/ext/native/tools/atlastool/atlastool.vcxproj +++ b/ext/native/tools/atlastool/atlastool.vcxproj @@ -60,6 +60,7 @@ true + ../build/ false diff --git a/ext/native/ui/view.cpp b/ext/native/ui/view.cpp index 965a8aacb8..01376c4c09 100644 --- a/ext/native/ui/view.cpp +++ b/ext/native/ui/view.cpp @@ -513,10 +513,8 @@ void ClickableItem::Draw(UIContext &dc) { } void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { - if (atlasImage_ != -1) { - const AtlasImage &img = dc.Draw()->GetAtlas()->images[atlasImage_]; - w = img.w; - h = img.h; + if (atlasImage_.isValid()) { + dc.Draw()->GetAtlas()->measureImage(atlasImage_, &w, &h); } else { const int paddingX = 12; float availWidth = horiz.size - paddingX * 2 - textPadding_.horiz(); @@ -570,7 +568,7 @@ void Choice::Draw(UIContext &dc) { style = dc.theme->itemDisabledStyle; } - if (atlasImage_ != -1) { + if (atlasImage_.isValid()) { dc.Draw()->DrawImage(atlasImage_, bounds_.centerX(), bounds_.centerY(), 1.0f, style.fgColor, ALIGN_CENTER); } else { dc.SetFontStyle(dc.theme->uiFont); @@ -583,7 +581,7 @@ void Choice::Draw(UIContext &dc) { if (centered_) { dc.DrawTextRect(text_.c_str(), bounds_, style.fgColor, ALIGN_CENTER | FLAG_WRAP_TEXT); } else { - if (iconImage_ != -1) { + if (iconImage_.isValid()) { dc.Draw()->DrawImage(iconImage_, bounds_.x2() - 32 - paddingX, bounds_.centerY(), 0.5f, style.fgColor, ALIGN_CENTER); } @@ -634,8 +632,8 @@ void InfoItem::Draw(UIContext &dc) { ItemHeader::ItemHeader(const std::string &text, LayoutParams *layoutParams) : Item(layoutParams), text_(text) { - layoutParams_->width = FILL_PARENT; - layoutParams_->height = 40; + layoutParams_->width = FILL_PARENT; + layoutParams_->height = 40; } void ItemHeader::Draw(UIContext &dc) { @@ -709,7 +707,7 @@ void CheckBox::Draw(UIContext &dc) { ClickableItem::Draw(dc); - int image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff; + ImageID image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff; float imageW, imageH; dc.Draw()->MeasureImage(image, &imageW, &imageH); @@ -736,7 +734,7 @@ float CheckBox::CalculateTextScale(const UIContext &dc, float availWidth) const } void CheckBox::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - int image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff; + ImageID image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff; float imageW, imageH; dc.Draw()->MeasureImage(image, &imageW, &imageH); @@ -769,10 +767,8 @@ bool BitCheckBox::Toggled() const { } void Button::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - if (imageID_ != -1) { - const AtlasImage *img = &dc.Draw()->GetAtlas()->images[imageID_]; - w = img->w; - h = img->h; + if (imageID_.isValid()) { + dc.Draw()->GetAtlas()->measureImage(imageID_, &w, &h); } else { dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &w, &h); } @@ -792,36 +788,38 @@ void Button::Draw(UIContext &dc) { DrawBG(dc, style); float tw, th; dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &tw, &th); - if (tw > bounds_.w || imageID_ != -1) { + if (tw > bounds_.w || imageID_.isValid()) { dc.PushScissor(bounds_); } dc.SetFontStyle(dc.theme->uiFont); - if (imageID_ != -1 && text_.empty()) { + if (imageID_.isValid() && text_.empty()) { dc.Draw()->DrawImage(imageID_, bounds_.centerX(), bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); } else if (!text_.empty()) { dc.DrawText(text_.c_str(), bounds_.centerX(), bounds_.centerY(), style.fgColor, ALIGN_CENTER); - if (imageID_ != -1) { - const AtlasImage &img = dc.Draw()->GetAtlas()->images[imageID_]; - dc.Draw()->DrawImage(imageID_, bounds_.centerX() - tw / 2 - 5 - img.w/2, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); + if (imageID_.isValid()) { + const AtlasImage *img = dc.Draw()->GetAtlas()->getImage(imageID_); + if (img) { + dc.Draw()->DrawImage(imageID_, bounds_.centerX() - tw / 2 - 5 - img->w / 2, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); + } } } - if (tw > bounds_.w || imageID_ != -1) { + if (tw > bounds_.w || imageID_.isValid()) { dc.PopScissor(); } } void ImageView::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - const AtlasImage &img = dc.Draw()->GetAtlas()->images[atlasImage_]; + dc.Draw()->GetAtlas()->measureImage(atlasImage_, &w, &h); // TODO: involve sizemode - w = img.w; - h = img.h; } void ImageView::Draw(UIContext &dc) { - const AtlasImage &img = dc.Draw()->GetAtlas()->images[atlasImage_]; - // TODO: involve sizemode - float scale = bounds_.w / img.w; - dc.Draw()->DrawImage(atlasImage_, bounds_.x, bounds_.y, scale, 0xFFFFFFFF, ALIGN_TOPLEFT); + const AtlasImage *img = dc.Draw()->GetAtlas()->getImage(atlasImage_); + if (img) { + // TODO: involve sizemode + float scale = bounds_.w / img->w; + dc.Draw()->DrawImage(atlasImage_, bounds_.x, bounds_.y, scale, 0xFFFFFFFF, ALIGN_TOPLEFT); + } } void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { @@ -1146,9 +1144,7 @@ void TriggerButton::Draw(UIContext &dc) { } void TriggerButton::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - const AtlasImage &image = dc.Draw()->GetAtlas()->images[imageBackground_]; - w = image.w; - h = image.h; + dc.Draw()->GetAtlas()->measureImage(imageBackground_, &w, &h); } bool Slider::Key(const KeyInput &input) { diff --git a/ext/native/ui/view.h b/ext/native/ui/view.h index 32be22ec86..8bcbbe7a0d 100644 --- a/ext/native/ui/view.h +++ b/ext/native/ui/view.h @@ -28,6 +28,8 @@ struct KeyInput; struct TouchInput; struct AxisInput; +struct ImageID; + class DrawBuffer; class Texture; class UIContext; @@ -64,29 +66,29 @@ enum Visibility { }; struct Drawable { - Drawable() : type(DRAW_NOTHING), image(-1), color(0xFFFFFFFF) {} - explicit Drawable(uint32_t col) : type(DRAW_SOLID_COLOR), image(-1), color(col) {} - Drawable(DrawableType t, int img, uint32_t col = 0xFFFFFFFF) : type(t), image(img), color(col) {} + Drawable() : type(DRAW_NOTHING), image(ImageID::invalid()), color(0xFFFFFFFF) {} + explicit Drawable(uint32_t col) : type(DRAW_SOLID_COLOR), image(ImageID::invalid()), color(col) {} + Drawable(DrawableType t, ImageID img, uint32_t col = 0xFFFFFFFF) : type(t), image(img), color(col) {} DrawableType type; - uint32_t image; + ImageID image; uint32_t color; }; struct Style { - Style() : fgColor(0xFFFFFFFF), background(0xFF303030), image(-1) {} + Style() : fgColor(0xFFFFFFFF), background(0xFF303030), image(ImageID::invalid()) {} uint32_t fgColor; Drawable background; - int image; // where applicable. + ImageID image; // where applicable. }; struct FontStyle { FontStyle() : atlasFont(0), sizePts(0), flags(0) {} FontStyle(const char *name, int size) : atlasFont(0), fontName(name), sizePts(size), flags(0) {} - FontStyle(int atlasFnt, const char *name, int size) : atlasFont(atlasFnt), fontName(name), sizePts(size), flags(0) {} + FontStyle(FontID atlasFnt, const char *name, int size) : atlasFont(atlasFnt), fontName(name), sizePts(size), flags(0) {} - int atlasFont; + FontID atlasFont; // For native fonts: std::string fontName; int sizePts; @@ -99,11 +101,12 @@ struct Theme { FontStyle uiFont; FontStyle uiFontSmall; FontStyle uiFontSmaller; - int checkOn; - int checkOff; - int sliderKnob; - int whiteImage; - int dropShadow4Grid; + + ImageID checkOn; + ImageID checkOff; + ImageID sliderKnob; + ImageID whiteImage; + ImageID dropShadow4Grid; Style buttonStyle; Style buttonFocusedStyle; @@ -497,7 +500,7 @@ protected: class Button : public Clickable { public: Button(const std::string &text, LayoutParams *layoutParams = 0) - : Clickable(layoutParams), text_(text), imageID_(-1) {} + : Clickable(layoutParams), text_(text), imageID_(ImageID::invalid()) {} Button(ImageID imageID, LayoutParams *layoutParams = 0) : Clickable(layoutParams), imageID_(imageID) {} Button(const std::string &text, ImageID imageID, LayoutParams *layoutParams = 0) @@ -585,7 +588,7 @@ private: // Suitable for controller simulation (ABXY etc). class TriggerButton : public View { public: - TriggerButton(uint32_t *bitField, uint32_t bit, int imageBackground, int imageForeground, LayoutParams *layoutParams) + TriggerButton(uint32_t *bitField, uint32_t bit, ImageID imageBackground, ImageID imageForeground, LayoutParams *layoutParams) : View(layoutParams), down_(0.0), bitField_(bitField), bit_(bit), imageBackground_(imageBackground), imageForeground_(imageForeground) {} void Touch(const TouchInput &input) override; @@ -598,8 +601,8 @@ private: uint32_t *bitField_; uint32_t bit_; - int imageBackground_; - int imageForeground_; + ImageID imageBackground_; + ImageID imageForeground_; }; @@ -627,9 +630,9 @@ public: Choice(const std::string &text, LayoutParams *layoutParams = nullptr) : Choice(text, std::string(), false, layoutParams) {} Choice(const std::string &text, const std::string &smallText, bool selected = false, LayoutParams *layoutParams = nullptr) - : ClickableItem(layoutParams), text_(text), smallText_(smallText), atlasImage_(-1), iconImage_(-1), centered_(false), highlighted_(false), selected_(selected) {} + : ClickableItem(layoutParams), text_(text), smallText_(smallText), atlasImage_(ImageID::invalid()), iconImage_(ImageID::invalid()), centered_(false), highlighted_(false), selected_(selected) {} Choice(ImageID image, LayoutParams *layoutParams = nullptr) - : ClickableItem(layoutParams), atlasImage_(image), iconImage_(-1), centered_(false), highlighted_(false), selected_(false) {} + : ClickableItem(layoutParams), atlasImage_(image), iconImage_(ImageID::invalid()), centered_(false), highlighted_(false), selected_(false) {} virtual void HighlightChanged(bool highlighted); void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override; @@ -853,14 +856,14 @@ enum ImageSizeMode { class ImageView : public InertView { public: - ImageView(int atlasImage, ImageSizeMode sizeMode, LayoutParams *layoutParams = 0) + ImageView(ImageID atlasImage, ImageSizeMode sizeMode, LayoutParams *layoutParams = 0) : InertView(layoutParams), atlasImage_(atlasImage), sizeMode_(sizeMode) {} void GetContentDimensions(const UIContext &dc, float &w, float &h) const override; void Draw(UIContext &dc) override; private: - int atlasImage_; + ImageID atlasImage_; ImageSizeMode sizeMode_; }; @@ -889,7 +892,7 @@ private: class Spinner : public InertView { public: - Spinner(const int *images, int numImages, LayoutParams *layoutParams = 0) + Spinner(const ImageID *images, int numImages, LayoutParams *layoutParams = 0) : InertView(layoutParams), images_(images), numImages_(numImages) { } @@ -898,7 +901,7 @@ public: void SetColor(uint32_t color) { color_ = color; } private: - const int *images_; + const ImageID *images_; int numImages_; uint32_t color_ = 0xFFFFFFFF; };