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 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

E|F}y( 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℞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 literal 0 HcmV?d00001 diff --git a/android/assets/ui_atlas.meta b/android/assets/ui_atlas.meta new file mode 100644 index 0000000000000000000000000000000000000000..e6b9cf53a22caf9bdf0c0ecc61a836feadaf5394 GIT binary patch literal 1087712 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 E518@n6951J 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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 A=Kufz delta 26014 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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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 HI%fVaXe+h@ delta 21722 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 diff --git a/build_ppgeatlas.sh b/build_ppgeatlas.sh index 46a25a9987..bee2e6c56d 100755 --- a/build_ppgeatlas.sh +++ b/build_ppgeatlas.sh @@ -1 +1 @@ -./ext/native/tools/build/atlastool ppge_atlasscript.txt ppge && mv ppge_atlas.cpp ppge_atlas.h Core/Util && cp ppge_atlas.zim assets && mv ppge_atlas.zim ppge_atlas.meta android/assets +./ext/native/tools/build/atlastool ppge_atlasscript.txt ppge && rm ppge_atlas.cpp ppge_atlas.h && cp ppge_atlas.zim assets && cp ppge_atlas.meta assets && mv ppge_atlas.zim ppge_atlas.meta android/assets diff --git a/buildatlas.sh b/buildatlas.sh index c503115f1a..6034748179 100755 --- a/buildatlas.sh +++ b/buildatlas.sh @@ -1,2 +1,3 @@ -./ext/native/tools/build/atlastool atlasscript.txt ui 8888 && cp ui_atlas.zim ui_atlas.meta assets && cp ui_atlas.zim ui_atlas.meta android/assets && mv ui_atlas.cpp ui_atlas.h UI +./ext/native/tools/build/atlastool atlasscript.txt ui 8888 && cp ui_atlas.zim ui_atlas.meta assets && cp ui_atlas.zim ui_atlas.meta android/assets && rm ui_atlas.cpp ui_atlas.h + rm ui_atlas.zim ui_atlas.meta diff --git a/ext/native/gfx/texture_atlas.cpp b/ext/native/gfx/texture_atlas.cpp index 275d17f0cb..14f779a3e3 100644 --- a/ext/native/gfx/texture_atlas.cpp +++ b/ext/native/gfx/texture_atlas.cpp @@ -1,22 +1,100 @@ -#include +#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; };