summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Luca Bruno <lucab@debian.org>2015-02-12 10:42:02 +0100
committer Luca Bruno <lucab@debian.org>2015-03-16 11:42:46 +0100
commitb1a0e0167d8655e75275f7560958580ebce2d077 (patch)
treedc58da4100bb70da19295647508c2c8935917e26
parent41cfcb26c4ecbcfae6f9648dd3eec53902219d77 (diff)
ui: use per-container pixel aspect (LUA draw_text bugfix)
Do not assume ui-container aspect when drawing on other containers. This fixes LUA draw_text() in multi-screens games, where the font aspect for each screen is wrongly computed on the aggregated target. Signed-off-by: Luca Bruno <lucab@debian.org>
-rw-r--r--src/emu/render.c39
-rw-r--r--src/emu/render.h2
-rw-r--r--src/emu/ui/ui.c4
3 files changed, 30 insertions, 15 deletions
diff --git a/src/emu/render.c b/src/emu/render.c
index 2eed9176550..46ae77e8909 100644
--- a/src/emu/render.c
+++ b/src/emu/render.c
@@ -2483,26 +2483,41 @@ render_target *render_manager::target_by_index(int index) const
// fonts
//-------------------------------------------------
-float render_manager::ui_aspect()
+float render_manager::ui_aspect(render_container *rc)
{
- int orient = orientation_add(m_ui_target->orientation(), m_ui_container->orientation());
+ int orient = 0;
+ float aspect = 1.0f;
- // based on the orientation of the target, compute height/width or width/height
- float aspect;
- if (!(orient & ORIENTATION_SWAP_XY))
- aspect = (float)m_ui_target->height() / (float)m_ui_target->width();
- else
- aspect = (float)m_ui_target->width() / (float)m_ui_target->height();
+ if (rc == m_ui_container || rc == NULL) {
+ // ui container, aggregated multi-screen target
- // if we have a valid pixel aspect, apply that and return
- if (m_ui_target->pixel_aspect() != 0.0f)
- return aspect / m_ui_target->pixel_aspect();
+ orient = orientation_add(m_ui_target->orientation(), m_ui_container->orientation());
+ // based on the orientation of the target, compute height/width or width/height
+ if (!(orient & ORIENTATION_SWAP_XY))
+ aspect = (float)m_ui_target->height() / (float)m_ui_target->width();
+ else
+ aspect = (float)m_ui_target->width() / (float)m_ui_target->height();
+
+ // if we have a valid pixel aspect, apply that and return
+ if (m_ui_target->pixel_aspect() != 0.0f)
+ return (aspect / m_ui_target->pixel_aspect());
+ } else {
+ // single screen container
+
+ orient = rc->orientation();
+ // based on the orientation of the target, compute height/width or width/height
+ if (!(orient & ORIENTATION_SWAP_XY))
+ aspect = (float)rc->screen()->visible_area().height() / (float)rc->screen()->visible_area().width();
+ else
+ aspect = (float)rc->screen()->visible_area().width() / (float)rc->screen()->visible_area().height();
+ }
- // if not, clamp for extreme proportions
+ // clamp for extreme proportions
if (aspect < 0.66f)
aspect = 0.66f;
if (aspect > 1.5f)
aspect = 1.5f;
+
return aspect;
}
diff --git a/src/emu/render.h b/src/emu/render.h
index 2ee8e108a09..bf058258577 100644
--- a/src/emu/render.h
+++ b/src/emu/render.h
@@ -744,7 +744,7 @@ public:
// UI targets
render_target &ui_target() const { assert(m_ui_target != NULL); return *m_ui_target; }
void set_ui_target(render_target &target) { m_ui_target = &target; }
- float ui_aspect();
+ float ui_aspect(render_container *rc = NULL);
// UI containers
render_container &ui_container() const { assert(m_ui_container != NULL); return *m_ui_container; }
diff --git a/src/emu/ui/ui.c b/src/emu/ui/ui.c
index 664775f2b1b..b968937cbea 100644
--- a/src/emu/ui/ui.c
+++ b/src/emu/ui/ui.c
@@ -456,7 +456,7 @@ void ui_manager::update_and_render(render_container *container)
{
float mouse_y=-1,mouse_x=-1;
if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y)) {
- container->add_quad(mouse_x,mouse_y,mouse_x + 0.05*container->manager().ui_aspect(),mouse_y + 0.05,UI_TEXT_COLOR,m_mouse_arrow_texture,PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ container->add_quad(mouse_x,mouse_y,mouse_x + 0.05*container->manager().ui_aspect(container),mouse_y + 0.05,UI_TEXT_COLOR,m_mouse_arrow_texture,PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
}
}
@@ -600,7 +600,7 @@ void ui_manager::draw_text_full(render_container *container, const char *origs,
const char *linestart;
float cury = y;
float maxwidth = 0;
- float aspect = machine().render().ui_aspect();
+ float aspect = machine().render().ui_aspect(container);
// if we don't want wrapping, guarantee a huge wrapwidth
if (wrap == WRAP_NEVER)