A better solution for those scaling issues in high or creepy resolutions gen II (#3910)

* Fix scaling issues

* Fonts size adjustion support

* Add fonts size support && Fix scaling issue

* Use fonts height

* Fix scaling issues

* Add my name onto CREDITS

* Fix scaling issues

* Fix scaling issues

* Use space instead of tab

* Use space instead of tab

* Fix bad scale

* Use font height
This commit is contained in:
dumaosen 2019-05-14 05:39:43 +08:00 committed by Deve
parent 86bc8bd877
commit da4ac0a976
31 changed files with 95 additions and 104 deletions

View File

@ -93,6 +93,7 @@ Bug fixes & misc contributions
- Ward Muylaert
- Fantasmos
- QwertyChouskie
- Dumaosen
= Visual art =

View File

@ -7,16 +7,16 @@
<icon-button id="reload" height="90%" icon="gui/icons/restart.png"/>
</div>
<box id="filter_box" width="97%" height="75" layout="vertical-row" align="center">
<box id="filter_box" width="97%" height="2f" layout="vertical-row" align="center">
<div x="0" y="0" width="98%" height="100%" layout="horizontal-row" align="center">
<textbox id="filter_name" proportion="7" align="center" />
<spacer width="20" />
<spacer width="1f" />
<label text="Updated" align="center" I18N="In addons screen, in the filtering bar, to enable a filter that will show only recently updated items"/>
<spacer width="10" />
<spacer width="1f" />
<spinner id="filter_date" proportion="8" align="center" min_value="0" wrap_around="true"/>
<spacer width="10" />
<spacer width="1f" />
<label text="Rating >=" align="center" I18N="In addons screen, in the filtering bar, to enable a filter that will show only items with good rating"/>
<spacer width="10" />
<spacer width="1f" />
<spinner id="filter_rating" proportion="5" align="center" min_value="0" wrap_around="true"/>
<icon-button id="filter_search" height="100%" icon="gui/icons/search.png"/>
</div>
@ -24,7 +24,7 @@
<spacer height="15" width="10"/>
<tabs id="category" height="10%" max_height="110" width="90%" align="center">
<tabs id="category" height="2f" width="90%" align="center">
<icon-button id="tab_kart" width="128" height="128" icon="gui/icons/karts.png"
I18N="In the addons screen" text="Karts"/>
<icon-button id="tab_track" width="128" height="128" icon="gui/icons/mode_normal.png"

View File

@ -15,7 +15,7 @@
<spacer width="20" height="13" />
</box>
<tabs width="100%" height="5%" id="trackgroups">
<tabs width="100%" height="1f" id="trackgroups">
<button id="standard" I18N="track group" text="Standard"/>
<button id="addons" I18N="track group" text="Add-Ons"/>
<button id="all" I18N="track group" text="All"/>

View File

@ -15,7 +15,7 @@
<spacer width="20" height="13" />
</box>
<tabs width="100%" height="5%" id="trackgroups">
<tabs width="100%" height="1f" id="trackgroups">
<button id="standard" I18N="track group" text="Standard"/>
<button id="addons" I18N="track group" text="Add-Ons"/>
<button id="all" I18N="track group" text="All"/>

View File

@ -16,7 +16,7 @@
</box>
<!-- Populated dynamically at runtime -->
<tabs width="100%" height="5%" id="trackgroups"> </tabs>
<tabs width="100%" height="1f" id="trackgroups"> </tabs>
<spacer height="10%" />

View File

@ -16,7 +16,7 @@
</box>
<!-- Populated dynamically at runtime -->
<tabs width="100%" height="5%" id="gpgroups"> </tabs>
<tabs width="100%" height="1f" id="gpgroups"> </tabs>
<spacer height="20" />

View File

@ -21,7 +21,7 @@
</box>
<!-- Groups will be added dynamically at runtime -->
<tabs width="98%" x="1%" height="5%" id="kartgroups">
<tabs width="98%" x="1%" height="1f" id="kartgroups">
</tabs>
<spacer width="100%" height="2%"/>
</div>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<stkgui>
<div x="0" y="0" width="100%" height="fit" layout="vertical-row">
<button id="user-id" width="20%" height="fit" align="right"/>
<button id="user-id" width="12f" height="fit" align="right"/>
</div>
<div x="0" y="0" width="100%" height="100%" layout="vertical-row" >

View File

@ -19,10 +19,10 @@
</box>
<!-- Groups will be added dynamically at runtime -->
<tabs width="98%" x="1%" height="5%" id="kartgroups">
<tabs width="98%" x="1%" height="1f" id="kartgroups">
</tabs>
<spacer width="100%" height="2%"/>
<progressbar x="1%" id="timer" height="4%" width="98%"></progressbar>
<progressbar x="1%" id="timer" height="1f" width="98%"></progressbar>
</div>
<icon-button id="back" x="1%" y="0" height="8%" icon="gui/icons/back.png"/>

View File

@ -3,7 +3,7 @@
<div x="0" y="0" width="100%" height="100%" layout="vertical-row" >
<header text_align="center" width="80%" align="center" text="Online"/>
<spacer height="15" width="10"/>
<button id="user-id" width="20%" height="fit" align="center"/>
<button id="user-id" width="12f" height="fit" align="center"/>
<spacer height="20"/>
<box width="fit" height="fit" layout="horizontal-row" align="center" valign="center">

View File

@ -36,7 +36,7 @@
<spacer width="20" height="20"/>
<div layout="vertical-row" proportion="1" height="fit" id="inner_box">
<gauge id="gfx_level" min_value="1" max_value="8" width="300" align="center" />
<gauge id="gfx_level" min_value="1" max_value="8" width="8f" align="center" />
<spacer height="5" width="10"/>
<button id="custom" text="Custom settings..." I18N="In the video settings" align="center"/>
</div>

View File

@ -6,7 +6,7 @@
<!-- Contents is added programatically -->
</div>
</roundedbox>
<spacer height="10" width="96%"/>
<spacer height="1%" width="96%"/>
<!-- The actual button texts will vary depending on what type of race
was being run, and if something was unlocked etc. So we don't
specify a text here, and label the buttons :
@ -16,9 +16,9 @@
Setting text=" " is important, otherwise the height of the
widget is incorrect. -->
<button id="top" align="center" width="60%"/>
<spacer height="10" width="96%"/>
<spacer height="1%" width="96%"/>
<button id="middle" align="center" width="60%"/>
<spacer height="10" width="96%"/>
<spacer height="1%" width="96%"/>
<button id="bottom" align="center" width="60%"/>
</div>
</stkgui>

View File

@ -23,7 +23,7 @@
</box>
<!-- Populated dynamically at runtime -->
<tabs width="100%" height="5%" id="trackgroups"> </tabs>
<tabs width="100%" height="1f" id="trackgroups"> </tabs>
<spacer width="100%" height="2%" />
</div>

View File

@ -537,11 +537,6 @@ namespace UserConfigParams
"Screen keyboard mode: 0 = disabled, 1 = enabled if no hardware "
"keyboard, 2 = always enabled, 3 = android keyboard (experimental)") );
PARAM_PREFIX BoolUserConfigParam m_hidpi_enabled
PARAM_DEFAULT( BoolUserConfigParam(false, "hidpi_enabled",
&m_multitouch_group,
"Enable high-DPI support.") );
// ---- GP start order
PARAM_PREFIX GroupUserConfigParam m_gp_start_order
PARAM_DEFAULT( GroupUserConfigParam("GpStartOrder",
@ -648,6 +643,9 @@ namespace UserConfigParams
PARAM_DEFAULT(BoolUserConfigParam(false, "hq_mipmap",
&m_video_group, "Generate mipmap for textures using "
"high quality method with SSE"));
PARAM_PREFIX IntUserConfigParam m_fonts_size
PARAM_DEFAULT( IntUserConfigParam(2, "fonts_size",
&m_video_group,"The size of fonts. 0 is the smallest and 4 is the biggest") );
// ---- Recording
PARAM_PREFIX GroupUserConfigParam m_recording_group

View File

@ -31,7 +31,7 @@ void BoldFace::init()
{
FontWithFace::init();
// Reserve some space for characters added later
m_font_max_height = m_glyph_max_height + 20;
m_font_max_height = m_glyph_max_height * 3 / 2;
/* Use FT_Outline_Embolden for now, no more fallback font
setFallbackFont(font_manager->getFont<RegularFace>());

View File

@ -32,7 +32,7 @@ class BoldFace : public FontWithFace
private:
virtual unsigned int getGlyphPageSize() const OVERRIDE { return 1024; }
// ------------------------------------------------------------------------
virtual float getScalingFactorOne() const OVERRIDE { return 0.2f; }
virtual float getScalingFactorOne() const OVERRIDE { return 0.3f; }
// ------------------------------------------------------------------------
virtual unsigned int getScalingFactorTwo() const OVERRIDE { return 120; }
// ------------------------------------------------------------------------

View File

@ -31,7 +31,7 @@ void DigitFace::init()
{
FontWithFace::init();
m_font_max_height = m_glyph_max_height + 10;
m_font_max_height = m_glyph_max_height * 3 / 2;
} // init

View File

@ -350,32 +350,15 @@ void FontWithFace::dumpGlyphPage()
*/
void FontWithFace::setDPI()
{
const int screen_width = irr_driver->getActualScreenSize().Width;
const int screen_height = irr_driver->getActualScreenSize().Height;
float scale = std::min(irr_driver->getActualScreenSize().Height,
irr_driver->getActualScreenSize().Width) / 720.0f;
int factorTwo = getScalingFactorTwo();
if (UserConfigParams::m_hidpi_enabled)
{
float scale = screen_height / 480.0f;
m_face_dpi = int(getScalingFactorTwo() * getScalingFactorOne() * scale);
}
else if (screen_height > 1300)
{
float scale = screen_height / 480.0f * 0.45f;
m_face_dpi = int(getScalingFactorTwo() * (getScalingFactorOne() + 0.3f) * scale);
}
else
{
float scale = std::max(0, screen_width - 640) / 564.0f;
if(0 <= UserConfigParams::m_fonts_size && UserConfigParams::m_fonts_size <= 4)
factorTwo += UserConfigParams::m_fonts_size * 5 - 10;
// attempt to compensate for small screens
if (screen_width < 1200)
scale = std::max(0, screen_width - 640) / 750.0f;
if (screen_width < 900 || screen_height < 700)
scale = std::min(scale, 0.05f);
m_face_dpi = int(factorTwo * getScalingFactorOne() * scale);
m_face_dpi = unsigned((getScalingFactorOne() + 0.2f * scale) *
getScalingFactorTwo());
}
} // setDPI
// ----------------------------------------------------------------------------

View File

@ -31,7 +31,7 @@ void RegularFace::init()
{
FontWithFace::init();
// Reserve some space for characters added later
m_font_max_height = m_glyph_max_height + 10;
m_font_max_height = m_glyph_max_height * 3 / 2;
} // init

View File

@ -1725,10 +1725,11 @@ void IrrDriver::displayFPS()
gui::IGUIFont* font = GUIEngine::getSmallFont();
core::rect<s32> position;
const int fheight = font->getDimension(L"X").Height;
if (UserConfigParams::m_artist_debug_mode)
position = core::rect<s32>(51, 0, 1100, 80);
position = core::rect<s32>(51, 0, 30*fheight+51, 2*fheight + fheight / 3);
else
position = core::rect<s32>(75, 0, 900, 40);
position = core::rect<s32>(75, 0, 18*fheight+75 , fheight + fheight / 5);
GL32_draw2DRectangle(video::SColor(150, 96, 74, 196), position, NULL);
// We will let pass some time to let things settle before trusting FPS counter
// even if we also ignore fps = 1, which tends to happen in first checks

View File

@ -1347,7 +1347,7 @@ namespace GUIEngine
true/* center h */, false /* center v */ );
const int icon_count = (int)g_loading_icons.size();
const int icon_size = (int)(screen_w / 16.0f);
const int icon_size = (int)(std::min(screen_w, screen_h) / 10.0f);
const int ICON_MARGIN = 6;
int x = ICON_MARGIN;
int y = screen_h - icon_size - ICON_MARGIN;

View File

@ -64,6 +64,11 @@ bool LayoutManager::convertToCoord(std::string& x, int* absolute /* out */, int*
*percentage = i;
return true;
}
else if( x[x.size()-1] == 'f' ) // font height
{
*absolute = i * GUIEngine::getFontHeight();
return true;
}
else // absolute number
{
*absolute = i;
@ -242,7 +247,7 @@ void LayoutManager::readCoords(Widget* self)
//Add padding to <box> elements
if (self->getType() == WTYPE_DIV && self->m_show_bounding_box)
{
int padding = 15;
int padding = GUIEngine::getFontHeight() / 2;
if (self->m_properties[PROP_DIV_PADDING].length() > 0)
padding = atoi(self->m_properties[PROP_DIV_PADDING].c_str());
child_max_height += padding * 2;
@ -317,7 +322,7 @@ void LayoutManager::applyCoords(Widget* self, AbstractTopLevelContainer* topLeve
if (parent != NULL && parent->getType() == WTYPE_DIV && parent->m_show_bounding_box)
{
int padding = 15;
int padding = GUIEngine::getFontHeight() / 2;
if (parent->m_properties[PROP_DIV_PADDING].length() > 0)
padding = atoi(parent->m_properties[PROP_DIV_PADDING].c_str());
@ -443,7 +448,7 @@ void LayoutManager::doCalculateLayout(PtrVector<Widget>& widgets, AbstractTopLev
if (parent != NULL && parent->getType() == WTYPE_DIV && parent->m_show_bounding_box)
{
int padding = 15;
int padding = GUIEngine::getFontHeight() / 2;
if (parent->m_properties[PROP_DIV_PADDING].length() > 0)
padding = atoi(parent->m_properties[PROP_DIV_PADDING].c_str());
@ -508,6 +513,10 @@ void LayoutManager::doCalculateLayout(PtrVector<Widget>& widgets, AbstractTopLev
prop_y = prop_y.substr(0, prop_y.size() - 1);
widgets[n].m_y = (int)(y + atoi_p(prop_y.c_str())/100.0f * h);
}
else if(prop_y[ prop_y.size()-1 ] == 'f')
{
widgets[n].m_y = y + atoi_p(prop_y.c_str()) * GUIEngine::getFontHeight();
}
else
{
widgets[n].m_y = y + atoi_p(prop_y.c_str());
@ -583,6 +592,10 @@ void LayoutManager::doCalculateLayout(PtrVector<Widget>& widgets, AbstractTopLev
prop_x = prop_x.substr(0, prop_x.size() - 1);
widgets[n].m_x = (int)(x + atoi_p(prop_x.c_str())/100.0f * w);
}
else if(prop_x[ prop_x.size()-1 ] == 'f')
{
widgets[n].m_x = x + atoi_p(prop_x.c_str()) * GUIEngine::getFontHeight();
}
else
{
widgets[n].m_x = x + atoi_p(prop_x.c_str());
@ -637,6 +650,10 @@ void LayoutManager::doCalculateLayout(PtrVector<Widget>& widgets, AbstractTopLev
prop_y = prop_y.substr(0, prop_y.size() - 1);
widgets[n].m_y = (int)(y + atoi_p(prop_y.c_str())/100.0f * h);
}
else if(prop_y[ prop_y.size()-1 ] == 'f')
{
widgets[n].m_y = y + atoi_p(prop_y.c_str()) * GUIEngine::getFontHeight();
}
else
{
widgets[n].m_y = y + atoi_p(prop_y.c_str());
@ -683,6 +700,10 @@ void LayoutManager::doCalculateLayout(PtrVector<Widget>& widgets, AbstractTopLev
prop_x = prop_x.substr(0, prop_x.size() - 1);
widgets[n].m_x = (int)(x + atoi_p(prop_x.c_str())/100.0f * w);
}
else if(prop_x[ prop_x.size()-1 ] == 'f')
{
widgets[n].m_x = x + atoi_p(prop_x.c_str()) * GUIEngine::getFontHeight();
}
else
{
widgets[n].m_x = x + atoi_p(prop_x.c_str());

View File

@ -152,15 +152,9 @@ void DynamicRibbonWidget::add()
const int average_y = m_y + (m_h - m_label_height)/2;
unsigned int screen_height = irr_driver->getActualScreenSize().Height;
m_arrows_w = (int)(screen_height / 15);
m_arrows_w = GUIEngine::getFontHeight() * 2;
m_arrows_w = std::max(m_arrows_w, 40);
if (UserConfigParams::m_hidpi_enabled)
{
m_arrows_w = int(m_arrows_w*1.5f);
}
const int button_h = m_arrows_w;
// right arrow

View File

@ -69,7 +69,7 @@ void override_default_params()
UserConfigParams::m_screen_keyboard = 1;
// Set bigger fonts and buttons
UserConfigParams::m_hidpi_enabled = true;
UserConfigParams::m_fonts_size = 4;
// It shouldn't matter, but STK is always run in fullscreen on android
UserConfigParams::m_fullscreen = true;

View File

@ -173,11 +173,8 @@ void GhostReplaySelection::init()
Screen::init();
m_cur_difficulty = race_manager->getDifficulty();
int icon_height = UserConfigParams::m_hidpi_enabled ? getHeight() / 15
: getHeight() / 24;
int row_height = UserConfigParams::m_hidpi_enabled ? getHeight() / 12
: getHeight() / 24;
int icon_height = GUIEngine::getFontHeight() * 3 / 2;
int row_height = GUIEngine::getFontHeight() * 2;
// 128 is the height of the image file
m_icon_bank->setScale(icon_height/128.0f);

View File

@ -79,7 +79,7 @@ MainMenuScreen::MainMenuScreen() : Screen("main_menu.stkgui")
void MainMenuScreen::loadedFromFile()
{
LabelWidget* w = getWidget<LabelWidget>("info_addons");
w->setScrollSpeed(15);
w->setScrollSpeed(GUIEngine::getFontHeight() / 2);
RibbonWidget* rw_top = getWidget<RibbonWidget>("menu_toprow");
assert(rw_top != NULL);

View File

@ -134,15 +134,7 @@ void NetworkingLobby::loadedFromFile()
m_icon_bank->addTextureAsSprite(icon_5);
m_icon_bank->addTextureAsSprite(m_spectate_texture);
if (UserConfigParams::m_hidpi_enabled)
{
m_icon_bank->setScale(getHeight() / 15.0f / 128.0f);
}
else
{
const int screen_width = irr_driver->getFrameSize().Width;
m_icon_bank->setScale(screen_width > 1280 ? 0.4f : 0.25f);
}
m_icon_bank->setScale((float)GUIEngine::getFontHeight() / 96.0f);
} // loadedFromFile
// ---------------------------------------------------------------------------

View File

@ -137,7 +137,7 @@ void ServerSelection::init()
m_searcher->clearListeners();
m_searcher->addListener(this);
m_icon_bank->setScale((float)getHeight() / 15.0f / 128.0f);
m_icon_bank->setScale((float)GUIEngine::getFontHeight() / 96.0f);
m_icon_bank->setTargetIconSize(128, 128);
video::ITexture* icon1 = irr_driver->getTexture(
@ -159,8 +159,7 @@ void ServerSelection::init()
m_icon_bank->addTextureAsSprite(tex);
}
int row_height = UserConfigParams::m_hidpi_enabled ? getHeight() / 12
: getHeight() / 15;
int row_height = GUIEngine::getFontHeight() * 3 / 2;
m_server_list_widget->setIcons(m_icon_bank, row_height);
m_sort_desc = false;

View File

@ -113,7 +113,8 @@ RaceGUI::RaceGUI()
}
// Originally m_map_height was 100, and we take 480 as minimum res
float scaling = irr_driver->getFrameSize().Height / 480.0f;
float scaling = std::min(irr_driver->getFrameSize().Height,
irr_driver->getFrameSize().Width) / 480.0f;
const float map_size = stk_config->m_minimap_size * map_size_splitscreen;
const float top_margin = 3.5f * m_font_height;

View File

@ -529,6 +529,8 @@ void RaceGUIBase::drawGlobalMusicDescription()
gui::IGUIFont* font = GUIEngine::getFont();
const int fheight = font->getDimension(L"X").Height;
float race_time =
stk_config->ticks2Time(World::getWorld()->getMusicDescriptionTicks());
@ -536,8 +538,8 @@ void RaceGUIBase::drawGlobalMusicDescription()
float timeProgression = (float)(race_time) /
(float)(stk_config->m_music_credit_time);
const int x_pulse = (int)(sinf(race_time*9.0f)*10.0f);
const int y_pulse = (int)(cosf(race_time*9.0f)*10.0f);
const int x_pulse = (int)(sinf(race_time*9.0f)*fheight/4);
const int y_pulse = (int)(cosf(race_time*9.0f)*fheight/4);
float resize = 1.0f;
if (timeProgression < 0.1)
@ -574,27 +576,27 @@ void RaceGUIBase::drawGlobalMusicDescription()
if (textWidth > max_text_size) textWidth = max_text_size;
if (textWidth2 > max_text_size) textWidth2 = max_text_size;
const int ICON_SIZE = 64;
const int y = irr_driver->getActualScreenSize().Height - 80;
// the 20 is an arbitrary space left between the note icon and the text
const int ICON_SIZE = fheight*2;
const int y = irr_driver->getActualScreenSize().Height - fheight*5/2;
// the fheight/2 is an arbitrary space left between the note icon and the text
const int noteX = (irr_driver->getActualScreenSize().Width / 2)
- std::max(textWidth, textWidth2)/2 - ICON_SIZE/2 - 20;
- std::max(textWidth, textWidth2)/2 - ICON_SIZE/2 - fheight;
const int noteY = y;
// the 20 is an arbitrary space left between the note icon and the text
// the fheight is an arbitrary space left between the note icon and the text
const int textXFrom = (irr_driver->getActualScreenSize().Width / 2)
- std::max(textWidth, textWidth2)/2 + 20;
- std::max(textWidth, textWidth2)/2 + fheight;
const int textXTo = (irr_driver->getActualScreenSize().Width / 2)
+ std::max(textWidth, textWidth2)/2 + 20;
+ std::max(textWidth, textWidth2)/2 + fheight;
// ---- Draw "by" text
const int text_y = (int)(irr_driver->getActualScreenSize().Height - 80*(resize3)
+ 40*(1-resize));
const int text_y = (int)(irr_driver->getActualScreenSize().Height
- fheight*2*(resize3) + fheight*(1-resize));
static const video::SColor white = video::SColor(255, 255, 255, 255);
if(mi->getComposer()!="")
{
core::rect<s32> pos_by(textXFrom, text_y+40,
textXTo, text_y+40);
core::rect<s32> pos_by(textXFrom, text_y+fheight,
textXTo, text_y+fheight);
font->draw(thetext_composer, pos_by, white,
true, true);
}
@ -612,9 +614,9 @@ void RaceGUIBase::drawGlobalMusicDescription()
int iconSizeX = (int)(ICON_SIZE*resize + x_pulse*resize*resize);
int iconSizeY = (int)(ICON_SIZE*resize + y_pulse*resize*resize);
core::rect<s32> dest(noteX-iconSizeX/2+20,
core::rect<s32> dest(noteX-iconSizeX/2+fheight,
noteY-iconSizeY/2+ICON_SIZE/2,
noteX+iconSizeX/2+20,
noteX+iconSizeX/2+fheight,
noteY+iconSizeY/2+ICON_SIZE/2);
const core::rect<s32> source(core::position2d<s32>(0,0),
m_music_icon->getSize());

View File

@ -86,7 +86,8 @@ RaceGUIOverworld::RaceGUIOverworld()
m_trophy[2] = irr_driver->getTexture(FileManager::GUI_ICON, "cup_gold.png" );
m_trophy[3] = irr_driver->getTexture(FileManager::GUI_ICON, "cup_platinum.png" );
float scaling = irr_driver->getFrameSize().Height / 420.0f;
float scaling = std::min(irr_driver->getFrameSize().Height,
irr_driver->getFrameSize().Width) / 420.0f;
const float map_size = 250.0f;
bool multitouch_enabled = (UserConfigParams::m_multitouch_active == 1 &&
@ -242,7 +243,8 @@ void RaceGUIOverworld::drawTrophyPoints()
bool vcenter = true;
const int size = irr_driver->getActualScreenSize().Width/20;
const int size = std::min((int)irr_driver->getActualScreenSize().Width/20,
2 * GUIEngine::getFontHeight());
core::rect<s32> dest(size, pos.UpperLeftCorner.Y,
size*2, pos.UpperLeftCorner.Y + size);
core::rect<s32> source(core::position2di(0, 0), m_trophy[3]->getSize());