Skip to content

Commit 7ec0e3d

Browse files
author
Maksim
authored
Fix HUD scaling (#9721)
This resolves HUD scaling issues on Android and desktops with custom DPI settings.
1 parent 08c0b76 commit 7ec0e3d

File tree

2 files changed

+44
-22
lines changed

2 files changed

+44
-22
lines changed

src/client/hud.cpp

+43-22
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Hud::Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player,
5151
this->inventory = inventory;
5252

5353
m_hud_scaling = g_settings->getFloat("hud_scaling");
54+
m_scale_factor = m_hud_scaling * RenderingEngine::getDisplayDensity();
5455
m_hotbar_imagesize = std::floor(HOTBAR_IMAGE_SIZE *
5556
RenderingEngine::getDisplayDensity() + 0.5f);
5657
m_hotbar_imagesize *= m_hud_scaling;
@@ -213,9 +214,7 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount,
213214
}
214215

215216
// Position of upper left corner of bar
216-
v2s32 pos = screen_offset;
217-
pos.X *= m_hud_scaling * RenderingEngine::getDisplayDensity();
218-
pos.Y *= m_hud_scaling * RenderingEngine::getDisplayDensity();
217+
v2s32 pos = screen_offset * m_scale_factor;
219218
pos += upperleftpos;
220219

