From 3b112889892f6652d4e80d97e45131f179b1fbe4 Mon Sep 17 00:00:00 2001 From: stujones11 Date: Sun, 18 Nov 2018 10:31:19 +0000 Subject: [PATCH] Android: Improve UI scaling on smaller high-density displays (#7834) * Android: Improve UI scaling on smaller high-density displays --- builtin/mainmenu/tab_settings.lua | 7 ++++--- src/client/clientlauncher.cpp | 28 ++++++++++++++++++++++++++- src/gui/guiFormSpecMenu.cpp | 30 +++++++++++++++++++++-------- src/gui/guiTable.cpp | 8 +++++--- textures/base/pack/checkbox_16.png | Bin 0 -> 288 bytes textures/base/pack/checkbox_32.png | Bin 0 -> 436 bytes textures/base/pack/checkbox_64.png | Bin 0 -> 766 bytes 7 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 textures/base/pack/checkbox_16.png create mode 100644 textures/base/pack/checkbox_32.png create mode 100644 textures/base/pack/checkbox_64.png diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 11611919e..7b2cee6ac 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -237,9 +237,10 @@ local function formspec(tabview, name, tabdata) if core.settings:get("touchscreen_threshold") ~= nil then tab_string = tab_string .. - "label[4.3,4.1;" .. fgettext("Touchthreshold (px)") .. "]" .. - "dropdown[3.85,4.55;3.85;dd_touchthreshold;0,10,20,30,40,50;" .. - ((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) .. "]" + "label[4.3,4.2;" .. fgettext("Touchthreshold: (px)") .. "]" .. + "dropdown[4.25,4.65;3.5;dd_touchthreshold;0,10,20,30,40,50;" .. + ((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) .. + "]box[4.0,4.5;3.75,1.0;#999999]" end if shaders_enabled then diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index 85063ff86..0820177b4 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -38,6 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #if USE_SOUND #include "sound_openal.h" #endif +#ifdef __ANDROID__ + #include "porting.h" +#endif /* mainmenumanager.h */ @@ -127,7 +130,30 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args) skin->setColor(gui::EGDC_3D_SHADOW, video::SColor(255, 0, 0, 0)); skin->setColor(gui::EGDC_HIGH_LIGHT, video::SColor(255, 70, 120, 50)); skin->setColor(gui::EGDC_HIGH_LIGHT_TEXT, video::SColor(255, 255, 255, 255)); - +#ifdef __ANDROID__ + float density = porting::getDisplayDensity(); + skin->setSize(gui::EGDS_CHECK_BOX_WIDTH, (s32)(17.0f * density)); + skin->setSize(gui::EGDS_SCROLLBAR_SIZE, (s32)(14.0f * density)); + skin->setSize(gui::EGDS_WINDOW_BUTTON_WIDTH, (s32)(15.0f * density)); + if (density > 1.5f) { + std::string sprite_path = porting::path_user + "/textures/base/pack/"; + if (density > 3.5f) + sprite_path.append("checkbox_64.png"); + else if (density > 2.0f) + sprite_path.append("checkbox_32.png"); + else + sprite_path.append("checkbox_16.png"); + // Texture dimensions should be a power of 2 + gui::IGUISpriteBank *sprites = skin->getSpriteBank(); + video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::ITexture *sprite_texture = driver->getTexture(sprite_path.c_str()); + if (sprite_texture) { + s32 sprite_id = sprites->addTextureAsSprite(sprite_texture); + if (sprite_id != -1) + skin->setIcon(gui::EGDI_CHECK_BOX_CHECKED, sprite_id); + } + } +#endif g_fontengine = new FontEngine(g_settings, guienv); FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed."); diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 363128012..f23055821 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -284,12 +284,13 @@ void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element) data->invsize.Y = MYMAX(0, stof(parts[1])); lockSize(false); +#ifndef __ANDROID__ if (parts.size() == 3) { if (parts[2] == "true") { lockSize(true,v2u32(800,600)); } } - +#endif data->explicit_size = true; return; } @@ -437,11 +438,12 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element fselected = true; std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); + s32 spacing = Environment->getSkin()->getSize(gui::EGDS_CHECK_BOX_WIDTH) + 7; core::rect rect = core::rect( - pos.X, pos.Y + ((imgsize.Y/2) - m_btn_height), - pos.X + m_font->getDimension(wlabel.c_str()).Width + 25, // text size + size of checkbox - pos.Y + ((imgsize.Y/2) + m_btn_height)); + pos.X, pos.Y + ((imgsize.Y / 2) - m_btn_height), + pos.X + m_font->getDimension(wlabel.c_str()).Width + spacing, + pos.Y + ((imgsize.Y / 2) + m_btn_height)); FieldSpec spec( name, @@ -2145,16 +2147,28 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) // the image size can't be less than 0.3 inch // multiplied by gui_scaling, even if this means // the form doesn't fit the screen. - double prefer_imgsize = mydata.screensize.Y / 15 * - gui_scaling; +#ifdef __ANDROID__ + // For mobile devices these magic numbers are + // different and forms should always use the + // maximum screen space available. + double prefer_imgsize = mydata.screensize.Y / 10 * gui_scaling; double fitx_imgsize = mydata.screensize.X / - ((5.0/4.0) * (0.5 + mydata.invsize.X)); + ((12.0 / 8.0) * (0.5 + mydata.invsize.X)); double fity_imgsize = mydata.screensize.Y / - ((15.0/13.0) * (0.85 * mydata.invsize.Y)); + ((15.0 / 11.0) * (0.85 + mydata.invsize.Y)); + use_imgsize = MYMIN(prefer_imgsize, + MYMIN(fitx_imgsize, fity_imgsize)); +#else + double prefer_imgsize = mydata.screensize.Y / 15 * gui_scaling; + double fitx_imgsize = mydata.screensize.X / + ((5.0 / 4.0) * (0.5 + mydata.invsize.X)); + double fity_imgsize = mydata.screensize.Y / + ((15.0 / 13.0) * (0.85 * mydata.invsize.Y)); double screen_dpi = RenderingEngine::getDisplayDensity() * 96; double min_imgsize = 0.3 * screen_dpi * gui_scaling; use_imgsize = MYMAX(min_imgsize, MYMIN(prefer_imgsize, MYMIN(fitx_imgsize, fity_imgsize))); +#endif } // Everything else is scaled in proportion to the diff --git a/src/gui/guiTable.cpp b/src/gui/guiTable.cpp index 501b425f8..b1a027e9b 100644 --- a/src/gui/guiTable.cpp +++ b/src/gui/guiTable.cpp @@ -78,10 +78,12 @@ GUITable::GUITable(gui::IGUIEnvironment *env, setTabStop(true); setTabOrder(-1); updateAbsolutePosition(); - + float density = RenderingEngine::getDisplayDensity(); +#ifdef __ANDROID__ + density = 1; // dp scaling is applied by the skin +#endif core::rect relative_rect = m_scrollbar->getRelativePosition(); - s32 width = (relative_rect.getWidth()/(2.0/3.0)) * - RenderingEngine::getDisplayDensity() * + s32 width = (relative_rect.getWidth() / (2.0 / 3.0)) * density * g_settings->getFloat("gui_scaling"); m_scrollbar->setRelativePosition(core::rect( relative_rect.LowerRightCorner.X-width,relative_rect.UpperLeftCorner.Y, diff --git a/textures/base/pack/checkbox_16.png b/textures/base/pack/checkbox_16.png new file mode 100644 index 0000000000000000000000000000000000000000..db6101f3603176daa2ebf6ded10acc60fc7d929b GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?- zG7x6;t5)LxG9*h}BT9nv(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647Dw^x*;uvDl zdv&5C-ysDNR`wUN3aXhN`G*en+ID8{dd$a^cVxvvv0cT}S}OPaZ`_|ObNpn~?u@nR z3>USz71volm%NeG6E|;4you?G6VW{v+XeF48TUUq%;s*?pd)_Y{I(Wz$E~!fLEptB z6Ff9MHB*1~dTN$3p0M2g{N}8nPl_#D&6eF*8GWPnr}BdIXLlRcPgv->E~%&Rn8bD6 bc~2P&8agD_+1z&rI+VfF)z4*}Q$iB}tx#!I literal 0 HcmV?d00001 diff --git a/textures/base/pack/checkbox_32.png b/textures/base/pack/checkbox_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ff59a3a0be6a992d2b2b8b60326cf01bfbd12e GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3a z8xUr!)F|8wWJs2{MwA5SrEaj? z(fW3Zq2Cb$0ayFJU=`J%W0UxqRLvLNWaWxlbwZ@$bil#dJJwFOJeJ*Du;E7E+|o_H zb>ga@s!#RUZ%94urKqIZQn6oT&(xqO&84DFdwTDSW*@M8&VSfA`OUU!11YIGHDPQ^`}mS0^4%CJ>24B9Tbs%t&@W7fB)_WuE6h zxWEXBh};!LQ58i|iO5e{BFsFUm=6*WDYGp5SpPyPb)BZ^YpwM|(?RDF;7GovEy6hj zXq2ycF2d9Uw93~sMVNAc&hj;!v48AXRv%t zRaL+DgV{MJZ}h(G57}%{h57P+XOdi4y;8Y&M4&YoK!VTa> z9>NUZO&-Dv;8h;N3gBHH!U-^nJcJQoGo?RED0k=8`MG?j;L z0TL0p&GY;_b|M%*&+p{FU?>mmD?;^UdNZ5N-n1<-cVIu>&;fRr{bwx5!}9?Kt+V$T zuP-)U^M^DA7`)Ejcf78+kcZO&jMmwQjMs)Mc{mPWyv{y!ye3@A!~X%Sth1YpcZh3w z_!q$1I=kt3HM?7#wRig__Va+JYvp}O)AYlWc|uV4`8M`10j>38nx*BqCCZNXhu0IgZ9fe^n(Ci9{yH9|36VDV}Z;x&QzG07*qoM6N<$f+F}-%>V!Z literal 0 HcmV?d00001