From 5a8d38a4221ace8be48d0cad9def6d09226f06f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 28 Jan 2025 12:44:09 +0100 Subject: [PATCH 01/11] Add interface for _sdl2.video classes --- buildconfig/Setup.Android.SDL2.in | 3 + buildconfig/Setup.Emscripten.SDL2.in | 3 + buildconfig/Setup.SDL2.in | 3 + src_c/_pygame.h | 3 + src_c/include/_pygame.h | 61 ++++++++++++++++++++ src_c/renderer.c | 83 ++++++++++++++++++++++++++++ src_c/static.c | 15 +++++ src_c/texture.c | 83 ++++++++++++++++++++++++++++ src_c/video_image.c | 83 ++++++++++++++++++++++++++++ 9 files changed, 337 insertions(+) create mode 100644 src_c/renderer.c create mode 100644 src_c/texture.c create mode 100644 src_c/video_image.c diff --git a/buildconfig/Setup.Android.SDL2.in b/buildconfig/Setup.Android.SDL2.in index fc556ad024..f107f84b55 100644 --- a/buildconfig/Setup.Android.SDL2.in +++ b/buildconfig/Setup.Android.SDL2.in @@ -62,4 +62,7 @@ math src_c/math.c $(SDL) $(DEBUG) pixelcopy src_c/pixelcopy.c $(SDL) $(DEBUG) newbuffer src_c/newbuffer.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) +_renderer src_c/renderer.c $(SDL) $(DEBUG) +_texture src_c/texture.c $(SDL) $(DEBUG) +_image src_c/video_image.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) diff --git a/buildconfig/Setup.Emscripten.SDL2.in b/buildconfig/Setup.Emscripten.SDL2.in index 28e86f1e42..6bae799663 100644 --- a/buildconfig/Setup.Emscripten.SDL2.in +++ b/buildconfig/Setup.Emscripten.SDL2.in @@ -64,6 +64,9 @@ rect src_c/void.c rwobject src_c/void.c system src_c/void.c window src_c/void.c +_renderer src_c/void.c +_texture src_c/void.c +_image src_c/void.c geometry src_c/void.c #_sdl2.controller src_c/_sdl2/controller.c $(SDL) $(DEBUG) -Isrc_c diff --git a/buildconfig/Setup.SDL2.in b/buildconfig/Setup.SDL2.in index 011b8d1404..d7d2389802 100644 --- a/buildconfig/Setup.SDL2.in +++ b/buildconfig/Setup.SDL2.in @@ -75,3 +75,6 @@ newbuffer src_c/newbuffer.c $(SDL) $(DEBUG) system src_c/system.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) +_renderer src_c/renderer.c $(SDL) $(DEBUG) +_texture src_c/texture.c $(SDL) $(DEBUG) +_image src_c/video_image.c $(SDL) $(DEBUG) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 77fcd2cb50..fb16708fc6 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -616,6 +616,9 @@ typedef enum { #define PYGAMEAPI_BASE_NUMSLOTS 30 #define PYGAMEAPI_EVENT_NUMSLOTS 10 #define PYGAMEAPI_WINDOW_NUMSLOTS 1 +#define PYGAMEAPI_RENDERER_NUMSLOTS 1 +#define PYGAMEAPI_TEXTURE_NUMSLOTS 1 +#define PYGAMEAPI_IMAGE_NUMSLOTS 1 #define PYGAMEAPI_GEOMETRY_NUMSLOTS 2 #endif /* _PYGAME_INTERNAL_H */ diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 41c186eddb..880b8a4481 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -520,6 +520,61 @@ typedef struct { #define import_pygame_window() IMPORT_PYGAME_MODULE(window) #endif +typedef struct pgTextureObject pgTextureObject; + +/* + * Renderer module + */ +typedef struct { + PyObject_HEAD SDL_Renderer *renderer; + pgWindowObject *window; + pgTextureObject *target; + SDL_bool _is_borrowed; +} pgRendererObject; +#ifndef PYGAMEAPI_RENDERER_INTERNAL +#define pgRenderer_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 0)) +#define pgRenderer_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) +#define import_pygame_renderer() IMPORT_PYGAME_MODULE(_renderer) +#endif + +/* + * Texture module + */ +struct pgTextureObject { + PyObject_HEAD SDL_Texture *texture; + pgRendererObject *renderer; + int width; + int height; +}; +#ifndef PYGAMEAPI_TEXTURE_INTERNAL +#define pgTexture_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_texture, 0)) +#define pgTexture_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) +#define import_pygame_texture() IMPORT_PYGAME_MODULE(_texture) +#endif + +/* + * Image module + */ +typedef struct { + PyObject_HEAD pgTextureObject *texture; + pgRectObject *srcrect; + pgColorObject* color; + float angle; + float alpha; + SDL_Point origin; + SDL_bool flip_x; + SDL_bool flip_y; + SDL_BlendMode blend_mode; +} pgImageObject; +#ifndef PYGAMEAPI_IMAGE_INTERNAL +#define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_image, 0)) +#define pgImage_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) +#define import_pygame_image() IMPORT_PYGAME_MODULE(_image) +#endif + #define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE /* @@ -539,6 +594,9 @@ PYGAMEAPI_DEFINE_SLOTS(pixelarray); PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); PYGAMEAPI_DEFINE_SLOTS(window); +PYGAMEAPI_DEFINE_SLOTS(_renderer); +PYGAMEAPI_DEFINE_SLOTS(_texture); +PYGAMEAPI_DEFINE_SLOTS(_image); PYGAMEAPI_DEFINE_SLOTS(geometry); #else /* ~PYGAME_H */ PYGAMEAPI_EXTERN_SLOTS(base); @@ -553,6 +611,9 @@ PYGAMEAPI_EXTERN_SLOTS(pixelarray); PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); PYGAMEAPI_EXTERN_SLOTS(window); +PYGAMEAPI_EXTERN_SLOTS(_renderer); +PYGAMEAPI_EXTERN_SLOTS(_texture); +PYGAMEAPI_EXTERN_SLOTS(_image); PYGAMEAPI_EXTERN_SLOTS(geometry); #endif /* ~PYGAME_H */ diff --git a/src_c/renderer.c b/src_c/renderer.c new file mode 100644 index 0000000000..0d6efd84a8 --- /dev/null +++ b/src_c/renderer.c @@ -0,0 +1,83 @@ +#define PYGAMEAPI_RENDERER_INTERNAL + +#include "pygame.h" + +#include "pgcompat.h" + +#include "doc/sdl2_video_doc.h" + +static PyTypeObject pgRenderer_Type; + +static PyMethodDef renderer_methods[] = { + {NULL, NULL, 0, NULL} +}; + +static PyGetSetDef renderer_getset[] = { + {NULL, 0, NULL, NULL, NULL} +}; + +static PyTypeObject pgRenderer_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", + .tp_basicsize = sizeof(pgRendererObject), + //.tp_dealloc = (destructor)renderer_dealloc, + .tp_doc = DOC_SDL2_VIDEO_RENDERER, + .tp_methods = renderer_methods, + //.tp_init = (initproc)renderer_init, + .tp_new = PyType_GenericNew, + .tp_getset = renderer_getset +}; + +static PyMethodDef _renderer_methods[] = { + {NULL, NULL, 0, NULL} +}; + +MODINIT_DEFINE(_renderer) +{ + PyObject *module, *apiobj; + static void *c_api[PYGAMEAPI_RENDERER_NUMSLOTS]; + + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, + "_renderer", + "docs_needed", + -1, + _renderer_methods, + NULL, + NULL, + NULL, + NULL}; + + /* imported needed apis; Do this first so if there is an error + the module is not loaded. + */ + import_pygame_base(); + if (PyErr_Occurred()) { + return NULL; + } + + if (PyType_Ready(&pgRenderer_Type) < 0) { + return NULL; + } + + /* create the module */ + module = PyModule_Create(&_module); + if (module == 0) { + return NULL; + } + + Py_INCREF(&pgRenderer_Type); + if (PyModule_AddObject(module, "Renderer", (PyObject *)&pgRenderer_Type)) { + Py_DECREF(&pgRenderer_Type); + Py_DECREF(module); + return NULL; + } + + c_api[0] = &pgRenderer_Type; + apiobj = encapsulate_api(c_api, "_renderer"); + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); + Py_DECREF(module); + return NULL; + } + + return module; +} diff --git a/src_c/static.c b/src_c/static.c index 97229dd633..697cf473f6 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -187,6 +187,15 @@ PyInit_pixelarray(void); PyMODINIT_FUNC PyInit_window(void); +PyMODINIT_FUNC +PyInit__renderer(void); + +PyMODINIT_FUNC +PyInit__image(void); + +PyMODINIT_FUNC +PyInit__texture(void); + // pygame_static module void @@ -320,6 +329,9 @@ PyInit_pygame_static() load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); load_submodule("pygame", PyInit_window(), "window"); + load_submodule("pygame", PyInit__renderer(), "_renderer"); + load_submodule("pygame", PyInit__texture(), "_texture"); + load_submodule("pygame", PyInit__image(), "_image"); load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); @@ -364,6 +376,9 @@ PyInit_pygame_static() #include "simd_blitters_sse2.c" #include "window.c" +#include "renderer.c" +#include "texture.c" +#include "video_image.c" #undef pgVidInfo_Type #undef pgVidInfo_New diff --git a/src_c/texture.c b/src_c/texture.c new file mode 100644 index 0000000000..4edba997ed --- /dev/null +++ b/src_c/texture.c @@ -0,0 +1,83 @@ +#define PYGAMEAPI_TEXTURE_INTERNAL + +#include "pygame.h" + +#include "pgcompat.h" + +#include "doc/sdl2_video_doc.h" + +static PyTypeObject pgTexture_Type; + +static PyMethodDef texture_methods[] = { + {NULL, NULL, 0, NULL} +}; + +static PyGetSetDef texture_getset[] = { + {NULL, 0, NULL, NULL, NULL} +}; + +static PyTypeObject pgTexture_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._texture.Texture", + .tp_basicsize = sizeof(pgTextureObject), + //.tp_dealloc = (destructor)texture_dealloc, + .tp_doc = DOC_SDL2_VIDEO_TEXTURE, + .tp_methods = texture_methods, + //.tp_init = (initproc)texture_init, + .tp_new = PyType_GenericNew, + .tp_getset = texture_getset +}; + +static PyMethodDef _texture_methods[] = { + {NULL, NULL, 0, NULL} +}; + +MODINIT_DEFINE(_texture) +{ + PyObject *module, *apiobj; + static void *c_api[PYGAMEAPI_TEXTURE_NUMSLOTS]; + + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, + "_texture", + "docs_needed", + -1, + _texture_methods, + NULL, + NULL, + NULL, + NULL}; + + /* imported needed apis; Do this first so if there is an error + the module is not loaded. + */ + import_pygame_base(); + if (PyErr_Occurred()) { + return NULL; + } + + if (PyType_Ready(&pgTexture_Type) < 0) { + return NULL; + } + + /* create the module */ + module = PyModule_Create(&_module); + if (module == 0) { + return NULL; + } + + Py_INCREF(&pgTexture_Type); + if (PyModule_AddObject(module, "Texture", (PyObject *)&pgTexture_Type)) { + Py_DECREF(&pgTexture_Type); + Py_DECREF(module); + return NULL; + } + + c_api[0] = &pgTexture_Type; + apiobj = encapsulate_api(c_api, "_texture"); + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); + Py_DECREF(module); + return NULL; + } + + return module; +} diff --git a/src_c/video_image.c b/src_c/video_image.c new file mode 100644 index 0000000000..69b7770989 --- /dev/null +++ b/src_c/video_image.c @@ -0,0 +1,83 @@ +#define PYGAMEAPI_IMAGE_INTERNAL + +#include "pygame.h" + +#include "pgcompat.h" + +#include "doc/sdl2_video_doc.h" + +static PyTypeObject pgImage_Type; + +static PyMethodDef image_methods[] = { + {NULL, NULL, 0, NULL} +}; + +static PyGetSetDef image_getset[] = { + {NULL, 0, NULL, NULL, NULL} +}; + +static PyTypeObject pgImage_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._image.Image", + .tp_basicsize = sizeof(pgImageObject), + //.tp_dealloc = (destructor)image_dealloc, + .tp_doc = DOC_SDL2_VIDEO_IMAGE, + .tp_methods = image_methods, + //.tp_init = (initproc)image_init, + .tp_new = PyType_GenericNew, + .tp_getset = image_getset +}; + +static PyMethodDef _image_methods[] = { + {NULL, NULL, 0, NULL} +}; + +MODINIT_DEFINE(_image) +{ + PyObject *module, *apiobj; + static void *c_api[PYGAMEAPI_IMAGE_NUMSLOTS]; + + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, + "_image", + "docs_needed", + -1, + _image_methods, + NULL, + NULL, + NULL, + NULL}; + + /* imported needed apis; Do this first so if there is an error + the module is not loaded. + */ + import_pygame_base(); + if (PyErr_Occurred()) { + return NULL; + } + + if (PyType_Ready(&pgImage_Type) < 0) { + return NULL; + } + + /* create the module */ + module = PyModule_Create(&_module); + if (module == 0) { + return NULL; + } + + Py_INCREF(&pgImage_Type); + if (PyModule_AddObject(module, "Image", (PyObject *)&pgImage_Type)) { + Py_DECREF(&pgImage_Type); + Py_DECREF(module); + return NULL; + } + + c_api[0] = &pgImage_Type; + apiobj = encapsulate_api(c_api, "_image"); + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); + Py_DECREF(module); + return NULL; + } + + return module; +} From 1d2b1861b01fa11799035538b51c719f6669f8fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 28 Jan 2025 12:59:17 +0100 Subject: [PATCH 02/11] Add interface for _sdl2.video classes --- src_c/include/_pygame.h | 5 ++--- src_c/renderer.c | 19 +++++-------------- src_c/texture.c | 19 +++++-------------- src_c/video_image.c | 21 ++++++--------------- 4 files changed, 18 insertions(+), 46 deletions(-) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 880b8a4481..e278fbf072 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -560,7 +560,7 @@ struct pgTextureObject { typedef struct { PyObject_HEAD pgTextureObject *texture; pgRectObject *srcrect; - pgColorObject* color; + pgColorObject *color; float angle; float alpha; SDL_Point origin; @@ -570,8 +570,7 @@ typedef struct { } pgImageObject; #ifndef PYGAMEAPI_IMAGE_INTERNAL #define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_image, 0)) -#define pgImage_Check(x) \ - (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) +#define pgImage_Check(x) (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) #define import_pygame_image() IMPORT_PYGAME_MODULE(_image) #endif diff --git a/src_c/renderer.c b/src_c/renderer.c index 0d6efd84a8..3b37f10c57 100644 --- a/src_c/renderer.c +++ b/src_c/renderer.c @@ -8,28 +8,19 @@ static PyTypeObject pgRenderer_Type; -static PyMethodDef renderer_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef renderer_methods[] = {{NULL, NULL, 0, NULL}}; -static PyGetSetDef renderer_getset[] = { - {NULL, 0, NULL, NULL, NULL} -}; +static PyGetSetDef renderer_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgRenderer_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", .tp_basicsize = sizeof(pgRendererObject), //.tp_dealloc = (destructor)renderer_dealloc, - .tp_doc = DOC_SDL2_VIDEO_RENDERER, - .tp_methods = renderer_methods, + .tp_doc = DOC_SDL2_VIDEO_RENDERER, .tp_methods = renderer_methods, //.tp_init = (initproc)renderer_init, - .tp_new = PyType_GenericNew, - .tp_getset = renderer_getset -}; + .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; -static PyMethodDef _renderer_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef _renderer_methods[] = {{NULL, NULL, 0, NULL}}; MODINIT_DEFINE(_renderer) { diff --git a/src_c/texture.c b/src_c/texture.c index 4edba997ed..add029f8b8 100644 --- a/src_c/texture.c +++ b/src_c/texture.c @@ -8,28 +8,19 @@ static PyTypeObject pgTexture_Type; -static PyMethodDef texture_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; -static PyGetSetDef texture_getset[] = { - {NULL, 0, NULL, NULL, NULL} -}; +static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgTexture_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._texture.Texture", .tp_basicsize = sizeof(pgTextureObject), //.tp_dealloc = (destructor)texture_dealloc, - .tp_doc = DOC_SDL2_VIDEO_TEXTURE, - .tp_methods = texture_methods, + .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, //.tp_init = (initproc)texture_init, - .tp_new = PyType_GenericNew, - .tp_getset = texture_getset -}; + .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; -static PyMethodDef _texture_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef _texture_methods[] = {{NULL, NULL, 0, NULL}}; MODINIT_DEFINE(_texture) { diff --git a/src_c/video_image.c b/src_c/video_image.c index 69b7770989..7763fe3c6a 100644 --- a/src_c/video_image.c +++ b/src_c/video_image.c @@ -8,28 +8,19 @@ static PyTypeObject pgImage_Type; -static PyMethodDef image_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; -static PyGetSetDef image_getset[] = { - {NULL, 0, NULL, NULL, NULL} -}; +static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgImage_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._image.Image", .tp_basicsize = sizeof(pgImageObject), //.tp_dealloc = (destructor)image_dealloc, - .tp_doc = DOC_SDL2_VIDEO_IMAGE, - .tp_methods = image_methods, + .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, //.tp_init = (initproc)image_init, - .tp_new = PyType_GenericNew, - .tp_getset = image_getset -}; + .tp_new = PyType_GenericNew, .tp_getset = image_getset}; -static PyMethodDef _image_methods[] = { - {NULL, NULL, 0, NULL} -}; +static PyMethodDef _image_methods[] = {{NULL, NULL, 0, NULL}}; MODINIT_DEFINE(_image) { @@ -45,7 +36,7 @@ MODINIT_DEFINE(_image) NULL, NULL, NULL}; - + /* imported needed apis; Do this first so if there is an error the module is not loaded. */ From 789818485e2f37440a3771a3efb3c1053877315b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 28 Jan 2025 13:35:05 +0100 Subject: [PATCH 03/11] Add interface for _sdl2.video classes --- src_c/meson.build | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src_c/meson.build b/src_c/meson.build index d56d6b014d..117707d14a 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -316,6 +316,42 @@ window = py.extension_module( subdir: pg, ) +# TODO: support SDL3 +if sdl_api != 3 +_renderer = py.extension_module( + '_renderer', + 'renderer.c', + c_args: warnings_error, + dependencies: pg_base_deps, + install: true, + subdir: pg, +) +endif + +# TODO: support SDL3 +if sdl_api != 3 +_texture = py.extension_module( + '_texture', + 'texture.c', + c_args: warnings_error, + dependencies: pg_base_deps, + install: true, + subdir: pg, +) +endif + +# TODO: support SDL3 +if sdl_api != 3 +_image = py.extension_module( + '_image', + 'video_image.c', + c_args: warnings_error, + dependencies: pg_base_deps, + install: true, + subdir: pg, +) +endif + # TODO: support SDL3 if sdl_api != 3 gfxdraw = py.extension_module( From 3d2baa69ccc57cf70bf796ea27a12535b42f1c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 28 Jan 2025 15:12:54 +0100 Subject: [PATCH 04/11] Add interface for _sdl2.video classes --- src_c/static.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src_c/static.c b/src_c/static.c index 697cf473f6..5fe9c63d2e 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -8,6 +8,9 @@ #define PYGAMEAPI_BASE_INTERNAL #define PYGAMEAPI_SURFACE_INTERNAL #define PYGAMEAPI_WINDOW_INTERNAL +#define PYGAMEAPI_RENDERER_INTERNAL +#define PYGAMEAPI_TEXTURE_INTERNAL +#define PYGAMEAPI_IMAGE_INTERNAL #define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) #define pgSurface_NewNoOwn(surface) \ From a3cb1f9dcb463f8d11149286331257dd8e557329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 28 Jan 2025 15:36:39 +0100 Subject: [PATCH 05/11] Add interface for _sdl2.video classes --- src_c/video_image.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/video_image.c b/src_c/video_image.c index 7763fe3c6a..a98f6e78cb 100644 --- a/src_c/video_image.c +++ b/src_c/video_image.c @@ -20,7 +20,7 @@ static PyTypeObject pgImage_Type = { //.tp_init = (initproc)image_init, .tp_new = PyType_GenericNew, .tp_getset = image_getset}; -static PyMethodDef _image_methods[] = {{NULL, NULL, 0, NULL}}; +static PyMethodDef video_image_methods[] = {{NULL, NULL, 0, NULL}}; MODINIT_DEFINE(_image) { @@ -31,7 +31,7 @@ MODINIT_DEFINE(_image) "_image", "docs_needed", -1, - _image_methods, + video_image_methods, NULL, NULL, NULL, From b15938eb8737df19b2af9a71f670ee31be172590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Wed, 29 Jan 2025 15:25:10 +0100 Subject: [PATCH 06/11] Add interface for _sdl2.video classes --- buildconfig/Setup.Android.SDL2.in | 2 - buildconfig/Setup.Emscripten.SDL2.in | 2 - buildconfig/Setup.SDL2.in | 2 - src_c/_pygame.h | 4 +- src_c/include/_pygame.h | 38 +++++--------- src_c/meson.build | 24 --------- src_c/renderer.c | 32 ++++++++++-- src_c/renderer_image.c | 24 +++++++++ src_c/static.c | 12 ----- src_c/texture.c | 68 ++++--------------------- src_c/video_image.c | 74 ---------------------------- 11 files changed, 73 insertions(+), 209 deletions(-) create mode 100644 src_c/renderer_image.c delete mode 100644 src_c/video_image.c diff --git a/buildconfig/Setup.Android.SDL2.in b/buildconfig/Setup.Android.SDL2.in index f107f84b55..b50f41cc5d 100644 --- a/buildconfig/Setup.Android.SDL2.in +++ b/buildconfig/Setup.Android.SDL2.in @@ -63,6 +63,4 @@ pixelcopy src_c/pixelcopy.c $(SDL) $(DEBUG) newbuffer src_c/newbuffer.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) _renderer src_c/renderer.c $(SDL) $(DEBUG) -_texture src_c/texture.c $(SDL) $(DEBUG) -_image src_c/video_image.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) diff --git a/buildconfig/Setup.Emscripten.SDL2.in b/buildconfig/Setup.Emscripten.SDL2.in index 6bae799663..33e25bbbb6 100644 --- a/buildconfig/Setup.Emscripten.SDL2.in +++ b/buildconfig/Setup.Emscripten.SDL2.in @@ -65,8 +65,6 @@ rwobject src_c/void.c system src_c/void.c window src_c/void.c _renderer src_c/void.c -_texture src_c/void.c -_image src_c/void.c geometry src_c/void.c #_sdl2.controller src_c/_sdl2/controller.c $(SDL) $(DEBUG) -Isrc_c diff --git a/buildconfig/Setup.SDL2.in b/buildconfig/Setup.SDL2.in index d7d2389802..d6e4e39eb7 100644 --- a/buildconfig/Setup.SDL2.in +++ b/buildconfig/Setup.SDL2.in @@ -76,5 +76,3 @@ system src_c/system.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) _renderer src_c/renderer.c $(SDL) $(DEBUG) -_texture src_c/texture.c $(SDL) $(DEBUG) -_image src_c/video_image.c $(SDL) $(DEBUG) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index fb16708fc6..c6ab80db0a 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -616,9 +616,7 @@ typedef enum { #define PYGAMEAPI_BASE_NUMSLOTS 30 #define PYGAMEAPI_EVENT_NUMSLOTS 10 #define PYGAMEAPI_WINDOW_NUMSLOTS 1 -#define PYGAMEAPI_RENDERER_NUMSLOTS 1 -#define PYGAMEAPI_TEXTURE_NUMSLOTS 1 -#define PYGAMEAPI_IMAGE_NUMSLOTS 1 +#define PYGAMEAPI_RENDERER_NUMSLOTS 3 #define PYGAMEAPI_GEOMETRY_NUMSLOTS 2 #endif /* _PYGAME_INTERNAL_H */ diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index e278fbf072..d7a6f292f9 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -531,32 +531,14 @@ typedef struct { pgTextureObject *target; SDL_bool _is_borrowed; } pgRendererObject; -#ifndef PYGAMEAPI_RENDERER_INTERNAL -#define pgRenderer_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 0)) -#define pgRenderer_Check(x) \ - (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) -#define import_pygame_renderer() IMPORT_PYGAME_MODULE(_renderer) -#endif -/* - * Texture module - */ struct pgTextureObject { PyObject_HEAD SDL_Texture *texture; pgRendererObject *renderer; int width; int height; }; -#ifndef PYGAMEAPI_TEXTURE_INTERNAL -#define pgTexture_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_texture, 0)) -#define pgTexture_Check(x) \ - (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) -#define import_pygame_texture() IMPORT_PYGAME_MODULE(_texture) -#endif -/* - * Image module - */ typedef struct { PyObject_HEAD pgTextureObject *texture; pgRectObject *srcrect; @@ -568,10 +550,18 @@ typedef struct { SDL_bool flip_y; SDL_BlendMode blend_mode; } pgImageObject; -#ifndef PYGAMEAPI_IMAGE_INTERNAL -#define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_image, 0)) -#define pgImage_Check(x) (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) -#define import_pygame_image() IMPORT_PYGAME_MODULE(_image) + +#ifndef PYGAMEAPI_RENDERER_INTERNAL +#define pgRenderer_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 0)) +#define pgTexture_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 1)) +#define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 2)) +#define pgRenderer_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) +#define pgTexture_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) +#define pgImage_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) +#define import_pygame_renderer() IMPORT_PYGAME_MODULE(_renderer) #endif #define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE @@ -594,8 +584,6 @@ PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); PYGAMEAPI_DEFINE_SLOTS(window); PYGAMEAPI_DEFINE_SLOTS(_renderer); -PYGAMEAPI_DEFINE_SLOTS(_texture); -PYGAMEAPI_DEFINE_SLOTS(_image); PYGAMEAPI_DEFINE_SLOTS(geometry); #else /* ~PYGAME_H */ PYGAMEAPI_EXTERN_SLOTS(base); @@ -611,8 +599,6 @@ PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); PYGAMEAPI_EXTERN_SLOTS(window); PYGAMEAPI_EXTERN_SLOTS(_renderer); -PYGAMEAPI_EXTERN_SLOTS(_texture); -PYGAMEAPI_EXTERN_SLOTS(_image); PYGAMEAPI_EXTERN_SLOTS(geometry); #endif /* ~PYGAME_H */ diff --git a/src_c/meson.build b/src_c/meson.build index 117707d14a..59a0320583 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -328,30 +328,6 @@ _renderer = py.extension_module( ) endif -# TODO: support SDL3 -if sdl_api != 3 -_texture = py.extension_module( - '_texture', - 'texture.c', - c_args: warnings_error, - dependencies: pg_base_deps, - install: true, - subdir: pg, -) -endif - -# TODO: support SDL3 -if sdl_api != 3 -_image = py.extension_module( - '_image', - 'video_image.c', - c_args: warnings_error, - dependencies: pg_base_deps, - install: true, - subdir: pg, -) -endif - # TODO: support SDL3 if sdl_api != 3 gfxdraw = py.extension_module( diff --git a/src_c/renderer.c b/src_c/renderer.c index 3b37f10c57..fc963e765b 100644 --- a/src_c/renderer.c +++ b/src_c/renderer.c @@ -6,6 +6,9 @@ #include "doc/sdl2_video_doc.h" +#include "texture.c" +#include "renderer_image.c" + static PyTypeObject pgRenderer_Type; static PyMethodDef renderer_methods[] = {{NULL, NULL, 0, NULL}}; @@ -14,11 +17,14 @@ static PyGetSetDef renderer_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgRenderer_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", - .tp_basicsize = sizeof(pgRendererObject), - //.tp_dealloc = (destructor)renderer_dealloc, - .tp_doc = DOC_SDL2_VIDEO_RENDERER, .tp_methods = renderer_methods, - //.tp_init = (initproc)renderer_init, - .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; + .tp_basicsize = sizeof(pgRendererObject), + //.tp_dealloc = (destructor)renderer_dealloc, + .tp_doc = DOC_SDL2_VIDEO_RENDERER, + .tp_methods = renderer_methods, + //.tp_init = (initproc)renderer_init, + .tp_new = PyType_GenericNew, + .tp_getset = renderer_getset +}; static PyMethodDef _renderer_methods[] = {{NULL, NULL, 0, NULL}}; @@ -62,7 +68,23 @@ MODINIT_DEFINE(_renderer) return NULL; } + Py_INCREF(&pgTexture_Type); + if (PyModule_AddObject(module, "Texture", (PyObject *)&pgTexture_Type)) { + Py_DECREF(&pgTexture_Type); + Py_DECREF(module); + return NULL; + } + + Py_INCREF(&pgImage_Type); + if (PyModule_AddObject(module, "Image", (PyObject *)&pgImage_Type)) { + Py_DECREF(&pgImage_Type); + Py_DECREF(module); + return NULL; + } + c_api[0] = &pgRenderer_Type; + c_api[1] = &pgTexture_Type; + c_api[2] = &pgImage_Type; apiobj = encapsulate_api(c_api, "_renderer"); if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_XDECREF(apiobj); diff --git a/src_c/renderer_image.c b/src_c/renderer_image.c new file mode 100644 index 0000000000..15d2bbea46 --- /dev/null +++ b/src_c/renderer_image.c @@ -0,0 +1,24 @@ +#include "pygame.h" + +#include "pgcompat.h" + +#include "doc/sdl2_video_doc.h" + +static PyTypeObject pgImage_Type; + +static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; + +static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; + +static PyTypeObject pgImage_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Image", + .tp_basicsize = sizeof(pgImageObject), + //.tp_dealloc = (destructor)image_dealloc, + .tp_doc = DOC_SDL2_VIDEO_IMAGE, + .tp_methods = image_methods, + //.tp_init = (initproc)image_init, + .tp_new = PyType_GenericNew, + .tp_getset = image_getset +}; + +static PyMethodDef _image_methods[] = {{NULL, NULL, 0, NULL}}; diff --git a/src_c/static.c b/src_c/static.c index 5fe9c63d2e..50ce5315eb 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -9,8 +9,6 @@ #define PYGAMEAPI_SURFACE_INTERNAL #define PYGAMEAPI_WINDOW_INTERNAL #define PYGAMEAPI_RENDERER_INTERNAL -#define PYGAMEAPI_TEXTURE_INTERNAL -#define PYGAMEAPI_IMAGE_INTERNAL #define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) #define pgSurface_NewNoOwn(surface) \ @@ -193,12 +191,6 @@ PyInit_window(void); PyMODINIT_FUNC PyInit__renderer(void); -PyMODINIT_FUNC -PyInit__image(void); - -PyMODINIT_FUNC -PyInit__texture(void); - // pygame_static module void @@ -333,8 +325,6 @@ PyInit_pygame_static() load_submodule("pygame", PyInit_window(), "window"); load_submodule("pygame", PyInit__renderer(), "_renderer"); - load_submodule("pygame", PyInit__texture(), "_texture"); - load_submodule("pygame", PyInit__image(), "_image"); load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); @@ -380,8 +370,6 @@ PyInit_pygame_static() #include "window.c" #include "renderer.c" -#include "texture.c" -#include "video_image.c" #undef pgVidInfo_Type #undef pgVidInfo_New diff --git a/src_c/texture.c b/src_c/texture.c index add029f8b8..48d1775497 100644 --- a/src_c/texture.c +++ b/src_c/texture.c @@ -1,5 +1,3 @@ -#define PYGAMEAPI_TEXTURE_INTERNAL - #include "pygame.h" #include "pgcompat.h" @@ -13,62 +11,14 @@ static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgTexture_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._texture.Texture", - .tp_basicsize = sizeof(pgTextureObject), - //.tp_dealloc = (destructor)texture_dealloc, - .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, - //.tp_init = (initproc)texture_init, - .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Texture", + .tp_basicsize = sizeof(pgTextureObject), + //.tp_dealloc = (destructor)texture_dealloc, + .tp_doc = DOC_SDL2_VIDEO_TEXTURE, + .tp_methods = texture_methods, + //.tp_init = (initproc)texture_init, + .tp_new = PyType_GenericNew, + .tp_getset = texture_getset +}; static PyMethodDef _texture_methods[] = {{NULL, NULL, 0, NULL}}; - -MODINIT_DEFINE(_texture) -{ - PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_TEXTURE_NUMSLOTS]; - - static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, - "_texture", - "docs_needed", - -1, - _texture_methods, - NULL, - NULL, - NULL, - NULL}; - - /* imported needed apis; Do this first so if there is an error - the module is not loaded. - */ - import_pygame_base(); - if (PyErr_Occurred()) { - return NULL; - } - - if (PyType_Ready(&pgTexture_Type) < 0) { - return NULL; - } - - /* create the module */ - module = PyModule_Create(&_module); - if (module == 0) { - return NULL; - } - - Py_INCREF(&pgTexture_Type); - if (PyModule_AddObject(module, "Texture", (PyObject *)&pgTexture_Type)) { - Py_DECREF(&pgTexture_Type); - Py_DECREF(module); - return NULL; - } - - c_api[0] = &pgTexture_Type; - apiobj = encapsulate_api(c_api, "_texture"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); - Py_DECREF(module); - return NULL; - } - - return module; -} diff --git a/src_c/video_image.c b/src_c/video_image.c deleted file mode 100644 index a98f6e78cb..0000000000 --- a/src_c/video_image.c +++ /dev/null @@ -1,74 +0,0 @@ -#define PYGAMEAPI_IMAGE_INTERNAL - -#include "pygame.h" - -#include "pgcompat.h" - -#include "doc/sdl2_video_doc.h" - -static PyTypeObject pgImage_Type; - -static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; - -static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; - -static PyTypeObject pgImage_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._image.Image", - .tp_basicsize = sizeof(pgImageObject), - //.tp_dealloc = (destructor)image_dealloc, - .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, - //.tp_init = (initproc)image_init, - .tp_new = PyType_GenericNew, .tp_getset = image_getset}; - -static PyMethodDef video_image_methods[] = {{NULL, NULL, 0, NULL}}; - -MODINIT_DEFINE(_image) -{ - PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_IMAGE_NUMSLOTS]; - - static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, - "_image", - "docs_needed", - -1, - video_image_methods, - NULL, - NULL, - NULL, - NULL}; - - /* imported needed apis; Do this first so if there is an error - the module is not loaded. - */ - import_pygame_base(); - if (PyErr_Occurred()) { - return NULL; - } - - if (PyType_Ready(&pgImage_Type) < 0) { - return NULL; - } - - /* create the module */ - module = PyModule_Create(&_module); - if (module == 0) { - return NULL; - } - - Py_INCREF(&pgImage_Type); - if (PyModule_AddObject(module, "Image", (PyObject *)&pgImage_Type)) { - Py_DECREF(&pgImage_Type); - Py_DECREF(module); - return NULL; - } - - c_api[0] = &pgImage_Type; - apiobj = encapsulate_api(c_api, "_image"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); - Py_DECREF(module); - return NULL; - } - - return module; -} From ef1c27d7be98b61729c0240916b0075d72781301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Wed, 29 Jan 2025 15:33:20 +0100 Subject: [PATCH 07/11] Add interface for _sdl2.video classes --- src_c/renderer.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src_c/renderer.c b/src_c/renderer.c index fc963e765b..92c381d1ac 100644 --- a/src_c/renderer.c +++ b/src_c/renderer.c @@ -55,6 +55,14 @@ MODINIT_DEFINE(_renderer) return NULL; } + if (PyType_Ready(&pgTexture_Type) < 0) { + return NULL; + } + + if (PyType_Ready(&pgImage_Type) < 0) { + return NULL; + } + /* create the module */ module = PyModule_Create(&_module); if (module == 0) { From 363a1931695e9dee405e4e9b0042f88207f55179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Wed, 29 Jan 2025 15:38:01 +0100 Subject: [PATCH 08/11] Add interface for _sdl2.video classes --- src_c/include/_pygame.h | 3 +-- src_c/renderer.c | 13 +++++-------- src_c/renderer_image.c | 13 +++++-------- src_c/texture.c | 13 +++++-------- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index d7a6f292f9..6858f270f7 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -559,8 +559,7 @@ typedef struct { (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) #define pgTexture_Check(x) \ (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) -#define pgImage_Check(x) \ - (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) +#define pgImage_Check(x) (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) #define import_pygame_renderer() IMPORT_PYGAME_MODULE(_renderer) #endif diff --git a/src_c/renderer.c b/src_c/renderer.c index 92c381d1ac..0ea397427f 100644 --- a/src_c/renderer.c +++ b/src_c/renderer.c @@ -17,14 +17,11 @@ static PyGetSetDef renderer_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgRenderer_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", - .tp_basicsize = sizeof(pgRendererObject), - //.tp_dealloc = (destructor)renderer_dealloc, - .tp_doc = DOC_SDL2_VIDEO_RENDERER, - .tp_methods = renderer_methods, - //.tp_init = (initproc)renderer_init, - .tp_new = PyType_GenericNew, - .tp_getset = renderer_getset -}; + .tp_basicsize = sizeof(pgRendererObject), + //.tp_dealloc = (destructor)renderer_dealloc, + .tp_doc = DOC_SDL2_VIDEO_RENDERER, .tp_methods = renderer_methods, + //.tp_init = (initproc)renderer_init, + .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; static PyMethodDef _renderer_methods[] = {{NULL, NULL, 0, NULL}}; diff --git a/src_c/renderer_image.c b/src_c/renderer_image.c index 15d2bbea46..af2ac4ff7c 100644 --- a/src_c/renderer_image.c +++ b/src_c/renderer_image.c @@ -12,13 +12,10 @@ static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgImage_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Image", - .tp_basicsize = sizeof(pgImageObject), - //.tp_dealloc = (destructor)image_dealloc, - .tp_doc = DOC_SDL2_VIDEO_IMAGE, - .tp_methods = image_methods, - //.tp_init = (initproc)image_init, - .tp_new = PyType_GenericNew, - .tp_getset = image_getset -}; + .tp_basicsize = sizeof(pgImageObject), + //.tp_dealloc = (destructor)image_dealloc, + .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, + //.tp_init = (initproc)image_init, + .tp_new = PyType_GenericNew, .tp_getset = image_getset}; static PyMethodDef _image_methods[] = {{NULL, NULL, 0, NULL}}; diff --git a/src_c/texture.c b/src_c/texture.c index 48d1775497..3ea5bc3d4b 100644 --- a/src_c/texture.c +++ b/src_c/texture.c @@ -12,13 +12,10 @@ static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgTexture_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Texture", - .tp_basicsize = sizeof(pgTextureObject), - //.tp_dealloc = (destructor)texture_dealloc, - .tp_doc = DOC_SDL2_VIDEO_TEXTURE, - .tp_methods = texture_methods, - //.tp_init = (initproc)texture_init, - .tp_new = PyType_GenericNew, - .tp_getset = texture_getset -}; + .tp_basicsize = sizeof(pgTextureObject), + //.tp_dealloc = (destructor)texture_dealloc, + .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, + //.tp_init = (initproc)texture_init, + .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; static PyMethodDef _texture_methods[] = {{NULL, NULL, 0, NULL}}; From 363fa59ebcc87969fcc882391fbfe1e712b59490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Wed, 29 Jan 2025 15:43:45 +0100 Subject: [PATCH 09/11] Add interface for _sdl2.video classes --- src_c/renderer_image.c | 2 -- src_c/texture.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/src_c/renderer_image.c b/src_c/renderer_image.c index af2ac4ff7c..49831fec2a 100644 --- a/src_c/renderer_image.c +++ b/src_c/renderer_image.c @@ -17,5 +17,3 @@ static PyTypeObject pgImage_Type = { .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, //.tp_init = (initproc)image_init, .tp_new = PyType_GenericNew, .tp_getset = image_getset}; - -static PyMethodDef _image_methods[] = {{NULL, NULL, 0, NULL}}; diff --git a/src_c/texture.c b/src_c/texture.c index 3ea5bc3d4b..a8a82c2cf3 100644 --- a/src_c/texture.c +++ b/src_c/texture.c @@ -17,5 +17,3 @@ static PyTypeObject pgTexture_Type = { .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, //.tp_init = (initproc)texture_init, .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; - -static PyMethodDef _texture_methods[] = {{NULL, NULL, 0, NULL}}; From afccd4b0e52f780068a0a16c36526aefc3514b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Mon, 3 Feb 2025 12:48:13 +0100 Subject: [PATCH 10/11] Add interface for _sdl2.video classes --- src_c/renderer.c | 31 ++++++++++++++++++++++++++++--- src_c/renderer_image.c | 19 ------------------- src_c/texture.c | 19 ------------------- 3 files changed, 28 insertions(+), 41 deletions(-) delete mode 100644 src_c/renderer_image.c delete mode 100644 src_c/texture.c diff --git a/src_c/renderer.c b/src_c/renderer.c index 0ea397427f..8b0c0072e0 100644 --- a/src_c/renderer.c +++ b/src_c/renderer.c @@ -6,15 +6,24 @@ #include "doc/sdl2_video_doc.h" -#include "texture.c" -#include "renderer_image.c" - static PyTypeObject pgRenderer_Type; +static PyTypeObject pgTexture_Type; + +static PyTypeObject pgImage_Type; + static PyMethodDef renderer_methods[] = {{NULL, NULL, 0, NULL}}; static PyGetSetDef renderer_getset[] = {{NULL, 0, NULL, NULL, NULL}}; +static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; + +static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; + +static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; + +static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; + static PyTypeObject pgRenderer_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", .tp_basicsize = sizeof(pgRendererObject), @@ -23,6 +32,22 @@ static PyTypeObject pgRenderer_Type = { //.tp_init = (initproc)renderer_init, .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; +static PyTypeObject pgTexture_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Texture", + .tp_basicsize = sizeof(pgTextureObject), + //.tp_dealloc = (destructor)texture_dealloc, + .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, + //.tp_init = (initproc)texture_init, + .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; + +static PyTypeObject pgImage_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Image", + .tp_basicsize = sizeof(pgImageObject), + //.tp_dealloc = (destructor)image_dealloc, + .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, + //.tp_init = (initproc)image_init, + .tp_new = PyType_GenericNew, .tp_getset = image_getset}; + static PyMethodDef _renderer_methods[] = {{NULL, NULL, 0, NULL}}; MODINIT_DEFINE(_renderer) diff --git a/src_c/renderer_image.c b/src_c/renderer_image.c deleted file mode 100644 index 49831fec2a..0000000000 --- a/src_c/renderer_image.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "pygame.h" - -#include "pgcompat.h" - -#include "doc/sdl2_video_doc.h" - -static PyTypeObject pgImage_Type; - -static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; - -static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; - -static PyTypeObject pgImage_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Image", - .tp_basicsize = sizeof(pgImageObject), - //.tp_dealloc = (destructor)image_dealloc, - .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, - //.tp_init = (initproc)image_init, - .tp_new = PyType_GenericNew, .tp_getset = image_getset}; diff --git a/src_c/texture.c b/src_c/texture.c deleted file mode 100644 index a8a82c2cf3..0000000000 --- a/src_c/texture.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "pygame.h" - -#include "pgcompat.h" - -#include "doc/sdl2_video_doc.h" - -static PyTypeObject pgTexture_Type; - -static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; - -static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; - -static PyTypeObject pgTexture_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Texture", - .tp_basicsize = sizeof(pgTextureObject), - //.tp_dealloc = (destructor)texture_dealloc, - .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, - //.tp_init = (initproc)texture_init, - .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; From 1953f4549fdc4365e8e9e74bc9cf3f4bd1df8a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Wed, 12 Feb 2025 11:06:01 +0100 Subject: [PATCH 11/11] Add interface for _sdl2.video classes --- buildconfig/Setup.Android.SDL2.in | 2 +- buildconfig/Setup.Emscripten.SDL2.in | 2 +- buildconfig/Setup.SDL2.in | 2 +- src_c/_pygame.h | 2 +- src_c/include/_pygame.h | 21 +++++++++++---------- src_c/meson.build | 6 +++--- src_c/{renderer.c => render.c} | 20 ++++++++++---------- src_c/static.c | 8 ++++---- 8 files changed, 32 insertions(+), 31 deletions(-) rename src_c/{renderer.c => render.c} (85%) diff --git a/buildconfig/Setup.Android.SDL2.in b/buildconfig/Setup.Android.SDL2.in index b50f41cc5d..610d897d8c 100644 --- a/buildconfig/Setup.Android.SDL2.in +++ b/buildconfig/Setup.Android.SDL2.in @@ -62,5 +62,5 @@ math src_c/math.c $(SDL) $(DEBUG) pixelcopy src_c/pixelcopy.c $(SDL) $(DEBUG) newbuffer src_c/newbuffer.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) -_renderer src_c/renderer.c $(SDL) $(DEBUG) +_render src_c/render.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) diff --git a/buildconfig/Setup.Emscripten.SDL2.in b/buildconfig/Setup.Emscripten.SDL2.in index 33e25bbbb6..9c465102f1 100644 --- a/buildconfig/Setup.Emscripten.SDL2.in +++ b/buildconfig/Setup.Emscripten.SDL2.in @@ -64,7 +64,7 @@ rect src_c/void.c rwobject src_c/void.c system src_c/void.c window src_c/void.c -_renderer src_c/void.c +_render src_c/void.c geometry src_c/void.c #_sdl2.controller src_c/_sdl2/controller.c $(SDL) $(DEBUG) -Isrc_c diff --git a/buildconfig/Setup.SDL2.in b/buildconfig/Setup.SDL2.in index d6e4e39eb7..0acde7e2fe 100644 --- a/buildconfig/Setup.SDL2.in +++ b/buildconfig/Setup.SDL2.in @@ -75,4 +75,4 @@ newbuffer src_c/newbuffer.c $(SDL) $(DEBUG) system src_c/system.c $(SDL) $(DEBUG) geometry src_c/geometry.c $(SDL) $(DEBUG) window src_c/window.c $(SDL) $(DEBUG) -_renderer src_c/renderer.c $(SDL) $(DEBUG) +_render src_c/render.c $(SDL) $(DEBUG) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index c6ab80db0a..f989034a2e 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -616,7 +616,7 @@ typedef enum { #define PYGAMEAPI_BASE_NUMSLOTS 30 #define PYGAMEAPI_EVENT_NUMSLOTS 10 #define PYGAMEAPI_WINDOW_NUMSLOTS 1 -#define PYGAMEAPI_RENDERER_NUMSLOTS 3 +#define PYGAMEAPI_RENDER_NUMSLOTS 3 #define PYGAMEAPI_GEOMETRY_NUMSLOTS 2 #endif /* _PYGAME_INTERNAL_H */ diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 6858f270f7..5ae7f13ab2 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -523,7 +523,7 @@ typedef struct { typedef struct pgTextureObject pgTextureObject; /* - * Renderer module + * Render module */ typedef struct { PyObject_HEAD SDL_Renderer *renderer; @@ -545,22 +545,23 @@ typedef struct { pgColorObject *color; float angle; float alpha; - SDL_Point origin; + SDL_bool has_origin; + SDL_FPoint origin; SDL_bool flip_x; SDL_bool flip_y; SDL_BlendMode blend_mode; } pgImageObject; -#ifndef PYGAMEAPI_RENDERER_INTERNAL -#define pgRenderer_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 0)) -#define pgTexture_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 1)) -#define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_renderer, 2)) +#ifndef PYGAMEAPI_RENDER_INTERNAL +#define pgRenderer_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_render, 0)) +#define pgTexture_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_render, 1)) +#define pgImage_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(_render, 2)) #define pgRenderer_Check(x) \ - (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) + (PyObject_IsInstance((x), (PyObject *)&pgRender_Type)) #define pgTexture_Check(x) \ (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) #define pgImage_Check(x) (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) -#define import_pygame_renderer() IMPORT_PYGAME_MODULE(_renderer) +#define import_pygame_render() IMPORT_PYGAME_MODULE(_render) #endif #define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE @@ -582,7 +583,7 @@ PYGAMEAPI_DEFINE_SLOTS(pixelarray); PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); PYGAMEAPI_DEFINE_SLOTS(window); -PYGAMEAPI_DEFINE_SLOTS(_renderer); +PYGAMEAPI_DEFINE_SLOTS(_render); PYGAMEAPI_DEFINE_SLOTS(geometry); #else /* ~PYGAME_H */ PYGAMEAPI_EXTERN_SLOTS(base); @@ -597,7 +598,7 @@ PYGAMEAPI_EXTERN_SLOTS(pixelarray); PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); PYGAMEAPI_EXTERN_SLOTS(window); -PYGAMEAPI_EXTERN_SLOTS(_renderer); +PYGAMEAPI_EXTERN_SLOTS(_render); PYGAMEAPI_EXTERN_SLOTS(geometry); #endif /* ~PYGAME_H */ diff --git a/src_c/meson.build b/src_c/meson.build index 59a0320583..eb8af38740 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -318,9 +318,9 @@ window = py.extension_module( # TODO: support SDL3 if sdl_api != 3 -_renderer = py.extension_module( - '_renderer', - 'renderer.c', +_render = py.extension_module( + '_render', + 'render.c', c_args: warnings_error, dependencies: pg_base_deps, install: true, diff --git a/src_c/renderer.c b/src_c/render.c similarity index 85% rename from src_c/renderer.c rename to src_c/render.c index 8b0c0072e0..9f873d615c 100644 --- a/src_c/renderer.c +++ b/src_c/render.c @@ -1,4 +1,4 @@ -#define PYGAMEAPI_RENDERER_INTERNAL +#define PYGAMEAPI_RENDER_INTERNAL #include "pygame.h" @@ -25,7 +25,7 @@ static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgRenderer_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Renderer", + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._render.Renderer", .tp_basicsize = sizeof(pgRendererObject), //.tp_dealloc = (destructor)renderer_dealloc, .tp_doc = DOC_SDL2_VIDEO_RENDERER, .tp_methods = renderer_methods, @@ -33,7 +33,7 @@ static PyTypeObject pgRenderer_Type = { .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; static PyTypeObject pgTexture_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Texture", + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._render.Texture", .tp_basicsize = sizeof(pgTextureObject), //.tp_dealloc = (destructor)texture_dealloc, .tp_doc = DOC_SDL2_VIDEO_TEXTURE, .tp_methods = texture_methods, @@ -41,25 +41,25 @@ static PyTypeObject pgTexture_Type = { .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; static PyTypeObject pgImage_Type = { - PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._renderer.Image", + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._render.Image", .tp_basicsize = sizeof(pgImageObject), //.tp_dealloc = (destructor)image_dealloc, .tp_doc = DOC_SDL2_VIDEO_IMAGE, .tp_methods = image_methods, //.tp_init = (initproc)image_init, .tp_new = PyType_GenericNew, .tp_getset = image_getset}; -static PyMethodDef _renderer_methods[] = {{NULL, NULL, 0, NULL}}; +static PyMethodDef _render_methods[] = {{NULL, NULL, 0, NULL}}; -MODINIT_DEFINE(_renderer) +MODINIT_DEFINE(_render) { PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_RENDERER_NUMSLOTS]; + static void *c_api[PYGAMEAPI_RENDER_NUMSLOTS]; static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, - "_renderer", + "_render", "docs_needed", -1, - _renderer_methods, + _render_methods, NULL, NULL, NULL, @@ -115,7 +115,7 @@ MODINIT_DEFINE(_renderer) c_api[0] = &pgRenderer_Type; c_api[1] = &pgTexture_Type; c_api[2] = &pgImage_Type; - apiobj = encapsulate_api(c_api, "_renderer"); + apiobj = encapsulate_api(c_api, "_render"); if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_XDECREF(apiobj); Py_DECREF(module); diff --git a/src_c/static.c b/src_c/static.c index 50ce5315eb..ac771e491b 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -8,7 +8,7 @@ #define PYGAMEAPI_BASE_INTERNAL #define PYGAMEAPI_SURFACE_INTERNAL #define PYGAMEAPI_WINDOW_INTERNAL -#define PYGAMEAPI_RENDERER_INTERNAL +#define PYGAMEAPI_RENDER_INTERNAL #define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) #define pgSurface_NewNoOwn(surface) \ @@ -189,7 +189,7 @@ PyMODINIT_FUNC PyInit_window(void); PyMODINIT_FUNC -PyInit__renderer(void); +PyInit__render(void); // pygame_static module @@ -324,7 +324,7 @@ PyInit_pygame_static() load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); load_submodule("pygame", PyInit_window(), "window"); - load_submodule("pygame", PyInit__renderer(), "_renderer"); + load_submodule("pygame", PyInit__render(), "_render"); load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); @@ -369,7 +369,7 @@ PyInit_pygame_static() #include "simd_blitters_sse2.c" #include "window.c" -#include "renderer.c" +#include "render.c" #undef pgVidInfo_Type #undef pgVidInfo_New