221220
// Store hotbar_image in member variable, used by drawItem()
@@ -320,20 +319,40 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
320319
switch (e->type) {
321320
case HUD_ELEM_TEXT: {
322321
irr::gui::IGUIFont *textfont = font;
322+
unsigned int font_size = g_fontengine->getDefaultFontSize();
323+
323324
if (e->size.X > 0)
324-
textfont = g_fontengine->getFont(
325-
e->size.X * g_fontengine->getDefaultFontSize());
325+
font_size *= e->size.X;
326+
327+
if (font_size != g_fontengine->getDefaultFontSize())
328+
textfont = g_fontengine->getFont(font_size);
326329

327330
video::SColor color(255, (e->number >> 16) & 0xFF,
328331
(e->number >> 8) & 0xFF,
329332
(e->number >> 0) & 0xFF);
330-
core::rect<s32> size(0, 0, e->scale.X, text_height * e->scale.Y);
331333
std::wstring text = unescape_translate(utf8_to_wide(e->text));
332334
core::dimension2d<u32> textsize = textfont->getDimension(text.c_str());
335+
#ifdef __ANDROID__
336+
// The text size on Android is not proportional with the actual scaling
337+
irr::gui::IGUIFont *font_scaled = font_size <= 3 ?
338+
textfont : g_fontengine->getFont(font_size - 3);
339+
if (e->offset.X < -20)
340+
textsize = font_scaled->getDimension(text.c_str());
341+
#endif
333342
v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2),
334343
(e->align.Y - 1.0) * (textsize.Height / 2));
335-
v2s32 offs(e->offset.X, e->offset.Y);
336-
textfont->draw(text.c_str(), size + pos + offset + offs, color);
344+
core::rect<s32> size(0, 0, e->scale.X * m_scale_factor,
345+
text_height * e->scale.Y * m_scale_factor);
346+
v2s32 offs(e->offset.X * m_scale_factor,
347+
e->offset.Y * m_scale_factor);
348+
#ifdef __ANDROID__
349+
if (e->offset.X < -20)
350+
font_scaled->draw(text.c_str(), size + pos + offset + offs, color);
351+
else
352+
#endif
353+
{
354+
textfont->draw(text.c_str(), size + pos + offset + offs, color);
355+
}
337356
break; }
338357
case HUD_ELEM_STATBAR: {
339358
v2s32 offs(e->offset.X, e->offset.Y);
@@ -385,16 +404,17 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
385404
const video::SColor color(255, 255, 255, 255);
386405
const video::SColor colors[] = {color, color, color, color};
387406
core::dimension2di imgsize(texture->getOriginalSize());
388-
v2s32 dstsize(imgsize.Width * e->scale.X,
389-
imgsize.Height * e->scale.Y);
407+
v2s32 dstsize(imgsize.Width * e->scale.X * m_scale_factor,
408+
imgsize.Height * e->scale.Y * m_scale_factor);
390409
if (e->scale.X < 0)
391410
dstsize.X = m_screensize.X * (e->scale.X * -0.01);
392411
if (e->scale.Y < 0)
393412
dstsize.Y = m_screensize.Y * (e->scale.Y * -0.01);
394413
v2s32 offset((e->align.X - 1.0) * dstsize.X / 2,
395414
(e->align.Y - 1.0) * dstsize.Y / 2);
396415
core::rect<s32> rect(0, 0, dstsize.X, dstsize.Y);
397-
rect += pos + offset + v2s32(e->offset.X, e->offset.Y);
416+
rect += pos + offset + v2s32(e->offset.X * m_scale_factor,
417+
e->offset.Y * m_scale_factor);
398418
draw2DImageFilterScaled(driver, texture, rect,
399419
core::rect<s32>(core::position2d<s32>(0,0), imgsize),
400420
NULL, colors, true);
@@ -427,12 +447,15 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir,
427447
core::dimension2di dstd;
428448
if (size == v2s32()) {
429449
dstd = srcd;
450+
dstd.Height *= m_scale_factor;
451+
dstd.Width *= m_scale_factor;
452+
offset.X *= m_scale_factor;
453+
offset.Y *= m_scale_factor;
430454
} else {
431-
float size_factor = m_hud_scaling * RenderingEngine::getDisplayDensity();
432-
dstd.Height = size.Y * size_factor;
433-
dstd.Width = size.X * size_factor;
434-
offset.X *= size_factor;
435-
offset.Y *= size_factor;
455+
dstd.Height = size.Y * m_scale_factor;
456+
dstd.Width = size.X * m_scale_factor;
457+
offset.X *= m_scale_factor;
458+
offset.Y *= m_scale_factor;
436459
}
437460

438461
v2s32 p = pos;
@@ -555,7 +578,7 @@ void Hud::drawHotbar(u16 playeritem) {
555578
v2s32 pos = centerlowerpos - v2s32(width / 2, m_hotbar_imagesize + m_padding * 3);
556579

557580
const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize();
558-
if ( (float) width / (float) window_size.X <=
581+
if ((float) width / (float) window_size.X <=
559582
g_settings->getFloat("hud_hotbar_max_width")) {
560583
if (player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE) {
561584
drawItems(pos, v2s32(0, 0), hotbar_itemcount, 0, mainlist, playeritem + 1, 0);
@@ -607,12 +630,10 @@ void Hud::drawSelectionMesh()
607630
// Draw 3D selection boxes
608631
video::SMaterial oldmaterial = driver->getMaterial2D();
609632
driver->setMaterial(m_selection_material);
610-
for (std::vector<aabb3f>::const_iterator
611-
i = m_selection_boxes.begin();
612-
i != m_selection_boxes.end(); ++i) {
633+
for (auto & selection_box : m_selection_boxes) {
613634
aabb3f box = aabb3f(
614-
i->MinEdge + m_selection_pos_with_offset,
615-
i->MaxEdge + m_selection_pos_with_offset);
635+
selection_box.MinEdge + m_selection_pos_with_offset,
636+
selection_box.MaxEdge + m_selection_pos_with_offset);
616637

617638
u32 r = (selectionbox_argb.getRed() *
618639
m_selection_mesh_color.getRed() / 255);

src/client/hud.h

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class Hud
9292
void drawItem(const ItemStack &item, const core::rect<s32> &rect, bool selected);
9393

9494
float m_hud_scaling; // cached minetest setting
95+
float m_scale_factor;
9596
v3s16 m_camera_offset;
9697
v2u32 m_screensize;
9798
v2s32 m_displaycenter;

0 commit comments

Comments
 (0)