Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions buildconfig/stubs/pygame/_render.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class Renderer:
def fill_rect(self, rect: RectLike) -> None: ...
def fill_triangle(self, p1: Point, p2: Point, p3: Point) -> None: ...
def get_viewport(self) -> Rect: ...
def logical_to_window(self, point: Point) -> tuple[float, float]: ...
def window_to_logical(self, point: Point) -> tuple[float, float]: ...
def present(self) -> None: ...
def set_viewport(self, area: Optional[RectLike]) -> None: ...
def to_surface(
Expand Down
14 changes: 14 additions & 0 deletions docs/reST/ref/sdl2_video.rst
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,20 @@
drawing area on the target, or ``None`` to use the
entire area of the current rendering target.

.. method:: logical_to_window

| :sl:`Translates logical coordinates to window coordinates`
| :sg:`logical_to_window(point) -> (float, float)`

:param point: The coordinates in logical space.

.. method:: window_to_logical

| :sl:`Translates window coordinates to logical coordinates`
| :sg:`window_to_logical(point) -> (float, float)`

:param point: The coordinates in window space.

.. method:: blit

| :sl:`Draw textures using a Surface-like API`
Expand Down
2 changes: 2 additions & 0 deletions src_c/doc/sdl2_video_doc.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
#define DOC_SDL2_VIDEO_RENDERER_PRESENT "present() -> None\nUpdate the screen with any rendering performed since the previous call"
#define DOC_SDL2_VIDEO_RENDERER_GETVIEWPORT "get_viewport() -> Rect\nGet the drawing area on the rendering target"
#define DOC_SDL2_VIDEO_RENDERER_SETVIEWPORT "set_viewport(area) -> None\nSet the drawing area on the rendering target"
#define DOC_SDL2_VIDEO_RENDERER_LOGICALTOWINDOW "logical_to_window(point) -> (float, float)\nTranslates logical coordinates to window coordinates"
#define DOC_SDL2_VIDEO_RENDERER_WINDOWTOLOGICAL "window_to_logical(point) -> (float, float)\nTranslates window coordinates to logical coordinates"
#define DOC_SDL2_VIDEO_RENDERER_BLIT "blit(source, dest, area=None, special_flags=0)-> Rect\nDraw textures using a Surface-like API"
#define DOC_SDL2_VIDEO_RENDERER_DRAWLINE "draw_line(p1, p2) -> None\nDraw a line"
#define DOC_SDL2_VIDEO_RENDERER_DRAWPOINT "draw_point(point) -> None\nDraw a point"
Expand Down
57 changes: 57 additions & 0 deletions src_c/render.c
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,59 @@ renderer_set_logical_size(pgRendererObject *self, PyObject *arg, void *closure)
return 0;
}

static PyObject *
renderer_logical_to_window(pgRendererObject *self, PyObject *args,
PyObject *kwargs)
{
float lx, ly;
PyObject *point;

static char *keywords[] = {"point", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &point)) {
return NULL;
}
if (!pg_TwoFloatsFromObj(point, &lx, &ly)) {
return RAISE(PyExc_TypeError, "invalid argument");
}

#if SDL_VERSION_ATLEAST(3, 0, 0)
float wx, wy;
SDL_RenderCoordinatesToWindow(self->renderer, lx, ly, &wx, &wy);

return pg_tuple_couple_from_values_double(wx, wy);
#else
int wx, wy;
SDL_RenderLogicalToWindow(self->renderer, lx, ly, &wx, &wy);

return pg_tuple_couple_from_values_double((float)wx, (float)wy);
#endif
}

static PyObject *
renderer_window_to_logical(pgRendererObject *self, PyObject *args,
PyObject *kwargs)
{
float lx, ly;
float wx, wy;
PyObject *point;

static char *keywords[] = {"point", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &point)) {
return NULL;
}
if (!pg_TwoFloatsFromObj(point, &wx, &wy)) {
return RAISE(PyExc_TypeError, "invalid argument");
}

#if SDL_VERSION_ATLEAST(3, 0, 0)
SDL_RenderCoordinatesFromWindow(self->renderer, wx, wy, &lx, &ly);
#else
SDL_RenderWindowToLogical(self->renderer, (int)wx, (int)wy, &lx, &ly);
#endif

return pg_tuple_couple_from_values_double(lx, ly);
}

static PyObject *
renderer_get_scale(pgRendererObject *self, void *closure)
{
Expand Down Expand Up @@ -582,6 +635,10 @@ static PyMethodDef renderer_methods[] = {
METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_SETVIEWPORT},
{"get_viewport", (PyCFunction)renderer_get_viewport, METH_NOARGS,
DOC_SDL2_VIDEO_RENDERER_GETVIEWPORT},
{"logical_to_window", (PyCFunction)renderer_logical_to_window,
METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_LOGICALTOWINDOW},
{"window_to_logical", (PyCFunction)renderer_window_to_logical,
METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_WINDOWTOLOGICAL},
{"compose_custom_blend_mode",
(PyCFunction)renderer_compose_custom_blend_mode,
METH_VARARGS | METH_KEYWORDS | METH_CLASS,
Expand Down
2 changes: 2 additions & 0 deletions test/render_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ def test_logical_size(self):
self.assertEqual(self.renderer.logical_size, (0, 0))
self.renderer.logical_size = (10, 10)
self.assertEqual(self.renderer.logical_size, (10, 10))
self.assertEqual(self.renderer.logical_to_window((10, 10)), (100, 100))
self.assertEqual(self.renderer.window_to_logical((100, 100)), (10, 10))

def test_scale(self):
self.assertEqual(self.renderer.scale, (1.0, 1.0))
Expand Down
Loading