diff --git a/player/lua.c b/player/lua.c index 9fe1d0deca..04c7dbb977 100644 --- a/player/lua.c +++ b/player/lua.c @@ -974,17 +974,7 @@ static int script_set_osd_ass(lua_State *L) return 0; } -static int script_get_osd_resolution(lua_State *L) -{ - struct MPContext *mpctx = get_mpctx(L); - int w, h; - osd_object_get_resolution(mpctx->osd, OSDTYPE_EXTERNAL, &w, &h); - lua_pushnumber(L, w); - lua_pushnumber(L, h); - return 2; -} - -static int script_get_screen_size(lua_State *L) +static int script_get_osd_size(lua_State *L) { struct MPContext *mpctx = get_mpctx(L); struct mp_osd_res vo_res = osd_get_vo_res(mpctx->osd, OSDTYPE_EXTERNAL); @@ -996,7 +986,7 @@ static int script_get_screen_size(lua_State *L) return 3; } -static int script_get_screen_margins(lua_State *L) +static int script_get_osd_margins(lua_State *L) { struct MPContext *mpctx = get_mpctx(L); struct mp_osd_res vo_res = osd_get_vo_res(mpctx->osd, OSDTYPE_EXTERNAL); @@ -1012,10 +1002,8 @@ static int script_get_mouse_pos(lua_State *L) struct MPContext *mpctx = get_mpctx(L); int px, py; mp_input_get_mouse_pos(mpctx->input, &px, &py); - double sw, sh; - osd_object_get_scale_factor(mpctx->osd, OSDTYPE_EXTERNAL, &sw, &sh); - lua_pushnumber(L, px * sw); - lua_pushnumber(L, py * sh); + lua_pushnumber(L, px); + lua_pushnumber(L, py); return 2; } @@ -1030,14 +1018,11 @@ static int script_input_set_section_mouse_area(lua_State *L) { struct MPContext *mpctx = get_mpctx(L); - double sw, sh; - osd_object_get_scale_factor(mpctx->osd, OSDTYPE_EXTERNAL, &sw, &sh); - char *section = (char *)luaL_checkstring(L, 1); - int x0 = sw ? luaL_checkinteger(L, 2) / sw : 0; - int y0 = sh ? luaL_checkinteger(L, 3) / sh : 0; - int x1 = sw ? luaL_checkinteger(L, 4) / sw : 0; - int y1 = sh ? luaL_checkinteger(L, 5) / sh : 0; + int x0 = luaL_checkinteger(L, 2); + int y0 = luaL_checkinteger(L, 3); + int x1 = luaL_checkinteger(L, 4); + int y1 = luaL_checkinteger(L, 5); mp_input_set_section_mouse_area(mpctx->input, section, x0, y0, x1, y1); return 0; } @@ -1266,9 +1251,8 @@ static const struct fn_entry main_fns[] = { FN_ENTRY(raw_observe_property), FN_ENTRY(raw_unobserve_property), FN_ENTRY(set_osd_ass), - FN_ENTRY(get_osd_resolution), - FN_ENTRY(get_screen_size), - FN_ENTRY(get_screen_margins), + FN_ENTRY(get_osd_size), + FN_ENTRY(get_osd_margins), FN_ENTRY(get_mouse_pos), FN_ENTRY(get_time), FN_ENTRY(input_set_section_mouse_area), diff --git a/player/lua/osc.lua b/player/lua/osc.lua index 24afeef970..f3beee85dd 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -99,6 +99,27 @@ local state = { -- Helperfunctions -- +-- scale factor for translating between real and virtual ASS coordinates +function get_virt_scale_factor() + local w, h = mp.get_osd_size() + if w <= 0 or h <= 0 then + return 0, 0 + end + return osc_param.playresx / w, osc_param.playresy / h +end + +-- return mouse position in virtual ASS coordinates (playresx/y) +function get_virt_mouse_pos() + local sx, sy = get_virt_scale_factor() + local x, y = mp.get_mouse_pos() + return x * sx, y * sy +end + +function set_virt_mouse_area(x0, y0, x1, y1, name) + local sx, sy = get_virt_scale_factor() + mp.set_mouse_area(x0 * sx, y0 * sy, x1 * sx, y1 * sy) +end + function scale_value(x0, x1, y0, y1, val) local m = (y1 - y0) / (x1 - x0) local b = y0 - (m * x0) @@ -141,7 +162,7 @@ function mouse_hit(element) end function mouse_hit_coords(bX1, bY1, bX2, bY2) - local mX, mY = mp.get_mouse_pos() + local mX, mY = get_virt_mouse_pos() return (mX >= bX1 and mX <= bX2 and mY >= bY1 and mY <= bY2) end @@ -182,7 +203,7 @@ end -- get value at current mouse position function get_slider_value(element) - return get_slider_value_at(element, mp.get_mouse_pos()) + return get_slider_value_at(element, get_virt_mouse_pos()) end function countone(val) @@ -589,7 +610,7 @@ function render_elements(master_ass) end elem_ass:new_event() - elem_ass:pos(mp.get_mouse_pos(), ty) + elem_ass:pos(get_virt_mouse_pos(), ty) elem_ass:an(an) elem_ass:append(slider_lo.tooltip_style) elem_ass:append(tooltiplabel) @@ -1298,7 +1319,7 @@ function osc_init() -- set canvas resolution according to display aspect and scaling setting local baseResY = 720 - local display_w, display_h, display_aspect = mp.get_screen_size() + local display_w, display_h, display_aspect = mp.get_osd_size() local scale = 1 if (mp.get_property("video") == "no") then -- dummy/forced window @@ -1718,8 +1739,8 @@ end function render() msg.debug("rendering") - local current_screen_sizeX, current_screen_sizeY, aspect = mp.get_screen_size() - local mouseX, mouseY = mp.get_mouse_pos() + local current_screen_sizeX, current_screen_sizeY, aspect = mp.get_osd_size() + local mouseX, mouseY = get_virt_mouse_pos() local now = mp.get_time() -- check if display changed, if so request reinit @@ -1782,7 +1803,7 @@ function render() --mouse show/hide area for k,cords in pairs(osc_param.areas["showhide"]) do - mp.set_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide") + set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide") end do_enable_keybindings() @@ -1791,7 +1812,7 @@ function render() for _,cords in ipairs(osc_param.areas["input"]) do if state.osc_visible then -- activate only when OSC is actually visible - mp.set_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "input") + set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "input") end if state.osc_visible ~= state.input_enabled then if state.osc_visible then @@ -1887,7 +1908,7 @@ function process_event(source, what) state.mouse_down_counter = 0 elseif source == "mouse_move" then - local mouseX, mouseY = mp.get_mouse_pos() + local mouseX, mouseY = get_virt_mouse_pos() if (user_opts.minmousemove == 0) or (not ((state.last_mouseX == nil) or (state.last_mouseY == nil)) and ((math.abs(mouseX - state.last_mouseX) >= user_opts.minmousemove) diff --git a/sub/osd.c b/sub/osd.c index 81cfb7daa6..a9bc035c73 100644 --- a/sub/osd.c +++ b/sub/osd.c @@ -422,21 +422,6 @@ bool osd_query_and_reset_want_redraw(struct osd_state *osd) return r; } -// Scale factor to translate OSD coordinates to what the obj uses internally. -// osd_coordinates * (sw, sh) = obj_coordinates -void osd_object_get_scale_factor(struct osd_state *osd, int obj, - double *sw, double *sh) -{ - int nw, nh; - osd_object_get_resolution(osd, obj, &nw, &nh); - pthread_mutex_lock(&osd->lock); - int vow = osd->objs[obj]->vo_res.w; - int voh = osd->objs[obj]->vo_res.h; - pthread_mutex_unlock(&osd->lock); - *sw = vow ? nw / (double)vow : 0; - *sh = voh ? nh / (double)voh : 0; -} - struct mp_osd_res osd_get_vo_res(struct osd_state *osd, int obj) { pthread_mutex_lock(&osd->lock); diff --git a/sub/osd.h b/sub/osd.h index 4e18ce7f7c..c066b09645 100644 --- a/sub/osd.h +++ b/sub/osd.h @@ -190,9 +190,6 @@ void osd_draw_on_image_p(struct osd_state *osd, struct mp_osd_res res, struct mp_image_params; struct mp_osd_res osd_res_from_image_params(const struct mp_image_params *p); -void osd_object_get_scale_factor(struct osd_state *osd, int obj, - double *sw, double *sh); - struct mp_osd_res osd_get_vo_res(struct osd_state *osd, int obj); void osd_rescale_bitmaps(struct sub_bitmaps *imgs, int frame_w, int frame_h, @@ -211,8 +208,4 @@ void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function); extern const char *const osd_ass_0; extern const char *const osd_ass_1; -// defined in backend, but locks if required -void osd_object_get_resolution(struct osd_state *osd, int obj, - int *out_w, int *out_h); - #endif /* MPLAYER_SUB_H */ diff --git a/sub/osd_dummy.c b/sub/osd_dummy.c index 5c50569dd6..1982870248 100644 --- a/sub/osd_dummy.c +++ b/sub/osd_dummy.c @@ -26,10 +26,3 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, { *out_imgs = (struct sub_bitmaps) {0}; } - -void osd_object_get_resolution(struct osd_state *osd, int obj, - int *out_w, int *out_h) -{ - *out_w = 0; - *out_h = 0; -} diff --git a/sub/osd_libass.c b/sub/osd_libass.c index eed2822380..cd28396746 100644 --- a/sub/osd_libass.c +++ b/sub/osd_libass.c @@ -477,13 +477,3 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, &obj->parts_cache, out_imgs); talloc_steal(obj, obj->parts_cache); } - -void osd_object_get_resolution(struct osd_state *osd, int obj, - int *out_w, int *out_h) -{ - pthread_mutex_lock(&osd->lock); - struct osd_object *osd_obj = osd->objs[obj]; - *out_w = osd_obj->osd_track ? osd_obj->osd_track->PlayResX : 0; - *out_h = osd_obj->osd_track ? osd_obj->osd_track->PlayResY : 0; - pthread_mutex_unlock(&osd->lock); -}