From 1565a3923a25f99db3c4f7f1bbd1ee8bef052a4c Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Mon, 15 Jan 2024 04:32:34 +0200 Subject: [PATCH 001/441] Added `area` kwarg to `mask.to_surface` --- buildconfig/stubs/pygame/mask.pyi | 1 + docs/reST/ref/mask.rst | 8 ++++- src_c/doc/mask_doc.h | 2 +- src_c/mask.c | 54 ++++++++++++++++++++++++------ test/mask_test.py | 55 ++++++++++++++++++++++++++++++- 5 files changed, 107 insertions(+), 13 deletions(-) diff --git a/buildconfig/stubs/pygame/mask.pyi b/buildconfig/stubs/pygame/mask.pyi index 43f71110c9..de0edf6008 100644 --- a/buildconfig/stubs/pygame/mask.pyi +++ b/buildconfig/stubs/pygame/mask.pyi @@ -52,6 +52,7 @@ class Mask: setcolor: Optional[ColorValue] = (255, 255, 255, 255), unsetcolor: Optional[ColorValue] = (0, 0, 0, 255), dest: Union[RectValue, Coordinate] = (0, 0), + area: Optional[RectValue] = None, ) -> Surface: ... MaskType = Mask diff --git a/docs/reST/ref/mask.rst b/docs/reST/ref/mask.rst index 6236dadf34..d1bfdf827c 100644 --- a/docs/reST/ref/mask.rst +++ b/docs/reST/ref/mask.rst @@ -570,7 +570,7 @@ to store which parts collide. | :sl:`Returns a surface with the mask drawn on it` | :sg:`to_surface() -> Surface` - | :sg:`to_surface(surface=None, setsurface=None, unsetsurface=None, setcolor=(255, 255, 255, 255), unsetcolor=(0, 0, 0, 255), dest=(0, 0)) -> Surface` + | :sg:`to_surface(surface=None, setsurface=None, unsetsurface=None, setcolor=(255, 255, 255, 255), unsetcolor=(0, 0, 0, 255), dest=(0, 0), area=None) -> Surface` Draws this mask on the given surface. Set bits (bits set to 1) and unset bits (bits set to 0) can be drawn onto a surface. @@ -612,6 +612,12 @@ to store which parts collide. mask (i.e. position ``(0, 0)`` on the mask always corresponds to position ``(0, 0)`` on the ``setsurface`` and ``unsetsurface``) :type dest: Rect or tuple(int, int) or list(int, int) or Vector2(int, int) + :param area: (optional) rectangular portion of the mask to draw. It can be a + rect-like object (a Rect, a tuple or a list with 4 numbers or an object with a + rect attribute, etc) or it can be None (the default) in which case it will use the + entire mask. Just like with Surface.blit, if the rect's topleft is negative + the final destination will be ``dest - rect.topleft``. + :type area: Rect or rect-like object :returns: the ``surface`` parameter (or a newly created surface if no ``surface`` parameter was provided) with this mask drawn on it diff --git a/src_c/doc/mask_doc.h b/src_c/doc/mask_doc.h index 3265df01c2..1788c04e4d 100644 --- a/src_c/doc/mask_doc.h +++ b/src_c/doc/mask_doc.h @@ -25,4 +25,4 @@ #define DOC_MASK_MASK_CONNECTEDCOMPONENT "connected_component() -> Mask\nconnected_component(pos) -> Mask\nReturns a mask containing a connected component" #define DOC_MASK_MASK_CONNECTEDCOMPONENTS "connected_components() -> [Mask, ...]\nconnected_components(minimum=0) -> [Mask, ...]\nReturns a list of masks of connected components" #define DOC_MASK_MASK_GETBOUNDINGRECTS "get_bounding_rects() -> [Rect, ...]\nReturns a list of bounding rects of connected components" -#define DOC_MASK_MASK_TOSURFACE "to_surface() -> Surface\nto_surface(surface=None, setsurface=None, unsetsurface=None, setcolor=(255, 255, 255, 255), unsetcolor=(0, 0, 0, 255), dest=(0, 0)) -> Surface\nReturns a surface with the mask drawn on it" +#define DOC_MASK_MASK_TOSURFACE "to_surface() -> Surface\nto_surface(surface=None, setsurface=None, unsetsurface=None, setcolor=(255, 255, 255, 255), unsetcolor=(0, 0, 0, 255), dest=(0, 0), area=None) -> Surface\nReturns a surface with the mask drawn on it" diff --git a/src_c/mask.c b/src_c/mask.c index 95822e71e8..5c993b9a6c 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -1895,8 +1895,9 @@ extract_color(SDL_Surface *surf, PyObject *color_obj, Uint8 rgba_color[], */ static void draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, - int draw_setbits, int draw_unsetbits, SDL_Surface *setsurf, - SDL_Surface *unsetsurf, Uint32 *setcolor, Uint32 *unsetcolor) + SDL_Rect *area_rect, int draw_setbits, int draw_unsetbits, + SDL_Surface *setsurf, SDL_Surface *unsetsurf, Uint32 *setcolor, + Uint32 *unsetcolor) { Uint8 *pixel = NULL; Uint8 bpp; @@ -1912,6 +1913,15 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, return; } + if (area_rect->x < 0) { + x_dest -= area_rect->x; + area_rect->w += area_rect->x; + } + if (area_rect->y < 0) { + y_dest -= area_rect->y; + area_rect->h += area_rect->y; + } + /* There is also nothing to do when the destination position is such that * nothing will be drawn on the surface. */ if ((x_dest >= surf->w) || (y_dest >= surf->h) || (-x_dest > bitmask->w) || @@ -1921,13 +1931,23 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, bpp = surf->format->BytesPerPixel; + // clamp rect width and height to not stick out of the mask + area_rect->w = MIN(area_rect->w, bitmask->w - area_rect->x); + area_rect->h = MIN(area_rect->h, bitmask->h - area_rect->y); + xm_start = (x_dest < 0) ? -x_dest : 0; + if (area_rect->x > 0) { + xm_start += area_rect->x; + } x_start = (x_dest > 0) ? x_dest : 0; - x_end = MIN(surf->w, bitmask->w + x_dest); + x_end = MIN(MIN(surf->w, bitmask->w + x_dest), x_dest + area_rect->w); ym_start = (y_dest < 0) ? -y_dest : 0; + if (area_rect->y > 0) { + ym_start += area_rect->y; + } y_start = (y_dest > 0) ? y_dest : 0; - y_end = MIN(surf->h, bitmask->h + y_dest); + y_end = MIN(MIN(surf->h, bitmask->h + y_dest), y_dest + area_rect->h); if (NULL == setsurf && NULL == unsetsurf) { /* Draw just using color values. No surfaces. */ @@ -2074,7 +2094,8 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject *surfobj = Py_None, *setcolorobj = NULL, *unsetcolorobj = NULL; PyObject *setsurfobj = Py_None, *unsetsurfobj = Py_None; - PyObject *destobj = NULL; + PyObject *destobj = NULL, *areaobj = NULL; + SDL_Rect *area_rect, temp_rect; SDL_Surface *surf = NULL, *setsurf = NULL, *unsetsurf = NULL; bitmask_t *bitmask = pgMask_AsBitmap(self); Uint32 *setcolor_ptr = NULL, *unsetcolor_ptr = NULL; @@ -2087,11 +2108,11 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"surface", "setsurface", "unsetsurface", "setcolor", "unsetcolor", "dest", - NULL}; + "area", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOOOOO", keywords, - &surfobj, &setsurfobj, &unsetsurfobj, - &setcolorobj, &unsetcolorobj, &destobj)) { + if (!PyArg_ParseTupleAndKeywords( + args, kwargs, "|OOOOOOO", keywords, &surfobj, &setsurfobj, + &unsetsurfobj, &setcolorobj, &unsetcolorobj, &destobj, &areaobj)) { return NULL; /* Exception already set. */ } @@ -2207,6 +2228,19 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) } } + if (areaobj && areaobj != Py_None) { + if (!(area_rect = pgRect_FromObject(areaobj, &temp_rect))) { + PyErr_SetString(PyExc_TypeError, "invalid rectstyle argument"); + goto to_surface_error; + } + } + else { + temp_rect.x = temp_rect.y = 0; + temp_rect.w = bitmask->w; + temp_rect.h = bitmask->h; + area_rect = &temp_rect; + } + if (!pgSurface_Lock((pgSurfaceObject *)surfobj)) { PyErr_SetString(PyExc_RuntimeError, "cannot lock surface"); goto to_surface_error; @@ -2229,7 +2263,7 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) Py_BEGIN_ALLOW_THREADS; /* Release the GIL. */ - draw_to_surface(surf, bitmask, x_dest, y_dest, draw_setbits, + draw_to_surface(surf, bitmask, x_dest, y_dest, area_rect, draw_setbits, draw_unsetbits, setsurf, unsetsurf, setcolor_ptr, unsetcolor_ptr); diff --git a/test/mask_test.py b/test/mask_test.py index 3a8ff12aeb..6e6c779cb8 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -2822,7 +2822,6 @@ def test_to_surface__dest_default(self): assertSurfaceFilled(self, to_surface, expected_color, mask_rect) assertSurfaceFilledIgnoreArea(self, to_surface, surface_color, mask_rect) - @unittest.expectedFailure def test_to_surface__area_param(self): """Ensures to_surface accepts an area arg/kwarg.""" expected_ref_count = 2 @@ -2854,6 +2853,60 @@ def test_to_surface__area_param(self): self.assertEqual(to_surface.get_size(), size) assertSurfaceFilled(self, to_surface, expected_color) + def test_to_surface__area_output(self): + dst = pygame.Surface((2, 2)) + mask = pygame.mask.Mask((2, 2), fill=True) + + white = (255, 255, 255, 255) + black = (0, 0, 0, 255) + + # make sure the surface is black, this is to make sure the test surface and mask are different colors + self.assertEqual(dst.get_at((0, 0)), black) + # make sure the mask is set and the default color after conversion is white + self.assertEqual(mask.to_surface().get_at((0, 0)), white) + + test_areas_plus_destinations_and_expected_pattern = [ + [{"dest": (0, 0), "area": None}, [[white, white], [white, white]]], + [{"dest": (0, 0), "area": (0, 0, 1, 1)}, [[white, black], [black, black]]], + [{"dest": (0, 0), "area": (0, 0, 2, 2)}, [[white, white], [white, white]]], + [{"dest": (1, 0), "area": (0, 0, 1, 2)}, [[black, white], [black, white]]], + [{"dest": (0, 0), "area": (0, 0, 0, 0)}, [[black, black], [black, black]]], + [{"dest": (1, 0), "area": (-1, 0, 1, 1)}, [[black, black], [black, black]]], + [{"dest": (0, 0), "area": (-1, 0, 2, 1)}, [[black, white], [black, black]]], + [ + {"dest": (1, 1), "area": (-2, -2, 1, 1)}, + [[black, black], [black, black]], + ], + [ + {"dest": (0, 1), "area": (0, 0, 50, 50)}, + [[black, black], [white, white]], + ], + [ + {"dest": (-1, 0), "area": (-1, 0, 2, 2)}, + [[white, black], [white, black]], + ], + [ + {"dest": (0, -1), "area": (-1, 0, 3, 2)}, + [[black, white], [black, black]], + ], + [{"dest": (0, 0), "area": (2, 2, 2, 2)}, [[black, black], [black, black]]], + [ + {"dest": (-5, -5), "area": (-5, -5, 6, 6)}, + [[white, black], [black, black]], + ], + [ + {"dest": (-5, -5), "area": (-5, -5, 1, 1)}, + [[black, black], [black, black]], + ], + ] + + for kwargs, pattern in test_areas_plus_destinations_and_expected_pattern: + surface = dst.copy() + mask.to_surface(surface=surface, **kwargs) + for y, row in enumerate(pattern): + for x, value in enumerate(row): + self.assertEqual(surface.get_at((x, y)), value) + def test_to_surface__area_default(self): """Ensures the default area is correct.""" expected_color = pygame.Color("white") From 8b019c936eb5bbeafd56ac1c2f20f638599821ca Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Fri, 26 Apr 2024 13:57:46 +0200 Subject: [PATCH 002/441] draw flood fill --- src_c/draw.c | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) diff --git a/src_c/draw.c b/src_c/draw.c index 4ead384b9e..ac1f9e7eb7 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -85,6 +85,13 @@ draw_round_rect(SDL_Surface *surf, int x1, int y1, int x2, int y2, int radius, int width, Uint32 color, int top_left, int top_right, int bottom_left, int bottom_right, int *drawn_area); +static int +flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, + SDL_Surface *pattern, int *drawn_area); + +static void +unsafe_set_at(SDL_Surface *surf, int x, int y, Uint32 color); + // validation of a draw color #define CHECK_LOAD_COLOR(colorobj) \ if (!pg_MappedColorFromObj((colorobj), surf->format, &color, \ @@ -978,6 +985,88 @@ rect(PyObject *self, PyObject *args, PyObject *kwargs) return pgRect_New4(rect->x, rect->y, 0, 0); } +static PyObject * +flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) +{ + pgSurfaceObject *surfobj; + pgSurfaceObject *pat_surfobj; + PyObject *colorobj, *start; + SDL_Surface *surf = NULL; + int startx, starty; + Uint32 color; + SDL_Surface *pattern = NULL; + SDL_bool did_lock=SDL_FALSE; + + int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, + INT_MIN}; /* Used to store bounding box values */ + static char *keywords[] = {"surface", "color", "start_pos", NULL}; + + if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O!OO", keywords, + &pgSurface_Type, &surfobj, &colorobj, + &start)) { + return NULL; /* Exception already set. */ + } + + surf = pgSurface_AsSurface(surfobj); + SURF_INIT_CHECK(surf) + + if (PG_SURF_BytesPerPixel(surf) <= 0 || PG_SURF_BytesPerPixel(surf) > 4) { + return PyErr_Format(PyExc_ValueError, + "unsupported surface bit depth (%d) for drawing", + PG_SURF_BytesPerPixel(surf)); + } + + if (pgSurface_Check(colorobj)){ + pat_surfobj = ((pgSurfaceObject *) colorobj); + + pattern= SDL_ConvertSurface + (pat_surfobj->surf, surf->format, 0); + + if(pattern==NULL){ + return RAISE(PyExc_RuntimeError, "error converting pattern surf"); + } + + SDL_SetSurfaceRLE(pattern, + SDL_FALSE); + + color=0; + } else { + CHECK_LOAD_COLOR(colorobj); + } + + if (!pg_TwoIntsFromObj(start, &startx, &starty)) { + return RAISE(PyExc_TypeError, "invalid start_pos argument"); + } + + if(SDL_MUSTLOCK(surf)){ + did_lock=SDL_TRUE; + if (!pgSurface_Lock(surfobj)) { + return RAISE(PyExc_RuntimeError, "error locking surface"); + } + } + + flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); + + if(pattern!=NULL){ + SDL_FreeSurface(pattern); + } + + if(did_lock){ + if (!pgSurface_Unlock(surfobj)) { + return RAISE(PyExc_RuntimeError, "error unlocking surface"); + } + } + + /* Compute return rect. */ + if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + return pgRect_New4(drawn_area[0], drawn_area[1], + drawn_area[2] - drawn_area[0] + 1, + drawn_area[3] - drawn_area[1] + 1); + else + return pgRect_New4(startx, starty, 0, 0); +} + /* Functions used in drawing algorithms */ static void @@ -988,6 +1077,28 @@ swap(float *a, float *b) *b = temp; } +#define WORD_BITS (8 * sizeof(unsigned int)) + +struct point2d{ + Uint32 x; + Uint32 y; +}; + +static inline void _bitarray_set(unsigned int * bitarray, size_t idx, SDL_bool value){ + if(value){ + bitarray[idx / WORD_BITS] |= (1 << (idx % WORD_BITS)); + } else { + bitarray[idx / WORD_BITS] &= (~(1) << (idx % WORD_BITS)); + } +} + +static inline SDL_bool _bitarray_get(unsigned int * bitarray, size_t idx) { + if (bitarray[idx / WORD_BITS] & (1 << (idx % WORD_BITS))) + return SDL_TRUE; + else + return SDL_FALSE; +} + static int compare_int(const void *a, const void *b) { @@ -1648,6 +1759,176 @@ draw_line(SDL_Surface *surf, int x1, int y1, int x2, int y2, Uint32 color, set_and_check_rect(surf, x2, y2, color, drawn_area); } +#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_pix) \ + switch (PG_FORMAT_BytesPerPixel(p_format)) { \ + case 1: \ + p_color = (Uint32) * \ + ((Uint8 *)(p_pixels) + (p_y) * p_surf->pitch + (p_x)); \ + break; \ + case 2: \ + p_color = \ + (Uint32) * \ + ((Uint16 *)((p_pixels) + (p_y) * p_surf->pitch) + (p_x)); \ + break; \ + case 3: \ + p_pix = \ + ((Uint8 *)(p_pixels + (p_y) * p_surf->pitch) + (p_x) * 3); \ + p_color = (SDL_BYTEORDER == SDL_LIL_ENDIAN) \ + ? (p_pix[0]) + (p_pix[1] << 8) + (p_pix[2] << 16) \ + : (p_pix[2]) + (p_pix[1] << 8) + (p_pix[0] << 16); \ + break; \ + default: /* case 4: */ \ + p_color = \ + *((Uint32 *)(p_pixels + (p_y) * p_surf->pitch) + (p_x)); \ + break; \ + } + + + +static int +flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surface *pattern, int *drawn_area) +{ + SDL_Rect cliprect; + + SDL_GetClipRect(surf, &cliprect); + size_t frontier_bufsize=8, frontier_size=1, next_frontier_size=0; + + struct point2d *frontier = malloc(frontier_bufsize * sizeof(struct point2d)); + if(frontier==NULL){ + return -1; + } + + struct point2d *frontier_next = malloc(frontier_bufsize * sizeof(struct point2d)); + + if(frontier_next==NULL){ + free(frontier); + return -1; + } + size_t mask_size = cliprect.w*cliprect.h; + + unsigned int *mask = calloc((mask_size) / 8 + 1, sizeof(unsigned int)); + if (mask==NULL){ + free(frontier); + free(frontier_next); + free(mask); + return -1; + } + Uint32 old_color=0; + Uint8 *pix; + + int VN_X[]= {0,0,1,-1}; + int VN_Y[]= {1,-1,0,0}; + + + if (!(x1>=cliprect.x && x1<(cliprect.x+cliprect.w) + && y1>=cliprect.y && y1<(cliprect.y+cliprect.h))) { + free(frontier); + free(mask); + return 0; + } + + SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, surf->format, + pix); + + if (pattern==NULL && old_color == new_color){ + free(frontier); + free(mask); + free(frontier_next); + return 0; + } + + frontier[0].x=x1; + frontier[0].y=y1; + + while (frontier_size!=0){ + next_frontier_size=0; + + for (size_t i=0; ipixels, surf->format, + pix); + + if (current_color!=old_color){ + continue; + } + + if (pattern!=NULL){ + SURF_GET_AT(new_color, pattern, x%pattern->w, y%pattern->h, + (Uint8 *)pattern->pixels, pattern->format, + pix); + } + + unsafe_set_at(surf, x, y, new_color); + add_pixel_to_drawn_list(x, y, drawn_area); + + for (int n=0; n<4; n++){ + long nx=x+VN_X[n]; + long ny=y+VN_Y[n]; + SDL_bool found_in_frontier = SDL_FALSE; + + if (!(nx>=cliprect.x && nx=cliprect.y && ny Date: Sun, 5 May 2024 11:25:00 +0200 Subject: [PATCH 003/441] clang-format, docs, report error --- docs/reST/ref/draw.rst | 27 +++++++ src_c/doc/draw_doc.h | 1 + src_c/draw.c | 157 ++++++++++++++++++++++------------------- 3 files changed, 112 insertions(+), 73 deletions(-) diff --git a/docs/reST/ref/draw.rst b/docs/reST/ref/draw.rst index eca6c2b73a..f60bac9972 100644 --- a/docs/reST/ref/draw.rst +++ b/docs/reST/ref/draw.rst @@ -541,6 +541,33 @@ object around the draw calls (see :func:`pygame.Surface.lock` and .. versionchanged:: 2.5.0 ``blend`` argument readded for backcompat, but will always raise a deprecation exception when used .. ## pygame.draw.aalines ## + +.. function:: flood_fill + + | :sl:`fill in a connected area of same-color pixels` + | :sg:`flood_fill(surface, color, starting_point) -> Rect` + | :sg:`flood_fill(surface, pattern_surface, starting_point) -> Rect` + + Replace the color of a cluster of connected same-color pixels, beginning + from the starting point, with a repeating pattern or solid single color + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: Color or string (for :doc:`color_list`) or int or tuple(int, int, int, [int]) + :param pattern_surface: pattern to fill with, as a surface + :param starting_point: starting point as a sequence of 2 ints/floats, + e.g. ``(x, y)`` + :type starting_point: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the starting point + and its width and height will be 0 + :rtype: Rect + + .. versionadded:: 2.5.0 + .. ## pygame.draw.flood_fill ## .. ## pygame.draw ## diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index ec918d08d0..f74ca93ed5 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -9,3 +9,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points) -> Rect\nlines(surface, color, closed, points, width=1) -> Rect\ndraw multiple contiguous straight line segments" #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos) -> Rect\ndraw a straight antialiased line" #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\ndraw multiple contiguous straight antialiased line segments" +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, starting_point) -> Rect\nflood_fill(surface, pattern_surface, starting_point) -> Rect\nfill in a connected area of same-color pixels" diff --git a/src_c/draw.c b/src_c/draw.c index ac1f9e7eb7..64c9f5102c 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -995,7 +995,8 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) int startx, starty; Uint32 color; SDL_Surface *pattern = NULL; - SDL_bool did_lock=SDL_FALSE; + SDL_bool did_lock = SDL_FALSE; + int flood_fill_result; int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, INT_MIN}; /* Used to store bounding box values */ @@ -1016,21 +1017,20 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) PG_SURF_BytesPerPixel(surf)); } - if (pgSurface_Check(colorobj)){ - pat_surfobj = ((pgSurfaceObject *) colorobj); + if (pgSurface_Check(colorobj)) { + pat_surfobj = ((pgSurfaceObject *)colorobj); - pattern= SDL_ConvertSurface - (pat_surfobj->surf, surf->format, 0); + pattern = SDL_ConvertSurface(pat_surfobj->surf, surf->format, 0); - if(pattern==NULL){ + if (pattern == NULL) { return RAISE(PyExc_RuntimeError, "error converting pattern surf"); } - SDL_SetSurfaceRLE(pattern, - SDL_FALSE); + SDL_SetSurfaceRLE(pattern, SDL_FALSE); - color=0; - } else { + color = 0; + } + else { CHECK_LOAD_COLOR(colorobj); } @@ -1038,25 +1038,29 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) return RAISE(PyExc_TypeError, "invalid start_pos argument"); } - if(SDL_MUSTLOCK(surf)){ - did_lock=SDL_TRUE; + if (SDL_MUSTLOCK(surf)) { + did_lock = SDL_TRUE; if (!pgSurface_Lock(surfobj)) { return RAISE(PyExc_RuntimeError, "error locking surface"); } } - flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); + flood_fill_result = flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); - if(pattern!=NULL){ + if (pattern != NULL) { SDL_FreeSurface(pattern); } - if(did_lock){ + if (did_lock) { if (!pgSurface_Unlock(surfobj)) { return RAISE(PyExc_RuntimeError, "error unlocking surface"); } } + if(flood_fill_result == -1){ + return RAISE(PyExc_RuntimeError, "flood fill allocation fail"); + } + /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) @@ -1079,20 +1083,25 @@ swap(float *a, float *b) #define WORD_BITS (8 * sizeof(unsigned int)) -struct point2d{ +struct point2d { Uint32 x; Uint32 y; }; -static inline void _bitarray_set(unsigned int * bitarray, size_t idx, SDL_bool value){ - if(value){ +static inline void +_bitarray_set(unsigned int *bitarray, size_t idx, SDL_bool value) +{ + if (value) { bitarray[idx / WORD_BITS] |= (1 << (idx % WORD_BITS)); - } else { + } + else { bitarray[idx / WORD_BITS] &= (~(1) << (idx % WORD_BITS)); } } -static inline SDL_bool _bitarray_get(unsigned int * bitarray, size_t idx) { +static inline SDL_bool +_bitarray_get(unsigned int *bitarray, size_t idx) +{ if (bitarray[idx / WORD_BITS] & (1 << (idx % WORD_BITS))) return SDL_TRUE; else @@ -1786,42 +1795,44 @@ draw_line(SDL_Surface *surf, int x1, int y1, int x2, int y2, Uint32 color, static int -flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surface *pattern, int *drawn_area) +flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, + SDL_Surface *pattern, int *drawn_area) { SDL_Rect cliprect; SDL_GetClipRect(surf, &cliprect); - size_t frontier_bufsize=8, frontier_size=1, next_frontier_size=0; + size_t frontier_bufsize = 8, frontier_size = 1, next_frontier_size = 0; - struct point2d *frontier = malloc(frontier_bufsize * sizeof(struct point2d)); - if(frontier==NULL){ + struct point2d *frontier = + malloc(frontier_bufsize * sizeof(struct point2d)); + if (frontier == NULL) { return -1; } - struct point2d *frontier_next = malloc(frontier_bufsize * sizeof(struct point2d)); + struct point2d *frontier_next = + malloc(frontier_bufsize * sizeof(struct point2d)); - if(frontier_next==NULL){ + if (frontier_next == NULL) { free(frontier); return -1; } - size_t mask_size = cliprect.w*cliprect.h; + size_t mask_size = cliprect.w * cliprect.h; unsigned int *mask = calloc((mask_size) / 8 + 1, sizeof(unsigned int)); - if (mask==NULL){ + if (mask == NULL) { free(frontier); free(frontier_next); free(mask); return -1; } - Uint32 old_color=0; + Uint32 old_color = 0; Uint8 *pix; - int VN_X[]= {0,0,1,-1}; - int VN_Y[]= {1,-1,0,0}; + int VN_X[] = {0, 0, 1, -1}; + int VN_Y[] = {1, -1, 0, 0}; - - if (!(x1>=cliprect.x && x1<(cliprect.x+cliprect.w) - && y1>=cliprect.y && y1<(cliprect.y+cliprect.h))) { + if (!(x1 >= cliprect.x && x1 < (cliprect.x + cliprect.w) && + y1 >= cliprect.y && y1 < (cliprect.y + cliprect.h))) { free(frontier); free(mask); return 0; @@ -1830,71 +1841,71 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surfac SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, surf->format, pix); - if (pattern==NULL && old_color == new_color){ + if (pattern == NULL && old_color == new_color) { free(frontier); free(mask); free(frontier_next); return 0; } - frontier[0].x=x1; - frontier[0].y=y1; + frontier[0].x = x1; + frontier[0].y = y1; - while (frontier_size!=0){ - next_frontier_size=0; + while (frontier_size != 0) { + next_frontier_size = 0; - for (size_t i=0; ipixels, surf->format, - pix); + SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, + surf->format, pix); - if (current_color!=old_color){ + if (current_color != old_color) { continue; } - if (pattern!=NULL){ - SURF_GET_AT(new_color, pattern, x%pattern->w, y%pattern->h, - (Uint8 *)pattern->pixels, pattern->format, - pix); + if (pattern != NULL) { + SURF_GET_AT(new_color, pattern, x % pattern->w, y % pattern->h, + (Uint8 *)pattern->pixels, pattern->format, pix); } unsafe_set_at(surf, x, y, new_color); add_pixel_to_drawn_list(x, y, drawn_area); - for (int n=0; n<4; n++){ - long nx=x+VN_X[n]; - long ny=y+VN_Y[n]; + for (int n = 0; n < 4; n++) { + long nx = x + VN_X[n]; + long ny = y + VN_Y[n]; SDL_bool found_in_frontier = SDL_FALSE; - if (!(nx>=cliprect.x && nx=cliprect.y && ny= cliprect.x && nx < cliprect.x + cliprect.w && + ny >= cliprect.y && ny < cliprect.y + cliprect.h)) { continue; } - mask_idx = (ny-cliprect.y)*cliprect.w+(nx-cliprect.x); + mask_idx = (ny - cliprect.y) * cliprect.w + (nx - cliprect.x); if (_bitarray_get(mask, mask_idx)) continue; _bitarray_set(mask, mask_idx, SDL_TRUE); - if(found_in_frontier){ + if (found_in_frontier) { continue; } - if (next_frontier_size==frontier_bufsize){ + if (next_frontier_size == frontier_bufsize) { struct point2d *old_buf = frontier_next; - frontier_bufsize*=4; + frontier_bufsize *= 4; - frontier_next = realloc(frontier_next, frontier_bufsize*sizeof(struct point2d)); - if(frontier_next==NULL){ + frontier_next = + realloc(frontier_next, + frontier_bufsize * sizeof(struct point2d)); + if (frontier_next == NULL) { free(mask); free(frontier); free(old_buf); @@ -1902,8 +1913,9 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surfac } old_buf = frontier; - frontier = realloc(frontier, frontier_bufsize*sizeof(struct point2d)); - if(frontier==NULL){ + frontier = realloc( + frontier, frontier_bufsize * sizeof(struct point2d)); + if (frontier == NULL) { free(old_buf); free(mask); free(frontier_next); @@ -1911,18 +1923,17 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surfac } } - frontier_next[next_frontier_size].x=nx; - frontier_next[next_frontier_size].y=ny; + frontier_next[next_frontier_size].x = nx; + frontier_next[next_frontier_size].y = ny; next_frontier_size++; - } } struct point2d *temp_buf; - temp_buf=frontier; - frontier=frontier_next; - frontier_next=temp_buf; + temp_buf = frontier; + frontier = frontier_next; + frontier_next = temp_buf; - frontier_size=next_frontier_size; + frontier_size = next_frontier_size; } free(frontier); free(mask); @@ -3134,7 +3145,7 @@ static PyMethodDef _draw_methods[] = { {"ellipse", (PyCFunction)ellipse, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_ELLIPSE}, {"flood_fill", (PyCFunction)flood_fill, METH_VARARGS | METH_KEYWORDS, - ""}, + DOC_DRAW_FLOODFILL}, {"arc", (PyCFunction)arc, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_ARC}, {"circle", (PyCFunction)circle, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_CIRCLE}, From c2ccab39f03bb62093f19b5ca60af5b349873ca8 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sun, 5 May 2024 12:11:02 +0200 Subject: [PATCH 004/441] tests --- test/draw_test.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/draw_test.py b/test/draw_test.py index fd126dd556..feff0b3089 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -6311,6 +6311,45 @@ class to add any draw.arc specific tests to. """ +class DrawFloodFillMixin(unittest.TestCase): + """Mixin tests for flood fill. + """ + + def test_flood_fill(self): + """Ensures flood fill fills with solid color""" + surf = pygame.Surface((100, 100)) + surf.fill((0,0,0)) + + pygame.draw.line (surf, (255,0,0), (10,10), (90,90), 5) + + self.assertEqual(surf.get_at((10,10)), (255,0,0), "line drawing precondition") + self.assertEqual(surf.get_at((90,90)), (255,0,0), "line drawing precondition") + + pygame.draw.flood_fill(surf, (255,255,255), (90, 90)) + + self.assertEqual(surf.get_at((90,90)), (255,255,255), "flood fill start point") + self.assertEqual(surf.get_at((10,10)), (255,255,255), "flood fill reaching the end") + + + def test_flood_pattern(self): + """Ensures flood fill fills in a pattern""" + surf = pygame.Surface((100, 100)) + surf.fill((0,0,0)) + + pattern = pygame.Surface((2, 2)) + pattern.fill((255,255,255)) + pattern.set_at((0,0), (255,0,0)) + pattern.set_at((1,1), (0,0,255)) + + pygame.draw.line (surf, (0,0,0), (5,95), (95,5)) + pygame.draw.line (surf, (0,0,0), (50, 0), (50,95)) + + pygame.draw.flood_fill(surf, pattern, (95, 95)) + + for pt in [(0,0),(0,1),(1,0),(1,1)]: + self.assertEqual(surf.get_at(pt), pattern.get_at(pt), pt) + + ### Draw Module Testing ####################################################### From 0dea5895ce524b5884c1969f95eed05538093aa6 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sun, 5 May 2024 15:56:21 +0200 Subject: [PATCH 005/441] format --- src_c/draw.c | 9 ++++----- test/draw_test.py | 40 +++++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 64c9f5102c..393ef97707 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1045,7 +1045,8 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } } - flood_fill_result = flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); + flood_fill_result = + flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); if (pattern != NULL) { SDL_FreeSurface(pattern); @@ -1057,7 +1058,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } } - if(flood_fill_result == -1){ + if (flood_fill_result == -1) { return RAISE(PyExc_RuntimeError, "flood fill allocation fail"); } @@ -1792,8 +1793,6 @@ draw_line(SDL_Surface *surf, int x1, int y1, int x2, int y2, Uint32 color, break; \ } - - static int flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surface *pattern, int *drawn_area) @@ -3145,7 +3144,7 @@ static PyMethodDef _draw_methods[] = { {"ellipse", (PyCFunction)ellipse, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_ELLIPSE}, {"flood_fill", (PyCFunction)flood_fill, METH_VARARGS | METH_KEYWORDS, - DOC_DRAW_FLOODFILL}, + DOC_DRAW_FLOODFILL}, {"arc", (PyCFunction)arc, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_ARC}, {"circle", (PyCFunction)circle, METH_VARARGS | METH_KEYWORDS, DOC_DRAW_CIRCLE}, diff --git a/test/draw_test.py b/test/draw_test.py index feff0b3089..cbf6e7273a 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -6312,41 +6312,47 @@ class to add any draw.arc specific tests to. class DrawFloodFillMixin(unittest.TestCase): - """Mixin tests for flood fill. - """ + """Mixin tests for flood fill.""" def test_flood_fill(self): """Ensures flood fill fills with solid color""" surf = pygame.Surface((100, 100)) - surf.fill((0,0,0)) - - pygame.draw.line (surf, (255,0,0), (10,10), (90,90), 5) + surf.fill((0, 0, 0)) - self.assertEqual(surf.get_at((10,10)), (255,0,0), "line drawing precondition") - self.assertEqual(surf.get_at((90,90)), (255,0,0), "line drawing precondition") + pygame.draw.line(surf, (255, 0, 0), (10, 10), (90, 90), 5) - pygame.draw.flood_fill(surf, (255,255,255), (90, 90)) + self.assertEqual( + surf.get_at((10, 10)), (255, 0, 0), "line drawing precondition" + ) + self.assertEqual( + surf.get_at((90, 90)), (255, 0, 0), "line drawing precondition" + ) - self.assertEqual(surf.get_at((90,90)), (255,255,255), "flood fill start point") - self.assertEqual(surf.get_at((10,10)), (255,255,255), "flood fill reaching the end") + pygame.draw.flood_fill(surf, (255, 255, 255), (90, 90)) + self.assertEqual( + surf.get_at((90, 90)), (255, 255, 255), "flood fill start point" + ) + self.assertEqual( + surf.get_at((10, 10)), (255, 255, 255), "flood fill reaching the end" + ) def test_flood_pattern(self): """Ensures flood fill fills in a pattern""" surf = pygame.Surface((100, 100)) - surf.fill((0,0,0)) + surf.fill((0, 0, 0)) pattern = pygame.Surface((2, 2)) - pattern.fill((255,255,255)) - pattern.set_at((0,0), (255,0,0)) - pattern.set_at((1,1), (0,0,255)) + pattern.fill((255, 255, 255)) + pattern.set_at((0, 0), (255, 0, 0)) + pattern.set_at((1, 1), (0, 0, 255)) - pygame.draw.line (surf, (0,0,0), (5,95), (95,5)) - pygame.draw.line (surf, (0,0,0), (50, 0), (50,95)) + pygame.draw.line(surf, (0, 0, 0), (5, 95), (95, 5)) + pygame.draw.line(surf, (0, 0, 0), (50, 0), (50, 95)) pygame.draw.flood_fill(surf, pattern, (95, 95)) - for pt in [(0,0),(0,1),(1,0),(1,1)]: + for pt in [(0, 0), (0, 1), (1, 0), (1, 1)]: self.assertEqual(surf.get_at(pt), pattern.get_at(pt), pt) From af87bc491796075b62ec2a266317e5b30a4918f0 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sun, 5 May 2024 16:32:13 +0200 Subject: [PATCH 006/441] types --- buildconfig/stubs/pygame/draw.pyi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 7a47a0b0d5..03f0c78834 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -1,5 +1,6 @@ from pygame.rect import Rect from pygame.surface import Surface +from typing import Union from ._common import ColorValue, Coordinate, RectValue, Sequence @@ -68,3 +69,8 @@ def aalines( closed: bool, points: Sequence[Coordinate], ) -> Rect: ... +def flood_fill( + surface: Surface, + color: Union[ColorValue, Surface], + start_point: Coordinate +) -> Rect: ... From 9df783e50347649d7f671b23b594669f5aa3226b Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sun, 5 May 2024 19:00:03 +0200 Subject: [PATCH 007/441] comments, readability This is no longer fun. Is my local install of clang-format bugged? --- src_c/draw.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 393ef97707..5b4a13fb8a 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1797,11 +1797,15 @@ static int flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Surface *pattern, int *drawn_area) { + // breadth first flood fill, like graph search SDL_Rect cliprect; + size_t mask_idx; SDL_GetClipRect(surf, &cliprect); size_t frontier_bufsize = 8, frontier_size = 1, next_frontier_size = 0; + // Instead of a queue, we use two arrays and swap them between steps. + // This makes implementation easier, especially memory management. struct point2d *frontier = malloc(frontier_bufsize * sizeof(struct point2d)); if (frontier == NULL) { @@ -1815,8 +1819,9 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, free(frontier); return -1; } - size_t mask_size = cliprect.w * cliprect.h; + // 2D bitmask for queued nodes + size_t mask_size = cliprect.w * cliprect.h; unsigned int *mask = calloc((mask_size) / 8 + 1, sizeof(unsigned int)); if (mask == NULL) { free(frontier); @@ -1827,6 +1832,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, Uint32 old_color = 0; Uint8 *pix; + // Von Neumann neighbourhood int VN_X[] = {0, 0, 1, -1}; int VN_Y[] = {1, -1, 0, 0}; @@ -1841,6 +1847,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, pix); if (pattern == NULL && old_color == new_color) { + // not an error, but nothing to do here free(frontier); free(mask); free(frontier_next); @@ -1850,18 +1857,19 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, frontier[0].x = x1; frontier[0].y = y1; + // mark starting point already queued + mask_idx = (y1 - cliprect.y) * cliprect.w + (x1 - cliprect.x); + _bitarray_set(mask, mask_idx, SDL_TRUE); + while (frontier_size != 0) { next_frontier_size = 0; for (size_t i = 0; i < frontier_size; i++) { unsigned int x = frontier[i].x; unsigned int y = frontier[i].y; - size_t mask_idx = (y - cliprect.y) * cliprect.w + (x - cliprect.x); Uint32 current_color = 0; - _bitarray_set(mask, mask_idx, SDL_TRUE); - SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, surf->format, pix); @@ -1874,13 +1882,13 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, (Uint8 *)pattern->pixels, pattern->format, pix); } + // clipping and color mapping have already happened here unsafe_set_at(surf, x, y, new_color); add_pixel_to_drawn_list(x, y, drawn_area); for (int n = 0; n < 4; n++) { long nx = x + VN_X[n]; long ny = y + VN_Y[n]; - SDL_bool found_in_frontier = SDL_FALSE; if (!(nx >= cliprect.x && nx < cliprect.x + cliprect.w && ny >= cliprect.y && ny < cliprect.y + cliprect.h)) { @@ -1891,12 +1899,11 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (_bitarray_get(mask, mask_idx)) continue; + // only queue node once _bitarray_set(mask, mask_idx, SDL_TRUE); - if (found_in_frontier) { - continue; - } if (next_frontier_size == frontier_bufsize) { + // grow frontier arrays struct point2d *old_buf = frontier_next; frontier_bufsize *= 4; @@ -1927,6 +1934,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, next_frontier_size++; } } + // swap buffers struct point2d *temp_buf; temp_buf = frontier; frontier = frontier_next; From c9c117fdba1255281c97ed42f187d73bef553bf2 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Tue, 21 May 2024 09:52:24 +0200 Subject: [PATCH 008/441] code review feedback --- src_c/draw.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 5b4a13fb8a..982f3ffa7c 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1059,7 +1059,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (flood_fill_result == -1) { - return RAISE(PyExc_RuntimeError, "flood fill allocation fail"); + return PyErr_NoMemory(); } /* Compute return rect. */ @@ -1821,12 +1821,13 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, } // 2D bitmask for queued nodes + // we could check drawn color, but that doesnt work for patterns size_t mask_size = cliprect.w * cliprect.h; unsigned int *mask = calloc((mask_size) / 8 + 1, sizeof(unsigned int)); + if (mask == NULL) { free(frontier); free(frontier_next); - free(mask); return -1; } Uint32 old_color = 0; @@ -1838,9 +1839,8 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (!(x1 >= cliprect.x && x1 < (cliprect.x + cliprect.w) && y1 >= cliprect.y && y1 < (cliprect.y + cliprect.h))) { - free(frontier); - free(mask); - return 0; + // not an error, but nothing to do here + goto flood_fill_finished; } SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, surf->format, @@ -1848,10 +1848,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (pattern == NULL && old_color == new_color) { // not an error, but nothing to do here - free(frontier); - free(mask); - free(frontier_next); - return 0; + goto flood_fill_finished; } frontier[0].x = x1; @@ -1942,6 +1939,8 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, frontier_size = next_frontier_size; } + + flood_fill_finished: free(frontier); free(mask); free(frontier_next); From 029ccc558dd04635e947d9a0bcea6abe182cb542 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Tue, 21 May 2024 10:20:16 +0200 Subject: [PATCH 009/441] My local install of clang-format disagreed with CI.\nIf you keep this up, I will add ascii art to illustrate drawing algorithms. This commit message is longer than the diff! --- src_c/draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/draw.c b/src_c/draw.c index 982f3ffa7c..6e8dfd1bf9 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1940,7 +1940,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, frontier_size = next_frontier_size; } - flood_fill_finished: +flood_fill_finished: free(frontier); free(mask); free(frontier_next); From c12d293c5f79399daa44eb19a6f7e666011009cc Mon Sep 17 00:00:00 2001 From: bilhox <69472620+bilhox@users.noreply.github.com> Date: Sun, 1 Sep 2024 00:07:20 +0200 Subject: [PATCH 010/441] rel_center --- buildconfig/stubs/pygame/rect.pyi | 4 + docs/reST/ref/rect.rst | 21 +++++- src_c/rect.c | 8 ++ src_c/rect_impl.h | 39 ++++++++++ test/rect_test.py | 117 ++++++++++++++++++++++++++++++ 5 files changed, 188 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index 9899c84270..91efee8e1b 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -93,6 +93,10 @@ class _GenericRect(Collection[_N]): @center.setter def center(self, value: Coordinate) -> None: ... @property + def rel_center(self) -> Tuple[_N, _N]: ... + @rel_center.setter + def rel_center(self, value: Coordinate) -> None: ... + @property def centerx(self) -> _N: ... @centerx.setter def centerx(self, value: float) -> None: ... diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index a936683a10..82738524ac 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -47,7 +47,7 @@ top, left, bottom, right topleft, bottomleft, topright, bottomright midtop, midleft, midbottom, midright - center, centerx, centery + center, rel_center, centerx, centery size, width, height w,h @@ -92,6 +92,25 @@ However, the subclass's ``__init__()`` method is not called, and ``__new__()`` is assumed to take no arguments. So these methods should be overridden if any extra attributes need to be copied. + + .. versionadded:: 2.5.2 + ``rel_center`` added to Rect / FRect. This will return you ``Coordinate`` of + the center relative to the topleft of the Rect. Setting a ``Coordinate`` to it will + modify the size of the rect to 2 times the ``Coordinate`` used. Below you can find a + code example of how it should work : + + .. code-block:: python + + > my_rect = pygame.Rect(0, 0, 2, 2) + > my_rect.rel_center + > (1, 1) + > my_rect.rel_center = (128, 128) + > my_rect.rel_center, my_rect.size + > ((128, 128), (256, 256)) + + Beware of non integer relative centers ! Using a Rect instead of FRect will round down + the values of the returned ``Coordinate``. + .. method:: copy diff --git a/src_c/rect.c b/src_c/rect.c index f3e22f69d8..29fe347e2c 100644 --- a/src_c/rect.c +++ b/src_c/rect.c @@ -133,6 +133,8 @@ four_floats_from_obj(PyObject *obj, float *val1, float *val2, float *val3, #define RectExport_setmidright pg_rect_setmidright #define RectExport_getcenter pg_rect_getcenter #define RectExport_setcenter pg_rect_setcenter +#define RectExport_getrelcenter pg_rect_getrelcenter +#define RectExport_setrelcenter pg_rect_setrelcenter #define RectExport_getsize pg_rect_getsize #define RectExport_setsize pg_rect_setsize #define RectImport_primitiveType int @@ -250,6 +252,8 @@ four_floats_from_obj(PyObject *obj, float *val1, float *val2, float *val3, #define RectExport_setmidright pg_frect_setmidright #define RectExport_getcenter pg_frect_getcenter #define RectExport_setcenter pg_frect_setcenter +#define RectExport_getrelcenter pg_frect_getrelcenter +#define RectExport_setrelcenter pg_frect_setrelcenter #define RectExport_getsize pg_frect_getsize #define RectExport_setsize pg_frect_setsize #define RectImport_primitiveType float @@ -684,6 +688,8 @@ static PyGetSetDef pg_frect_getsets[] = { {"size", (getter)pg_frect_getsize, (setter)pg_frect_setsize, NULL, NULL}, {"center", (getter)pg_frect_getcenter, (setter)pg_frect_setcenter, NULL, NULL}, + {"rel_center", (getter)pg_frect_getrelcenter, + (setter)pg_frect_setrelcenter, NULL, NULL}, {"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL, NULL}, @@ -726,6 +732,8 @@ static PyGetSetDef pg_rect_getsets[] = { {"size", (getter)pg_rect_getsize, (setter)pg_rect_setsize, NULL, NULL}, {"center", (getter)pg_rect_getcenter, (setter)pg_rect_setcenter, NULL, NULL}, + {"rel_center", (getter)pg_rect_getrelcenter, (setter)pg_rect_setrelcenter, + NULL, NULL}, {"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL, NULL}, diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index c918b0db8c..d4332cca75 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -284,6 +284,12 @@ #ifndef RectExport_setcenter #error RectExport_setcenter needs to be defined #endif +#ifndef RectExport_getrelcenter +#error RectExport_getrelcenter needs to be defined +#endif +#ifndef RectExport_setrelcenter +#error RectExport_setrelcenter needs to be defined +#endif #ifndef RectExport_getsize #error RectExport_getsize needs to be defined #endif @@ -604,6 +610,10 @@ RectExport_getcenter(RectObject *self, void *closure); static int RectExport_setcenter(RectObject *self, PyObject *value, void *closure); static PyObject * +RectExport_getrelcenter(RectObject *self, void *closure); +static int +RectExport_setrelcenter(RectObject *self, PyObject *value, void *closure); +static PyObject * RectExport_getsize(RectObject *self, void *closure); static int RectExport_setsize(RectObject *self, PyObject *value, void *closure); @@ -2804,6 +2814,33 @@ RectExport_getcenter(RectObject *self, void *closure) self->r.y + (self->r.h / 2)); } +/*center*/ +static PyObject * +RectExport_getrelcenter(RectObject *self, void *closure) +{ + return TupleFromTwoPrimitives(self->r.w / 2, self->r.h / 2); +} + +static int +RectExport_setrelcenter(RectObject *self, PyObject *value, void *closure) +{ + PrimitiveType val1, val2; + + if (NULL == value) { + /* Attribute deletion not supported. */ + PyErr_SetString(PyExc_AttributeError, "can't delete attribute"); + return -1; + } + + if (!twoPrimitivesFromObj(value, &val1, &val2)) { + PyErr_SetString(PyExc_TypeError, "invalid rect assignment"); + return -1; + } + self->r.w = val1 * 2; + self->r.h = val2 * 2; + return 0; +} + static int RectExport_setcenter(RectObject *self, PyObject *value, void *closure) { @@ -2958,6 +2995,8 @@ RectExport_iterator(RectObject *self) #undef RectExport_setmidright #undef RectExport_getcenter #undef RectExport_setcenter +#undef RectExport_getrelcenter +#undef RectExport_setrelcenter #undef RectExport_getsize #undef RectExport_setsize #undef RectExport_iterator diff --git a/test/rect_test.py b/test/rect_test.py index dc64cc9e11..a0f7561081 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -512,6 +512,35 @@ def test_center__del(self): with self.assertRaises(AttributeError): del r.center + def test_rel_center(self): + """Changing the rel_center attribute changes the rect's size and + does not move the rect. + """ + r = Rect(1, 2, 75, 45) + new_rel_center = (697, 345) + old_topleft = (r.left, r.top) + expected_size = (697 * 2, 345 * 2) + + r.rel_center = new_rel_center + self.assertEqual(new_rel_center, r.rel_center) + self.assertEqual(old_topleft, r.topleft) + self.assertEqual(expected_size, r.size) + + def test_rel_center__invalid_value(self): + """Ensures the rel_center attribute handles invalid values correctly.""" + r = Rect(0, 0, 1, 1) + + for value in (None, [], "1", 1, (1,), [1, 2, 3]): + with self.assertRaises(TypeError): + r.rel_center = value + + def test_rel_center__del(self): + """Ensures the center attribute can't be deleted.""" + r = Rect(0, 0, 1, 1) + + with self.assertRaises(AttributeError): + del r.rel_center + def test_midleft(self): """Changing the midleft attribute moves the rect and does not change the rect's size @@ -788,7 +817,9 @@ def test_inflate__smaller(self): """The inflate method inflates around the center of the rectangle""" r = Rect(2, 4, 6, 8) r2 = r.inflate(-4, -6) + expected_new_rel_center = r.w // 2 - 2, r.h // 2 - 3 + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 3, r2.top) @@ -816,7 +847,9 @@ def test_inflate_ip__smaller(self): r = Rect(2, 4, 6, 8) r2 = Rect(r) r2.inflate_ip(-4, -6) + expected_new_rel_center = r.w // 2 - 2, r.h // 2 - 3 + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 3, r2.top) @@ -829,7 +862,9 @@ def test_scale_by__larger_single_argument(self): """The scale method scales around the center of the rectangle""" r = Rect(2, 4, 6, 8) r2 = r.scale_by(2) + expected_new_rel_center = r.size + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -843,7 +878,9 @@ def test_scale_by__larger_single_argument_kwarg(self): keyword arguments 'x' and 'y'""" r = Rect(2, 4, 6, 8) r2 = r.scale_by(x=2) + expected_new_rel_center = r.size + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -856,7 +893,9 @@ def test_scale_by__smaller_single_argument(self): """The scale method scales around the center of the rectangle""" r = Rect(2, 4, 8, 8) r2 = r.scale_by(0.5) + expected_new_rel_center = r.w // 4, r.h // 4 + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 2, r2.top) @@ -872,6 +911,9 @@ def test_scale_by__larger(self): # act r2 = r.scale_by(2, 4) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -890,6 +932,9 @@ def test_scale_by__larger_kwargs_scale_by(self): # act r2 = r.scale_by(scale_by=(2, 4)) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -908,6 +953,9 @@ def test_scale_by__larger_kwargs(self): # act r2 = r.scale_by(x=2, y=4) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -923,6 +971,9 @@ def test_scale_by__smaller(self): # act r2 = r.scale_by(0.5, 0.25) # assert + expected_new_rel_center = r.w // 4, r.h // 8 + + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.centery - r.h / 4 / 2, r2.top) @@ -940,28 +991,43 @@ def test_scale_by__subzero(self): r.scale_by(0.00001) rx1 = r.scale_by(10, 1) + expected_new_rel_center = r.w * 5, r.h // 2 + + self.assertEqual(expected_new_rel_center, rx1.rel_center) self.assertEqual(r.centerx - r.w * 10 / 2, rx1.x) self.assertEqual(r.y, rx1.y) self.assertEqual(r.w * 10, rx1.w) self.assertEqual(r.h, rx1.h) rx2 = r.scale_by(-10, 1) + expected_new_rel_center = r.w * 5, r.h // 2 + + self.assertEqual(expected_new_rel_center, rx2.rel_center) self.assertEqual(rx1.x, rx2.x) self.assertEqual(rx1.y, rx2.y) self.assertEqual(rx1.w, rx2.w) self.assertEqual(rx1.h, rx2.h) ry1 = r.scale_by(1, 10) + expected_new_rel_center = r.w // 2, r.h * 5 + + self.assertEqual(expected_new_rel_center, ry1.rel_center) self.assertEqual(r.x, ry1.x) self.assertEqual(r.centery - r.h * 10 / 2, ry1.y) self.assertEqual(r.w, ry1.w) self.assertEqual(r.h * 10, ry1.h) ry2 = r.scale_by(1, -10) + expected_new_rel_center = r.w // 2, r.h * 5 + + self.assertEqual(expected_new_rel_center, ry2.rel_center) self.assertEqual(ry1.x, ry2.x) self.assertEqual(ry1.y, ry2.y) self.assertEqual(ry1.w, ry2.w) self.assertEqual(ry1.h, ry2.h) r1 = r.scale_by(10) + expected_new_rel_center = r.w * 5, r.h * 5 + + self.assertEqual(expected_new_rel_center, r1.rel_center) self.assertEqual(r.centerx - r.w * 10 / 2, r1.x) self.assertEqual(r.centery - r.h * 10 / 2, r1.y) self.assertEqual(r.w * 10, r1.w) @@ -1020,7 +1086,9 @@ def test_scale_by_ip__larger(self): r = Rect(2, 4, 6, 8) r2 = Rect(r) r2.scale_by_ip(2) + expected_new_rel_center = r.w, r.h + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -1034,7 +1102,9 @@ def test_scale_by_ip__smaller(self): r = Rect(2, 4, 8, 8) r2 = Rect(r) r2.scale_by_ip(0.5) + expected_new_rel_center = r.w // 4, r.h // 4 + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 2, r2.top) @@ -1058,6 +1128,9 @@ def test_scale_by_ip__kwargs(self): r2.scale_by_ip(x=2, y=4) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertEqual(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -2997,7 +3070,9 @@ def testCalculatedAttributes(self): midx = r.left + r.width / 2 midy = r.top + r.height / 2 + expected_new_rel_center = r.w / 2, r.h / 2 + self.assertEqual(expected_new_rel_center, r.rel_center) self.assertEqual(midx, r.centerx) self.assertEqual(midy, r.centery) self.assertEqual((r.centerx, r.centery), r.center) @@ -3025,7 +3100,9 @@ def test_scale_by__larger_single_argument(self): """The scale method scales around the center of the rectangle""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(2.3) + expected_new_rel_center = r.w * 1.15, r.h * 1.15 + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3040,7 +3117,9 @@ def test_scale_by__larger_single_argument_kwarg(self): keyword arguments 'x' and 'y'""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(x=2.3) + expected_new_rel_center = r.w * 1.15, r.h * 1.15 + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3054,7 +3133,9 @@ def test_scale_by__smaller_single_argument(self): """The scale method scales around the center of the rectangle""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(0.5) + expected_new_rel_center = r.w * 0.25, r.h * 0.25 + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.top + 2.225, r2.top) @@ -3070,6 +3151,9 @@ def test_scale_by__larger(self): # act r2 = r.scale_by(2, 4) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3088,6 +3172,9 @@ def test_scale_by__larger_kwargs_scale_by(self): # act r2 = r.scale_by(scale_by=(2, 4)) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3106,6 +3193,9 @@ def test_scale_by__larger_kwargs(self): # act r2 = r.scale_by(x=2, y=4) # assert + expected_new_rel_center = r.w, r.h * 2 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3121,6 +3211,9 @@ def test_scale_by__smaller(self): # act r2 = r.scale_by(0.5, 0.25) # assert + expected_new_rel_center = r.w * 0.25, r.h * 0.125 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.centery - r.h / 4 / 2, r2.top) @@ -3138,28 +3231,45 @@ def test_scale_by__subzero(self): r.scale_by(0.00001) rx1 = r.scale_by(10, 1) + expected_new_rel_center = r.w * 5, r.h * 0.5 + + self.assertSeqAlmostEqual5(expected_new_rel_center, rx1.rel_center) self.assertAlmostEqual5(r.centerx - r.w * 10 / 2, rx1.x) self.assertAlmostEqual5(r.y, rx1.y) self.assertAlmostEqual5(r.w * 10, rx1.w) self.assertAlmostEqual5(r.h, rx1.h) + rx2 = r.scale_by(-10, 1) + expected_new_rel_center = r.w * 5, r.h * 0.5 + + self.assertSeqAlmostEqual5(expected_new_rel_center, rx2.rel_center) self.assertAlmostEqual5(rx1.x, rx2.x) self.assertAlmostEqual5(rx1.y, rx2.y) self.assertAlmostEqual5(rx1.w, rx2.w) self.assertAlmostEqual5(rx1.h, rx2.h) ry1 = r.scale_by(1, 10) + expected_new_rel_center = r.w * 0.5, r.h * 5 + + self.assertSeqAlmostEqual5(expected_new_rel_center, ry1.rel_center) self.assertAlmostEqual5(r.x, ry1.x) self.assertAlmostEqual5(r.centery - r.h * 10 / 2, ry1.y) self.assertAlmostEqual5(r.w, ry1.w) self.assertAlmostEqual5(r.h * 10, ry1.h) + ry2 = r.scale_by(1, -10) + expected_new_rel_center = r.w * 0.5, r.h * 5 + + self.assertSeqAlmostEqual5(expected_new_rel_center, ry2.rel_center) self.assertAlmostEqual5(ry1.x, ry2.x) self.assertAlmostEqual5(ry1.y, ry2.y) self.assertAlmostEqual5(ry1.w, ry2.w) self.assertAlmostEqual5(ry1.h, ry2.h) r1 = r.scale_by(10) + expected_new_rel_center = r.w * 5, r.h * 5 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r1.rel_center) self.assertAlmostEqual5(r.centerx - r.w * 10 / 2, r1.x) self.assertAlmostEqual5(r.centery - r.h * 10 / 2, r1.y) self.assertAlmostEqual5(r.w * 10, r1.w) @@ -3218,7 +3328,9 @@ def test_scale_by_ip__larger(self): r = FRect(2.1, 4, 6, 8.9) r2 = FRect(r) r2.scale_by_ip(2.3) + expected_new_rel_center = r.w * 1.15, r.h * 1.15 + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3233,7 +3345,9 @@ def test_scale_by_ip__smaller(self): r = FRect(2.1, 4, 6, 8.9) r2 = FRect(r) r2.scale_by_ip(0.5) + expected_new_rel_center = r.w * 0.25, r.h * 0.25 + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.top + 2.225, r2.top) @@ -3257,6 +3371,9 @@ def test_scale_by_ip__kwargs(self): r2.scale_by_ip(x=2, y=4) # assert + expected_new_rel_center = r.w, r.h * 2.0 + + self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) self.assertEqual(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) From cc12f81f61fc773f37c64b7497f55a6516132f45 Mon Sep 17 00:00:00 2001 From: bilhox <69472620+bilhox@users.noreply.github.com> Date: Sun, 1 Sep 2024 00:16:59 +0200 Subject: [PATCH 011/441] fixed tyo --- docs/reST/ref/rect.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index 82738524ac..fe8ea6b7c7 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -94,7 +94,7 @@ overridden if any extra attributes need to be copied. .. versionadded:: 2.5.2 - ``rel_center`` added to Rect / FRect. This will return you ``Coordinate`` of + ``rel_center`` added to Rect / FRect. This will return you a ``Coordinate`` of the center relative to the topleft of the Rect. Setting a ``Coordinate`` to it will modify the size of the rect to 2 times the ``Coordinate`` used. Below you can find a code example of how it should work : From 42864063198e9835fd274c4ea1bd2c6927c951e7 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Sat, 5 Oct 2024 08:23:34 +0100 Subject: [PATCH 012/441] Update docs to reflect Point change --- docs/reST/ref/rect.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index fe8ea6b7c7..67fb1284e2 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -94,9 +94,9 @@ overridden if any extra attributes need to be copied. .. versionadded:: 2.5.2 - ``rel_center`` added to Rect / FRect. This will return you a ``Coordinate`` of - the center relative to the topleft of the Rect. Setting a ``Coordinate`` to it will - modify the size of the rect to 2 times the ``Coordinate`` used. Below you can find a + ``rel_center`` added to Rect / FRect. This will return you a ``Point`` of + the center relative to the topleft of the Rect. Setting a ``Point`` to it will + modify the size of the rect to 2 times the ``Point`` used. Below you can find a code example of how it should work : .. code-block:: python @@ -109,7 +109,7 @@ > ((128, 128), (256, 256)) Beware of non integer relative centers ! Using a Rect instead of FRect will round down - the values of the returned ``Coordinate``. + the values of the returned ``Point``. .. method:: copy From 61904eaca8a95fedcc79692c5d2c93c8a0632a85 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Sat, 5 Oct 2024 08:24:03 +0100 Subject: [PATCH 013/441] Update type hint for point change --- buildconfig/stubs/pygame/rect.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index 91efee8e1b..f71427d4a8 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -95,7 +95,7 @@ class _GenericRect(Collection[_N]): @property def rel_center(self) -> Tuple[_N, _N]: ... @rel_center.setter - def rel_center(self, value: Coordinate) -> None: ... + def rel_center(self, value: Point) -> None: ... @property def centerx(self) -> _N: ... @centerx.setter From 1932b82552bae33651b9b35382dcd4104602dcc9 Mon Sep 17 00:00:00 2001 From: Gabriele Date: Wed, 16 Oct 2024 14:29:13 +0200 Subject: [PATCH 014/441] Changes to be commited: new file: test.txt --- test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000000..e69de29bb2 From 49dbee5fd853456b345f7c210ec41b2c989badd4 Mon Sep 17 00:00:00 2001 From: GabrieleLS Date: Wed, 16 Oct 2024 14:30:57 +0200 Subject: [PATCH 015/441] Delete test.txt --- test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index e69de29bb2..0000000000 From 969cdce4ad48b137a02dba40b22a223b02d2c45b Mon Sep 17 00:00:00 2001 From: AntoineMamou Date: Wed, 23 Oct 2024 12:07:19 +0200 Subject: [PATCH 016/441] Fix functions in rect_test to use literal values for attribute checks --- test/rect_test.py | 56 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/test/rect_test.py b/test/rect_test.py index 0ad1af77c3..e916af89d7 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -777,13 +777,13 @@ def test_inflate__larger(self): r = Rect(2, 4, 6, 8) r2 = r.inflate(4, 6) - self.assertEqual(r.center, r2.center) - self.assertEqual(r.left - 2, r2.left) - self.assertEqual(r.top - 3, r2.top) - self.assertEqual(r.right + 2, r2.right) - self.assertEqual(r.bottom + 3, r2.bottom) - self.assertEqual(r.width + 4, r2.width) - self.assertEqual(r.height + 6, r2.height) + self.assertEqual(r2.center, (5, 8)) + self.assertEqual(r2.left, 0) + self.assertEqual(r2.top, 1) + self.assertEqual(r2.right, 10) + self.assertEqual(r2.bottom, 15) + self.assertEqual(r2.width, 10) + self.assertEqual(r2.height, 14) def test_inflate__smaller(self): """Ensures deflating a rect keeps its center the same @@ -791,13 +791,13 @@ def test_inflate__smaller(self): r = Rect(2, 4, 6, 8) r2 = r.inflate(-4, -6) - self.assertEqual(r.center, r2.center) - self.assertEqual(r.left + 2, r2.left) - self.assertEqual(r.top + 3, r2.top) - self.assertEqual(r.right - 2, r2.right) - self.assertEqual(r.bottom - 3, r2.bottom) - self.assertEqual(r.width - 4, r2.width) - self.assertEqual(r.height - 6, r2.height) + self.assertEqual((5, 8), r2.center) + self.assertEqual(4, r2.left) + self.assertEqual(7, r2.top) + self.assertEqual(6, r2.right) + self.assertEqual(9, r2.bottom) + self.assertEqual(2, r2.width) + self.assertEqual(2, r2.height) def test_inflate_ip__larger(self): """Ensures inflating a rect in place keeps its center the same @@ -806,13 +806,13 @@ def test_inflate_ip__larger(self): r2 = Rect(r) r2.inflate_ip(4, 6) - self.assertEqual(r.center, r2.center) - self.assertEqual(r.left - 2, r2.left) - self.assertEqual(r.top - 3, r2.top) - self.assertEqual(r.right + 2, r2.right) - self.assertEqual(r.bottom + 3, r2.bottom) - self.assertEqual(r.width + 4, r2.width) - self.assertEqual(r.height + 6, r2.height) + self.assertEqual(r2.center, (5, 8)) + self.assertEqual(r2.left, 0) + self.assertEqual(r2.top, 1) + self.assertEqual(r2.right, 10) + self.assertEqual(r2.bottom, 15) + self.assertEqual(r2.width, 10) + self.assertEqual(r2.height, 14) def test_inflate_ip__smaller(self): """Ensures deflating a rect in place keeps its center the same @@ -821,13 +821,13 @@ def test_inflate_ip__smaller(self): r2 = Rect(r) r2.inflate_ip(-4, -6) - self.assertEqual(r.center, r2.center) - self.assertEqual(r.left + 2, r2.left) - self.assertEqual(r.top + 3, r2.top) - self.assertEqual(r.right - 2, r2.right) - self.assertEqual(r.bottom - 3, r2.bottom) - self.assertEqual(r.width - 4, r2.width) - self.assertEqual(r.height - 6, r2.height) + self.assertEqual(r2.center, (5, 8)) + self.assertEqual(r2.left, 4) + self.assertEqual(r2.top, 7) + self.assertEqual(r2.right, 6) + self.assertEqual(r2.bottom, 9) + self.assertEqual(r2.width, 2) + self.assertEqual(r2.height, 2) def test_scale_by__larger_single_argument(self): """The scale method scales around the center of the rectangle""" From 7d27a8bd9f3a7ca6d6a447884fd917ba8ec1f7ad Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 2 Nov 2024 19:52:27 -0700 Subject: [PATCH 017/441] Rewrite spritecollide function --- src_py/sprite.py | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index 6f7f9e32dd..71efc30db9 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1684,36 +1684,21 @@ def spritecollide(sprite, group, dokill, collided=None): which will be used to calculate the collision. """ - # pull the default collision function in as a local variable outside - # the loop as this makes the loop run faster - default_sprite_collide_func = sprite.rect.colliderect - - if dokill: - crashed = [] - append = crashed.append - - for group_sprite in group.sprites(): - if collided is not None: - if collided(sprite, group_sprite): - group_sprite.kill() - append(group_sprite) - else: - if default_sprite_collide_func(group_sprite.rect): - group_sprite.kill() - append(group_sprite) - - return crashed - if collided is not None: - return [ + crashed = [ group_sprite for group_sprite in group if collided(sprite, group_sprite) ] - - return [ - group_sprite - for group_sprite in group - if default_sprite_collide_func(group_sprite.rect) - ] + else: + sprite_rect_collide = sprite.rect.colliderect + crashed = [ + group_sprite + for group_sprite in group + if sprite_rect_collide(group_sprite.rect) + ] + if dokill: + for group_sprite in crashed: + group_sprite.kill() + return crashed def groupcollide(groupa, groupb, dokilla, dokillb, collided=None): From 09e70e1383da3b32e2a13a3e4b1f5b467b9abfad Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 2 Nov 2024 19:53:37 -0700 Subject: [PATCH 018/441] Rewrite groupcollide function --- src_py/sprite.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index 71efc30db9..c55dafe351 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1723,17 +1723,13 @@ def groupcollide(groupa, groupb, dokilla, dokillb, collided=None): # pull the collision function in as a local variable outside # the loop as this makes the loop run faster sprite_collide_func = spritecollide + for group_a_sprite in groupa: + collisions = sprite_collide_func(group_a_sprite, groupb, dokillb, collided) + if collisions: + crashed[group_a_sprite] = collisions if dokilla: - for group_a_sprite in groupa.sprites(): - collision = sprite_collide_func(group_a_sprite, groupb, dokillb, collided) - if collision: - crashed[group_a_sprite] = collision - group_a_sprite.kill() - else: - for group_a_sprite in groupa: - collision = sprite_collide_func(group_a_sprite, groupb, dokillb, collided) - if collision: - crashed[group_a_sprite] = collision + for group_a_sprite in crashed: + group_a_sprite.kill() return crashed From 97f3bb97bb74552db11771bcdc4c303dd373adaa Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 2 Nov 2024 19:55:42 -0700 Subject: [PATCH 019/441] Improve spritecollideany function --- src_py/sprite.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index c55dafe351..8f14671b4e 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1751,19 +1751,16 @@ def spritecollideany(sprite, group, collided=None): sprites must have a "rect" value, which is a rectangle of the sprite area, which will be used to calculate the collision. - """ - # pull the default collision function in as a local variable outside - # the loop as this makes the loop run faster - default_sprite_collide_func = sprite.rect.colliderect - if collided is not None: for group_sprite in group: if collided(sprite, group_sprite): return group_sprite else: - # Special case old behaviour for speed. + # pull the default collision function in as a local variable outside + # the loop as this makes the loop run faster + sprite_rect_collide = sprite.rect.colliderect for group_sprite in group: - if default_sprite_collide_func(group_sprite.rect): + if sprite_rect_collide(group_sprite.rect): return group_sprite return None From 711c5e0e9178dd20550b0eb86b4d6f637ed1cea0 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 1 Dec 2024 13:35:13 -0800 Subject: [PATCH 020/441] Lazy import implementation for surfarray, sndarray --- docs/reST/ref/sndarray.rst | 2 ++ docs/reST/ref/surfarray.rst | 2 ++ src_py/__init__.py | 38 ++++++++++++++++++++++++++++++------- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/docs/reST/ref/sndarray.rst b/docs/reST/ref/sndarray.rst index bc2899f614..733b49de1d 100644 --- a/docs/reST/ref/sndarray.rst +++ b/docs/reST/ref/sndarray.rst @@ -23,6 +23,8 @@ Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. +.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid loading NumPy needlessly + .. function:: array | :sl:`copy Sound samples into an array` diff --git a/docs/reST/ref/surfarray.rst b/docs/reST/ref/surfarray.rst index 48b917fbfd..8df7ef88b3 100644 --- a/docs/reST/ref/surfarray.rst +++ b/docs/reST/ref/surfarray.rst @@ -35,6 +35,8 @@ pixels from the surface and any changes performed to the array will make changes in the surface. As this last functions share memory with the surface, this one will be locked during the lifetime of the array. +.. versionchanged:: 2.5.3 surfarray module is lazily loaded to avoid loading NumPy needlessly + .. function:: array2d | :sl:`Copy pixels into a 2d array` diff --git a/src_py/__init__.py b/src_py/__init__.py index c227a9e55e..7faef2784e 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -300,16 +300,36 @@ def PixelArray(surface): # pylint: disable=unused-argument except (ImportError, OSError): scrap = MissingModule("scrap", urgent=0) -try: - import pygame.surfarray -except (ImportError, OSError): - surfarray = MissingModule("surfarray", urgent=0) +# Two lazily imported modules to avoid loading numpy unnecessarily -try: - import pygame.sndarray -except (ImportError, OSError): +from importlib.util import LazyLoader, find_spec, module_from_spec + + +def lazy_import(name): + """See https://docs.python.org/3/library/importlib.html#implementing-lazy-imports + + Only load modules upon their first attribute access. + Lazily imported modules are directly referenced in packager_imports function. + """ + spec = find_spec("pygame." + name) + loader = LazyLoader(spec.loader) + spec.loader = loader + module = module_from_spec(spec) + sys.modules[spec.name] = module + loader.exec_module(module) + return module + + +if find_spec("numpy") is not None: + surfarray = lazy_import("surfarray") + sndarray = lazy_import("sndarray") +else: + # Preserve MissingModule behavior when numpy is not installed + surfarray = MissingModule("surfarray", urgent=0) sndarray = MissingModule("sndarray", urgent=0) +del LazyLoader, find_spec, lazy_import, module_from_spec + try: import pygame._debug from pygame._debug import print_debug_info @@ -366,6 +386,10 @@ def packager_imports(): import pygame.macosx import pygame.colordict + # lazy imports + import pygame.surfarray + import pygame.sndarray + # make Rects pickleable From 2aeeee03adca027b34954178bd09fa157f92ee15 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 1 Dec 2024 14:12:23 -0800 Subject: [PATCH 021/441] Handle all possible ImportErrors for lazy modules --- src_py/__init__.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index 7faef2784e..9ede1c893c 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -306,9 +306,11 @@ def PixelArray(surface): # pylint: disable=unused-argument def lazy_import(name): - """See https://docs.python.org/3/library/importlib.html#implementing-lazy-imports + """Lazily import a pygame module. + + See https://docs.python.org/3/library/importlib.html#implementing-lazy-imports + Only load the module upon its first attribute access. - Only load modules upon their first attribute access. Lazily imported modules are directly referenced in packager_imports function. """ spec = find_spec("pygame." + name) @@ -320,15 +322,22 @@ def lazy_import(name): return module -if find_spec("numpy") is not None: +numpy_exists = find_spec("numpy") is not None + +# Preserve MissingModule behavior when numpy is not installed +# and when their pygame module dependencies are unavailable + +if numpy_exists and not isinstance(pixelcopy, MissingModule): surfarray = lazy_import("surfarray") - sndarray = lazy_import("sndarray") else: - # Preserve MissingModule behavior when numpy is not installed surfarray = MissingModule("surfarray", urgent=0) + +if numpy_exists and not isinstance(mixer, MissingModule): + sndarray = lazy_import("sndarray") +else: sndarray = MissingModule("sndarray", urgent=0) -del LazyLoader, find_spec, lazy_import, module_from_spec +del LazyLoader, find_spec, lazy_import, module_from_spec, numpy_exists try: import pygame._debug From f2354320a0d6557d8af1e5b43115dd5376e2894e Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:22:24 -0800 Subject: [PATCH 022/441] Rewrite import checks to rely on try-except --- src_py/__init__.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index 9ede1c893c..b49fa62580 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -322,22 +322,30 @@ def lazy_import(name): return module -numpy_exists = find_spec("numpy") is not None +# Check if numpy is available for surfarray and sndarray modules +numpy_missing = find_spec("numpy") is None -# Preserve MissingModule behavior when numpy is not installed -# and when their pygame module dependencies are unavailable - -if numpy_exists and not isinstance(pixelcopy, MissingModule): - surfarray = lazy_import("surfarray") -else: +try: + if numpy_missing: + # Always fails here. Need the error message for MissingModule.reason + import numpy + # Check that module dependencies are not missing, or get error message + import pygame.pixelcopy +except (ImportError, OSError): surfarray = MissingModule("surfarray", urgent=0) - -if numpy_exists and not isinstance(mixer, MissingModule): - sndarray = lazy_import("sndarray") else: + surfarray = lazy_import("surfarray") + +try: + if numpy_missing: + import numpy + import pygame.mixer +except (ImportError, OSError): sndarray = MissingModule("sndarray", urgent=0) +else: + sndarray = lazy_import("sndarray") -del LazyLoader, find_spec, lazy_import, module_from_spec, numpy_exists +del LazyLoader, find_spec, lazy_import, module_from_spec, numpy_missing try: import pygame._debug From a71dfb5a1d51a772f2088aaf25f7d74f39e0be26 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:44:07 -0800 Subject: [PATCH 023/441] Ignore a few pylint warnings --- src_py/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index b49fa62580..ae30190cc1 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -328,9 +328,9 @@ def lazy_import(name): try: if numpy_missing: # Always fails here. Need the error message for MissingModule.reason - import numpy + import numpy # pylint: disable=ungrouped-imports # Check that module dependencies are not missing, or get error message - import pygame.pixelcopy + import pygame.pixelcopy # pylint: disable=ungrouped-imports except (ImportError, OSError): surfarray = MissingModule("surfarray", urgent=0) else: @@ -338,8 +338,10 @@ def lazy_import(name): try: if numpy_missing: - import numpy - import pygame.mixer + # Always fails here. Need the error message for MissingModule.reason + import numpy # pylint: disable=ungrouped-imports + # Check that module dependencies are not missing, or get error message + import pygame.mixer # pylint: disable=ungrouped-imports except (ImportError, OSError): sndarray = MissingModule("sndarray", urgent=0) else: From 1ff6822b33e0583f6fcf13aa2a5925047fed1898 Mon Sep 17 00:00:00 2001 From: GabrieleLS Date: Wed, 4 Dec 2024 15:23:25 +0100 Subject: [PATCH 024/441] Addition of a function that tests the good initialization of all the attributes of a rect, in rect_tests.py --- test/rect_test.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/rect_test.py b/test/rect_test.py index e916af89d7..2c26e395bd 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -52,6 +52,39 @@ def testCalculatedAttributes(self): self.assertEqual((r.left, r.centery), r.midleft) self.assertEqual((r.right, r.centery), r.midright) + def testAttributes(self): + """Checks that all the attributes are initialized correctly.""" + r = Rect(1, 2, 3, 4) + + self.assertEqual(1, r.left) + self.assertEqual(2, r.top) + self.assertEqual(4, r.right) + self.assertEqual(6, r.bottom) + + self.assertEqual(1, r.x) + self.assertEqual(2, r.y) + + self.assertEqual(3, r.w) + self.assertEqual(4, r.h) + + self.assertEqual((1, 2), r.topleft) + self.assertEqual((4, 2), r.topright) + self.assertEqual((1, 6), r.bottomleft) + self.assertEqual((4, 6), r.bottomright) + + self.assertEqual((3, 4), r.size) + self.assertEqual(3, r.width) + self.assertEqual(4, r.height) + + self.assertEqual(2, r.centerx) + self.assertEqual(4, r.centery) + self.assertEqual((2, 4), r.center) + + self.assertEqual((2, 2), r.midtop) + self.assertEqual((2, 6), r.midbottom) + self.assertEqual((1, 4), r.midleft) + self.assertEqual((4, 4), r.midright) + def testRepr(self): rect = Rect(12, 34, 56, 78) self.assertEqual(repr(rect), "Rect(12, 34, 56, 78)") From f693fd11c7683a064661b5aa519cdeb68c05c377 Mon Sep 17 00:00:00 2001 From: GabrieleLS Date: Wed, 4 Dec 2024 15:35:00 +0100 Subject: [PATCH 025/441] Update rect_test.py --- test/rect_test.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/rect_test.py b/test/rect_test.py index 2c26e395bd..20af675b5f 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -824,13 +824,13 @@ def test_inflate__smaller(self): r = Rect(2, 4, 6, 8) r2 = r.inflate(-4, -6) - self.assertEqual((5, 8), r2.center) - self.assertEqual(4, r2.left) - self.assertEqual(7, r2.top) - self.assertEqual(6, r2.right) - self.assertEqual(9, r2.bottom) - self.assertEqual(2, r2.width) - self.assertEqual(2, r2.height) + self.assertEqual((5, 8), r2.center) + self.assertEqual(4, r2.left) + self.assertEqual(7, r2.top) + self.assertEqual(6, r2.right) + self.assertEqual(9, r2.bottom) + self.assertEqual(2, r2.width) + self.assertEqual(2, r2.height) def test_inflate_ip__larger(self): """Ensures inflating a rect in place keeps its center the same From 85bb84d21df484ec5e886c62068999d9759a21ce Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:50:23 -0800 Subject: [PATCH 026/441] Improve docs clarity about avoiding numpy import --- docs/reST/ref/sndarray.rst | 2 +- docs/reST/ref/surfarray.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/sndarray.rst b/docs/reST/ref/sndarray.rst index 733b49de1d..4fe3a11909 100644 --- a/docs/reST/ref/sndarray.rst +++ b/docs/reST/ref/sndarray.rst @@ -23,7 +23,7 @@ Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. -.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid loading NumPy needlessly +.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array diff --git a/docs/reST/ref/surfarray.rst b/docs/reST/ref/surfarray.rst index 8df7ef88b3..a9370f24a3 100644 --- a/docs/reST/ref/surfarray.rst +++ b/docs/reST/ref/surfarray.rst @@ -35,7 +35,7 @@ pixels from the surface and any changes performed to the array will make changes in the surface. As this last functions share memory with the surface, this one will be locked during the lifetime of the array. -.. versionchanged:: 2.5.3 surfarray module is lazily loaded to avoid loading NumPy needlessly +.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array2d From 41d4b7661c68087eafacc54550cc65524fb51a20 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 12:11:52 +0000 Subject: [PATCH 027/441] Handle FRect --- test/rect_test.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/test/rect_test.py b/test/rect_test.py index 20af675b5f..7035e7551d 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -76,14 +76,25 @@ def testAttributes(self): self.assertEqual(3, r.width) self.assertEqual(4, r.height) - self.assertEqual(2, r.centerx) - self.assertEqual(4, r.centery) - self.assertEqual((2, 4), r.center) - - self.assertEqual((2, 2), r.midtop) - self.assertEqual((2, 6), r.midbottom) - self.assertEqual((1, 4), r.midleft) - self.assertEqual((4, 4), r.midright) + if isinstance(r, FRect): + self.assertEqual(2.5, r.centerx) + self.assertEqual(4, r.centery) + self.assertEqual((2.5, 4), r.center) + + self.assertEqual((2.5, 2), r.midtop) + self.assertEqual((2.5, 6), r.midbottom) + self.assertEqual((1, 4), r.midleft) + self.assertEqual((4, 4), r.midright) + + elif isinstance(r, Rect): + self.assertEqual(2, r.centerx) + self.assertEqual(4, r.centery) + self.assertEqual((2, 4), r.center) + + self.assertEqual((2, 2), r.midtop) + self.assertEqual((2, 6), r.midbottom) + self.assertEqual((1, 4), r.midleft) + self.assertEqual((4, 4), r.midright) def testRepr(self): rect = Rect(12, 34, 56, 78) From 19cb1a135cc0e3af65f72ada747073b9a7975dd5 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 12:17:09 +0000 Subject: [PATCH 028/441] fix formatting --- test/rect_test.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/rect_test.py b/test/rect_test.py index 7035e7551d..fb8c6e626c 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -851,12 +851,12 @@ def test_inflate_ip__larger(self): r2.inflate_ip(4, 6) self.assertEqual(r2.center, (5, 8)) - self.assertEqual(r2.left, 0) - self.assertEqual(r2.top, 1) - self.assertEqual(r2.right, 10) - self.assertEqual(r2.bottom, 15) - self.assertEqual(r2.width, 10) - self.assertEqual(r2.height, 14) + self.assertEqual(r2.left, 0) + self.assertEqual(r2.top, 1) + self.assertEqual(r2.right, 10) + self.assertEqual(r2.bottom, 15) + self.assertEqual(r2.width, 10) + self.assertEqual(r2.height, 14) def test_inflate_ip__smaller(self): """Ensures deflating a rect in place keeps its center the same From 8a8b7afd3be52ec864c9c7b9760456d52b5bc8f4 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 14:48:26 +0000 Subject: [PATCH 029/441] rename 'crashed' dictionary of collided_sprites --- src_py/sprite.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index 8f14671b4e..1e6f92add7 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1719,18 +1719,18 @@ def groupcollide(groupa, groupb, dokilla, dokillb, collided=None): that will be used to calculate the collision. """ - crashed = {} + collided_sprites = {} # pull the collision function in as a local variable outside # the loop as this makes the loop run faster sprite_collide_func = spritecollide for group_a_sprite in groupa: collisions = sprite_collide_func(group_a_sprite, groupb, dokillb, collided) if collisions: - crashed[group_a_sprite] = collisions + collided_sprites[group_a_sprite] = collisions if dokilla: - for group_a_sprite in crashed: + for group_a_sprite in collided_sprites: group_a_sprite.kill() - return crashed + return collided_sprites def spritecollideany(sprite, group, collided=None): From acfa0735bf340eae0f678b70ad766512773dc4ec Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 14:50:50 +0000 Subject: [PATCH 030/441] rename 'crashed' to 'collided_sprites' --- src_py/sprite.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index 1e6f92add7..3e08169555 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1685,12 +1685,12 @@ def spritecollide(sprite, group, dokill, collided=None): """ if collided is not None: - crashed = [ + collided_sprites = [ group_sprite for group_sprite in group if collided(sprite, group_sprite) ] else: sprite_rect_collide = sprite.rect.colliderect - crashed = [ + collided_sprites = [ group_sprite for group_sprite in group if sprite_rect_collide(group_sprite.rect) @@ -1698,7 +1698,7 @@ def spritecollide(sprite, group, dokill, collided=None): if dokill: for group_sprite in crashed: group_sprite.kill() - return crashed + return collided_sprites def groupcollide(groupa, groupb, dokilla, dokillb, collided=None): From 8d97ced60accebaa1d86cda78508d74435fac41e Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 14:52:49 +0000 Subject: [PATCH 031/441] rename 'crashed' to 'collided_sprites' --- src_py/sprite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index 3e08169555..be34ee18e0 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -1696,7 +1696,7 @@ def spritecollide(sprite, group, dokill, collided=None): if sprite_rect_collide(group_sprite.rect) ] if dokill: - for group_sprite in crashed: + for group_sprite in collided_sprites: group_sprite.kill() return collided_sprites From 78e30ce0e99bb7bc4ff59c943044aa648310a982 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 17:41:11 +0000 Subject: [PATCH 032/441] Rename to relcenter --- buildconfig/stubs/pygame/rect.pyi | 6 +- docs/reST/ref/rect.rst | 18 ++-- src_c/rect.c | 6 +- test/rect_test.py | 152 +++++++++++++++--------------- 4 files changed, 91 insertions(+), 91 deletions(-) diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index e7efb18958..ee6d554940 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -85,9 +85,9 @@ class _GenericRect(Collection[_N]): @center.setter def center(self, value: Point) -> None: ... @property - def rel_center(self) -> Tuple[_N, _N]: ... - @rel_center.setter - def rel_center(self, value: Point) -> None: ... + def relcenter(self) -> Tuple[_N, _N]: ... + @relcenter.setter + def relcenter(self, value: Point) -> None: ... @property def centerx(self) -> _N: ... @centerx.setter diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index d01bb3ea0f..97d9013d19 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -47,7 +47,7 @@ top, left, bottom, right topleft, bottomleft, topright, bottomright midtop, midleft, midbottom, midright - center, rel_center, centerx, centery + center, relcenter, centerx, centery size, width, height w,h @@ -92,22 +92,22 @@ However, the subclass's ``__init__()`` method is not called, and ``__new__()`` is assumed to take no arguments. So these methods should be overridden if any extra attributes need to be copied. - + .. versionadded:: 2.5.2 - ``rel_center`` added to Rect / FRect. This will return you a ``Point`` of - the center relative to the topleft of the Rect. Setting a ``Point`` to it will - modify the size of the rect to 2 times the ``Point`` used. Below you can find a + ``relcenter`` added to Rect / FRect. This will return you a ``Point`` of + the center relative to the topleft of the Rect. Setting a ``Point`` to it will + modify the size of the rect to 2 times the ``Point`` used. Below you can find a code example of how it should work : .. code-block:: python > my_rect = pygame.Rect(0, 0, 2, 2) - > my_rect.rel_center + > my_rect.relcenter > (1, 1) - > my_rect.rel_center = (128, 128) - > my_rect.rel_center, my_rect.size + > my_rect.relcenter = (128, 128) + > my_rect.relcenter, my_rect.size > ((128, 128), (256, 256)) - + Beware of non integer relative centers ! Using a Rect instead of FRect will round down the values of the returned ``Point``. diff --git a/src_c/rect.c b/src_c/rect.c index 29fe347e2c..751bbe3145 100644 --- a/src_c/rect.c +++ b/src_c/rect.c @@ -688,8 +688,8 @@ static PyGetSetDef pg_frect_getsets[] = { {"size", (getter)pg_frect_getsize, (setter)pg_frect_setsize, NULL, NULL}, {"center", (getter)pg_frect_getcenter, (setter)pg_frect_setcenter, NULL, NULL}, - {"rel_center", (getter)pg_frect_getrelcenter, - (setter)pg_frect_setrelcenter, NULL, NULL}, + {"relcenter", (getter)pg_frect_getrelcenter, (setter)pg_frect_setrelcenter, + NULL, NULL}, {"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL, NULL}, @@ -732,7 +732,7 @@ static PyGetSetDef pg_rect_getsets[] = { {"size", (getter)pg_rect_getsize, (setter)pg_rect_setsize, NULL, NULL}, {"center", (getter)pg_rect_getcenter, (setter)pg_rect_setcenter, NULL, NULL}, - {"rel_center", (getter)pg_rect_getrelcenter, (setter)pg_rect_setrelcenter, + {"relcenter", (getter)pg_rect_getrelcenter, (setter)pg_rect_setrelcenter, NULL, NULL}, {"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL, diff --git a/test/rect_test.py b/test/rect_test.py index d3dd0f8124..0e183dd084 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -512,34 +512,34 @@ def test_center__del(self): with self.assertRaises(AttributeError): del r.center - def test_rel_center(self): - """Changing the rel_center attribute changes the rect's size and + def test_relcenter(self): + """Changing the relcenter attribute changes the rect's size and does not move the rect. """ r = Rect(1, 2, 75, 45) - new_rel_center = (697, 345) + new_relcenter = (697, 345) old_topleft = (r.left, r.top) expected_size = (697 * 2, 345 * 2) - r.rel_center = new_rel_center - self.assertEqual(new_rel_center, r.rel_center) + r.relcenter = new_relcenter + self.assertEqual(new_relcenter, r.relcenter) self.assertEqual(old_topleft, r.topleft) self.assertEqual(expected_size, r.size) - def test_rel_center__invalid_value(self): - """Ensures the rel_center attribute handles invalid values correctly.""" + def test_relcenter__invalid_value(self): + """Ensures the relcenter attribute handles invalid values correctly.""" r = Rect(0, 0, 1, 1) for value in (None, [], "1", 1, (1,), [1, 2, 3]): with self.assertRaises(TypeError): - r.rel_center = value + r.relcenter = value - def test_rel_center__del(self): + def test_relcenter__del(self): """Ensures the center attribute can't be deleted.""" r = Rect(0, 0, 1, 1) with self.assertRaises(AttributeError): - del r.rel_center + del r.relcenter def test_midleft(self): """Changing the midleft attribute moves the rect and does not change @@ -819,9 +819,9 @@ def test_inflate__smaller(self): and shrinks dimensions by correct values.""" r = Rect(2, 4, 6, 8) r2 = r.inflate(-4, -6) - expected_new_rel_center = r.w // 2 - 2, r.h // 2 - 3 + expected_new_relcenter = r.w // 2 - 2, r.h // 2 - 3 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 3, r2.top) @@ -851,9 +851,9 @@ def test_inflate_ip__smaller(self): r = Rect(2, 4, 6, 8) r2 = Rect(r) r2.inflate_ip(-4, -6) - expected_new_rel_center = r.w // 2 - 2, r.h // 2 - 3 + expected_new_relcenter = r.w // 2 - 2, r.h // 2 - 3 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 3, r2.top) @@ -866,9 +866,9 @@ def test_scale_by__larger_single_argument(self): """The scale method scales around the center of the rectangle""" r = Rect(2, 4, 6, 8) r2 = r.scale_by(2) - expected_new_rel_center = r.size + expected_new_relcenter = r.size - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -882,9 +882,9 @@ def test_scale_by__larger_single_argument_kwarg(self): keyword arguments 'x' and 'y'""" r = Rect(2, 4, 6, 8) r2 = r.scale_by(x=2) - expected_new_rel_center = r.size + expected_new_relcenter = r.size - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -897,9 +897,9 @@ def test_scale_by__smaller_single_argument(self): """The scale method scales around the center of the rectangle""" r = Rect(2, 4, 8, 8) r2 = r.scale_by(0.5) - expected_new_rel_center = r.w // 4, r.h // 4 + expected_new_relcenter = r.w // 4, r.h // 4 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 2, r2.top) @@ -915,9 +915,9 @@ def test_scale_by__larger(self): # act r2 = r.scale_by(2, 4) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -938,9 +938,9 @@ def test_scale_by__larger_kwargs_scale_by(self): r3 = r.scale_by((2, 4)) self.assertEqual(r2, r3) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -959,9 +959,9 @@ def test_scale_by__larger_kwargs(self): # act r2 = r.scale_by(x=2, y=4) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -977,9 +977,9 @@ def test_scale_by__smaller(self): # act r2 = r.scale_by(0.5, 0.25) # assert - expected_new_rel_center = r.w // 4, r.h // 8 + expected_new_relcenter = r.w // 4, r.h // 8 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.centery - r.h / 4 / 2, r2.top) @@ -997,43 +997,43 @@ def test_scale_by__subzero(self): r.scale_by(0.00001) rx1 = r.scale_by(10, 1) - expected_new_rel_center = r.w * 5, r.h // 2 + expected_new_relcenter = r.w * 5, r.h // 2 - self.assertEqual(expected_new_rel_center, rx1.rel_center) + self.assertEqual(expected_new_relcenter, rx1.relcenter) self.assertEqual(r.centerx - r.w * 10 / 2, rx1.x) self.assertEqual(r.y, rx1.y) self.assertEqual(r.w * 10, rx1.w) self.assertEqual(r.h, rx1.h) rx2 = r.scale_by(-10, 1) - expected_new_rel_center = r.w * 5, r.h // 2 + expected_new_relcenter = r.w * 5, r.h // 2 - self.assertEqual(expected_new_rel_center, rx2.rel_center) + self.assertEqual(expected_new_relcenter, rx2.relcenter) self.assertEqual(rx1.x, rx2.x) self.assertEqual(rx1.y, rx2.y) self.assertEqual(rx1.w, rx2.w) self.assertEqual(rx1.h, rx2.h) ry1 = r.scale_by(1, 10) - expected_new_rel_center = r.w // 2, r.h * 5 + expected_new_relcenter = r.w // 2, r.h * 5 - self.assertEqual(expected_new_rel_center, ry1.rel_center) + self.assertEqual(expected_new_relcenter, ry1.relcenter) self.assertEqual(r.x, ry1.x) self.assertEqual(r.centery - r.h * 10 / 2, ry1.y) self.assertEqual(r.w, ry1.w) self.assertEqual(r.h * 10, ry1.h) ry2 = r.scale_by(1, -10) - expected_new_rel_center = r.w // 2, r.h * 5 + expected_new_relcenter = r.w // 2, r.h * 5 - self.assertEqual(expected_new_rel_center, ry2.rel_center) + self.assertEqual(expected_new_relcenter, ry2.relcenter) self.assertEqual(ry1.x, ry2.x) self.assertEqual(ry1.y, ry2.y) self.assertEqual(ry1.w, ry2.w) self.assertEqual(ry1.h, ry2.h) r1 = r.scale_by(10) - expected_new_rel_center = r.w * 5, r.h * 5 + expected_new_relcenter = r.w * 5, r.h * 5 - self.assertEqual(expected_new_rel_center, r1.rel_center) + self.assertEqual(expected_new_relcenter, r1.relcenter) self.assertEqual(r.centerx - r.w * 10 / 2, r1.x) self.assertEqual(r.centery - r.h * 10 / 2, r1.y) self.assertEqual(r.w * 10, r1.w) @@ -1092,9 +1092,9 @@ def test_scale_by_ip__larger(self): r = Rect(2, 4, 6, 8) r2 = Rect(r) r2.scale_by_ip(2) - expected_new_rel_center = r.w, r.h + expected_new_relcenter = r.w, r.h - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.top - 4, r2.top) @@ -1108,9 +1108,9 @@ def test_scale_by_ip__smaller(self): r = Rect(2, 4, 8, 8) r2 = Rect(r) r2.scale_by_ip(0.5) - expected_new_rel_center = r.w // 4, r.h // 4 + expected_new_relcenter = r.w // 4, r.h // 4 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left + 2, r2.left) self.assertEqual(r.top + 2, r2.top) @@ -1134,9 +1134,9 @@ def test_scale_by_ip__kwargs(self): r2.scale_by_ip(x=2, y=4) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertEqual(expected_new_rel_center, r2.rel_center) + self.assertEqual(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertEqual(r.left - 3, r2.left) self.assertEqual(r.centery - r.h * 4 / 2, r2.top) @@ -3076,9 +3076,9 @@ def testCalculatedAttributes(self): midx = r.left + r.width / 2 midy = r.top + r.height / 2 - expected_new_rel_center = r.w / 2, r.h / 2 + expected_new_relcenter = r.w / 2, r.h / 2 - self.assertEqual(expected_new_rel_center, r.rel_center) + self.assertEqual(expected_new_relcenter, r.relcenter) self.assertEqual(midx, r.centerx) self.assertEqual(midy, r.centery) self.assertEqual((r.centerx, r.centery), r.center) @@ -3106,9 +3106,9 @@ def test_scale_by__larger_single_argument(self): """The scale method scales around the center of the rectangle""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(2.3) - expected_new_rel_center = r.w * 1.15, r.h * 1.15 + expected_new_relcenter = r.w * 1.15, r.h * 1.15 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3123,9 +3123,9 @@ def test_scale_by__larger_single_argument_kwarg(self): keyword arguments 'x' and 'y'""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(x=2.3) - expected_new_rel_center = r.w * 1.15, r.h * 1.15 + expected_new_relcenter = r.w * 1.15, r.h * 1.15 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3139,9 +3139,9 @@ def test_scale_by__smaller_single_argument(self): """The scale method scales around the center of the rectangle""" r = FRect(2.1, 4, 6, 8.9) r2 = r.scale_by(0.5) - expected_new_rel_center = r.w * 0.25, r.h * 0.25 + expected_new_relcenter = r.w * 0.25, r.h * 0.25 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.top + 2.225, r2.top) @@ -3157,9 +3157,9 @@ def test_scale_by__larger(self): # act r2 = r.scale_by(2, 4) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3180,9 +3180,9 @@ def test_scale_by__larger_kwargs_scale_by(self): r3 = r.scale_by((2, 4)) self.assertEqual(r2, r3) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3201,9 +3201,9 @@ def test_scale_by__larger_kwargs(self): # act r2 = r.scale_by(x=2, y=4) # assert - expected_new_rel_center = r.w, r.h * 2 + expected_new_relcenter = r.w, r.h * 2 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) @@ -3219,9 +3219,9 @@ def test_scale_by__smaller(self): # act r2 = r.scale_by(0.5, 0.25) # assert - expected_new_rel_center = r.w * 0.25, r.h * 0.125 + expected_new_relcenter = r.w * 0.25, r.h * 0.125 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.centery - r.h / 4 / 2, r2.top) @@ -3239,45 +3239,45 @@ def test_scale_by__subzero(self): r.scale_by(0.00001) rx1 = r.scale_by(10, 1) - expected_new_rel_center = r.w * 5, r.h * 0.5 + expected_new_relcenter = r.w * 5, r.h * 0.5 - self.assertSeqAlmostEqual5(expected_new_rel_center, rx1.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, rx1.relcenter) self.assertAlmostEqual5(r.centerx - r.w * 10 / 2, rx1.x) self.assertAlmostEqual5(r.y, rx1.y) self.assertAlmostEqual5(r.w * 10, rx1.w) self.assertAlmostEqual5(r.h, rx1.h) rx2 = r.scale_by(-10, 1) - expected_new_rel_center = r.w * 5, r.h * 0.5 + expected_new_relcenter = r.w * 5, r.h * 0.5 - self.assertSeqAlmostEqual5(expected_new_rel_center, rx2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, rx2.relcenter) self.assertAlmostEqual5(rx1.x, rx2.x) self.assertAlmostEqual5(rx1.y, rx2.y) self.assertAlmostEqual5(rx1.w, rx2.w) self.assertAlmostEqual5(rx1.h, rx2.h) ry1 = r.scale_by(1, 10) - expected_new_rel_center = r.w * 0.5, r.h * 5 + expected_new_relcenter = r.w * 0.5, r.h * 5 - self.assertSeqAlmostEqual5(expected_new_rel_center, ry1.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, ry1.relcenter) self.assertAlmostEqual5(r.x, ry1.x) self.assertAlmostEqual5(r.centery - r.h * 10 / 2, ry1.y) self.assertAlmostEqual5(r.w, ry1.w) self.assertAlmostEqual5(r.h * 10, ry1.h) ry2 = r.scale_by(1, -10) - expected_new_rel_center = r.w * 0.5, r.h * 5 + expected_new_relcenter = r.w * 0.5, r.h * 5 - self.assertSeqAlmostEqual5(expected_new_rel_center, ry2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, ry2.relcenter) self.assertAlmostEqual5(ry1.x, ry2.x) self.assertAlmostEqual5(ry1.y, ry2.y) self.assertAlmostEqual5(ry1.w, ry2.w) self.assertAlmostEqual5(ry1.h, ry2.h) r1 = r.scale_by(10) - expected_new_rel_center = r.w * 5, r.h * 5 + expected_new_relcenter = r.w * 5, r.h * 5 - self.assertSeqAlmostEqual5(expected_new_rel_center, r1.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r1.relcenter) self.assertAlmostEqual5(r.centerx - r.w * 10 / 2, r1.x) self.assertAlmostEqual5(r.centery - r.h * 10 / 2, r1.y) self.assertAlmostEqual5(r.w * 10, r1.w) @@ -3336,9 +3336,9 @@ def test_scale_by_ip__larger(self): r = FRect(2.1, 4, 6, 8.9) r2 = FRect(r) r2.scale_by_ip(2.3) - expected_new_rel_center = r.w * 1.15, r.h * 1.15 + expected_new_relcenter = r.w * 1.15, r.h * 1.15 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) # ((w * scaling) - w) / 2 -> 3.9 self.assertAlmostEqual5(r.left - 3.9, r2.left) @@ -3353,9 +3353,9 @@ def test_scale_by_ip__smaller(self): r = FRect(2.1, 4, 6, 8.9) r2 = FRect(r) r2.scale_by_ip(0.5) - expected_new_rel_center = r.w * 0.25, r.h * 0.25 + expected_new_relcenter = r.w * 0.25, r.h * 0.25 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertSeqAlmostEqual5(r.center, r2.center) self.assertAlmostEqual5(r.left + 1.5, r2.left) self.assertAlmostEqual5(r.top + 2.225, r2.top) @@ -3379,9 +3379,9 @@ def test_scale_by_ip__kwargs(self): r2.scale_by_ip(x=2, y=4) # assert - expected_new_rel_center = r.w, r.h * 2.0 + expected_new_relcenter = r.w, r.h * 2.0 - self.assertSeqAlmostEqual5(expected_new_rel_center, r2.rel_center) + self.assertSeqAlmostEqual5(expected_new_relcenter, r2.relcenter) self.assertEqual(r.center, r2.center) self.assertAlmostEqual5(r.left - 3, r2.left) self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top) From 8b7087691c1489b9d0427f61fa23373de5d84db1 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 31 Dec 2024 18:20:41 +0000 Subject: [PATCH 033/441] Add tuple import --- buildconfig/stubs/pygame/rect.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index ee6d554940..e631a3cdf7 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -7,6 +7,7 @@ from typing import ( Union, overload, Optional, + Tuple, ) from pygame.typing import Point, RectLike, SequenceLike From 0a8a6ed1685c91ae986a35cad424a8f35fb49163 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:30:58 +0100 Subject: [PATCH 034/441] Move window docs to stubs --- buildconfig/stubs/pygame/window.pyi | 460 ++++++++++++++++++++++++-- docs/reST/ext/documenters.py | 4 +- docs/reST/ref/window.rst | 481 +--------------------------- src_c/doc/window_doc.h | 66 ++-- 4 files changed, 462 insertions(+), 549 deletions(-) diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index ac948b4931..cdb57e6c96 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -1,5 +1,5 @@ from typing import Optional, Union -from typing_extensions import deprecated # added in 3.13 +from typing_extensions import deprecated # added in 3.13 from pygame.typing import Point, RectLike from pygame.locals import WINDOWPOS_UNDEFINED @@ -9,69 +9,461 @@ from pygame.surface import Surface def get_grabbed_window() -> Optional[Window]: ... class Window: + """Pygame object that represents a window. + + The Window class (formerly known as _sdl2.video.Window), is a newly + published feature of pygame-ce 2.5.2. This class allows for programs + to drive multiple windows on-screen at once, something not possible with + the :func:`pygame.display.set_mode` API. Not everything possible with + :mod:`pygame.display` is possible yet in the Window API, but the new + window class will continue to be developed, and we're excited to share + the new functionality this class offers. + + :param str title: The title of the window. + :param (int, int) size: The size of the window, in screen coordinates. + :param (int, int) or int position: A tuple specifying the window position, or + ``WINDOWPOS_CENTERED``, or ``WINDOWPOS_UNDEFINED``. + :param bool fullscreen: Create a fullscreen window using the window size as + the resolution (videomode change). + :param bool fullscreen_desktop: Create a fullscreen window using the current + desktop resolution. + :param bool opengl: Create a window with support for an OpenGL context. + :param bool vulkan: Create a window with support for a Vulkan instance. + :param bool hidden: Create a hidden window. + :param bool borderless: Create a window without borders. + :param bool resizable: Create a resizable window. + :param bool minimized: Create a mimized window. + :param bool maximized: Create a maximized window. + :param bool mouse_grabbed: Create a window with grabbed mouse input. + :param bool keyboard_grabbed: Create a window with grabbed keyboard input. + :param bool input_focus: Create a window with input focus. + :param bool mouse_focus: Create a window with mouse focus. + :param bool allow_high_dpi: Create a window in high-DPI mode if supported. + :param bool mouse_capture: Create a window that has the mouse captured + (unrelated to INPUT_GRABBED). + :param bool always_on_top: Create a window that is always presented above + others. + :param bool utility: Create a window that doesn't appear in the task bar. + + Event behavior if one Window is created: When the close button is pressed, + the ``QUIT`` event will be sent to the event queue. + + .. code-block:: python + + import pygame + + window = pygame.Window() + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + raise SystemExit + + Event behavior if multiple ``Window``\ s are created: When the close button is + pressed, a ``WINDOWCLOSE`` event is sent. You need to explicitly destroy + the window. Note that the event ``QUIT`` will only be sent if all + ``Window``\ s have been destroyed. + + .. code-block:: python + + import pygame + + window1 = pygame.Window(position=(0,100)) + window2 = pygame.Window(position=(700,100)) + + while True: + for event in pygame.event.get(): + if event.type == pygame.WINDOWCLOSE: + id = event.window.id + print(f"WINDOWCLOSE event sent to Window #{id}.") + event.window.destroy() + + if event.type == pygame.QUIT: + print(f"Last window is destroyed. QUIT event was sent.") + pygame.quit() + raise SystemExit + + .. versionadded:: 2.4.0 + .. versionchanged:: 2.5.0 when ``opengl`` is ``True``, the ``Window`` has an OpenGL context created by pygame + .. versionchanged:: 2.5.1 Window is now a base class, allowing subclassing + """ + def __init__( self, title: str = "pygame window", size: Point = (640, 480), position: Union[int, Point] = WINDOWPOS_UNDEFINED, - **flags: bool + **flags: bool, ) -> None: ... - def destroy(self) -> None: ... - def set_windowed(self) -> None: ... - def set_fullscreen(self, desktop: bool = False) -> None: ... - def focus(self, input_only: bool = False) -> None: ... - def hide(self) -> None: ... - def show(self) -> None: ... - def restore(self) -> None: ... - def maximize(self) -> None: ... - def minimize(self) -> None: ... - def set_modal_for(self, parent: Window, /) -> None: ... - def set_icon(self, icon: Surface, /) -> None: ... - def get_surface(self) -> Surface: ... - def flip(self) -> None: ... - def flash(self, operation: int, /) -> None: ... grab_mouse: bool + """Get or set the window's mouse grab mode. + + When this attribute is set to ``True``, the window will try to confine the mouse + cursor to itself. + + Note this only set the "mode" of grab. The mouse may be confined to another window + depending on the window focus. To get if the mouse is currently restricted to this + window, please use :attr:`mouse_grabbed`. + + .. seealso:: :attr:`mouse_grabbed` + + .. versionadded:: 2.4.0 + """ + grab_keyboard: bool + """Get or set the window's keyboard grab mode. + + When this attribute is set to ``True``, the window will try to capture system + keyboard shortcuts like ``Alt+Tab`` or the ``Meta/Super`` key. + + This attribute only set the "mode" of grab. The keyboard may be captured by + another window depending on the window focus. To get if keyboard is currently + captured by this window, please use :attr:`keyboard_grabbed`. + + Note that not all system keyboard shortcuts can be captured by applications + (one example is ``Ctrl+Alt+Del`` on Windows). + + When keyboard grab is enabled, pygame will continue to handle ``Alt+Tab`` when + the window is full-screen to ensure the user is not trapped in your application. + If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress + this behavior with an environment variable, e.g. + ``os.environ["SDL_ALLOW_ALT_TAB_WHILE_GRABBED"] = "0"``. + + This attribute requires SDL 2.0.16+. + + .. seealso:: :attr:`keyboard_grabbed` + + .. versionadded:: 2.4.0 + """ + + @property + def mouse_grabbed(self) -> bool: + """Get if the mouse cursor is confined to the window (**read-only**). + + Get if the mouse cursor is currently grabbed and confined to the window. + + Roughly equivalent to this expression: + + :: + + win.grab_mouse and (win is get_grabbed_window()) + + .. seealso:: :attr:`grab_mouse` + + .. versionadded:: 2.4.0 + """ + + @property + def keyboard_grabbed(self) -> bool: + """Get if the keyboard shortcuts are captured by the window (**read-only**). + + Get if the keyboard shortcuts are currently grabbed and captured by the window. + + Roughly equivalent to this expression: + + :: + + win.grab_keyboard and (win is get_grabbed_window()) + + This attribute requires SDL 2.0.16+. + + .. seealso:: :attr:`grab_keyboard` + + .. versionadded:: 2.4.0 + """ + + @property + def focused(self) -> bool: + """Get if the window is focused (**read-only**). + + Get if the window is currently focused. The same result can be achieved using + the ``WINDOWFOCUSGAINED`` and ``WINDOWFOCUSLOST`` events. + + Use :meth:`focus` to focus and raise the window. + + .. versionadded:: 2.5.2 + """ title: str + """Get or set the window title. + + An empty string means that no title is set. + """ + resizable: bool + """Get or set whether the window is resizable.""" + borderless: bool + """Gets or sets whether the window is borderless. + + .. note:: You can't change the border state of a fullscreen window. + """ + always_on_top: bool - relative_mouse: bool - opacity: float + """Get or set whether the window is always on top. + + Setting the always-on-top mode requires SDL 2.0.16+. + + .. versionadded:: 2.3.1 + """ @property - def mouse_grabbed(self) -> bool: ... - @property - def keyboard_grabbed(self) -> bool: ... - @property - def focused(self) -> bool: ... - @property - def id(self) -> int: ... + def id(self) -> int: + """Get the unique window ID (**read-only**).""" + @property - def mouse_rect(self) -> Optional[Rect]: ... + def mouse_rect(self) -> Optional[Rect]: + """Get or set the mouse confinement rectangle of the window. + + Setting this attribute to a rect-like object confines the + cursor to the specified area of this window. + + This attribute can be None, meaning that there is no mouse rect. + + Note that this does NOT grab the cursor, it only defines the area a + cursor is restricted to when the window has mouse focus. + + .. versionadded:: 2.4.0 + """ + @mouse_rect.setter def mouse_rect(self, value: Optional[RectLike]) -> None: ... @property - def size(self) -> tuple[int, int]: ... + def size(self) -> tuple[int, int]: + """Get or set the window size in pixels.""" + @size.setter def size(self, value: Point) -> None: ... @property - def minimum_size(self) -> tuple[int, int]: ... + def minimum_size(self) -> tuple[int, int]: + """Get or set the minimum size of the window's client area. + + Initial value in most cases is ``(0, 0)``. If :func:`from_display_module` + was used to create the window and :func:`pygame.display.set_mode` was + called with the ``SCALED`` flag, the initial value is the size used in + that call. + + Raises a ``ValueError`` if negative values are provided or + if the width or height provided are greater than set + maximum width or height respectively. Unless maximum size + is ``(0, 0)`` (initial value). + + .. seealso:: :attr:`maximum_size`. + + .. versionadded:: 2.4.0 + """ + @minimum_size.setter def minimum_size(self, value: Point) -> None: ... @property - def maximum_size(self) -> tuple[int, int]: ... + def maximum_size(self) -> tuple[int, int]: + """Get or set the maximum size of the window's client area. + + Initial value is ``(0, 0)``. + + Raises a ``ValueError`` if negative values are provided or + if the width or height provided are less than set minimum + width or height respectively. + + .. seealso:: :attr:`minimum_size`. + + .. versionadded:: 2.4.0 + """ + @maximum_size.setter def maximum_size(self, value: Point) -> None: ... @property - def position(self) -> tuple[int, int]: ... + def position(self) -> tuple[int, int]: + """Get or set the window position in screen coordinates.""" + @position.setter def position(self, value: Union[int, Point]) -> None: ... + opacity: float + """Get or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque).""" + @property - def opengl(self) -> bool: ... + def opengl(self) -> bool: + """Get if the window supports OpenGL. + + ``True`` if the ``Window`` has an OpenGL context associated with it, ``False`` otherwise + + .. versionadded:: 2.5.0 + """ + @property - def utility(self) -> bool: ... + def utility(self) -> bool: + """Get if the window is an utility window (**read-only**). + + ``True`` if the window doesn't appear in the task bar, ``False`` otherwise. + This only works for X11 and Windows, for other platforms, creating ``Window(utility=True)`` won't change anything. + + .. versionadded:: 2.5.3 + """ + @classmethod - @deprecated("since 2.4.0. Use either the display module or the Window class with get_surface and flip. Try not to mix display and Window") - def from_display_module(cls) -> Window: ... + @deprecated( + "since 2.4.0. Use either the display module or the Window class with get_surface and flip. Try not to mix display and Window" + ) + def from_display_module(cls) -> Window: + """Create a Window object using window data from display module. + + **DON'T USE THIS!** If you want to draw to a surface and use the window + API, use :func:`Window.get_surface` and :func:`Window.flip`. + + Create a Window object that uses the same window data from the :mod:`pygame.display` module, created upon calling + :func:`pygame.display.set_mode`. + + .. deprecated:: 2.4.0 + """ + + def get_surface(self) -> Surface: + """Get the window surface. + + Returns a "display surface" for this Window. The surface returned is + analogous to the surface returned by :func:`pygame.display.set_mode`. + + This method allows software rendering (classic pygame rendering) on top + of the Window API. This method should not be called when using hardware + rendering (coming soon). + + Similarly to the "display surface" returned by :mod:`pygame.display`, + this surface will change size with the Window, and will become invalid + after the Window's destruction. + + .. seealso:: :func:`flip` + + .. versionadded:: 2.4.0 + """ + + def flip(self) -> None: + """Update the display surface to the window. + + Update pixel data from memory to be displayed in the window. This is the Window + class equivalent of :func:`pygame.display.flip`. + + With ``get_surface()`` this method allows software rendering (classic pygame rendering) flipping pixel data + from an associated surface in memory to be displayed in the window. Alternatively, when this window has an + associated OpenGL context, this method will instead perform a GL buffer swap to the window. + + Here is a runnable example of using ``get_surface`` and ``flip``: + + .. code-block:: python + + import pygame + + win = pygame.Window() + surf = win.get_surface() # get the window surface + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + raise SystemExit + + # draw something on the surface + surf.fill("red") + + win.flip() # update the surface to the window + + + .. versionadded:: 2.4.0 + """ + + def set_windowed(self) -> None: + """Enable windowed mode (exit fullscreen). + + .. seealso:: :func:`set_fullscreen` + """ + + def set_fullscreen(self, desktop: bool = False) -> None: + """Enter fullscreen. + + :param bool desktop: If ``True``, use the current desktop resolution. + If ``False``, change the fullscreen resolution to the window size. + + .. seealso:: :meth:`set_windowed`. + """ + + def destroy(self) -> None: + """Destroy the window. + + Destroys the internal window data of this Window object. This method is + called automatically when this Window object is garbage collected, so + there usually aren't any reasons to call it manually. + + Other methods that try to manipulate that window data will raise an error. + """ + + def hide(self) -> None: + """Hide the window.""" + + def show(self) -> None: + """Show the window.""" + + def focus(self, input_only: bool = False) -> None: + """Set the window to be focused. + + Raises the window above other windows and sets the input focus. + + :param input_only: if ``True``, the window will be given input focus + but may be completely obscured by other windows. + Only supported on X11. This has been deprecated and + may be removed in a future version. + + .. deprecated:: 2.5.3 ``input_only`` argument + """ + + def restore(self) -> None: + """Restore the size and position of a minimized or maximized window.""" + + def maximize(self) -> None: + """Maximize the window.""" + + def minimize(self) -> None: + """Minimize the window.""" + + def set_icon(self, icon: Surface, /) -> None: + """Set the window icon. + + :param Surface surface: A Surface to use as the icon. + """ + + def set_modal_for(self, parent: Window, /) -> None: + """Set the window as a modal for a parent window. + + :param Window parent: The parent window. + + .. note:: This function is only supported on X11. + """ + + def flash(self, operation: int, /) -> None: + """Flash a window to demand attention from the user. + + :param int operation: The flash operation. + + Supported flash operations are: + * ``pygame.FLASH_CANCEL``: Cancel the current flash state if present + * ``pygame.FLASH_BRIEFLY``: Flash for a short amount of time to get attention + * ``pygame.FLASH_UNTIL_FOCUSED``: Keep flashing until the window is focused + + Window flashing requires SDL 2.0.16+. A :mod:`pygame.error` exception will be raised + otherwise. + + .. note:: This function is only supported on Windows, X11, Wayland and Cocoa (MacOS). + A :mod:`pygame.error` exception will be raised if it's not supported therefore it's + advised to wrap it in a try block. + + .. code-block:: python + + import pygame + window = pygame.Window() + + try: + window.flash(pygame.FLASH_BRIEFLY) + except pygame.error: + print("Window flashing not supported") + + .. versionadded:: 2.5.2 + """ + relative_mouse: bool diff --git a/docs/reST/ext/documenters.py b/docs/reST/ext/documenters.py index 0775a1f843..697127234f 100644 --- a/docs/reST/ext/documenters.py +++ b/docs/reST/ext/documenters.py @@ -81,9 +81,7 @@ def get_object_members(self, want_all): members = ( member for member in members - if not member.object.obj.get("hide", False) - and not member.object.imported - and get_doc(self.env, member.object) != "" + if not member.object.imported and get_doc(self.env, member.object) != "" ) return members_check_module, members diff --git a/docs/reST/ref/window.rst b/docs/reST/ref/window.rst index b460047bd7..7d751ff871 100644 --- a/docs/reST/ref/window.rst +++ b/docs/reST/ref/window.rst @@ -5,482 +5,5 @@ .. currentmodule:: pygame -.. class:: Window - - | :sl:`pygame object that represents a window` - | :sg:`Window(title='pygame window', size=(640, 480), position=None, fullscreen=False, fullscreen_desktop=False, **kwargs) -> Window` - - The Window class (formerly known as _sdl2.video.Window), is a newly - published feature of pygame-ce 2.5.2. This class allows for programs - to drive multiple windows on-screen at once, something not possible with - the :func:`pygame.display.set_mode` API. Not everything possible with - :mod:`pygame.display` is possible yet in the Window API, but the new - window class will continue to be developed, and we're excited to share - the new functionality this class offers. - - :param str title: The title of the window. - :param (int, int) size: The size of the window, in screen coordinates. - :param (int, int) or int position: A tuple specifying the window position, or - ``WINDOWPOS_CENTERED``, or ``WINDOWPOS_UNDEFINED``. - :param bool fullscreen: Create a fullscreen window using the window size as - the resolution (videomode change). - :param bool fullscreen_desktop: Create a fullscreen window using the current - desktop resolution. - :param bool opengl: Create a window with support for an OpenGL context. - :param bool vulkan: Create a window with support for a Vulkan instance. - :param bool hidden: Create a hidden window. - :param bool borderless: Create a window without borders. - :param bool resizable: Create a resizable window. - :param bool minimized: Create a mimized window. - :param bool maximized: Create a maximized window. - :param bool mouse_grabbed: Create a window with grabbed mouse input. - :param bool keyboard_grabbed: Create a window with grabbed keyboard input. - :param bool input_focus: Create a window with input focus. - :param bool mouse_focus: Create a window with mouse focus. - :param bool allow_high_dpi: Create a window in high-DPI mode if supported. - :param bool mouse_capture: Create a window that has the mouse captured - (unrelated to INPUT_GRABBED). - :param bool always_on_top: Create a window that is always presented above - others. - :param bool utility: Create a window that doesn't appear in the task bar. - - Event behavior if one Window is created: When the close button is pressed, - the ``QUIT`` event will be sent to the event queue. - - .. code-block:: python - - import pygame - - window = pygame.Window() - - while True: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - raise SystemExit - - Event behavior if multiple ``Window``\ s are created: When the close button is - pressed, a ``WINDOWCLOSE`` event is sent. You need to explicitly destroy - the window. Note that the event ``QUIT`` will only be sent if all - ``Window``\ s have been destroyed. - - .. code-block:: python - - import pygame - - window1 = pygame.Window(position=(0,100)) - window2 = pygame.Window(position=(700,100)) - - while True: - for event in pygame.event.get(): - if event.type == pygame.WINDOWCLOSE: - id = event.window.id - print(f"WINDOWCLOSE event sent to Window #{id}.") - event.window.destroy() - - if event.type == pygame.QUIT: - print(f"Last window is destroyed. QUIT event was sent.") - pygame.quit() - raise SystemExit - - .. versionadded:: 2.4.0 - .. versionchanged:: 2.5.0 when ``opengl`` is ``True``, the ``Window`` has an OpenGL context created by pygame - .. versionchanged:: 2.5.1 Window is now a base class, allowing subclassing - - - .. attribute:: grab_mouse - - | :sl:`Get or set the window's mouse grab mode` - | :sg:`grab_mouse -> bool` - - When this attribute is set to ``True``, the window will try to confine the mouse - cursor to itself. - - Note this only set the "mode" of grab. The mouse may be confined to another window - depending on the window focus. To get if the mouse is currently restricted to this - window, please use :attr:`mouse_grabbed`. - - .. seealso:: :attr:`mouse_grabbed` - - .. versionadded:: 2.4.0 - - .. attribute:: grab_keyboard - - | :sl:`Get or set the window's keyboard grab mode` - | :sg:`grab_keyboard -> bool` - - When this attribute is set to ``True``, the window will try to capture system - keyboard shortcuts like ``Alt+Tab`` or the ``Meta/Super`` key. - - This attribute only set the "mode" of grab. The keyboard may be captured by - another window depending on the window focus. To get if keyboard is currently - captured by this window, please use :attr:`keyboard_grabbed`. - - Note that not all system keyboard shortcuts can be captured by applications - (one example is ``Ctrl+Alt+Del`` on Windows). - - When keyboard grab is enabled, pygame will continue to handle ``Alt+Tab`` when - the window is full-screen to ensure the user is not trapped in your application. - If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress - this behavior with an environment variable, e.g. - ``os.environ["SDL_ALLOW_ALT_TAB_WHILE_GRABBED"] = "0"``. - - This attribute requires SDL 2.0.16+. - - .. seealso:: :attr:`keyboard_grabbed` - - .. versionadded:: 2.4.0 - - .. attribute:: mouse_grabbed - - | :sl:`Get if the mouse cursor is confined to the window (**read-only**)` - | :sg:`mouse_grabbed -> bool` - - Get if the mouse cursor is currently grabbed and confined to the window. - - Roughly equivalent to this expression: - - :: - - win.grab_mouse and (win is get_grabbed_window()) - - .. seealso:: :attr:`grab_mouse` - - .. versionadded:: 2.4.0 - - .. attribute:: keyboard_grabbed - - | :sl:`Get if the keyboard shortcuts are captured by the window (**read-only**)` - | :sg:`keyboard_grabbed -> bool` - - Get if the keyboard shortcuts are currently grabbed and captured by the window. - - Roughly equivalent to this expression: - - :: - - win.grab_keyboard and (win is get_grabbed_window()) - - This attribute requires SDL 2.0.16+. - - .. seealso:: :attr:`grab_keyboard` - - .. versionadded:: 2.4.0 - - .. attribute:: focused - - | :sl:`Get if the window is focused (**read-only**)` - | :sg:`focused -> bool` - - Get if the window is currently focused. The same result can be achieved using - the ``WINDOWFOCUSGAINED`` and ``WINDOWFOCUSLOST`` events. - - Use :meth:`focus` to focus and raise the window. - - .. versionadded:: 2.5.2 - - .. attribute:: title - - | :sl:`Get or set the window title` - | :sg:`title -> str` - - Gets or sets the window title. An empty string means that no title is set. - - .. attribute:: resizable - - | :sl:`Get or set whether the window is resizable` - | :sg:`resizable -> bool` - - .. attribute:: borderless - - | :sl:`Get or set whether the window is borderless` - | :sg:`borderless -> bool` - - Gets or sets whether the window is borderless. - - .. note:: You can't change the border state of a fullscreen window. - - .. attribute:: always_on_top - - | :sl:`Get or set whether the window is always on top` - | :sg:`always_on_top -> bool` - - Get or set whether the window is always on top. - - Setting the always-on-top mode requires SDL 2.0.16+. - - .. versionadded:: 2.3.1 - - .. attribute:: id - - | :sl:`Get the unique window ID (**read-only**)` - | :sg:`id -> int` - - .. attribute:: mouse_rect - - | :sl:`Get or set the mouse confinement rectangle of the window` - | :sg:`mouse_rect -> Rect|None` - - Setting this attribute to a rect-like object confines the - cursor to the specified area of this window. - - This attribute can be None, meaning that there is no mouse rect. - - Note that this does NOT grab the cursor, it only defines the area a - cursor is restricted to when the window has mouse focus. - - .. versionadded:: 2.4.0 - - .. attribute:: size - - | :sl:`Get or set the window size in pixels` - | :sg:`size -> (int, int)` - - .. attribute:: minimum_size - - | :sl:`Get or set the minimum size of the window's client area` - | :sg:`minimum_size -> (int, int)` - - Initial value in most cases is ``(0, 0)``. If :func:`from_display_module` - was used to create the window and :func:`pygame.display.set_mode` was - called with the ``SCALED`` flag, the initial value is the size used in - that call. - - Raises a ``ValueError`` if negative values are provided or - if the width or height provided are greater than set - maximum width or height respectively. Unless maximum size - is ``(0, 0)`` (initial value). - - .. seealso:: :attr:`maximum_size`. - - .. versionadded:: 2.4.0 - - .. attribute:: maximum_size - - | :sl:`Get or set the maximum size of the window's client area` - | :sg:`maximum_size -> (int, int)` - - Initial value is ``(0, 0)``. - - Raises a ``ValueError`` if negative values are provided or - if the width or height provided are less than set minimum - width or height respectively. - - .. seealso:: :attr:`minimum_size`. - - .. versionadded:: 2.4.0 - - .. attribute:: position - - | :sl:`Get or set the window position in screen coordinates` - | :sg:`position -> (int, int) or WINDOWPOS_CENTERED or WINDOWPOS_UNDEFINED` - - .. attribute:: opacity - - | :sl:`Get or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque)` - | :sg:`opacity -> float` - - .. attribute:: opengl - - | :sl:`Get if the window supports OpenGL` - | :sg:`opengl -> bool` - - ``True`` if the ``Window`` has an OpenGL context associated with it, ``False`` otherwise - - .. versionadded:: 2.5.0 - - .. attribute:: utility - - | :sl:`Get if the window is an utility window (**read-only**)` - | :sg:`utility -> bool` - - ``True`` if the window doesn't appear in the task bar, ``False`` otherwise. - This only works for X11 and Windows, for other platforms, creating ``Window(utility=True)`` won't change anything. - - .. versionadded:: 2.5.3 - - .. classmethod:: from_display_module - - | :sl:`Create a Window object using window data from display module` - | :sg:`from_display_module() -> Window` - - **DON'T USE THIS!** If you want to draw to a surface and use the window - API, use :func:`Window.get_surface` and :func:`Window.flip`. - - Create a Window object that uses the same window data from the :mod:`pygame.display` module, created upon calling - :func:`pygame.display.set_mode`. - - .. deprecated:: 2.4.0 - - .. method:: get_surface - - | :sl:`Get the window surface` - | :sg:`get_surface() -> Surface` - - Returns a "display surface" for this Window. The surface returned is - analogous to the surface returned by :func:`pygame.display.set_mode`. - - This method allows software rendering (classic pygame rendering) on top - of the Window API. This method should not be called when using hardware - rendering (coming soon). - - Similarly to the "display surface" returned by :mod:`pygame.display`, - this surface will change size with the Window, and will become invalid - after the Window's destruction. - - .. seealso:: :func:`flip` - - .. versionadded:: 2.4.0 - - .. method:: flip - - | :sl:`Update the display surface to the window.` - | :sg:`flip() -> None` - - Update pixel data from memory to be displayed in the window. This is the Window - class equivalent of :func:`pygame.display.flip`. - - With ``get_surface()`` this method allows software rendering (classic pygame rendering) flipping pixel data - from an associated surface in memory to be displayed in the window. Alternatively, when this window has an - associated OpenGL context, this method will instead perform a GL buffer swap to the window. - - Here is a runnable example of using ``get_surface`` and ``flip``: - - .. code-block:: python - - import pygame - - win = pygame.Window() - surf = win.get_surface() # get the window surface - - while True: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - raise SystemExit - - # draw something on the surface - surf.fill("red") - - win.flip() # update the surface to the window - - - .. versionadded:: 2.4.0 - - .. method:: set_windowed - - | :sl:`Enable windowed mode (exit fullscreen)` - | :sg:`set_windowed() -> None` - - .. seealso:: :func:`set_fullscreen` - - .. method:: set_fullscreen - - | :sl:`Enter fullscreen` - | :sg:`set_fullscreen(desktop=False) -> None` - - :param bool desktop: If ``True``, use the current desktop resolution. - If ``False``, change the fullscreen resolution to the window size. - - .. seealso:: :meth:`set_windowed`. - - .. method:: destroy - - | :sl:`Destroy the window` - | :sg:`destroy() -> None` - - Destroys the internal window data of this Window object. This method is - called automatically when this Window object is garbage collected, so - there usually aren't any reasons to call it manually. - - Other methods that try to manipulate that window data will raise an error. - - .. method:: hide - - | :sl:`Hide the window` - | :sg:`hide() -> None` - - .. method:: show - - | :sl:`Show the window` - | :sg:`show() -> None` - - .. method:: focus - - | :sl:`Set the window to be focused` - | :sg:`focus(input_only=False) -> None` - - Raises the window above other windows and sets the input focus. - - :param bool input_only: if ``True``, the window will be given input focus - but may be completely obscured by other windows. - Only supported on X11. This has been deprecated and - may be removed in a future version. - - .. deprecated:: 2.5.3 ``input_only`` argument - - .. method:: restore - - | :sl:`Restore the size and position of a minimized or maximized window` - | :sg:`restore() -> None` - - .. method:: maximize - - | :sl:`Maximize the window` - | :sg:`maximize() -> None` - - .. method:: minimize - - | :sl:`Minimize the window` - | :sg:`maximize() -> None` - - .. method:: set_icon - - | :sl:`Set the window icon` - | :sg:`set_icon(surface, /) -> None` - - Sets the window icon. - - :param Surface surface: A Surface to use as the icon. - - .. method:: set_modal_for - - | :sl:`Set the window as a modal for a parent window` - | :sg:`set_modal_for(parent, /) -> None` - - :param Window parent: The parent window. - - .. note:: This function is only supported on X11. - - .. method:: flash - - | :sl:`Flash a window to demand attention from the user` - | :sg:`flash(operation, /) -> None` - - :param int operation: The flash operation. - - Supported flash operations are: - * ``pygame.FLASH_CANCEL``: Cancel the current flash state if present - * ``pygame.FLASH_BRIEFLY``: Flash for a short amount of time to get attention - * ``pygame.FLASH_UNTIL_FOCUSED``: Keep flashing until the window is focused - - Window flashing requires SDL 2.0.16+. A :mod:`pygame.error` exception will be raised - otherwise. - - .. note:: This function is only supported on Windows, X11, Wayland and Cocoa (MacOS). - A :mod:`pygame.error` exception will be raised if it's not supported therefore it's - advised to wrap it in a try block. - - .. code-block:: python - - import pygame - window = pygame.Window() - - try: - window.flash(pygame.FLASH_BRIEFLY) - except pygame.error: - print("Window flashing not supported") - - .. versionadded:: 2.5.2 - - .. ## pygame.Window ## +.. autopgclass:: pygame.Window + :members: diff --git a/src_c/doc/window_doc.h b/src_c/doc/window_doc.h index 8a1063a54b..654248adc2 100644 --- a/src_c/doc/window_doc.h +++ b/src_c/doc/window_doc.h @@ -1,35 +1,35 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_WINDOW "Window(title='pygame window', size=(640, 480), position=None, fullscreen=False, fullscreen_desktop=False, **kwargs) -> Window\npygame object that represents a window" -#define DOC_WINDOW_GRABMOUSE "grab_mouse -> bool\nGet or set the window's mouse grab mode" -#define DOC_WINDOW_GRABKEYBOARD "grab_keyboard -> bool\nGet or set the window's keyboard grab mode" -#define DOC_WINDOW_MOUSEGRABBED "mouse_grabbed -> bool\nGet if the mouse cursor is confined to the window (**read-only**)" -#define DOC_WINDOW_KEYBOARDGRABBED "keyboard_grabbed -> bool\nGet if the keyboard shortcuts are captured by the window (**read-only**)" -#define DOC_WINDOW_FOCUSED "focused -> bool\nGet if the window is focused (**read-only**)" -#define DOC_WINDOW_TITLE "title -> str\nGet or set the window title" -#define DOC_WINDOW_RESIZABLE "resizable -> bool\nGet or set whether the window is resizable" -#define DOC_WINDOW_BORDERLESS "borderless -> bool\nGet or set whether the window is borderless" -#define DOC_WINDOW_ALWAYSONTOP "always_on_top -> bool\nGet or set whether the window is always on top" -#define DOC_WINDOW_ID "id -> int\nGet the unique window ID (**read-only**)" -#define DOC_WINDOW_MOUSERECT "mouse_rect -> Rect|None\nGet or set the mouse confinement rectangle of the window" -#define DOC_WINDOW_SIZE "size -> (int, int)\nGet or set the window size in pixels" -#define DOC_WINDOW_MINIMUMSIZE "minimum_size -> (int, int)\nGet or set the minimum size of the window's client area" -#define DOC_WINDOW_MAXIMUMSIZE "maximum_size -> (int, int)\nGet or set the maximum size of the window's client area" -#define DOC_WINDOW_POSITION "position -> (int, int) or WINDOWPOS_CENTERED or WINDOWPOS_UNDEFINED\nGet or set the window position in screen coordinates" -#define DOC_WINDOW_OPACITY "opacity -> float\nGet or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque)" -#define DOC_WINDOW_OPENGL "opengl -> bool\nGet if the window supports OpenGL" -#define DOC_WINDOW_UTILITY "utility -> bool\nGet if the window is an utility window (**read-only**)" -#define DOC_WINDOW_FROMDISPLAYMODULE "from_display_module() -> Window\nCreate a Window object using window data from display module" -#define DOC_WINDOW_GETSURFACE "get_surface() -> Surface\nGet the window surface" +#define DOC_WINDOW "Window(title='pygame window', size=(640, 480), position=WINDOWPOS_UNDEFINED, **flags) -> Window\nPygame object that represents a window." +#define DOC_WINDOW_GRABMOUSE "grab_mouse -> bool\nGet or set the window's mouse grab mode." +#define DOC_WINDOW_GRABKEYBOARD "grab_keyboard -> bool\nGet or set the window's keyboard grab mode." +#define DOC_WINDOW_MOUSEGRABBED "mouse_grabbed() -> bool\nGet if the mouse cursor is confined to the window (**read-only**)." +#define DOC_WINDOW_KEYBOARDGRABBED "keyboard_grabbed() -> bool\nGet if the keyboard shortcuts are captured by the window (**read-only**)." +#define DOC_WINDOW_FOCUSED "focused() -> bool\nGet if the window is focused (**read-only**)." +#define DOC_WINDOW_TITLE "title -> str\nGet or set the window title." +#define DOC_WINDOW_RESIZABLE "resizable -> bool\nGet or set whether the window is resizable." +#define DOC_WINDOW_BORDERLESS "borderless -> bool\nGets or sets whether the window is borderless." +#define DOC_WINDOW_ALWAYSONTOP "always_on_top -> bool\nGet or set whether the window is always on top." +#define DOC_WINDOW_ID "id() -> int\nGet the unique window ID (**read-only**)." +#define DOC_WINDOW_MOUSERECT "mouse_rect() -> Optional[pygame.rect.Rect]\nGet or set the mouse confinement rectangle of the window." +#define DOC_WINDOW_SIZE "size() -> tuple[int, int]\nGet or set the window size in pixels." +#define DOC_WINDOW_MINIMUMSIZE "minimum_size() -> tuple[int, int]\nGet or set the minimum size of the window's client area." +#define DOC_WINDOW_MAXIMUMSIZE "maximum_size() -> tuple[int, int]\nGet or set the maximum size of the window's client area." +#define DOC_WINDOW_POSITION "position() -> tuple[int, int]\nGet or set the window position in screen coordinates." +#define DOC_WINDOW_OPACITY "opacity -> float\nGet or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque)." +#define DOC_WINDOW_OPENGL "opengl() -> bool\nGet if the window supports OpenGL." +#define DOC_WINDOW_UTILITY "utility() -> bool\nGet if the window is an utility window (**read-only**)." +#define DOC_WINDOW_FROMDISPLAYMODULE "from_display_module() -> Window\nCreate a Window object using window data from display module." +#define DOC_WINDOW_GETSURFACE "get_surface() -> pygame.surface.Surface\nGet the window surface." #define DOC_WINDOW_FLIP "flip() -> None\nUpdate the display surface to the window." -#define DOC_WINDOW_SETWINDOWED "set_windowed() -> None\nEnable windowed mode (exit fullscreen)" -#define DOC_WINDOW_SETFULLSCREEN "set_fullscreen(desktop=False) -> None\nEnter fullscreen" -#define DOC_WINDOW_DESTROY "destroy() -> None\nDestroy the window" -#define DOC_WINDOW_HIDE "hide() -> None\nHide the window" -#define DOC_WINDOW_SHOW "show() -> None\nShow the window" -#define DOC_WINDOW_FOCUS "focus(input_only=False) -> None\nSet the window to be focused" -#define DOC_WINDOW_RESTORE "restore() -> None\nRestore the size and position of a minimized or maximized window" -#define DOC_WINDOW_MAXIMIZE "maximize() -> None\nMaximize the window" -#define DOC_WINDOW_MINIMIZE "maximize() -> None\nMinimize the window" -#define DOC_WINDOW_SETICON "set_icon(surface, /) -> None\nSet the window icon" -#define DOC_WINDOW_SETMODALFOR "set_modal_for(parent, /) -> None\nSet the window as a modal for a parent window" -#define DOC_WINDOW_FLASH "flash(operation, /) -> None\nFlash a window to demand attention from the user" +#define DOC_WINDOW_SETWINDOWED "set_windowed() -> None\nEnable windowed mode (exit fullscreen)." +#define DOC_WINDOW_SETFULLSCREEN "set_fullscreen(desktop=False) -> None\nEnter fullscreen." +#define DOC_WINDOW_DESTROY "destroy() -> None\nDestroy the window." +#define DOC_WINDOW_HIDE "hide() -> None\nHide the window." +#define DOC_WINDOW_SHOW "show() -> None\nShow the window." +#define DOC_WINDOW_FOCUS "focus(input_only=False) -> None\nSet the window to be focused." +#define DOC_WINDOW_RESTORE "restore() -> None\nRestore the size and position of a minimized or maximized window." +#define DOC_WINDOW_MAXIMIZE "maximize() -> None\nMaximize the window." +#define DOC_WINDOW_MINIMIZE "minimize() -> None\nMinimize the window." +#define DOC_WINDOW_SETICON "set_icon(icon, /) -> None\nSet the window icon." +#define DOC_WINDOW_SETMODALFOR "set_modal_for(parent, /) -> None\nSet the window as a modal for a parent window." +#define DOC_WINDOW_FLASH "flash(operation, /) -> None\nFlash a window to demand attention from the user." From c8218fa0154b8d0743f97ca16a690a13959d7d03 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:35:36 +0100 Subject: [PATCH 035/441] Move display docs to stubs --- buildconfig/stubs/pygame/display.pyi | 810 +++++++++++++++++++++++-- docs/reST/ref/display.rst | 875 +-------------------------- src_c/doc/display_doc.h | 70 +-- 3 files changed, 811 insertions(+), 944 deletions(-) diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index 43e1ec8c05..5d77738cb3 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -1,6 +1,59 @@ +"""Pygame module to control the display window and screen. + +This module offers control over the pygame display. Pygame has a single display +Surface that is either contained in a window or runs full screen. Once you +create the display you treat it as a regular Surface. Changes are not +immediately visible onscreen; you must choose one of the two flipping functions +to update the actual display. + +The origin of the display, where x = 0 and y = 0, is the top left of the +screen. Both axes increase positively towards the bottom right of the screen. + +The pygame display can actually be initialized in one of several modes. By +default, the display is a basic software driven framebuffer. You can request +special modules like automatic scaling or OpenGL support. These are +controlled by flags passed to ``pygame.display.set_mode()``. + +Pygame can only have a single display active at any time. Creating a new one +with ``pygame.display.set_mode()`` will close the previous display. To detect +the number and size of attached screens, you can use +``pygame.display.get_desktop_sizes`` and then select appropriate window size +and display index to pass to ``pygame.display.set_mode()``. + +For backward compatibility ``pygame.display`` allows precise control over +the pixel format or display resolutions. This used to be necessary with old +graphics cards and CRT screens, but is usually not needed any more. Use the +functions ``pygame.display.mode_ok()``, ``pygame.display.list_modes()``, and +``pygame.display.Info()`` to query detailed information about the display. + +Once the display Surface is created, the functions from this module affect the +single existing display. The Surface becomes invalid if the module is +uninitialized. If a new display mode is set, the existing Surface will +automatically switch to operate on the new display. + +When the display mode is set, several events are placed on the pygame event +queue. ``pygame.QUIT`` is sent when the user has requested the program to +shut down. The window will receive ``pygame.ACTIVEEVENT`` events as the display +gains and loses input focus. If the display is set with the +``pygame.RESIZABLE`` flag, ``pygame.VIDEORESIZE`` events will be sent when the +user adjusts the window dimensions. Hardware displays that draw direct to the +screen will get ``pygame.VIDEOEXPOSE`` events when portions of the window must +be redrawn. + +A new windowevent API was introduced in pygame 2.0.1. Check event module docs +for more information on that + +Some display environments have an option for automatically stretching all +windows. When this option is enabled, this automatic stretching distorts the +appearance of the pygame window. In the pygame examples directory, there is +example code (prevent_display_stretching.py) which shows how to disable this +automatic stretching of the pygame display on Microsoft Windows (Vista or newer +required). +""" + from collections.abc import Iterable from typing import Optional, Union, overload, Literal -from typing_extensions import deprecated # added in 3.13 +from typing_extensions import deprecated # added in 3.13 from pygame.constants import FULLSCREEN from pygame.surface import Surface @@ -34,18 +87,205 @@ class _VidInfo: current_w: int pixel_format: str -def init() -> None: ... -def quit() -> None: ... -def get_init() -> bool: ... +def init() -> None: + """Initialize the display module. + + Initializes the pygame display module. The display module cannot do anything + until it is initialized. This is usually handled for you automatically when + you call the higher level ``pygame.init()``. + + Pygame will select from one of several internal display backends when it is + initialized. The display mode will be chosen depending on the platform and + permissions of current user. Before the display module is initialized the + environment variable ``SDL_VIDEODRIVER`` can be set to control which backend + is used. The systems with multiple choices are listed here. + + :: + + Windows : windib, directx + Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib, wayland + + :note: On wayland desktops, pygame-ce may choose to use the X11 video driver to run on Xwayland. + This behaviour is determined by the SDL library and might change in the future, so it's suggested + to account for this and not rely on the default behavior. The Wayland video driver can be forced + by setting the ``SDL_VIDEODRIVER`` environment variable to ``"wayland"`` + + On some platforms it is possible to embed the pygame display into an already + existing window. To do this, the environment variable ``SDL_WINDOWID`` must + be set to a string containing the window id or handle. The environment + variable is checked when the pygame display is initialized. Be aware that + there can be many strange side effects when running in an embedded display. + + It is harmless to call this more than once, repeated calls have no effect. + + .. versionchanged:: 2.5.0 the manylinux wheels distributed by us now support the ``wayland`` videodriver + + """ + +def quit() -> None: + """Uninitialize the display module. + + This will shut down the entire display module. This means any active + displays will be closed. This will also be handled automatically when the + program exits. + + It is harmless to call this more than once, repeated calls have no effect. + """ + +def get_init() -> bool: + """Returns True if the display module has been initialized. + + Returns True if the :mod:`pygame.display` module is currently initialized. + """ + def set_mode( size: Point = (0, 0), flags: int = 0, depth: int = 0, display: int = 0, vsync: int = 0, -) -> Surface: ... -def get_surface() -> Optional[Surface]: ... -def flip() -> None: ... +) -> Surface: + """Initialize a window or screen for display. + + This will create a window or display output and return a display Surface. + The arguments passed in are requests for a display type. The actual created + display will be the best possible match supported by the system. + + Note that calling this function implicitly initializes ``pygame.display``, if + it was not initialized before. + + The size argument is a pair of numbers representing the width and + height. The flags argument is a collection of additional options. The depth + argument represents the number of bits to use for color. + + The Surface that gets returned can be drawn to like a regular Surface but + changes will eventually be seen on the monitor. + + If no size is passed or is set to ``(0, 0)``, the created Surface will have + the same size as the current screen resolution. If only the width or height + are set to ``0``, the Surface will have the same width or height as the + screen resolution. + + Since pygame 2, the depth argument is ignored, in favour of the best + and fastest one. It also raises a deprecation warning since pygame-ce + 2.4.0 if the passed in depth is not 0 or the one pygame selects. + + When requesting fullscreen display modes, sometimes an exact match for the + requested size cannot be made. In these situations pygame will select + the closest compatible match. The returned surface will still always match + the requested size. + + On high resolution displays(4k, 1080p) and tiny graphics games (640x480) + show up very small so that they are unplayable. SCALED scales up the window + for you. The game thinks it's a 640x480 window, but really it can be bigger. + Mouse events are scaled for you, so your game doesn't need to do it. Note + that SCALED is considered an experimental API and may change in future + releases. + + The flags argument controls which type of display you want. There are + several to choose from, and you can even combine multiple types using the + bitwise or operator, (the pipe "|" character). Here are the display + flags you will want to choose from: + + :: + + pygame.FULLSCREEN create a fullscreen display + pygame.DOUBLEBUF only applicable with OPENGL + pygame.HWSURFACE (obsolete in pygame 2) hardware accelerated, only in FULLSCREEN + pygame.OPENGL create an OpenGL-renderable display + pygame.RESIZABLE display window should be sizeable + pygame.NOFRAME display window will have no border or controls + pygame.SCALED resolution depends on desktop size and scale graphics + pygame.SHOWN window is opened in visible mode (default) + pygame.HIDDEN window is opened in hidden mode + + + .. versionaddedold:: 2.0.0 ``SCALED``, ``SHOWN`` and ``HIDDEN`` + + .. versionaddedold:: 2.0.0 ``vsync`` parameter + + By setting the ``vsync`` parameter to ``1``, it is possible to get a display + with vertical sync at a constant frame rate determined by the monitor and + graphics drivers. Subsequent calls to :func:`pygame.display.flip()` or + :func:`pygame.display.update()` will block (i.e. *wait*) until the screen + has refreshed, in order to prevent "screen tearing" + . + + Be careful when using this feature together with ``pygame.time.Clock`` or + :func:`pygame.time.delay()`, as multiple forms of waiting and frame rate + limiting may interact to cause skipped frames. + + The request only works when graphics acceleration is available on the + system. The exact behaviour depends on the hardware and driver + configuration. When ``vsync`` is requested, but unavailable, + ``set_mode()`` may raise an exception. + + Setting the ``vsync`` parameter to ``-1`` in conjunction with ``OPENGL`` + will request the OpenGL-specific feature "adaptive vsync" . + + Here is an example usage of a call + to ``set_mode()`` that may give you a display with vsync: + + :: + + flags = pygame.OPENGL | pygame.FULLSCREEN + try: + window_surface = pygame.display.set_mode((1920, 1080), flags, vsync=1) + vsync_success=True + except pygame.error: + window_surface = pygame.display.set_mode((1920, 1080), flags) + vsync_success=False + + .. versionaddedold:: 2.0.0 ``vsync`` parameter + + .. versionchanged:: 2.2.0 passing ``vsync`` can raise an exception + + .. versionchanged:: 2.2.0 explicit request for "adaptive vsync" + + .. versionchanged:: 2.2.0 ``vsync=1`` does not require ``SCALED`` or ``OPENGL`` + + .. deprecated:: 2.4.0 The depth argument is ignored, and will be set to the optimal value + + .. versionchanged:: 2.5.0 No longer emits warning when running on xwayland, see :func:`pygame.display.init` for details on running on wayland directly + + Basic example: + + :: + + # Open a window on the screen + screen_width=700 + screen_height=400 + screen=pygame.display.set_mode([screen_width, screen_height]) + + The display index ``0`` means the default display is used. If no display + index argument is provided, the default display can be overridden with an + environment variable. + + + .. versionchangedold:: 1.9.5 ``display`` argument added + + .. versionchanged:: 2.1.3 + pygame now ensures that subsequent calls to this function clears the + window to black. On older versions, this was an implementation detail + on the major platforms this function was tested with. + """ + +def get_surface() -> Optional[Surface]: + """Get a reference to the currently set display surface. + + Return a reference to the currently set display Surface. If no display mode + has been set this will return None. + """ + +def flip() -> None: + """Update the full display Surface to the screen. + + This will update the contents of the entire display. + + When using an ``pygame.OPENGL`` display mode this will perform a gl buffer + swap. + """ + @overload def update() -> None: ... @overload @@ -55,47 +295,522 @@ def update( @overload def update(x: float, y: float, w: float, h: float, /) -> None: ... @overload -def update(xy: Point, wh: Point, /) -> None: ... -def get_driver() -> str: ... -def Info() -> _VidInfo: ... -def get_wm_info() -> dict[str, int]: ... +def update(xy: Point, wh: Point, /) -> None: + """Update all, or a portion, of the display. For non-OpenGL displays. + + For non OpenGL display Surfaces, this function is very similar to + ``pygame.display.flip()`` with an optional parameter that allows only + portions of the display surface to be updated, instead of the entire area. + If no argument is passed it updates the entire Surface area like + ``pygame.display.flip()``. + + .. note:: calling ``display.update(None)`` means no part of the window is + updated. Whereas ``display.update()`` means the whole window is + updated. + + You can pass the function a single rectangle, or an iterable of rectangles. + Generally you do not want to pass an iterable of rectangles as there is a + performance cost per rectangle passed to the function. On modern hardware, + after a very small number of rectangles passed in, the per-rectangle cost + will exceed the saving of updating less pixels. In most applications it is + simply more efficient to update the entire display surface at once, it also + means you do not need to keep track of a list of rectangles for each call + to update. + + If passing an iterable of rectangles it is safe to include None + values in the list, which will be skipped. + + This call cannot be used on ``pygame.OPENGL`` displays and will generate an + exception. + + .. versionchanged:: 2.5.1 Added support for passing an iterable, previously only sequence was allowed + """ + +def get_driver() -> str: + """Get the name of the pygame display backend. + + Pygame chooses one of many available display backends when it is + initialized. This returns the internal name used for the display backend. + This can be used to provide limited information about what display + capabilities might be accelerated. See the ``SDL_VIDEODRIVER`` flags in + ``pygame.display.set_mode()`` to see some of the common options. + """ + +def Info() -> _VidInfo: + """Create a video display information object. + + Creates a simple object containing several attributes to describe the + current graphics environment. If this is called before + ``pygame.display.set_mode()`` some platforms can provide information about + the default display mode. This can also be called after setting the display + mode to verify specific display options were satisfied. The VidInfo object + has several attributes: + + .. code-block:: text + + hw: 1 if the display is hardware accelerated + wm: 1 if windowed display modes can be used + video_mem: The megabytes of video memory on the display. + This is 0 if unknown + bitsize: Number of bits used to store each pixel + bytesize: Number of bytes used to store each pixel + masks: Four values used to pack RGBA values into pixels + shifts: Four values used to pack RGBA values into pixels + losses: Four values used to pack RGBA values into pixels + blit_hw: 1 if hardware Surface blitting is accelerated + blit_hw_CC: 1 if hardware Surface colorkey blitting is accelerated + blit_hw_A: 1 if hardware Surface pixel alpha blitting is + accelerated + blit_sw: 1 if software Surface blitting is accelerated + blit_sw_CC: 1 if software Surface colorkey blitting is + accelerated + blit_sw_A: 1 if software Surface pixel alpha blitting is + accelerated + current_h, current_w: Height and width of the current video + mode, or of the desktop mode if called before + the display.set_mode is called. They are -1 on error. + pixel_format: The pixel format of the display Surface as a string. + E.g PIXELFORMAT_RGB888. + + .. versionchanged:: 2.4.0 ``pixel_format`` attribute added. + """ + +def get_wm_info() -> dict[str, int]: + """Get information about the current windowing system. + + Creates a dictionary filled with string keys. The strings and values are + arbitrarily created by the system. Some systems may have no information and + an empty dictionary will be returned. Most platforms will return a "window" + key with the value set to the system id for the current display. + + .. versionaddedold:: 1.7.1 + """ + +def get_desktop_sizes() -> list[tuple[int, int]]: + """Get sizes of active desktops. + + This function returns the sizes of the currently configured + virtual desktops as a list of (x, y) tuples of integers. + + The length of the list is not the same as the number of attached monitors, + as a desktop can be mirrored across multiple monitors. The desktop sizes + do not indicate the maximum monitor resolutions supported by the hardware, + but the desktop size configured in the operating system. + + In order to fit windows into the desktop as it is currently configured, and + to respect the resolution configured by the operating system in fullscreen + mode, this function *should* be used to replace many use cases of + ``pygame.display.list_modes()`` whenever applicable. + + .. versionaddedold:: 2.0.0 + """ + def list_modes( depth: int = 0, flags: int = FULLSCREEN, display: int = 0, -) -> list[tuple[int, int]]: ... +) -> list[tuple[int, int]]: + """Get list of available fullscreen modes. + + This function returns a list of possible sizes for a specified color + depth. The return value will be an empty list if no display modes are + available with the given arguments. A return value of ``-1`` means that + any requested size should work (this is likely the case for windowed + modes). Mode sizes are sorted from biggest to smallest. + + If depth is ``0``, the current/best color depth for the display is used. + The flags defaults to ``pygame.FULLSCREEN``, but you may need to add + additional flags for specific fullscreen modes. + + The display index ``0`` means the default display is used. + + Since pygame 2.0, ``pygame.display.get_desktop_sizes()`` has taken over + some use cases from ``pygame.display.list_modes()``: + + To find a suitable size for non-fullscreen windows, it is preferable to + use ``pygame.display.get_desktop_sizes()`` to get the size of the *current* + desktop, and to then choose a smaller window size. This way, the window is + guaranteed to fit, even when the monitor is configured to a lower resolution + than the maximum supported by the hardware. + + To avoid changing the physical monitor resolution, it is also preferable to + use ``pygame.display.get_desktop_sizes()`` to determine the fullscreen + resolution. Developers are strongly advised to default to the current + physical monitor resolution unless the user explicitly requests a different + one (e.g. in an options menu or configuration file). + + .. versionchangedold:: 1.9.5 ``display`` argument added + """ + def mode_ok( size: IntPoint, flags: int = 0, depth: int = 0, display: int = 0, -) -> int: ... -def gl_get_attribute(flag: int, /) -> int: ... -def gl_set_attribute(flag: int, value: int, /) -> None: ... -def get_active() -> bool: ... -def iconify() -> bool: ... -def toggle_fullscreen() -> int: ... +) -> int: + """Pick the best color depth for a display mode. + + This function uses the same arguments as ``pygame.display.set_mode()``. It + is used to determine if a requested display mode is available. It will + return ``0`` if the display mode cannot be set. Otherwise it will return a + pixel depth that best matches the display asked for. + + Usually the depth argument is not passed, but some platforms can support + multiple display depths. If passed it will hint to which depth is a better + match. + + The function will return ``0`` if the passed display flags cannot be set. + + The display index ``0`` means the default display is used. + + .. versionchangedold:: 1.9.5 ``display`` argument added + """ + +def gl_get_attribute(flag: int, /) -> int: + """Get the value for an OpenGL flag for the current display. + + After calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag, + it is a good idea to check the value of any requested OpenGL attributes. See + ``pygame.display.gl_set_attribute()`` for a list of valid flags. + """ + +def gl_set_attribute(flag: int, value: int, /) -> None: + """Request an OpenGL display attribute for the display mode. + + When calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag, + Pygame automatically handles setting the OpenGL attributes like color and + double-buffering. OpenGL offers several other attributes you may want control + over. Pass one of these attributes as the flag, and its appropriate value. + This must be called before ``pygame.display.set_mode()``. + + Many settings are the requested minimum. Creating a window with an OpenGL context + will fail if OpenGL cannot provide the requested attribute, but it may for example + give you a stencil buffer even if you request none, or it may give you a larger + one than requested. + + The ``OPENGL`` flags are + + :: + + GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE, + GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE, + GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO + + :const:`GL_MULTISAMPLEBUFFERS` + + Whether to enable multisampling anti-aliasing. + Defaults to 0 (disabled). + Set ``GL_MULTISAMPLESAMPLES`` to a value + above 0 to control the amount of anti-aliasing. + A typical value is 2 or 3. + + :const:`GL_STENCIL_SIZE` + + Minimum bit size of the stencil buffer. Defaults to 0. + + :const:`GL_DEPTH_SIZE` + + Minimum bit size of the depth buffer. Defaults to 16. + + :const:`GL_STEREO` + + 1 enables stereo 3D. Defaults to 0. + + :const:`GL_BUFFER_SIZE` + + Minimum bit size of the frame buffer. Defaults to 0. + + .. versionaddedold:: 2.0.0 Additional attributes: + + :: + + GL_ACCELERATED_VISUAL, + GL_CONTEXT_MAJOR_VERSION, GL_CONTEXT_MINOR_VERSION, + GL_CONTEXT_FLAGS, GL_CONTEXT_PROFILE_MASK, + GL_SHARE_WITH_CURRENT_CONTEXT, + GL_CONTEXT_RELEASE_BEHAVIOR, + GL_FRAMEBUFFER_SRGB_CAPABLE + + :const:`GL_CONTEXT_PROFILE_MASK` + + Sets the OpenGL profile to one of these values: + + :: + + GL_CONTEXT_PROFILE_CORE disable deprecated features + GL_CONTEXT_PROFILE_COMPATIBILITY allow deprecated features + GL_CONTEXT_PROFILE_ES allow only the ES feature + subset of OpenGL + + :const:`GL_ACCELERATED_VISUAL` + + Set to 1 to require hardware acceleration, or 0 to force software render. + By default, both are allowed. + """ + +def get_active() -> bool: + """Returns True when the display is active on the screen. + + Returns True when the display Surface is considered actively + renderable on the screen and may be visible to the user. This is + the default state immediately after ``pygame.display.set_mode()``. + This method may return True even if the application is fully hidden + behind another application window. + + This will return False if the display Surface has been iconified or + minimized (either via ``pygame.display.iconify()`` or via an OS + specific method such as the minimize-icon available on most + desktops). + + The method can also return False for other reasons without the + application being explicitly iconified or minimized by the user. A + notable example being if the user has multiple virtual desktops and + the display Surface is not on the active virtual desktop. + + .. note:: This function returning True is unrelated to whether the + application has input focus. Please see + ``pygame.key.get_focused()`` and ``pygame.mouse.get_focused()`` + for APIs related to input focus. + """ + +def iconify() -> bool: + """Iconify the display surface. + + Request the window for the display surface be iconified or hidden. Not all + systems and displays support an iconified display. The function will return + True if successful. + + When the display is iconified ``pygame.display.get_active()`` will return + ``False``. The event queue should receive an ``ACTIVEEVENT`` event when the + window has been iconified. Additionally, the event queue also receives a + ``WINDOWEVENT_MINIMIZED`` event when the window has been iconified on pygame 2. + """ + +def toggle_fullscreen() -> int: + """Switch between fullscreen and windowed displays. + + Switches the display window between windowed and fullscreen modes. + Display driver support is not great when using pygame 1, but with + pygame 2 it is the most reliable method to switch to and from fullscreen. + + Supported display drivers in pygame 1: + + * x11 (Linux/Unix) + * wayland (Linux/Unix) + + Supported display drivers in pygame 2: + + * windows (Windows) + * x11 (Linux/Unix) + * wayland (Linux/Unix) + * cocoa (OSX/Mac) + + .. note:: :func:`toggle_fullscreen` doesn't work on Windows + unless the window size is in :func:`pygame.display.list_modes()` or + the window is created with the flag ``pygame.SCALED``. + See `issue #1221 `_. + """ + @deprecated("since 2.1.4. Removed in SDL3") -def set_gamma(red: float, green: float = ..., blue: float = ..., /) -> int: ... +def set_gamma(red: float, green: float = ..., blue: float = ..., /) -> int: + """Change the hardware gamma ramps. + + DEPRECATED: This functionality will go away in SDL3. + + Set the red, green, and blue gamma values on the display hardware. If the + green and blue arguments are not passed, they will both be the same as red. + Not all systems and hardware support gamma ramps, if the function succeeds + it will return ``True``. + + A gamma value of ``1.0`` creates a linear color table. Lower values will + darken the display and higher values will brighten. + + .. deprecated:: 2.1.4 + """ + @deprecated("since 2.1.4. Removed in SDL3") def set_gamma_ramp( red: SequenceLike[int], green: SequenceLike[int], blue: SequenceLike[int], / -) -> int: ... -def set_icon(surface: Surface, /) -> None: ... -def set_caption(title: str, icontitle: Optional[str] = None, /) -> None: ... -def get_caption() -> tuple[str, str]: ... -def set_palette(palette: SequenceLike[ColorLike], /) -> None: ... -def get_num_displays() -> int: ... -def get_window_size() -> tuple[int, int]: ... -def get_window_position() -> tuple[int, int]:... -def set_window_position(position: Point) -> None:... -def get_allow_screensaver() -> bool: ... -def set_allow_screensaver(value: bool = True) -> None: ... -def get_desktop_sizes() -> list[tuple[int, int]]: ... -def is_fullscreen() -> bool: ... -def is_vsync() -> bool: ... -def get_current_refresh_rate() -> int: ... -def get_desktop_refresh_rates() -> list[int]: ... +) -> int: + """Change the hardware gamma ramps with a custom lookup. + + DEPRECATED: This functionality will go away in SDL3. + + Set the red, green, and blue gamma ramps with an explicit lookup table. Each + argument should be sequence of 256 integers. The integers should range + between ``0`` and ``0xffff``. Not all systems and hardware support gamma + ramps, if the function succeeds it will return ``True``. + + .. deprecated:: 2.1.4 + """ + +def set_icon(surface: Surface, /) -> None: + """Change the system image for the display window. + + Sets the runtime icon the system will use to represent the display window. + All windows default to a simple pygame logo for the window icon. + + Note that calling this function implicitly initializes ``pygame.display``, if + it was not initialized before. + + You can pass any surface, but most systems want a smaller image around + 32x32. The image can have colorkey transparency which will be passed to the + system. + + Some systems do not allow the window icon to change after it has been shown. + This function can be called before ``pygame.display.set_mode()`` to create + the icon before the display mode is set. + """ + +def set_caption(title: str, icontitle: Optional[str] = None, /) -> None: + """Set the current window caption. + + If the display has a window title, this function will change the name on the + window. In pygame 1.x, some systems supported an alternate shorter title to + be used for minimized displays, but in pygame 2 ``icontitle`` does nothing. + """ + +def get_caption() -> tuple[str, str]: + """Get the current window caption. + + Returns the title and icontitle of the display window. In pygame 2.x + these will always be the same value. + """ + +def set_palette(palette: SequenceLike[ColorLike], /) -> None: + """Set the display color palette for indexed displays. + + This will change the video display color palette for 8-bit displays. This + does not change the palette for the actual display Surface, only the palette + that is used to display the Surface. If no palette argument is passed, the + system default palette will be restored. The palette is a sequence of + ``RGB`` triplets. + """ + +def get_num_displays() -> int: + """Return the number of displays. + + Returns the number of available displays. This is always 1 if + :func:`pygame.get_sdl_version()` returns a major version number below 2. + + .. versionaddedold:: 1.9.5 + """ + +def get_window_size() -> tuple[int, int]: + """Return the size of the window or screen. + + Returns the size of the window initialized with :func:`pygame.display.set_mode()`. + This may differ from the size of the display surface if ``SCALED`` is used. + + .. versionaddedold:: 2.0.0 + """ + +def get_window_position() -> tuple[int, int]: + """Return the position of the window or screen. + + Returns the position of the window initialized with :func:`pygame.display.set_mode()`. + The position will change when the user moves the window or when the + position is set manually with :func:`pygame.display.set_window_position()`. + Coordinates could be negative or outside the desktop size bounds. The + position is relative to the topleft of the primary monitor and the y coordinate + ignores the window frame. + """ + +def set_window_position(position: Point) -> None: + """Set the current window position. + + Sets the position of the window initialized with :func:`pygame.display.set_mode()`. + This differs from updating environment variables as this function can be + called after the display has been initialised. The position is expected to + be relative to the topleft of the primary monitor. The y coordinate will + ignore the window frame (y = 0 means the frame is hidden). The user will + still be able to move the window after this call. See also + :func:`pygame.display.get_window_position()`. + """ + +def get_allow_screensaver() -> bool: + """Return whether the screensaver is allowed to run. + + Return whether screensaver is allowed to run whilst the app is running. Default + is ``False``. By default pygame does not allow the screensaver during game + play. + + .. note:: Some platforms do not have a screensaver or support + disabling the screensaver. Please see + :func:`pygame.display.set_allow_screensaver()` for + caveats with screensaver support. + + .. versionaddedold:: 2.0.0 + """ + +def set_allow_screensaver(value: bool = True) -> None: + """Set whether the screensaver may run. + + Change whether screensavers should be allowed whilst the app is running. + The default value of the argument to the function is True. + By default pygame does not allow the screensaver during game play. + + If the screensaver has been disallowed due to this function, it will automatically + be allowed to run when :func:`pygame.quit()` is called. + + It is possible to influence the default value via the environment variable + ``SDL_HINT_VIDEO_ALLOW_SCREENSAVER``, which can be set to either ``0`` (disable) + or ``1`` (enable). + + .. note:: Disabling screensaver is subject to platform support. + When platform support is absent, this function will + silently appear to work even though the screensaver state + is unchanged. The lack of feedback is due to SDL not + providing any supported method for determining whether + it supports changing the screensaver state. + + .. versionaddedold:: 2.0.0 + """ + +def is_fullscreen() -> bool: + """Returns True if the pygame window created by pygame.display.set_mode() is in full-screen mode. + + Edge cases: + If the window is in windowed mode, but maximized, this will return `False`. + If the window is in "borderless fullscreen" mode, this will return `True`. + + .. versionadded:: 2.2.0 + """ + +def is_vsync() -> bool: + """Returns True if vertical synchronisation for pygame.display.flip() and pygame.display.update() is enabled. + + .. versionadded:: 2.2.0 + """ + +def get_current_refresh_rate() -> int: + """Returns the screen refresh rate or 0 if unknown. + + The screen refresh rate for the current window. In windowed mode, this + should be equal to the refresh rate of the desktop the window is on. + + If no window is open, an exception is raised. + + When a constant refresh rate cannot be determined, 0 is returned. + + .. versionadded:: 2.2.0 + """ + +def get_desktop_refresh_rates() -> list[int]: + """Returns the screen refresh rates for all displays (in windowed mode). + + If the current window is in full-screen mode, the actual refresh rate for + that window can differ. + + This is safe to call when no window is open (i.e. before any calls to + :func:`pygame.display.set_mode()` + + When a constant refresh rate cannot be determined, 0 is returned for that + desktop. + + .. versionadded:: 2.2.0 + """ + def message_box( title: str, message: Optional[str] = None, @@ -104,4 +819,27 @@ def message_box( buttons: SequenceLike[str] = ("OK",), return_button: int = 0, escape_button: Optional[int] = None, -) -> int: ... +) -> int: + """Create a native GUI message box. + + :param str title: A title string. + :param str message: A message string. If this parameter is set to ``None``, the message will be the title. + :param str message_type: Set the type of message_box, could be ``"info"``, ``"warn"`` or ``"error"``. + :param Window parent_window: The parent window of the message box. + :param tuple buttons: An optional sequence of button name strings to show to the user. + :param int return_button: Button index to use if the return key is hit, ``0`` by default. + :param int escape_button: Button index to use if the escape key is hit, ``None`` for no button linked by default. + + :return: The index of the button that was pushed. + + This function should be called on the thread that ``set_mode()`` is called. + It will block execution of that thread until the user clicks a button or + closes the message_box. + + This function may be called at any time, even before ``pygame.init()``. + + Negative values of ``return_button`` and ``escape_button`` are allowed + just like standard Python list indexing. + + .. versionadded:: 2.4.0 + """ diff --git a/docs/reST/ref/display.rst b/docs/reST/ref/display.rst index 223a3744de..21aa8355f3 100644 --- a/docs/reST/ref/display.rst +++ b/docs/reST/ref/display.rst @@ -3,876 +3,5 @@ :mod:`pygame.display` ===================== -.. module:: pygame.display - :synopsis: pygame module to control the display window and screen - -| :sl:`pygame module to control the display window and screen` - -This module offers control over the pygame display. Pygame has a single display -Surface that is either contained in a window or runs full screen. Once you -create the display you treat it as a regular Surface. Changes are not -immediately visible onscreen; you must choose one of the two flipping functions -to update the actual display. - -The origin of the display, where x = 0 and y = 0, is the top left of the -screen. Both axes increase positively towards the bottom right of the screen. - -The pygame display can actually be initialized in one of several modes. By -default, the display is a basic software driven framebuffer. You can request -special modules like automatic scaling or OpenGL support. These are -controlled by flags passed to ``pygame.display.set_mode()``. - -Pygame can only have a single display active at any time. Creating a new one -with ``pygame.display.set_mode()`` will close the previous display. To detect -the number and size of attached screens, you can use -``pygame.display.get_desktop_sizes`` and then select appropriate window size -and display index to pass to ``pygame.display.set_mode()``. - -For backward compatibility ``pygame.display`` allows precise control over -the pixel format or display resolutions. This used to be necessary with old -graphics cards and CRT screens, but is usually not needed any more. Use the -functions ``pygame.display.mode_ok()``, ``pygame.display.list_modes()``, and -``pygame.display.Info()`` to query detailed information about the display. - -Once the display Surface is created, the functions from this module affect the -single existing display. The Surface becomes invalid if the module is -uninitialized. If a new display mode is set, the existing Surface will -automatically switch to operate on the new display. - -When the display mode is set, several events are placed on the pygame event -queue. ``pygame.QUIT`` is sent when the user has requested the program to -shut down. The window will receive ``pygame.ACTIVEEVENT`` events as the display -gains and loses input focus. If the display is set with the -``pygame.RESIZABLE`` flag, ``pygame.VIDEORESIZE`` events will be sent when the -user adjusts the window dimensions. Hardware displays that draw direct to the -screen will get ``pygame.VIDEOEXPOSE`` events when portions of the window must -be redrawn. - -A new windowevent API was introduced in pygame 2.0.1. Check event module docs -for more information on that - -Some display environments have an option for automatically stretching all -windows. When this option is enabled, this automatic stretching distorts the -appearance of the pygame window. In the pygame examples directory, there is -example code (prevent_display_stretching.py) which shows how to disable this -automatic stretching of the pygame display on Microsoft Windows (Vista or newer -required). - -.. function:: init - - | :sl:`Initialize the display module` - | :sg:`init() -> None` - - Initializes the pygame display module. The display module cannot do anything - until it is initialized. This is usually handled for you automatically when - you call the higher level ``pygame.init()``. - - Pygame will select from one of several internal display backends when it is - initialized. The display mode will be chosen depending on the platform and - permissions of current user. Before the display module is initialized the - environment variable ``SDL_VIDEODRIVER`` can be set to control which backend - is used. The systems with multiple choices are listed here. - - :: - - Windows : windib, directx - Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib, wayland - - :note: On wayland desktops, pygame-ce may choose to use the X11 video driver to run on Xwayland. - This behaviour is determined by the SDL library and might change in the future, so it's suggested - to account for this and not rely on the default behavior. The Wayland video driver can be forced - by setting the ``SDL_VIDEODRIVER`` environment variable to ``"wayland"`` - - On some platforms it is possible to embed the pygame display into an already - existing window. To do this, the environment variable ``SDL_WINDOWID`` must - be set to a string containing the window id or handle. The environment - variable is checked when the pygame display is initialized. Be aware that - there can be many strange side effects when running in an embedded display. - - It is harmless to call this more than once, repeated calls have no effect. - - .. versionchanged:: 2.5.0 the manylinux wheels distributed by us now support the ``wayland`` videodriver - - .. ## pygame.display.init ## - -.. function:: quit - - | :sl:`Uninitialize the display module` - | :sg:`quit() -> None` - - This will shut down the entire display module. This means any active - displays will be closed. This will also be handled automatically when the - program exits. - - It is harmless to call this more than once, repeated calls have no effect. - - .. ## pygame.display.quit ## - -.. function:: get_init - - | :sl:`Returns True if the display module has been initialized` - | :sg:`get_init() -> bool` - - Returns True if the :mod:`pygame.display` module is currently initialized. - - .. ## pygame.display.get_init ## - -.. function:: set_mode - - | :sl:`Initialize a window or screen for display` - | :sg:`set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface` - - This will create a window or display output and return a display Surface. - The arguments passed in are requests for a display type. The actual created - display will be the best possible match supported by the system. - - Note that calling this function implicitly initializes ``pygame.display``, if - it was not initialized before. - - The size argument is a pair of numbers representing the width and - height. The flags argument is a collection of additional options. The depth - argument represents the number of bits to use for color. - - The Surface that gets returned can be drawn to like a regular Surface but - changes will eventually be seen on the monitor. - - If no size is passed or is set to ``(0, 0)``, the created Surface will have - the same size as the current screen resolution. If only the width or height - are set to ``0``, the Surface will have the same width or height as the - screen resolution. - - Since pygame 2, the depth argument is ignored, in favour of the best - and fastest one. It also raises a deprecation warning since pygame-ce - 2.4.0 if the passed in depth is not 0 or the one pygame selects. - - When requesting fullscreen display modes, sometimes an exact match for the - requested size cannot be made. In these situations pygame will select - the closest compatible match. The returned surface will still always match - the requested size. - - On high resolution displays(4k, 1080p) and tiny graphics games (640x480) - show up very small so that they are unplayable. SCALED scales up the window - for you. The game thinks it's a 640x480 window, but really it can be bigger. - Mouse events are scaled for you, so your game doesn't need to do it. Note - that SCALED is considered an experimental API and may change in future - releases. - - The flags argument controls which type of display you want. There are - several to choose from, and you can even combine multiple types using the - bitwise or operator, (the pipe "|" character). Here are the display - flags you will want to choose from: - - :: - - pygame.FULLSCREEN create a fullscreen display - pygame.DOUBLEBUF only applicable with OPENGL - pygame.HWSURFACE (obsolete in pygame 2) hardware accelerated, only in FULLSCREEN - pygame.OPENGL create an OpenGL-renderable display - pygame.RESIZABLE display window should be sizeable - pygame.NOFRAME display window will have no border or controls - pygame.SCALED resolution depends on desktop size and scale graphics - pygame.SHOWN window is opened in visible mode (default) - pygame.HIDDEN window is opened in hidden mode - - - .. versionaddedold:: 2.0.0 ``SCALED``, ``SHOWN`` and ``HIDDEN`` - - .. versionaddedold:: 2.0.0 ``vsync`` parameter - - By setting the ``vsync`` parameter to ``1``, it is possible to get a display - with vertical sync at a constant frame rate determined by the monitor and - graphics drivers. Subsequent calls to :func:`pygame.display.flip()` or - :func:`pygame.display.update()` will block (i.e. *wait*) until the screen - has refreshed, in order to prevent "screen tearing" - . - - Be careful when using this feature together with ``pygame.time.Clock`` or - :func:`pygame.time.delay()`, as multiple forms of waiting and frame rate - limiting may interact to cause skipped frames. - - The request only works when graphics acceleration is available on the - system. The exact behaviour depends on the hardware and driver - configuration. When ``vsync`` is requested, but unavailable, - ``set_mode()`` may raise an exception. - - Setting the ``vsync`` parameter to ``-1`` in conjunction with ``OPENGL`` - will request the OpenGL-specific feature "adaptive vsync" . - - Here is an example usage of a call - to ``set_mode()`` that may give you a display with vsync: - - :: - - flags = pygame.OPENGL | pygame.FULLSCREEN - try: - window_surface = pygame.display.set_mode((1920, 1080), flags, vsync=1) - vsync_success=True - except pygame.error: - window_surface = pygame.display.set_mode((1920, 1080), flags) - vsync_success=False - - .. versionaddedold:: 2.0.0 ``vsync`` parameter - - .. versionchanged:: 2.2.0 passing ``vsync`` can raise an exception - - .. versionchanged:: 2.2.0 explicit request for "adaptive vsync" - - .. versionchanged:: 2.2.0 ``vsync=1`` does not require ``SCALED`` or ``OPENGL`` - - .. deprecated:: 2.4.0 The depth argument is ignored, and will be set to the optimal value - - .. versionchanged:: 2.5.0 No longer emits warning when running on xwayland, see :func:`pygame.display.init` for details on running on wayland directly - - - Basic example: - - :: - - # Open a window on the screen - screen_width=700 - screen_height=400 - screen=pygame.display.set_mode([screen_width, screen_height]) - - The display index ``0`` means the default display is used. If no display - index argument is provided, the default display can be overridden with an - environment variable. - - - .. versionchangedold:: 1.9.5 ``display`` argument added - - .. versionchanged:: 2.1.3 - pygame now ensures that subsequent calls to this function clears the - window to black. On older versions, this was an implementation detail - on the major platforms this function was tested with. - - .. ## pygame.display.set_mode ## - -.. function:: get_surface - - | :sl:`Get a reference to the currently set display surface` - | :sg:`get_surface() -> Surface` - | :sg:`get_surface() -> None` - - Return a reference to the currently set display Surface. If no display mode - has been set this will return None. - - .. ## pygame.display.get_surface ## - -.. function:: flip - - | :sl:`Update the full display Surface to the screen` - | :sg:`flip() -> None` - - This will update the contents of the entire display. - - When using an ``pygame.OPENGL`` display mode this will perform a gl buffer - swap. - - .. ## pygame.display.flip ## - -.. function:: update - - | :sl:`Update all, or a portion, of the display. For non-OpenGL displays.` - | :sg:`update() -> None` - | :sg:`update(rectangle, /) -> None` - | :sg:`update(x, y, w, h, /) -> None` - | :sg:`update((x, y), (w, h), /) -> None` - | :sg:`update(rectangle_iterable, /) -> None` - - For non OpenGL display Surfaces, this function is very similar to - ``pygame.display.flip()`` with an optional parameter that allows only - portions of the display surface to be updated, instead of the entire area. - If no argument is passed it updates the entire Surface area like - ``pygame.display.flip()``. - - .. note:: calling ``display.update(None)`` means no part of the window is - updated. Whereas ``display.update()`` means the whole window is - updated. - - You can pass the function a single rectangle, or an iterable of rectangles. - Generally you do not want to pass an iterable of rectangles as there is a - performance cost per rectangle passed to the function. On modern hardware, - after a very small number of rectangles passed in, the per-rectangle cost - will exceed the saving of updating less pixels. In most applications it is - simply more efficient to update the entire display surface at once, it also - means you do not need to keep track of a list of rectangles for each call - to update. - - If passing an iterable of rectangles it is safe to include None - values in the list, which will be skipped. - - This call cannot be used on ``pygame.OPENGL`` displays and will generate an - exception. - - .. versionchanged:: 2.5.1 Added support for passing an iterable, previously only sequence was allowed - - .. ## pygame.display.update ## - -.. function:: get_driver - - | :sl:`Get the name of the pygame display backend` - | :sg:`get_driver() -> name` - - Pygame chooses one of many available display backends when it is - initialized. This returns the internal name used for the display backend. - This can be used to provide limited information about what display - capabilities might be accelerated. See the ``SDL_VIDEODRIVER`` flags in - ``pygame.display.set_mode()`` to see some of the common options. - - .. ## pygame.display.get_driver ## - -.. function:: Info - - | :sl:`Create a video display information object` - | :sg:`Info() -> VideoInfo` - - Creates a simple object containing several attributes to describe the - current graphics environment. If this is called before - ``pygame.display.set_mode()`` some platforms can provide information about - the default display mode. This can also be called after setting the display - mode to verify specific display options were satisfied. The VidInfo object - has several attributes: - - .. code-block:: text - - hw: 1 if the display is hardware accelerated - wm: 1 if windowed display modes can be used - video_mem: The megabytes of video memory on the display. - This is 0 if unknown - bitsize: Number of bits used to store each pixel - bytesize: Number of bytes used to store each pixel - masks: Four values used to pack RGBA values into pixels - shifts: Four values used to pack RGBA values into pixels - losses: Four values used to pack RGBA values into pixels - blit_hw: 1 if hardware Surface blitting is accelerated - blit_hw_CC: 1 if hardware Surface colorkey blitting is accelerated - blit_hw_A: 1 if hardware Surface pixel alpha blitting is - accelerated - blit_sw: 1 if software Surface blitting is accelerated - blit_sw_CC: 1 if software Surface colorkey blitting is - accelerated - blit_sw_A: 1 if software Surface pixel alpha blitting is - accelerated - current_h, current_w: Height and width of the current video - mode, or of the desktop mode if called before - the display.set_mode is called. They are -1 on error. - pixel_format: The pixel format of the display Surface as a string. - E.g PIXELFORMAT_RGB888. - - .. versionchanged:: 2.4.0 ``pixel_format`` attribute added. - - .. ## pygame.display.Info ## - -.. function:: get_wm_info - - | :sl:`Get information about the current windowing system` - | :sg:`get_wm_info() -> dict` - - Creates a dictionary filled with string keys. The strings and values are - arbitrarily created by the system. Some systems may have no information and - an empty dictionary will be returned. Most platforms will return a "window" - key with the value set to the system id for the current display. - - .. versionaddedold:: 1.7.1 - - .. ## pygame.display.get_wm_info ## - -.. function:: get_desktop_sizes - - | :sl:`Get sizes of active desktops` - | :sg:`get_desktop_sizes() -> list` - - This function returns the sizes of the currently configured - virtual desktops as a list of (x, y) tuples of integers. - - The length of the list is not the same as the number of attached monitors, - as a desktop can be mirrored across multiple monitors. The desktop sizes - do not indicate the maximum monitor resolutions supported by the hardware, - but the desktop size configured in the operating system. - - In order to fit windows into the desktop as it is currently configured, and - to respect the resolution configured by the operating system in fullscreen - mode, this function *should* be used to replace many use cases of - ``pygame.display.list_modes()`` whenever applicable. - - .. versionaddedold:: 2.0.0 - -.. function:: list_modes - - | :sl:`Get list of available fullscreen modes` - | :sg:`list_modes(depth=0, flags=pygame.FULLSCREEN, display=0) -> list` - - This function returns a list of possible sizes for a specified color - depth. The return value will be an empty list if no display modes are - available with the given arguments. A return value of ``-1`` means that - any requested size should work (this is likely the case for windowed - modes). Mode sizes are sorted from biggest to smallest. - - If depth is ``0``, the current/best color depth for the display is used. - The flags defaults to ``pygame.FULLSCREEN``, but you may need to add - additional flags for specific fullscreen modes. - - The display index ``0`` means the default display is used. - - Since pygame 2.0, ``pygame.display.get_desktop_sizes()`` has taken over - some use cases from ``pygame.display.list_modes()``: - - To find a suitable size for non-fullscreen windows, it is preferable to - use ``pygame.display.get_desktop_sizes()`` to get the size of the *current* - desktop, and to then choose a smaller window size. This way, the window is - guaranteed to fit, even when the monitor is configured to a lower resolution - than the maximum supported by the hardware. - - To avoid changing the physical monitor resolution, it is also preferable to - use ``pygame.display.get_desktop_sizes()`` to determine the fullscreen - resolution. Developers are strongly advised to default to the current - physical monitor resolution unless the user explicitly requests a different - one (e.g. in an options menu or configuration file). - - .. versionchangedold:: 1.9.5 ``display`` argument added - - .. ## pygame.display.list_modes ## - -.. function:: mode_ok - - | :sl:`Pick the best color depth for a display mode` - | :sg:`mode_ok(size, flags=0, depth=0, display=0) -> depth` - - This function uses the same arguments as ``pygame.display.set_mode()``. It - is used to determine if a requested display mode is available. It will - return ``0`` if the display mode cannot be set. Otherwise it will return a - pixel depth that best matches the display asked for. - - Usually the depth argument is not passed, but some platforms can support - multiple display depths. If passed it will hint to which depth is a better - match. - - The function will return ``0`` if the passed display flags cannot be set. - - The display index ``0`` means the default display is used. - - .. versionchangedold:: 1.9.5 ``display`` argument added - - .. ## pygame.display.mode_ok ## - -.. function:: gl_get_attribute - - | :sl:`Get the value for an OpenGL flag for the current display` - | :sg:`gl_get_attribute(flag, /) -> value` - - After calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag, - it is a good idea to check the value of any requested OpenGL attributes. See - ``pygame.display.gl_set_attribute()`` for a list of valid flags. - - .. ## pygame.display.gl_get_attribute ## - -.. function:: gl_set_attribute - - | :sl:`Request an OpenGL display attribute for the display mode` - | :sg:`gl_set_attribute(flag, value, /) -> None` - - When calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag, - Pygame automatically handles setting the OpenGL attributes like color and - double-buffering. OpenGL offers several other attributes you may want control - over. Pass one of these attributes as the flag, and its appropriate value. - This must be called before ``pygame.display.set_mode()``. - - Many settings are the requested minimum. Creating a window with an OpenGL context - will fail if OpenGL cannot provide the requested attribute, but it may for example - give you a stencil buffer even if you request none, or it may give you a larger - one than requested. - - The ``OPENGL`` flags are: - - :: - - GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE, - GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE, - GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO - - :const:`GL_MULTISAMPLEBUFFERS` - - Whether to enable multisampling anti-aliasing. - Defaults to 0 (disabled). - - Set ``GL_MULTISAMPLESAMPLES`` to a value - above 0 to control the amount of anti-aliasing. - A typical value is 2 or 3. - - :const:`GL_STENCIL_SIZE` - - Minimum bit size of the stencil buffer. Defaults to 0. - - :const:`GL_DEPTH_SIZE` - - Minimum bit size of the depth buffer. Defaults to 16. - - :const:`GL_STEREO` - - 1 enables stereo 3D. Defaults to 0. - - :const:`GL_BUFFER_SIZE` - - Minimum bit size of the frame buffer. Defaults to 0. - - .. versionaddedold:: 2.0.0 Additional attributes: - - :: - - GL_ACCELERATED_VISUAL, - GL_CONTEXT_MAJOR_VERSION, GL_CONTEXT_MINOR_VERSION, - GL_CONTEXT_FLAGS, GL_CONTEXT_PROFILE_MASK, - GL_SHARE_WITH_CURRENT_CONTEXT, - GL_CONTEXT_RELEASE_BEHAVIOR, - GL_FRAMEBUFFER_SRGB_CAPABLE - - :const:`GL_CONTEXT_PROFILE_MASK` - - Sets the OpenGL profile to one of these values: - - :: - - GL_CONTEXT_PROFILE_CORE disable deprecated features - GL_CONTEXT_PROFILE_COMPATIBILITY allow deprecated features - GL_CONTEXT_PROFILE_ES allow only the ES feature - subset of OpenGL - - :const:`GL_ACCELERATED_VISUAL` - - Set to 1 to require hardware acceleration, or 0 to force software render. - By default, both are allowed. - - .. ## pygame.display.gl_set_attribute ## - -.. function:: get_active - - | :sl:`Returns True when the display is active on the screen` - | :sg:`get_active() -> bool` - - Returns True when the display Surface is considered actively - renderable on the screen and may be visible to the user. This is - the default state immediately after ``pygame.display.set_mode()``. - This method may return True even if the application is fully hidden - behind another application window. - - This will return False if the display Surface has been iconified or - minimized (either via ``pygame.display.iconify()`` or via an OS - specific method such as the minimize-icon available on most - desktops). - - The method can also return False for other reasons without the - application being explicitly iconified or minimized by the user. A - notable example being if the user has multiple virtual desktops and - the display Surface is not on the active virtual desktop. - - .. note:: This function returning True is unrelated to whether the - application has input focus. Please see - ``pygame.key.get_focused()`` and ``pygame.mouse.get_focused()`` - for APIs related to input focus. - - .. ## pygame.display.get_active ## - -.. function:: iconify - - | :sl:`Iconify the display surface` - | :sg:`iconify() -> bool` - - Request the window for the display surface be iconified or hidden. Not all - systems and displays support an iconified display. The function will return - True if successful. - - When the display is iconified ``pygame.display.get_active()`` will return - ``False``. The event queue should receive an ``ACTIVEEVENT`` event when the - window has been iconified. Additionally, the event queue also receives a - ``WINDOWEVENT_MINIMIZED`` event when the window has been iconified on pygame 2. - - .. ## pygame.display.iconify ## - -.. function:: toggle_fullscreen - - | :sl:`Switch between fullscreen and windowed displays` - | :sg:`toggle_fullscreen() -> int` - - Switches the display window between windowed and fullscreen modes. - Display driver support is not great when using pygame 1, but with - pygame 2 it is the most reliable method to switch to and from fullscreen. - - Supported display drivers in pygame 1: - - * x11 (Linux/Unix) - * wayland (Linux/Unix) - - Supported display drivers in pygame 2: - - * windows (Windows) - * x11 (Linux/Unix) - * wayland (Linux/Unix) - * cocoa (OSX/Mac) - - .. Note:: :func:`toggle_fullscreen` doesn't work on Windows - unless the window size is in :func:`pygame.display.list_modes()` or - the window is created with the flag ``pygame.SCALED``. - See `issue #1221 `_. - - .. ## pygame.display.toggle_fullscreen ## - -.. function:: set_gamma - - | :sl:`Change the hardware gamma ramps` - | :sg:`set_gamma(red, green=None, blue=None, /) -> bool` - - DEPRECATED: This functionality will go away in SDL3. - - Set the red, green, and blue gamma values on the display hardware. If the - green and blue arguments are not passed, they will both be the same as red. - Not all systems and hardware support gamma ramps, if the function succeeds - it will return ``True``. - - A gamma value of ``1.0`` creates a linear color table. Lower values will - darken the display and higher values will brighten. - - .. deprecated:: 2.1.4 - - .. ## pygame.display.set_gamma ## - -.. function:: set_gamma_ramp - - | :sl:`Change the hardware gamma ramps with a custom lookup` - | :sg:`set_gamma_ramp(red, green, blue, /) -> bool` - - DEPRECATED: This functionality will go away in SDL3. - - Set the red, green, and blue gamma ramps with an explicit lookup table. Each - argument should be sequence of 256 integers. The integers should range - between ``0`` and ``0xffff``. Not all systems and hardware support gamma - ramps, if the function succeeds it will return ``True``. - - .. deprecated:: 2.1.4 - - .. ## pygame.display.set_gamma_ramp ## - -.. function:: set_icon - - | :sl:`Change the system image for the display window` - | :sg:`set_icon(surface, /) -> None` - - Sets the runtime icon the system will use to represent the display window. - All windows default to a simple pygame logo for the window icon. - - Note that calling this function implicitly initializes ``pygame.display``, if - it was not initialized before. - - You can pass any surface, but most systems want a smaller image around - 32x32. The image can have colorkey transparency which will be passed to the - system. - - Some systems do not allow the window icon to change after it has been shown. - This function can be called before ``pygame.display.set_mode()`` to create - the icon before the display mode is set. - - .. ## pygame.display.set_icon ## - -.. function:: set_caption - - | :sl:`Set the current window caption` - | :sg:`set_caption(title, icontitle=None, /) -> None` - - If the display has a window title, this function will change the name on the - window. In pygame 1.x, some systems supported an alternate shorter title to - be used for minimized displays, but in pygame 2 ``icontitle`` does nothing. - - .. ## pygame.display.set_caption ## - -.. function:: get_caption - - | :sl:`Get the current window caption` - | :sg:`get_caption() -> (title, icontitle)` - - Returns the title and icontitle of the display window. In pygame 2.x - these will always be the same value. - - .. ## pygame.display.get_caption ## - -.. function:: set_palette - - | :sl:`Set the display color palette for indexed displays` - | :sg:`set_palette(palette=None, /) -> None` - - This will change the video display color palette for 8-bit displays. This - does not change the palette for the actual display Surface, only the palette - that is used to display the Surface. If no palette argument is passed, the - system default palette will be restored. The palette is a sequence of - ``RGB`` triplets. - - .. ## pygame.display.set_palette ## - -.. function:: get_num_displays - - | :sl:`Return the number of displays` - | :sg:`get_num_displays() -> int` - - Returns the number of available displays. This is always 1 if - :func:`pygame.get_sdl_version()` returns a major version number below 2. - - .. versionaddedold:: 1.9.5 - - .. ## pygame.display.get_num_displays ## - -.. function:: get_window_size - - | :sl:`Return the size of the window or screen` - | :sg:`get_window_size() -> tuple` - - Returns the size of the window initialized with :func:`pygame.display.set_mode()`. - This may differ from the size of the display surface if ``SCALED`` is used. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.display.get_window_size ## - -.. function:: get_window_position - - | :sl:`Return the position of the window or screen` - | :sg:`get_window_position() -> tuple` - - Returns the position of the window initialized with :func:`pygame.display.set_mode()`. - The position will change when the user moves the window or when the position is set manually with :func:`pygame.display.set_window_position()`. - Coordinates could be negative or outside the desktop size bounds. - The position is relative to the topleft of the primary monitor and the y coordinate ignores the window frame. - - .. ## pygame.display.get_window_position ## - -.. function:: set_window_position - - | :sl:`Set the current window position` - | :sg:`set_window_position((x, y)) -> None` - - Sets the position of the window initialized with :func:`pygame.display.set_mode()`. - This differs from updating environment variables as this function can be called after the display has been initialised. - The position is expected to be relative to the topleft of the primary monitor. - The y coordinate will ignore the window frame (y = 0 means the frame is hidden). - The user will still be able to move the window after this call. See also :func:`pygame.display.get_window_position()`. - - .. ## pygame.display.set_window_position ## - -.. function:: get_allow_screensaver - - | :sl:`Return whether the screensaver is allowed to run.` - | :sg:`get_allow_screensaver() -> bool` - - Return whether screensaver is allowed to run whilst the app is running. - Default is ``False``. - By default pygame does not allow the screensaver during game play. - - .. note:: Some platforms do not have a screensaver or support - disabling the screensaver. Please see - :func:`pygame.display.set_allow_screensaver()` for - caveats with screensaver support. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.display.get_allow_screensaver ## - -.. function:: set_allow_screensaver - - | :sl:`Set whether the screensaver may run` - | :sg:`set_allow_screensaver(bool) -> None` - - Change whether screensavers should be allowed whilst the app is running. - The default value of the argument to the function is True. - By default pygame does not allow the screensaver during game play. - - If the screensaver has been disallowed due to this function, it will automatically - be allowed to run when :func:`pygame.quit()` is called. - - It is possible to influence the default value via the environment variable - ``SDL_HINT_VIDEO_ALLOW_SCREENSAVER``, which can be set to either ``0`` (disable) - or ``1`` (enable). - - .. note:: Disabling screensaver is subject to platform support. - When platform support is absent, this function will - silently appear to work even though the screensaver state - is unchanged. The lack of feedback is due to SDL not - providing any supported method for determining whether - it supports changing the screensaver state. - - .. versionaddedold:: 2.0.0 - -.. function:: is_fullscreen - - | :sl:`Returns True if the pygame window created by pygame.display.set_mode() is in full-screen mode` - | :sg:`is_fullscreen() -> bool` - - Edge cases: - If the window is in windowed mode, but maximized, this will return `False`. - If the window is in "borderless fullscreen" mode, this will return `True`. - - .. versionadded:: 2.2.0 - -.. function:: is_vsync - - | :sl:`Returns True if vertical synchronisation for pygame.display.flip() and pygame.display.update() is enabled` - | :sg:`is_vsync() -> bool` - - .. versionadded:: 2.2.0 - -.. function:: get_current_refresh_rate() -> int - - | :sl:`Returns the screen refresh rate or 0 if unknown` - | :sg:`get_current_refresh_rate() -> int` - - The screen refresh rate for the current window. In windowed mode, this - should be equal to the refresh rate of the desktop the window is on. - - If no window is open, an exception is raised. - - When a constant refresh rate cannot be determined, 0 is returned. - - .. versionadded:: 2.2.0 - -.. function:: get_desktop_refresh_rates() -> list - - | :sl:`Returns the screen refresh rates for all displays (in windowed mode).` - | :sg:`get_desktop_refresh_rates() -> list` - - If the current window is in full-screen mode, the actual refresh rate for - that window can differ. - - This is safe to call when no window is open (i.e. before any calls to - :func:`pygame.display.set_mode()` - - When a constant refresh rate cannot be determined, 0 is returned for that - desktop. - - - .. versionadded:: 2.2.0 - .. ## pygame.display.set_allow_screensaver ## - -.. function:: message_box - - | :sl:`Create a native GUI message box` - | :sg:`message_box(title, message=None, message_type='info', parent_window=None, buttons=('OK',), return_button=0, escape_button=None) -> int` - - :param str title: A title string. - :param str message: A message string. If this parameter is set to ``None``, the message will be the title. - :param str message_type: Set the type of message_box, could be ``"info"``, ``"warn"`` or ``"error"``. - :param Window parent_window: The parent window of the message box. - :param tuple buttons: An optional sequence of button name strings to show to the user. - :param int return_button: Button index to use if the return key is hit, ``0`` by default. - :param int escape_button: Button index to use if the escape key is hit, ``None`` for no button linked by default. - - :return: The index of the button that was pushed. - - This function should be called on the thread that ``set_mode()`` is called. - It will block execution of that thread until the user clicks a button or - closes the message_box. - - This function may be called at any time, even before ``pygame.init()``. - - Negative values of ``return_button`` and ``escape_button`` are allowed - just like standard Python list indexing. - - .. versionadded:: 2.4.0 - - -.. ## pygame.display ## +.. autopgmodule:: pygame.display + :members: diff --git a/src_c/doc/display_doc.h b/src_c/doc/display_doc.h index 8e03e368fe..45493140ab 100644 --- a/src_c/doc/display_doc.h +++ b/src_c/doc/display_doc.h @@ -1,37 +1,37 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_DISPLAY "pygame module to control the display window and screen" -#define DOC_DISPLAY_INIT "init() -> None\nInitialize the display module" -#define DOC_DISPLAY_QUIT "quit() -> None\nUninitialize the display module" -#define DOC_DISPLAY_GETINIT "get_init() -> bool\nReturns True if the display module has been initialized" -#define DOC_DISPLAY_SETMODE "set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface\nInitialize a window or screen for display" -#define DOC_DISPLAY_GETSURFACE "get_surface() -> Surface\nget_surface() -> None\nGet a reference to the currently set display surface" -#define DOC_DISPLAY_FLIP "flip() -> None\nUpdate the full display Surface to the screen" -#define DOC_DISPLAY_UPDATE "update() -> None\nupdate(rectangle, /) -> None\nupdate(x, y, w, h, /) -> None\nupdate((x, y), (w, h), /) -> None\nupdate(rectangle_iterable, /) -> None\nUpdate all, or a portion, of the display. For non-OpenGL displays." -#define DOC_DISPLAY_GETDRIVER "get_driver() -> name\nGet the name of the pygame display backend" -#define DOC_DISPLAY_INFO "Info() -> VideoInfo\nCreate a video display information object" -#define DOC_DISPLAY_GETWMINFO "get_wm_info() -> dict\nGet information about the current windowing system" -#define DOC_DISPLAY_GETDESKTOPSIZES "get_desktop_sizes() -> list\nGet sizes of active desktops" -#define DOC_DISPLAY_LISTMODES "list_modes(depth=0, flags=pygame.FULLSCREEN, display=0) -> list\nGet list of available fullscreen modes" -#define DOC_DISPLAY_MODEOK "mode_ok(size, flags=0, depth=0, display=0) -> depth\nPick the best color depth for a display mode" -#define DOC_DISPLAY_GLGETATTRIBUTE "gl_get_attribute(flag, /) -> value\nGet the value for an OpenGL flag for the current display" -#define DOC_DISPLAY_GLSETATTRIBUTE "gl_set_attribute(flag, value, /) -> None\nRequest an OpenGL display attribute for the display mode" -#define DOC_DISPLAY_GETACTIVE "get_active() -> bool\nReturns True when the display is active on the screen" -#define DOC_DISPLAY_ICONIFY "iconify() -> bool\nIconify the display surface" -#define DOC_DISPLAY_TOGGLEFULLSCREEN "toggle_fullscreen() -> int\nSwitch between fullscreen and windowed displays" -#define DOC_DISPLAY_SETGAMMA "set_gamma(red, green=None, blue=None, /) -> bool\nChange the hardware gamma ramps" -#define DOC_DISPLAY_SETGAMMARAMP "set_gamma_ramp(red, green, blue, /) -> bool\nChange the hardware gamma ramps with a custom lookup" -#define DOC_DISPLAY_SETICON "set_icon(surface, /) -> None\nChange the system image for the display window" -#define DOC_DISPLAY_SETCAPTION "set_caption(title, icontitle=None, /) -> None\nSet the current window caption" -#define DOC_DISPLAY_GETCAPTION "get_caption() -> (title, icontitle)\nGet the current window caption" -#define DOC_DISPLAY_SETPALETTE "set_palette(palette=None, /) -> None\nSet the display color palette for indexed displays" -#define DOC_DISPLAY_GETNUMDISPLAYS "get_num_displays() -> int\nReturn the number of displays" -#define DOC_DISPLAY_GETWINDOWSIZE "get_window_size() -> tuple\nReturn the size of the window or screen" -#define DOC_DISPLAY_GETWINDOWPOSITION "get_window_position() -> tuple\nReturn the position of the window or screen" -#define DOC_DISPLAY_SETWINDOWPOSITION "set_window_position((x, y)) -> None\nSet the current window position" +#define DOC_DISPLAY "Pygame module to control the display window and screen." +#define DOC_DISPLAY_INIT "init() -> None\nInitialize the display module." +#define DOC_DISPLAY_QUIT "quit() -> None\nUninitialize the display module." +#define DOC_DISPLAY_GETINIT "get_init() -> bool\nReturns True if the display module has been initialized." +#define DOC_DISPLAY_SETMODE "set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> pygame.surface.Surface\nInitialize a window or screen for display." +#define DOC_DISPLAY_GETSURFACE "get_surface() -> Optional[pygame.surface.Surface]\nGet a reference to the currently set display surface." +#define DOC_DISPLAY_FLIP "flip() -> None\nUpdate the full display Surface to the screen." +#define DOC_DISPLAY_UPDATE "update() -> None\nupdate(rectangle, /) -> None\nupdate(x, y, w, h, /) -> None\nupdate(xy, wh, /) -> None\nUpdate all, or a portion, of the display. For non-OpenGL displays." +#define DOC_DISPLAY_GETDRIVER "get_driver() -> str\nGet the name of the pygame display backend." +#define DOC_DISPLAY_INFO "Info() -> _VidInfo\nCreate a video display information object." +#define DOC_DISPLAY_GETWMINFO "get_wm_info() -> dict[str, int]\nGet information about the current windowing system." +#define DOC_DISPLAY_GETDESKTOPSIZES "get_desktop_sizes() -> list[tuple[int, int]]\nGet sizes of active desktops." +#define DOC_DISPLAY_LISTMODES "list_modes(depth=0, flags=FULLSCREEN, display=0) -> list[tuple[int, int]]\nGet list of available fullscreen modes." +#define DOC_DISPLAY_MODEOK "mode_ok(size, flags=0, depth=0, display=0) -> int\nPick the best color depth for a display mode." +#define DOC_DISPLAY_GLGETATTRIBUTE "gl_get_attribute(flag, /) -> int\nGet the value for an OpenGL flag for the current display." +#define DOC_DISPLAY_GLSETATTRIBUTE "gl_set_attribute(flag, value, /) -> None\nRequest an OpenGL display attribute for the display mode." +#define DOC_DISPLAY_GETACTIVE "get_active() -> bool\nReturns True when the display is active on the screen." +#define DOC_DISPLAY_ICONIFY "iconify() -> bool\nIconify the display surface." +#define DOC_DISPLAY_TOGGLEFULLSCREEN "toggle_fullscreen() -> int\nSwitch between fullscreen and windowed displays." +#define DOC_DISPLAY_SETGAMMA "set_gamma(red, green=..., blue=..., /) -> int\nChange the hardware gamma ramps." +#define DOC_DISPLAY_SETGAMMARAMP "set_gamma_ramp(red, green, blue, /) -> int\nChange the hardware gamma ramps with a custom lookup." +#define DOC_DISPLAY_SETICON "set_icon(surface, /) -> None\nChange the system image for the display window." +#define DOC_DISPLAY_SETCAPTION "set_caption(title, icontitle=None, /) -> None\nSet the current window caption." +#define DOC_DISPLAY_GETCAPTION "get_caption() -> tuple[str, str]\nGet the current window caption." +#define DOC_DISPLAY_SETPALETTE "set_palette(palette, /) -> None\nSet the display color palette for indexed displays." +#define DOC_DISPLAY_GETNUMDISPLAYS "get_num_displays() -> int\nReturn the number of displays." +#define DOC_DISPLAY_GETWINDOWSIZE "get_window_size() -> tuple[int, int]\nReturn the size of the window or screen." +#define DOC_DISPLAY_GETWINDOWPOSITION "get_window_position() -> tuple[int, int]\nReturn the position of the window or screen." +#define DOC_DISPLAY_SETWINDOWPOSITION "set_window_position(position) -> None\nSet the current window position." #define DOC_DISPLAY_GETALLOWSCREENSAVER "get_allow_screensaver() -> bool\nReturn whether the screensaver is allowed to run." -#define DOC_DISPLAY_SETALLOWSCREENSAVER "set_allow_screensaver(bool) -> None\nSet whether the screensaver may run" -#define DOC_DISPLAY_ISFULLSCREEN "is_fullscreen() -> bool\nReturns True if the pygame window created by pygame.display.set_mode() is in full-screen mode" -#define DOC_DISPLAY_ISVSYNC "is_vsync() -> bool\nReturns True if vertical synchronisation for pygame.display.flip() and pygame.display.update() is enabled" -#define DOC_DISPLAY_GETCURRENTREFRESHRATE "get_current_refresh_rate() -> int\nReturns the screen refresh rate or 0 if unknown" -#define DOC_DISPLAY_GETDESKTOPREFRESHRATES "get_desktop_refresh_rates() -> list\nReturns the screen refresh rates for all displays (in windowed mode)." -#define DOC_DISPLAY_MESSAGEBOX "message_box(title, message=None, message_type='info', parent_window=None, buttons=('OK',), return_button=0, escape_button=None) -> int\nCreate a native GUI message box" +#define DOC_DISPLAY_SETALLOWSCREENSAVER "set_allow_screensaver(value=True) -> None\nSet whether the screensaver may run." +#define DOC_DISPLAY_ISFULLSCREEN "is_fullscreen() -> bool\nReturns True if the pygame window created by pygame.display.set_mode() is in full-screen mode." +#define DOC_DISPLAY_ISVSYNC "is_vsync() -> bool\nReturns True if vertical synchronisation for pygame.display.flip() and pygame.display.update() is enabled." +#define DOC_DISPLAY_GETCURRENTREFRESHRATE "get_current_refresh_rate() -> int\nReturns the screen refresh rate or 0 if unknown." +#define DOC_DISPLAY_GETDESKTOPREFRESHRATES "get_desktop_refresh_rates() -> list[int]\nReturns the screen refresh rates for all displays (in windowed mode)." +#define DOC_DISPLAY_MESSAGEBOX "message_box(title, message=None, message_type='info', parent_window=None, buttons=('OK', ), return_button=0, escape_button=None) -> int\nCreate a native GUI message box." From 57de7496e16ecb102ef0f0162ed5814fecdf4a2b Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Fri, 17 Jan 2025 22:11:31 +0100 Subject: [PATCH 036/441] Move system docs to stubs --- buildconfig/stubs/pygame/system.pyi | 187 ++++++++++++++++++++++++++- docs/reST/ref/system.rst | 193 +--------------------------- src_c/doc/system_doc.h | 12 +- 3 files changed, 191 insertions(+), 201 deletions(-) diff --git a/buildconfig/stubs/pygame/system.pyi b/buildconfig/stubs/pygame/system.pyi index 514af9a134..d86c1950f1 100644 --- a/buildconfig/stubs/pygame/system.pyi +++ b/buildconfig/stubs/pygame/system.pyi @@ -1,3 +1,8 @@ +"""Pygame module to provide additional context about the system. + +.. versionadded:: 2.2.0 +""" + from typing import Optional, TypedDict from pygame._data_classes import PowerState @@ -23,8 +28,180 @@ class _Locale(TypedDict): language: str country: Optional[str] -def get_cpu_instruction_sets() -> _InstructionSets: ... -def get_total_ram() -> int: ... -def get_pref_path(org: str, app: str) -> str: ... -def get_pref_locales() -> list[_Locale]: ... -def get_power_state() -> Optional[PowerState]: ... +def get_cpu_instruction_sets() -> _InstructionSets: + """Get the information of CPU instruction sets. + + Returns a dict of the information of CPU instruction sets. The keys of + the dict are the names of instruction sets and the values determine + whether the instruction set is available. + + Some of functions like ``Surface.blit`` can be accelerated by SIMD + instruction sets like SSE2 or AVX2. By checking the availability of + instruction sets, you can check if these accelerations are available. + + Here is an example of the returned dict + :: + + { + 'ALTIVEC': False, + 'MMX': True, + 'SSE': True, + 'SSE2': True, + 'SSE3': True, + 'SSE41': True, + 'SSE42': True, + 'AVX': True, + 'AVX2': True, + 'AVX512F': False, + 'NEON': False, + 'ARMSIMD': False, + 'LSX': False, + 'LASX': False + } + + .. note:: The values of ``LSX`` and ``LASX`` will be always False if + SDL version < 2.24.0. + + .. versionadded:: 2.3.1 + + .. versionchanged:: 2.4.0 removed ``RDTSC`` key, + as it has been removed in pre-release SDL3 + """ + +def get_total_ram() -> int: + """Get the amount of RAM configured in the system. + + Returns the amount of RAM configured in the system in MiB. + + .. versionadded:: 2.3.1 + """ + +def get_pref_path(org: str, app: str) -> str: + """Get a writeable folder for your app. + + When distributing apps, it's helpful to have a way to get a writeable path, + because it's what apps are expected to do, and because sometimes the local + space around the app isn't writeable to the app. + + This function returns a platform specific path for your app to store + savegames, settings, and the like. This path is unique per user and + per app name. + + It takes two strings, ``org`` and ``app``, referring to the "organization" + and "application name." For example, the organization could be "Valve," + and the application name could be "Half Life 2." It then will figure out the + preferred path, **creating the folders referenced by the path if necessary**, + and return a string containing the absolute path. + + For example:: + + On Windows, it would resemble + C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\ + + On macOS, it would resemble + /Users/bob/Library/Application Support/My Company/My Program Name/ + + And on Linux it would resemble + /home/bob/.local/share/My Company/My Program Name/ + + .. note:: + Since the organization and app names can potentially be used as + a folder name, it is highly encouraged to avoid punctuation. + Instead stick to letters, numbers, and spaces. + + .. note:: + The ``appdirs`` library has similar functionality for this use case, + but has more "folder types" to choose from. + + .. versionadded:: 2.2.0 + """ + +def get_pref_locales() -> list[_Locale]: + """Get preferred locales set on the system. + + Returns a list of "locale" dicts, sorted in descending order of preference + set on the host OS (the most preferred locale is the first element). May + also be an empty list if pygame could not find this information. + + Each "locale" dict contains the language code which can be accessed by the + key ``"language"``. This language code is an ISO-639 language specifier + (such as "en" for English, "de" for German, etc). + A "locale" dict may also optionally contain a ``"country"`` field, whose + value is an ISO-3166 country code (such as "US" for the United States, + "CA" for Canada, etc). If this field is not set or undetermined, it is + ``None``. + A "locale" dict which looks like ``{'language': 'en', 'country': 'US'}`` + indicates the user prefers American English, while + ``{'language': 'en', 'country': None}`` indicates that the user prefers + English, generically. + + This might be a bit of an expensive call because it has to query the OS. So + this function must not be called in a game loop, instead it's best to ask + for this once and save the results. However, this list can change when the + user changes a system preference outside of your program. pygame will send + a ``LOCALECHANGED`` event in this case, if possible, and you can call this + function again to get an updated copy of preferred locales. + + .. versionadded:: 2.2.0 + """ + +def get_power_state() -> Optional[PowerState]: + """Get the current power supply state. + + **Experimental:** feature available for testing and feedback. + We don't anticipate it changing, but it might if something important + is brought up. `Please leave get_power_state feedback with + authors `_ + + Returns a ``PowerState`` object representing the power supply state. + + Returns ``None`` if the power state is unknown. + + The PowerState object has several attributes: + + .. code-block:: text + + battery_percent: + An integer between 0 and 100, representing the percentage of + battery life left. + + battery_seconds: + An integer, representing the seconds of battery life left. + Could be None if the value is unknown. + + on_battery: + True if the device is running on the battery (not plugged in). + + no_battery: + True if the device has no battery available (plugged in). + + charging: + True if the device is charging battery (plugged in). + + charged: + True if the battery of the device is fully charged (plugged in). + + plugged_in: + True if the device is plugged in. + Equivalent to `not on_battery`. + + has_battery: + True if the device has battery. + Equivalent to `on_battery or not no_battery`. + + + You should never take a battery status as absolute truth. Batteries + (especially failing batteries) are delicate hardware, and the values + reported here are best estimates based on what that hardware reports. It's + not uncommon for older batteries to lose stored power much faster than it + reports, or completely drain when reporting it has 20 percent left, etc. + + Battery status can change at any time; if you are concerned with power + state, you should call this function frequently, and perhaps ignore changes + until they seem to be stable for a few seconds. + + It's possible a platform can only report battery percentage or time left + but not both. + + .. versionadded:: 2.4.0 + """ diff --git a/docs/reST/ref/system.rst b/docs/reST/ref/system.rst index de5cb55daf..d2b74addd8 100644 --- a/docs/reST/ref/system.rst +++ b/docs/reST/ref/system.rst @@ -1,194 +1,7 @@ .. include:: common.txt :mod:`pygame.system` -====================== +==================== -.. module:: pygame.system - :synopsis: pygame module to provide additional context about the system - -| :sl:`pygame module to provide additional context about the system` - -.. versionadded:: 2.2.0 - -.. function:: get_cpu_instruction_sets - - | :sl:`get the information of CPU instruction sets` - | :sg:`get_cpu_instruction_sets() -> instruction_sets` - - Returns a dict of the information of CPU instruction sets. The keys of - the dict are the names of instruction sets and the values determine - whether the instruction set is available. - - Some of functions like ``Surface.blit`` can be accelerated by SIMD - instruction sets like SSE2 or AVX2. By checking the availability of - instruction sets, you can check if these accelerations are available. - - Here is an example of the returned dict - :: - - { - 'ALTIVEC': False, - 'MMX': True, - 'SSE': True, - 'SSE2': True, - 'SSE3': True, - 'SSE41': True, - 'SSE42': True, - 'AVX': True, - 'AVX2': True, - 'AVX512F': False, - 'NEON': False, - 'ARMSIMD': False, - 'LSX': False, - 'LASX': False - } - - .. Note:: The values of ``LSX`` and ``LASX`` will be always False if - SDL version < 2.24.0. - - .. versionadded:: 2.3.1 - - .. versionchanged:: 2.4.0 removed ``RDTSC`` key, - as it has been removed in pre-release SDL3 - -.. function:: get_total_ram - - | :sl:`get the amount of RAM configured in the system` - | :sg:`get_total_ram() -> ram_size` - - Returns the amount of RAM configured in the system in MiB. - - .. versionadded:: 2.3.1 - -.. function:: get_pref_path - - | :sl:`get a writeable folder for your app` - | :sg:`get_pref_path(org, app) -> path` - - When distributing apps, it's helpful to have a way to get a writeable path, - because it's what apps are expected to do, and because sometimes the local - space around the app isn't writeable to the app. - - This function returns a platform specific path for your app to store - savegames, settings, and the like. This path is unique per user and - per app name. - - It takes two strings, ``org`` and ``app``, referring to the "organization" - and "application name." For example, the organization could be "Valve," - and the application name could be "Half Life 2." It then will figure out the - preferred path, **creating the folders referenced by the path if necessary**, - and return a string containing the absolute path. - - For example:: - - On Windows, it would resemble - C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\ - - On macOS, it would resemble - /Users/bob/Library/Application Support/My Company/My Program Name/ - - And on Linux it would resemble - /home/bob/.local/share/My Company/My Program Name/ - - .. note:: - Since the organization and app names can potentially be used as - a folder name, it is highly encouraged to avoid punctuation. - Instead stick to letters, numbers, and spaces. - - .. note:: - The ``appdirs`` library has similar functionality for this use case, - but has more "folder types" to choose from. - - .. versionadded:: 2.2.0 - -.. function:: get_pref_locales - - | :sl:`get preferred locales set on the system` - | :sg:`get_pref_locales() -> list[locale]` - - Returns a list of "locale" dicts, sorted in descending order of preference - set on the host OS (the most preferred locale is the first element). May - also be an empty list if pygame could not find this information. - - Each "locale" dict contains the language code which can be accessed by the - key ``"language"``. This language code is an ISO-639 language specifier - (such as "en" for English, "de" for German, etc). - A "locale" dict may also optionally contain a ``"country"`` field, whose - value is an ISO-3166 country code (such as "US" for the United States, - "CA" for Canada, etc). If this field is not set or undetermined, it is - ``None``. - A "locale" dict which looks like ``{'language': 'en', 'country': 'US'}`` - indicates the user prefers American English, while - ``{'language': 'en', 'country': None}`` indicates that the user prefers - English, generically. - - This might be a bit of an expensive call because it has to query the OS. So - this function must not be called in a game loop, instead it's best to ask - for this once and save the results. However, this list can change when the - user changes a system preference outside of your program. pygame will send - a ``LOCALECHANGED`` event in this case, if possible, and you can call this - function again to get an updated copy of preferred locales. - - .. versionadded:: 2.2.0 - -.. function:: get_power_state - - | :sl:`get the current power supply state` - | :sg:`get_pref_power_state() -> PowerState` - - **Experimental:** feature available for testing and feedback. - We don't anticipate it changing, but it might if something important - is brought up. `Please leave get_power_state feedback with - authors `_ - - Returns a ``PowerState`` object representing the power supply state. - - Returns ``None`` if the power state is unknown. - - The PowerState object has several attributes: - - .. code-block:: text - - battery_percent: - An integer between 0 and 100, representing the percentage of - battery life left. - - battery_seconds: - An integer, representing the seconds of battery life left. - Could be None if the value is unknown. - - on_battery: - True if the device is running on the battery (not plugged in). - - no_battery: - True if the device has no battery available (plugged in). - - charging: - True if the device is charging battery (plugged in). - - charged: - True if the battery of the device is fully charged (plugged in). - - plugged_in: - True if the device is plugged in. - Equivalent to `not on_battery`. - - has_battery: - True if the device has battery. - Equivalent to `on_battery or not no_battery`. - - - You should never take a battery status as absolute truth. Batteries - (especially failing batteries) are delicate hardware, and the values - reported here are best estimates based on what that hardware reports. It's - not uncommon for older batteries to lose stored power much faster than it - reports, or completely drain when reporting it has 20 percent left, etc. - - Battery status can change at any time; if you are concerned with power - state, you should call this function frequently, and perhaps ignore changes - until they seem to be stable for a few seconds. - - It's possible a platform can only report battery percentage or time left - but not both. - - .. versionadded:: 2.4.0 +.. autopgmodule:: pygame.system + :members: diff --git a/src_c/doc/system_doc.h b/src_c/doc/system_doc.h index 37f7775509..34a36b3551 100644 --- a/src_c/doc/system_doc.h +++ b/src_c/doc/system_doc.h @@ -1,7 +1,7 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_SYSTEM "pygame module to provide additional context about the system" -#define DOC_SYSTEM_GETCPUINSTRUCTIONSETS "get_cpu_instruction_sets() -> instruction_sets\nget the information of CPU instruction sets" -#define DOC_SYSTEM_GETTOTALRAM "get_total_ram() -> ram_size\nget the amount of RAM configured in the system" -#define DOC_SYSTEM_GETPREFPATH "get_pref_path(org, app) -> path\nget a writeable folder for your app" -#define DOC_SYSTEM_GETPREFLOCALES "get_pref_locales() -> list[locale]\nget preferred locales set on the system" -#define DOC_SYSTEM_GETPOWERSTATE "get_pref_power_state() -> PowerState\nget the current power supply state" +#define DOC_SYSTEM "Pygame module to provide additional context about the system." +#define DOC_SYSTEM_GETCPUINSTRUCTIONSETS "get_cpu_instruction_sets() -> _InstructionSets\nGet the information of CPU instruction sets." +#define DOC_SYSTEM_GETTOTALRAM "get_total_ram() -> int\nGet the amount of RAM configured in the system." +#define DOC_SYSTEM_GETPREFPATH "get_pref_path(org, app) -> str\nGet a writeable folder for your app." +#define DOC_SYSTEM_GETPREFLOCALES "get_pref_locales() -> list[_Locale]\nGet preferred locales set on the system." +#define DOC_SYSTEM_GETPOWERSTATE "get_power_state() -> Optional[pygame._data_classes.PowerState]\nGet the current power supply state." From e345f0ff2889f6977fe3de41bbd804f9239551ed Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Fri, 17 Jan 2025 22:22:14 +0100 Subject: [PATCH 037/441] Shorten return types in signatures --- docs/reST/ext/documenters.py | 4 ++++ src_c/doc/display_doc.h | 4 ++-- src_c/doc/system_doc.h | 2 +- src_c/doc/window_doc.h | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/reST/ext/documenters.py b/docs/reST/ext/documenters.py index 697127234f..b02a9739f4 100644 --- a/docs/reST/ext/documenters.py +++ b/docs/reST/ext/documenters.py @@ -1,6 +1,7 @@ import autoapi import autoapi.documenters from autoapi._objects import PythonClass +import re def build_signatures(object): @@ -45,6 +46,9 @@ def build_signatures(object): if ret in ("Optional", "Union"): ret = "..." + # Shorten "pygame.module.X" types to "X" + ret = re.sub(r"pygame(.[a-zA-Z0-9_]+)+", lambda x: x.group(1)[1:], ret) + yield f"| :sg:`{name}({arg_string}) -> {ret}`" diff --git a/src_c/doc/display_doc.h b/src_c/doc/display_doc.h index 45493140ab..b46a9d30af 100644 --- a/src_c/doc/display_doc.h +++ b/src_c/doc/display_doc.h @@ -3,8 +3,8 @@ #define DOC_DISPLAY_INIT "init() -> None\nInitialize the display module." #define DOC_DISPLAY_QUIT "quit() -> None\nUninitialize the display module." #define DOC_DISPLAY_GETINIT "get_init() -> bool\nReturns True if the display module has been initialized." -#define DOC_DISPLAY_SETMODE "set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> pygame.surface.Surface\nInitialize a window or screen for display." -#define DOC_DISPLAY_GETSURFACE "get_surface() -> Optional[pygame.surface.Surface]\nGet a reference to the currently set display surface." +#define DOC_DISPLAY_SETMODE "set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface\nInitialize a window or screen for display." +#define DOC_DISPLAY_GETSURFACE "get_surface() -> Optional[Surface]\nGet a reference to the currently set display surface." #define DOC_DISPLAY_FLIP "flip() -> None\nUpdate the full display Surface to the screen." #define DOC_DISPLAY_UPDATE "update() -> None\nupdate(rectangle, /) -> None\nupdate(x, y, w, h, /) -> None\nupdate(xy, wh, /) -> None\nUpdate all, or a portion, of the display. For non-OpenGL displays." #define DOC_DISPLAY_GETDRIVER "get_driver() -> str\nGet the name of the pygame display backend." diff --git a/src_c/doc/system_doc.h b/src_c/doc/system_doc.h index 34a36b3551..449f7defbe 100644 --- a/src_c/doc/system_doc.h +++ b/src_c/doc/system_doc.h @@ -4,4 +4,4 @@ #define DOC_SYSTEM_GETTOTALRAM "get_total_ram() -> int\nGet the amount of RAM configured in the system." #define DOC_SYSTEM_GETPREFPATH "get_pref_path(org, app) -> str\nGet a writeable folder for your app." #define DOC_SYSTEM_GETPREFLOCALES "get_pref_locales() -> list[_Locale]\nGet preferred locales set on the system." -#define DOC_SYSTEM_GETPOWERSTATE "get_power_state() -> Optional[pygame._data_classes.PowerState]\nGet the current power supply state." +#define DOC_SYSTEM_GETPOWERSTATE "get_power_state() -> Optional[PowerState]\nGet the current power supply state." diff --git a/src_c/doc/window_doc.h b/src_c/doc/window_doc.h index 654248adc2..665780a618 100644 --- a/src_c/doc/window_doc.h +++ b/src_c/doc/window_doc.h @@ -10,7 +10,7 @@ #define DOC_WINDOW_BORDERLESS "borderless -> bool\nGets or sets whether the window is borderless." #define DOC_WINDOW_ALWAYSONTOP "always_on_top -> bool\nGet or set whether the window is always on top." #define DOC_WINDOW_ID "id() -> int\nGet the unique window ID (**read-only**)." -#define DOC_WINDOW_MOUSERECT "mouse_rect() -> Optional[pygame.rect.Rect]\nGet or set the mouse confinement rectangle of the window." +#define DOC_WINDOW_MOUSERECT "mouse_rect() -> Optional[Rect]\nGet or set the mouse confinement rectangle of the window." #define DOC_WINDOW_SIZE "size() -> tuple[int, int]\nGet or set the window size in pixels." #define DOC_WINDOW_MINIMUMSIZE "minimum_size() -> tuple[int, int]\nGet or set the minimum size of the window's client area." #define DOC_WINDOW_MAXIMUMSIZE "maximum_size() -> tuple[int, int]\nGet or set the maximum size of the window's client area." @@ -19,7 +19,7 @@ #define DOC_WINDOW_OPENGL "opengl() -> bool\nGet if the window supports OpenGL." #define DOC_WINDOW_UTILITY "utility() -> bool\nGet if the window is an utility window (**read-only**)." #define DOC_WINDOW_FROMDISPLAYMODULE "from_display_module() -> Window\nCreate a Window object using window data from display module." -#define DOC_WINDOW_GETSURFACE "get_surface() -> pygame.surface.Surface\nGet the window surface." +#define DOC_WINDOW_GETSURFACE "get_surface() -> Surface\nGet the window surface." #define DOC_WINDOW_FLIP "flip() -> None\nUpdate the display surface to the window." #define DOC_WINDOW_SETWINDOWED "set_windowed() -> None\nEnable windowed mode (exit fullscreen)." #define DOC_WINDOW_SETFULLSCREEN "set_fullscreen(desktop=False) -> None\nEnter fullscreen." From d6134d3f5dbd44c934139ee962e7546e8bdc5146 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sun, 19 Jan 2025 11:40:40 +0100 Subject: [PATCH 038/441] Fix SyntaxWarning in Window docs --- buildconfig/stubs/pygame/window.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index cdb57e6c96..bf49e5cb2e 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -60,10 +60,10 @@ class Window: pygame.quit() raise SystemExit - Event behavior if multiple ``Window``\ s are created: When the close button is + Event behavior if multiple windows are created: When the close button is pressed, a ``WINDOWCLOSE`` event is sent. You need to explicitly destroy the window. Note that the event ``QUIT`` will only be sent if all - ``Window``\ s have been destroyed. + windows have been destroyed. .. code-block:: python From 8edbcafb27cd56fe271c9a9accc9304bf9637ba7 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:06:39 +0100 Subject: [PATCH 039/441] Fix formatting --- buildconfig/stubs/pygame/window.pyi | 6 +++++- docs/reST/ext/documenters.py | 7 ++++++- src_c/doc/window_doc.h | 24 ++++++++++++------------ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index 3202702212..c56a642f11 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -292,7 +292,11 @@ class Window: def maximum_size(self, value: Point) -> None: ... @property def position(self) -> tuple[int, int]: - """Get or set the window position in screen coordinates.""" + """Get or set the window position in screen coordinates. + + The position may be a tuple of (x, y) coordiantes or ``WINDOWPOS_CENTERED`` or + ``WINDOWPOS_UNDEFINED``. The origin is the topleft of the main display. + """ @position.setter def position(self, value: Union[int, Point]) -> None: ... diff --git a/docs/reST/ext/documenters.py b/docs/reST/ext/documenters.py index b02a9739f4..a25b2ba95b 100644 --- a/docs/reST/ext/documenters.py +++ b/docs/reST/ext/documenters.py @@ -41,6 +41,11 @@ def build_signatures(object): if arg_string: arg_string = arg_string[2:] + if object.obj["type"] == "property": + arg_string = "" + else: + arg_string = f"({arg_string})" + if ret.count("[") > 2 or ret.count(",") > 3: ret = ret.split("[")[0] if ret in ("Optional", "Union"): @@ -49,7 +54,7 @@ def build_signatures(object): # Shorten "pygame.module.X" types to "X" ret = re.sub(r"pygame(.[a-zA-Z0-9_]+)+", lambda x: x.group(1)[1:], ret) - yield f"| :sg:`{name}({arg_string}) -> {ret}`" + yield f"| :sg:`{name}{arg_string} -> {ret}`" def get_doc(env, obj): diff --git a/src_c/doc/window_doc.h b/src_c/doc/window_doc.h index 665780a618..6495da670e 100644 --- a/src_c/doc/window_doc.h +++ b/src_c/doc/window_doc.h @@ -1,23 +1,23 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_WINDOW "Window(title='pygame window', size=(640, 480), position=WINDOWPOS_UNDEFINED, **flags) -> Window\nPygame object that represents a window." +#define DOC_WINDOW "Window(title='pygame window', size=(640, 480), position=WINDOWPOS_UNDEFINED, *, fullscreen=..., fullscreen_desktop=..., opengl=..., vulkan=..., hidden=..., borderless=..., resizable=..., minimized=..., maximized=..., mouse_grabbed=..., keyboard_grabbed=..., input_focus=..., mouse_focus=..., allow_high_dpi=..., mouse_capture=..., always_on_top=..., utility=...) -> Window\nPygame object that represents a window." #define DOC_WINDOW_GRABMOUSE "grab_mouse -> bool\nGet or set the window's mouse grab mode." #define DOC_WINDOW_GRABKEYBOARD "grab_keyboard -> bool\nGet or set the window's keyboard grab mode." -#define DOC_WINDOW_MOUSEGRABBED "mouse_grabbed() -> bool\nGet if the mouse cursor is confined to the window (**read-only**)." -#define DOC_WINDOW_KEYBOARDGRABBED "keyboard_grabbed() -> bool\nGet if the keyboard shortcuts are captured by the window (**read-only**)." -#define DOC_WINDOW_FOCUSED "focused() -> bool\nGet if the window is focused (**read-only**)." +#define DOC_WINDOW_MOUSEGRABBED "mouse_grabbed -> bool\nGet if the mouse cursor is confined to the window (**read-only**)." +#define DOC_WINDOW_KEYBOARDGRABBED "keyboard_grabbed -> bool\nGet if the keyboard shortcuts are captured by the window (**read-only**)." +#define DOC_WINDOW_FOCUSED "focused -> bool\nGet if the window is focused (**read-only**)." #define DOC_WINDOW_TITLE "title -> str\nGet or set the window title." #define DOC_WINDOW_RESIZABLE "resizable -> bool\nGet or set whether the window is resizable." #define DOC_WINDOW_BORDERLESS "borderless -> bool\nGets or sets whether the window is borderless." #define DOC_WINDOW_ALWAYSONTOP "always_on_top -> bool\nGet or set whether the window is always on top." -#define DOC_WINDOW_ID "id() -> int\nGet the unique window ID (**read-only**)." -#define DOC_WINDOW_MOUSERECT "mouse_rect() -> Optional[Rect]\nGet or set the mouse confinement rectangle of the window." -#define DOC_WINDOW_SIZE "size() -> tuple[int, int]\nGet or set the window size in pixels." -#define DOC_WINDOW_MINIMUMSIZE "minimum_size() -> tuple[int, int]\nGet or set the minimum size of the window's client area." -#define DOC_WINDOW_MAXIMUMSIZE "maximum_size() -> tuple[int, int]\nGet or set the maximum size of the window's client area." -#define DOC_WINDOW_POSITION "position() -> tuple[int, int]\nGet or set the window position in screen coordinates." +#define DOC_WINDOW_ID "id -> int\nGet the unique window ID (**read-only**)." +#define DOC_WINDOW_MOUSERECT "mouse_rect -> Optional[Rect]\nGet or set the mouse confinement rectangle of the window." +#define DOC_WINDOW_SIZE "size -> tuple[int, int]\nGet or set the window size in pixels." +#define DOC_WINDOW_MINIMUMSIZE "minimum_size -> tuple[int, int]\nGet or set the minimum size of the window's client area." +#define DOC_WINDOW_MAXIMUMSIZE "maximum_size -> tuple[int, int]\nGet or set the maximum size of the window's client area." +#define DOC_WINDOW_POSITION "position -> tuple[int, int]\nGet or set the window position in screen coordinates." #define DOC_WINDOW_OPACITY "opacity -> float\nGet or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque)." -#define DOC_WINDOW_OPENGL "opengl() -> bool\nGet if the window supports OpenGL." -#define DOC_WINDOW_UTILITY "utility() -> bool\nGet if the window is an utility window (**read-only**)." +#define DOC_WINDOW_OPENGL "opengl -> bool\nGet if the window supports OpenGL." +#define DOC_WINDOW_UTILITY "utility -> bool\nGet if the window is an utility window (**read-only**)." #define DOC_WINDOW_FROMDISPLAYMODULE "from_display_module() -> Window\nCreate a Window object using window data from display module." #define DOC_WINDOW_GETSURFACE "get_surface() -> Surface\nGet the window surface." #define DOC_WINDOW_FLIP "flip() -> None\nUpdate the display surface to the window." From ff19499566bc30e4917777c8ddb5e7748291f596 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:45:26 -0800 Subject: [PATCH 040/441] 2.5.4.dev1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2f1b70a7af..2489fb9057 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pygame-ce" -version = "2.5.3.dev2" +version = "2.5.4.dev1" description = "Python Game Development" readme = "README.rst" # for long description requires-python = ">=3.9" From 5f4f8f8663775bc3b84832440cc8bfaa655f2b92 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 14 Jan 2025 00:52:58 -0800 Subject: [PATCH 041/441] Draw SDL3 --- src_c/_pygame.h | 8 ++ src_c/draw.c | 302 ++++++++++++++++++++++++++-------------------- src_c/meson.build | 4 - 3 files changed, 178 insertions(+), 136 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 77fcd2cb50..235c7545f0 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -130,6 +130,8 @@ PG_GetSurfaceFormat(SDL_Surface *surf) return SDL_GetPixelFormatDetails(surf->format); } +#define PG_GetSurfacePalette SDL_GetSurfacePalette + #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB #define PG_MapRGBA SDL_MapRGBA @@ -225,6 +227,12 @@ PG_GetSurfaceFormat(SDL_Surface *surf) return surf->format; } +static inline SDL_Palette * +PG_GetSurfacePalette(SDL_Surface *surf) +{ + return surf->format->palette; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/draw.c b/src_c/draw.c index 58adb1fd16..4244c1fa02 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -49,10 +49,11 @@ line_width_corners(float from_x, float from_y, float to_x, float to_y, int width, float *x1, float *y1, float *x2, float *y2, float *x3, float *y3, float *x4, float *y4); static void -draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, - float startx, float starty, float endx, float endy, - int *drawn_area, int disable_first_endpoint, - int disable_second_endpoint, int extra_pixel_for_aalines); +draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, Uint32 color, float startx, + float starty, float endx, float endy, int *drawn_area, + int disable_first_endpoint, int disable_second_endpoint, + int extra_pixel_for_aalines); static void draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, int y_center, int radius1, int radius2, int width, double angle_start, @@ -65,13 +66,14 @@ static void draw_circle_bresenham_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, int y0, int radius, Uint32 color, int *drawn_area); static void -draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, - int y0, int radius, int thickness, Uint32 color, - int top_right, int top_left, int bottom_left, - int bottom_right, int *drawn_area); +draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x0, int y0, int radius, + int thickness, Uint32 color, int top_right, int top_left, + int bottom_left, int bottom_right, int *drawn_area); static void -draw_circle_xiaolinwu_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, - int y0, int radius, Uint32 color, int top_right, +draw_circle_xiaolinwu_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x0, int y0, + int radius, Uint32 color, int top_right, int top_left, int bottom_left, int bottom_right, int *drawn_area); static void @@ -162,6 +164,11 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) return RAISE(pgExc_SDLError, SDL_GetError()); } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + CHECK_LOAD_COLOR(colorobj) if (!pg_TwoFloatsFromObj(start, &startx, &starty)) { @@ -186,14 +193,14 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) &y2, &x3, &y3, &x4, &y4); draw_line_width(surf, surf_clip_rect, color, (int)startx, (int)starty, (int)endx, (int)endy, width, drawn_area); - draw_aaline(surf, surf_clip_rect, color, x1, y1, x2, y2, drawn_area, 0, - 0, 0); - draw_aaline(surf, surf_clip_rect, color, x3, y3, x4, y4, drawn_area, 0, - 0, 0); + draw_aaline(surf, surf_clip_rect, surf_format, color, x1, y1, x2, y2, + drawn_area, 0, 0, 0); + draw_aaline(surf, surf_clip_rect, surf_format, color, x3, y3, x4, y4, + drawn_area, 0, 0, 0); } else { - draw_aaline(surf, surf_clip_rect, color, startx, starty, endx, endy, - drawn_area, 0, 0, 0); + draw_aaline(surf, surf_clip_rect, surf_format, color, startx, starty, + endx, endy, drawn_area, 0, 0, 0); } if (!pgSurface_Unlock(surfobj)) { @@ -340,6 +347,11 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) return RAISE(pgExc_SDLError, SDL_GetError()); } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + CHECK_LOAD_COLOR(colorobj) if (!PySequence_Check(points)) { @@ -406,13 +418,14 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) disable_endpoints = !((roundf(pts[2]) == pts[2]) && (roundf(pts[3]) == pts[3])); if (closed) { - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, disable_endpoints, disable_endpoints, - extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, disable_endpoints, + disable_endpoints, extra_px); } else { - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, 0, disable_endpoints, extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, 0, disable_endpoints, + extra_px); } for (loop = 2; loop < length - 1; ++loop) { @@ -433,9 +446,9 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) pts_prev[1] = pts[1]; pts_prev[2] = pts[2]; pts_prev[3] = pts[3]; - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, disable_endpoints, disable_endpoints, - extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, disable_endpoints, + disable_endpoints, extra_px); } /* Last line - if open, add endpoint pixels. */ @@ -454,13 +467,14 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) pts_prev[2] = pts[2]; pts_prev[3] = pts[3]; if (closed) { - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, disable_endpoints, disable_endpoints, - extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, disable_endpoints, + disable_endpoints, extra_px); } else { - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, disable_endpoints, 0, extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, disable_endpoints, 0, + extra_px); } if (closed && length > 2) { @@ -474,9 +488,9 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) extra_px = steep_prev != steep_curr; disable_endpoints = !((roundf(pts[2]) == pts[2]) && (roundf(pts[3]) == pts[3])); - draw_aaline(surf, surf_clip_rect, color, pts[0], pts[1], pts[2], - pts[3], drawn_area, disable_endpoints, disable_endpoints, - extra_px); + draw_aaline(surf, surf_clip_rect, surf_format, color, pts[0], pts[1], + pts[2], pts[3], drawn_area, disable_endpoints, + disable_endpoints, extra_px); } PyMem_Free(points_buf); @@ -937,6 +951,11 @@ aacircle(PyObject *self, PyObject *args, PyObject *kwargs) return RAISE(pgExc_SDLError, SDL_GetError()); } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + CHECK_LOAD_COLOR(colorobj) if (radius < 1 || width < 0) { @@ -963,33 +982,38 @@ aacircle(PyObject *self, PyObject *args, PyObject *kwargs) if (!width || width == radius) { draw_circle_filled(surf, surf_clip_rect, posx, posy, radius - 1, color, drawn_area); - draw_circle_xiaolinwu(surf, surf_clip_rect, posx, posy, radius, 2, - color, 1, 1, 1, 1, drawn_area); + draw_circle_xiaolinwu(surf, surf_clip_rect, surf_format, posx, + posy, radius, 2, color, 1, 1, 1, 1, + drawn_area); } else if (width == 1) { - draw_circle_xiaolinwu_thin(surf, surf_clip_rect, posx, posy, - radius, color, 1, 1, 1, 1, drawn_area); + draw_circle_xiaolinwu_thin(surf, surf_clip_rect, surf_format, posx, + posy, radius, color, 1, 1, 1, 1, + drawn_area); } else { - draw_circle_xiaolinwu(surf, surf_clip_rect, posx, posy, radius, - width, color, 1, 1, 1, 1, drawn_area); + draw_circle_xiaolinwu(surf, surf_clip_rect, surf_format, posx, + posy, radius, width, color, 1, 1, 1, 1, + drawn_area); } } else { if (!width || width == radius) { - draw_circle_xiaolinwu(surf, surf_clip_rect, posx, posy, radius, - radius, color, top_right, top_left, - bottom_left, bottom_right, drawn_area); + draw_circle_xiaolinwu(surf, surf_clip_rect, surf_format, posx, + posy, radius, radius, color, top_right, + top_left, bottom_left, bottom_right, + drawn_area); } else if (width == 1) { - draw_circle_xiaolinwu_thin(surf, surf_clip_rect, posx, posy, - radius, color, top_right, top_left, - bottom_left, bottom_right, drawn_area); + draw_circle_xiaolinwu_thin( + surf, surf_clip_rect, surf_format, posx, posy, radius, color, + top_right, top_left, bottom_left, bottom_right, drawn_area); } else { - draw_circle_xiaolinwu(surf, surf_clip_rect, posx, posy, radius, - width, color, top_right, top_left, - bottom_left, bottom_right, drawn_area); + draw_circle_xiaolinwu(surf, surf_clip_rect, surf_format, posx, + posy, radius, width, color, top_right, + top_left, bottom_left, bottom_right, + drawn_area); } } @@ -1267,16 +1291,18 @@ compare_int(const void *a, const void *b) } static Uint32 -get_antialiased_color(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, +get_antialiased_color(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x, int y, Uint32 original_color, float brightness) { Uint8 color_part[4], background_color[4]; - SDL_GetRGBA(original_color, surf->format, &color_part[0], &color_part[1], - &color_part[2], &color_part[3]); if (x < surf_clip_rect.x || x >= surf_clip_rect.x + surf_clip_rect.w || y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) return original_color; + PG_GetRGBA(original_color, surf_format, PG_GetSurfacePalette(surf), + &color_part[0], &color_part[1], &color_part[2], &color_part[3]); + Uint32 pixel = 0; int bpp = PG_SURF_BytesPerPixel(surf); Uint8 *pixels = (Uint8 *)surf->pixels + y * surf->pitch + x * bpp; @@ -1303,9 +1329,9 @@ get_antialiased_color(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, break; } - SDL_GetRGBA(pixel, surf->format, &background_color[0], - &background_color[1], &background_color[2], - &background_color[3]); + PG_GetRGBA(pixel, surf_format, PG_GetSurfacePalette(surf), + &background_color[0], &background_color[1], + &background_color[2], &background_color[3]); color_part[0] = (Uint8)(brightness * color_part[0] + (1 - brightness) * background_color[0]); @@ -1315,8 +1341,9 @@ get_antialiased_color(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, (1 - brightness) * background_color[2]); color_part[3] = (Uint8)(brightness * color_part[3] + (1 - brightness) * background_color[3]); - original_color = SDL_MapRGBA(surf->format, color_part[0], color_part[1], - color_part[2], color_part[3]); + original_color = + PG_MapRGBA(surf_format, PG_GetSurfacePalette(surf), color_part[0], + color_part[1], color_part[2], color_part[3]); return original_color; } @@ -1383,14 +1410,13 @@ clip_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int *x1, int *y1, static int set_at(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, Uint32 color) { - SDL_PixelFormat *format = surf->format; Uint8 *pixels = (Uint8 *)surf->pixels; if (x < surf_clip_rect.x || x >= surf_clip_rect.x + surf_clip_rect.w || y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) return 0; - switch (PG_FORMAT_BytesPerPixel(format)) { + switch (PG_SURF_BytesPerPixel(surf)) { case 1: *((Uint8 *)pixels + y * surf->pitch + x) = (Uint8)color; break; @@ -1420,10 +1446,11 @@ set_and_check_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, } static void -draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, - float from_x, float from_y, float to_x, float to_y, - int *drawn_area, int disable_first_endpoint, - int disable_second_endpoint, int extra_pixel_for_aalines) +draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, Uint32 color, float from_x, + float from_y, float to_x, float to_y, int *drawn_area, + int disable_first_endpoint, int disable_second_endpoint, + int extra_pixel_for_aalines) { float gradient, dx, dy, intersect_y, brightness; int x, x_pixel_start, x_pixel_end; @@ -1438,7 +1465,7 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, * A line with length 0 is drawn as a single pixel at full brightness. */ if (fabs(dx) < 0.0001 && fabs(dy) < 0.0001) { pixel_color = get_antialiased_color( - surf, surf_clip_rect, (int)floor(from_x + 0.5), + surf, surf_clip_rect, surf_format, (int)floor(from_x + 0.5), (int)floor(from_y + 0.5), color, 1); set_and_check_rect(surf, surf_clip_rect, (int)floor(from_x + 0.5), (int)floor(from_y + 0.5), pixel_color, drawn_area); @@ -1546,8 +1573,9 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, y = (int)y_endpoint; } if ((int)y_endpoint < y_endpoint) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y, - color, brightness * x_gap); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y, color, brightness * x_gap); set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, drawn_area); } @@ -1558,8 +1586,9 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, y--; } brightness = 1 - brightness; - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y, - color, brightness * x_gap); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, y, + color, brightness * x_gap); set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, drawn_area); intersect_y += gradient; @@ -1587,8 +1616,9 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, y = (int)y_endpoint; } if ((int)y_endpoint < y_endpoint) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y, - color, brightness * x_gap); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y, color, brightness * x_gap); set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, drawn_area); } @@ -1599,8 +1629,9 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, y--; } brightness = 1 - brightness; - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y, - color, brightness * x_gap); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, y, + color, brightness * x_gap); set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, drawn_area); } @@ -1611,28 +1642,32 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, y = (int)intersect_y; if (steep) { brightness = 1 - intersect_y + y; - pixel_color = get_antialiased_color(surf, surf_clip_rect, y - 1, x, - color, brightness); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, y - 1, + x, color, brightness); set_and_check_rect(surf, surf_clip_rect, y - 1, x, pixel_color, drawn_area); if (y < intersect_y) { brightness = 1 - brightness; - pixel_color = get_antialiased_color(surf, surf_clip_rect, y, x, - color, brightness); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, y, + x, color, brightness); set_and_check_rect(surf, surf_clip_rect, y, x, pixel_color, drawn_area); } } else { brightness = 1 - intersect_y + y; - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y - 1, - color, brightness); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y - 1, color, brightness); set_and_check_rect(surf, surf_clip_rect, x, y - 1, pixel_color, drawn_area); if (y < intersect_y) { brightness = 1 - brightness; - pixel_color = get_antialiased_color(surf, surf_clip_rect, x, y, - color, brightness); + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y, color, brightness); set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, drawn_area); } @@ -2025,10 +2060,9 @@ check_pixel_in_arc(int x, int y, double min_dotproduct, double invsqr_radius1, static void unsafe_set_at(SDL_Surface *surf, int x, int y, Uint32 color) { - SDL_PixelFormat *format = surf->format; Uint8 *pixels = (Uint8 *)surf->pixels; - switch (PG_FORMAT_BytesPerPixel(format)) { + switch (PG_SURF_BytesPerPixel(surf)) { case 1: *((Uint8 *)pixels + y * surf->pitch + x) = (Uint8)color; break; @@ -2711,50 +2745,51 @@ draw_circle_filled(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, int y0, } static void -draw_eight_symetric_pixels(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, - int y0, Uint32 color, int x, int y, float opacity, +draw_eight_symetric_pixels(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x0, int y0, + Uint32 color, int x, int y, float opacity, int top_right, int top_left, int bottom_left, int bottom_right, int *drawn_area) { opacity = opacity / 255.0f; Uint32 pixel_color; if (top_right == 1) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 + x, - y0 - y, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 + x, y0 - y, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 + x, y0 - y, pixel_color, drawn_area); - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 + y, - y0 - x, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 + y, y0 - x, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 + y, y0 - x, pixel_color, drawn_area); } if (top_left == 1) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 - x, - y0 - y, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 - x, y0 - y, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 - x, y0 - y, pixel_color, drawn_area); - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 - y, - y0 - x, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 - y, y0 - x, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 - y, y0 - x, pixel_color, drawn_area); } if (bottom_left == 1) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 - x, - y0 + y, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 - x, y0 + y, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 - x, y0 + y, pixel_color, drawn_area); - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 - y, - y0 + x, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 - y, y0 + x, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 - y, y0 + x, pixel_color, drawn_area); } if (bottom_right == 1) { - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 + x, - y0 + y, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 + x, y0 + y, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 + x, y0 + y, pixel_color, drawn_area); - pixel_color = get_antialiased_color(surf, surf_clip_rect, x0 + y, - y0 + x, color, opacity); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x0 + y, y0 + x, color, opacity); set_and_check_rect(surf, surf_clip_rect, x0 + y, y0 + x, pixel_color, drawn_area); } @@ -2765,10 +2800,10 @@ draw_eight_symetric_pixels(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, * with additional line width parameter and quadrants option */ static void -draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, - int y0, int radius, int thickness, Uint32 color, - int top_right, int top_left, int bottom_left, - int bottom_right, int *drawn_area) +draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x0, int y0, int radius, + int thickness, Uint32 color, int top_right, int top_left, + int bottom_left, int bottom_right, int *drawn_area) { for (int layer_radius = radius - thickness; layer_radius <= radius; layer_radius++) { @@ -2784,14 +2819,14 @@ draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, --y; } prev_opacity = opacity; - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y, 255.0f, top_right, top_left, - bottom_left, bottom_right, - drawn_area); - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y - 1, (float)opacity, top_right, - top_left, bottom_left, bottom_right, - drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, + x0, y0, color, x, y, 255.0f, + top_right, top_left, bottom_left, + bottom_right, drawn_area); + draw_eight_symetric_pixels( + surf, surf_clip_rect, surf_format, x0, y0, color, x, y - 1, + (float)opacity, top_right, top_left, bottom_left, + bottom_right, drawn_area); ++x; } } @@ -2803,14 +2838,14 @@ draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, --y; } prev_opacity = opacity; - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y, 255.0f - (float)opacity, + draw_eight_symetric_pixels( + surf, surf_clip_rect, surf_format, x0, y0, color, x, y, + 255.0f - (float)opacity, top_right, top_left, bottom_left, + bottom_right, drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, + x0, y0, color, x, y - 1, 255.0f, top_right, top_left, bottom_left, bottom_right, drawn_area); - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y - 1, 255.0f, top_right, - top_left, bottom_left, bottom_right, - drawn_area); ++x; } } @@ -2822,14 +2857,14 @@ draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, --y; } prev_opacity = opacity; - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y, 255.0f, top_right, top_left, - bottom_left, bottom_right, - drawn_area); - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, - x, y - 1, 255.0f, top_right, - top_left, bottom_left, bottom_right, - drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, + x0, y0, color, x, y, 255.0f, + top_right, top_left, bottom_left, + bottom_right, drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, + x0, y0, color, x, y - 1, 255.0f, + top_right, top_left, bottom_left, + bottom_right, drawn_area); ++x; } } @@ -2837,8 +2872,9 @@ draw_circle_xiaolinwu(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, } static void -draw_circle_xiaolinwu_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, - int y0, int radius, Uint32 color, int top_right, +draw_circle_xiaolinwu_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, int x0, int y0, + int radius, Uint32 color, int top_right, int top_left, int bottom_left, int bottom_right, int *drawn_area) { @@ -2853,12 +2889,14 @@ draw_circle_xiaolinwu_thin(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, --y; } prev_opacity = opacity; - draw_eight_symetric_pixels( - surf, surf_clip_rect, x0, y0, color, x, y, 255.0f - (float)opacity, - top_right, top_left, bottom_left, bottom_right, drawn_area); - draw_eight_symetric_pixels(surf, surf_clip_rect, x0, y0, color, x, - y - 1, (float)opacity, top_right, top_left, - bottom_left, bottom_right, drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, x0, y0, + color, x, y, 255.0f - (float)opacity, + top_right, top_left, bottom_left, + bottom_right, drawn_area); + draw_eight_symetric_pixels(surf, surf_clip_rect, surf_format, x0, y0, + color, x, y - 1, (float)opacity, top_right, + top_left, bottom_left, bottom_right, + drawn_area); ++x; } } diff --git a/src_c/meson.build b/src_c/meson.build index d56d6b014d..f8068d0ce1 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -165,9 +165,6 @@ joystick = py.extension_module( ) endif - -# TODO: support SDL3 -if sdl_api != 3 draw = py.extension_module( 'draw', 'draw.c', @@ -176,7 +173,6 @@ draw = py.extension_module( install: true, subdir: pg, ) -endif image = py.extension_module( 'image', From eaf887314871d332e72f256ae518701c96e4b76a Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 26 Jan 2025 01:08:58 -0800 Subject: [PATCH 042/441] Surface low hanging fruit SDL3 --- src_c/surface.c | 210 +++++++++++++++++++++++++++++++----------------- 1 file changed, 135 insertions(+), 75 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 81b603da6c..64313d0028 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -712,7 +712,6 @@ static PyObject * surf_get_at(PyObject *self, PyObject *position) { SDL_Surface *surf = pgSurface_AsSurface(self); - SDL_PixelFormat *format = NULL; Uint8 *pixels = NULL; int x, y; Uint32 color; @@ -729,10 +728,14 @@ surf_get_at(PyObject *self, PyObject *position) if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) return RAISE(PyExc_IndexError, "pixel index out of range"); - format = surf->format; + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + int bpp = PG_FORMAT_BytesPerPixel(format); - if (PG_FORMAT_BytesPerPixel(format) < 1 || - PG_FORMAT_BytesPerPixel(format) > 4) + if (bpp < 1 || bpp > 4) return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); if (!pgSurface_Lock((pgSurfaceObject *)self)) @@ -740,14 +743,15 @@ surf_get_at(PyObject *self, PyObject *position) pixels = (Uint8 *)surf->pixels; - switch (PG_FORMAT_BytesPerPixel(format)) { + switch (bpp) { case 1: color = (Uint32) * ((Uint8 *)pixels + y * surf->pitch + x); - SDL_GetRGB(color, format, rgba, rgba + 1, rgba + 2); + PG_GetRGB(color, format, palette, rgba, rgba + 1, rgba + 2); break; case 2: color = (Uint32) * ((Uint16 *)(pixels + y * surf->pitch) + x); - SDL_GetRGBA(color, format, rgba, rgba + 1, rgba + 2, rgba + 3); + PG_GetRGBA(color, format, palette, rgba, rgba + 1, rgba + 2, + rgba + 3); break; case 3: pix = ((Uint8 *)(pixels + y * surf->pitch) + x * 3); @@ -756,12 +760,13 @@ surf_get_at(PyObject *self, PyObject *position) #else color = (pix[2]) + (pix[1] << 8) + (pix[0] << 16); #endif - SDL_GetRGB(color, format, rgba, rgba + 1, rgba + 2); + PG_GetRGB(color, format, palette, rgba, rgba + 1, rgba + 2); break; default: /* case 4: */ assert(PG_FORMAT_BytesPerPixel(format) == 4); color = *((Uint32 *)(pixels + y * surf->pitch) + x); - SDL_GetRGBA(color, format, rgba, rgba + 1, rgba + 2, rgba + 3); + PG_GetRGBA(color, format, palette, rgba, rgba + 1, rgba + 2, + rgba + 3); break; } if (!pgSurface_Unlock((pgSurfaceObject *)self)) @@ -775,7 +780,6 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { SDL_Surface *surf = pgSurface_AsSurface(self); SURF_INIT_CHECK(surf) - SDL_PixelFormat *format = NULL; Uint8 *pixels; int x, y; Uint32 color; @@ -795,13 +799,22 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) rgba_obj = args[1]; - format = surf->format; - if (PG_FORMAT_BytesPerPixel(format) < 1 || - PG_FORMAT_BytesPerPixel(format) > 4) + PG_PixelFormat *format = PG_GetSurfaceFormat(surf); + if (format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + int bpp = PG_FORMAT_BytesPerPixel(format); + + if (bpp < 1 || bpp > 4) return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); - if (x < surf->clip_rect.x || x >= surf->clip_rect.x + surf->clip_rect.w || - y < surf->clip_rect.y || y >= surf->clip_rect.y + surf->clip_rect.h) { + SDL_Rect clip_rect; + if (!PG_GetSurfaceClipRect(surf, &clip_rect)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (x < clip_rect.x || x >= clip_rect.x + clip_rect.w || y < clip_rect.y || + y >= clip_rect.y + clip_rect.h) { /* out of clip area */ Py_RETURN_NONE; } @@ -814,7 +827,7 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) return NULL; pixels = (Uint8 *)surf->pixels; - switch (PG_FORMAT_BytesPerPixel(format)) { + switch (bpp) { case 1: *((Uint8 *)pixels + y * surf->pitch + x) = (Uint8)color; break; @@ -823,6 +836,8 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) break; case 3: byte_buf = (Uint8 *)(pixels + y * surf->pitch) + x * 3; + // Shouldn't this be able to happen without awareness of shifts? + // mapped color -> pixel and all. #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (format->Rshift >> 3)) = (Uint8)(color >> format->Rshift); @@ -854,7 +869,6 @@ static PyObject * surf_get_at_mapped(PyObject *self, PyObject *position) { SDL_Surface *surf = pgSurface_AsSurface(self); - SDL_PixelFormat *format = NULL; Uint8 *pixels = NULL; int x, y; Sint32 color; @@ -870,10 +884,9 @@ surf_get_at_mapped(PyObject *self, PyObject *position) if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) return RAISE(PyExc_IndexError, "pixel index out of range"); - format = surf->format; + int bpp = PG_SURF_BytesPerPixel(surf); - if (PG_FORMAT_BytesPerPixel(format) < 1 || - PG_FORMAT_BytesPerPixel(format) > 4) + if (bpp < 1 || bpp > 4) return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); if (!pgSurface_Lock((pgSurfaceObject *)self)) @@ -881,7 +894,7 @@ surf_get_at_mapped(PyObject *self, PyObject *position) pixels = (Uint8 *)surf->pixels; - switch (PG_FORMAT_BytesPerPixel(format)) { + switch (bpp) { case 1: color = (Uint32) * ((Uint8 *)pixels + y * surf->pitch + x); break; @@ -918,7 +931,13 @@ surf_map_rgb(PyObject *self, PyObject *args) SURF_INIT_CHECK(surf) - color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]); + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + color = PG_MapRGBA(format, palette, rgba[0], rgba[1], rgba[2], rgba[3]); return PyLong_FromLong(color); } @@ -936,10 +955,16 @@ surf_unmap_rgb(PyObject *self, PyObject *arg) } SURF_INIT_CHECK(surf) - if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) - SDL_GetRGBA(col, surf->format, rgba, rgba + 1, rgba + 2, rgba + 3); + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (SDL_ISPIXELFORMAT_ALPHA(format->format)) + PG_GetRGBA(col, format, palette, rgba, rgba + 1, rgba + 2, rgba + 3); else { - SDL_GetRGB(col, surf->format, rgba, rgba + 1, rgba + 2); + PG_GetRGB(col, format, palette, rgba, rgba + 1, rgba + 2); rgba[3] = 255; } @@ -1248,10 +1273,16 @@ surf_get_colorkey(pgSurfaceObject *self, PyObject *_null) SDL_GetColorKey(surf, &mapped_color); - if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) - SDL_GetRGBA(mapped_color, surf->format, &r, &g, &b, &a); + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (SDL_ISPIXELFORMAT_ALPHA(format->format)) + PG_GetRGBA(mapped_color, format, palette, &r, &g, &b, &a); else - SDL_GetRGB(mapped_color, surf->format, &r, &g, &b); + PG_GetRGB(mapped_color, format, palette, &r, &g, &b); return Py_BuildValue("(bbbb)", r, g, b, a); } @@ -1711,7 +1742,13 @@ surf_get_clip(PyObject *self, PyObject *_null) SDL_Surface *surf = pgSurface_AsSurface(self); SURF_INIT_CHECK(surf) - return pgRect_New(&surf->clip_rect); + + SDL_Rect clip_rect; + if (!PG_GetSurfaceClipRect(surf, &clip_rect)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + return pgRect_New(&clip_rect); } static PyObject * @@ -2669,8 +2706,14 @@ surf_get_masks(PyObject *self, PyObject *_null) SDL_Surface *surf = pgSurface_AsSurface(self); SURF_INIT_CHECK(surf) - return Py_BuildValue("(IIII)", surf->format->Rmask, surf->format->Gmask, - surf->format->Bmask, surf->format->Amask); + + PG_PixelFormat *format = PG_GetSurfaceFormat(surf); + if (format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + return Py_BuildValue("(IIII)", format->Rmask, format->Gmask, format->Bmask, + format->Amask); } static PyObject * @@ -2685,8 +2728,14 @@ surf_get_shifts(PyObject *self, PyObject *_null) SDL_Surface *surf = pgSurface_AsSurface(self); SURF_INIT_CHECK(surf) - return Py_BuildValue("(iiii)", surf->format->Rshift, surf->format->Gshift, - surf->format->Bshift, surf->format->Ashift); + + PG_PixelFormat *format = PG_GetSurfaceFormat(surf); + if (format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + return Py_BuildValue("(iiii)", format->Rshift, format->Gshift, + format->Bshift, format->Ashift); } static PyObject * @@ -2701,15 +2750,21 @@ surf_get_losses(PyObject *self, PyObject *_null) SDL_Surface *surf = pgSurface_AsSurface(self); SURF_INIT_CHECK(surf) - return Py_BuildValue("(iiii)", surf->format->Rloss, surf->format->Gloss, - surf->format->Bloss, surf->format->Aloss); + + PG_PixelFormat *format = PG_GetSurfaceFormat(surf); + if (format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + return Py_BuildValue("(iiii)", PG_FORMAT_R_LOSS(format), + PG_FORMAT_G_LOSS(format), PG_FORMAT_B_LOSS(format), + PG_FORMAT_A_LOSS(format)); } static PyObject * surf_subsurface(PyObject *self, PyObject *args) { SDL_Surface *surf = pgSurface_AsSurface(self); - SDL_PixelFormat *format; SDL_Rect *rect, temp; SDL_Surface *sub; PyObject *subobj; @@ -2719,7 +2774,12 @@ surf_subsurface(PyObject *self, PyObject *args) SURF_INIT_CHECK(surf) - format = surf->format; + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + if (!(rect = pgRect_FromObject(args, &temp))) return RAISE(PyExc_ValueError, "invalid rectstyle argument"); if (rect->x < 0 || rect->y < 0 || rect->x + rect->w > surf->w || @@ -2742,10 +2802,9 @@ surf_subsurface(PyObject *self, PyObject *args) return RAISE(pgExc_SDLError, SDL_GetError()); /* copy the colormap if we need it */ - if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf)) && - surf->format->palette) { - SDL_Color *colors = surf->format->palette->colors; - int ncolors = surf->format->palette->ncolors; + if (SDL_ISPIXELFORMAT_INDEXED(format->format) && palette) { + SDL_Color *colors = palette->colors; + int ncolors = palette->ncolors; SDL_Palette *pal = SDL_AllocPalette(ncolors); if (!pal) { @@ -2905,7 +2964,6 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) #endif PyObject *rect; SDL_Surface *surf = pgSurface_AsSurface(self); - SDL_PixelFormat *format = NULL; Uint8 *pixels = NULL; Uint8 *pixel; int x, y; @@ -2929,11 +2987,16 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) if (!pgSurface_Lock((pgSurfaceObject *)self)) return RAISE(pgExc_SDLError, "could not lock surface"); - format = surf->format; + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + int bpp = PG_FORMAT_BytesPerPixel(format); if ((has_colorkey = SDL_HasColorKey(surf))) { SDL_GetColorKey(surf, &colorkey); - SDL_GetRGBA(colorkey, surf->format, &keyr, &keyg, &keyb, &a); + PG_GetRGBA(colorkey, format, palette, &keyr, &keyg, &keyb, &a); } pixels = (Uint8 *)surf->pixels; @@ -2945,9 +3008,8 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) found_alpha = 0; for (y = max_y - 1; y >= min_y; --y) { for (x = min_x; x < max_x; ++x) { - pixel = (pixels + y * surf->pitch) + - x * PG_FORMAT_BytesPerPixel(format); - switch (PG_FORMAT_BytesPerPixel(format)) { + pixel = (pixels + y * surf->pitch) + x * bpp; + switch (bpp) { case 1: value = *pixel; break; @@ -2960,10 +3022,10 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) value |= pixel[BYTE2] << 16; break; default: - assert(PG_FORMAT_BytesPerPixel(format) == 4); + assert(bpp == 4); value = *(Uint32 *)pixel; } - SDL_GetRGBA(value, surf->format, &r, &g, &b, &a); + PG_GetRGBA(value, format, palette, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; @@ -2978,9 +3040,8 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) found_alpha = 0; for (x = max_x - 1; x >= min_x; --x) { for (y = min_y; y < max_y; ++y) { - pixel = (pixels + y * surf->pitch) + - x * PG_FORMAT_BytesPerPixel(format); - switch (PG_FORMAT_BytesPerPixel(format)) { + pixel = (pixels + y * surf->pitch) + x * bpp; + switch (bpp) { case 1: value = *pixel; break; @@ -2993,10 +3054,10 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) value |= pixel[BYTE2] << 16; break; default: - assert(PG_FORMAT_BytesPerPixel(format) == 4); + assert(bpp == 4); value = *(Uint32 *)pixel; } - SDL_GetRGBA(value, surf->format, &r, &g, &b, &a); + PG_GetRGBA(value, format, palette, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; @@ -3012,9 +3073,8 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) for (y = min_y; y < max_y; ++y) { min_y = y; for (x = min_x; x < max_x; ++x) { - pixel = (pixels + y * surf->pitch) + - x * PG_FORMAT_BytesPerPixel(format); - switch (PG_FORMAT_BytesPerPixel(format)) { + pixel = (pixels + y * surf->pitch) + x * bpp; + switch (bpp) { case 1: value = *pixel; break; @@ -3027,10 +3087,10 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) value |= pixel[BYTE2] << 16; break; default: - assert(PG_FORMAT_BytesPerPixel(format) == 4); + assert(bpp == 4); value = *(Uint32 *)pixel; } - SDL_GetRGBA(value, surf->format, &r, &g, &b, &a); + PG_GetRGBA(value, format, palette, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; @@ -3045,9 +3105,8 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) for (x = min_x; x < max_x; ++x) { min_x = x; for (y = min_y; y < max_y; ++y) { - pixel = (pixels + y * surf->pitch) + - x * PG_FORMAT_BytesPerPixel(format); - switch (PG_FORMAT_BytesPerPixel(format)) { + pixel = (pixels + y * surf->pitch) + x * bpp; + switch (bpp) { case 1: value = *pixel; break; @@ -3060,10 +3119,10 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) value |= pixel[BYTE2] << 16; break; default: - assert(PG_FORMAT_BytesPerPixel(format) == 4); + assert(bpp == 4); value = *(Uint32 *)pixel; } - SDL_GetRGBA(value, surf->format, &r, &g, &b, &a); + PG_GetRGBA(value, format, palette, &r, &g, &b, &a); if ((a >= min_alpha && has_colorkey == 0) || (has_colorkey != 0 && (r != keyr || g != keyg || b != keyb))) { found_alpha = 1; @@ -3137,7 +3196,6 @@ static PyObject * surf_get_view(PyObject *self, PyObject *args) { SDL_Surface *surface = pgSurface_AsSurface(self); - SDL_PixelFormat *format; Uint32 mask = 0; SurfViewKind view_kind = VIEWKIND_2D; getbufferproc get_buffer = 0; @@ -3148,14 +3206,19 @@ surf_get_view(PyObject *self, PyObject *args) SURF_INIT_CHECK(surface) - format = surface->format; + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + int bpp = PG_FORMAT_BytesPerPixel(format); + switch (view_kind) { /* This switch statement is exhaustive over the SurfViewKind enum */ case VIEWKIND_0D: - if (surface->pitch != - PG_FORMAT_BytesPerPixel(format) * surface->w) { + if (surface->pitch != bpp * surface->w) { PyErr_SetString(PyExc_ValueError, "Surface data is not contiguous"); return 0; @@ -3163,8 +3226,7 @@ surf_get_view(PyObject *self, PyObject *args) get_buffer = _get_buffer_0D; break; case VIEWKIND_1D: - if (surface->pitch != - PG_FORMAT_BytesPerPixel(format) * surface->w) { + if (surface->pitch != bpp * surface->w) { PyErr_SetString(PyExc_ValueError, "Surface data is not contiguous"); return 0; @@ -3175,13 +3237,11 @@ surf_get_view(PyObject *self, PyObject *args) get_buffer = _get_buffer_2D; break; case VIEWKIND_3D: - if (PG_FORMAT_BytesPerPixel(format) < 3) { - return _raise_get_view_ndim_error( - PG_FORMAT_BytesPerPixel(format) * 8, view_kind); + if (bpp < 3) { + return _raise_get_view_ndim_error(bpp * 8, view_kind); } if (format->Gmask != 0x00ff00 && - (PG_FORMAT_BytesPerPixel(format) != 4 || - format->Gmask != 0xff0000)) { + (bpp != 4 || format->Gmask != 0xff0000)) { return RAISE(PyExc_ValueError, "unsupported colormasks for 3D reference array"); } From 52967d0b0a1466ed6d1b06741a78a1c7a28a8118 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 25 Jan 2025 14:15:29 -0800 Subject: [PATCH 043/441] Working on transform SDL3 --- src_c/_pygame.h | 8 ++ src_c/meson.build | 1 - src_c/scale2x.c | 2 +- src_c/transform.c | 249 ++++++++++++++++++++++++++++++---------------- 4 files changed, 174 insertions(+), 86 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 77fcd2cb50..235c7545f0 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -130,6 +130,8 @@ PG_GetSurfaceFormat(SDL_Surface *surf) return SDL_GetPixelFormatDetails(surf->format); } +#define PG_GetSurfacePalette SDL_GetSurfacePalette + #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB #define PG_MapRGBA SDL_MapRGBA @@ -225,6 +227,12 @@ PG_GetSurfaceFormat(SDL_Surface *surf) return surf->format; } +static inline SDL_Palette * +PG_GetSurfacePalette(SDL_Surface *surf) +{ + return surf->format->palette; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/meson.build b/src_c/meson.build index d56d6b014d..79bef1beea 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -134,7 +134,6 @@ surface = py.extension_module( ) endif -# TODO: support SDL3 surflock = py.extension_module( 'surflock', 'surflock.c', diff --git a/src_c/scale2x.c b/src_c/scale2x.c index 9249a05a78..9fd673a783 100644 --- a/src_c/scale2x.c +++ b/src_c/scale2x.c @@ -73,7 +73,7 @@ scale2x(SDL_Surface *src, SDL_Surface *dst) const int height = src->h; #if SDL_VERSION_ATLEAST(3, 0, 0) - const Uint8 Bpp = src->format->bytes_per_pixel; + const Uint8 Bpp = SDL_BYTESPERPIXEL(src->format); #else const Uint8 Bpp = src->format->BytesPerPixel; #endif diff --git a/src_c/transform.c b/src_c/transform.c index 181bab4238..ab69290b2d 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -131,9 +131,26 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) /* Copy palette, colorkey, etc info */ if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { - if (SDL_SetPaletteColors(newsurf->format->palette, - surf->format->palette->colors, 0, - surf->format->palette->ncolors) != 0) { + SDL_Palette *newsurf_palette = PG_GetSurfacePalette(newsurf); + SDL_Palette *surf_palette = PG_GetSurfacePalette(newsurf); + + if (newsurf_palette == NULL) { + PyErr_SetString( + pgExc_SDLError, + "Palette expected (newsurf) but no palette found."); + SDL_FreeSurface(newsurf); + return NULL; + } + + if (surf_palette == NULL) { + PyErr_SetString(pgExc_SDLError, + "Palette expected (surf) but no palette found."); + SDL_FreeSurface(newsurf); + return NULL; + } + + if (SDL_SetPaletteColors(newsurf_palette, surf_palette->colors, 0, + surf_palette->ncolors) != 0) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; @@ -431,10 +448,18 @@ scale_to(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int width, } else { modsurf = retsurf = pgSurface_AsSurface(dstobj); - if (PG_SURF_BytesPerPixel(retsurf) != PG_SURF_BytesPerPixel(src) || - retsurf->format->Rmask != src->format->Rmask || - retsurf->format->Gmask != src->format->Gmask || - retsurf->format->Bmask != src->format->Bmask) { + + PG_PixelFormat *ret_format = PG_GetSurfaceFormat(retsurf); + PG_PixelFormat *src_format = PG_GetSurfaceFormat(src); + if (ret_format == NULL || src_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (PG_FORMAT_BytesPerPixel(ret_format) != + PG_FORMAT_BytesPerPixel(src_format) || + ret_format->Rmask != src_format->Rmask || + ret_format->Gmask != src_format->Gmask || + ret_format->Bmask != src_format->Bmask) { return RAISE(PyExc_ValueError, "Source and destination surfaces need to be " "compatible formats."); @@ -445,7 +470,7 @@ scale_to(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int width, * existing dstobj return surface. Otherwise SDL_SoftStretch * rejects the input. * For example, RGBA and RGBX surfaces are compatible in this way. */ - if (retsurf->format->Amask != src->format->Amask) { + if (ret_format->Amask != src_format->Amask) { modsurf = PG_CreateSurfaceFrom(retsurf->w, retsurf->h, PG_SURF_FORMATENUM(src), retsurf->pixels, retsurf->pitch); @@ -693,7 +718,11 @@ surf_rotate(PyObject *self, PyObject *args, PyObject *kwargs) #endif } SDL_UnlockSurface(surf); - bgcolor &= ~surf->format->Amask; + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + bgcolor &= ~surf_format->Amask; } else { SDL_GetColorKey(surf, &bgcolor); @@ -1702,7 +1731,7 @@ _get_color_move_pixels(Uint8 bpp, Uint8 *pixels, Uint32 *the_color) the_color - to set in the pixels at this position. */ static PG_INLINE void -_set_at_pixels(int x, int y, Uint8 *pixels, SDL_PixelFormat *format, +_set_at_pixels(int x, int y, Uint8 *pixels, PG_PixelFormat *format, int surf_pitch, Uint32 the_color) { Uint8 *byte_buf; @@ -1833,8 +1862,14 @@ _color_from_obj(PyObject *color_obj, SDL_Surface *surf, Uint8 rgba_default[4], else { if (!rgba_default) return -1; - *color = SDL_MapRGBA(surf->format, rgba_default[0], rgba_default[1], - rgba_default[2], rgba_default[3]); + + PG_PixelFormat *surf_format; + SDL_Palette *surf_palette; + if (!PG_GetSurfaceDetails(surf, &surf_format, &surf_palette)) { + return -1; + } + *color = PG_MapRGBA(surf_format, surf_palette, rgba_default[0], + rgba_default[1], rgba_default[2], rgba_default[3]); } return 0; } @@ -2096,17 +2131,20 @@ clamp_4 #endif void -grayscale_non_simd(SDL_Surface *src, SDL_Surface *newsurf) +grayscale_non_simd(SDL_Surface *src, PG_PixelFormat *src_format, + SDL_Surface *newsurf, PG_PixelFormat *newsurf_format) { - int x, y; - for (y = 0; y < src->h; y++) { - for (x = 0; x < src->w; x++) { + SDL_Palette *src_palette = PG_GetSurfacePalette(src); + SDL_Palette *newsurf_palette = PG_GetSurfacePalette(newsurf); + + for (int y = 0; y < src->h; y++) { + for (int x = 0; x < src->w; x++) { Uint32 pixel; Uint8 *pix; - SURF_GET_AT(pixel, src, x, y, (Uint8 *)src->pixels, src->format, + SURF_GET_AT(pixel, src, x, y, (Uint8 *)src->pixels, src_format, pix); Uint8 r, g, b, a; - SDL_GetRGBA(pixel, src->format, &r, &g, &b, &a); + PG_GetRGBA(pixel, src_format, src_palette, &r, &g, &b, &a); /* RGBA to GRAY formula used by OpenCV * We are using a bitshift and integer addition to align the @@ -2117,10 +2155,10 @@ grayscale_non_simd(SDL_Surface *src, SDL_Surface *newsurf) (Uint8)((((76 * r) + 255) >> 8) + (((150 * g) + 255) >> 8) + (((29 * b) + 255) >> 8)); Uint32 new_pixel = - SDL_MapRGBA(newsurf->format, grayscale_pixel, grayscale_pixel, - grayscale_pixel, a); + PG_MapRGBA(newsurf_format, newsurf_palette, grayscale_pixel, + grayscale_pixel, grayscale_pixel, a); SURF_SET_AT(new_pixel, newsurf, x, y, (Uint8 *)newsurf->pixels, - newsurf->format, pix); + newsurf_format, pix); } } } @@ -2151,14 +2189,21 @@ grayscale(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) PyExc_ValueError, "Source and destination surfaces need the same format.")); } + + PG_PixelFormat *src_format = PG_GetSurfaceFormat(src); + PG_PixelFormat *newsurf_format = PG_GetSurfaceFormat(newsurf); + if (src_format == NULL || newsurf_format == NULL) { + return (SDL_Surface *)(RAISE(pgExc_SDLError, SDL_GetError())); + } + #if defined(__EMSCRIPTEN__) - grayscale_non_simd(src, newsurf); + grayscale_non_simd(src, src_format, newsurf, newsurf_format); #else // !defined(__EMSCRIPTEN__) - if (PG_SURF_BytesPerPixel(src) == 4 && - src->format->Rmask == newsurf->format->Rmask && - src->format->Gmask == newsurf->format->Gmask && - src->format->Bmask == newsurf->format->Bmask && - (src->pitch % 4 == 0) && (newsurf->pitch == (newsurf->w * 4))) { + if (PG_FORMAT_BytesPerPixel(src_format) == 4 && + src_format->Rmask == newsurf_format->Rmask && + src_format->Gmask == newsurf_format->Gmask && + src_format->Bmask == newsurf_format->Bmask && (src->pitch % 4 == 0) && + (newsurf->pitch == (newsurf->w * 4))) { if (pg_has_avx2()) { grayscale_avx2(src, newsurf); } @@ -2168,11 +2213,11 @@ grayscale(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) } #endif // defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else { - grayscale_non_simd(src, newsurf); + grayscale_non_simd(src, src_format, newsurf, newsurf_format); } } else { - grayscale_non_simd(src, newsurf); + grayscale_non_simd(src, src_format, newsurf, newsurf_format); } #endif // !defined(__EMSCRIPTEN__) @@ -2216,7 +2261,6 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, { SDL_Surface *src = pgSurface_AsSurface(srcobj); SDL_Surface *newsurf; - SDL_PixelFormat *fmt = src->format; Uint8 a; if (!dstobj) { @@ -2234,7 +2278,14 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, "Destination surface must be the same size as source surface.")); } - if (PG_SURF_FORMATENUM(src) != PG_SURF_FORMATENUM(newsurf)) { + PG_PixelFormat *fmt, *newsurf_format; + SDL_Palette *src_palette, *newsurf_palette; + if (!PG_GetSurfaceDetails(src, &fmt, &src_palette) || + !PG_GetSurfaceDetails(newsurf, &newsurf_format, &newsurf_palette)) { + return (SDL_Surface *)(RAISE(pgExc_SDLError, SDL_GetError())); + } + + if (fmt->format != newsurf_format->format) { return (SDL_Surface *)(RAISE( PyExc_ValueError, "Source and destination surfaces need the same format.")); @@ -2265,7 +2316,7 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, } /* optimized path for 32 bit surfaces */ - if (fmt->BytesPerPixel == 4) { + if (PG_FORMAT_BytesPerPixel(fmt) == 4) { /* This algorithm iterates over each pixel's alpha channel. If it's not * zero, the pixel is set to the desired color. If the keep_alpha flag * is set, the original alpha value is retained, allowing the overlay @@ -2358,16 +2409,18 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, const int dst_skip = newsurf->pitch / 2 - newsurf->w; Uint8 Cr, Cg, Cb, Ca; - SDL_GetRGBA(color, fmt, &Cr, &Cg, &Cb, &Ca); - const Uint16 color16 = (Uint16)SDL_MapRGBA(fmt, Cr, Cg, Cb, Ca); + PG_GetRGBA(color, fmt, src_palette, &Cr, &Cg, &Cb, &Ca); + const Uint16 color16 = (Uint16)PG_MapRGBA( + newsurf_format, newsurf_palette, Cr, Cg, Cb, Ca); for (y = 0; y < src->h; y++) { for (x = 0; x < src->w; x++) { - SDL_GetRGBA((Uint32)*src_row, fmt, &r, &g, &b, &a); + PG_GetRGBA((Uint32)*src_row, fmt, src_palette, &r, &g, &b, &a); if (a) { if (keep_alpha) - *dst_row = (Uint16)SDL_MapRGBA(fmt, Cr, Cg, Cb, a); + *dst_row = (Uint16)PG_MapRGBA( + newsurf_format, newsurf_palette, Cr, Cg, Cb, a); else *dst_row = color16; } @@ -2501,7 +2554,8 @@ HSL_to_RGB(float h, float s, float l, Uint8 *r, Uint8 *g, Uint8 *b) } static void -modify_hsl(SDL_Surface *surf, SDL_Surface *dst, float h, float s, float l) +modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, + PG_PixelFormat *dst_format, float h, float s, float l) { int surf_locked = 0; if (SDL_MUSTLOCK(surf)) { @@ -2519,9 +2573,10 @@ modify_hsl(SDL_Surface *surf, SDL_Surface *dst, float h, float s, float l) int x, y; Uint8 r, g, b, a; float s_h = 0, s_s = 0, s_l = 0; - SDL_PixelFormat *fmt = surf->format; Uint8 *srcp8 = (Uint8 *)surf->pixels; Uint8 *dstp8 = (Uint8 *)dst->pixels; + SDL_Palette *surf_palette = PG_GetSurfacePalette(surf); + SDL_Palette *dst_palette = PG_GetSurfacePalette(surf); if (PG_FORMAT_BytesPerPixel(fmt) == 4 || PG_FORMAT_BytesPerPixel(fmt) == 3) { @@ -2585,7 +2640,7 @@ modify_hsl(SDL_Surface *surf, SDL_Surface *dst, float h, float s, float l) for (y = 0; y < surf->h; y++) { for (x = 0; x < surf->w; x++) { SURF_GET_AT(pixel, surf, x, y, srcp8, fmt, pix); - SDL_GetRGBA(pixel, fmt, &r, &g, &b, &a); + PG_GetRGBA(pixel, fmt, surf_palette, &r, &g, &b, &a); RGB_to_HSL(r, g, b, &s_h, &s_s, &s_l); if (h) { @@ -2605,7 +2660,7 @@ modify_hsl(SDL_Surface *surf, SDL_Surface *dst, float h, float s, float l) } HSL_to_RGB(s_h, s_s, s_l, &r, &g, &b); - pixel = SDL_MapRGBA(fmt, r, g, b, a); + pixel = PG_MapRGBA(dst_format, dst_palette, r, g, b, a); SURF_SET_AT(pixel, dst, x, y, dstp8, fmt, pix); } } @@ -2682,8 +2737,14 @@ surf_hsl(PyObject *self, PyObject *args, PyObject *kwargs) "Source and destination surfaces need the same format."); } + PG_PixelFormat *src_format = PG_GetSurfaceFormat(src); + PG_PixelFormat *dst_format = PG_GetSurfaceFormat(dst); + if (src_format == NULL || dst_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + Py_BEGIN_ALLOW_THREADS; - modify_hsl(src, dst, h, s, l); + modify_hsl(src, src_format, dst, dst_format, h, s, l); Py_END_ALLOW_THREADS; if (surfobj2) { @@ -2701,7 +2762,8 @@ number to use for missing samples #define LAPLACIAN_NUM 0xFFFFFFFF void -laplacian(SDL_Surface *surf, SDL_Surface *destsurf) +laplacian(SDL_Surface *surf, PG_PixelFormat *format, SDL_Surface *destsurf, + PG_PixelFormat *destformat) { int ii; int x, y, height, width; @@ -2721,7 +2783,6 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) int atmp2; int atmp3; - SDL_PixelFormat *format, *destformat; Uint8 *pixels, *destpixels; Uint8 *pix; @@ -2731,10 +2792,8 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) width = surf->w; pixels = (Uint8 *)surf->pixels; - format = surf->format; - destpixels = (Uint8 *)destsurf->pixels; - destformat = destsurf->format; + SDL_Palette *surf_palette = PG_GetSurfacePalette(surf); /* -1 -1 -1 @@ -2816,7 +2875,8 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) memset(total, 0, 4 * sizeof(int)); for (ii = 0; ii < 9; ii++) { - SDL_GetRGBA(sample[ii], format, &c1r, &c1g, &c1b, &c1a); + PG_GetRGBA(sample[ii], format, surf_palette, &c1r, &c1g, &c1b, + &c1a); total[0] += c1r; total[1] += c1g; total[2] += c1b; @@ -2825,7 +2885,8 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) SURF_GET_AT(sample[4], surf, x, y, pixels, format, pix); - SDL_GetRGBA(sample[4], format, &c1r, &c1g, &c1b, &c1a); + PG_GetRGBA(sample[4], format, surf_palette, &c1r, &c1g, &c1b, + &c1a); // cast on the right to a signed int, and then clamp to 0-255. @@ -2850,8 +2911,8 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) // cast on the right to Uint32, and then clamp to 255. - the_color = SDL_MapRGBA(surf->format, acolor[0], acolor[1], - acolor[2], acolor[3]); + the_color = PG_MapRGBA(format, surf_palette, acolor[0], acolor[1], + acolor[2], acolor[3]); // set_at(destsurf, color, x,y); @@ -2869,18 +2930,18 @@ laplacian(SDL_Surface *surf, SDL_Surface *destsurf) (Uint8 *)(destpixels + y * destsurf->pitch) + x * 3; #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(byte_buf + (destformat->Rshift >> 3)) = - (Uint8)(the_color >> surf->format->Rshift); + (Uint8)(the_color >> format->Rshift); *(byte_buf + (destformat->Gshift >> 3)) = - (Uint8)(the_color >> surf->format->Gshift); + (Uint8)(the_color >> format->Gshift); *(byte_buf + (destformat->Bshift >> 3)) = - (Uint8)(the_color >> surf->format->Bshift); + (Uint8)(the_color >> format->Bshift); #else *(byte_buf + 2 - (destformat->Rshift >> 3)) = - (Uint8)(the_color >> surf->format->Rshift); + (Uint8)(the_color >> format->Rshift); *(byte_buf + 2 - (destformat->Gshift >> 3)) = - (Uint8)(the_color >> surf->format->Gshift); + (Uint8)(the_color >> format->Gshift); *(byte_buf + 2 - (destformat->Bshift >> 3)) = - (Uint8)(the_color >> surf->format->Bshift); + (Uint8)(the_color >> format->Bshift); #endif break; default: @@ -2932,11 +2993,17 @@ surf_laplacian(PyObject *self, PyObject *args, PyObject *kwargs) return RAISE(PyExc_ValueError, "Source and destination surfaces need the same format."); + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + PG_PixelFormat *newsurf_format = PG_GetSurfaceFormat(newsurf); + if (surf_format == NULL || newsurf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + SDL_LockSurface(newsurf); SDL_LockSurface(surf); Py_BEGIN_ALLOW_THREADS; - laplacian(surf, newsurf); + laplacian(surf, surf_format, newsurf, newsurf_format); Py_END_ALLOW_THREADS; SDL_UnlockSurface(surf); @@ -3302,8 +3369,9 @@ surf_average_surfaces(PyObject *self, PyObject *args, PyObject *kwargs) #endif void -average_color(SDL_Surface *surf, int x, int y, int width, int height, Uint8 *r, - Uint8 *g, Uint8 *b, Uint8 *a, SDL_bool consider_alpha) +average_color(SDL_Surface *surf, PG_PixelFormat *format, int x, int y, + int width, int height, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a, + SDL_bool consider_alpha) { Uint32 color, rmask, gmask, bmask, amask; Uint8 *pixels; @@ -3312,9 +3380,6 @@ average_color(SDL_Surface *surf, int x, int y, int width, int height, Uint8 *r, unsigned int rloss, gloss, bloss, aloss; int row, col, width_and_x, height_and_y; - SDL_PixelFormat *format; - - format = surf->format; rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; @@ -3323,10 +3388,10 @@ average_color(SDL_Surface *surf, int x, int y, int width, int height, Uint8 *r, gshift = format->Gshift; bshift = format->Bshift; ashift = format->Ashift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; - aloss = format->Aloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); + aloss = PG_FORMAT_A_LOSS(format); rtot = gtot = btot = atot = 0; /* make sure the area specified is within the Surface */ @@ -3545,8 +3610,14 @@ surf_average_color(PyObject *self, PyObject *args, PyObject *kwargs) h = rect->h; } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + Py_BEGIN_ALLOW_THREADS; - average_color(surf, x, y, w, h, &r, &g, &b, &a, consider_alpha); + average_color(surf, surf_format, x, y, w, h, &r, &g, &b, &a, + consider_alpha); Py_END_ALLOW_THREADS; pgSurface_Unlock(surfobj); @@ -3747,7 +3818,7 @@ blur(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int radius, src = pgSurface_AsSurface(srcobj); - if (src->format->palette) { + if (PG_GetSurfacePalette(src)) { return RAISE(PyExc_ValueError, "Indexed surfaces cannot be blurred."); } @@ -3884,20 +3955,23 @@ surf_gaussian_blur(PyObject *self, PyObject *args, PyObject *kwargs) } void -invert_non_simd(SDL_Surface *src, SDL_Surface *newsurf) +invert_non_simd(SDL_Surface *src, PG_PixelFormat *src_format, + SDL_Surface *newsurf, PG_PixelFormat *newsurf_format) { - int x, y; - for (y = 0; y < src->h; y++) { - for (x = 0; x < src->w; x++) { + SDL_Palette *src_palette = PG_GetSurfacePalette(src); + SDL_Palette *newsurf_palette = PG_GetSurfacePalette(newsurf); + for (int y = 0; y < src->h; y++) { + for (int x = 0; x < src->w; x++) { Uint32 pixel; Uint8 *pix; - SURF_GET_AT(pixel, src, x, y, (Uint8 *)src->pixels, src->format, + SURF_GET_AT(pixel, src, x, y, (Uint8 *)src->pixels, src_format, pix); unsigned char r, g, b, a; - SDL_GetRGBA(pixel, src->format, &r, &g, &b, &a); - Uint32 new_pixel = SDL_MapRGBA(newsurf->format, ~r, ~g, ~b, a); + PG_GetRGBA(pixel, src_format, src_palette, &r, &g, &b, &a); + Uint32 new_pixel = + PG_MapRGBA(newsurf_format, newsurf_palette, ~r, ~g, ~b, a); SURF_SET_AT(new_pixel, newsurf, x, y, (Uint8 *)newsurf->pixels, - newsurf->format, pix); + newsurf_format, pix); } } } @@ -3928,14 +4002,21 @@ invert(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) PyExc_ValueError, "Source and destination surfaces need the same format.")); } + + PG_PixelFormat *src_format = PG_GetSurfaceFormat(src); + PG_PixelFormat *newsurf_format = PG_GetSurfaceFormat(newsurf); + if (src_format == NULL || newsurf_format == NULL) { + return (SDL_Surface *)(RAISE(pgExc_SDLError, SDL_GetError())); + } + #if defined(__EMSCRIPTEN__) - invert_non_simd(src, newsurf); + invert_non_simd(src, src_format, newsurf, newsurf_format); #else // !defined(__EMSCRIPTEN__) - if (PG_SURF_BytesPerPixel(src) == 4 && - src->format->Rmask == newsurf->format->Rmask && - src->format->Gmask == newsurf->format->Gmask && - src->format->Bmask == newsurf->format->Bmask && - (src->pitch % 4 == 0) && (newsurf->pitch == (newsurf->w * 4))) { + if (PG_FORMAT_BytesPerPixel(src_format) == 4 && + src_format->Rmask == newsurf_format->Rmask && + src_format->Gmask == newsurf_format->Gmask && + src_format->Bmask == newsurf_format->Bmask && (src->pitch % 4 == 0) && + (newsurf->pitch == (newsurf->w * 4))) { if (pg_has_avx2()) { invert_avx2(src, newsurf); } @@ -3945,11 +4026,11 @@ invert(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) } #endif // defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else { - invert_non_simd(src, newsurf); + invert_non_simd(src, src_format, newsurf, newsurf_format); } } else { - invert_non_simd(src, newsurf); + invert_non_simd(src, src_format, newsurf, newsurf_format); } #endif // !defined(__EMSCRIPTEN__) From 6bb80efc09126fa35b9068b406b82f74d6aeb7cb Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:44:25 +0100 Subject: [PATCH 044/441] Fix some formatting and stub issues --- buildconfig/stubs/pygame/display.pyi | 14 +++++++------- buildconfig/stubs/pygame/window.pyi | 2 +- src_c/doc/display_doc.h | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index 5d77738cb3..a9b3958951 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -289,9 +289,9 @@ def flip() -> None: @overload def update() -> None: ... @overload -def update( - rectangle: Optional[Union[RectLike, Iterable[Optional[RectLike]]]], / -) -> None: ... +def update(rectangle: Optional[RectLike], /) -> None: ... +@overload +def update(rectangles: Iterable[Optional[RectLike]], /) -> None: ... @overload def update(x: float, y: float, w: float, h: float, /) -> None: ... @overload @@ -333,7 +333,7 @@ def get_driver() -> str: initialized. This returns the internal name used for the display backend. This can be used to provide limited information about what display capabilities might be accelerated. See the ``SDL_VIDEODRIVER`` flags in - ``pygame.display.set_mode()`` to see some of the common options. + ``pygame.display.init()`` to see some of the common options. """ def Info() -> _VidInfo: @@ -612,7 +612,7 @@ def toggle_fullscreen() -> int: """ @deprecated("since 2.1.4. Removed in SDL3") -def set_gamma(red: float, green: float = ..., blue: float = ..., /) -> int: +def set_gamma(red: float, green: float = ..., blue: float = ..., /) -> bool: """Change the hardware gamma ramps. DEPRECATED: This functionality will go away in SDL3. @@ -631,7 +631,7 @@ def set_gamma(red: float, green: float = ..., blue: float = ..., /) -> int: @deprecated("since 2.1.4. Removed in SDL3") def set_gamma_ramp( red: SequenceLike[int], green: SequenceLike[int], blue: SequenceLike[int], / -) -> int: +) -> bool: """Change the hardware gamma ramps with a custom lookup. DEPRECATED: This functionality will go away in SDL3. @@ -825,7 +825,7 @@ def message_box( :param str title: A title string. :param str message: A message string. If this parameter is set to ``None``, the message will be the title. :param str message_type: Set the type of message_box, could be ``"info"``, ``"warn"`` or ``"error"``. - :param Window parent_window: The parent window of the message box. + :param pygame.Window parent_window: The parent window of the message box. :param tuple buttons: An optional sequence of button name strings to show to the user. :param int return_button: Button index to use if the return key is hit, ``0`` by default. :param int escape_button: Button index to use if the escape key is hit, ``None`` for no button linked by default. diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index c56a642f11..3dfe2411a6 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -294,7 +294,7 @@ class Window: def position(self) -> tuple[int, int]: """Get or set the window position in screen coordinates. - The position may be a tuple of (x, y) coordiantes or ``WINDOWPOS_CENTERED`` or + The position may be a tuple of (x, y) coordinates or ``WINDOWPOS_CENTERED`` or ``WINDOWPOS_UNDEFINED``. The origin is the topleft of the main display. """ diff --git a/src_c/doc/display_doc.h b/src_c/doc/display_doc.h index b46a9d30af..f449077645 100644 --- a/src_c/doc/display_doc.h +++ b/src_c/doc/display_doc.h @@ -6,7 +6,7 @@ #define DOC_DISPLAY_SETMODE "set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface\nInitialize a window or screen for display." #define DOC_DISPLAY_GETSURFACE "get_surface() -> Optional[Surface]\nGet a reference to the currently set display surface." #define DOC_DISPLAY_FLIP "flip() -> None\nUpdate the full display Surface to the screen." -#define DOC_DISPLAY_UPDATE "update() -> None\nupdate(rectangle, /) -> None\nupdate(x, y, w, h, /) -> None\nupdate(xy, wh, /) -> None\nUpdate all, or a portion, of the display. For non-OpenGL displays." +#define DOC_DISPLAY_UPDATE "update() -> None\nupdate(rectangle, /) -> None\nupdate(rectangles, /) -> None\nupdate(x, y, w, h, /) -> None\nupdate(xy, wh, /) -> None\nUpdate all, or a portion, of the display. For non-OpenGL displays." #define DOC_DISPLAY_GETDRIVER "get_driver() -> str\nGet the name of the pygame display backend." #define DOC_DISPLAY_INFO "Info() -> _VidInfo\nCreate a video display information object." #define DOC_DISPLAY_GETWMINFO "get_wm_info() -> dict[str, int]\nGet information about the current windowing system." @@ -18,8 +18,8 @@ #define DOC_DISPLAY_GETACTIVE "get_active() -> bool\nReturns True when the display is active on the screen." #define DOC_DISPLAY_ICONIFY "iconify() -> bool\nIconify the display surface." #define DOC_DISPLAY_TOGGLEFULLSCREEN "toggle_fullscreen() -> int\nSwitch between fullscreen and windowed displays." -#define DOC_DISPLAY_SETGAMMA "set_gamma(red, green=..., blue=..., /) -> int\nChange the hardware gamma ramps." -#define DOC_DISPLAY_SETGAMMARAMP "set_gamma_ramp(red, green, blue, /) -> int\nChange the hardware gamma ramps with a custom lookup." +#define DOC_DISPLAY_SETGAMMA "set_gamma(red, green=..., blue=..., /) -> bool\nChange the hardware gamma ramps." +#define DOC_DISPLAY_SETGAMMARAMP "set_gamma_ramp(red, green, blue, /) -> bool\nChange the hardware gamma ramps with a custom lookup." #define DOC_DISPLAY_SETICON "set_icon(surface, /) -> None\nChange the system image for the display window." #define DOC_DISPLAY_SETCAPTION "set_caption(title, icontitle=None, /) -> None\nSet the current window caption." #define DOC_DISPLAY_GETCAPTION "get_caption() -> tuple[str, str]\nGet the current window caption." From dc6c168a0a647773a3dfcd218c85b9e0550816c6 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 3 Feb 2025 14:13:31 +0530 Subject: [PATCH 045/441] Port font to SDL3(_ttf) --- .github/workflows/build-sdl3.yml | 11 +++ buildconfig/download_win_prebuilt.py | 16 ++++ dev.py | 1 - meson.build | 2 +- src_c/font.c | 135 +++++++++++++++++++++++---- src_c/font.h | 9 +- src_c/meson.build | 6 +- 7 files changed, 158 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build-sdl3.yml b/.github/workflows/build-sdl3.yml index 7b2cfe9987..ba21795d45 100644 --- a/.github/workflows/build-sdl3.yml +++ b/.github/workflows/build-sdl3.yml @@ -97,6 +97,17 @@ jobs: cmake --build . --config Release --parallel sudo cmake --install . --config Release + - name: Install SDL3_ttf + if: matrix.os != 'windows-latest' + run: | + git clone https://github.com/libsdl-org/SDL_ttf + cd SDL_ttf + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release .. + cmake --build . --config Release --parallel + sudo cmake --install . --config Release + - name: Build with SDL3 run: python3 dev.py build --sdl3 diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 2c4d3076ae..8edaefe81b 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -98,6 +98,10 @@ def get_urls(x86=True, x64=True): '2d18b9a4fc2ec0eee80de2a946b088d4e6efd0ee' ], [ + 'https://github.com/libsdl-org/SDL_ttf/releases/download/preview-3.1.0/SDL3_ttf-devel-3.1.0-VC.zip', + '34bb4a03c6f0f6c9de3658bac98adc7029830578' + ], + [ 'https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.0/SDL2_mixer-devel-2.8.0-VC.zip', 'a10411644e08cd94f29712f430c7b71c407ae76d', ], @@ -251,6 +255,18 @@ def copy(src, dst): 'SDL2_ttf-2.24.0' ) ) + copy( + os.path.join( + temp_dir, + 'SDL3_ttf-devel-3.1.0-VC/SDL3_ttf-3.1.0' + ), + os.path.join( + move_to_dir, + prebuilt_dir, + 'SDL3_ttf-3.1.0' + ) + ) + copy( os.path.join( temp_dir, diff --git a/dev.py b/dev.py index 0b1b96ce42..d53bca86df 100644 --- a/dev.py +++ b/dev.py @@ -27,7 +27,6 @@ SDL3_ARGS = [ "-Csetup-args=-Dsdl_api=3", "-Csetup-args=-Dmixer=disabled", - "-Csetup-args=-Dfont=disabled", ] COVERAGE_ARGS = ["-Csetup-args=-Dcoverage=true"] diff --git a/meson.build b/meson.build index eb966ef0e4..13c5ebf54c 100644 --- a/meson.build +++ b/meson.build @@ -112,7 +112,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') sdl_ver = (sdl_api == 3) ? '3.2.2' : '2.30.12' sdl_image_ver = (sdl_api == 3) ? '3.1.1' : '2.8.4' sdl_mixer_ver = '2.8.0' - sdl_ttf_ver = '2.24.0' + sdl_ttf_ver = (sdl_api == 3) ? '3.1.0' : '2.24.0' dlls = [] diff --git a/src_c/font.c b/src_c/font.c index 8530bcd3e1..ee97747222 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -135,9 +135,14 @@ static PyObject * fontmodule_init(PyObject *self, PyObject *_null) { if (!font_initialized) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + if (!TTF_Init()) +#else if (TTF_Init()) +#endif + { return RAISE(pgExc_SDLError, SDL_GetError()); - + } font_initialized = 1; } Py_RETURN_NONE; @@ -169,7 +174,11 @@ font_get_height(PyObject *self, PyObject *_null) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + return PyLong_FromLong(TTF_GetFontHeight(font)); +#else return PyLong_FromLong(TTF_FontHeight(font)); +#endif } static PyObject * @@ -180,7 +189,11 @@ font_get_descent(PyObject *self, PyObject *_null) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + return PyLong_FromLong(TTF_GetFontDescent(font)); +#else return PyLong_FromLong(TTF_FontDescent(font)); +#endif } static PyObject * @@ -191,7 +204,11 @@ font_get_ascent(PyObject *self, PyObject *_null) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + return PyLong_FromLong(TTF_GetFontAscent(font)); +#else return PyLong_FromLong(TTF_FontAscent(font)); +#endif } static PyObject * @@ -202,7 +219,11 @@ font_get_linesize(PyObject *self, PyObject *_null) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + return PyLong_FromLong(TTF_GetFontLineSkip(font)); +#else return PyLong_FromLong(TTF_FontLineSkip(font)); +#endif } static PyObject * @@ -453,7 +474,10 @@ font_getter_align(PyObject *self, void *closure) return RAISE_FONT_QUIT_ERROR(); } -#if SDL_TTF_VERSION_ATLEAST(2, 20, 0) +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + TTF_Font *font = PyFont_AsFont(self); + return PyLong_FromLong(TTF_GetFontWrapAlignment(font)); +#elif SDL_TTF_VERSION_ATLEAST(2, 20, 0) TTF_Font *font = PyFont_AsFont(self); return PyLong_FromLong(TTF_GetFontWrappedAlign(font)); #else @@ -492,7 +516,11 @@ font_setter_align(PyObject *self, PyObject *value, void *closure) return -1; } +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + TTF_SetFontWrapAlignment(font, val); +#else TTF_SetFontWrappedAlign(font, val); +#endif return 0; #else PyErr_SetString(pgExc_SDLError, @@ -611,12 +639,19 @@ font_render(PyObject *self, PyObject *args, PyObject *kwds) length string */ if (strlen(astring) == 0) { /* special 0 string case */ +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + int height = TTF_GetFontHeight(font); +#else int height = TTF_FontHeight(font); +#endif surf = PG_CreateSurface(0, height, SDL_PIXELFORMAT_XRGB8888); } else { /* normal case */ if (antialias && bg_rgba_obj == Py_None) { -#if SDL_TTF_VERSION_ATLEAST(2, 0, 18) +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + surf = TTF_RenderText_Blended_Wrapped(font, astring, 0, foreg, + wraplength); +#elif SDL_TTF_VERSION_ATLEAST(2, 0, 18) surf = TTF_RenderUTF8_Blended_Wrapped(font, astring, foreg, wraplength); #else @@ -624,7 +659,10 @@ font_render(PyObject *self, PyObject *args, PyObject *kwds) #endif } else if (antialias) { -#if SDL_TTF_VERSION_ATLEAST(2, 0, 18) +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + surf = TTF_RenderText_Shaded_Wrapped(font, astring, 0, foreg, + backg, wraplength); +#elif SDL_TTF_VERSION_ATLEAST(2, 0, 18) surf = TTF_RenderUTF8_Shaded_Wrapped(font, astring, foreg, backg, wraplength); #else @@ -632,7 +670,10 @@ font_render(PyObject *self, PyObject *args, PyObject *kwds) #endif } else { -#if SDL_TTF_VERSION_ATLEAST(2, 0, 18) +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + surf = TTF_RenderText_Solid_Wrapped(font, astring, 0, foreg, + wraplength); +#elif SDL_TTF_VERSION_ATLEAST(2, 0, 18) surf = TTF_RenderUTF8_Solid_Wrapped(font, astring, foreg, wraplength); #else @@ -642,9 +683,16 @@ font_render(PyObject *self, PyObject *args, PyObject *kwds) resolve to Render_Solid, that needs to be explicitly handled. */ if (surf != NULL && bg_rgba_obj != Py_None) { SDL_SetColorKey(surf, 0, 0); - surf->format->palette->colors[0].r = backg.r; - surf->format->palette->colors[0].g = backg.g; - surf->format->palette->colors[0].b = backg.b; +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + SDL_Palette *palette = SDL_GetSurfacePalette(surf); +#else + SDL_Palette *palette = surf->format->palette; +#endif + if (palette) { + palette->colors[0].r = backg.r; + palette->colors[0].g = backg.g; + palette->colors[0].b = backg.b; + } } } } @@ -683,7 +731,11 @@ font_size(PyObject *self, PyObject *text) return NULL; } string = PyBytes_AS_STRING(bytes); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + ecode = TTF_GetStringSize(font, string, 0, &w, &h) ? 0 : -1; +#else ecode = TTF_SizeUTF8(font, string, &w, &h); +#endif Py_DECREF(bytes); if (ecode) { return RAISE(pgExc_SDLError, TTF_GetError()); @@ -691,7 +743,12 @@ font_size(PyObject *self, PyObject *text) } else if (PyBytes_Check(text)) { string = PyBytes_AS_STRING(text); - if (TTF_SizeText(font, string, &w, &h)) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + if (!TTF_GetStringSize(font, string, 0, &w, &h)) +#else + if (TTF_SizeText(font, string, &w, &h)) +#endif + { return RAISE(pgExc_SDLError, TTF_GetError()); } } @@ -737,7 +794,13 @@ font_setter_point_size(PyFontObject *self, PyObject *value, void *closure) return -1; } - if (TTF_SetFontSize(font, val) == -1) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + /* TODO: can consider supporting float in python API */ + if (!TTF_SetFontSize(font, (float)val)) +#else + if (TTF_SetFontSize(font, val) == -1) +#endif + { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } @@ -786,7 +849,13 @@ font_set_ptsize(PyObject *self, PyObject *arg) "point_size cannot be equal to, or less than 0"); } - if (TTF_SetFontSize(font, val) == -1) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + /* TODO: can consider supporting float in python API */ + if (!TTF_SetFontSize(font, (float)val)) +#else + if (TTF_SetFontSize(font, val) == -1) +#endif + { return RAISE(pgExc_SDLError, SDL_GetError()); } ((PyFontObject *)self)->ptsize = val; @@ -806,7 +875,11 @@ font_getter_name(PyObject *self, void *closure) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + const char *font_name = TTF_GetFontFamilyName(font); +#else const char *font_name = TTF_FontFaceFamilyName(font); +#endif return PyUnicode_FromString(font_name ? font_name : ""); } @@ -819,7 +892,11 @@ font_getter_style_name(PyObject *self, void *closure) } TTF_Font *font = PyFont_AsFont(self); +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + const char *font_style_name = TTF_GetFontStyleName(font); +#else const char *font_style_name = TTF_FontFaceStyleName(font); +#endif return PyUnicode_FromString(font_style_name ? font_style_name : ""); } @@ -882,9 +959,16 @@ font_metrics(PyObject *self, PyObject *textobj) * TTF_GlyphMetrics() seems to return a value for any character, * using the default invalid character, if the char is not found. */ +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + if (!surrogate && /* conditional and */ + TTF_GetGlyphMetrics(font, (Uint16)ch, &minx, &maxx, &miny, &maxy, + &advance)) +#else if (!surrogate && /* conditional and */ !TTF_GlyphMetrics(font, (Uint16)ch, &minx, &maxx, &miny, &maxy, - &advance)) { + &advance)) +#endif + { listitem = Py_BuildValue("(iiiii)", minx, maxx, miny, maxy, advance); if (!listitem) { @@ -912,6 +996,14 @@ font_metrics(PyObject *self, PyObject *textobj) return list; } +/* This is taken from the harfbuzz header file. It converts script name in the + * format expected by sdl2 (a 4 char string) to the format expected by sdl3 + * (a single uint32 tag) */ +#define HB_TAG(c1, c2, c3, c4) \ + ((Uint32)((((uint32_t)(c1) & 0xFF) << 24) | \ + (((uint32_t)(c2) & 0xFF) << 16) | \ + (((uint32_t)(c3) & 0xFF) << 8) | ((uint32_t)(c4) & 0xFF))) + static PyObject * font_set_script(PyObject *self, PyObject *arg) { @@ -935,7 +1027,13 @@ font_set_script(PyObject *self, PyObject *arg) "script code must be exactly 4 characters"); } - if (TTF_SetFontScriptName(font, script_code) < 0) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + if (!TTF_SetFontScript(font, HB_TAG(script_code[0], script_code[1], + script_code[2], script_code[3]))) +#else + if (TTF_SetFontScriptName(font, script_code) < 0) +#endif + { return RAISE(pgExc_SDLError, SDL_GetError()); } #else @@ -1013,8 +1111,12 @@ font_set_direction(PyObject *self, PyObject *arg, PyObject *kwarg) " to https://github.com/pygame-community/pygame-ce"); } } - - if (TTF_SetFontDirection(font, dir)) { +#if SDL_TTF_VERSION_ATLEAST(3, 0, 0) + if (!TTF_SetFontDirection(font, dir)) +#else + if (TTF_SetFontDirection(font, dir)) +#endif + { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -1183,7 +1285,8 @@ font_init(PyFontObject *self, PyObject *args, PyObject *kwds) Py_BEGIN_ALLOW_THREADS; #if SDL_VERSION_ATLEAST(3, 0, 0) - font = TTF_OpenFontIO(rw, 1, fontsize); + /* TODO: can consider supporting float in python API */ + font = TTF_OpenFontIO(rw, 1, (float)fontsize); #else font = TTF_OpenFontRW(rw, 1, fontsize); #endif diff --git a/src_c/font.h b/src_c/font.h index f5eedb2537..358a66abf8 100644 --- a/src_c/font.h +++ b/src_c/font.h @@ -1,8 +1,15 @@ #ifndef PGFONT_INTERNAL_H #define PGFONT_INTERNAL_H -#include +#ifdef PG_SDL3 +#include + +// SDL3_ttf uses SDL3 error reporting API +#define TTF_GetError SDL_GetError +#else +#include +#endif /* test font initialization */ #define FONT_INIT_CHECK() \ if (!(*(int *)PyFONT_C_API[2])) \ diff --git a/src_c/meson.build b/src_c/meson.build index d56d6b014d..c67962b5ca 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -403,9 +403,6 @@ if sdl_image_dep.found() ) endif -# TODO: support SDL3 -if sdl_api != 3 - if sdl_ttf_dep.found() font = py.extension_module( 'font', @@ -417,6 +414,9 @@ if sdl_ttf_dep.found() ) endif +# TODO: support SDL3 +if sdl_api != 3 + if sdl_mixer_dep.found() mixer = py.extension_module( 'mixer', From 4c8e5364f4e3f7f1da1675e70f50650c64cab6fc Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 10 Feb 2025 20:05:00 +0530 Subject: [PATCH 046/441] Downgrade host image on debian multiarch --- .github/workflows/build-debian-multiarch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian-multiarch.yml b/.github/workflows/build-debian-multiarch.yml index a46ee7203c..e634673e9e 100644 --- a/.github/workflows/build-debian-multiarch.yml +++ b/.github/workflows/build-debian-multiarch.yml @@ -49,7 +49,7 @@ env: jobs: build-multiarch: name: Debian (Bookworm - 12) [${{ matrix.arch }}] - runs-on: ubuntu-24.04 + runs-on: ubuntu-22.04 strategy: fail-fast: false # if a particular matrix build fails, don't skip the rest @@ -118,7 +118,7 @@ jobs: test-armv7-on-armv6: needs: build-multiarch name: Debian (Bookworm - 12) [build - armv7, test - armv6] - runs-on: ubuntu-24.04 + runs-on: ubuntu-22.04 steps: - name: Download all multiarch artifacts uses: actions/download-artifact@v4 From 883c7dcb3a46c80ab5405f5aed97c2aa350225d0 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 9 Feb 2025 02:33:00 -0800 Subject: [PATCH 047/441] Update SDL to 2.32, mixer to 2.8.1 +SDL3/ SDL3_image windows as well --- buildconfig/download_win_prebuilt.py | 33 +++++++++---------- .../docker_base/sdl_libs/build-sdl2-libs.sh | 4 +-- .../docker_base/sdl_libs/sdl2.sha512 | 4 +-- meson.build | 6 ++-- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 8edaefe81b..6fc5800faf 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,20 +78,20 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.30.12/SDL2-devel-2.30.12-VC.zip', - 'e63d904330034ab9e6794eb1f54fe2fb7d21e9f7', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.0/SDL2-devel-2.32.0-VC.zip', + 'e4b39b4b81ca1d3beef1935113c7820e8d3bd307', ], [ - 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.2/SDL3-devel-3.2.2-VC.zip', - 'fabb3c78f7eebf6a877e8f91d17d6dd10a987b27' + 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.4/SDL3-devel-3.2.4-VC.zip', + '3576077236c7a66bf98d4b3d180aa4743ad5ce2e' ], [ 'https://github.com/pygame-community/SDL_image/releases/download/2.8.4-pgce/SDL2_image-devel-2.8.4-VCpgce.zip', 'b9b4a5d44cab57901003255a1c1f98a42282762b' ], [ - 'https://github.com/libsdl-org/SDL_image/releases/download/prerelease-3.1.1/SDL3_image-devel-3.1.1-VC.zip', - '01f751322e742bb9dd3121d5ef37214c0529cb7c' + 'https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.0/SDL3_image-devel-3.2.0-VC.zip', + '2aebab1f803edfb708622fa4e1afc0afadcf5c8b' ], [ 'https://github.com/libsdl-org/SDL_ttf/releases/download/release-2.24.0/SDL2_ttf-devel-2.24.0-VC.zip', @@ -102,8 +102,8 @@ def get_urls(x86=True, x64=True): '34bb4a03c6f0f6c9de3658bac98adc7029830578' ], [ - 'https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.0/SDL2_mixer-devel-2.8.0-VC.zip', - 'a10411644e08cd94f29712f430c7b71c407ae76d', + 'https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.1/SDL2_mixer-devel-2.8.1-VC.zip', + 'ea302368159ca64056b2519b3a624525f625220e', ], ]) if x86: @@ -224,24 +224,24 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL3_image-devel-3.1.1-VC/SDL3_image-3.1.1' + 'SDL3_image-devel-3.2.0-VC/SDL3_image-3.2.0' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3_image-3.1.1' + 'SDL3_image-3.2.0' ) ) copy( os.path.join( temp_dir, - 'SDL2_mixer-devel-2.8.0-VC/SDL2_mixer-2.8.0' + 'SDL2_mixer-devel-2.8.1-VC/SDL2_mixer-2.8.1' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2_mixer-2.8.0' + 'SDL2_mixer-2.8.1' ) ) copy( @@ -266,27 +266,26 @@ def copy(src, dst): 'SDL3_ttf-3.1.0' ) ) - copy( os.path.join( temp_dir, - 'SDL2-devel-2.30.12-VC/SDL2-2.30.12' + 'SDL2-devel-2.32.0-VC/SDL2-2.32.0' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.30.12' + 'SDL2-2.32.0' ) ) copy( os.path.join( temp_dir, - 'SDL3-devel-3.2.2-VC/SDL3-3.2.2' + 'SDL3-devel-3.2.4-VC/SDL3-3.2.4' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3-3.2.2' + 'SDL3-3.2.4' ) ) diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index 7a980d741b..d16a36bf15 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,13 +3,13 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.30.12" +SDL2_VER="2.32.0" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.4" IMG2="SDL2_image-$IMG2_VER" TTF2_VER="2.24.0" TTF2="SDL2_ttf-$TTF2_VER" -MIX2_VER="2.8.0" +MIX2_VER="2.8.1" MIX2="SDL2_mixer-$MIX2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index 8961f15d6f..4e066cea67 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -358dc9aabebdd1242245183a76d1ddff7b312f3db1f9fd247a7bd444bc8ca4c49e36a5a02bc577f2ee0b1f38f06f85b35a3db3616fdc9a6c67cd066db5152ac7 SDL2-2.30.12.tar.gz +a91b8105125f06118e8bfce2a5553fe053f7158dd02f06a36cfc535f09c401eb7da11072e576c6bf6e41fa2e02b08483b9cc4e11c658578b762e1b6c326a45bb SDL2-2.32.0.tar.gz a4b7436442be43b96dc7b90c9badd011da1622e283ae068b82367fcb72b7dd7a0357aec5550fe44103a77da75b8c570d5204fff11a805373f2194f92b8f71343 SDL2_image-2.8.4.tar.gz -5ddbc4b0b5fad2e0844a503daa79564b912654192599ef8fa7698531f08323ce01801f6bb17b2b3905020a3df362a967b7566ae725eb085da991578cc0807aad SDL2_mixer-2.8.0.tar.gz +6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index 13c5ebf54c..a3495574c0 100644 --- a/meson.build +++ b/meson.build @@ -109,9 +109,9 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.2' : '2.30.12' - sdl_image_ver = (sdl_api == 3) ? '3.1.1' : '2.8.4' - sdl_mixer_ver = '2.8.0' + sdl_ver = (sdl_api == 3) ? '3.2.4' : '2.32.0' + sdl_image_ver = (sdl_api == 3) ? '3.2.0' : '2.8.4' + sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.1.0' : '2.24.0' dlls = [] From 11961d76ee25b0ffe9061a7957caf137495a2ae0 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 25 Jan 2025 21:05:58 -0800 Subject: [PATCH 048/441] Pixelarray SDL3 --- src_c/meson.build | 3 - src_c/pixelarray.c | 95 +++++++++++++++++++----------- src_c/pixelarray_methods.c | 115 ++++++++++++++++++++++++------------- 3 files changed, 135 insertions(+), 78 deletions(-) diff --git a/src_c/meson.build b/src_c/meson.build index c67962b5ca..0365783512 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -249,8 +249,6 @@ bufferproxy = py.extension_module( subdir: pg, ) -# TODO: support SDL3 -if sdl_api != 3 pixelarray = py.extension_module( 'pixelarray', 'pixelarray.c', @@ -259,7 +257,6 @@ pixelarray = py.extension_module( install: true, subdir: pg, ) -endif math = py.extension_module( 'math', diff --git a/src_c/pixelarray.c b/src_c/pixelarray.c index f13c604553..1486031de6 100644 --- a/src_c/pixelarray.c +++ b/src_c/pixelarray.c @@ -23,6 +23,7 @@ #include "pygame.h" #include "pgcompat.h" +#include #include "doc/pixelarray_doc.h" @@ -971,6 +972,13 @@ _array_assign_array(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high, return -1; } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + PG_PixelFormat *val_surf_format = PG_GetSurfaceFormat(val_surf); + if (surf_format == NULL || val_surf_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + /* If we reassign the same array, we need to copy the pixels * first. */ if (SURFACE_EQUALS(array, val)) { @@ -1021,20 +1029,23 @@ _array_assign_array(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high, } break; case 3: { +// Note: +// Why is the 24 bit case pixelformat aware but none of the rest are? +// - Starbuck, jan. 2025 #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) - Uint32 Roffset = surf->format->Rshift >> 3; - Uint32 Goffset = surf->format->Gshift >> 3; - Uint32 Boffset = surf->format->Bshift >> 3; - Uint32 vRoffset = val_surf->format->Rshift >> 3; - Uint32 vGoffset = val_surf->format->Gshift >> 3; - Uint32 vBoffset = val_surf->format->Bshift >> 3; + Uint32 Roffset = surf_format->Rshift >> 3; + Uint32 Goffset = surf_format->Gshift >> 3; + Uint32 Boffset = surf_format->Bshift >> 3; + Uint32 vRoffset = val_surf_format->Rshift >> 3; + Uint32 vGoffset = val_surf_format->Gshift >> 3; + Uint32 vBoffset = val_surf_format->Bshift >> 3; #else - Uint32 Roffset = 2 - (surf->format->Rshift >> 3); - Uint32 Goffset = 2 - (surf->format->Gshift >> 3); - Uint32 Boffset = 2 - (surf->format->Bshift >> 3); - Uint32 vRoffset = 2 - (val_surf->format->Rshift >> 3); - Uint32 vGoffset = 2 - (val_surf->format->Gshift >> 3); - Uint32 vBoffset = 2 - (val_surf->format->Bshift >> 3); + Uint32 Roffset = 2 - (surf_format->Rshift >> 3); + Uint32 Goffset = 2 - (surf_format->Gshift >> 3); + Uint32 Boffset = 2 - (surf_format->Bshift >> 3); + Uint32 vRoffset = 2 - (val_surf_format->Rshift >> 3); + Uint32 vGoffset = 2 - (val_surf_format->Gshift >> 3); + Uint32 vBoffset = 2 - (val_surf_format->Bshift >> 3); #endif for (y = 0; y < dim1; ++y) { pixel_p = pixelrow; @@ -1076,7 +1087,6 @@ _array_assign_sequence(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high, PyObject *val) { SDL_Surface *surf = pgSurface_AsSurface(array->surface); - SDL_PixelFormat *format; Py_ssize_t dim0 = ABS(high - low); Py_ssize_t dim1 = array->shape[1]; Py_ssize_t stride0 = high >= low ? array->strides[0] : -array->strides[0]; @@ -1097,8 +1107,13 @@ _array_assign_sequence(pgPixelArrayObject *array, Py_ssize_t low, return -1; } - format = surf->format; - bpp = PG_FORMAT_BytesPerPixel(format); + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + + bpp = PG_FORMAT_BytesPerPixel(surf_format); if (!dim1) { dim1 = 1; @@ -1150,13 +1165,13 @@ _array_assign_sequence(pgPixelArrayObject *array, Py_ssize_t low, break; case 3: { #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) - Uint32 Roffset = surf->format->Rshift >> 3; - Uint32 Goffset = surf->format->Gshift >> 3; - Uint32 Boffset = surf->format->Bshift >> 3; + Uint32 Roffset = surf_format->Rshift >> 3; + Uint32 Goffset = surf_format->Gshift >> 3; + Uint32 Boffset = surf_format->Bshift >> 3; #else - Uint32 Roffset = 2 - (surf->format->Rshift >> 3); - Uint32 Goffset = 2 - (surf->format->Gshift >> 3); - Uint32 Boffset = 2 - (surf->format->Bshift >> 3); + Uint32 Roffset = 2 - (surf_format->Rshift >> 3); + Uint32 Goffset = 2 - (surf_format->Gshift >> 3); + Uint32 Boffset = 2 - (surf_format->Bshift >> 3); #endif for (y = 0; y < dim1; ++y) { pixel_p = pixelrow; @@ -1206,7 +1221,13 @@ _array_assign_slice(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high, Py_ssize_t x; Py_ssize_t y; - bpp = PG_SURF_BytesPerPixel(surf); + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + + bpp = PG_FORMAT_BytesPerPixel(surf_format); if (!dim1) { dim1 = 1; @@ -1241,13 +1262,13 @@ _array_assign_slice(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high, } break; case 3: { #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) - Uint32 Roffset = surf->format->Rshift >> 3; - Uint32 Goffset = surf->format->Gshift >> 3; - Uint32 Boffset = surf->format->Bshift >> 3; + Uint32 Roffset = surf_format->Rshift >> 3; + Uint32 Goffset = surf_format->Gshift >> 3; + Uint32 Boffset = surf_format->Bshift >> 3; #else - Uint32 Roffset = 2 - (surf->format->Rshift >> 3); - Uint32 Goffset = 2 - (surf->format->Gshift >> 3); - Uint32 Boffset = 2 - (surf->format->Bshift >> 3); + Uint32 Roffset = 2 - (surf_format->Rshift >> 3); + Uint32 Goffset = 2 - (surf_format->Gshift >> 3); + Uint32 Boffset = 2 - (surf_format->Bshift >> 3); #endif Uint8 r = (Uint8)(color >> 16); Uint8 g = (Uint8)(color >> 8); @@ -1352,6 +1373,12 @@ _pxarray_ass_item(pgPixelArrayObject *array, Py_ssize_t index, PyObject *value) dim1 = 1; } + PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); + if (surf_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + Py_BEGIN_ALLOW_THREADS; /* Single value assignment. */ switch (bpp) { @@ -1369,13 +1396,13 @@ _pxarray_ass_item(pgPixelArrayObject *array, Py_ssize_t index, PyObject *value) break; case 3: { #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) - Uint32 Roffset = surf->format->Rshift >> 3; - Uint32 Goffset = surf->format->Gshift >> 3; - Uint32 Boffset = surf->format->Bshift >> 3; + Uint32 Roffset = surf_format->Rshift >> 3; + Uint32 Goffset = surf_format->Gshift >> 3; + Uint32 Boffset = surf_format->Bshift >> 3; #else - Uint32 Roffset = 2 - (surf->format->Rshift >> 3); - Uint32 Goffset = 2 - (surf->format->Gshift >> 3); - Uint32 Boffset = 2 - (surf->format->Bshift >> 3); + Uint32 Roffset = 2 - (surf_format->Rshift >> 3); + Uint32 Goffset = 2 - (surf_format->Gshift >> 3); + Uint32 Boffset = 2 - (surf_format->Bshift >> 3); #endif for (y = 0; y < dim1; ++y) { pixel_p[Roffset] = (Uint8)(color >> 16); diff --git a/src_c/pixelarray_methods.c b/src_c/pixelarray_methods.c index a11be9ab71..97725c5f38 100644 --- a/src_c/pixelarray_methods.c +++ b/src_c/pixelarray_methods.c @@ -28,6 +28,18 @@ wb * (b1 - b2) * (b1 - b2)) / \ 255.0) +#define PXM_GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, palette, ppa) \ + PG_GetRGBA(px, fmt, palette, &(_sR), &(_sG), &(_sB), &(_sA)); \ + if (!ppa) { \ + _sA = 255; \ + } + +#define PXM_GET_PIXELVALS_1(sr, sg, sb, sa, _src, _palette) \ + sr = _palette->colors[*((Uint8 *)(_src))].r; \ + sg = _palette->colors[*((Uint8 *)(_src))].g; \ + sb = _palette->colors[*((Uint8 *)(_src))].b; \ + sa = 255; + #define WR_NTSC 0.299 #define WG_NTSC 0.587 #define WB_NTSC 0.114 @@ -339,7 +351,6 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) PyObject *delcolor = 0; PyObject *replcolor = 0; SDL_Surface *surf; - SDL_PixelFormat *format; Py_ssize_t dim0 = array->shape[0]; Py_ssize_t dim1 = array->shape[1]; Py_ssize_t stride0 = array->strides[0]; @@ -372,8 +383,13 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) "distance must be in the range from 0.0 to 1.0"); } - format = surf->format; - bpp = PG_SURF_BytesPerPixel(surf); + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + bpp = PG_FORMAT_BytesPerPixel(format); if (!_get_color_from_object(delcolor, surf, &dcolor) || !_get_color_from_object(replcolor, surf, &rcolor)) { @@ -385,7 +401,7 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) } if (distance != 0.0) { - SDL_GetRGB(dcolor, format, &r1, &g1, &b1); + PG_GetRGB(dcolor, format, palette, &r1, &g1, &b1); } if (!dim1) { @@ -403,7 +419,7 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = pixel_p; if (distance != 0.0) { - GET_PIXELVALS_1(r2, g2, b2, a2, px_p, format); + PXM_GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint8)rcolor; @@ -427,8 +443,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint16 *)pixel_p; if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, format, - ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, + format, palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint16)rcolor; @@ -463,7 +479,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) ((Uint32)pixel_p[Goffset] << 8) + ((Uint32)pixel_p[Boffset])); if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { pixel_p[Roffset] = (Uint8)(rcolor >> 16); @@ -484,15 +501,16 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) default: /* case 4: */ { Uint32 *px_p; - int ppa = (SDL_ISPIXELFORMAT_ALPHA(format->format) && - surf->format->Amask); + int ppa = + (SDL_ISPIXELFORMAT_ALPHA(format->format) && format->Amask); for (y = 0; y < dim1; ++y) { pixel_p = pixelrow; for (x = 0; x < dim0; ++x) { px_p = (Uint32 *)pixel_p; if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = rcolor; @@ -530,7 +548,6 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) Py_ssize_t y; PyObject *surface; SDL_Surface *surf; - SDL_PixelFormat *format; pgPixelArrayObject *new_array; Py_ssize_t dim0; Py_ssize_t dim1; @@ -570,16 +587,23 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) } surf = pgSurface_AsSurface(surface); - format = surf->format; - bpp = PG_SURF_BytesPerPixel(surf); + + PG_PixelFormat *format; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + bpp = PG_FORMAT_BytesPerPixel(format); + dim0 = new_array->shape[0]; dim1 = new_array->shape[1]; stride0 = new_array->strides[0]; stride1 = new_array->strides[1]; pixels = new_array->pixels; - black = SDL_MapRGBA(format, 0, 0, 0, 255); - white = SDL_MapRGBA(format, 255, 255, 255, 255); + black = PG_MapRGBA(format, palette, 0, 0, 0, 255); + white = PG_MapRGBA(format, palette, 255, 255, 255, 255); if (!_get_color_from_object(excolor, surf, &color)) { Py_DECREF(new_array); @@ -587,7 +611,7 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) } if (distance != 0.0) { - SDL_GetRGB(color, format, &r1, &g1, &b1); + PG_GetRGB(color, format, palette, &r1, &g1, &b1); } if (!dim1) { @@ -605,7 +629,7 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = pixel_p; if (distance != 0.0) { - GET_PIXELVALS_1(r2, g2, b2, a2, px_p, format); + PXM_GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint8)white; @@ -632,8 +656,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint16 *)pixel_p; if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, format, - ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, + format, palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint16)white; @@ -677,7 +701,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) ((Uint32)pixel_p[Goffset] << 8) + ((Uint32)pixel_p[Boffset])); if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { pixel_p[Roffset] = white_r; @@ -716,7 +741,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint32 *)pixel_p; if (distance != 0.0) { - GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = white; @@ -745,11 +771,9 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) Py_ssize_t dim0 = array->shape[0]; Py_ssize_t dim1 = array->shape[1]; SDL_Surface *surf; - SDL_PixelFormat *format; pgPixelArrayObject *other_array; PyObject *weights = 0; SDL_Surface *other_surf; - SDL_PixelFormat *other_format; Py_ssize_t other_stride0; Py_ssize_t other_stride1; Uint8 *other_pixels; @@ -767,7 +791,6 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) Py_ssize_t y; pgPixelArrayObject *new_array; PyObject *new_surface; - SDL_PixelFormat *new_format; Py_ssize_t stride0; Py_ssize_t stride1; Uint8 *pixels; @@ -800,10 +823,18 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) return 0; } - format = surf->format; - bpp = PG_SURF_BytesPerPixel(surf); other_surf = pgSurface_AsSurface(other_array->surface); - other_format = other_surf->format; + + PG_PixelFormat *format, *other_format; + SDL_Palette *palette, *other_palette; + if (!PG_GetSurfaceDetails(surf, &format, &palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + if (!PG_GetSurfaceDetails(other_surf, &other_format, &other_palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + bpp = PG_SURF_BytesPerPixel(surf); if (PG_FORMAT_BytesPerPixel(other_format) != bpp) { /* bpp do not match. We cannot guarantee that the padding and co @@ -828,13 +859,12 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) return 0; } - new_format = surf->format; stride0 = new_array->strides[0]; stride1 = new_array->strides[1]; pixels = new_array->pixels; - black = SDL_MapRGBA(format, 0, 0, 0, 255); - white = SDL_MapRGBA(format, 255, 255, 255, 255); + black = PG_MapRGBA(format, palette, 0, 0, 0, 255); + white = PG_MapRGBA(format, palette, 255, 255, 255, 255); Py_BEGIN_ALLOW_THREADS; if (!dim1) { @@ -855,9 +885,9 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = byte_p; other_pixel_p = other_byte_p; if (distance != 0.0) { - GET_PIXELVALS_1(r1, g1, b1, a1, pixel_p, new_format); - GET_PIXELVALS_1(r2, g2, b2, a2, other_pixel_p, - other_format); + PXM_GET_PIXELVALS_1(r1, g1, b1, a1, pixel_p, palette); + PXM_GET_PIXELVALS_1(r2, g2, b2, a2, other_pixel_p, + other_palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = (Uint8)white; @@ -892,10 +922,11 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = (Uint16 *)byte_p; other_pixel_p = (Uint16 *)other_byte_p; if (distance != 0.0) { - GET_PIXELVALS(r1, g1, b1, a1, (Uint32)*pixel_p, format, - ppa); - GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*other_pixel_p, - other_format, other_ppa); + PXM_GET_PIXELVALS(r1, g1, b1, a1, (Uint32)*pixel_p, + format, palette, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, + (Uint32)*other_pixel_p, other_format, + other_palette, other_ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = (Uint16)white; @@ -995,9 +1026,11 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = (Uint32 *)byte_p; other_pixel_p = (Uint32 *)other_byte_p; if (distance != 0.0) { - GET_PIXELVALS(r1, g1, b1, a1, *pixel_p, format, ppa); - GET_PIXELVALS(r2, g2, b2, a2, *other_pixel_p, - other_format, other_ppa); + PXM_GET_PIXELVALS(r1, g1, b1, a1, *pixel_p, format, + palette, ppa); + PXM_GET_PIXELVALS(r2, g2, b2, a2, *other_pixel_p, + other_format, other_palette, + other_ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = white; From 26aebf99ec4e92b59d4d0dcc599198cafbf0b605 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 14 Feb 2025 22:49:03 -0800 Subject: [PATCH 049/441] Add comment about temporary macro definitions --- src_c/pixelarray_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src_c/pixelarray_methods.c b/src_c/pixelarray_methods.c index 97725c5f38..cc543b3e79 100644 --- a/src_c/pixelarray_methods.c +++ b/src_c/pixelarray_methods.c @@ -28,6 +28,9 @@ wb * (b1 - b2) * (b1 - b2)) / \ 255.0) +// TODO: once things are fully ported, consolidate PXM_GET_PIXELVALS +// and PXM_GET_PIXELVALS_1 back into GET_PIXELVALS and GET_PIXELVALS_1 +// from surface.h #define PXM_GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, palette, ppa) \ PG_GetRGBA(px, fmt, palette, &(_sR), &(_sG), &(_sB), &(_sA)); \ if (!ppa) { \ From 8b621db77a85b00e4b7bb24025521bb8b2e22192 Mon Sep 17 00:00:00 2001 From: itzpr3d4t0r <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Sun, 5 Jan 2025 14:02:22 +0100 Subject: [PATCH 050/441] Add Font.set_linesize() (TTF 2.24.0 feature) --- buildconfig/stubs/pygame/font.pyi | 1 + docs/reST/ref/font.rst | 10 ++++++++++ src_c/doc/font_doc.h | 1 + src_c/font.c | 24 ++++++++++++++++++++++++ test/font_test.py | 20 ++++++++++++++++++++ 5 files changed, 56 insertions(+) diff --git a/buildconfig/stubs/pygame/font.pyi b/buildconfig/stubs/pygame/font.pyi index efc72f0ae4..b05eb58cd5 100644 --- a/buildconfig/stubs/pygame/font.pyi +++ b/buildconfig/stubs/pygame/font.pyi @@ -80,6 +80,7 @@ class Font: ) -> list[tuple[int, int, int, int, int]]: ... def get_italic(self) -> bool: ... def get_linesize(self) -> int: ... + def set_linesize(self, linesize: int, /) -> None: ... def get_height(self) -> int: ... def get_ascent(self) -> int: ... def get_descent(self) -> int: ... diff --git a/docs/reST/ref/font.rst b/docs/reST/ref/font.rst index a538a48aec..ca22b5e9b5 100644 --- a/docs/reST/ref/font.rst +++ b/docs/reST/ref/font.rst @@ -511,6 +511,16 @@ solves no longer exists, it will likely be removed in the future. .. ## Font.get_linesize ## + .. method:: set_linesize + + | :sl:`set the line space of the font text` + | :sg:`set_linesize(linesize) -> int` + + Set the height in pixels for a line of text with the font. When rendering + multiple lines of text this refers to the amount of space between lines. + + .. ## Font.set_linesize ## + .. method:: get_height | :sl:`get the height of the font` diff --git a/src_c/doc/font_doc.h b/src_c/doc/font_doc.h index 64ddb16c1d..fb21603c75 100644 --- a/src_c/doc/font_doc.h +++ b/src_c/doc/font_doc.h @@ -29,6 +29,7 @@ #define DOC_FONT_FONT_METRICS "metrics(text, /) -> list\ngets the metrics for each character in the passed string" #define DOC_FONT_FONT_GETITALIC "get_italic() -> bool\ncheck if the text will be rendered italic" #define DOC_FONT_FONT_GETLINESIZE "get_linesize() -> int\nget the line space of the font text" +#define DOC_FONT_FONT_SETLINESIZE "set_linesize(linesize) -> int\nset the line space of the font text" #define DOC_FONT_FONT_GETHEIGHT "get_height() -> int\nget the height of the font" #define DOC_FONT_FONT_SETPOINTSIZE "set_point_size(size, /) -> int\nset the point size of the font" #define DOC_FONT_FONT_GETPOINTSIZE "get_point_size() -> int\nget the point size of the font" diff --git a/src_c/font.c b/src_c/font.c index ee97747222..7f1b2c1718 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -226,6 +226,29 @@ font_get_linesize(PyObject *self, PyObject *_null) #endif } +static PyObject * +font_set_linesize(PyObject *self, PyObject *arg) +{ + if (!PgFont_GenerationCheck(self)) { + return RAISE_FONT_QUIT_ERROR(); + } + +#if SDL_TTF_VERSION_ATLEAST(2, 24, 0) + TTF_Font *font = PyFont_AsFont(self); + int linesize = PyLong_AsLong(arg); + if (linesize < 0 || PyErr_Occurred()) { + return RAISE(PyExc_ValueError, "linesize must be >= 0"); + } + TTF_SetFontLineSkip(font, linesize); + + Py_RETURN_NONE; +#else + return RAISE( + PyExc_NotImplementedError, + "TTF_SetFontLineSkip is not available in this version of SDL_ttf"); +#endif +} + static PyObject * _font_get_style_flag_as_py_bool(PyObject *self, int flag) { @@ -1155,6 +1178,7 @@ static PyMethodDef font_methods[] = { {"get_ascent", font_get_ascent, METH_NOARGS, DOC_FONT_FONT_GETASCENT}, {"get_linesize", font_get_linesize, METH_NOARGS, DOC_FONT_FONT_GETLINESIZE}, + {"set_linesize", font_set_linesize, METH_O, DOC_FONT_FONT_SETLINESIZE}, {"get_bold", font_get_bold, METH_NOARGS, DOC_FONT_FONT_GETBOLD}, {"set_bold", font_set_bold, METH_O, DOC_FONT_FONT_SETBOLD}, {"get_italic", font_get_italic, METH_NOARGS, DOC_FONT_FONT_GETITALIC}, diff --git a/test/font_test.py b/test/font_test.py index f008da2e69..cb613d494d 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -385,6 +385,24 @@ def test_get_linesize(self): self.assertTrue(isinstance(linesize, int)) self.assertTrue(linesize > 0) + def test_set_linesize(self): + f = pygame_font.Font(None, 20) + linesize = f.get_linesize() + + # check increasing linesize + f.set_linesize(linesize + 1) + self.assertEqual(f.get_linesize(), linesize + 1) + + # check random linesize + expected_linesizes = [30, 1, 22, 34, 5, 10, 0] + for expected_size in expected_linesizes: + f.set_linesize(expected_size) + self.assertEqual(f.get_linesize(), expected_size) + + # check invalid linesize + with self.assertRaises(ValueError): + f.set_linesize(-1) + def test_metrics(self): # Ensure bytes decoding works correctly. Can only compare results # with unicode for now. @@ -867,6 +885,7 @@ def test_font_method_should_raise_exception_after_quit(self): ("get_height", ()), ("get_italic", ()), ("get_linesize", ()), + ("set_linesize", (2,)), ("get_sized_descender", ()), ("get_underline", ()), ("metrics", ("any text",)), @@ -882,6 +901,7 @@ def test_font_method_should_raise_exception_after_quit(self): ("get_descent", ()), ("get_ascent", ()), ("get_linesize", ()), + ("set_linesize", (2,)), ("get_bold", ()), ("set_bold", (True,)), ("get_italic", ()), From b26df5d8e60b93e1fc34352c7025d262c257755e Mon Sep 17 00:00:00 2001 From: itzpr3d4t0r <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Sun, 5 Jan 2025 14:14:52 +0100 Subject: [PATCH 051/441] Better error messages and tentative tests fix? --- src_c/font.c | 7 +++++-- test/font_test.py | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src_c/font.c b/src_c/font.c index 7f1b2c1718..79ebad543b 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -236,9 +236,12 @@ font_set_linesize(PyObject *self, PyObject *arg) #if SDL_TTF_VERSION_ATLEAST(2, 24, 0) TTF_Font *font = PyFont_AsFont(self); int linesize = PyLong_AsLong(arg); - if (linesize < 0 || PyErr_Occurred()) { + if (PyErr_Occurred()) + return NULL; + + if (linesize < 0) return RAISE(PyExc_ValueError, "linesize must be >= 0"); - } + TTF_SetFontLineSkip(font, linesize); Py_RETURN_NONE; diff --git a/test/font_test.py b/test/font_test.py index cb613d494d..ef8762b3fc 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -901,7 +901,6 @@ def test_font_method_should_raise_exception_after_quit(self): ("get_descent", ()), ("get_ascent", ()), ("get_linesize", ()), - ("set_linesize", (2,)), ("get_bold", ()), ("set_bold", (True,)), ("get_italic", ()), @@ -919,6 +918,11 @@ def test_font_method_should_raise_exception_after_quit(self): skip_methods = set() version = pygame.font.get_sdl_ttf_version() if version >= (2, 0, 18): + if version >= (2, 24, 0): + methods.append(("set_linesize", (2,))) + else: + skip_methods.add("set_linesize") + methods.append(("get_point_size", ())) methods.append(("set_point_size", (34,))) else: From e84eea57a14f77701da5b1783a10c1779fa71772 Mon Sep 17 00:00:00 2001 From: itzpr3d4t0r <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Sun, 5 Jan 2025 14:18:31 +0100 Subject: [PATCH 052/441] tests fix? --- test/font_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/font_test.py b/test/font_test.py index ef8762b3fc..ed54001bc4 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -885,7 +885,6 @@ def test_font_method_should_raise_exception_after_quit(self): ("get_height", ()), ("get_italic", ()), ("get_linesize", ()), - ("set_linesize", (2,)), ("get_sized_descender", ()), ("get_underline", ()), ("metrics", ("any text",)), From 0467eb68842432e53de6fde53c595be531d22db7 Mon Sep 17 00:00:00 2001 From: itzpr3d4t0r <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:04:14 +0100 Subject: [PATCH 053/441] tests fix? --- test/font_test.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/font_test.py b/test/font_test.py index ed54001bc4..dd42956a2e 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -385,6 +385,10 @@ def test_get_linesize(self): self.assertTrue(isinstance(linesize, int)) self.assertTrue(linesize > 0) + @unittest.skipIf( + pygame.font.get_sdl_ttf_version() < (2, 24, 0), + "supported in SDL_ttf 2.24.0 onwards", + ) def test_set_linesize(self): f = pygame_font.Font(None, 20) linesize = f.get_linesize() @@ -917,11 +921,6 @@ def test_font_method_should_raise_exception_after_quit(self): skip_methods = set() version = pygame.font.get_sdl_ttf_version() if version >= (2, 0, 18): - if version >= (2, 24, 0): - methods.append(("set_linesize", (2,))) - else: - skip_methods.add("set_linesize") - methods.append(("get_point_size", ())) methods.append(("set_point_size", (34,))) else: @@ -929,6 +928,11 @@ def test_font_method_should_raise_exception_after_quit(self): skip_methods.add("set_point_size") skip_methods.add("point_size") + if version >= (2, 24, 0): + methods.append(("set_linesize", (2,))) + else: + skip_methods.add("set_linesize") + if version < (2, 20, 0): skip_methods.add("align") From dd6854c0adc82098f3d26415d536c5c466af9cfc Mon Sep 17 00:00:00 2001 From: itzpr3d4t0r <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Tue, 28 Jan 2025 11:05:38 +0100 Subject: [PATCH 054/441] Skip on ftfont. --- test/font_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/font_test.py b/test/font_test.py index dd42956a2e..e71b13a652 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -390,6 +390,9 @@ def test_get_linesize(self): "supported in SDL_ttf 2.24.0 onwards", ) def test_set_linesize(self): + if pygame_font.__name__ == "pygame.ftfont": + return # not a pygame.ftfont thing + f = pygame_font.Font(None, 20) linesize = f.get_linesize() From d01ceeda91c6acaac4559c4209deae43a8c61428 Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 4 Feb 2025 10:34:04 +0530 Subject: [PATCH 055/441] Add full unicode support to `Font.metrics` --- docs/reST/ref/font.rst | 3 +++ src_c/font.c | 48 +++++++++++++++++------------------------- test/font_test.py | 8 ++++++- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/reST/ref/font.rst b/docs/reST/ref/font.rst index a538a48aec..d6b89f0210 100644 --- a/docs/reST/ref/font.rst +++ b/docs/reST/ref/font.rst @@ -487,6 +487,9 @@ solves no longer exists, it will likely be removed in the future. advance), ...]. None is entered in the list for each unrecognized character. + .. versionchanged:: 2.5.4 This function now supports all unicode codepoints. + Previously, only a subset that was representable in UCS-2 was supported. + .. ## Font.metrics ## .. method:: get_italic diff --git a/src_c/font.c b/src_c/font.c index ee97747222..2a91432127 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -909,62 +909,54 @@ font_metrics(PyObject *self, PyObject *textobj) TTF_Font *font = PyFont_AsFont(self); PyObject *list; - Py_ssize_t length; Py_ssize_t i; int minx; int maxx; int miny; int maxy; int advance; - PyObject *obj; PyObject *listitem; - Uint16 *buffer; - Uint16 ch; - PyObject *temp; - int surrogate; + Py_UCS4 *buffer; + Py_UCS4 ch; if (!PgFont_GenerationCheck(self)) { return RAISE_FONT_QUIT_ERROR(); } if (PyUnicode_Check(textobj)) { - obj = textobj; - Py_INCREF(obj); + Py_INCREF(textobj); } else if (PyBytes_Check(textobj)) { - obj = PyUnicode_FromEncodedObject(textobj, "UTF-8", NULL); - if (!obj) { + textobj = PyUnicode_FromEncodedObject(textobj, "UTF-8", NULL); + if (!textobj) { return NULL; } } else { return RAISE_TEXT_TYPE_ERROR(); } - temp = PyUnicode_AsUTF16String(obj); - Py_DECREF(obj); - if (!temp) + buffer = PyUnicode_AsUCS4Copy(textobj); + Py_DECREF(textobj); + if (!buffer) return NULL; - obj = temp; list = PyList_New(0); if (!list) { - Py_DECREF(obj); + PyMem_Free(buffer); return NULL; } - buffer = (Uint16 *)PyBytes_AS_STRING(obj); - length = PyBytes_GET_SIZE(obj) / sizeof(Uint16); - for (i = 1 /* skip BOM */; i < length; i++) { - ch = buffer[i]; - surrogate = Py_UNICODE_IS_SURROGATE(ch); + for (i = 0; (ch = buffer[i]); i++) { /* TODO: * TTF_GlyphMetrics() seems to return a value for any character, * using the default invalid character, if the char is not found. */ #if SDL_TTF_VERSION_ATLEAST(3, 0, 0) - if (!surrogate && /* conditional and */ - TTF_GetGlyphMetrics(font, (Uint16)ch, &minx, &maxx, &miny, &maxy, + if (TTF_GetGlyphMetrics(font, ch, &minx, &maxx, &miny, &maxy, + &advance)) +#elif SDL_TTF_VERSION_ATLEAST(2, 0, 18) + if (!TTF_GlyphMetrics32(font, ch, &minx, &maxx, &miny, &maxy, &advance)) #else - if (!surrogate && /* conditional and */ + if (ch <= 0xFFFF && /* conditional and */ !TTF_GlyphMetrics(font, (Uint16)ch, &minx, &maxx, &miny, &maxy, &advance)) #endif @@ -973,26 +965,24 @@ font_metrics(PyObject *self, PyObject *textobj) Py_BuildValue("(iiiii)", minx, maxx, miny, maxy, advance); if (!listitem) { Py_DECREF(list); - Py_DECREF(obj); + PyMem_Free(buffer); return NULL; } } else { - /* Not UCS-2 or no matching metrics. */ + /* Not UCS-2 (and old SDL) or no matching metrics. */ Py_INCREF(Py_None); listitem = Py_None; - if (surrogate) - i++; } if (0 != PyList_Append(list, listitem)) { Py_DECREF(list); Py_DECREF(listitem); - Py_DECREF(obj); + PyMem_Free(buffer); return NULL; /* Exception already set. */ } Py_DECREF(listitem); } - Py_DECREF(obj); + PyMem_Free(buffer); return list; } diff --git a/test/font_test.py b/test/font_test.py index f008da2e69..6f2fd45b4e 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -416,7 +416,13 @@ def test_metrics(self): bm = f.metrics(u) self.assertEqual(len(bm), 1) - self.assertIsNone(bm[0]) + if ( + pygame.font.get_sdl_ttf_version() >= (2, 0, 18) + and pygame_font.__name__ != "pygame.ftfont" + ): + self.assertIsNotNone(bm[0]) + else: + self.assertIsNone(bm[0]) return # unfinished # The documentation is useless here. How large a list? From efeb3ff8be3f0a8ab529e20a4d133302fb2aed1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 18 Feb 2025 20:31:33 +0100 Subject: [PATCH 056/441] Add interface for _sdl2.video classes (#3317) * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes --- buildconfig/Setup.Android.SDL2.in | 1 + buildconfig/Setup.Emscripten.SDL2.in | 1 + buildconfig/Setup.SDL2.in | 1 + src_c/_pygame.h | 1 + src_c/include/_pygame.h | 46 ++++++++++ src_c/meson.build | 12 +++ src_c/render.c | 126 +++++++++++++++++++++++++++ src_c/static.c | 6 ++ 8 files changed, 194 insertions(+) create mode 100644 src_c/render.c diff --git a/buildconfig/Setup.Android.SDL2.in b/buildconfig/Setup.Android.SDL2.in index fc556ad024..610d897d8c 100644 --- a/buildconfig/Setup.Android.SDL2.in +++ b/buildconfig/Setup.Android.SDL2.in @@ -62,4 +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) +_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 28e86f1e42..9c465102f1 100644 --- a/buildconfig/Setup.Emscripten.SDL2.in +++ b/buildconfig/Setup.Emscripten.SDL2.in @@ -64,6 +64,7 @@ rect src_c/void.c rwobject src_c/void.c system src_c/void.c window 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 011b8d1404..0acde7e2fe 100644 --- a/buildconfig/Setup.SDL2.in +++ b/buildconfig/Setup.SDL2.in @@ -75,3 +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) +_render src_c/render.c $(SDL) $(DEBUG) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 77fcd2cb50..f989034a2e 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -616,6 +616,7 @@ typedef enum { #define PYGAMEAPI_BASE_NUMSLOTS 30 #define PYGAMEAPI_EVENT_NUMSLOTS 10 #define PYGAMEAPI_WINDOW_NUMSLOTS 1 +#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 41c186eddb..5ae7f13ab2 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -520,6 +520,50 @@ typedef struct { #define import_pygame_window() IMPORT_PYGAME_MODULE(window) #endif +typedef struct pgTextureObject pgTextureObject; + +/* + * Render module + */ +typedef struct { + PyObject_HEAD SDL_Renderer *renderer; + pgWindowObject *window; + pgTextureObject *target; + SDL_bool _is_borrowed; +} pgRendererObject; + +struct pgTextureObject { + PyObject_HEAD SDL_Texture *texture; + pgRendererObject *renderer; + int width; + int height; +}; + +typedef struct { + PyObject_HEAD pgTextureObject *texture; + pgRectObject *srcrect; + pgColorObject *color; + float angle; + float alpha; + SDL_bool has_origin; + SDL_FPoint origin; + SDL_bool flip_x; + SDL_bool flip_y; + SDL_BlendMode blend_mode; +} pgImageObject; + +#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 *)&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_render() IMPORT_PYGAME_MODULE(_render) +#endif + #define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE /* @@ -539,6 +583,7 @@ PYGAMEAPI_DEFINE_SLOTS(pixelarray); PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); PYGAMEAPI_DEFINE_SLOTS(window); +PYGAMEAPI_DEFINE_SLOTS(_render); PYGAMEAPI_DEFINE_SLOTS(geometry); #else /* ~PYGAME_H */ PYGAMEAPI_EXTERN_SLOTS(base); @@ -553,6 +598,7 @@ PYGAMEAPI_EXTERN_SLOTS(pixelarray); PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); PYGAMEAPI_EXTERN_SLOTS(window); +PYGAMEAPI_EXTERN_SLOTS(_render); PYGAMEAPI_EXTERN_SLOTS(geometry); #endif /* ~PYGAME_H */ diff --git a/src_c/meson.build b/src_c/meson.build index c67962b5ca..94d505ecd9 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -316,6 +316,18 @@ window = py.extension_module( subdir: pg, ) +# TODO: support SDL3 +if sdl_api != 3 +_render = py.extension_module( + '_render', + 'render.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/render.c b/src_c/render.c new file mode 100644 index 0000000000..9f873d615c --- /dev/null +++ b/src_c/render.c @@ -0,0 +1,126 @@ +#define PYGAMEAPI_RENDER_INTERNAL + +#include "pygame.h" + +#include "pgcompat.h" + +#include "doc/sdl2_video_doc.h" + +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._render.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 PyTypeObject pgTexture_Type = { + 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, + //.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._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 _render_methods[] = {{NULL, NULL, 0, NULL}}; + +MODINIT_DEFINE(_render) +{ + PyObject *module, *apiobj; + static void *c_api[PYGAMEAPI_RENDER_NUMSLOTS]; + + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, + "_render", + "docs_needed", + -1, + _render_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; + } + + 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) { + return NULL; + } + + Py_INCREF(&pgRenderer_Type); + if (PyModule_AddObject(module, "Renderer", (PyObject *)&pgRenderer_Type)) { + Py_DECREF(&pgRenderer_Type); + Py_DECREF(module); + 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, "_render"); + 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..ac771e491b 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -8,6 +8,7 @@ #define PYGAMEAPI_BASE_INTERNAL #define PYGAMEAPI_SURFACE_INTERNAL #define PYGAMEAPI_WINDOW_INTERNAL +#define PYGAMEAPI_RENDER_INTERNAL #define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) #define pgSurface_NewNoOwn(surface) \ @@ -187,6 +188,9 @@ PyInit_pixelarray(void); PyMODINIT_FUNC PyInit_window(void); +PyMODINIT_FUNC +PyInit__render(void); + // pygame_static module void @@ -320,6 +324,7 @@ PyInit_pygame_static() load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); load_submodule("pygame", PyInit_window(), "window"); + load_submodule("pygame", PyInit__render(), "_render"); load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); @@ -364,6 +369,7 @@ PyInit_pygame_static() #include "simd_blitters_sse2.c" #include "window.c" +#include "render.c" #undef pgVidInfo_Type #undef pgVidInfo_New From 0f7bb5571115fe9c4ca6b1d941b8b6ea5de5371d Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:24:26 +0100 Subject: [PATCH 057/441] Move image docs to stubs --- buildconfig/stubs/pygame/image.pyi | 370 +++++++++++++++++++++++++-- docs/reST/ref/image.rst | 397 +---------------------------- src_c/doc/image_doc.h | 28 +- 3 files changed, 368 insertions(+), 427 deletions(-) diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 7a11a55cc5..353d1fd052 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -1,3 +1,67 @@ +"""Pygame module for image transfer. + +The image module contains functions for loading and saving pictures, as well as +transferring Surfaces to formats usable by other packages. + +Note that there is no Image class; an image is loaded as a Surface object. The +Surface class allows manipulation (drawing lines, setting pixels, capturing +regions, etc.). + +In the vast majority of installations, pygame is built to support extended +formats, using the SDL_Image library behind the scenes. However, some +installations may only support uncompressed ``BMP`` images. With full image +support, the :func:`pygame.image.load()` function can load the following +formats. + + * ``BMP`` + + * ``GIF`` (non-animated) + + * ``JPEG`` + + * ``LBM`` + + * ``PCX`` + + * ``PNG`` + + * ``PNM`` (``PBM``, ``PGM``, ``PPM``) + + * ``QOI`` + + * ``SVG`` (limited support, using Nano SVG) + + * ``TGA`` (uncompressed) + + * ``TIFF`` + + * ``WEBP`` + + * ``XPM`` + + * ``XCF`` + +.. versionaddedold:: 2.0 Loading SVG, WebP, PNM + +.. versionadded:: 2.4.0 Loading QOI (Relies on SDL_Image 2.6.0+) + +Saving images only supports a limited set of formats. You can save to the +following formats. + + * ``BMP`` + + * ``JPEG`` + + * ``PNG`` + + * ``TGA`` + + +``JPEG`` and ``JPG``, as well as ``TIF`` and ``TIFF`` refer to the same file format + +.. versionaddedold:: 1.8 Saving PNG and JPEG files. +""" + from typing import Literal, Optional, Union from typing_extensions import deprecated # added in 3.13 @@ -13,18 +77,181 @@ _to_bytes_format = Literal[ _from_buffer_format = Literal["P", "RGB", "BGR", "BGRA", "RGBX", "RGBA", "ARGB"] _from_bytes_format = Literal["P", "RGB", "RGBX", "RGBA", "ARGB", "BGRA", "ABGR"] -def load(file: FileLike, namehint: str = "") -> Surface: ... -def load_sized_svg(file: FileLike, size: Point) -> Surface: ... -def save(surface: Surface, file: FileLike, namehint: str = "") -> None: ... -def get_sdl_image_version(linked: bool = True) -> Optional[tuple[int, int, int]]: ... -def get_extended() -> bool: ... +def load(file: FileLike, namehint: str = "") -> Surface: + """Load new image from a file (or file-like object). + + Load an image from a file source. You can pass either a filename, a Python + file-like object, or a pathlib.Path. + + Pygame will automatically determine the image type (e.g., ``GIF`` or bitmap) + and create a new Surface object from the data. In some cases it will need to + know the file extension (e.g., ``GIF`` images should end in ".gif"). If you + pass a raw file-like object, you may also want to pass the original filename + as the namehint argument. + + The returned Surface will contain the same color format, colorkey and alpha + transparency as the file it came from. You will often want to call + :func:`pygame.Surface.convert()` with no arguments, to create a copy that + will draw more quickly on the screen. + + For alpha transparency, like in .png images, use the + :func:`pygame.Surface.convert_alpha()` method after loading so that the + image has per pixel transparency. + + Pygame may not always be built to support all image formats. At minimum it + will support uncompressed ``BMP``. If :func:`pygame.image.get_extended()` + returns ``True``, you should be able to load most images (including PNG, JPG + and GIF). + + You should use :func:`os.path.join()` for compatibility. + + :: + + eg. asurf = pygame.image.load(os.path.join('data', 'bla.png')) + + .. versionchanged:: 2.2.0 Now supports keyword arguments. + """ + +def load_sized_svg(file: FileLike, size: Point) -> Surface: + """Load an SVG image from a file (or file-like object) with the given size. + + This function rasterizes the input SVG at the size specified by the ``size`` + argument. The ``file`` argument can be either a filename, a Python file-like + object, or a pathlib.Path. + + The usage of this function for handling SVGs is recommended, as calling the + regular ``load`` function and then scaling the returned surface would not + preserve the quality that an SVG can provide. + + It is to be noted that this function does not return a surface whose + dimensions exactly match the ``size`` argument. This function preserves + aspect ratio, so the returned surface could be smaller along at most one + dimension. + + This function requires SDL_image 2.6.0 or above. If pygame was compiled with + an older version, ``pygame.error`` will be raised when this function is + called. + + .. versionadded:: 2.4.0 + """ + +def save(surface: Surface, file: FileLike, namehint: str = "") -> None: + """Save an image to file (or file-like object). + + This will save your Surface as either a ``BMP``, ``TGA``, ``PNG``, or + ``JPEG`` image. If the filename extension is unrecognized it will default to + ``TGA``. Both ``TGA``, and ``BMP`` file formats create uncompressed files. + You can pass a filename, a pathlib.Path or a Python file-like object. + For file-like object, the image is saved to ``TGA`` format unless + a namehint with a recognizable extension is passed in. + + .. note:: When saving to a file-like object, it seems that for most formats, + the object needs to be flushed after saving to it to make loading + from it possible. + + .. versionchangedold:: 1.8 Saving PNG and JPEG files. + .. versionchangedold:: 2.0.0 + The ``namehint`` parameter was added to make it possible + to save other formats than ``TGA`` to a file-like object. + Saving to a file-like object with JPEG is possible. + .. versionchanged:: 2.2.0 Now supports keyword arguments. + """ + +def get_sdl_image_version(linked: bool = True) -> Optional[tuple[int, int, int]]: + """Get version number of the SDL_Image library being used. + + If pygame is built with extended image formats, then this function will + return the SDL_Image library's version number as a tuple of 3 integers + ``(major, minor, patch)``. If not, then it will return ``None``. + + ``linked=True`` is the default behavior and the function will return the + version of the library that Pygame is linked against, while ``linked=False`` + will return the version of the library that Pygame is compiled against. + + .. versionaddedold:: 2.0.0 + + .. versionchanged:: 2.1.4 ``linked`` keyword argument added and default + behavior changed from returning compiled version to returning linked + version + """ + +def get_extended() -> bool: + """Test if extended image formats can be loaded. + + If pygame is built with extended image formats this function will return + True. It is still not possible to determine which formats will be available, + but generally you will be able to load them all. + """ + + @deprecated("since 2.3.0. Use `pygame.image.tobytes` instead") def tostring( surface: Surface, format: _to_bytes_format, flipped: bool = False, pitch: int = -1, -) -> bytes: ... +) -> bytes: + """Transfer image to byte buffer. + + DEPRECATED: This function has the same functionality as :func:`tobytes()`, + which is preferred and should be used. + + .. deprecated:: 2.3.0 + """ + +def tobytes( + surface: Surface, + format: _to_bytes_format, + flipped: bool = False, + pitch: int = -1, +) -> bytes: + """Transfer image to byte buffer. + + Creates a string of bytes that can be transferred with the ``fromstring`` + or ``frombytes`` methods in other Python imaging packages. Some Python + image packages prefer their images in bottom-to-top format (PyOpenGL for + example). If you pass ``True`` for the flipped argument, the byte buffer + will be vertically flipped. + + The format argument is a string of one of the following values. Note that + only 8-bit Surfaces can use the "P" format. The other formats will work for + any Surface. Also note that other Python image packages support more formats + than pygame. + + * ``P``, 8-bit palettized Surfaces + + * ``RGB``, 24-bit image + + * ``RGBX``, 32-bit image with unused space + + * ``RGBA``, 32-bit image with an alpha channel + + * ``ARGB``, 32-bit image with alpha channel first + + * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped + + * ``ABGR``, 32-bit image with alpha channel, reverse order + + * ``RGBA_PREMULT``, 32-bit image with colors scaled by alpha channel + + * ``ARGB_PREMULT``, 32-bit image with colors scaled by alpha channel, alpha channel first + + The 'pitch' argument can be used to specify the pitch/stride per horizontal line + of the image in bytes. It must be equal to or greater than how many bytes + the pixel data of each horizontal line in the image bytes occupies without any + extra padding. By default, it is ``-1``, which means that the pitch/stride is + the same size as how many bytes the pure pixel data of each horizontal line takes. + + .. note:: The use of this function is recommended over :func:`tostring` as of pygame 2.1.3. + This function was introduced so it matches nicely with other + libraries (PIL, NumPy, etc), and with people's expectations. + + .. versionadded:: 2.1.3 + .. versionchanged:: 2.2.0 Now supports keyword arguments. + .. versionchanged:: 2.5.0 Added a 'pitch' argument. + .. versionchanged:: 2.5.1 Added support for ABGR image format + """ + @deprecated("since 2.3.0. Use `pygame.image.frombytes` instead") def fromstring( bytes: bytes, @@ -32,26 +259,133 @@ def fromstring( format: _from_bytes_format, flipped: bool = False, pitch: int = -1, -) -> Surface: ... -def tobytes( - surface: Surface, - format: _to_bytes_format, - flipped: bool = False, - pitch: int = -1, -) -> bytes: ... +) -> Surface: + """Create new Surface from a byte buffer. + + DEPRECATED: This function has the same functionality as :func:`frombytes()`, + which is preferred and should be used. + + .. deprecated:: 2.3.0 + """ + def frombytes( bytes: bytes, size: IntPoint, format: _from_bytes_format, flipped: bool = False, pitch: int = -1, -) -> Surface: ... +) -> Surface: + """Create new Surface from a byte buffer. + + This function takes arguments similar to :func:`pygame.image.tobytes()`. + The size argument is a pair of numbers representing the width and height. + Once the new Surface is created it is independent from the memory of the + bytes passed in. + + The bytes and format passed must compute to the exact size of image + specified. Otherwise a ``ValueError`` will be raised. + + The 'pitch' argument can be used specify the pitch/stride per horizontal line + of the image bytes in bytes. It must be equal to or greater than how many bytes + the pixel data of each horizontal line in the image bytes occupies without any + extra padding. By default, it is ``-1``, which means that the pitch/stride is + the same size as how many bytes the pure pixel data of each horizontal line takes. + + See the :func:`pygame.image.frombuffer()` method for a potentially faster + way to transfer images into pygame. + + .. note:: The use of this function is recommended over :func:`fromstring` as of pygame 2.1.3. + This function was introduced so it matches nicely with other + libraries (PIL, NumPy, etc), and with people's expectations. + + .. versionadded:: 2.1.3 + .. versionadded:: 2.1.4 Added a 'pitch' argument and support for keyword arguments. + """ + def frombuffer( bytes: _BufferStyle, size: IntPoint, format: _from_buffer_format, pitch: int = -1, -) -> Surface: ... -def load_basic(file: FileLike, /) -> Surface: ... -def load_extended(file: FileLike, namehint: str = "") -> Surface: ... -def save_extended(surface: Surface, file: FileLike, namehint: str = "") -> None: ... +) -> Surface: + """Create a new Surface that shares data inside a bytes buffer. + + Create a new Surface that shares pixel data directly from a buffer. This + buffer can be bytes, a bytearray, a memoryview, a + :class:`pygame.BufferProxy`, or any object that supports the buffer protocol. + This method takes similar arguments to :func:`pygame.image.fromstring()`, but + is unable to vertically flip the source data. + + This will run much faster than :func:`pygame.image.fromstring`, since no + pixel data must be allocated and copied. + + It accepts the following 'format' arguments: + + * ``P``, 8-bit palettized Surfaces + + * ``RGB``, 24-bit image + + * ``BGR``, 24-bit image, red and blue channels swapped. + + * ``RGBX``, 32-bit image with unused space + + * ``RGBA``, 32-bit image with an alpha channel + + * ``ARGB``, 32-bit image with alpha channel first + + * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped + + The 'pitch' argument can be used specify the pitch/stride per horizontal line + of the image buffer in bytes. It must be equal to or greater than how many bytes + the pixel data of each horizontal line in the image buffer occupies without any + extra padding. By default, it is ``-1``, which means that the pitch/stride is + the same size as how many bytes the pure pixel data of each horizontal line takes. + + .. versionadded:: 2.1.3 BGRA format + .. versionadded:: 2.1.4 Added a 'pitch' argument and support for keyword arguments. + """ + +def load_basic(file: FileLike, /) -> Surface: + """Load new BMP image from a file (or file-like object). + + Load an image from a file source. You can pass either a filename or a Python + file-like object, or a pathlib.Path. + + This function only supports loading "basic" image format, ie ``BMP`` + format. + + This function is always available, no matter how pygame was built. + """ + +def load_extended(file: FileLike, namehint: str = "") -> Surface: + """Load an image from a file (or file-like object). + + This function is similar to :func:`pygame.image.load()`, except that this + function can only be used if pygame was built with extended image format + support. + + .. versionchangedold:: 2.0.1 This function is always available, but raises an + ``NotImplementedError`` if extended image formats are not supported. + Previously, this function may or may not be available, depending on the + state of extended image format support. + + .. versionchanged:: 2.2.0 Now supports keyword arguments. + """ + +def save_extended(surface: Surface, file: FileLike, namehint: str = "") -> None: + """Save a png/jpg image to file (or file-like object). + + This will save your Surface as either a ``PNG`` or ``JPEG`` image. + + In case the image is being saved to a file-like object, this function + uses the namehint argument to determine the format of the file being + saved. Saves to ``JPEG`` in case the namehint was not specified while + saving to a file-like object. + + .. versionchangedold:: 2.0.1 This function is always available, but raises an + ``NotImplementedError`` if extended image formats are not supported. + Previously, this function may or may not be available, depending on the + state of extended image format support. + + .. versionchanged:: 2.2.0 Now supports keyword arguments. + """ diff --git a/docs/reST/ref/image.rst b/docs/reST/ref/image.rst index e851ccdf0e..4fc0e74fb0 100644 --- a/docs/reST/ref/image.rst +++ b/docs/reST/ref/image.rst @@ -3,398 +3,5 @@ :mod:`pygame.image` =================== -.. module:: pygame.image - :synopsis: pygame module for loading and saving images - -| :sl:`pygame module for image transfer` - -The image module contains functions for loading and saving pictures, as well as -transferring Surfaces to formats usable by other packages. - -Note that there is no Image class; an image is loaded as a Surface object. The -Surface class allows manipulation (drawing lines, setting pixels, capturing -regions, etc.). - -In the vast majority of installations, pygame is built to support extended -formats, using the SDL_Image library behind the scenes. However, some -installations may only support uncompressed ``BMP`` images. With full image -support, the :func:`pygame.image.load()` function can load the following -formats. - - * ``BMP`` - - * ``GIF`` (non-animated) - - * ``JPEG`` - - * ``LBM`` - - * ``PCX`` - - * ``PNG`` - - * ``PNM`` (``PBM``, ``PGM``, ``PPM``) - - * ``QOI`` - - * ``SVG`` (limited support, using Nano SVG) - - * ``TGA`` (uncompressed) - - * ``TIFF`` - - * ``WEBP`` - - * ``XPM`` - - * ``XCF`` - -.. versionaddedold:: 2.0 Loading SVG, WebP, PNM - -.. versionadded:: 2.4.0 Loading QOI (Relies on SDL_Image 2.6.0+) - -Saving images only supports a limited set of formats. You can save to the -following formats. - - * ``BMP`` - - * ``JPEG`` - - * ``PNG`` - - * ``TGA`` - - -``JPEG`` and ``JPG``, as well as ``TIF`` and ``TIFF`` refer to the same file format - -.. versionaddedold:: 1.8 Saving PNG and JPEG files. - - -.. function:: load - - | :sl:`load new image from a file (or file-like object)` - | :sg:`load(file) -> Surface` - | :sg:`load(file, namehint="") -> Surface` - - Load an image from a file source. You can pass either a filename, a Python - file-like object, or a pathlib.Path. - - Pygame will automatically determine the image type (e.g., ``GIF`` or bitmap) - and create a new Surface object from the data. In some cases it will need to - know the file extension (e.g., ``GIF`` images should end in ".gif"). If you - pass a raw file-like object, you may also want to pass the original filename - as the namehint argument. - - The returned Surface will contain the same color format, colorkey and alpha - transparency as the file it came from. You will often want to call - :func:`pygame.Surface.convert()` with no arguments, to create a copy that - will draw more quickly on the screen. - - For alpha transparency, like in .png images, use the - :func:`pygame.Surface.convert_alpha()` method after loading so that the - image has per pixel transparency. - - Pygame may not always be built to support all image formats. At minimum it - will support uncompressed ``BMP``. If :func:`pygame.image.get_extended()` - returns ``True``, you should be able to load most images (including PNG, JPG - and GIF). - - You should use :func:`os.path.join()` for compatibility. - - :: - - eg. asurf = pygame.image.load(os.path.join('data', 'bla.png')) - - .. versionchanged:: 2.2.0 Now supports keyword arguments. - - .. ## pygame.image.load ## - -.. function:: load_sized_svg - - | :sl:`load an SVG image from a file (or file-like object) with the given size` - | :sg:`load_sized_svg(file, size) -> Surface` - - This function rasterizes the input SVG at the size specified by the ``size`` - argument. The ``file`` argument can be either a filename, a Python file-like - object, or a pathlib.Path. - - The usage of this function for handling SVGs is recommended, as calling the - regular ``load`` function and then scaling the returned surface would not - preserve the quality that an SVG can provide. - - It is to be noted that this function does not return a surface whose - dimensions exactly match the ``size`` argument. This function preserves - aspect ratio, so the returned surface could be smaller along at most one - dimension. - - This function requires SDL_image 2.6.0 or above. If pygame was compiled with - an older version, ``pygame.error`` will be raised when this function is - called. - - .. versionadded:: 2.4.0 - - .. ## pygame.image.load_sized_svg ## - -.. function:: save - - | :sl:`save an image to file (or file-like object)` - | :sg:`save(Surface, file) -> None` - | :sg:`save(Surface, file, namehint="") -> None` - - This will save your Surface as either a ``BMP``, ``TGA``, ``PNG``, or - ``JPEG`` image. If the filename extension is unrecognized it will default to - ``TGA``. Both ``TGA``, and ``BMP`` file formats create uncompressed files. - You can pass a filename, a pathlib.Path or a Python file-like object. - For file-like object, the image is saved to ``TGA`` format unless - a namehint with a recognizable extension is passed in. - - .. note:: When saving to a file-like object, it seems that for most formats, - the object needs to be flushed after saving to it to make loading - from it possible. - - .. versionchangedold:: 1.8 Saving PNG and JPEG files. - .. versionchangedold:: 2.0.0 - The ``namehint`` parameter was added to make it possible - to save other formats than ``TGA`` to a file-like object. - Saving to a file-like object with JPEG is possible. - .. versionchanged:: 2.2.0 Now supports keyword arguments. - - .. ## pygame.image.save ## - -.. function:: get_sdl_image_version - - | :sl:`get version number of the SDL_Image library being used` - | :sg:`get_sdl_image_version(linked=True) -> None` - | :sg:`get_sdl_image_version(linked=True) -> (major, minor, patch)` - - If pygame is built with extended image formats, then this function will - return the SDL_Image library's version number as a tuple of 3 integers - ``(major, minor, patch)``. If not, then it will return ``None``. - - ``linked=True`` is the default behavior and the function will return the - version of the library that Pygame is linked against, while ``linked=False`` - will return the version of the library that Pygame is compiled against. - - .. versionaddedold:: 2.0.0 - - .. versionchanged:: 2.1.4 ``linked`` keyword argument added and default behavior changed from returning compiled version to returning linked version - - .. ## pygame.image.get_sdl_image_version ## - -.. function:: get_extended - - | :sl:`test if extended image formats can be loaded` - | :sg:`get_extended() -> bool` - - If pygame is built with extended image formats this function will return - True. It is still not possible to determine which formats will be available, - but generally you will be able to load them all. - - .. ## pygame.image.get_extended ## - -.. function:: tostring - - | :sl:`transfer image to byte buffer` - | :sg:`tostring(Surface, format, flipped=False, pitch=-1) -> bytes` - - DEPRECATED: This function has the same functionality as :func:`tobytes()`, which is preferred and should be used. - - .. deprecated:: 2.3.0 - - .. ## pygame.image.tostring ## - -.. function:: tobytes - - | :sl:`transfer image to byte buffer` - | :sg:`tobytes(Surface, format, flipped=False, pitch=-1) -> bytes` - - Creates a string of bytes that can be transferred with the ``fromstring`` - or ``frombytes`` methods in other Python imaging packages. Some Python - image packages prefer their images in bottom-to-top format (PyOpenGL for - example). If you pass ``True`` for the flipped argument, the byte buffer - will be vertically flipped. - - The format argument is a string of one of the following values. Note that - only 8-bit Surfaces can use the "P" format. The other formats will work for - any Surface. Also note that other Python image packages support more formats - than pygame. - - * ``P``, 8-bit palettized Surfaces - - * ``RGB``, 24-bit image - - * ``RGBX``, 32-bit image with unused space - - * ``RGBA``, 32-bit image with an alpha channel - - * ``ARGB``, 32-bit image with alpha channel first - - * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped - - * ``ABGR``, 32-bit image with alpha channel, reverse order - - * ``RGBA_PREMULT``, 32-bit image with colors scaled by alpha channel - - * ``ARGB_PREMULT``, 32-bit image with colors scaled by alpha channel, alpha channel first - - The 'pitch' argument can be used to specify the pitch/stride per horizontal line - of the image in bytes. It must be equal to or greater than how many bytes - the pixel data of each horizontal line in the image bytes occupies without any - extra padding. By default, it is ``-1``, which means that the pitch/stride is - the same size as how many bytes the pure pixel data of each horizontal line takes. - - .. note:: The use of this function is recommended over :func:`tostring` as of pygame 2.1.3. - This function was introduced so it matches nicely with other - libraries (PIL, NumPy, etc), and with people's expectations. - - .. versionadded:: 2.1.3 - .. versionchanged:: 2.2.0 Now supports keyword arguments. - .. versionchanged:: 2.5.0 Added a 'pitch' argument. - .. versionchanged:: 2.5.1 Added support for ABGR image format - - .. ## pygame.image.tobytes ## - - -.. function:: fromstring - - | :sl:`create new Surface from a byte buffer` - | :sg:`fromstring(bytes, size, format, flipped=False, pitch=-1) -> Surface` - - DEPRECATED: This function has the same functionality as :func:`frombytes()`, which is preferred and should be used. - - .. deprecated:: 2.3.0 - - .. ## pygame.image.fromstring ## - -.. function:: frombytes - - | :sl:`create new Surface from a byte buffer` - | :sg:`frombytes(bytes, size, format, flipped=False, pitch=-1) -> Surface` - - This function takes arguments similar to :func:`pygame.image.tobytes()`. - The size argument is a pair of numbers representing the width and height. - Once the new Surface is created it is independent from the memory of the - bytes passed in. - - The bytes and format passed must compute to the exact size of image - specified. Otherwise a ``ValueError`` will be raised. - - The 'pitch' argument can be used specify the pitch/stride per horizontal line - of the image bytes in bytes. It must be equal to or greater than how many bytes - the pixel data of each horizontal line in the image bytes occupies without any - extra padding. By default, it is ``-1``, which means that the pitch/stride is - the same size as how many bytes the pure pixel data of each horizontal line takes. - - See the :func:`pygame.image.frombuffer()` method for a potentially faster - way to transfer images into pygame. - - .. note:: The use of this function is recommended over :func:`fromstring` as of pygame 2.1.3. - This function was introduced so it matches nicely with other - libraries (PIL, NumPy, etc), and with people's expectations. - - .. versionadded:: 2.1.3 - .. versionadded:: 2.1.4 Added a 'pitch' argument and support for keyword arguments. - - .. ## pygame.image.frombytes ## - -.. function:: frombuffer - - | :sl:`create a new Surface that shares data inside a bytes buffer` - | :sg:`frombuffer(buffer, size, format, pitch=-1) -> Surface` - - Create a new Surface that shares pixel data directly from a buffer. This - buffer can be bytes, a bytearray, a memoryview, a - :class:`pygame.BufferProxy`, or any object that supports the buffer protocol. - This method takes similar arguments to :func:`pygame.image.fromstring()`, but - is unable to vertically flip the source data. - - This will run much faster than :func:`pygame.image.fromstring`, since no - pixel data must be allocated and copied. - - It accepts the following 'format' arguments: - - * ``P``, 8-bit palettized Surfaces - - * ``RGB``, 24-bit image - - * ``BGR``, 24-bit image, red and blue channels swapped. - - * ``RGBX``, 32-bit image with unused space - - * ``RGBA``, 32-bit image with an alpha channel - - * ``ARGB``, 32-bit image with alpha channel first - - * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped - - The 'pitch' argument can be used specify the pitch/stride per horizontal line - of the image buffer in bytes. It must be equal to or greater than how many bytes - the pixel data of each horizontal line in the image buffer occupies without any - extra padding. By default, it is ``-1``, which means that the pitch/stride is - the same size as how many bytes the pure pixel data of each horizontal line takes. - - .. versionadded:: 2.1.3 BGRA format - .. versionadded:: 2.1.4 Added a 'pitch' argument and support for keyword arguments. - - .. ## pygame.image.frombuffer ## - -.. function:: load_basic - - | :sl:`load new BMP image from a file (or file-like object)` - | :sg:`load_basic(file, /) -> Surface` - - Load an image from a file source. You can pass either a filename or a Python - file-like object, or a pathlib.Path. - - This function only supports loading "basic" image format, ie ``BMP`` - format. - This function is always available, no matter how pygame was built. - - .. ## pygame.image.load_basic ## - -.. function:: load_extended - - | :sl:`load an image from a file (or file-like object)` - | :sg:`load_extended(file) -> Surface` - | :sg:`load_extended(file, namehint="") -> Surface` - - This function is similar to :func:`pygame.image.load()`, except that this - function can only be used if pygame was built with extended image format - support. - - .. versionchangedold:: 2.0.1 - This function is always available, but raises an - ``NotImplementedError`` if extended image formats are - not supported. - Previously, this function may or may not be - available, depending on the state of extended image - format support. - .. versionchanged:: 2.2.0 Now supports keyword arguments. - - .. ## pygame.image.load_extended ## - -.. function:: save_extended - - | :sl:`save a png/jpg image to file (or file-like object)` - | :sg:`save_extended(Surface, file) -> None` - | :sg:`save_extended(Surface, file, namehint="") -> None` - - This will save your Surface as either a ``PNG`` or ``JPEG`` image. - - In case the image is being saved to a file-like object, this function - uses the namehint argument to determine the format of the file being - saved. Saves to ``JPEG`` in case the namehint was not specified while - saving to a file-like object. - - .. versionchangedold:: 2.0.1 - This function is always available, but raises an - ``NotImplementedError`` if extended image formats are - not supported. - Previously, this function may or may not be - available, depending on the state of extended image - format support. - .. versionchanged:: 2.2.0 Now supports keyword arguments. - - .. ## pygame.image.save_extended ## - -.. ## pygame.image ## +.. autopgmodule:: pygame.image + :members: diff --git a/src_c/doc/image_doc.h b/src_c/doc/image_doc.h index ca366312f7..74de72b6d5 100644 --- a/src_c/doc/image_doc.h +++ b/src_c/doc/image_doc.h @@ -1,15 +1,15 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_IMAGE "pygame module for image transfer" -#define DOC_IMAGE_LOAD "load(file) -> Surface\nload(file, namehint="") -> Surface\nload new image from a file (or file-like object)" -#define DOC_IMAGE_LOADSIZEDSVG "load_sized_svg(file, size) -> Surface\nload an SVG image from a file (or file-like object) with the given size" -#define DOC_IMAGE_SAVE "save(Surface, file) -> None\nsave(Surface, file, namehint="") -> None\nsave an image to file (or file-like object)" -#define DOC_IMAGE_GETSDLIMAGEVERSION "get_sdl_image_version(linked=True) -> None\nget_sdl_image_version(linked=True) -> (major, minor, patch)\nget version number of the SDL_Image library being used" -#define DOC_IMAGE_GETEXTENDED "get_extended() -> bool\ntest if extended image formats can be loaded" -#define DOC_IMAGE_TOSTRING "tostring(Surface, format, flipped=False, pitch=-1) -> bytes\ntransfer image to byte buffer" -#define DOC_IMAGE_TOBYTES "tobytes(Surface, format, flipped=False, pitch=-1) -> bytes\ntransfer image to byte buffer" -#define DOC_IMAGE_FROMSTRING "fromstring(bytes, size, format, flipped=False, pitch=-1) -> Surface\ncreate new Surface from a byte buffer" -#define DOC_IMAGE_FROMBYTES "frombytes(bytes, size, format, flipped=False, pitch=-1) -> Surface\ncreate new Surface from a byte buffer" -#define DOC_IMAGE_FROMBUFFER "frombuffer(buffer, size, format, pitch=-1) -> Surface\ncreate a new Surface that shares data inside a bytes buffer" -#define DOC_IMAGE_LOADBASIC "load_basic(file, /) -> Surface\nload new BMP image from a file (or file-like object)" -#define DOC_IMAGE_LOADEXTENDED "load_extended(file) -> Surface\nload_extended(file, namehint="") -> Surface\nload an image from a file (or file-like object)" -#define DOC_IMAGE_SAVEEXTENDED "save_extended(Surface, file) -> None\nsave_extended(Surface, file, namehint="") -> None\nsave a png/jpg image to file (or file-like object)" +#define DOC_IMAGE "Pygame module for image transfer." +#define DOC_IMAGE_LOAD "load(file, namehint='') -> Surface\nLoad new image from a file (or file-like object)." +#define DOC_IMAGE_LOADSIZEDSVG "load_sized_svg(file, size) -> Surface\nLoad an SVG image from a file (or file-like object) with the given size." +#define DOC_IMAGE_SAVE "save(surface, file, namehint='') -> None\nSave an image to file (or file-like object)." +#define DOC_IMAGE_GETSDLIMAGEVERSION "get_sdl_image_version(linked=True) -> Optional[tuple[int, int, int]]\nGet version number of the SDL_Image library being used." +#define DOC_IMAGE_GETEXTENDED "get_extended() -> bool\nTest if extended image formats can be loaded." +#define DOC_IMAGE_TOSTRING "tostring(surface, format, flipped=False, pitch=-1) -> bytes\nTransfer image to byte buffer." +#define DOC_IMAGE_TOBYTES "tobytes(surface, format, flipped=False, pitch=-1) -> bytes\nTransfer image to byte buffer." +#define DOC_IMAGE_FROMSTRING "fromstring(bytes, size, format, flipped=False, pitch=-1) -> Surface\nCreate new Surface from a byte buffer." +#define DOC_IMAGE_FROMBYTES "frombytes(bytes, size, format, flipped=False, pitch=-1) -> Surface\nCreate new Surface from a byte buffer." +#define DOC_IMAGE_FROMBUFFER "frombuffer(bytes, size, format, pitch=-1) -> Surface\nCreate a new Surface that shares data inside a bytes buffer." +#define DOC_IMAGE_LOADBASIC "load_basic(file, /) -> Surface\nLoad new BMP image from a file (or file-like object)." +#define DOC_IMAGE_LOADEXTENDED "load_extended(file, namehint='') -> Surface\nLoad an image from a file (or file-like object)." +#define DOC_IMAGE_SAVEEXTENDED "save_extended(surface, file, namehint='') -> None\nSave a png/jpg image to file (or file-like object)." From 0088f63676f82f0069318082de5e6e4b653ce2df Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:36:28 +0100 Subject: [PATCH 058/441] Move transform docs to stubs --- buildconfig/stubs/pygame/transform.pyi | 455 +++++++++++++++++++++-- docs/reST/ref/transform.rst | 480 +------------------------ src_c/doc/transform_doc.h | 44 +-- 3 files changed, 443 insertions(+), 536 deletions(-) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index 384b41d3ac..6df3131070 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -1,53 +1,361 @@ +"""Pygame module to transform surfaces. + +A Surface transform is an operation that moves or resizes the pixels. All these +functions take a Surface to operate on and return a new Surface with the +results. + +Some of the transforms are considered destructive. These means every time they +are performed they lose pixel data. Common examples of this are resizing and +rotating. For this reason, it is better to re-transform the original surface +than to keep transforming an image multiple times. (For example, suppose you +are animating a bouncing spring which expands and contracts. If you applied the +size changes incrementally to the previous images, you would lose detail. +Instead, always begin with the original image and scale to the desired size.) + +.. versionchangedold:: 2.0.2 transform functions now support keyword arguments. +""" + from typing import Optional, Union, Literal from pygame.surface import Surface from pygame.typing import ColorLike, Point, RectLike, SequenceLike -def flip(surface: Surface, flip_x: bool, flip_y: bool) -> Surface: ... +def flip(surface: Surface, flip_x: bool, flip_y: bool) -> Surface: + """Flip vertically and horizontally. + + This can flip a Surface either vertically, horizontally, or both. + The arguments ``flip_x`` and ``flip_y`` are booleans that control whether + to flip each axis. Flipping a Surface is non-destructive and returns a new + Surface with the same dimensions. + """ + def scale( surface: Surface, size: Point, dest_surface: Optional[Surface] = None, -) -> Surface: ... +) -> Surface: + """Resize to new resolution. + + Resizes the Surface to a new size, given as (width, height). + This is a fast scale operation that does not sample the results. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must be the same as the size (width, height) passed + in, and the same depth and format as the source Surface. + + .. versionchanged:: 2.2.1 internal scaling algorithm was replaced with a nearly + equivalent one that is 40% faster. Scale results will be very slightly + different. + """ + def scale_by( surface: Surface, factor: Union[float, SequenceLike[float]], dest_surface: Optional[Surface] = None, -) -> Surface: ... -def rotate(surface: Surface, angle: float) -> Surface: ... -def rotozoom(surface: Surface, angle: float, scale: float) -> Surface: ... -def scale2x(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: ... -def grayscale(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: ... -def solid_overlay( - surface: Surface, - color: ColorLike, - dest_surface: Optional[Surface] = None, - keep_alpha: bool = False, -) -> Surface: ... +) -> Surface: + """Resize to new resolution, using scalar(s). + + Same as :func:`scale()`, but scales by some factor, rather than taking + the new size explicitly. For example, :code:`transform.scale_by(surf, 3)` + will triple the size of the surface in both dimensions. Optionally, the + scale factor can be a sequence of two numbers, controlling x and y scaling + separately. For example, :code:`transform.scale_by(surf, (2, 1))` doubles + the image width but keeps the height the same. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the scaled dimensions + (width * factor, height * factor) and same depth and format as the source Surface. + + .. versionadded:: 2.1.3 + """ + +def rotate(surface: Surface, angle: float) -> Surface: + """Rotate an image. + + Unfiltered counterclockwise rotation. The angle argument represents degrees + and can be any floating point value. Negative angle amounts will rotate + clockwise. + + Unless rotating by 90 degree increments, the image will be padded larger to + hold the new size. If the image has pixel alphas, the padded area will be + transparent. Otherwise pygame will pick a color that matches the Surface + colorkey or the topleft pixel value. + """ + +def rotozoom(surface: Surface, angle: float, scale: float) -> Surface: + """Filtered scale and rotation. + + This is a combined scale and rotation transform. The resulting Surface will + be a filtered 32-bit Surface. The scale argument is a floating point value + that will be multiplied by the current resolution. The angle argument is a + floating point value that represents the counterclockwise degrees to rotate. + A negative rotation angle will rotate clockwise. + """ + +def scale2x(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: + """Specialized image doubler. + + This will return a new image that is double the size of the original. It + uses the AdvanceMAME Scale2X algorithm which does a 'jaggie-less' scale of + bitmap graphics. + + This really only has an effect on simple images with solid colors. On + photographic and antialiased images it will look like a regular unfiltered + scale. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have double the dimensions + (width * 2, height * 2) and same depth and format as the source Surface. + """ + def smoothscale( surface: Surface, size: Point, dest_surface: Optional[Surface] = None, -) -> Surface: ... +) -> Surface: + """Scale a surface to an arbitrary size smoothly. + + Uses one of two different algorithms for scaling each dimension of the input + surface as required. For shrinkage, the output pixels are area averages of + the colors they cover. The size is a 2 number sequence for (width, height). + This function only works for 24-bit or 32-bit surfaces. A ``ValueError`` will + be thrown if the input surface bit depth is less than 24. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must be the same as the size (width, height) passed + in, and the same depth and format as the source Surface. + + .. versionaddedold:: 1.8 + + .. versionchanged:: 2.4.0 now uses SSE2/NEON SIMD for acceleration on x86 + and ARM machines, a performance improvement over previous MMX/SSE only + supported on x86. + """ + def smoothscale_by( surface: Surface, factor: Union[float, SequenceLike[float]], dest_surface: Optional[Surface] = None, -) -> Surface: ... -def get_smoothscale_backend() -> Literal["GENERIC", "SSE2", "NEON"]: ... -def set_smoothscale_backend(backend: Literal["GENERIC", "SSE2", "NEON"]) -> None: ... -def chop(surface: Surface, rect: RectLike) -> Surface: ... -def laplacian(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: ... -def invert(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: ... +) -> Surface: + """Resize to new resolution, using scalar(s). + + Same as :func:`smoothscale()`, but scales by some factor, rather than + taking the new size explicitly. For example, + :code:`transform.smoothscale_by(surf, 3)` will triple the size of the + surface in both dimensions. Optionally, the scale factor can be a sequence + of two numbers, controlling x and y scaling separately. For example, + :code:`transform.smoothscale_by(surf, (2, 1))` doubles the image width but + keeps the height the same. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the scaled dimensions + (width * factor, height * factor) and same depth and format as the source Surface. + + .. versionadded:: 2.1.3 + """ + +def get_smoothscale_backend() -> Literal["GENERIC", "SSE2", "NEON"]: + """Return smoothscale filter version in use: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'. + + Shows whether or not smoothscale is using SIMD acceleration. + If no acceleration is available then "GENERIC" is returned. The level of + acceleration possible is automatically determined at runtime. + + This function is provided for pygame testing and debugging. + + .. versionchanged:: 2.4.0 Added SSE2 and NEON backends, MMX and SSE are deprecated. + """ + +def set_smoothscale_backend(backend: Literal["GENERIC", "SSE2", "NEON"]) -> None: + """Set smoothscale filter version to one of: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'. + + Sets smoothscale acceleration. Takes a string argument. A value of 'GENERIC' + turns off acceleration. A value error is raised if type is not + recognized or not supported by the current processor. + + This function is provided for pygame testing and debugging. If smoothscale + causes an invalid instruction error then it is a pygame/SDL bug that should + be reported. Use this function as a temporary fix only. + + .. versionchanged:: 2.4.0 Added SSE2 and NEON backends, MMX and SSE are deprecated. + """ + +def chop(surface: Surface, rect: RectLike) -> Surface: + """Gets a copy of an image with an interior area removed. + + Extracts a portion of an image. All vertical and horizontal pixels + surrounding the given rectangle area are removed. The corner areas (diagonal + to the rect) are then brought together. (The original image is not altered + by this operation.) + + ``NOTE``: If you want a "crop" that returns the part of an image within a + rect, you can blit with a rect to a new surface or copy a subsurface. + """ + +def laplacian(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: + """Find edges in a surface. + + Finds the edges in a surface using the laplacian algorithm. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth as the source Surface. + + .. versionaddedold:: 1.8 + """ + +def box_blur( + surface: Surface, + radius: int, + repeat_edge_pixels: bool = True, + dest_surface: Optional[Surface] = None +) -> Surface: + """Blur a surface using box blur. + + Returns the blurred surface using box blur algorithm. + + This function does not work for indexed surfaces. + An exception will be thrown if the input is an indexed surface. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth and format as the source Surface. + + .. versionadded:: 2.2.0 + + .. versionchanged:: 2.3.0 + Passing the calling surface as destination surface raises a ``ValueError`` + + .. versionchanged:: 2.5.0 + A surface with either width or height equal to 0 won't raise a ``ValueError`` + """ + +def gaussian_blur( + surface: Surface, + radius: int, + repeat_edge_pixels: bool = True, + dest_surface: Optional[Surface] = None +) -> Surface: + """Blur a surface using gaussian blur. + + Returns the blurred surface using gaussian blur algorithm. + Slower than `box_blur()`. + + This function does not work for indexed surfaces. + An exception will be thrown if the input is an indexed surface. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth and format as the source Surface. + + .. versionadded:: 2.2.0 + + .. versionchanged:: 2.3.0 + Passing the calling surface as destination surface raises a ``ValueError`` + + .. versionchanged:: 2.3.1 + Now the standard deviation of the Gaussian kernel is equal to the radius. + Blur results will be slightly different. + + .. versionchanged:: 2.5.0 + A surface with either width or height equal to 0 won't raise a ``ValueError`` + """ + def average_surfaces( surfaces: SequenceLike[Surface], dest_surface: Optional[Surface] = None, palette_colors: Union[bool, int] = 1, -) -> Surface: ... +) -> Surface: + """Find the average surface from many surfaces. + + Takes a sequence of surfaces and returns a surface with average colors from + each of the surfaces. + + palette_colors - if true we average the colors in palette, otherwise we + average the pixel values. This is useful if the surface is actually + grayscale colors, and not palette colors. + + Note, this function currently does not handle palette using surfaces + correctly. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth as the first passed source Surface. + + .. versionaddedold:: 1.8 + .. versionaddedold:: 1.9 ``palette_colors`` argument + """ + def average_color( surface: Surface, rect: Optional[RectLike] = None, consider_alpha: bool = False -) -> tuple[int, int, int, int]: ... +) -> tuple[int, int, int, int]: + """Finds the average color of a surface. + + Finds the average color of a Surface or a region of a surface specified by a + Rect, and returns it as a tuple of integers red, green, blue, and alpha. + If consider_alpha is set to True, then alpha is taken into account + (removing the black artifacts). + + .. versionaddedold:: 2.1.2 ``consider_alpha`` argument + """ + +def invert(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: + """Inverts the RGB elements of a surface. + + Inverts each RGB pixel contained within the Surface, does not affect alpha channel. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth as the source Surface. + + .. versionadded:: 2.2.0 + """ + +def grayscale(surface: Surface, dest_surface: Optional[Surface] = None) -> Surface: + """Grayscale a surface. + + Returns a grayscaled version of the original surface using the luminosity formula which weights red, green and blue according to their wavelengths. + + An optional destination surface can be passed which is faster than creating a new + Surface. This destination surface must have the same dimensions (width, height) and + depth as the source Surface. + + .. versionadded:: 2.1.4 + + .. versionchanged:: 2.4.0 Adjusted formula slightly to support performance + optimisation. It may return very slightly different pixels than before, + but should run seven to eleven times faster on most systems. + """ + +def solid_overlay( + surface: Surface, + color: ColorLike, + dest_surface: Optional[Surface] = None, + keep_alpha: bool = False, +) -> Surface: + """Replaces non transparent pixels with the provided color. + + Returns a new version of the original surface with all non transparent pixels set to the color provided. + + An optional destination surface can be passed which is faster than creating a new + Surface. + This destination surface must have the same dimensions (width, height) and + depth as the source Surface. + + :param pygame.Surface surface: The target surface. + + :param color: Color which all non transparent within the target surface must be set to. + :type color: :data:`pygame.typing.ColorLike` + + :param dest_surface: Optional destination surface to which the changes will be applied. + :type dest_surface: pygame.Surface or None + + :param bool keep_alpha: Optional parameter that controls whether to keep the surface alpha when replacing with the color. + + .. versionadded:: 2.5.2 + """ + def threshold( dest_surface: Optional[Surface], surface: Surface, @@ -57,23 +365,98 @@ def threshold( set_behavior: int = 1, search_surf: Optional[Surface] = None, inverse_set: bool = False, -) -> int: ... -def box_blur( - surface: Surface, - radius: int, - repeat_edge_pixels: bool = True, - dest_surface: Optional[Surface] = None -) -> Surface: ... -def gaussian_blur( - surface: Surface, - radius: int, - repeat_edge_pixels: bool = True, - dest_surface: Optional[Surface] = None -) -> Surface: ... +) -> int: + """Finds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'. + + This versatile function can be used for find colors in a 'surf' close to a 'search_color' + or close to colors in a separate 'search_surf'. + + It can also be used to transfer pixels into a 'dest_surf' that match or don't match. + + By default it sets pixels in the 'dest_surf' where all of the pixels NOT within the + threshold are changed to set_color. If inverse_set is optionally set to True, + the pixels that ARE within the threshold are changed to set_color. + + If the optional 'search_surf' surface is given, it is used to threshold against + rather than the specified 'set_color'. That is, it will find each pixel in the + 'surf' that is within the 'threshold' of the pixel at the same coordinates + of the 'search_surf'. + + :param dest_surf: Surface we are changing. See 'set_behavior'. + Should be None if counting (set_behavior is 0). + :type dest_surf: pygame.Surface or None + + :param pygame.Surface surf: Surface we are looking at. + + :param search_color: Color we are searching for. + :type color: :data:`pygame.typing.ColorLike` + + :param threshold: Within this distance from search_color (or search_surf). + You can use a threshold of (r,g,b,a) where the r,g,b can have different + thresholds. So you could use an r threshold of 40 and a blue threshold of 2 + if you like. + :type color: :data:`pygame.typing.ColorLike` + + :param set_color: Color we set in dest_surf. + :type color: :data:`pygame.typing.ColorLike` or ``None`` + + :param int set_behavior: + - set_behavior=1 (default). Pixels in dest_surface will be changed to 'set_color'. + - set_behavior=0 we do not change 'dest_surf', just count. Make dest_surf=None. + - set_behavior=2 pixels set in 'dest_surf' will be from 'surf'. + + :param search_surf: + - search_surf=None (default). Search against 'search_color' instead. + - search_surf=Surface. Look at the color in 'search_surf' rather than using 'search_color'. + :type search_surf: pygame.Surface or None + + :param bool inverse_set: + - False, default. Pixels outside of threshold are changed. + - True, Pixels within threshold are changed. + + :rtype: int + :returns: The number of pixels that are within the 'threshold' in 'surf' + compared to either 'search_color' or `search_surf`. + + .. versionaddedold:: 1.8 + .. versionchangedold:: 1.9.4 + Fixed a lot of bugs and added keyword arguments. Test your code. + """ + def hsl( surface: Surface, hue: float = 0, saturation: float = 0, lightness: float = 0, dest_surface: Optional[Surface] = None, -) -> Surface: ... +) -> Surface: + """Change the hue, saturation, and lightness of a surface. + + This function allows you to modify the hue, saturation, and lightness of a given surface. + + :param pygame.Surface surface: The surface to transform. + + :param float hue: The amount to change the hue. Positive values rotate the hue clockwise, + while negative values rotate it counterclockwise. Value range: -360 to 360. + + :param float saturation: The amount to change the saturation. Positive values increase saturation, + while negative values decrease it. Value range: -1 to 1. + + :param float lightness: The amount to change the lightness. Positive values increase lightness, + while negative values decrease it. Value range: -1 to 1. + + :param pygame.Surface dest_surface: An optional destination surface to store the transformed image. + If provided, it should have the same dimensions and depth as the source surface. + + :returns: A new surface with the hue, saturation, and lightness transformed. + + :Examples: + + Apply a hue rotation of 30 degrees, increase saturation by 20%, and decrease lightness by 10% to a surface: + + .. code-block:: python + + new_surf = hsl(original_surf, 30, 0.2, -0.1) + + .. versionadded:: 2.5.0 + """ diff --git a/docs/reST/ref/transform.rst b/docs/reST/ref/transform.rst index 4039583704..1be8b9d16a 100644 --- a/docs/reST/ref/transform.rst +++ b/docs/reST/ref/transform.rst @@ -3,481 +3,5 @@ :mod:`pygame.transform` ======================= -.. module:: pygame.transform - :synopsis: pygame module to transform surfaces - -| :sl:`pygame module to transform surfaces` - -A Surface transform is an operation that moves or resizes the pixels. All these -functions take a Surface to operate on and return a new Surface with the -results. - -Some of the transforms are considered destructive. These means every time they -are performed they lose pixel data. Common examples of this are resizing and -rotating. For this reason, it is better to re-transform the original surface -than to keep transforming an image multiple times. (For example, suppose you -are animating a bouncing spring which expands and contracts. If you applied the -size changes incrementally to the previous images, you would lose detail. -Instead, always begin with the original image and scale to the desired size.) - -.. versionchangedold:: 2.0.2 transform functions now support keyword arguments. - -.. function:: flip - - | :sl:`flip vertically and horizontally` - | :sg:`flip(surface, flip_x, flip_y) -> Surface` - - This can flip a Surface either vertically, horizontally, or both. - The arguments ``flip_x`` and ``flip_y`` are booleans that control whether - to flip each axis. Flipping a Surface is non-destructive and returns a new - Surface with the same dimensions. - - .. ## pygame.transform.flip ## - -.. function:: scale - - | :sl:`resize to new resolution` - | :sg:`scale(surface, size, dest_surface=None) -> Surface` - - Resizes the Surface to a new size, given as (width, height). - This is a fast scale operation that does not sample the results. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must be the same as the size (width, height) passed - in, and the same depth and format as the source Surface. - - .. versionchanged:: 2.2.1 internal scaling algorithm was replaced with a nearly - equivalent one that is 40% faster. Scale results will be very slightly - different. - - .. ## pygame.transform.scale ## - -.. function:: scale_by - - | :sl:`resize to new resolution, using scalar(s)` - | :sg:`scale_by(surface, factor, dest_surface=None) -> Surface` - - Same as :func:`scale()`, but scales by some factor, rather than taking - the new size explicitly. For example, :code:`transform.scale_by(surf, 3)` - will triple the size of the surface in both dimensions. Optionally, the - scale factor can be a sequence of two numbers, controlling x and y scaling - separately. For example, :code:`transform.scale_by(surf, (2, 1))` doubles - the image width but keeps the height the same. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the scaled dimensions - (width * factor, height * factor) and same depth and format as the source Surface. - - .. versionadded:: 2.1.3 - - .. ## pygame.transform.scale_by ## - -.. function:: rotate - - | :sl:`rotate an image` - | :sg:`rotate(surface, angle) -> Surface` - - Unfiltered counterclockwise rotation. The angle argument represents degrees - and can be any floating point value. Negative angle amounts will rotate - clockwise. - - Unless rotating by 90 degree increments, the image will be padded larger to - hold the new size. If the image has pixel alphas, the padded area will be - transparent. Otherwise pygame will pick a color that matches the Surface - colorkey or the topleft pixel value. - - .. ## pygame.transform.rotate ## - -.. function:: rotozoom - - | :sl:`filtered scale and rotation` - | :sg:`rotozoom(surface, angle, scale) -> Surface` - - This is a combined scale and rotation transform. The resulting Surface will - be a filtered 32-bit Surface. The scale argument is a floating point value - that will be multiplied by the current resolution. The angle argument is a - floating point value that represents the counterclockwise degrees to rotate. - A negative rotation angle will rotate clockwise. - - .. ## pygame.transform.rotozoom ## - -.. function:: scale2x - - | :sl:`specialized image doubler` - | :sg:`scale2x(surface, dest_surface=None) -> Surface` - - This will return a new image that is double the size of the original. It - uses the AdvanceMAME Scale2X algorithm which does a 'jaggie-less' scale of - bitmap graphics. - - This really only has an effect on simple images with solid colors. On - photographic and antialiased images it will look like a regular unfiltered - scale. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have double the dimensions - (width * 2, height * 2) and same depth and format as the source Surface. - - .. ## pygame.transform.scale2x ## - -.. function:: smoothscale - - | :sl:`scale a surface to an arbitrary size smoothly` - | :sg:`smoothscale(surface, size, dest_surface=None) -> Surface` - - Uses one of two different algorithms for scaling each dimension of the input - surface as required. For shrinkage, the output pixels are area averages of - the colors they cover. The size is a 2 number sequence for (width, height). - This function only works for 24-bit or 32-bit surfaces. A ``ValueError`` will - be thrown if the input surface bit depth is less than 24. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must be the same as the size (width, height) passed - in, and the same depth and format as the source Surface. - - .. versionaddedold:: 1.8 - - .. versionchanged:: 2.4.0 now uses SSE2/NEON SIMD for acceleration on x86 - and ARM machines, a performance improvement over previous MMX/SSE only - supported on x86. - - .. ## pygame.transform.smoothscale ## - -.. function:: smoothscale_by - - | :sl:`resize to new resolution, using scalar(s)` - | :sg:`smoothscale_by(surface, factor, dest_surface=None) -> Surface` - - Same as :func:`smoothscale()`, but scales by some factor, rather than - taking the new size explicitly. For example, - :code:`transform.smoothscale_by(surf, 3)` will triple the size of the - surface in both dimensions. Optionally, the scale factor can be a sequence - of two numbers, controlling x and y scaling separately. For example, - :code:`transform.smoothscale_by(surf, (2, 1))` doubles the image width but - keeps the height the same. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the scaled dimensions - (width * factor, height * factor) and same depth and format as the source Surface. - - .. versionadded:: 2.1.3 - - .. ## pygame.transform.smoothscale_by ## - -.. function:: get_smoothscale_backend - - | :sl:`return smoothscale filter version in use: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'` - | :sg:`get_smoothscale_backend() -> string` - - Shows whether or not smoothscale is using SIMD acceleration. - If no acceleration is available then "GENERIC" is returned. The level of - acceleration possible is automatically determined at runtime. - - This function is provided for pygame testing and debugging. - - .. versionchanged:: 2.4.0 Added SSE2 and NEON backends, MMX and SSE are deprecated. - - .. ## pygame.transform.get_smoothscale_backend ## - -.. function:: set_smoothscale_backend - - | :sl:`set smoothscale filter version to one of: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'` - | :sg:`set_smoothscale_backend(backend) -> None` - - Sets smoothscale acceleration. Takes a string argument. A value of 'GENERIC' - turns off acceleration. A value error is raised if type is not - recognized or not supported by the current processor. - - This function is provided for pygame testing and debugging. If smoothscale - causes an invalid instruction error then it is a pygame/SDL bug that should - be reported. Use this function as a temporary fix only. - - .. versionchanged:: 2.4.0 Added SSE2 and NEON backends, MMX and SSE are deprecated. - - .. ## pygame.transform.set_smoothscale_backend ## - -.. function:: chop - - | :sl:`gets a copy of an image with an interior area removed` - | :sg:`chop(surface, rect) -> Surface` - - Extracts a portion of an image. All vertical and horizontal pixels - surrounding the given rectangle area are removed. The corner areas (diagonal - to the rect) are then brought together. (The original image is not altered - by this operation.) - - ``NOTE``: If you want a "crop" that returns the part of an image within a - rect, you can blit with a rect to a new surface or copy a subsurface. - - .. ## pygame.transform.chop ## - -.. function:: laplacian - - | :sl:`find edges in a surface` - | :sg:`laplacian(surface, dest_surface=None) -> Surface` - - Finds the edges in a surface using the laplacian algorithm. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth as the source Surface. - - .. versionaddedold:: 1.8 - - .. ## pygame.transform.laplacian ## - -.. function:: box_blur - - | :sl:`blur a surface using box blur` - | :sg:`box_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface` - - Returns the blurred surface using box blur algorithm. - - This function does not work for indexed surfaces. - An exception will be thrown if the input is an indexed surface. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth and format as the source Surface. - - .. versionadded:: 2.2.0 - - .. versionchanged:: 2.3.0 - Passing the calling surface as destination surface raises a ``ValueError`` - - .. versionchanged:: 2.5.0 - A surface with either width or height equal to 0 won't raise a ``ValueError`` - - .. ## pygame.transform.box_blur ## - -.. function:: gaussian_blur - - | :sl:`blur a surface using gaussian blur` - | :sg:`gaussian_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface` - - Returns the blurred surface using gaussian blur algorithm. - Slower than `box_blur()`. - - This function does not work for indexed surfaces. - An exception will be thrown if the input is an indexed surface. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth and format as the source Surface. - - .. versionadded:: 2.2.0 - - .. versionchanged:: 2.3.0 - Passing the calling surface as destination surface raises a ``ValueError`` - - .. versionchanged:: 2.3.1 - Now the standard deviation of the Gaussian kernel is equal to the radius. - Blur results will be slightly different. - - .. versionchanged:: 2.5.0 - A surface with either width or height equal to 0 won't raise a ``ValueError`` - - .. ## pygame.transform.gaussian_blur ## - -.. function:: average_surfaces - - | :sl:`find the average surface from many surfaces.` - | :sg:`average_surfaces(surfaces, dest_surface=None, palette_colors=1) -> Surface` - - Takes a sequence of surfaces and returns a surface with average colors from - each of the surfaces. - - palette_colors - if true we average the colors in palette, otherwise we - average the pixel values. This is useful if the surface is actually - grayscale colors, and not palette colors. - - Note, this function currently does not handle palette using surfaces - correctly. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth as the first passed source Surface. - - .. versionaddedold:: 1.8 - .. versionaddedold:: 1.9 ``palette_colors`` argument - - .. ## pygame.transform.average_surfaces ## - -.. function:: average_color - - | :sl:`finds the average color of a surface` - | :sg:`average_color(surface, rect=None, consider_alpha=False) -> tuple` - - Finds the average color of a Surface or a region of a surface specified by a - Rect, and returns it as a tuple of integers red, green, blue, and alpha. - If consider_alpha is set to True, then alpha is taken into account - (removing the black artifacts). - - .. versionaddedold:: 2.1.2 ``consider_alpha`` argument - - .. ## pygame.transform.average_color ## - -.. function:: invert - - | :sl:`inverts the RGB elements of a surface` - | :sg:`invert(surface, dest_surface=None) -> Surface` - - Inverts each RGB pixel contained within the Surface, does not affect alpha channel. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth as the source Surface. - - .. versionadded:: 2.2.0 - - .. ## pygame.transform.invert ## - -.. function:: grayscale - - | :sl:`grayscale a surface` - | :sg:`grayscale(surface, dest_surface=None) -> Surface` - - Returns a grayscaled version of the original surface using the luminosity formula which weights red, green and blue according to their wavelengths. - - An optional destination surface can be passed which is faster than creating a new - Surface. This destination surface must have the same dimensions (width, height) and - depth as the source Surface. - - .. versionadded:: 2.1.4 - - .. versionchanged:: 2.4.0 Adjusted formula slightly to support performance optimisation. It may return very slightly - different pixels than before, but should run seven to eleven times faster on most systems. - - .. ## pygame.transform.grayscale ## - -.. function:: solid_overlay - - | :sl:`replaces non transparent pixels with the provided color` - | :sg:`solid_overlay(surface, color, dest_surface=None, keep_alpha=False) -> Surface` - - Returns a new version of the original surface with all non transparent pixels set to the color provided. - - An optional destination surface can be passed which is faster than creating a new - Surface. - This destination surface must have the same dimensions (width, height) and - depth as the source Surface. - - :param pygame.Surface surface: The target surface. - - :param color: Color which all non transparent within the target surface must be set to. - :type color: :data:`pygame.typing.ColorLike` - - :param dest_surface: Optional destination surface to which the changes will be applied. - :type dest_surface: pygame.Surface or None - - :param bool keep_alpha: Optional parameter that controls whether to keep the surface alpha when replacing with the color. - - .. versionadded:: 2.5.2 - - .. ## pygame.transform.solid_overlay ## - -.. function:: threshold - - | :sl:`finds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'.` - | :sg:`threshold(dest_surface, surface, search_color, threshold=(0,0,0,0), set_color=(0,0,0,0), set_behavior=1, search_surf=None, inverse_set=False) -> num_threshold_pixels` - - This versatile function can be used for find colors in a 'surf' close to a 'search_color' - or close to colors in a separate 'search_surf'. - - It can also be used to transfer pixels into a 'dest_surf' that match or don't match. - - By default it sets pixels in the 'dest_surf' where all of the pixels NOT within the - threshold are changed to set_color. If inverse_set is optionally set to True, - the pixels that ARE within the threshold are changed to set_color. - - If the optional 'search_surf' surface is given, it is used to threshold against - rather than the specified 'set_color'. That is, it will find each pixel in the - 'surf' that is within the 'threshold' of the pixel at the same coordinates - of the 'search_surf'. - - :param dest_surf: Surface we are changing. See 'set_behavior'. - Should be None if counting (set_behavior is 0). - :type dest_surf: pygame.Surface or None - - :param pygame.Surface surf: Surface we are looking at. - - :param search_color: Color we are searching for. - :type color: :data:`pygame.typing.ColorLike` - - :param threshold: Within this distance from search_color (or search_surf). - You can use a threshold of (r,g,b,a) where the r,g,b can have different - thresholds. So you could use an r threshold of 40 and a blue threshold of 2 - if you like. - :type color: :data:`pygame.typing.ColorLike` - - :param set_color: Color we set in dest_surf. - :type color: :data:`pygame.typing.ColorLike` or ``None`` - - :param int set_behavior: - - set_behavior=1 (default). Pixels in dest_surface will be changed to 'set_color'. - - set_behavior=0 we do not change 'dest_surf', just count. Make dest_surf=None. - - set_behavior=2 pixels set in 'dest_surf' will be from 'surf'. - - :param search_surf: - - search_surf=None (default). Search against 'search_color' instead. - - search_surf=Surface. Look at the color in 'search_surf' rather than using 'search_color'. - :type search_surf: pygame.Surface or None - - :param bool inverse_set: - - False, default. Pixels outside of threshold are changed. - - True, Pixels within threshold are changed. - - :rtype: int - :returns: The number of pixels that are within the 'threshold' in 'surf' - compared to either 'search_color' or `search_surf`. - - :Examples: - - See the threshold tests for an example: https://github.com/pygame-community/pygame-ce/blob/main/test/transform_test.py - - .. literalinclude:: ../../../test/transform_test.py - :pyobject: TransformModuleTest.test_threshold_dest_surf_not_change - - - .. versionaddedold:: 1.8 - .. versionchangedold:: 1.9.4 - Fixed a lot of bugs and added keyword arguments. Test your code. - - .. ## pygame.transform.threshold ## - -.. function:: hsl - - | :sl:`Change the hue, saturation, and lightness of a surface.` - | :sg:`hsl(surface, hue, saturation, lightness, dest_surface=None) -> Surface` - - This function allows you to modify the hue, saturation, and lightness of a given surface. - - :param pygame.Surface surface: The surface to transform. - - :param float hue: The amount to change the hue. Positive values rotate the hue clockwise, - while negative values rotate it counterclockwise. Value range: -360 to 360. - - :param float saturation: The amount to change the saturation. Positive values increase saturation, - while negative values decrease it. Value range: -1 to 1. - - :param float lightness: The amount to change the lightness. Positive values increase lightness, - while negative values decrease it. Value range: -1 to 1. - - :param pygame.Surface dest_surface: An optional destination surface to store the transformed image. - If provided, it should have the same dimensions and depth as the source surface. - - :returns: A new surface with the hue, saturation, and lightness transformed. - - :Examples: - - Apply a hue rotation of 30 degrees, increase saturation by 20%, and decrease lightness by 10% to a surface: - - .. code-block:: python - - new_surf = hsl(original_surf, 30, 0.2, -0.1) - - .. versionadded:: 2.5.0 - - .. ## pygame.transform.hsl ## - -.. ## pygame.transform ## +.. autopgmodule:: pygame.transform + :members: diff --git a/src_c/doc/transform_doc.h b/src_c/doc/transform_doc.h index d768240a52..3ab15a7ec4 100644 --- a/src_c/doc/transform_doc.h +++ b/src_c/doc/transform_doc.h @@ -1,23 +1,23 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_TRANSFORM "pygame module to transform surfaces" -#define DOC_TRANSFORM_FLIP "flip(surface, flip_x, flip_y) -> Surface\nflip vertically and horizontally" -#define DOC_TRANSFORM_SCALE "scale(surface, size, dest_surface=None) -> Surface\nresize to new resolution" -#define DOC_TRANSFORM_SCALEBY "scale_by(surface, factor, dest_surface=None) -> Surface\nresize to new resolution, using scalar(s)" -#define DOC_TRANSFORM_ROTATE "rotate(surface, angle) -> Surface\nrotate an image" -#define DOC_TRANSFORM_ROTOZOOM "rotozoom(surface, angle, scale) -> Surface\nfiltered scale and rotation" -#define DOC_TRANSFORM_SCALE2X "scale2x(surface, dest_surface=None) -> Surface\nspecialized image doubler" -#define DOC_TRANSFORM_SMOOTHSCALE "smoothscale(surface, size, dest_surface=None) -> Surface\nscale a surface to an arbitrary size smoothly" -#define DOC_TRANSFORM_SMOOTHSCALEBY "smoothscale_by(surface, factor, dest_surface=None) -> Surface\nresize to new resolution, using scalar(s)" -#define DOC_TRANSFORM_GETSMOOTHSCALEBACKEND "get_smoothscale_backend() -> string\nreturn smoothscale filter version in use: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'" -#define DOC_TRANSFORM_SETSMOOTHSCALEBACKEND "set_smoothscale_backend(backend) -> None\nset smoothscale filter version to one of: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'" -#define DOC_TRANSFORM_CHOP "chop(surface, rect) -> Surface\ngets a copy of an image with an interior area removed" -#define DOC_TRANSFORM_LAPLACIAN "laplacian(surface, dest_surface=None) -> Surface\nfind edges in a surface" -#define DOC_TRANSFORM_BOXBLUR "box_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface\nblur a surface using box blur" -#define DOC_TRANSFORM_GAUSSIANBLUR "gaussian_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface\nblur a surface using gaussian blur" -#define DOC_TRANSFORM_AVERAGESURFACES "average_surfaces(surfaces, dest_surface=None, palette_colors=1) -> Surface\nfind the average surface from many surfaces." -#define DOC_TRANSFORM_AVERAGECOLOR "average_color(surface, rect=None, consider_alpha=False) -> tuple\nfinds the average color of a surface" -#define DOC_TRANSFORM_INVERT "invert(surface, dest_surface=None) -> Surface\ninverts the RGB elements of a surface" -#define DOC_TRANSFORM_GRAYSCALE "grayscale(surface, dest_surface=None) -> Surface\ngrayscale a surface" -#define DOC_TRANSFORM_SOLIDOVERLAY "solid_overlay(surface, color, dest_surface=None, keep_alpha=False) -> Surface\nreplaces non transparent pixels with the provided color" -#define DOC_TRANSFORM_THRESHOLD "threshold(dest_surface, surface, search_color, threshold=(0,0,0,0), set_color=(0,0,0,0), set_behavior=1, search_surf=None, inverse_set=False) -> num_threshold_pixels\nfinds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'." -#define DOC_TRANSFORM_HSL "hsl(surface, hue, saturation, lightness, dest_surface=None) -> Surface\nChange the hue, saturation, and lightness of a surface." +#define DOC_TRANSFORM "Pygame module to transform surfaces." +#define DOC_TRANSFORM_FLIP "flip(surface, flip_x, flip_y) -> Surface\nFlip vertically and horizontally." +#define DOC_TRANSFORM_SCALE "scale(surface, size, dest_surface=None) -> Surface\nResize to new resolution." +#define DOC_TRANSFORM_SCALEBY "scale_by(surface, factor, dest_surface=None) -> Surface\nResize to new resolution, using scalar(s)." +#define DOC_TRANSFORM_ROTATE "rotate(surface, angle) -> Surface\nRotate an image." +#define DOC_TRANSFORM_ROTOZOOM "rotozoom(surface, angle, scale) -> Surface\nFiltered scale and rotation." +#define DOC_TRANSFORM_SCALE2X "scale2x(surface, dest_surface=None) -> Surface\nSpecialized image doubler." +#define DOC_TRANSFORM_SMOOTHSCALE "smoothscale(surface, size, dest_surface=None) -> Surface\nScale a surface to an arbitrary size smoothly." +#define DOC_TRANSFORM_SMOOTHSCALEBY "smoothscale_by(surface, factor, dest_surface=None) -> Surface\nResize to new resolution, using scalar(s)." +#define DOC_TRANSFORM_GETSMOOTHSCALEBACKEND "get_smoothscale_backend() -> Literal['GENERIC', 'SSE2', 'NEON']\nReturn smoothscale filter version in use: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'." +#define DOC_TRANSFORM_SETSMOOTHSCALEBACKEND "set_smoothscale_backend(backend) -> None\nSet smoothscale filter version to one of: 'GENERIC', 'MMX', 'SSE', 'SSE2', or 'NEON'." +#define DOC_TRANSFORM_CHOP "chop(surface, rect) -> Surface\nGets a copy of an image with an interior area removed." +#define DOC_TRANSFORM_LAPLACIAN "laplacian(surface, dest_surface=None) -> Surface\nFind edges in a surface." +#define DOC_TRANSFORM_BOXBLUR "box_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface\nBlur a surface using box blur." +#define DOC_TRANSFORM_GAUSSIANBLUR "gaussian_blur(surface, radius, repeat_edge_pixels=True, dest_surface=None) -> Surface\nBlur a surface using gaussian blur." +#define DOC_TRANSFORM_AVERAGESURFACES "average_surfaces(surfaces, dest_surface=None, palette_colors=1) -> Surface\nFind the average surface from many surfaces." +#define DOC_TRANSFORM_AVERAGECOLOR "average_color(surface, rect=None, consider_alpha=False) -> tuple[int, int, int, int]\nFinds the average color of a surface." +#define DOC_TRANSFORM_INVERT "invert(surface, dest_surface=None) -> Surface\nInverts the RGB elements of a surface." +#define DOC_TRANSFORM_GRAYSCALE "grayscale(surface, dest_surface=None) -> Surface\nGrayscale a surface." +#define DOC_TRANSFORM_SOLIDOVERLAY "solid_overlay(surface, color, dest_surface=None, keep_alpha=False) -> Surface\nReplaces non transparent pixels with the provided color." +#define DOC_TRANSFORM_THRESHOLD "threshold(dest_surface, surface, search_color, threshold=(0, 0, 0, 0), set_color=(0, 0, 0, 0), set_behavior=1, search_surf=None, inverse_set=False) -> int\nFinds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'." +#define DOC_TRANSFORM_HSL "hsl(surface, hue=0, saturation=0, lightness=0, dest_surface=None) -> Surface\nChange the hue, saturation, and lightness of a surface." From e623579cfd8d36df883cb31cc2712913d41b82be Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:57:27 -0800 Subject: [PATCH 059/441] Use SDL3 compat format/color mapping in surface_fill.c --- src_c/surface_fill.c | 100 ++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 30 deletions(-) diff --git a/src_c/surface_fill.c b/src_c/surface_fill.c index 26e0807327..bc63cfdcf5 100644 --- a/src_c/surface_fill.c +++ b/src_c/surface_fill.c @@ -86,7 +86,6 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Uint32 tmp; @@ -94,6 +93,11 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -102,13 +106,13 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -172,7 +176,6 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Sint32 tmp2; @@ -180,6 +183,11 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -188,13 +196,13 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -258,13 +266,17 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -273,13 +285,13 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_MULT(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -343,13 +355,17 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -358,13 +374,13 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_MIN(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -428,13 +444,17 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -443,13 +463,13 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_MAX(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -515,7 +535,6 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Uint32 tmp; @@ -523,6 +542,11 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { @@ -535,13 +559,13 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -584,7 +608,6 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; Sint32 tmp2; @@ -592,6 +615,11 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { @@ -604,13 +632,13 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -654,13 +682,17 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { @@ -673,13 +705,13 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MULT(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -722,13 +754,17 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { @@ -741,13 +777,13 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MIN(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); @@ -790,13 +826,17 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int skip; int bpp = PG_SURF_BytesPerPixel(surface); int n; - SDL_PixelFormat *fmt = surface->format; Uint8 sR, sG, sB, sA, cR, cG, cB, cA; Uint32 pixel; int result = -1; int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { @@ -809,13 +849,13 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) switch (bpp) { case 1: { - SDL_GetRGBA(color, fmt, &cR, &cG, &cB, &cA); + PG_GetRGBA(color, fmt, palette, &cR, &cG, &cB, &cA); while (height--) { LOOP_UNROLLED4( { GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); BLEND_RGBA_MAX(cR, cG, cB, cA, sR, sG, sB, sA); - *pixels = SDL_MapRGBA(fmt, sR, sG, sB, sA); + *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; }, n, width); From d5a3a63b230e1923abbfbdbb708a9eea9276dba9 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:06:12 -0800 Subject: [PATCH 060/441] Use SDL3 compat format->loss conversion in CREATE_PIXEL macro --- src_c/surface.h | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src_c/surface.h b/src_c/surface.h index 4009579d1d..2bd07bcbc8 100644 --- a/src_c/surface.h +++ b/src_c/surface.h @@ -142,20 +142,22 @@ } #endif -#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ - switch (bp) { \ - case 2: \ - *((Uint16 *)(buf)) = ((r >> ft->Rloss) << ft->Rshift) | \ - ((g >> ft->Gloss) << ft->Gshift) | \ - ((b >> ft->Bloss) << ft->Bshift) | \ - ((a >> ft->Aloss) << ft->Ashift); \ - break; \ - case 4: \ - *((Uint32 *)(buf)) = ((r >> ft->Rloss) << ft->Rshift) | \ - ((g >> ft->Gloss) << ft->Gshift) | \ - ((b >> ft->Bloss) << ft->Bshift) | \ - ((a >> ft->Aloss) << ft->Ashift); \ - break; \ +#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ + switch (bp) { \ + case 2: \ + *((Uint16 *)(buf)) = \ + ((r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ + ((g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ + ((b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ + ((a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ + break; \ + case 4: \ + *((Uint32 *)(buf)) = \ + ((r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ + ((g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ + ((b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ + ((a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ + break; \ } /* Pretty good idea from Tom Duff :-). */ From 8337220dc1e012b4bfe5fc07eb84402a4789b33e Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:46:04 -0800 Subject: [PATCH 061/441] Prep alphablit.c for SDL3 --- src_c/_blit_info.h | 6 +- src_c/alphablit.c | 325 ++++++++++++++++++++++++--------------------- 2 files changed, 180 insertions(+), 151 deletions(-) diff --git a/src_c/_blit_info.h b/src_c/_blit_info.h index acc2d4f981..0bd289dec9 100644 --- a/src_c/_blit_info.h +++ b/src_c/_blit_info.h @@ -13,8 +13,10 @@ typedef struct { Uint8 *d_pixels; int d_pxskip; int d_skip; - SDL_PixelFormat *src; - SDL_PixelFormat *dst; + PG_PixelFormat *src; + SDL_Palette *src_palette; + PG_PixelFormat *dst; + SDL_Palette *dst_palette; Uint8 src_blanket_alpha; int src_has_colorkey; Uint32 src_colorkey; diff --git a/src_c/alphablit.c b/src_c/alphablit.c index a5a44dfb1e..82c1d8f8f7 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -111,8 +111,14 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, (Uint16)dstrect->x * PG_SURF_BytesPerPixel(dst); info.d_pxskip = PG_SURF_BytesPerPixel(dst); info.d_skip = dst->pitch - info.width * PG_SURF_BytesPerPixel(dst); - info.src = src->format; - info.dst = dst->format; + + if (!PG_GetSurfaceDetails(src, &(info.src), &(info.src_palette))) { + okay = 0; + } + if (!PG_GetSurfaceDetails(dst, &(info.dst), &(info.dst_palette))) { + okay = 0; + } + SDL_GetSurfaceAlphaMod(src, &info.src_blanket_alpha); if ((info.src_has_colorkey = SDL_HasColorKey(src))) { SDL_GetColorKey(src, &info.src_colorkey); @@ -157,14 +163,14 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, switch (blend_flags) { case 0: { if (info.src_blend != SDL_BLENDMODE_NONE && - src->format->Amask) { + info.src->Amask) { #if !defined(__EMSCRIPTEN__) #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask) { + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask) { /* If our source and destination are the same ARGB 32bit format we can use SSE2/NEON/AVX2 to speed up the blend */ @@ -224,11 +230,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_has_avx2() && (src != dst)) { blit_blend_rgb_add_avx2(&info); break; @@ -236,11 +242,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgb_add_sse2(&info); break; @@ -256,11 +262,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_has_avx2() && (src != dst)) { blit_blend_rgb_sub_avx2(&info); break; @@ -268,11 +274,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgb_sub_sse2(&info); break; @@ -288,11 +294,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_has_avx2() && (src != dst)) { blit_blend_rgb_mul_avx2(&info); break; @@ -300,11 +306,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgb_mul_sse2(&info); break; @@ -320,11 +326,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_has_avx2() && (src != dst)) { blit_blend_rgb_min_avx2(&info); break; @@ -332,11 +338,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgb_min_sse2(&info); break; @@ -352,11 +358,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_has_avx2() && (src != dst)) { blit_blend_rgb_max_avx2(&info); break; @@ -364,11 +370,11 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - !(src->format->Amask != 0 && dst->format->Amask != 0 && - src->format->Amask != dst->format->Amask) && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + !(info.src->Amask != 0 && info.dst->Amask != 0 && + info.src->Amask != info.dst->Amask) && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgb_max_sse2(&info); break; @@ -385,9 +391,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_rgba_add_avx2(&info); @@ -396,9 +402,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgba_add_sse2(&info); @@ -415,9 +421,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_rgba_sub_avx2(&info); @@ -426,9 +432,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgba_sub_sse2(&info); @@ -445,9 +451,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_rgba_mul_avx2(&info); @@ -456,9 +462,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgba_mul_sse2(&info); @@ -475,9 +481,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_rgba_min_avx2(&info); @@ -486,9 +492,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgba_min_sse2(&info); @@ -505,9 +511,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_rgba_max_avx2(&info); @@ -516,9 +522,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_rgba_max_sse2(&info); @@ -535,9 +541,9 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && info.src_blend != SDL_BLENDMODE_NONE && pg_has_avx2() && (src != dst)) { blit_blend_premultiplied_avx2(&info); @@ -546,10 +552,10 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, #if PG_ENABLE_SSE_NEON if (PG_SURF_BytesPerPixel(src) == 4 && PG_SURF_BytesPerPixel(dst) == 4 && - src->format->Rmask == dst->format->Rmask && - src->format->Gmask == dst->format->Gmask && - src->format->Bmask == dst->format->Bmask && - src->format->Amask == 0xFF000000 && + info.src->Rmask == info.dst->Rmask && + info.src->Gmask == info.dst->Gmask && + info.src->Bmask == info.dst->Bmask && + info.src->Amask == 0xFF000000 && info.src_blend != SDL_BLENDMODE_NONE && pg_HasSSE_NEON() && (src != dst)) { blit_blend_premultiplied_sse2(&info); @@ -594,8 +600,8 @@ blit_blend_rgba_add(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -724,8 +730,8 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -854,8 +860,8 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -986,8 +992,8 @@ blit_blend_rgba_min(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1115,8 +1121,8 @@ blit_blend_rgba_max(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1244,8 +1250,8 @@ blit_blend_premultiplied(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1447,8 +1453,8 @@ blit_blend_add(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1623,8 +1629,8 @@ blit_blend_sub(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1799,8 +1805,9 @@ blit_blend_mul(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1920,7 +1927,7 @@ blit_blend_mul(SDL_BlitInfo *info) GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); - *dst = (Uint8)SDL_MapRGB(dstfmt, dR, dG, dB); + *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, @@ -1985,8 +1992,9 @@ blit_blend_min(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2098,7 +2106,7 @@ blit_blend_min(SDL_BlitInfo *info) GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - *dst = (Uint8)SDL_MapRGB(dstfmt, dR, dG, dB); + *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); src += srcpxskip; dst += dstpxskip; }, @@ -2163,8 +2171,8 @@ blit_blend_max(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2343,8 +2351,10 @@ alphablit_alpha(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; + PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2380,7 +2390,7 @@ alphablit_alpha(SDL_BlitInfo *info) { GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2403,8 +2413,8 @@ alphablit_alpha(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); ALPHA_BLEND(sR, sG, sB, sA, dRi, dGi, dBi, dAi); CREATE_PIXEL(dst, dRi, dGi, dBi, dAi, dstbpp, dstfmt); src += srcpxskip; @@ -2421,9 +2431,9 @@ alphablit_alpha(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); /* modulate Alpha */ sA = (sA * modulateA) / 255; @@ -2456,8 +2466,10 @@ alphablit_colorkey(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; + PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2480,7 +2492,8 @@ alphablit_colorkey(SDL_BlitInfo *info) sAi = (*src == colorkey) ? 0 : alpha; GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); ALPHA_BLEND(sRi, sGi, sBi, sAi, dRi, dGi, dBi, dAi); - *dst = (Uint8)SDL_MapRGBA(dstfmt, dRi, dGi, dBi, dAi); + *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, + dAi); src += srcpxskip; dst += dstpxskip; }, @@ -2497,7 +2510,7 @@ alphablit_colorkey(SDL_BlitInfo *info) GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); sAi = (*src == colorkey) ? 0 : alpha; GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2520,11 +2533,12 @@ alphablit_colorkey(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); ALPHA_BLEND(sR, sG, sB, sA, dRi, dGi, dBi, dAi); - *dst = (Uint8)SDL_MapRGBA(dstfmt, dRi, dGi, dBi, dAi); + *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, + dAi); src += srcpxskip; dst += dstpxskip; }, @@ -2543,10 +2557,10 @@ alphablit_colorkey(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2569,10 +2583,10 @@ alphablit_colorkey(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); sA = (pixel == colorkey) ? 0 : alpha; GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2602,8 +2616,10 @@ alphablit_solid(SDL_BlitInfo *info) Uint8 *dst = info->d_pixels; int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; + PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2623,7 +2639,8 @@ alphablit_solid(SDL_BlitInfo *info) GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcfmt); GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); ALPHA_BLEND(sRi, sGi, sBi, alpha, dRi, dGi, dBi, dAi); - *dst = (Uint8)SDL_MapRGBA(dstfmt, dRi, dGi, dBi, dAi); + *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, + dAi); src += srcpxskip; dst += dstpxskip; }, @@ -2639,7 +2656,7 @@ alphablit_solid(SDL_BlitInfo *info) { GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcfmt); GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2662,10 +2679,11 @@ alphablit_solid(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); ALPHA_BLEND(sR, sG, sB, alpha, dRi, dGi, dBi, dAi); - *dst = (Uint8)SDL_MapRGBA(dstfmt, dRi, dGi, dBi, dAi); + *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, + dAi); src += srcpxskip; dst += dstpxskip; }, @@ -2684,9 +2702,9 @@ alphablit_solid(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2709,9 +2727,9 @@ alphablit_solid(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - SDL_GetRGBA(pixel, srcfmt, &sR, &sG, &sB, &sA); + PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); GET_PIXEL(pixel, dstbpp, dst); - SDL_GetRGBA(pixel, dstfmt, &dR, &dG, &dB, &dA); + PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; dGi = dG; dBi = dB; @@ -2742,7 +2760,13 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_SetError("pygame_Blit: passed a NULL surface"); return (-1); } - if (src->locked || dst->locked) { + +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (src->flags & SDL_SURFACE_LOCKED || dst->flags & SDL_SURFACE_LOCKED) +#else + if (src->locked || dst->locked) +#endif + { SDL_SetError("pygame_Blit: Surfaces must not be locked during blit"); return (-1); } @@ -2787,26 +2811,29 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* clip the destination rectangle against the clip rectangle */ { - SDL_Rect *clip = &dst->clip_rect; + SDL_Rect clip; + if (!PG_GetSurfaceClipRect(dst, &clip)) { + return (-1); + } int dx, dy; - dx = clip->x - dstrect->x; + dx = clip.x - dstrect->x; if (dx > 0) { w -= dx; dstrect->x += dx; srcx += dx; } - dx = dstrect->x + w - clip->x - clip->w; + dx = dstrect->x + w - clip.x - clip.w; if (dx > 0) w -= dx; - dy = clip->y - dstrect->y; + dy = clip.y - dstrect->y; if (dy > 0) { h -= dy; dstrect->y += dy; srcy += dy; } - dy = dstrect->y + h - clip->y - clip->h; + dy = dstrect->y + h - clip.y - clip.h; if (dy > 0) h -= dy; } From 011162af9410a175017eb647cee0e2c3a5bd0930 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Wed, 19 Feb 2025 06:20:14 -0800 Subject: [PATCH 062/441] Merge pull request #3335 from aatle/typing-fixes General improvements and fixes to stubs --- buildconfig/stubs/pygame/_sdl2/controller.pyi | 1 + buildconfig/stubs/pygame/_sdl2/touch.pyi | 1 - buildconfig/stubs/pygame/bufferproxy.pyi | 22 ++++---- buildconfig/stubs/pygame/color.pyi | 11 ++-- buildconfig/stubs/pygame/display.pyi | 51 ++++++++++++------- buildconfig/stubs/pygame/event.pyi | 6 +-- buildconfig/stubs/pygame/image.pyi | 6 +-- buildconfig/stubs/pygame/joystick.pyi | 1 + buildconfig/stubs/pygame/key.pyi | 5 +- buildconfig/stubs/pygame/math.pyi | 3 +- buildconfig/stubs/pygame/midi.pyi | 5 +- buildconfig/stubs/pygame/mixer.pyi | 6 ++- buildconfig/stubs/pygame/mixer_music.pyi | 11 ++-- buildconfig/stubs/pygame/pixelarray.pyi | 31 ++++++----- buildconfig/stubs/pygame/rect.pyi | 6 ++- buildconfig/stubs/pygame/sndarray.pyi | 2 +- buildconfig/stubs/pygame/surface.pyi | 3 +- buildconfig/stubs/pygame/system.pyi | 1 - docs/reST/ref/bufferproxy.rst | 6 +-- src_c/doc/bufferproxy_doc.h | 4 +- 20 files changed, 110 insertions(+), 72 deletions(-) diff --git a/buildconfig/stubs/pygame/_sdl2/controller.pyi b/buildconfig/stubs/pygame/_sdl2/controller.pyi index 91de98fd87..cb67ed2d24 100644 --- a/buildconfig/stubs/pygame/_sdl2/controller.pyi +++ b/buildconfig/stubs/pygame/_sdl2/controller.pyi @@ -6,6 +6,7 @@ def get_init() -> bool: ... def quit() -> None: ... def is_controller(device_index: int) -> bool: ... def get_count() -> int: ... + @final class Controller: def __new__(cls, device_index: int) -> Controller: ... diff --git a/buildconfig/stubs/pygame/_sdl2/touch.pyi b/buildconfig/stubs/pygame/_sdl2/touch.pyi index 6e1808f400..a76bb12c16 100644 --- a/buildconfig/stubs/pygame/_sdl2/touch.pyi +++ b/buildconfig/stubs/pygame/_sdl2/touch.pyi @@ -1,6 +1,5 @@ from typing import TypedDict, Optional -# dict at runtime, this only exist for benefit of the typechecker class _FingerDict(TypedDict): id: int x: float diff --git a/buildconfig/stubs/pygame/bufferproxy.pyi b/buildconfig/stubs/pygame/bufferproxy.pyi index 6eb21c5f4b..58624cabdb 100644 --- a/buildconfig/stubs/pygame/bufferproxy.pyi +++ b/buildconfig/stubs/pygame/bufferproxy.pyi @@ -1,15 +1,17 @@ -from typing import Any, overload +from typing import Any class BufferProxy: - parent: Any - length: int - raw: bytes + @property + def parent(self) -> Any: ... + @property + def length(self) -> int: ... + @property + def raw(self) -> bytes: ... # possibly going to be deprecated/removed soon, in which case these # typestubs must be removed too - __array_interface__: dict[str, Any] - __array_struct__: Any - @overload - def __init__(self) -> None: ... - @overload - def __init__(self, parent: Any) -> None: ... + @property + def __array_interface__(self) -> dict[str, Any]: ... + @property + def __array_struct__(self) -> Any: ... + def __init__(self, parent: Any) -> None: ... # TODO: parent: TypedDict | Protocol def write(self, buffer: bytes, offset: int = 0) -> None: ... diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 5f810b225d..1c69ab6083 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -1,5 +1,5 @@ from collections.abc import Collection, Iterator -from typing import Any, SupportsIndex, Union, overload +from typing import Any, ClassVar, SupportsIndex, Union, overload from typing_extensions import deprecated # added in 3.13 from pygame.typing import ColorLike @@ -18,8 +18,9 @@ class Color(Collection[int]): hsla: tuple[float, float, float, float] i1i2i3: tuple[float, float, float] normalized: tuple[float, float, float, float] - __hash__: None # type: ignore - __array_struct__: Any + __hash__: ClassVar[None] # type: ignore[assignment] + @property + def __array_struct__(self) -> Any: ... @overload def __init__(self, r: int, g: int, b: int, a: int = 255) -> None: ... @overload @@ -41,8 +42,8 @@ class Color(Collection[int]): def __index__(self) -> int: ... def __invert__(self) -> Color: ... def __contains__(self, other: int) -> bool: ... # type: ignore[override] - def __getattribute__(self, attr: str) -> Union[Color, tuple[int, ...]]: ... - def __setattr__(self, attr: str, value: Union[Color, tuple[int, ...]]) -> None: ... + def __getattribute__(self, name: str) -> Union[Color, tuple[int, ...]]: ... + def __setattr__(self, name: str, value: Union[Color, tuple[int, ...]]) -> None: ... @overload @classmethod def from_cmy(cls, object: tuple[float, float, float], /) -> Color: ... diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index 43e1ec8c05..ec7ce7c742 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -16,23 +16,40 @@ from pygame.typing import ( ) class _VidInfo: - hw: int - wm: int - video_mem: int - bitsize: int - bytesize: int - masks: tuple[int, int, int, int] - shifts: tuple[int, int, int, int] - losses: tuple[int, int, int, int] - blit_hw: int - blit_hw_CC: int - blit_hw_A: int - blit_sw: int - blit_sw_CC: int - blit_sw_A: int - current_h: int - current_w: int - pixel_format: str + @property + def hw(self) -> int: ... + @property + def wm(self) -> int: ... + @property + def video_mem(self) -> int: ... + @property + def bitsize(self) -> int: ... + @property + def bytesize(self) -> int: ... + @property + def masks(self) -> tuple[int, int, int, int]: ... + @property + def shifts(self) -> tuple[int, int, int, int]: ... + @property + def losses(self) -> tuple[int, int, int, int]: ... + @property + def blit_hw(self) -> int: ... + @property + def blit_hw_CC(self) -> int: ... + @property + def blit_hw_A(self) -> int: ... + @property + def blit_sw(self) -> int: ... + @property + def blit_sw_CC(self) -> int: ... + @property + def blit_sw_A(self) -> int: ... + @property + def current_h(self) -> int: ... + @property + def current_w(self) -> int: ... + @property + def pixel_format(self) -> str: ... def init() -> None: ... def quit() -> None: ... diff --git a/buildconfig/stubs/pygame/event.pyi b/buildconfig/stubs/pygame/event.pyi index b3c832bb03..cc721c1b91 100644 --- a/buildconfig/stubs/pygame/event.pyi +++ b/buildconfig/stubs/pygame/event.pyi @@ -1,4 +1,4 @@ -from typing import Any, Optional, Union, final +from typing import Any, ClassVar, Optional, Union, final from typing_extensions import deprecated # added in 3.13 from pygame.typing import SequenceLike @@ -10,11 +10,11 @@ class _GenericEvent: @property def type(self) -> int: ... __dict__: dict[str, Any] - __hash__: None # type: ignore + __hash__: ClassVar[None] # type: ignore[assignment] def __init__( self, type: int, dict: dict[str, Any] = ..., **kwargs: Any ) -> None: ... - def __getattribute__(self, name: str) -> Any: ... + def __getattr__(self, name: str) -> Any: ... def __setattr__(self, name: str, value: Any) -> None: ... def __delattr__(self, name: str) -> None: ... def __bool__(self) -> bool: ... diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 7a11a55cc5..bbce383799 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -6,11 +6,11 @@ from pygame.surface import Surface from pygame.typing import FileLike, IntPoint, Point -_BufferStyle = Union[BufferProxy, bytes, bytearray, memoryview] +_BufferLike = Union[BufferProxy, bytes, bytearray, memoryview] +_from_buffer_format = Literal["P", "RGB", "BGR", "BGRA", "RGBX", "RGBA", "ARGB"] _to_bytes_format = Literal[ "P", "RGB", "RGBX", "RGBA", "ARGB", "BGRA", "ABGR", "RGBA_PREMULT", "ARGB_PREMULT" ] -_from_buffer_format = Literal["P", "RGB", "BGR", "BGRA", "RGBX", "RGBA", "ARGB"] _from_bytes_format = Literal["P", "RGB", "RGBX", "RGBA", "ARGB", "BGRA", "ABGR"] def load(file: FileLike, namehint: str = "") -> Surface: ... @@ -47,7 +47,7 @@ def frombytes( pitch: int = -1, ) -> Surface: ... def frombuffer( - bytes: _BufferStyle, + buffer: _BufferLike, size: IntPoint, format: _from_buffer_format, pitch: int = -1, diff --git a/buildconfig/stubs/pygame/joystick.pyi b/buildconfig/stubs/pygame/joystick.pyi index 517829bf2c..23a3ddb812 100644 --- a/buildconfig/stubs/pygame/joystick.pyi +++ b/buildconfig/stubs/pygame/joystick.pyi @@ -5,6 +5,7 @@ def init() -> None: ... def quit() -> None: ... def get_init() -> bool: ... def get_count() -> int: ... + @final class JoystickType: def __init__(self, id: int) -> None: ... diff --git a/buildconfig/stubs/pygame/key.pyi b/buildconfig/stubs/pygame/key.pyi index 24a61739bb..9961017068 100644 --- a/buildconfig/stubs/pygame/key.pyi +++ b/buildconfig/stubs/pygame/key.pyi @@ -1,6 +1,9 @@ +from typing import NoReturn + from pygame.typing import RectLike -class ScancodeWrapper(tuple[bool, ...]): ... +class ScancodeWrapper(tuple[bool, ...]): + def __iter__(self) -> NoReturn: ... def get_focused() -> bool: ... def get_pressed() -> ScancodeWrapper: ... diff --git a/buildconfig/stubs/pygame/math.pyi b/buildconfig/stubs/pygame/math.pyi index 5387d31a72..7e40450b0f 100644 --- a/buildconfig/stubs/pygame/math.pyi +++ b/buildconfig/stubs/pygame/math.pyi @@ -1,6 +1,7 @@ from collections.abc import Collection, Iterator from typing import ( Any, + ClassVar, Generic, Literal, SupportsIndex, @@ -23,7 +24,7 @@ _TVec = TypeVar("_TVec", bound=_GenericVector) # Also used with _TVec generics class _GenericVector(Collection[float]): epsilon: float - __hash__: None # type: ignore + __hash__: ClassVar[None] # type: ignore[assignment] def __len__(self) -> int: ... @overload def __setitem__(self, key: int, value: float) -> None: ... diff --git a/buildconfig/stubs/pygame/midi.pyi b/buildconfig/stubs/pygame/midi.pyi index 4cce264e26..7fac8ba892 100644 --- a/buildconfig/stubs/pygame/midi.pyi +++ b/buildconfig/stubs/pygame/midi.pyi @@ -1,3 +1,4 @@ +from collections.abc import Iterable from typing import Union from pygame.event import Event @@ -17,7 +18,7 @@ def get_default_input_id() -> int: ... def get_default_output_id() -> int: ... def get_device_info(an_id: int) -> tuple[str, str, int, int, int]: ... def midis2events( - midis: SequenceLike[SequenceLike[Union[SequenceLike[int], int]]], device_id: int + midis: Iterable[SequenceLike[Union[SequenceLike[int], int]]], device_id: int ) -> list[Event]: ... def time() -> int: ... def frequency_to_midi(frequency: float) -> int: ... @@ -45,6 +46,6 @@ class Output: def note_on(self, note: int, velocity: int, channel: int = 0) -> None: ... def set_instrument(self, instrument_id: int, channel: int = 0) -> None: ... def pitch_bend(self, value: int = 0, channel: int = 0) -> None: ... - def write(self, data: list[list[Union[list[int], int]]]) -> None: ... + def write(self, data: Iterable[SequenceLike[Union[SequenceLike[int], int]]]) -> None: ... def write_short(self, status: int, data1: int = 0, data2: int = 0) -> None: ... def write_sys_ex(self, when: int, msg: Union[list[int], str]) -> None: ... diff --git a/buildconfig/stubs/pygame/mixer.pyi b/buildconfig/stubs/pygame/mixer.pyi index 198881789c..78c0d92c6c 100644 --- a/buildconfig/stubs/pygame/mixer.pyi +++ b/buildconfig/stubs/pygame/mixer.pyi @@ -62,8 +62,10 @@ class Sound: ) -> Channel: ... # possibly going to be deprecated/removed soon, in which case these # typestubs must be removed too - __array_interface__: dict[str, Any] - __array_struct__: Any + @property + def __array_interface__(self) -> dict[str, Any]: ... + @property + def __array_struct__(self) -> Any: ... def stop(self) -> None: ... def fadeout(self, time: int, /) -> None: ... def set_volume(self, value: float, /) -> None: ... diff --git a/buildconfig/stubs/pygame/mixer_music.pyi b/buildconfig/stubs/pygame/mixer_music.pyi index fcc8e461b7..ec61c92827 100644 --- a/buildconfig/stubs/pygame/mixer_music.pyi +++ b/buildconfig/stubs/pygame/mixer_music.pyi @@ -1,4 +1,4 @@ -from typing import Optional, TypedDict +from typing import TypedDict, overload from pygame.typing import FileLike @@ -8,7 +8,7 @@ class _MusicMetadataDict(TypedDict): artist: str copyright: str -def load(filename: FileLike, namehint: Optional[str] = "") -> None: ... +def load(filename: FileLike, namehint: str = "") -> None: ... def unload() -> None: ... def play(loops: int = 0, start: float = 0.0, fade_ms: int = 0) -> None: ... def rewind() -> None: ... @@ -24,6 +24,7 @@ def get_pos() -> int: ... def queue(filename: FileLike, namehint: str = "", loops: int = 0) -> None: ... def set_endevent(event_type: int, /) -> None: ... def get_endevent() -> int: ... -def get_metadata( - filename: Optional[FileLike] = None, namehint: str = "" -) -> _MusicMetadataDict: ... +@overload +def get_metadata() -> _MusicMetadataDict: ... +@overload +def get_metadata(filename: FileLike, namehint: str = "") -> _MusicMetadataDict: ... diff --git a/buildconfig/stubs/pygame/pixelarray.pyi b/buildconfig/stubs/pygame/pixelarray.pyi index 9c1494fd79..b0067e8935 100644 --- a/buildconfig/stubs/pygame/pixelarray.pyi +++ b/buildconfig/stubs/pygame/pixelarray.pyi @@ -12,18 +12,25 @@ if sys.version_info >= (3, 10): else: EllipsisType = ellipsis -_ColorLike = int | Color | tuple[int, int, int] | tuple[int, int, int, int] +_PixelColor = Union[int, Color, tuple[int, int, int], tuple[int, int, int, int]] class PixelArray: - surface: Surface - itemsize: int - ndim: int - shape: tuple[int, ...] - strides: tuple[int, ...] + @property + def surface(self) -> Surface: ... + @property + def itemsize(self) -> int: ... + @property + def ndim(self) -> int: ... + @property + def shape(self) -> tuple[int, ...]: ... + @property + def strides(self) -> tuple[int, ...]: ... # possibly going to be deprecated/removed soon, in which case these # typestubs must be removed too - __array_interface__: dict[str, Any] - __array_struct__: Any + @property + def __array_interface__(self) -> dict[str, Any]: ... + @property + def __array_struct__(self) -> Any: ... def __init__(self, surface: Surface) -> None: ... def __enter__(self) -> PixelArray: ... def __exit__(self, *args, **kwargs) -> None: ... @@ -44,14 +51,14 @@ class PixelArray: def make_surface(self) -> Surface: ... def replace( self, - color: _ColorLike, - repcolor: _ColorLike, + color: _PixelColor, + repcolor: _PixelColor, distance: float = 0, weights: SequenceLike[float] = (0.299, 0.587, 0.114), ) -> None: ... def extract( self, - color: _ColorLike, + color: _PixelColor, distance: float = 0, weights: SequenceLike[float] = (0.299, 0.587, 0.114), ) -> PixelArray: ... @@ -62,4 +69,4 @@ class PixelArray: weights: SequenceLike[float] = (0.299, 0.587, 0.114), ) -> PixelArray: ... def transpose(self) -> PixelArray: ... - def close(self) -> PixelArray: ... + def close(self) -> None: ... diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index b8ed260f1c..70921fb11b 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -1,6 +1,7 @@ import sys from collections.abc import Callable, Collection, Iterator from typing import ( + ClassVar, Literal, SupportsIndex, TypeVar, @@ -120,8 +121,9 @@ class _GenericRect(Collection[_N]): def h(self) -> _N: ... @h.setter def h(self, value: float) -> None: ... - __hash__: None # type: ignore - __safe_for_unpickling__: Literal[True] + __hash__: ClassVar[None] # type: ignore[assignment] + @property + def __safe_for_unpickling__(self) -> Literal[True]: ... @overload def __init__( self, left: float, top: float, width: float, height: float diff --git a/buildconfig/stubs/pygame/sndarray.pyi b/buildconfig/stubs/pygame/sndarray.pyi index 0f0342a92a..27778c40e3 100644 --- a/buildconfig/stubs/pygame/sndarray.pyi +++ b/buildconfig/stubs/pygame/sndarray.pyi @@ -8,7 +8,7 @@ def array(sound: Sound) -> numpy.ndarray: ... def samples(sound: Sound) -> numpy.ndarray: ... def make_sound(array: numpy.ndarray) -> Sound: ... @deprecated("Only numpy is supported") -def use_arraytype(arraytype: str) -> Sound: ... +def use_arraytype(arraytype: str) -> None: ... @deprecated("Only numpy is supported") def get_arraytype() -> str: ... @deprecated("Only numpy is supported") diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index b439d479e1..c9273563be 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -41,7 +41,8 @@ _ViewKind = Literal[ ] class Surface: - _pixels_address: int + @property + def _pixels_address(self) -> int: ... @property def width(self) -> int: ... @property diff --git a/buildconfig/stubs/pygame/system.pyi b/buildconfig/stubs/pygame/system.pyi index 514af9a134..83505901bc 100644 --- a/buildconfig/stubs/pygame/system.pyi +++ b/buildconfig/stubs/pygame/system.pyi @@ -18,7 +18,6 @@ class _InstructionSets(TypedDict): LSX: bool LASX: bool -# dict at runtime, TypedDict exists solely for the typechecking benefits class _Locale(TypedDict): language: str country: Optional[str] diff --git a/docs/reST/ref/bufferproxy.rst b/docs/reST/ref/bufferproxy.rst index 6b3e04089c..79f574a97c 100644 --- a/docs/reST/ref/bufferproxy.rst +++ b/docs/reST/ref/bufferproxy.rst @@ -10,7 +10,7 @@ .. class:: BufferProxy | :sl:`pygame object to export a surface buffer through an array protocol` - | :sg:`BufferProxy() -> BufferProxy` + | :sg:`BufferProxy(parent) -> BufferProxy` :class:`BufferProxy` is a pygame support type, designed as the return value of the :meth:`Surface.get_buffer` and :meth:`Surface.get_view` methods. @@ -57,7 +57,7 @@ ``"before"`` : callable : (optional) Callback invoked when the :class:`BufferProxy` instance exports the buffer. The callback is given one argument, the - ``"parent"`` object if given, otherwise ``None``. + ``"parent"`` object if given, otherwise ``None``. The callback is useful for setting a lock on the parent. ``"after"`` : callable : (optional) @@ -76,7 +76,7 @@ | :sl:`Return wrapped exporting object.` | :sg:`parent -> Surface` - | :sg:`parent -> ` + | :sg:`parent -> parent` The :class:`Surface` which returned the :class:`BufferProxy` object or the object passed to a :class:`BufferProxy` call. diff --git a/src_c/doc/bufferproxy_doc.h b/src_c/doc/bufferproxy_doc.h index 5b426fb4f8..1e58b697cc 100644 --- a/src_c/doc/bufferproxy_doc.h +++ b/src_c/doc/bufferproxy_doc.h @@ -1,6 +1,6 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_BUFFERPROXY "BufferProxy() -> BufferProxy\npygame object to export a surface buffer through an array protocol" -#define DOC_BUFFERPROXY_PARENT "parent -> Surface\nparent -> \nReturn wrapped exporting object." +#define DOC_BUFFERPROXY "BufferProxy(parent) -> BufferProxy\npygame object to export a surface buffer through an array protocol" +#define DOC_BUFFERPROXY_PARENT "parent -> Surface\nparent -> parent\nReturn wrapped exporting object." #define DOC_BUFFERPROXY_LENGTH "length -> int\nThe size, in bytes, of the exported buffer." #define DOC_BUFFERPROXY_RAW "raw -> bytes\nA copy of the exported buffer as a single block of bytes." #define DOC_BUFFERPROXY_WRITE "write(buffer, offset=0)\nWrite raw bytes to object buffer." From d466ee8de12ff2223492a468241bcbd553621e8c Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 2 Nov 2024 16:27:59 +0530 Subject: [PATCH 063/441] Port scap.c to SDL3 --- src_c/meson.build | 4 ---- src_c/scrap.c | 3 +-- src_c/scrap_win.c | 10 ++++++++++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src_c/meson.build b/src_c/meson.build index ef7261f682..d68affd0d4 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -375,9 +375,6 @@ _camera = py.extension_module( endif # pygame.scrap - -# TODO: support SDL3 -if sdl_api != 3 pg_scrap_link = [] # TODO: should this link logic be improved/made meson-ey? if plat == 'win' pg_scrap_link += ['-luser32', '-lgdi32'] @@ -392,7 +389,6 @@ scrap = py.extension_module( install: true, subdir: pg, ) -endif # optional modules diff --git a/src_c/scrap.c b/src_c/scrap.c index ef580e7a99..eb1a95f4b5 100644 --- a/src_c/scrap.c +++ b/src_c/scrap.c @@ -27,9 +27,8 @@ #include #else #include -#endif - #include "SDL_syswm.h" +#endif #include "pygame.h" diff --git a/src_c/scrap_win.c b/src_c/scrap_win.c index 21be080ff9..188a1363c5 100644 --- a/src_c/scrap_win.c +++ b/src_c/scrap_win.c @@ -158,6 +158,15 @@ _create_dib_buffer(char *data, size_t *count) int pygame_scrap_init(void) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + int retval = 0; + window_handle = (HWND)SDL_GetPointerProperty( + SDL_GetWindowProperties(pg_GetDefaultWindow()), + SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + if (window_handle) { + retval = 1; + } +#else SDL_SysWMinfo info; int retval = 0; @@ -170,6 +179,7 @@ pygame_scrap_init(void) window_handle = info.info.win.window; retval = 1; } +#endif if (retval) _scrapinitialized = 1; From 0da1eaa8139de3559ecb9635b195eefd05dd7d70 Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 20 Feb 2025 12:30:32 +0530 Subject: [PATCH 064/441] Port camera to SDL3 --- src_c/_camera.c | 112 +++++++++++++++++++++++--------------------- src_c/camera.h | 27 ++++++----- src_c/camera_v4l2.c | 59 +++++++++++------------ src_c/meson.build | 4 -- 4 files changed, 100 insertions(+), 102 deletions(-) diff --git a/src_c/_camera.c b/src_c/_camera.c index d5be7a01d2..9430258800 100644 --- a/src_c/_camera.c +++ b/src_c/_camera.c @@ -127,11 +127,16 @@ surf_colorspace(PyObject *self, PyObject *arg) if (PG_SURF_BitsPerPixel(surf) != PG_SURF_BitsPerPixel(newsurf)) return RAISE(PyExc_ValueError, "Surfaces not the same depth"); + PG_PixelFormat *src_fmt = PG_GetSurfaceFormat(surf); + if (!src_fmt) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + SDL_LockSurface(newsurf); pgSurface_Lock(surfobj); Py_BEGIN_ALLOW_THREADS; - colorspace(surf, newsurf, cspace); + colorspace(surf, src_fmt, newsurf, cspace); Py_END_ALLOW_THREADS; pgSurface_Unlock(surfobj); @@ -473,23 +478,22 @@ camera_get_raw(pgCameraObject *self, PyObject *_null) /* converts from rgb Surface to yuv or hsv */ /* TODO: Allow for conversion from yuv and hsv to all */ void -colorspace(SDL_Surface *src, SDL_Surface *dst, int cspace) +colorspace(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *dst, + int cspace) { switch (cspace) { case YUV_OUT: - rgb_to_yuv(src->pixels, dst->pixels, src->h * src->w, 0, - src->format); + rgb_to_yuv(src->pixels, dst->pixels, src->h * src->w, 0, src_fmt); break; case HSV_OUT: - rgb_to_hsv(src->pixels, dst->pixels, src->h * src->w, 0, - src->format); + rgb_to_hsv(src->pixels, dst->pixels, src->h * src->w, 0, src_fmt); break; } } /* converts pretty directly if its already RGB24 */ void -rgb24_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) +rgb24_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s = (Uint8 *)src; Uint8 *d8; @@ -501,9 +505,9 @@ rgb24_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); switch (PG_FORMAT_BytesPerPixel(format)) { case 1: @@ -551,7 +555,7 @@ rgb24_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) /* slight variation on rgb24_to_rgb, just drops the 4th byte of each pixel, * changes the R, G, B ordering. */ void -bgr32_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) +bgr32_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s = (Uint8 *)src; Uint8 *d8; @@ -563,9 +567,9 @@ bgr32_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); switch (PG_FORMAT_BytesPerPixel(format)) { case 1: @@ -616,7 +620,7 @@ bgr32_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) /* converts packed rgb to packed hsv. formulas modified from wikipedia */ void rgb_to_hsv(const void *src, void *dst, int length, unsigned long source, - SDL_PixelFormat *format) + PG_PixelFormat *format) { Uint8 *s8, *d8; Uint16 *s16, *d16; @@ -633,9 +637,9 @@ rgb_to_hsv(const void *src, void *dst, int length, unsigned long source, rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); /* you could stick the if statement inside the loop, but I'm sacrificing a a few hundred bytes for a little performance */ @@ -779,7 +783,7 @@ rgb_to_hsv(const void *src, void *dst, int length, unsigned long source, this has a full range of 0-255 for Y, not 16-235. Formulas from wikipedia */ void rgb_to_yuv(const void *src, void *dst, int length, unsigned long source, - SDL_PixelFormat *format) + PG_PixelFormat *format) { Uint8 *s8, *d8; Uint16 *s16, *d16; @@ -797,9 +801,9 @@ rgb_to_yuv(const void *src, void *dst, int length, unsigned long source, rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); if (source == V4L2_PIX_FMT_RGB444 || source == V4L2_PIX_FMT_RGB24 || source == V4L2_PIX_FMT_XBGR32) { @@ -916,7 +920,7 @@ rgb_to_yuv(const void *src, void *dst, int length, unsigned long source, /* Converts from rgb444 (R444) to rgb24 (RGB3) */ void -rgb444_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) +rgb444_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s, *d8; Uint16 *d16; @@ -928,9 +932,9 @@ rgb444_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); switch (PG_FORMAT_BytesPerPixel(format)) { case 1: @@ -980,7 +984,7 @@ rgb444_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) /* colorspace conversion routine from libv4l. Licensed LGPL 2.1 (C) 2008 Hans de Goede */ void -yuyv_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) +yuyv_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s, *d8; Uint16 *d16; @@ -992,9 +996,9 @@ yuyv_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); d8 = (Uint8 *)dst; d16 = (Uint16 *)dst; @@ -1059,7 +1063,7 @@ yuyv_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) /* turn yuyv into packed yuv. */ void -yuyv_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) +yuyv_to_yuv(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s, *d8; Uint8 y1, u, y2, v; @@ -1071,9 +1075,9 @@ yuyv_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); s = (Uint8 *)src; switch (PG_FORMAT_BytesPerPixel(format)) { @@ -1133,7 +1137,7 @@ yuyv_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) /* cribbed from above, but modified for uyvy ordering */ void -uyvy_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) +uyvy_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s, *d8; Uint16 *d16; @@ -1145,9 +1149,9 @@ uyvy_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); d8 = (Uint8 *)dst; d16 = (Uint16 *)dst; @@ -1212,7 +1216,7 @@ uyvy_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format) } /* turn uyvy into packed yuv. */ void -uyvy_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) +uyvy_to_yuv(const void *src, void *dst, int length, PG_PixelFormat *format) { Uint8 *s, *d8; Uint8 y1, u, y2, v; @@ -1224,9 +1228,9 @@ uyvy_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); s = (Uint8 *)src; switch (PG_FORMAT_BytesPerPixel(format)) { @@ -1312,7 +1316,7 @@ uyvy_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format) /* TODO: Certainly not the most efficient way of doing this conversion. */ void sbggr8_to_rgb(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format) + PG_PixelFormat *format) { Uint8 *rawpt, *d8; Uint16 *d16; @@ -1324,9 +1328,9 @@ sbggr8_to_rgb(const void *src, void *dst, int width, int height, rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); d8 = (Uint8 *)dst; d16 = (Uint16 *)dst; @@ -1432,7 +1436,7 @@ sbggr8_to_rgb(const void *src, void *dst, int width, int height, */ void yuv420_to_rgb(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format) + PG_PixelFormat *format) { int rshift, gshift, bshift, rloss, gloss, bloss, i, j, u1, v1, rg, y; const Uint8 *y1, *y2, *u, *v; @@ -1443,9 +1447,9 @@ yuv420_to_rgb(const void *src, void *dst, int width, int height, rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); /* see http://en.wikipedia.org/wiki/YUV for an explanation of YUV420 */ y1 = (Uint8 *)src; @@ -1632,7 +1636,7 @@ yuv420_to_rgb(const void *src, void *dst, int width, int height, /* turn yuv420 into packed yuv. */ void yuv420_to_yuv(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format) + PG_PixelFormat *format) { const Uint8 *y1, *y2, *u, *v; Uint8 *d8_1, *d8_2; @@ -1643,9 +1647,9 @@ yuv420_to_yuv(const void *src, void *dst, int width, int height, rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); d8_1 = (Uint8 *)dst; d8_2 = d8_1 + (PG_FORMAT_BytesPerPixel(format) == 3 ? width * 3 : 3); diff --git a/src_c/camera.h b/src_c/camera.h index d24bf8eeb9..cbf0ae71c3 100644 --- a/src_c/camera.h +++ b/src_c/camera.h @@ -166,36 +166,37 @@ typedef struct pgCameraObject { /* internal functions for colorspace conversion */ void -colorspace(SDL_Surface *src, SDL_Surface *dst, int cspace); +colorspace(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *dst, + int cspace); void -rgb24_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format); +rgb24_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format); void -bgr32_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format); +bgr32_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format); void -rgb444_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format); +rgb444_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format); void rgb_to_yuv(const void *src, void *dst, int length, unsigned long source, - SDL_PixelFormat *format); + PG_PixelFormat *format); void rgb_to_hsv(const void *src, void *dst, int length, unsigned long source, - SDL_PixelFormat *format); + PG_PixelFormat *format); void -yuyv_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format); +yuyv_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format); void -yuyv_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format); +yuyv_to_yuv(const void *src, void *dst, int length, PG_PixelFormat *format); void -uyvy_to_rgb(const void *src, void *dst, int length, SDL_PixelFormat *format); +uyvy_to_rgb(const void *src, void *dst, int length, PG_PixelFormat *format); void -uyvy_to_yuv(const void *src, void *dst, int length, SDL_PixelFormat *format); +uyvy_to_yuv(const void *src, void *dst, int length, PG_PixelFormat *format); void sbggr8_to_rgb(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format); + PG_PixelFormat *format); void yuv420_to_rgb(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format); + PG_PixelFormat *format); void yuv420_to_yuv(const void *src, void *dst, int width, int height, - SDL_PixelFormat *format); + PG_PixelFormat *format); #if defined(__unix__) /* internal functions specific to v4l2 */ diff --git a/src_c/camera_v4l2.c b/src_c/camera_v4l2.c index 95af00c1b7..6861ac3466 100644 --- a/src_c/camera_v4l2.c +++ b/src_c/camera_v4l2.c @@ -206,6 +206,11 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, if (!surf) return 0; + PG_PixelFormat *fmt = PG_GetSurfaceFormat(surf); + if (!fmt) { + return 1; + } + SDL_LockSurface(surf); switch (self->pixelformat) { @@ -213,16 +218,15 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, if (buffer_size >= self->size * 3) { switch (self->color_out) { case RGB_OUT: - rgb24_to_rgb(image, surf->pixels, self->size, - surf->format); + rgb24_to_rgb(image, surf->pixels, self->size, fmt); break; case HSV_OUT: rgb_to_hsv(image, surf->pixels, self->size, - V4L2_PIX_FMT_RGB24, surf->format); + V4L2_PIX_FMT_RGB24, fmt); break; case YUV_OUT: rgb_to_yuv(image, surf->pixels, self->size, - V4L2_PIX_FMT_RGB24, surf->format); + V4L2_PIX_FMT_RGB24, fmt); break; } } @@ -235,16 +239,15 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, if (buffer_size >= self->size * 2) { switch (self->color_out) { case RGB_OUT: - rgb444_to_rgb(image, surf->pixels, self->size, - surf->format); + rgb444_to_rgb(image, surf->pixels, self->size, fmt); break; case HSV_OUT: rgb_to_hsv(image, surf->pixels, self->size, - V4L2_PIX_FMT_RGB444, surf->format); + V4L2_PIX_FMT_RGB444, fmt); break; case YUV_OUT: rgb_to_yuv(image, surf->pixels, self->size, - V4L2_PIX_FMT_RGB444, surf->format); + V4L2_PIX_FMT_RGB444, fmt); break; } } @@ -257,18 +260,15 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, if (buffer_size >= self->size * 2) { switch (self->color_out) { case YUV_OUT: - yuyv_to_yuv(image, surf->pixels, self->size, - surf->format); + yuyv_to_yuv(image, surf->pixels, self->size, fmt); break; case RGB_OUT: - yuyv_to_rgb(image, surf->pixels, self->size, - surf->format); + yuyv_to_rgb(image, surf->pixels, self->size, fmt); break; case HSV_OUT: - yuyv_to_rgb(image, surf->pixels, self->size, - surf->format); + yuyv_to_rgb(image, surf->pixels, self->size, fmt); rgb_to_hsv(surf->pixels, surf->pixels, self->size, - V4L2_PIX_FMT_YUYV, surf->format); + V4L2_PIX_FMT_YUYV, fmt); break; } } @@ -281,18 +281,15 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, if (buffer_size >= self->size * 2) { switch (self->color_out) { case YUV_OUT: - uyvy_to_yuv(image, surf->pixels, self->size, - surf->format); + uyvy_to_yuv(image, surf->pixels, self->size, fmt); break; case RGB_OUT: - uyvy_to_rgb(image, surf->pixels, self->size, - surf->format); + uyvy_to_rgb(image, surf->pixels, self->size, fmt); break; case HSV_OUT: - uyvy_to_rgb(image, surf->pixels, self->size, - surf->format); + uyvy_to_rgb(image, surf->pixels, self->size, fmt); rgb_to_hsv(surf->pixels, surf->pixels, self->size, - V4L2_PIX_FMT_YUYV, surf->format); + V4L2_PIX_FMT_YUYV, fmt); break; } } @@ -306,19 +303,19 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, switch (self->color_out) { case RGB_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); break; case HSV_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); rgb_to_hsv(surf->pixels, surf->pixels, self->size, - V4L2_PIX_FMT_SBGGR8, surf->format); + V4L2_PIX_FMT_SBGGR8, fmt); break; case YUV_OUT: sbggr8_to_rgb(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); rgb_to_yuv(surf->pixels, surf->pixels, self->size, - V4L2_PIX_FMT_SBGGR8, surf->format); + V4L2_PIX_FMT_SBGGR8, fmt); break; } } @@ -332,17 +329,17 @@ v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, switch (self->color_out) { case YUV_OUT: yuv420_to_yuv(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); break; case RGB_OUT: yuv420_to_rgb(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); break; case HSV_OUT: yuv420_to_rgb(image, surf->pixels, self->width, - self->height, surf->format); + self->height, fmt); rgb_to_hsv(surf->pixels, surf->pixels, self->size, - V4L2_PIX_FMT_YUV420, surf->format); + V4L2_PIX_FMT_YUV420, fmt); break; } } diff --git a/src_c/meson.build b/src_c/meson.build index ef7261f682..d76bc2ba5c 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -339,9 +339,6 @@ subdir('_sdl2') endif # pygame._camera - -# TODO: support SDL3 -if sdl_api != 3 pg_camera_sources = ['_camera.c'] pg_camera_link = [] if plat == 'win' @@ -372,7 +369,6 @@ _camera = py.extension_module( install: true, subdir: pg, ) -endif # pygame.scrap From 42c10c885ec9d746a76c986e91855664ad6d0e6b Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 22 Feb 2025 00:12:45 -0800 Subject: [PATCH 065/441] GET_PIXELVALS SDL3 compat --- src_c/alphablit.c | 388 +++++++++++++++++++++++-------------- src_c/pixelarray_methods.c | 67 +++---- src_c/simd_blitters.h | 6 +- src_c/surface.c | 12 +- src_c/surface.h | 20 +- src_c/surface_fill.c | 95 +++++---- 6 files changed, 347 insertions(+), 241 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 82c1d8f8f7..f428dd1bac 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -601,7 +601,9 @@ blit_blend_rgba_add(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -646,8 +648,8 @@ blit_blend_rgba_add(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -663,9 +665,10 @@ blit_blend_rgba_add(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -684,8 +687,9 @@ blit_blend_rgba_add(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -702,9 +706,11 @@ blit_blend_rgba_add(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -731,7 +737,9 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -776,8 +784,8 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -793,9 +801,10 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -814,8 +823,9 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -832,9 +842,11 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -861,7 +873,9 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -908,8 +922,8 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -925,9 +939,10 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -946,8 +961,9 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -964,9 +980,11 @@ blit_blend_rgba_mul(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -993,7 +1011,9 @@ blit_blend_rgba_min(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1037,8 +1057,8 @@ blit_blend_rgba_min(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1054,9 +1074,10 @@ blit_blend_rgba_min(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1075,8 +1096,9 @@ blit_blend_rgba_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1093,9 +1115,11 @@ blit_blend_rgba_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1122,7 +1146,9 @@ blit_blend_rgba_max(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1166,8 +1192,8 @@ blit_blend_rgba_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1183,9 +1209,10 @@ blit_blend_rgba_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1204,8 +1231,9 @@ blit_blend_rgba_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1222,9 +1250,11 @@ blit_blend_rgba_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1251,7 +1281,9 @@ blit_blend_premultiplied(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1296,11 +1328,11 @@ blit_blend_premultiplied(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1315,9 +1347,10 @@ blit_blend_premultiplied(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; @@ -1336,9 +1369,10 @@ blit_blend_premultiplied(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); @@ -1358,11 +1392,12 @@ blit_blend_premultiplied(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1378,9 +1413,11 @@ blit_blend_premultiplied(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); if (sA == 0) { dst[offsetR] = dR; dst[offsetG] = dG; @@ -1412,9 +1449,11 @@ blit_blend_premultiplied(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); // We can save some blending time by just copying // pixels with alphas of 255 or 0 if (sA == 0) { @@ -1454,7 +1493,9 @@ blit_blend_add(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1502,10 +1543,10 @@ blit_blend_add(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1520,9 +1561,10 @@ blit_blend_add(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1540,9 +1582,10 @@ blit_blend_add(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1561,10 +1604,11 @@ blit_blend_add(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1580,9 +1624,11 @@ blit_blend_add(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1601,9 +1647,11 @@ blit_blend_add(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1630,7 +1678,9 @@ blit_blend_sub(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -1678,10 +1728,10 @@ blit_blend_sub(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1696,9 +1746,10 @@ blit_blend_sub(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstfmt); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1716,9 +1767,10 @@ blit_blend_sub(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1737,10 +1789,11 @@ blit_blend_sub(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1756,9 +1809,11 @@ blit_blend_sub(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1777,9 +1832,11 @@ blit_blend_sub(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1806,6 +1863,7 @@ blit_blend_mul(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); @@ -1864,10 +1922,10 @@ blit_blend_mul(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -1882,9 +1940,10 @@ blit_blend_mul(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1902,9 +1961,10 @@ blit_blend_mul(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1923,10 +1983,11 @@ blit_blend_mul(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); src += srcpxskip; dst += dstpxskip; @@ -1943,9 +2004,11 @@ blit_blend_mul(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -1964,9 +2027,11 @@ blit_blend_mul(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -1993,6 +2058,7 @@ blit_blend_min(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); @@ -2044,10 +2110,10 @@ blit_blend_min(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -2062,9 +2128,10 @@ blit_blend_min(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -2082,9 +2149,10 @@ blit_blend_min(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -2103,8 +2171,9 @@ blit_blend_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); src += srcpxskip; @@ -2122,9 +2191,11 @@ blit_blend_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -2143,9 +2214,11 @@ blit_blend_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -2172,7 +2245,9 @@ blit_blend_max(SDL_BlitInfo *info) int dstpxskip = info->d_pxskip; int dstskip = info->d_skip; PG_PixelFormat *srcfmt = info->src; + SDL_Palette *srcpal = info->src_palette; PG_PixelFormat *dstfmt = info->dst; + SDL_Palette *dstpal = info->dst_palette; int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; @@ -2222,10 +2297,10 @@ blit_blend_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -2240,9 +2315,10 @@ blit_blend_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -2260,9 +2336,10 @@ blit_blend_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcfmt); + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -2281,10 +2358,11 @@ blit_blend_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstfmt); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dR, dG, dB, dA); + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; }, @@ -2300,9 +2378,11 @@ blit_blend_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; @@ -2321,9 +2401,11 @@ blit_blend_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, + srcppa); GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstppa); + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, + dstppa); BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; @@ -2371,8 +2453,8 @@ alphablit_alpha(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcpal); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); ALPHA_BLEND(sRi, sGi, sBi, sAi, dRi, dGi, dBi, dAi); CREATE_PIXEL(dst, dRi, dGi, dBi, dAi, dstbpp, dstfmt); src += srcpxskip; @@ -2388,7 +2470,7 @@ alphablit_alpha(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; @@ -2413,7 +2495,7 @@ alphablit_alpha(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); ALPHA_BLEND(sR, sG, sB, sA, dRi, dGi, dBi, dAi); CREATE_PIXEL(dst, dRi, dGi, dBi, dAi, dstbpp, dstfmt); @@ -2488,9 +2570,9 @@ alphablit_colorkey(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcpal); sAi = (*src == colorkey) ? 0 : alpha; - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); ALPHA_BLEND(sRi, sGi, sBi, sAi, dRi, dGi, dBi, dAi); *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, dAi); @@ -2507,7 +2589,7 @@ alphablit_colorkey(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, sAi, src, srcpal); sAi = (*src == colorkey) ? 0 : alpha; GET_PIXEL(pixel, dstbpp, dst); PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); @@ -2535,7 +2617,7 @@ alphablit_colorkey(SDL_BlitInfo *info) GET_PIXEL(pixel, srcbpp, src); PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); sA = (pixel == colorkey) ? 0 : alpha; - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); ALPHA_BLEND(sR, sG, sB, sA, dRi, dGi, dBi, dAi); *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, dAi); @@ -2636,8 +2718,8 @@ alphablit_solid(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcfmt); - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcpal); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); ALPHA_BLEND(sRi, sGi, sBi, alpha, dRi, dGi, dBi, dAi); *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, dAi); @@ -2654,7 +2736,7 @@ alphablit_solid(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcfmt); + GET_PIXELVALS_1(sRi, sGi, sBi, dAi, src, srcpal); GET_PIXEL(pixel, dstbpp, dst); PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); dRi = dR; @@ -2679,7 +2761,7 @@ alphablit_solid(SDL_BlitInfo *info) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstfmt); + GET_PIXELVALS_1(dRi, dGi, dBi, dAi, dst, dstpal); PG_GetRGBA(pixel, srcfmt, srcpal, &sR, &sG, &sB, &sA); ALPHA_BLEND(sR, sG, sB, alpha, dRi, dGi, dBi, dAi); *dst = (Uint8)PG_MapRGBA(dstfmt, dstpal, dRi, dGi, dBi, @@ -2858,12 +2940,22 @@ pygame_AlphaBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, return pygame_Blit(src, srcrect, dst, dstrect, blend_flags); } +// Returns -1 if has no alpha channel, -2 on SDL error int premul_surf_color_by_alpha(SDL_Surface *src, SDL_Surface *dst) { SDL_BlendMode src_blend; SDL_GetSurfaceBlendMode(src, &src_blend); - if (src_blend == SDL_BLENDMODE_NONE && !(src->format->Amask != 0)) + + PG_PixelFormat *src_format, *dst_format; + SDL_Palette *src_palette, *dst_palette; + + if (!PG_GetSurfaceDetails(src, &src_format, &src_palette) || + !PG_GetSurfaceDetails(dst, &dst_format, &dst_palette)) { + return -2; // signal SDL error to caller + } + + if (src_blend == SDL_BLENDMODE_NONE && !(src_format->Amask != 0)) return -1; // since we know dst is a copy of src we can simplify the normal checks #if !defined(__EMSCRIPTEN__) @@ -2886,24 +2978,27 @@ premul_surf_color_by_alpha(SDL_Surface *src, SDL_Surface *dst) #endif /* PG_ENABLE_ARM_NEON */ #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - premul_surf_color_by_alpha_non_simd(src, dst); + premul_surf_color_by_alpha_non_simd(src, src_format, src_palette, dst, + dst_format, dst_palette); return 0; } void -premul_surf_color_by_alpha_non_simd(SDL_Surface *src, SDL_Surface *dst) +premul_surf_color_by_alpha_non_simd(SDL_Surface *src, + PG_PixelFormat *src_format, + SDL_Palette *src_palette, SDL_Surface *dst, + PG_PixelFormat *dst_format, + SDL_Palette *dst_palette) { - SDL_PixelFormat *srcfmt = src->format; - SDL_PixelFormat *dstfmt = dst->format; int width = src->w; int height = src->h; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); + int srcbpp = PG_FORMAT_BytesPerPixel(src_format); + int dstbpp = PG_FORMAT_BytesPerPixel(dst_format); Uint8 *src_pixels = (Uint8 *)src->pixels; Uint8 *dst_pixels = (Uint8 *)dst->pixels; - int srcpxskip = PG_SURF_BytesPerPixel(src); - int dstpxskip = PG_SURF_BytesPerPixel(dst); + int srcpxskip = srcbpp; + int dstpxskip = dstbpp; int srcppa = SDL_TRUE; @@ -2915,12 +3010,13 @@ premul_surf_color_by_alpha_non_simd(SDL_Surface *src, SDL_Surface *dst) LOOP_UNROLLED4( { GET_PIXEL(pixel, srcbpp, src_pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, src_format, src_palette, + srcppa); dR = (Uint8)(((sR + 1) * sA) >> 8); dG = (Uint8)(((sG + 1) * sA) >> 8); dB = (Uint8)(((sB + 1) * sA) >> 8); dA = sA; - CREATE_PIXEL(dst_pixels, dR, dG, dB, dA, dstbpp, dstfmt); + CREATE_PIXEL(dst_pixels, dR, dG, dB, dA, dstbpp, dst_format); src_pixels += srcpxskip; dst_pixels += dstpxskip; }, diff --git a/src_c/pixelarray_methods.c b/src_c/pixelarray_methods.c index cc543b3e79..4651e910cb 100644 --- a/src_c/pixelarray_methods.c +++ b/src_c/pixelarray_methods.c @@ -28,21 +28,6 @@ wb * (b1 - b2) * (b1 - b2)) / \ 255.0) -// TODO: once things are fully ported, consolidate PXM_GET_PIXELVALS -// and PXM_GET_PIXELVALS_1 back into GET_PIXELVALS and GET_PIXELVALS_1 -// from surface.h -#define PXM_GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, palette, ppa) \ - PG_GetRGBA(px, fmt, palette, &(_sR), &(_sG), &(_sB), &(_sA)); \ - if (!ppa) { \ - _sA = 255; \ - } - -#define PXM_GET_PIXELVALS_1(sr, sg, sb, sa, _src, _palette) \ - sr = _palette->colors[*((Uint8 *)(_src))].r; \ - sg = _palette->colors[*((Uint8 *)(_src))].g; \ - sb = _palette->colors[*((Uint8 *)(_src))].b; \ - sa = 255; - #define WR_NTSC 0.299 #define WG_NTSC 0.587 #define WB_NTSC 0.114 @@ -422,7 +407,7 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); + GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint8)rcolor; @@ -446,8 +431,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint16 *)pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, - format, palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint16)rcolor; @@ -482,8 +467,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) ((Uint32)pixel_p[Goffset] << 8) + ((Uint32)pixel_p[Boffset])); if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, - palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, palette, + ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { pixel_p[Roffset] = (Uint8)(rcolor >> 16); @@ -512,8 +497,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint32 *)pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, - palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, palette, + ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = rcolor; @@ -632,7 +617,7 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); + GET_PIXELVALS_1(r2, g2, b2, a2, px_p, palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint8)white; @@ -659,8 +644,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint16 *)pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, - format, palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*px_p, format, + palette, ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = (Uint16)white; @@ -704,8 +689,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) ((Uint32)pixel_p[Goffset] << 8) + ((Uint32)pixel_p[Boffset])); if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, - palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, pxcolor, format, palette, + ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { pixel_p[Roffset] = white_r; @@ -744,8 +729,8 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) for (x = 0; x < dim0; ++x) { px_p = (Uint32 *)pixel_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, - palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, *px_p, format, palette, + ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *px_p = white; @@ -888,9 +873,9 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = byte_p; other_pixel_p = other_byte_p; if (distance != 0.0) { - PXM_GET_PIXELVALS_1(r1, g1, b1, a1, pixel_p, palette); - PXM_GET_PIXELVALS_1(r2, g2, b2, a2, other_pixel_p, - other_palette); + GET_PIXELVALS_1(r1, g1, b1, a1, pixel_p, palette); + GET_PIXELVALS_1(r2, g2, b2, a2, other_pixel_p, + other_palette); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = (Uint8)white; @@ -925,11 +910,10 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = (Uint16 *)byte_p; other_pixel_p = (Uint16 *)other_byte_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r1, g1, b1, a1, (Uint32)*pixel_p, - format, palette, ppa); - PXM_GET_PIXELVALS(r2, g2, b2, a2, - (Uint32)*other_pixel_p, other_format, - other_palette, other_ppa); + GET_PIXELVALS(r1, g1, b1, a1, (Uint32)*pixel_p, format, + palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, (Uint32)*other_pixel_p, + other_format, other_palette, other_ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = (Uint16)white; @@ -1029,11 +1013,10 @@ _compare(pgPixelArrayObject *array, PyObject *args, PyObject *kwds) pixel_p = (Uint32 *)byte_p; other_pixel_p = (Uint32 *)other_byte_p; if (distance != 0.0) { - PXM_GET_PIXELVALS(r1, g1, b1, a1, *pixel_p, format, - palette, ppa); - PXM_GET_PIXELVALS(r2, g2, b2, a2, *other_pixel_p, - other_format, other_palette, - other_ppa); + GET_PIXELVALS(r1, g1, b1, a1, *pixel_p, format, + palette, ppa); + GET_PIXELVALS(r2, g2, b2, a2, *other_pixel_p, + other_format, other_palette, other_ppa); if (COLOR_DIFF_RGB(wr, wg, wb, r1, g1, b1, r2, g2, b2) <= distance) { *pixel_p = white; diff --git a/src_c/simd_blitters.h b/src_c/simd_blitters.h index 906f60fdae..0c02207c26 100644 --- a/src_c/simd_blitters.h +++ b/src_c/simd_blitters.h @@ -49,7 +49,11 @@ blit_blend_premultiplied_sse2(SDL_BlitInfo *info); generic like surface_ops*/ void -premul_surf_color_by_alpha_non_simd(SDL_Surface *src, SDL_Surface *dst); +premul_surf_color_by_alpha_non_simd(SDL_Surface *src, + PG_PixelFormat *src_format, + SDL_Palette *src_palette, SDL_Surface *dst, + PG_PixelFormat *dst_format, + SDL_Palette *dst_palette); void premul_surf_color_by_alpha_sse2(SDL_Surface *src, SDL_Surface *dst); diff --git a/src_c/surface.c b/src_c/surface.c index 64313d0028..3e958676a8 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -3336,11 +3336,15 @@ surf_premul_alpha(pgSurfaceObject *self, PyObject *_null) if ((surf->w > 0 && surf->h > 0)) { // If the surface has no pixels we don't need to premul // just return the copy. - if (premul_surf_color_by_alpha(surf, newsurf) != 0) { + int result = premul_surf_color_by_alpha(surf, newsurf); + if (result == -1) { return RAISE(PyExc_ValueError, "source surface to be alpha pre-multiplied must have " "alpha channel"); } + else if (result == -2) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } } pgSurface_Unprep(self); @@ -3363,11 +3367,15 @@ surf_premul_alpha_ip(pgSurfaceObject *self, PyObject *_null) pgSurface_Prep(self); - if (premul_surf_color_by_alpha(surf, surf) != 0) { + int result = premul_surf_color_by_alpha(surf, surf); + if (result == -1) { return RAISE(PyExc_ValueError, "source surface to be alpha pre-multiplied must have " "alpha channel"); } + else if (result == -2) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } pgSurface_Unprep(self); diff --git a/src_c/surface.h b/src_c/surface.h index 2bd07bcbc8..d3cf9e322b 100644 --- a/src_c/surface.h +++ b/src_c/surface.h @@ -78,21 +78,21 @@ } break; \ } -#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ - SDL_GetRGBA(px, fmt, &(_sR), &(_sG), &(_sB), &(_sA)); \ - if (!ppa) { \ - _sA = 255; \ +#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, palette, ppa) \ + PG_GetRGBA(px, fmt, palette, &(_sR), &(_sG), &(_sB), &(_sA)); \ + if (!ppa) { \ + _sA = 255; \ } -#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ - sr = _fmt->palette->colors[*((Uint8 *)(_src))].r; \ - sg = _fmt->palette->colors[*((Uint8 *)(_src))].g; \ - sb = _fmt->palette->colors[*((Uint8 *)(_src))].b; \ +#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _palette) \ + sr = _palette->colors[*((Uint8 *)(_src))].r; \ + sg = _palette->colors[*((Uint8 *)(_src))].g; \ + sb = _palette->colors[*((Uint8 *)(_src))].b; \ sa = 255; /* For 1 byte palette pixels */ -#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \ - *(px) = (Uint8)SDL_MapRGBA(fmt, _dR, _dG, _dB, _dA) +#define SET_PIXELVAL(px, fmt, palette, _dR, _dG, _dB, _dA) \ + *(px) = (Uint8)PG_MapRGBA(fmt, palette, _dR, _dG, _dB, _dA) #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define SET_OFFSETS_24(or, og, ob, fmt) \ diff --git a/src_c/surface_fill.c b/src_c/surface_fill.c index bc63cfdcf5..6fa3f984dd 100644 --- a/src_c/surface_fill.c +++ b/src_c/surface_fill.c @@ -110,7 +110,7 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -124,12 +124,13 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24(offsetR, offsetG, offsetB, fmt); - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; @@ -143,7 +144,7 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -152,7 +153,8 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -200,7 +202,7 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -214,12 +216,13 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24(offsetR, offsetG, offsetB, fmt); - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; @@ -233,7 +236,7 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -242,7 +245,8 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -289,7 +293,7 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_MULT(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -303,12 +307,13 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24(offsetR, offsetG, offsetB, fmt); - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MULT(cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; @@ -322,7 +327,7 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -331,7 +336,8 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MULT(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -378,7 +384,7 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_MIN(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -392,12 +398,13 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24(offsetR, offsetG, offsetB, fmt); - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MIN(cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; @@ -411,7 +418,7 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -420,7 +427,8 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MIN(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -467,7 +475,7 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_MAX(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -481,12 +489,13 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) case 3: { size_t offsetR, offsetG, offsetB; SET_OFFSETS_24(offsetR, offsetG, offsetB, fmt); - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); while (height--) { LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MAX(cR, cG, cB, cA, sR, sG, sB, sA); pixels[offsetR] = sR; pixels[offsetG] = sG; @@ -500,7 +509,7 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -509,7 +518,8 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_MAX(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -563,7 +573,7 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_RGBA_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -575,7 +585,7 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -584,7 +594,8 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_RGBA_ADD(tmp, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -636,7 +647,7 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_RGBA_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -648,7 +659,7 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -657,7 +668,8 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_RGBA_SUB(tmp2, cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -709,7 +721,7 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_RGBA_MULT(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -721,7 +733,7 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -730,7 +742,8 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_RGBA_MULT(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -781,7 +794,7 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_RGBA_MIN(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -793,7 +806,7 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -802,7 +815,8 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_RGBA_MIN(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; @@ -853,7 +867,7 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) while (height--) { LOOP_UNROLLED4( { - GET_PIXELVALS_1(sR, sG, sB, sA, pixels, fmt); + GET_PIXELVALS_1(sR, sG, sB, sA, pixels, palette); BLEND_RGBA_MAX(cR, cG, cB, cA, sR, sG, sB, sA); *pixels = PG_MapRGBA(fmt, palette, sR, sG, sB, sA); pixels += bpp; @@ -865,7 +879,7 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) break; } default: { - GET_PIXELVALS(cR, cG, cB, cA, color, fmt, ppa); + GET_PIXELVALS(cR, cG, cB, cA, color, fmt, palette, ppa); /* printf ("Color: %d, %d, %d, %d, BPP is: %d\n", cR, cG, cB, cA, bpp); @@ -874,7 +888,8 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) LOOP_UNROLLED4( { GET_PIXEL(pixel, bpp, pixels); - GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, ppa); + GET_PIXELVALS(sR, sG, sB, sA, pixel, fmt, palette, + ppa); BLEND_RGBA_MAX(cR, cG, cB, cA, sR, sG, sB, sA); CREATE_PIXEL(pixels, sR, sG, sB, sA, bpp, fmt); pixels += bpp; From 5729e4f7d5758b25e0443b740003f000ab87addb Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 22 Feb 2025 02:03:23 -0800 Subject: [PATCH 066/441] A few surface.c SDL3 fixes --- src_c/surface.c | 66 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 64313d0028..3ce0c5fa34 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1054,7 +1054,7 @@ surf_get_palette(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - pal = surf->format->palette; + pal = PG_GetSurfacePalette(surf); if (!pal) return RAISE(pgExc_SDLError, "Surface has no palette to get\n"); @@ -1093,7 +1093,7 @@ surf_get_palette_at(PyObject *self, PyObject *args) return NULL; SURF_INIT_CHECK(surf) - pal = surf->format->palette; + pal = PG_GetSurfacePalette(surf); if (!pal) return RAISE(pgExc_SDLError, "Surface has no palette to set\n"); @@ -1132,7 +1132,7 @@ surf_set_palette(PyObject *self, PyObject *seq) if (!PySequence_Check(seq)) return RAISE(PyExc_ValueError, "Argument must be a sequence type"); - pal = surf->format->palette; + pal = PG_GetSurfacePalette(surf); if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) return RAISE(pgExc_SDLError, "Surface colors are not indexed\n"); @@ -1192,7 +1192,7 @@ surf_set_palette_at(PyObject *self, PyObject *args) if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) return RAISE(pgExc_SDLError, "Surface colors are not indexed\n"); - pal = surf->format->palette; + pal = PG_GetSurfacePalette(surf); if (!pal) { return RAISE(pgExc_SDLError, "Surface is not palettized\n"); @@ -2485,7 +2485,7 @@ surf_scroll(PyObject *self, PyObject *args, PyObject *keywds) int dx = 0, dy = 0, scroll_flag = PGS_SCROLL_DEFAULT; int erase = 0, repeat = 0; SDL_Surface *surf; - SDL_Rect *clip_rect, work_rect; + SDL_Rect work_rect; int w = 0, h = 0, x = 0, y = 0; static char *kwids[] = {"dx", "dy", "scroll_flag", NULL}; @@ -2517,11 +2517,15 @@ surf_scroll(PyObject *self, PyObject *args, PyObject *keywds) } } - clip_rect = &surf->clip_rect; + SDL_Rect clip_rect; + if (!PG_GetSurfaceClipRect(surf, &clip_rect)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + SDL_Rect surf_rect = {0, 0, surf->w, surf->h}; // In SDL3, SDL_IntersectRect is renamed to SDL_GetRectIntersection - if (!SDL_IntersectRect(clip_rect, &surf_rect, &work_rect)) { + if (!SDL_IntersectRect(&clip_rect, &surf_rect, &work_rect)) { Py_RETURN_NONE; } @@ -2578,7 +2582,11 @@ static PyObject * surf_get_flags(PyObject *self, PyObject *_null) { Uint32 sdl_flags = 0; +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_WindowFlags window_flags = 0; +#else Uint32 window_flags = 0; +#endif Uint32 flags = 0; int is_alpha; int is_window_surf = 0; @@ -3567,6 +3575,12 @@ _get_buffer_3D(PyObject *obj, Py_buffer *view_p, int flags) "A 3D surface view is not contiguous"); return -1; } + PG_PixelFormat *surface_format = PG_GetSurfaceFormat(surface); + if (surface_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + if (_init_buffer(obj, view_p, flags)) { return -1; } @@ -3582,7 +3596,7 @@ _get_buffer_3D(PyObject *obj, Py_buffer *view_p, int flags) view_p->shape[2] = 3; view_p->strides[0] = pixelsize; view_p->strides[1] = surface->pitch; - switch (surface->format->Rmask) { + switch (surface_format->Rmask) { #if SDL_BYTEORDER == SDL_LIL_ENDIAN case 0xffU: view_p->strides[2] = 1; @@ -3628,29 +3642,57 @@ _get_buffer_3D(PyObject *obj, Py_buffer *view_p, int flags) static int _get_buffer_red(PyObject *obj, Py_buffer *view_p, int flags) { + PG_PixelFormat *surface_format = + PG_GetSurfaceFormat(pgSurface_AsSurface(obj)); + if (surface_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + return _get_buffer_colorplane(obj, view_p, flags, "red", - pgSurface_AsSurface(obj)->format->Rmask); + surface_format->Rmask); } static int _get_buffer_green(PyObject *obj, Py_buffer *view_p, int flags) { + PG_PixelFormat *surface_format = + PG_GetSurfaceFormat(pgSurface_AsSurface(obj)); + if (surface_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + return _get_buffer_colorplane(obj, view_p, flags, "green", - pgSurface_AsSurface(obj)->format->Gmask); + surface_format->Gmask); } static int _get_buffer_blue(PyObject *obj, Py_buffer *view_p, int flags) { + PG_PixelFormat *surface_format = + PG_GetSurfaceFormat(pgSurface_AsSurface(obj)); + if (surface_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + return _get_buffer_colorplane(obj, view_p, flags, "blue", - pgSurface_AsSurface(obj)->format->Bmask); + surface_format->Bmask); } static int _get_buffer_alpha(PyObject *obj, Py_buffer *view_p, int flags) { + PG_PixelFormat *surface_format = + PG_GetSurfaceFormat(pgSurface_AsSurface(obj)); + if (surface_format == NULL) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + return _get_buffer_colorplane(obj, view_p, flags, "alpha", - pgSurface_AsSurface(obj)->format->Amask); + surface_format->Amask); } static int From 2219caa13e5c1851df7b61a65e578f54bf0cf565 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 23 Feb 2025 21:19:02 -0600 Subject: [PATCH 067/441] Added tolerance for Color.lerp --- src_c/color.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src_c/color.c b/src_c/color.c index d2c9a1f887..11628aaa45 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -808,7 +808,19 @@ _color_lerp(pgColorObject *self, PyObject *args, PyObject *kw) return NULL; } - if (amt < 0 || amt > 1) { + // TOLERANCE to account for double precison floating point inaccuracy at + // the very limits, like if you're LERP'ing by 0.01. When you hit the end, + // something stupid like this might happen + /* >>> value = 0 + >>> offset = 0.01 + >>> while value < 1: + ... value += offset + ... + >>> print(value) + 1.0000000000000007 + */ + static const double TOLERANCE = 1e-6; + if ((amt < -TOLERANCE) || (amt > (1.0 + TOLERANCE))) { return RAISE(PyExc_ValueError, "Argument 2 must be in range [0, 1]"); } From 617b260682f40f821355581633e3ac6419278c88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 06:09:54 +0000 Subject: [PATCH 068/441] Bump docker/build-push-action from 6.13.0 to 6.14.0 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.13.0 to 6.14.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/ca877d9245402d1537745e0e356eab47c3520991...0adf9959216b96bec444f325f1e493d4aa344497) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index b7c2c63dc0..c077db7750 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -75,7 +75,7 @@ jobs: - name: Build and push Docker image if: steps.inspect.outcome == 'failure' - uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 + uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 with: context: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base file: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base/Dockerfile-${{ matrix.arch }} From 8c4b0d742058e071091d1891a903cef274c6bcdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 06:09:57 +0000 Subject: [PATCH 069/441] Bump actions/cache from 4.2.0 to 4.2.1 Bumps [actions/cache](https://github.com/actions/cache) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4.2.0...v4.2.1) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 9f17169913..81161fbc1c 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -51,7 +51,7 @@ jobs: - name: Test for Mac Deps cache hit id: macdep-cache - uses: actions/cache@v4.2.0 + uses: actions/cache@v4.2.1 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} # The hash of all files in buildconfig manylinux-build and macdependencies is @@ -118,14 +118,14 @@ jobs: - uses: actions/checkout@v4.2.2 - name: pip cache - uses: actions/cache@v4.2.0 + uses: actions/cache@v4.2.1 with: path: ~/Library/Caches/pip # This cache path is only right on mac key: pip-cache-${{ matrix.macarch }}-${{ matrix.os }} - name: Fetch Mac deps id: macdep-cache - uses: actions/cache@v4.2.0 + uses: actions/cache@v4.2.1 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} key: macdep-${{ hashFiles('buildconfig/manylinux-build/**') }}-${{ hashFiles('buildconfig/macdependencies/*.sh') }}-${{ matrix.macarch }} From 638675bd86ac9319e7d39121cae8d2ccff2901e2 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 10:45:30 -0600 Subject: [PATCH 070/441] New workflow with debug python, as a baseline --- .../workflows/build-ubuntu-debug-python.yml | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 .github/workflows/build-ubuntu-debug-python.yml diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml new file mode 100644 index 0000000000..0525144e25 --- /dev/null +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -0,0 +1,119 @@ +# this workflow runs a build with a python version that has debug symbols +# Note that for intrinsics, it only runs what gets compiled +# and would naturally run. It also is limited to what can run in +# a CI environment +# IMPORTANT: binaries are not to be uploaded from this workflow! + +name: Ubuntu debug python + +# Run CI only when a release is created, on changes to main branch, or any PR +# to main. Do not run CI on any other branch. Also, skip any non-source changes +# from running on CI +on: + push: + branches: main + paths-ignore: + - 'docs/**' + - 'examples/**' + - '.gitignore' + - '*.rst' + - '*.md' + - '.github/workflows/*.yml' + # gcov/lcov only gets C coverage + - 'src_py/**' + # re-include current file to not be excluded + - '!.github/workflows/build-ubuntu-coverage.yml' + + pull_request: + branches: main + paths-ignore: + - 'docs/**' + - 'examples/**' + - '.gitignore' + - '*.rst' + - '*.md' + - '.github/workflows/*.yml' + # re-include current file to not be excluded + - '!.github/workflows/build-ubuntu-debug-python.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-ubuntu-debug-python + cancel-in-progress: true + +jobs: + debug_python: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false # if a particular matrix build fails, don't skip the rest + matrix: + os: [ ubuntu-24.04 ] + python: [ 3.12.8 ] + + env: + # Pip now forces us to either make a venv or set this flag, so we will do + # this + PIP_BREAK_SYSTEM_PACKAGES: 1 + # We are using dependencies installed from apt + PG_DEPS_FROM_SYSTEM: 1 + + steps: + - uses: actions/checkout@v4.2.2 + + - name: Install deps + # https://github.com/actions/runner-images/issues/7192 + # https://github.com/orgs/community/discussions/47863 + # echo -e 'export PYENV_ROOT="$HOME/.pyenv"\nexport PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc + # echo -e 'eval "$(pyenv init --path)"\neval "$(pyenv init -)"' >> ~/.bashrc + run: | + sudo apt-get update --fix-missing + + sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev + curl https://pyenv.run | bash + + echo -e 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc + echo -e 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc + echo -e 'eval "$(pyenv init --path)"' >> ~/.bashrc + echo -e 'eval "$(pyenv init -)"' >> ~/.bashrc + + sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libfreetype6-dev libportmidi-dev -y + + - name: Build + id: build + run: | + export PYENV_ROOT="$HOME/.pyenv" + export PATH="$PYENV_ROOT/bin:$PATH" + eval "$(pyenv init --path)" + eval "$(pyenv init -)" + pyenv install ${{ matrix.python }} --debug --keep + pyenv global ${{ matrix.python }}-debug + echo $(python -VV) + python dev.py build --lax + + - name: Run tests + env: + SDL_VIDEODRIVER: "dummy" + SDL_AUDIODRIVER: "disk" + run: | + export PYENV_ROOT="$HOME/.pyenv" + export PATH="$PYENV_ROOT/bin:$PATH" + eval "$(pyenv init --path)" + eval "$(pyenv init -)" + pyenv global ${{ matrix.python }}-debug + python -m pygame.tests -v --exclude opengl,music,timing --time_out 300 + + # - name: Generate coverage + # id: gen-coverage + # # want to continue regardless of whether a test failed or not as long as the job wasn't cancelled + # if: ${{ steps.build.conclusion == 'success' && !cancelled() }} + # run: | + # lcov --capture --directory . --output-file ./coverage.info + # genhtml ./coverage.info --output-directory ./out + + # # We upload the generated files under github actions assets + # - name: Upload coverage html + # # want to continue only if the coverage generation was successful + # if: ${{ steps.gen-coverage.conclusion == 'success' && !cancelled() }} + # uses: actions/upload-artifact@v4 + # with: + # name: pygame-wheels-coverage + # path: ./out From 7b6488cd97e5a01123124768b1e7271d58b3f91b Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 11:05:33 -0600 Subject: [PATCH 071/441] Apply fixes to code for debug builds of python to not crash us --- src_c/base.c | 7 +++---- src_c/pixelcopy.c | 10 ++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src_c/base.c b/src_c/base.c index 2b40bafc42..fd9f58fc3f 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -306,10 +306,9 @@ pg_mod_autoquit(const char *modname) return; } - funcobj = PyObject_GetAttrString(module, "_internal_mod_quit"); - - /* If we could not load _internal_mod_quit, load quit function */ - if (!funcobj) + if (PyObject_HasAttrString(module, "_internal_mod_quit")) + funcobj = PyObject_GetAttrString(module, "_internal_mod_quit"); + else funcobj = PyObject_GetAttrString(module, "quit"); /* Silence errors */ diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 627ca29497..253f1db87c 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -815,8 +815,15 @@ surface_to_array(PyObject *self, PyObject *args, PyObject *kwds) if (view_p->ndim == 2) { if (view_kind == VIEWKIND_RGB) { if (_copy_mapped(view_p, surf)) { + PyObject *currentException = NULL; + if (PyErr_Occurred()) { + currentException = PyErr_GetRaisedException(); + } pgBuffer_Release(&pg_view); pgSurface_Unlock(surfobj); + if (currentException) { + PyErr_SetRaisedException(currentException); + } return 0; } } @@ -1158,7 +1165,10 @@ map_array(PyObject *self, PyObject *args) if (is_tar_alloc) { pgBuffer_Release(&tar_pg_view); } + PyObject *currentException = PyErr_GetRaisedException(); + PyErr_Clear(); pgSurface_Unlock(format_surf); + PyErr_SetRaisedException(currentException); return 0; } From 873d419de1dea2070c54be19c9cb73f49c5bce4e Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 12:02:21 -0600 Subject: [PATCH 072/441] Apply fixes for python < 3.12 --- src_c/include/_pygame.h | 26 ++++++++++++++++++++++++++ src_c/pixelcopy.c | 15 +++++++-------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 5ae7f13ab2..451bffe5ab 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -738,3 +738,29 @@ pg_PointList_FromArrayDouble(double const *array, int arr_length) return sequence; } + +#if PY_MINOR_VERSION >= 13 +static PyObject *__cached_exception = NULL; + +#define CACHE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); +#define RESTORE_EXCEPTION \ + { \ + PyErr_SetRaisedException(__cached_exception); \ + __cached_exception = NULL; \ + } + +#else +static PyObject *__cached_type = NULL; +static PyObject *__cached_value = NULL; +static PyObject *__cached_traceback = NULL; + +#define CACHE_EXCEPTION \ + PyErr_Fetch(&__cached_type, &__cached_value, &__cached_traceback); +#define RESTORE_EXCEPTION \ + { \ + PyErr_Restore(__cached_type, __cached_value, __cached_traceback); \ + __cached_type = NULL; \ + __cached_value = NULL; \ + __cached_traceback = NULL; \ + } +#endif diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 253f1db87c..75e73b8b45 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -815,15 +815,14 @@ surface_to_array(PyObject *self, PyObject *args, PyObject *kwds) if (view_p->ndim == 2) { if (view_kind == VIEWKIND_RGB) { if (_copy_mapped(view_p, surf)) { - PyObject *currentException = NULL; - if (PyErr_Occurred()) { - currentException = PyErr_GetRaisedException(); + int error_occurred = (PyErr_Occurred() != NULL); + if (error_occurred) { + CACHE_EXCEPTION } pgBuffer_Release(&pg_view); pgSurface_Unlock(surfobj); - if (currentException) { - PyErr_SetRaisedException(currentException); - } + if (error_occurred) + RESTORE_EXCEPTION return 0; } } @@ -1165,10 +1164,10 @@ map_array(PyObject *self, PyObject *args) if (is_tar_alloc) { pgBuffer_Release(&tar_pg_view); } - PyObject *currentException = PyErr_GetRaisedException(); + CACHE_EXCEPTION PyErr_Clear(); pgSurface_Unlock(format_surf); - PyErr_SetRaisedException(currentException); + RESTORE_EXCEPTION return 0; } From f794f6866cf111a5197b8b2e5cb12a26f43fa4af Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 12:31:37 -0600 Subject: [PATCH 073/441] Apply more fixes for python < 3.12 and fix actin --- .../workflows/build-ubuntu-debug-python.yml | 8 +++---- src_c/include/_pygame.h | 24 +++++++++++++++++++ src_c/mixer.c | 8 +------ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 0525144e25..b92cfa9894 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -19,10 +19,8 @@ on: - '*.rst' - '*.md' - '.github/workflows/*.yml' - # gcov/lcov only gets C coverage - - 'src_py/**' # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-coverage.yml' + - '!.github/workflows/build-ubuntu-debug-python.yml' pull_request: branches: main @@ -47,7 +45,7 @@ jobs: fail-fast: false # if a particular matrix build fails, don't skip the rest matrix: os: [ ubuntu-24.04 ] - python: [ 3.12.8 ] + python: [ 3.11.11, 3.12.8 ] env: # Pip now forces us to either make a venv or set this flag, so we will do @@ -87,7 +85,7 @@ jobs: pyenv install ${{ matrix.python }} --debug --keep pyenv global ${{ matrix.python }}-debug echo $(python -VV) - python dev.py build --lax + python dev.py build - name: Run tests env: diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 451bffe5ab..9ddbf2a345 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -54,6 +54,9 @@ #include "pgplatform.h" #include +static void +shim_to_ignore_unused(void); + /* version macros (defined since version 1.9.5) */ #ifndef PG_MAJOR_VERSION #error PG_MAJOR_VERSION must be defined @@ -620,6 +623,9 @@ PYGAMEAPI_EXTERN_SLOTS(geometry); static PG_INLINE PyObject * pg_tuple_couple_from_values_int(int val1, int val2) { + // I'm sorry for putting this here, but it just needs a place to go + shim_to_ignore_unused(); + /* This function turns two input integers into a python tuple object. * Currently, 5th November 2022, this is faster than using Py_BuildValue * to do the same thing. @@ -742,6 +748,14 @@ pg_PointList_FromArrayDouble(double const *array, int arr_length) #if PY_MINOR_VERSION >= 13 static PyObject *__cached_exception = NULL; +// this thing only exists because of the unused values that erroneously get +// spit out by the compiler +static void +shim_to_ignore_unused(void) +{ + (void)__cached_exception; +} + #define CACHE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); #define RESTORE_EXCEPTION \ { \ @@ -754,6 +768,16 @@ static PyObject *__cached_type = NULL; static PyObject *__cached_value = NULL; static PyObject *__cached_traceback = NULL; +// this thing only exists because of the unused values that erroneously get +// spit out by the compiler +static void +shim_to_ignore_unused(void) +{ + (void)__cached_type; + (void)__cached_value; + (void)__cached_traceback; +} + #define CACHE_EXCEPTION \ PyErr_Fetch(&__cached_type, &__cached_value, &__cached_traceback); #define RESTORE_EXCEPTION \ diff --git a/src_c/mixer.c b/src_c/mixer.c index f342e18216..811cf13fb8 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -1200,9 +1200,6 @@ chan_set_volume(PyObject *self, PyObject *args) { int channelnum = pgChannel_AsInt(self); float volume, stereovolume = -1.11f; -#ifdef Py_DEBUG - int result; -#endif Uint8 left, right; PyThreadState *_save; @@ -1245,10 +1242,7 @@ chan_set_volume(PyObject *self, PyObject *args) volume = 1.0f; } -#ifdef Py_DEBUG - result = -#endif - Mix_Volume(channelnum, (int)(volume * 128)); + Mix_Volume(channelnum, (int)(volume * 128)); Py_RETURN_NONE; } From b8584ffe9efd3806f74ac966817408271aa1dc21 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 12:41:24 -0600 Subject: [PATCH 074/441] Re-enabled lax build for debug --- .github/workflows/build-ubuntu-debug-python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index b92cfa9894..c5d407726f 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -85,7 +85,7 @@ jobs: pyenv install ${{ matrix.python }} --debug --keep pyenv global ${{ matrix.python }}-debug echo $(python -VV) - python dev.py build + python dev.py build --lax - name: Run tests env: From 69bb8851c229b9de88e5c3e23b7fc449d4a328cd Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 20:19:53 -0600 Subject: [PATCH 075/441] Move caching to pgSurface_UnlockBy --- src_c/pixelcopy.c | 9 --------- src_c/surflock.c | 5 +++++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 75e73b8b45..627ca29497 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -815,14 +815,8 @@ surface_to_array(PyObject *self, PyObject *args, PyObject *kwds) if (view_p->ndim == 2) { if (view_kind == VIEWKIND_RGB) { if (_copy_mapped(view_p, surf)) { - int error_occurred = (PyErr_Occurred() != NULL); - if (error_occurred) { - CACHE_EXCEPTION - } pgBuffer_Release(&pg_view); pgSurface_Unlock(surfobj); - if (error_occurred) - RESTORE_EXCEPTION return 0; } } @@ -1164,10 +1158,7 @@ map_array(PyObject *self, PyObject *args) if (is_tar_alloc) { pgBuffer_Release(&tar_pg_view); } - CACHE_EXCEPTION - PyErr_Clear(); pgSurface_Unlock(format_surf); - RESTORE_EXCEPTION return 0; } diff --git a/src_c/surflock.c b/src_c/surflock.c index 0786d0fe66..922ec4caff 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -131,13 +131,16 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) } if (weakref_getref_result == 1) { if (ref == lockobj) { + CACHE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { Py_DECREF(ref); + RESTORE_EXCEPTION return 0; } else { found = 1; } + RESTORE_EXCEPTION } Py_DECREF(ref); } @@ -153,12 +156,14 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) noerror = 0; } else if (weakref_getref_result == 0) { + CACHE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { noerror = 0; } else { found++; } + RESTORE_EXCEPTION } else if (weakref_getref_result == 1) { Py_DECREF(ref); From 3e82532a568e852ffc1e56929e92ee4dc95a40a8 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 21:26:17 -0600 Subject: [PATCH 076/441] Cleanup of the debug python action --- .../workflows/build-ubuntu-debug-python.yml | 57 +++++++------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index c5d407726f..07e48846b3 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -5,6 +5,9 @@ # IMPORTANT: binaries are not to be uploaded from this workflow! name: Ubuntu debug python +defaults: + run: + shell: bash -leo pipefail {0} # Run CI only when a release is created, on changes to main branch, or any PR # to main. Do not run CI on any other branch. Also, skip any non-source changes @@ -45,7 +48,11 @@ jobs: fail-fast: false # if a particular matrix build fails, don't skip the rest matrix: os: [ ubuntu-24.04 ] - python: [ 3.11.11, 3.12.8 ] + # check our min python (minor) version and our max python (minor) version + python: [ + 3.9.21, + 3.13.1 + ] env: # Pip now forces us to either make a venv or set this flag, so we will do @@ -57,34 +64,29 @@ jobs: steps: - uses: actions/checkout@v4.2.2 - - name: Install deps + - name: Install pygame-ce deps # https://github.com/actions/runner-images/issues/7192 # https://github.com/orgs/community/discussions/47863 - # echo -e 'export PYENV_ROOT="$HOME/.pyenv"\nexport PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc - # echo -e 'eval "$(pyenv init --path)"\neval "$(pyenv init -)"' >> ~/.bashrc run: | sudo apt-get update --fix-missing + sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libfreetype6-dev libportmidi-dev -y + + - name: Install pyenv + run: | sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev curl https://pyenv.run | bash - echo -e 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc - echo -e 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc - echo -e 'eval "$(pyenv init --path)"' >> ~/.bashrc - echo -e 'eval "$(pyenv init -)"' >> ~/.bashrc + echo -e 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile + echo -e 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile + echo -e 'eval "$(pyenv init --path)"' >> ~/.bash_profile + echo -e 'eval "$(pyenv init -)"' >> ~/.bash_profile - sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libfreetype6-dev libportmidi-dev -y - - - name: Build + - name: Build debug python and pygame-ce id: build run: | - export PYENV_ROOT="$HOME/.pyenv" - export PATH="$PYENV_ROOT/bin:$PATH" - eval "$(pyenv init --path)" - eval "$(pyenv init -)" - pyenv install ${{ matrix.python }} --debug --keep + pyenv install ${{ matrix.python }} --debug pyenv global ${{ matrix.python }}-debug - echo $(python -VV) python dev.py build --lax - name: Run tests @@ -92,26 +94,5 @@ jobs: SDL_VIDEODRIVER: "dummy" SDL_AUDIODRIVER: "disk" run: | - export PYENV_ROOT="$HOME/.pyenv" - export PATH="$PYENV_ROOT/bin:$PATH" - eval "$(pyenv init --path)" - eval "$(pyenv init -)" pyenv global ${{ matrix.python }}-debug python -m pygame.tests -v --exclude opengl,music,timing --time_out 300 - - # - name: Generate coverage - # id: gen-coverage - # # want to continue regardless of whether a test failed or not as long as the job wasn't cancelled - # if: ${{ steps.build.conclusion == 'success' && !cancelled() }} - # run: | - # lcov --capture --directory . --output-file ./coverage.info - # genhtml ./coverage.info --output-directory ./out - - # # We upload the generated files under github actions assets - # - name: Upload coverage html - # # want to continue only if the coverage generation was successful - # if: ${{ steps.gen-coverage.conclusion == 'success' && !cancelled() }} - # uses: actions/upload-artifact@v4 - # with: - # name: pygame-wheels-coverage - # path: ./out From 68ddf2417e8bc6ff1974e71041f57281389e38c1 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 22 Feb 2025 21:45:52 -0600 Subject: [PATCH 077/441] Action is now verbose on python install (because why not?), and no more messy macros and weird shim. Just manual caching where needed in pgSurface_UnlockBy --- .../workflows/build-ubuntu-debug-python.yml | 2 +- src_c/include/_pygame.h | 50 -------------- src_c/surflock.c | 69 +++++++++++++++++-- 3 files changed, 65 insertions(+), 56 deletions(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 07e48846b3..74ee6a85a7 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -85,7 +85,7 @@ jobs: - name: Build debug python and pygame-ce id: build run: | - pyenv install ${{ matrix.python }} --debug + pyenv install ${{ matrix.python }} --debug -v pyenv global ${{ matrix.python }}-debug python dev.py build --lax diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 9ddbf2a345..5ae7f13ab2 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -54,9 +54,6 @@ #include "pgplatform.h" #include -static void -shim_to_ignore_unused(void); - /* version macros (defined since version 1.9.5) */ #ifndef PG_MAJOR_VERSION #error PG_MAJOR_VERSION must be defined @@ -623,9 +620,6 @@ PYGAMEAPI_EXTERN_SLOTS(geometry); static PG_INLINE PyObject * pg_tuple_couple_from_values_int(int val1, int val2) { - // I'm sorry for putting this here, but it just needs a place to go - shim_to_ignore_unused(); - /* This function turns two input integers into a python tuple object. * Currently, 5th November 2022, this is faster than using Py_BuildValue * to do the same thing. @@ -744,47 +738,3 @@ pg_PointList_FromArrayDouble(double const *array, int arr_length) return sequence; } - -#if PY_MINOR_VERSION >= 13 -static PyObject *__cached_exception = NULL; - -// this thing only exists because of the unused values that erroneously get -// spit out by the compiler -static void -shim_to_ignore_unused(void) -{ - (void)__cached_exception; -} - -#define CACHE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); -#define RESTORE_EXCEPTION \ - { \ - PyErr_SetRaisedException(__cached_exception); \ - __cached_exception = NULL; \ - } - -#else -static PyObject *__cached_type = NULL; -static PyObject *__cached_value = NULL; -static PyObject *__cached_traceback = NULL; - -// this thing only exists because of the unused values that erroneously get -// spit out by the compiler -static void -shim_to_ignore_unused(void) -{ - (void)__cached_type; - (void)__cached_value; - (void)__cached_traceback; -} - -#define CACHE_EXCEPTION \ - PyErr_Fetch(&__cached_type, &__cached_value, &__cached_traceback); -#define RESTORE_EXCEPTION \ - { \ - PyErr_Restore(__cached_type, __cached_value, __cached_traceback); \ - __cached_type = NULL; \ - __cached_value = NULL; \ - __cached_traceback = NULL; \ - } -#endif diff --git a/src_c/surflock.c b/src_c/surflock.c index 922ec4caff..194f25f7a2 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -114,6 +114,14 @@ pgSurface_LockBy(pgSurfaceObject *surfobj, PyObject *lockobj) static int pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) { +#if PY_MINOR_VERSION >= 12 + static PyObject *__cached_exception = NULL; +#else + static PyObject *__cached_exception_type = NULL; + static PyObject *__cached_exception_value = NULL; + static PyObject *__cached_exception_traceback = NULL; +#endif + pgSurfaceObject *surf = (pgSurfaceObject *)surfobj; int found = 0; int noerror = 1; @@ -131,16 +139,48 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) } if (weakref_getref_result == 1) { if (ref == lockobj) { - CACHE_EXCEPTION + // Need to cache any currently set exceptions before + // calling PySequence_DelItem +#if PY_MINOR_VERSION >= 12 + __cached_exception = PyErr_GetRaisedException(); +#else + PyErr_Fetch(&__cached_exception_type, + &__cached_exception_value, + &__cached_exception_traceback); +#endif + if (PySequence_DelItem(surf->locklist, len) == -1) { Py_DECREF(ref); - RESTORE_EXCEPTION + // Restore the previously set exception before + // returning +#if PY_MINOR_VERSION >= 12 + PyErr_SetRaisedException(__cached_exception); + __cached_exception = NULL; +#else + PyErr_Restore(__cached_exception_type, + __cached_exception_value, + __cached_exception_traceback); + __cached_exception_type = NULL; + __cached_exception_value = NULL; + __cached_exception_traceback = NULL; +#endif return 0; } else { found = 1; } - RESTORE_EXCEPTION + // Restore the previously set exception +#if PY_MINOR_VERSION >= 12 + PyErr_SetRaisedException(__cached_exception); + __cached_exception = NULL; +#else + PyErr_Restore(__cached_exception_type, + __cached_exception_value, + __cached_exception_traceback); + __cached_exception_type = NULL; + __cached_exception_value = NULL; + __cached_exception_traceback = NULL; +#endif } Py_DECREF(ref); } @@ -156,14 +196,33 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) noerror = 0; } else if (weakref_getref_result == 0) { - CACHE_EXCEPTION + // Need to cache any currently set exceptions before calling + // PySequence_DelItem +#if PY_MINOR_VERSION >= 12 + __cached_exception = PyErr_GetRaisedException(); +#else + PyErr_Fetch(&__cached_exception_type, + &__cached_exception_value, + &__cached_exception_traceback); +#endif if (PySequence_DelItem(surf->locklist, len) == -1) { noerror = 0; } else { found++; } - RESTORE_EXCEPTION + // Restore the previously set exception +#if PY_MINOR_VERSION >= 12 + PyErr_SetRaisedException(__cached_exception); + __cached_exception = NULL; +#else + PyErr_Restore(__cached_exception_type, + __cached_exception_value, + __cached_exception_traceback); + __cached_exception_type = NULL; + __cached_exception_value = NULL; + __cached_exception_traceback = NULL; +#endif } else if (weakref_getref_result == 1) { Py_DECREF(ref); From 979c40ba1056d29cb13cb8db446a8758bb288df2 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 24 Feb 2025 20:12:21 -0600 Subject: [PATCH 078/441] Added cache for debug python build action --- .github/workflows/build-ubuntu-debug-python.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 74ee6a85a7..5acea96a21 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -82,10 +82,21 @@ jobs: echo -e 'eval "$(pyenv init --path)"' >> ~/.bash_profile echo -e 'eval "$(pyenv init -)"' >> ~/.bash_profile - - name: Build debug python and pygame-ce + - name: Cache debug python build + id: cache-python + uses: actions/cache@v4.2.1 + with: + key: ${{ matrix.python }} + path: $PYENV_ROOT/versions/${{ matrix.python }}-debug/** + + - name: Build debug python id: build + if: steps.cache-python.outputs.cache-hit != 'true' + run: pyenv install ${{ matrix.python }} --debug -v + + - name: Build pygame-ce + id: build-pygame-ce run: | - pyenv install ${{ matrix.python }} --debug -v pyenv global ${{ matrix.python }}-debug python dev.py build --lax From 381d8f6b605a669f5f464cec55bf4f926e241110 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 24 Feb 2025 20:22:23 -0600 Subject: [PATCH 079/441] Compare to PY_VERSION_HEX instead of PY_MINOR_VERSION --- src_c/surflock.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src_c/surflock.c b/src_c/surflock.c index 194f25f7a2..59ceae7262 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -114,7 +114,7 @@ pgSurface_LockBy(pgSurfaceObject *surfobj, PyObject *lockobj) static int pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) { -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 static PyObject *__cached_exception = NULL; #else static PyObject *__cached_exception_type = NULL; @@ -141,7 +141,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) if (ref == lockobj) { // Need to cache any currently set exceptions before // calling PySequence_DelItem -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 __cached_exception = PyErr_GetRaisedException(); #else PyErr_Fetch(&__cached_exception_type, @@ -153,7 +153,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) Py_DECREF(ref); // Restore the previously set exception before // returning -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 PyErr_SetRaisedException(__cached_exception); __cached_exception = NULL; #else @@ -170,7 +170,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) found = 1; } // Restore the previously set exception -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 PyErr_SetRaisedException(__cached_exception); __cached_exception = NULL; #else @@ -198,7 +198,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) else if (weakref_getref_result == 0) { // Need to cache any currently set exceptions before calling // PySequence_DelItem -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 __cached_exception = PyErr_GetRaisedException(); #else PyErr_Fetch(&__cached_exception_type, @@ -212,7 +212,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) found++; } // Restore the previously set exception -#if PY_MINOR_VERSION >= 12 +#if PY_VERSION_HEX >= 0x030C0000 PyErr_SetRaisedException(__cached_exception); __cached_exception = NULL; #else From 127d2e18faa35eedee88a924c68e6af45861e52e Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 24 Feb 2025 20:51:12 -0600 Subject: [PATCH 080/441] Hopefully fixed caching of python build --- .github/workflows/build-ubuntu-debug-python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 5acea96a21..096aee5ca8 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -87,7 +87,7 @@ jobs: uses: actions/cache@v4.2.1 with: key: ${{ matrix.python }} - path: $PYENV_ROOT/versions/${{ matrix.python }}-debug/** + path: ~/.pyenv/versions/${{ matrix.python }}-debug/** - name: Build debug python id: build From 83c46779c7de0c98053c2a338fa03eb955cd4c31 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 24 Feb 2025 21:37:56 -0600 Subject: [PATCH 081/441] Updated comments in a couple of actions --- .github/workflows/build-ubuntu-coverage.yml | 6 +++--- .github/workflows/build-ubuntu-debug-python.yml | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-ubuntu-coverage.yml b/.github/workflows/build-ubuntu-coverage.yml index 699448770e..680481ba82 100644 --- a/.github/workflows/build-ubuntu-coverage.yml +++ b/.github/workflows/build-ubuntu-coverage.yml @@ -1,4 +1,4 @@ -# this workflow generates C code coverage information from the unit test +# This workflow generates C code coverage information from the unit test # suite. Note that for intrinsics, it only runs what gets compiled # and would naturally run. It also is limited to what can run in # a CI environment @@ -6,8 +6,8 @@ name: Ubuntu coverage -# Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes +# Run CI only on changes to main branch, or any PR to main. +# Do not run CI on any other branch. Also, skip any non-source changes # from running on CI on: push: diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 096aee5ca8..d7bb26a8b5 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -1,7 +1,7 @@ -# this workflow runs a build with a python version that has debug symbols -# Note that for intrinsics, it only runs what gets compiled -# and would naturally run. It also is limited to what can run in -# a CI environment +# This workflow runs a build with a python version that has debug symbols +# Update this workflow when our min/max python minor versions update +# This workflow is necessary to ensure that we can build and run with +# a debug python build without too much worrying about SIGABRT being thrown # IMPORTANT: binaries are not to be uploaded from this workflow! name: Ubuntu debug python @@ -9,8 +9,8 @@ defaults: run: shell: bash -leo pipefail {0} -# Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes +# Run CI only on changes to main branch, or any PR to main. +# Do not run CI on any other branch. Also, skip any non-source changes # from running on CI on: push: From f03e069e823ecd7e4491d6312be071ad81bdbaca Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 24 Feb 2025 22:20:34 -0600 Subject: [PATCH 082/441] Moved caching back to macros, but smarter --- src_c/include/_pygame.h | 30 +++++++++++++++++++++ src_c/surflock.c | 60 +++++------------------------------------ 2 files changed, 36 insertions(+), 54 deletions(-) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 5ae7f13ab2..01674b2f6c 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -738,3 +738,33 @@ pg_PointList_FromArrayDouble(double const *array, int arr_length) return sequence; } + +#if PY_VERSION_HEX >= 0x030C0000 + +#define CREATE_CACHE_VARIABLES static PyObject *__cached_exception = NULL; + +#define CACHE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); + +#define RESTORE_EXCEPTION \ + PyErr_SetRaisedException(__cached_exception); \ + __cached_exception = NULL; + +#else + +#define CREATE_CACHE_VARIABLES \ + static PyObject *__cached_exception_type = NULL; \ + static PyObject *__cached_exception_value = NULL; \ + static PyObject *__cached_exception_traceback = NULL; + +#define CACHE_EXCEPTION \ + PyErr_Fetch(&__cached_exception_type, &__cached_exception_value, \ + &__cached_exception_traceback); + +#define RESTORE_EXCEPTION \ + PyErr_Restore(__cached_exception_type, __cached_exception_value, \ + __cached_exception_traceback); \ + __cached_exception_type = NULL; \ + __cached_exception_value = NULL; \ + __cached_exception_traceback = NULL; + +#endif diff --git a/src_c/surflock.c b/src_c/surflock.c index 59ceae7262..05ecd9a9e1 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -114,13 +114,7 @@ pgSurface_LockBy(pgSurfaceObject *surfobj, PyObject *lockobj) static int pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) { -#if PY_VERSION_HEX >= 0x030C0000 - static PyObject *__cached_exception = NULL; -#else - static PyObject *__cached_exception_type = NULL; - static PyObject *__cached_exception_value = NULL; - static PyObject *__cached_exception_traceback = NULL; -#endif + CREATE_CACHE_VARIABLES pgSurfaceObject *surf = (pgSurfaceObject *)surfobj; int found = 0; @@ -141,46 +135,20 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) if (ref == lockobj) { // Need to cache any currently set exceptions before // calling PySequence_DelItem -#if PY_VERSION_HEX >= 0x030C0000 - __cached_exception = PyErr_GetRaisedException(); -#else - PyErr_Fetch(&__cached_exception_type, - &__cached_exception_value, - &__cached_exception_traceback); -#endif + CACHE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { Py_DECREF(ref); // Restore the previously set exception before // returning -#if PY_VERSION_HEX >= 0x030C0000 - PyErr_SetRaisedException(__cached_exception); - __cached_exception = NULL; -#else - PyErr_Restore(__cached_exception_type, - __cached_exception_value, - __cached_exception_traceback); - __cached_exception_type = NULL; - __cached_exception_value = NULL; - __cached_exception_traceback = NULL; -#endif + RESTORE_EXCEPTION return 0; } else { found = 1; } // Restore the previously set exception -#if PY_VERSION_HEX >= 0x030C0000 - PyErr_SetRaisedException(__cached_exception); - __cached_exception = NULL; -#else - PyErr_Restore(__cached_exception_type, - __cached_exception_value, - __cached_exception_traceback); - __cached_exception_type = NULL; - __cached_exception_value = NULL; - __cached_exception_traceback = NULL; -#endif + RESTORE_EXCEPTION } Py_DECREF(ref); } @@ -198,13 +166,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) else if (weakref_getref_result == 0) { // Need to cache any currently set exceptions before calling // PySequence_DelItem -#if PY_VERSION_HEX >= 0x030C0000 - __cached_exception = PyErr_GetRaisedException(); -#else - PyErr_Fetch(&__cached_exception_type, - &__cached_exception_value, - &__cached_exception_traceback); -#endif + RESTORE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { noerror = 0; } @@ -212,17 +174,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) found++; } // Restore the previously set exception -#if PY_VERSION_HEX >= 0x030C0000 - PyErr_SetRaisedException(__cached_exception); - __cached_exception = NULL; -#else - PyErr_Restore(__cached_exception_type, - __cached_exception_value, - __cached_exception_traceback); - __cached_exception_type = NULL; - __cached_exception_value = NULL; - __cached_exception_traceback = NULL; -#endif + RESTORE_EXCEPTION } else if (weakref_getref_result == 1) { Py_DECREF(ref); From 523a4d431603036d9ed2ddfd4b0ba035bbe24f30 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 25 Feb 2025 05:54:25 -0600 Subject: [PATCH 083/441] Renamed cache variable init macro --- src_c/include/_pygame.h | 12 ++++++------ src_c/surflock.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 01674b2f6c..8d410e1de1 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -741,26 +741,26 @@ pg_PointList_FromArrayDouble(double const *array, int arr_length) #if PY_VERSION_HEX >= 0x030C0000 -#define CREATE_CACHE_VARIABLES static PyObject *__cached_exception = NULL; +#define PG_DECLARE_EXCEPTION_SAVER static PyObject *__cached_exception = NULL; -#define CACHE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); +#define PG_SAVE_EXCEPTION __cached_exception = PyErr_GetRaisedException(); -#define RESTORE_EXCEPTION \ +#define PG_UNSAVE_EXCEPTION \ PyErr_SetRaisedException(__cached_exception); \ __cached_exception = NULL; #else -#define CREATE_CACHE_VARIABLES \ +#define PG_DECLARE_EXCEPTION_SAVER \ static PyObject *__cached_exception_type = NULL; \ static PyObject *__cached_exception_value = NULL; \ static PyObject *__cached_exception_traceback = NULL; -#define CACHE_EXCEPTION \ +#define PG_SAVE_EXCEPTION \ PyErr_Fetch(&__cached_exception_type, &__cached_exception_value, \ &__cached_exception_traceback); -#define RESTORE_EXCEPTION \ +#define PG_UNSAVE_EXCEPTION \ PyErr_Restore(__cached_exception_type, __cached_exception_value, \ __cached_exception_traceback); \ __cached_exception_type = NULL; \ diff --git a/src_c/surflock.c b/src_c/surflock.c index 05ecd9a9e1..f34fac3ce4 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -114,7 +114,7 @@ pgSurface_LockBy(pgSurfaceObject *surfobj, PyObject *lockobj) static int pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) { - CREATE_CACHE_VARIABLES + PG_DECLARE_EXCEPTION_SAVER pgSurfaceObject *surf = (pgSurfaceObject *)surfobj; int found = 0; @@ -135,20 +135,20 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) if (ref == lockobj) { // Need to cache any currently set exceptions before // calling PySequence_DelItem - CACHE_EXCEPTION + PG_SAVE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { Py_DECREF(ref); // Restore the previously set exception before // returning - RESTORE_EXCEPTION + PG_UNSAVE_EXCEPTION return 0; } else { found = 1; } // Restore the previously set exception - RESTORE_EXCEPTION + PG_UNSAVE_EXCEPTION } Py_DECREF(ref); } @@ -166,7 +166,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) else if (weakref_getref_result == 0) { // Need to cache any currently set exceptions before calling // PySequence_DelItem - RESTORE_EXCEPTION + PG_SAVE_EXCEPTION if (PySequence_DelItem(surf->locklist, len) == -1) { noerror = 0; } @@ -174,7 +174,7 @@ pgSurface_UnlockBy(pgSurfaceObject *surfobj, PyObject *lockobj) found++; } // Restore the previously set exception - RESTORE_EXCEPTION + PG_UNSAVE_EXCEPTION } else if (weakref_getref_result == 1) { Py_DECREF(ref); From c8816eb61c7e9dc3b3cca88e3e4940569de3dd13 Mon Sep 17 00:00:00 2001 From: Ankith Date: Wed, 26 Feb 2025 10:48:24 +0530 Subject: [PATCH 084/441] Port joystick.c to SDL3 --- src_c/joystick.c | 62 +++++++++++++++++++++++++++++++++++++++++++---- src_c/meson.build | 3 --- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src_c/joystick.c b/src_c/joystick.c index 806dfd0b77..fe27a7e45b 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -112,7 +112,17 @@ static PyObject * get_count(PyObject *self, PyObject *_null) { JOYSTICK_INIT_CHECK(); +#if SDL_VERSION_ATLEAST(3, 0, 0) + int ret; + SDL_JoystickID *joysticks = SDL_GetJoysticks(&ret); + if (!joysticks) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + SDL_free(joysticks); + return PyLong_FromLong(ret); +#else return PyLong_FromLong(SDL_NumJoysticks()); +#endif } static PyObject * @@ -200,18 +210,53 @@ joy_get_guid(PyObject *self, PyObject *_null) guid = SDL_JoystickGetGUID(joy); } else { +#if SDL_VERSION_ATLEAST(3, 0, 0) + return RAISE(pgExc_SDLError, "Invalid/closed joystick object"); +#else guid = SDL_JoystickGetDeviceGUID(pgJoystick_AsID(self)); +#endif } +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_GUIDToString(guid, strguid, 33); +#else SDL_JoystickGetGUIDString(guid, strguid, 33); +#endif return PyUnicode_FromString(strguid); } const char * -_pg_powerlevel_string(SDL_JoystickPowerLevel level) +_pg_powerlevel_string(SDL_Joystick *joy) { - switch (level) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + int percent = -1; + SDL_PowerState state = SDL_GetJoystickPowerInfo(joy, &percent); + if (state == SDL_POWERSTATE_ON_BATTERY) { + /* These percentages are based on SDL_JoystickCurrentPowerLevel defined + * in sdl2-compat */ + if (percent > 70) { + return "full"; + } + else if (percent > 20) { + return "medium"; + } + else if (percent > 5) { + return "low"; + } + else { + return "empty"; + } + } + else if (state == SDL_POWERSTATE_UNKNOWN || + state == SDL_POWERSTATE_ERROR) { + return "unknown"; + } + else { + return "wired"; + } +#else + switch (SDL_JoystickCurrentPowerLevel(joy)) { case SDL_JOYSTICK_POWER_EMPTY: return "empty"; case SDL_JOYSTICK_POWER_LOW: @@ -227,12 +272,12 @@ _pg_powerlevel_string(SDL_JoystickPowerLevel level) default: return "unknown"; } +#endif } static PyObject * joy_get_power_level(PyObject *self, PyObject *_null) { - SDL_JoystickPowerLevel level; const char *leveltext; SDL_Joystick *joy = pgJoystick_AsSDL(self); @@ -241,8 +286,7 @@ joy_get_power_level(PyObject *self, PyObject *_null) return RAISE(pgExc_SDLError, "Joystick not initialized"); } - level = SDL_JoystickCurrentPowerLevel(joy); - leveltext = _pg_powerlevel_string(level); + leveltext = _pg_powerlevel_string(joy); return PyUnicode_FromString(leveltext); } @@ -287,7 +331,11 @@ joy_rumble(pgJoystickObject *self, PyObject *args, PyObject *kwargs) low = (Uint32)(lowf * 0xFFFF); high = (Uint32)(highf * 0xFFFF); +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (!SDL_JoystickRumble(joy, low, high, duration)) { +#else if (SDL_JoystickRumble(joy, low, high, duration) == -1) { +#endif Py_RETURN_FALSE; } Py_RETURN_TRUE; @@ -545,9 +593,13 @@ pgJoystick_New(int id) JOYSTICK_INIT_CHECK(); /* Open the SDL device */ +#if !SDL_VERSION_ATLEAST(3, 0, 0) + /* This check should be redundant because SDL_JoystickOpen already checks + * and errors if id is out of bounds on SDL3 */ if (id >= SDL_NumJoysticks()) { return RAISE(pgExc_SDLError, "Invalid joystick device number"); } +#endif joy = SDL_JoystickOpen(id); if (!joy) { return RAISE(pgExc_SDLError, SDL_GetError()); diff --git a/src_c/meson.build b/src_c/meson.build index 8bfcaf0e24..fde0cf8fcc 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -152,8 +152,6 @@ time = py.extension_module( subdir: pg, ) -# TODO: support SDL3 -if sdl_api != 3 joystick = py.extension_module( 'joystick', 'joystick.c', @@ -162,7 +160,6 @@ joystick = py.extension_module( install: true, subdir: pg, ) -endif draw = py.extension_module( 'draw', From 5bfba1d665b23cc2a3e1e6b8969c8caed6f27694 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Fri, 28 Feb 2025 15:30:11 -0600 Subject: [PATCH 085/441] Updated print_debug_info to output the status of the GIL --- src_py/_debug.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src_py/_debug.py b/src_py/_debug.py index c8d73fa512..12d6482394 100644 --- a/src_py/_debug.py +++ b/src_py/_debug.py @@ -76,6 +76,11 @@ def _get_platform_info(): ) ret += f"Python:\t\t\t{platform.python_implementation()} {sys.version}\n" + ret += ( + f"GIL Enabled:\t\t{sys._is_gil_enabled()}\n" + if hasattr(sys, "_is_gil_enabled") + else "GIL Enabled:\t\tTrue\n" + ) ret += f"pygame version:\t\t{ver}\n" return ret From 93eb26a3bb1729fea865cfcd8c6ea042b80a255d Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:53:33 -0800 Subject: [PATCH 086/441] Minify images in docs/reST/_static By re-encoding as lossless webp. Saves 300 kb. --- docs/reST/_static/pygame_ce_lofi.png | Bin 232472 -> 0 bytes docs/reST/_static/pygame_ce_lofi.webp | Bin 0 -> 126562 bytes docs/reST/_static/pygame_ce_logo.png | Bin 231317 -> 0 bytes docs/reST/_static/pygame_ce_logo.webp | Bin 0 -> 127910 bytes docs/reST/_static/pygame_ce_powered.png | Bin 274085 -> 0 bytes docs/reST/_static/pygame_ce_powered.webp | Bin 0 -> 150210 bytes .../reST/_static/pygame_ce_powered_lowres.png | Bin 11853 -> 0 bytes .../_static/pygame_ce_powered_lowres.webp | Bin 0 -> 8758 bytes docs/reST/_static/pygame_ce_tiny.png | Bin 25134 -> 0 bytes docs/reST/_static/pygame_ce_tiny.webp | Bin 0 -> 17814 bytes docs/reST/conf.py | 2 +- docs/reST/logos.rst | 20 +++++++++--------- 12 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 docs/reST/_static/pygame_ce_lofi.png create mode 100644 docs/reST/_static/pygame_ce_lofi.webp delete mode 100644 docs/reST/_static/pygame_ce_logo.png create mode 100644 docs/reST/_static/pygame_ce_logo.webp delete mode 100644 docs/reST/_static/pygame_ce_powered.png create mode 100644 docs/reST/_static/pygame_ce_powered.webp delete mode 100644 docs/reST/_static/pygame_ce_powered_lowres.png create mode 100644 docs/reST/_static/pygame_ce_powered_lowres.webp delete mode 100644 docs/reST/_static/pygame_ce_tiny.png create mode 100644 docs/reST/_static/pygame_ce_tiny.webp diff --git a/docs/reST/_static/pygame_ce_lofi.png b/docs/reST/_static/pygame_ce_lofi.png deleted file mode 100644 index 2db62e4cc6cc03aaaf43a61b873bf820ae111436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232472 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

BJ=q)<*kcffMdB2u?1maM9yiCU$E zilx1G%UWkPiBzd|-``~e{O56TQJXmty@tR%x4dQCne*tAM^9kms;T`^)ksw~xQ082 z5-pi$v6xYMxE6@IxBxvkc=*A_#ua^53PER+l$1 zjXEu$?Vu4$sS}GSh!z5N_OD;7N|!7&6$Y7LBA!tYP%BnkiRn^GVvv6p@w@$$FI;8y z8YR|R8ccKuySJxF@AdZ&+lwz6_!G#(vl?0F@DVM~&MYh}0bX_dk-g!}qpXhqKg|Z4 zOiLRVjsQ?1a;A8S*s!_s<_`^1DH3ufrpkZ7-y|d~d|WJ@9(3kUhqM3`MO3Bx(TTwxSRs7Ldc}BqM>*R z>^4?2x$&fuQc_$v>9ge}zCe8nGD@&)#;602sg)B=oHv(+HE-UGc9EJo?p(8q|#GPFQDxM67ir#K-gPS8W{n_5$okZ}f?6oAsHVV@7_ z?XK#nw(0V|pH)n>+zzSlP6Eo0Mt!p|vC0NJBBlO&Wq&`b!S??0(BrXX?V_lm7dXA%dX6KeWMNs_ zYkjV_#1tqG3>hmOzJA(&eBLY00O*fEOQ@tW|8LDqD&b_Efv`a*MCArIsC06*j)z-4Znr;pDeu zjLztpbm9B4Uo3?Z3Q^i=&N?T~o}u4(a*X<8{%hh7$1!UyW_d1F3%97v>FP8+T^D2f zXPe2TD`^uD2P~P5=q9fB0R6zE$@!gw?Px&Y_MeWOiq`6@x9c_P zV3tDyexeeXRG+27u$t1!sRP@R25f*3G6v{48Fub+7)OMM&!rJ#;|F%}^7$yk2w*tC&sCDvLc6Un?d$lv=iDLa@R*dS1+!`!D03vRhUaF_x6qu$ZlMP75Oiht z0~%5myhH<#m$j?y*P`kyWo4^b?t5h7F}&b~vv}vb5Jq)mjFt=T;?X$M0E%5_znhs6 ztXLtn-4!&aodDr@MC;sVy&}=%+m8056+1Tca~nI;7R#os^E;?%j5E8$L*0Y2Ay{JHsO|wa41U(}+t2L`sjW5hAyt^9 zI;@JVxOMOM640bmB;?+@@Gy+`1ph`vo3Iz9s@$UAno#nmmMzGSsP0?HH0eq8z9=&~ z)->mZ=x{Nyepvy&z%GXYI#`e($b!e7+nmzO{mB$M0-^+zdA19k-*bPNr1BGTekcN0 z2C+zt*>p~o_uJ+A`}=*W!>?Rc`gPuihtBXDoSW)eF#amLp7ALnH;em zPaBb)xHXL$iOHD@4HDAwCodI*{X)QLycN8CeH=!(bTgC*uhr=(qggXLHf0Rxkl!5^ z>K;z#C7Q~cRpfb+V+CHZQY)I!Crnsm(wv)vKz+c_o&P22Qb+dVp8KL@oK@731%D!7 zzz7pdf#wSVBBZAm05ms>w6i23H0-uwP9K?^?8{m3I(nwA@Igz4(qMcTU!+uM0#@(P zjpIKgJd;o(B>6|xaxbi(e<4y(i2;Jgi29DL3v|a{yI?Wp4F{-_JJj*#0K$GQU8pVb zJz2D_b5o5BgHiLiA+kf=s`hZJ42yy&*FGH$`k=?|-ktne+$2HdFjn^v!dfCvXNiDb zi$?pqQA{V`F=BL9$epjO^wo8qHQ;)?IDh_pLjs@@ugeooqu0n-MW=%r`ktF~jmZM z%`-5rQ=a?KRG#b66bcDj*vE(O@aN@*fdoKXGPyfU^sqHM56O|U4Z*#pJBVC z)T*N>R=TD>SAC0aN)|Rm7LBS*jCWxMkXayI`h1o`3Ujcs0)wrjq+I9bR3s%&R$UA7 zpKVM|%K!9!sOh842y3pW?EPGeBKdqYgWO`I#<*+PeV^ZL+$Wla(%6ER>lMQU(a5W3 zQ)Xd8#Y*b@Dq7)W9prPP=4g;#ljJhmbOu-%lDsgyp(w7BVa2)j%*=jjwm$;4+`ueH z<>8dpWJ;9L-0#ud-8~nEfI6Bqx{p{2S&SBTb2vgI!BjkoGx>JE<_A@o4bsPzsBmD= zyh3-NihOHuuHR>bUAIpp&{wvTDDvUOAkcR`Z>2pF(xITLXos0!k?Y@K7Kmxs0`_*z zQK+%J5%D5kPkqQu_n4mRUbS=xodcG_GhVAL4nO>IZwV^Yn-~<&oVn%sAJHgsIO0XZ z@Yl+fd(9eV7gj`Vs@j}P3x}h20b=|eFi4GrlgHzfrgwvMUh}PBB#;FNM=7H~f?bxD+A|&J=H9HD z%dBNXG_6`^-54NMOmvVhTWy=+auc_AjV6j1tC_xbd>~^-n|Axd!Qf%iBGQS^H!zax>Ctt zrBc8QbYMIYCA@z+4+g4P1wn=eL6_NoTM^bQwYy=t|D#+yP5r05_(Kvjh+v2SDRC+| z0J7@IW*f3$8{ws%u7^*L(0LsufH(%bH(obicS2_Fd^Z9Cqy#K8&K)W(Mp%w#*it=` zH!T2ou~O}RGXnqO?3pMR>8Kmw%PsdGI10>O5`|dh8mcH#Hh3qp$%p#q%18lI5t@mA0Bk&-ok%e{7WJN`ie3) zxhrwY_yt)hHS%e{2V%DzzW`~{GvEKMHN7uUmp}nTV68(tU&qIkTgTm)#=`R7k91(R z4fAOqJhp%lFT2h#A`H-d#j~4+aL(cs6H^RvSf^&Shn$8V12D1X3$(z3`?l z^H4TZ35EGMpIjVVml2VkA6{8lm;L4A=Ei9Uu~}T%e>|WqkB^!JRU|;@fYEtkFl*TK zr?R<$8R!*cGtn&;N*JVvk`w|6R5{Do(u&jp|Dn9|-WZm@o-!6X0!XeOL&`WU*c5BnmEnXHzE zZ6e^cR##Yrg-NJ^*!0-sN<+_S9F(;mcrr>-=U)wo$7Zs6Imnqs)3Q41`0JM2W^Chcb~xtb3zm z{py9T!=NgC`-KrLhLW&d1G&RlSz+Ob5p2vsw6{coX0Z`*(*PW;8nZeji&G(Fz3neGO>hGLzvw0BzPsVkY#t8ISQyt9}Dq@ z7Dj(xZP)qB74+&Jkef>l``JTA!TB%h03v!NS&TEQvpVv}D?@i7=ieNWML@-Llpu3; zo{YMM4*=Q!A>RKzu2&l)dxO{Y)~g)uyuB6SeY-9DQ@b7apGaC5OygEXwMZ7{QcWZJ^0-C+QPm*b+>yX z!SW|LbRnQ0zZD`u7Ef6&d+*^jy9X(xkj|@a0o@l>?2~ZLk5Jf46*#L zOn}D~jYue7^eomE97)6K5G3ZtDDaREgkS&+2yKSUjpU!{UFqrNjgMPT+YPR7>}qRg z^rhL|L^8l9Xc165jo~Z-j3-D`_#8eMC$Lk|<=h(~b+`HCz4E&OT^xXf@s9apX_)+w zN>f8dOx#lNARu#|c4sl$b!=vZ(p+RH^QYOOyk=;=s0_VLkVrA09*%*~7n_zb>cs?$ zi@Kg(v5x3`wXJ{hW%+Vv-L?(mChmdcLK8&^&)$0@dP~)W8^|tDnK>H{L`7pP0T{u>CQLe*d>x ziaLjZVCIz)Bqxw32z7rY$EFGUex~yMo~Pm$;E9|}8AxL~W-*(10XRI(Hah*Uj{*(8 zAJZ3WP2X$WzEB8&m8&%xX7YXiCOiNuR4^DQgh?2v!-}1jI3AjGm%mm`DL+8~QFWcBLvkb>6tG|ah$WCoMPWPfA7?p{ z*3(ifwnYGS4FINKbKXc!@!sQr0DRBVGOB)y#<&b>$NaT^(~In7dvK>k_@~d#mNbp7 z_rQvw?0oIa+lUc^-(bdFN;AnMU>CWeGQJN_w>z!@slcd3;2p^dF#o}{R>_}TZ0_d}NlR-TWZ2*){CKD0>G zo-A-0X_*gg4rdfe7s}b2SvejH9)YBnS{VVWMXEI;KFYBAfjV;qW${x*@`(NrBj%{I z^xyjC3Y80qUp~2&dhan|Z_Di&q9oC8b6WMYa^Uv)H{vT6EP`iefK+0!{RGp#@tmI> zPz;+iG&QtI)*>ZtA)gZu1P5?&l{Y^P^@T+7zr!r9M{_ie7$Af7gTh3T32_)5j>*Zk zdePHs)E)wSG+m!dHeJ`jpC<*X`3u&`s*NS3`$0UtTz)w{N0XT^r^C70Hg*;dEW2ad zFE88RlJaxJQp_{fft;dM7YZ*1A^>;yWv7C|+#q0Mt4c7ef?ruHkuRG=Bz`neu|_|hLweXRU;Es-QYK_G=uim_$L*DP7Ii3E} zm+z1u=8pAeHm+8pkU@F4H-o7%tuHC&A`$Q&9v&SJXXEdO<=vukx)#N&)KYR}QhP(0 zb|gH({v9r1nUQvD;nSGU*2ykVc&9#beWi+OXaY^i-#G~Yvdko`TIWvfc^cyq!E;uM zDO&b-F>??pW4F4n@a2o0%JIK{Y3S4B>>polc4;}E8e;|_g9zsE6yv^){`=VLtI6C6 zZzVRUCvYd4AXHH^re^#dXa2|;6W>wFJ03KK2E~Fbbx1QWiqaB%@1f%no|#l3C0q%I z5Js<-ve33u_Ur7MIMHu6T6IgYkp?1Z(RC6k4mTo|;ttVn-!SnegMd8JsL-ue$2nu> z_$o)rlVZL0v~K(Sa+@Js;H(2d;}rWh#~<86^xFwY;vtv<$MF*SgXiCJrn!7JPCGuA zyaBq<4ptPsfB$YzUcI|*lXm*uGSya%EZ+aP0BMs)c|Hc-$9v^G@V}N)AI0HEv3>ec zuz_;H!V(5C9vudvu3zo^crvyku-SmOH(-#qa3s{HFK`>F;W(KED7Ch}+}5#a6Clh# zVENtoi5NA56v*G=$R!(vs#%C=IkjQnK?v-6aHxWDvk21=AX4>3L4la*$C{)BuJ0&| zgRiyv{EEJAY0hsY3?=@E3=1LbKpbjLnbKmcy}%!Z4f!jkW>~d3Q1VNaZHrM!7R&LXEx0s42V67RO z#k#GgUheq`CK$k?^2pv!2mJj26G3e1FhS;YssY`%)~{FGn&WyJ`dAP9I)JxaRIIG4 zT4~wd+S$t9wLIt^Qkg_lF0A#tS`y7I?f%r^*c` z%w9AHe|bSQzdPb1L!vU+_66T?)#l6yn+lv(J#R}w1-Ty<)L;2fA)oc@WlKaDcy<{p zprY7Szs20{O@qs0ll4~PLQB?&8vmX#tgJa_=YQtymjpWEz! z34za@visvzXQr$5o`w;d+>AG?Q^C~U^r5ia)T*5%X#2Xb&HBgaR2NLL647tEYHa}| z0aRLfL_)LO+Wde)<7hcJ6?3%vgDmC_ee#nPv)7|Oy2RZT(x+c2LL(?Es9?Q-YZ`Df z2&2#iteRbq2>#zZe9zx{bM+&JzY#|{Im2hGf+RsWY@@JDn2Wc19DgNqe^XQI+a?Gc zHZPse0h%4v<;ZDBA?F$HAfW`Z|IfPMxx$ls`wr6PXOY2uas&E86Ks@E;+s8)a zd9THas`SA_gpU3e?cRB|WssE8sQ2>kV*D^I3PoWfvq{60F^rtqJ>#sjikhOAn7R!j zQ1k9&0wqE^Xc~KR5q{mZjqB+QzfyO7#tc_nqzCGBuOYvR4Hy|mRJ)op2ejB-AoKZOmFdMG(B@65kW9-2D z#%-+lFCLtxS^<;HKwBZZZyvTsfwLy8zuc~lbCpz;@}<`6dXAqO9Oo$(0ak{(vYs%I zx;gu=pYBH%mNh##Tet-n1aec4J5f>r88q!UuxU!yiVG-{Tn($976iuKZ^}Ms@-oGs zv~0ibo4bn9+zMrq9pE4Wry3lrQ2o9%Y9~Fqy-5>)P~0DqVD=B&+G^->zB0NW6WXr^ z&+G*bLTLTUZ$RhXOHVbr9Exkt0r5rbCb#)r*F&UU4(CaMyBYiE@6E444jlE8SEa6n3B8kYo_;y%T34POidi`sX0Qufy1 z?kG>SProVu)8zy*9+8LF5uW!6B<$N zAff7%)n-_f=zuyS0&Kpd4=1@Y6(W#xpoC*aa~bR02*wjsTZ=5)c}^?}*X<954LpSQ zOr}T<=mR(YaTK?FVsom^N{_h!{cO>t#r-_@<7GSu9J3gt2#u$vZCKu00VN!ZS;z2? z+;;|x?H-{Zch@B+GIH`kL(}ZxU3){;vi+@@1=#$@fFF?_j#HnO(Ais(5e)+34ONrN z&ma2b(tZ+3!Rujy$Z}oJQ-jCwK{SA?Xyfgk4m$6%Dw8y>74h^dYR4CCmap*5aLXvj z>M5vE??zYG3dOB$^n$D`BvcJ>XT*oLc!!BNupjDW8^jl~*2sW7fD?(Xkvz62044;} zSS!hW)dCC17^BPo(jZ$%+5MFS!xFGWGb?0Y$_Fr;?>`q8GaB*be7Ew{dK!SnCS(Q^ z!l5tA&v%UHnjUU#t3-h?C-VdEpKVe$i4+RpvpdpOoeI;M*;ip`VK!DMw!vnD^x5ed zKz1%EeI2=)vTEVF7x?>)?K*6>DD)iL!kX3Xn5~6+;@fq zC7ooVJV#`MI%sRP+t|BG^n(pV+Ew`xX|J`<&%T=k2mt}*NkG8+9>HGG;V*b{|4pN( znQrZo7_P+|F>psDsF)R#cqUzd5^dwAia%#JFdH1rT|gbtn!ERrUI< zL-Ac~pn8sZ8-h-Fp~Mi*dbaCBV^e_|5fg*a6oG3sA?El}9aJ0mm+4&#@tOYKr0uSi zM0pThs*j=I{#&0v4-k&OrS_kpul*xM7R7B41CmB*UU3gVv=|~!-6+xa0uy5Wj*b9I z&-H>P3uQBqLbz0Iv>S2dHQ8+45B2W*c*#8>PC9kata1BKS`;dXXsA-BJLq(N8*c4C z(9P<~dTxH+gpt~%R+Dxmu}$6MyR>24&-B0BzL~+n!R!W4yQyqZ{BAT}(*G2?wJuM| z{v47veear6)DhBiks9#<3lIdVhSr$3VoYe8R5A-|I6X1vSJ<1oZ7>o5g~Fc03%D`! z3gnInle_X~OJI0LnULwhk=hR*o+1V+9kArt34&8WT{inSms$YLctwRN2v`)hQ9D5q z4G@$AL|zGS8omi+PN#p63>#dK2#o`F1cCcLf7SNv+d}bQOP^6s+l6h_@(ur*Oiw*+ zF5>T)nN_)vo+t-uM36qXey#LTnPc%U#;fE_wKGy zd|F1$Ds=!B;7wsLn3~BKS@*uIH^AXMnwYHA>K3q@GL<7CcLMP=u|P_0J2S>PrzRz+ z5hSw6+#DpBYBz)4LhhZ)zr%3mZaJrRe?I!~fUAcX{pVl1Q(J-ihxG$e6LYQQKnWPX z##a^uztXG-oTMrW04Z5BF zhAACe?~aSTUAs9$p^i>{YF_47h**xf%_{1ApLK@>6S4rfYCtugSIWw(Lg)oHkqvho z{p~jlN?Z~MBv;%Sh}I$80D5@a-5yjuR;EV@=Y}Hr)6F0DV z+vQ0Q&+&wq2`k?9KOKv>DTxSWWRcl__Y|@_sIImGKKh zmjSp0w(~f@m>tZb7ovbv0*0<#{ zJ?zOE$f$L@DLoe1c3e)K%W?PrXu8IzO#82!T~ib8Cfk}OyUCuKY)!Up+cu_}Y}>YN z+kUU-zt-Do)t5eWU-+G~_t|IfQ`G$F9!wP;KUvDRQ|R?{QD@DK{JsbY%B&Fjp2Twe zTq*>)&RaIe$VhxbJj%DSSl+J!zOyB2tLs?u-9#ban_jJci#neaCa+KS13$caIDwD; z07dg{hKrt=g%#S{r~v~zt$8Pm7RbeLO;5$-%kDvbJUeIze%LbAo787o79Yk7Sw4Vs zlhIQ8UZ3dB#j5QqfI2pMso3!KX(eBWpzV$0ZWz4u+YNJfDh`~_LYVPky=f#1W}a#4 z45xlZH)^eisjmQfUQ*{2RwOdhtwhrY^Agre1Tapc$6XNg?8PrxXioT>Es zThsIkkHlBWXhQC6oWgOf%*^Z-q~(+2{Cg9-4X2jfpiw=Q!>!KfJXu-gc1?`XY@uW2 ztqy2Na&^93*{k6Hcjf~EE9hAQPhOK(puey?TzBr*6`mFX#_cn+OpZM`mH7xkNl3VC z5%d}jHfy$n^~)Q;EX!c-iQZzPL#HXm5dUG0=gibqyryFQ`o4l0c-}*y10e(h=w1tb zPd{<8ZU=Myw*tk87vYzWV=}=h@*8$nYe-|-QT-CTc2^!YSOFj{kV8VdBOn}8nl{!qZqj(IlQ?Q6dLZfYIJe{zE#Grd^fxJa46$S5dkT(0#mI$kf> zgwDOS*SlhiEO+LeX*G^vj7t3z#(c4*8*=etJAitE&WFj<$P>%Jp}ZFL{ak{z}LnD&#W+@ODP=NvPLe*f^GAOx9k8`*4ko>!^p5WErE>L4y$VGi1$ ze^&(D4*F{M@;9>c`+w3QHlJQX(O~bSr63^j4a4TuNKFa3=)7Q%6Kqa}LC_{c6F|ar zFV*VaNyJP``QN9d>E6ODHSt|7)e(4YBE&usYm_m)2xGgm;eFS9uYO=dLB(z;Umv(U z^(xX87mR=*Gx_42pB`xKi6|gqds(8(ahQP%sH`9QG2vQh@ALeK$qpk4##_Td@>(iI z60hzfqp7dU#%nx!eiY}W-O;CBvt{RA%gbr?>*dG&5WP2;xURS3fpbkK60)*nw6uX` zV~RC33d0kU6oDy z;UAVym=*TT*{#C|g#A=bKF2|dElvbLb`kLDoIZ98>B2?!8}8)A%Ni{V5}GayzJ5Mu z@#DKf1>YT)su61GU7MYk@xL11Pnl0vzfmb+~X)VV1qApw8UPCyPUasSeh`}2pq^Yeq7(EHAI${bib0<*KXU#>R?0aF$R zLQjmB+xWO6S$m{J`J|}ZW-4%9eyh= zgKs`n7f7FHph5rbo168b>PU}TJOb+>$%|Y~Ao}$5ezls`W$=K6%>pGFA9&sc5Aw&$2RUD9{2XlQowF4LOP8_B!3zXYP$E(-1C@`8GGemZ8!SR z|I6XNNFHpaVmlO45!E82Rn$K^^1no_&0R zA}Rz16;yQ5e$g% zj~wj64;8{KeGe_4ZyJLq4+jr#&)-h~nb`L2i+=;V_a(3H>&+irRqP#SugmvGeYVF7 z8Zqx7es_o;L@oih#h~(^c;m*ZoA5rkfGk z>u0}8iFYrTr&N8cx556lRM)#<*Mgmuhi_JbennoyES)_b`rMZME!J{^e=>vkaJoLCfrI+tSDa$U*tU#iI}`@ueC3%51r5^ zIC%B;RIlFB_O;UXmTm9CI5@c8?Le2o=zu`|PoAxRzLW$(0IichDUcz9-Ny>6N+!5v zbknOwXg_$is?S6uNYzHbXn&CvUTXKbsi|b@h$M#bEwfyg<9=?~&~VR`1;>}j&85AZ z@m&N)Xcbrps^Ia&o7K)PQX}jHfo^X=IyU#;j7=8A$mrDTC1)Q1*1)7d+i6)#kzk>@$ zW#l)1Q;T@&C2U!+`XczhW~ZdAtYATD)l8>2##kdD{FXv4YYb2c4n^T}ukajn@-NyS zg{He)IZ-ygkz@95n8BzScV(po0}_gr5ng~dD`8mmB_|FH*rOwpP&|cmW9Kg~JFE+D z_44b%3?%HvLm z#|(sHFR*u=dm}cNLNxK#C>sbx&|(7!=jg)&5PhIh#;=-fJ;G9)HChBjZ@^nf*$HU# z?O_U7b#GLqiXi3l?SAl?3IZ z!Q}-nu5xKA7&6sOQuhYmKIC04)tM(7dA2>D{}d(k!uGe@73qn3>WWuGp>abyY#3R9=|ib~4os|1p| zM;6dRKLB?FYZYLcQn4|qHT!UN!kx(TsmeA;*se3hgk4U?{W`0vA_BY|$n}`OJ*Y0) z&u32|!2wjC>uOio>K`8WmrZ7?{FT6<{o`Q|9gmgAB@5tKML$iE2BZ0Wp*QJtC(1a_ zkggwFZrHIs;n$eIU9^22%XFY|_pl<`C5Cba>&E(G`yV3lW7z8H*O+;&CJ1^^RDmWi z_cm?UiX)=;>|Bb;M5I7Jy3b+v>7Lp#54Ysf%4xru=_;^OQwzV8%Ki7VJtIK%=Kc`; zv?P9Dz>Vx$PU%k$S0VC7$_K?e%CVHBkt7Bzxru~9t0aA1M1chtf;ckUbv0w#*D|%V`|bN@m!o+V*Xz%V zKK-!wfGJ=~Lq&&3|57UGjdr!h)?Vh9n=1&HAx|lM-=pO$*Ucc@8MAcmbms<$5C2ew zwLtW~Ucv(E)BBg4$zvn0^`)UB`$oIrY<%fXMnvP45A)x(D307?t@q#MJD{icO`N8-zHsum=|IKq$t@^eUq`M-ZhPvITKoR$WSB|y9LXlt`I7o2 z>ow-&rlCBh?ZS$JDZn(A#p6lh?$SGD;J;^h&=(Vl#6Q#*i>!-Cr1ij~nicCa*`|4TdHr^ntmtkkJpYG55|exell6qjlMeW-93Q zjayNo?C#Lzq@P+!Xcb{vE;!~A(!+vZ!4LfiWdGDhOIa@uA0l!)fjIB$em7rszj7yX z8nECrUj&_U9w)@7K3pk!z1}zG7%W%^eoyXND`9$gdRV=E**Y*KUYutGUqro$z~3AS zL4xrmBEh=h4SynD=rxHX^Q8wzcsbj6a#dGMBHA#}cBTHu=2LbE!wbCbhAnb50H3$Rh2#i$((4Y_jTs?Y^Y zYcp&I=H;;?bGQMc4L}J8$g*aNCcF0z0P~3D(C(>WoMS56tr79)$>1Vx)h`1nr;`NH zW!F&Sz&7YJkefJP7j2_j$JL}DBP0CrbM>wP2`Hb$OnqsmR!tomYMKK;RF1fj5d}db z7esFwtNBu!tNqjiKf$Zm1fMaFclrm^JM5kH?fpChA^S#ay1~R+&x}&J|D>ZEVpwV2Y&MvM&T#i4z@x)9K81$ro8({L%zQ52KYGaV60*;T%(5TV1|wZ!5HGZm*Up zKNT}uPIPC^ub%i<+4r9gHGC0*PH1H$n=UjYlto+|2~x=!J+R1iFt^?NtbeQ^^XmH0 z`-P)Pju2+A?_jO=&!d%7lF4h<`Km9zVCCONc%&W@YPSGYME5uN!5?>kK$=jBU8Hg` zxQr%5SQk#IU6(nX<0-};{AjV0@V~3Q>G95bdpKTH!End>a>I%o!DEi7qLtE<|C?Dt zX2bjIG%o$p?9H|7I)L70R8>OhheKrvvk{2^aGXbV1rYN`3En4#K1o)m-rUCJ~M+qrzw2Zo2`Q(q^S$W7wCYt} zzhGACSh>((CQ{m9rqzwP_HPG5J*G;?hYS!gxib&bZ4w3x#H9|O{eU0qxAr14p2)bR zNZoI{eCK&Q53{S;+;p~aWTHx>k>xtBA&aCKSM4(zCHYayWU^mG6}GpRpv#m}QobHB znfxMaoIM%7c>1|^Y1=#lA%v~zHA0e9sU2C$Z+q!n@!{ol-?vLWYT)8L|1W?*2LnnH z_#=TfzDr`~@ugXG9&cKio#*aEe(`(M0lapGPuUX_s33u7M3{Ep&$cU)qD(Iwvq%_u z49@L7^i)=NHo1>oi4BbolC5eFK9{>=tSr~&L_+V$ZpUQqsuYyAWGXUDQ4I#|==7`! zEGT(l^D1IE)71hNgX9YWM*bHOe7QGw!%;gy)S=32;dFH-6B<3h;Y^q^Xh{pFOVP zxpM|T%llw8Wf2yS49E*1gjPtX$5r<*ldiw%{5{z71EZw#JGJr?rh^J0k%n6!~~1~h!~#T`*q4fI*XwV+Y5H##ZK7y0H4jEG2HYmQBk(Cz|IXC zIuROfCwKYa{K9#5enUh>1Eh7ne)DOmG=&2ds( zTcw&Ifg_Vv9W-o6Nn1*F=K1=f$-;IaewNciq-ta6%oR*b2Sj@x;(4+FET!zv$@qUf zK?@VI+HY6>0a>K8M!1-Q3;Ae`lm1~sqXR7K-7#bkN2`cYIs&dDA~%D~1INf!G}t9w zzqGW*TO2<=&auJ+BXQYk_J+ynI*xkY2U*j{H9g1Y=~S7r#Ry#!@VOy$(~Oc};Rws`&0J~^H2tITa=m3Vv9>0( z`+QL6_+WN9u;O^Jak;j1Io$OLc7uCj$%~I>CffrGP1x!WM+BM8fKp8dU|NfJ(YCAS zGS>71aX-Eskbe)5DhxUn8)_W&0%PQXWaL4#EFZ@0RW-htE+Ob%${}X<)dQ;>9BoOQ zFVj#%_F2dwZ{@&sZ@_nNKo)C&1b+JW`zVzEELX~%8Df{9?!ToB3GLY6dp#m77NDJG7Am0eRIAGsi9&)VnUwFo0#LhLx>Skghx31r$QtVoaVK^5Tn7!;qCP_EMd*t`o5xy z3J|O8J8jZs!3OjI-&3WrWhel@9npA+j}6_W#_^D0!vgj$cf$e*p_~ioz@NUuWUs|6 zXI5J!l-WCZmzp86&N;ZSe76=|)nIiE?oXZkEH;~)Y0t}vvcRr6 za^{226j2Dm92d~5e~E4-3?u_TUer&UmXj(C&fcs}7t1Dic2g&oNRUgH@Dfo{{r1EC zq2Z>o@Um)WmXXtT!(t#2LzJgs+1}`OZ&vDQS{A1<%tH&$o=1bY(tKY@!<{<$I)==Yzr~XgE_lggBz09w) zam>}3Tr`mg?GnMQn?lwqa%1@Dq>fB@?q|=~NJ%MC*#}#~g)=ePI^Pn@1(cQ1@bTS$ zzqmcRK=5ClrlqGU;G~+^73VFQG@V5Jcs`G#ME9zA)$#DX4h)nSHYheV*{YZ0lX!BK zw3~Sl@4o7zVoDiz8#99R^n7Pwt>3wh_&{O`?@u`)#*53anF+;6PAG80mN?9odyjYj zbeN2>l(8Mk2o3IvNlaulB(5u|jxGAQ#sGO8lHB=cAYvdu7iD?jh)raU?nd)Y41T^_ zPu-rG+TPZ#o;=U$q%|FjebcnfMUH&w;)D_uAjVhM`fWNu!AHn*uTRVWZpkY%PC5yW z-|Q-#!V0Qqup5m2o77I{YD$exE2-virWx@vq`lhg+Wht&I@t8yu&Va(GDG~>{IccV z35WCMfjLERmGwOUs(@v>KAoTpuPxq%T+(iMzy~}QGJe`?jb&DvRE8Q)E6v7s_aM3F za!JJUMy}%uzUPgzjgw**FZ zE2MUNq^6hG=Id!O*P|8l;TrOWp}k4Q&IoP+7t=QCVF_m@s9qTdKOZUt49q|Av9`Lh znTdZ4b_X&YoTIG}NlNEqfSdRRHC4yhu{U)(bLYatbG@_+&*?-4(F;TjKAn_SzBMp* zm;m~(;766V&Q8?al9JG(WS;)Q&324JI}@hbajV@I+=|1ez`@(OIC6{SHu57*XZGgi zi$%w^dvWy6CJKM4$=W=HzuZ_e5y)&7wzm6|=4#j1LsE-zk|OhHwZmhKq7l=1Zs!B^ z78T3Gp|^lfrM`<6Dx?Vuj@Rw#CX<&3rgzJ!oDf2|UkD;21mhsfmb~8()sZfT>UV=Y zKW6Eapb$hbNwS(DvhXpCNCp|QHR`p&&nJp!O1@`@r+v$OF-`0Usu5SzXkJA7Xo-6h zz|KONL5;R7u}Cip3x0)da3- zgR+}h`$?ffX^(wlgH!Da_aniyRdki5hn--;n`?G+bf>rO0{S?=*~{>@C1F&kkgn?- zf%@tfUX2D8gJA9CXr0aZu7q9oKnzfZEA$xGGg1wLq&^l1C8IMsdBZEa^ZgYwO`XL3 z5*5n#7NpZv-nbsdaigxyZR1F{izgFO(Bz*>S^py1Gei;o6X6%rO*}UwCCm&+IX`tU zu*fy|G0uBub|NUAn5R-(0K+H4Y&`QVkmiPoD~IYb+)ZD){#W)VBzA zWHrv1_~fRnX7ug>#F$rJI%4zPR^hn@hv@#-pu)7S^5Fv2XK*Bl&3RP9DHrvZZ zzoeL=XxG$AO`XboClo7XB`TbXB1-A1s-<3+$E9|ar3BHd#w6I!Uo7`V6S{>oR6NP8 zE?8|2_7zZgUgP>7=%8WJCA9w2!aW?)K4I?%0$Y51leOP^$5K z?_)pW_@m^zUQX`4R_VSir(~*OTcX@i(Bk-`B`OCOD3FRym1Bo?UA^5-zFMa9dE(F{ zdf;nmYK}Q~e)8JgqNwhcYt<&rmnuW^0>L3;z=ECgx;;Dp`!e$0ek4!!T1RR0sdYJ} z_kmjl;Cws}Oo@wrrwJief`}jzf2Af7^a9_U$Vr-GUNg5ic z>tffpb+^)OH}7RX&DHJ+99H)QCig^k%7!EPf$=|cN~gQ(rf(2A(-|5DVnvj(g-i|F zkIklFVGnS*{eC-(1s?xKx-S|=M+^}8;~_u8DkRBcMB;j5N1JSe#T?sMU>Q-w7_g*l zs%aJGPL^7T^odPih3s4WiE$XXy!2+U#v0En4qt*l@fJ}J+VSzAa`dn_a(+V#`A0QC-5Ru$8HuQ)tDzK|tr zq8WWs1YTKc^O8M+EmlH|lA@rjDW)qXI(2c{&*{Enj0paSwh@WFgvh~E6}+pZZ3HA> z)a3E;eCV}mJekV7=N>=Z*U0#c5=>~jm3CLozLD4AwdW`G{%=WnE&A9mS#8p!( zhK1eQ($3RXkP1I&xfjsC>T-YX#FJH>jhJj?v2*?8VwGKG^O4BC)W*vb3@K*Chm*-i zf}1}yc(9-7%)bZVhgrhh`g_~k=-mqUiw#B+lwF>!GnWWkmY5rqAUBk#KyqHUo8kO0 z$uVIkG-EQY=I=Oap_k&!gn`g}`ZFEunzS3j|EGfPcwL-MEa8>WXiXuAM_<@DZ1a|+hzz%u zw{22h5S1xdRTEw`=PVM~5~TlU5NQM@*k?9Q#NHS&Gc$|P-*bu%=eeMf*PywTSPWf8pkQufd_2eULDXix}M9 zO-$VfyQk>h^a+B zq&wd`6ytAV4&8Ezbx*bHfaT`tX$cTP-0feJKJo8?^8DKVIB00r3EkSkG!PK#bxlY8 z=!cu@I1AU_J?BmNCQ4E8;h0wKQrctqr5ScXXGPwR=OqLZH=J&KZ&zH;=H*y7;fAdR z;-SJ3;w&)v8OVCrWC1O&xfNJkJ9EAZP22}UaDD=!UNHUW;nc+mB9NuCe*LE1CO=@> zj!;F=0u_9H1gxDI>5=KrO3eQ@SEL4IBF|Zt7gY9Ka`*m8nYPG8v!0%uWC0Y^={G>xIkkG;QIh}@tvjI zC^G8d@yJfOddb9=$0uFlNwC(mv?}Zwt$Ik{BK8ALGs^i&rN{QI$43``+e;BAa~8)U zMkJ#$m|~+BDkMgl7OYkW8oj-_RWfa1!i~mJ-hBiHmpUS|KhLet@Ef+0OeF0U%oj<+ zNN@_jO2pZ;uHQAUOTagvB)98@c{sI(_VirYza>b9=H=0`Syx0lnV{*hoK&sK968`5 zNJ3jR1}`kg;@~{&5G?STu$`8a(dD$XP*59i7r@yZyA7xrQ+VT15A54*pEyphG2f|w zkLjA)T=iev6-5<+lJ_k}MT3I&qauPM;miKKk5exfMLSsI{q@l^S2F8I&jn$#G*?nQ zXQur;Ia=4ya5ExRX>;Lv7*wD0?-vz^)rajEw;RFerq)Df_A7{b?D^*Zq?<@-qm zOox3#BB7R9(LWE2ahX{>79-Id z1o-%TAp``lW7;d|CcOnhQsC9@e-Yt}NfKf}6M5ISc;n*Y9JadsegOer2Pi0v?OKTi}(867JXv#E$@h=2oej(NMWLbnzUPD}tSmH`N`Zk#kaRD1t?L#g zrMNR9HuI^*RW)u}Gi5PWjB)w++d5ih-B@jV&kFD!-jdi~^*YK*(1=~!mzO2jWGapmYjv_a2+Tfx5 zxW6BFfIiv?2T{aF?d(|8sehiT=F0~IL0&Cxu%5kqm4{3O zTaND|U{TvOQ6`-&@+k%UwIDc|<%e-lRKKx0hjZ+=VEQ+UFcwpYZJ_QwV5+GuRgvGN zrOOuWI(NR}TX(**NhLGj+hs4K@gvTPA2~L=+!PjO*v!!#jA!6H?4qQ*VS6{7Mr+#7 z&-Ws>G5aj~ati3r9K{QqaAWJ&iGM{KCdS1T0zpGTMZA8T|6#138*CR6h>p?^Lk(S5 zC)I}V|4J@qdndn(&=K38`=K7J8aQ z6GX*kx5qL3(4b{ z!8*2jg~s}rBf6jO{iCfi1Oeq!=HR1V{7OcyWEQ?|b{Y;v=aEa|XivNZu zD+Tg7uWHkzodCoArS?{e!teoqG?Cc0Hc6zQtFnBH25B5zXPB~)@T7_gHeh$yXLTLe z!vvxi^At>nCJ8~wIeUh{$(}n)ZdBF{F_15UDoiF3N=7YzhFExZe2nyzadrgv!L^)- z;szt2K!vTN7{DOTo(nY1lcV{yMZp_<&7@?L+k0iMw=P!wVTLG)lk8=OtDT*hfaHfR zjWzvw_HQoy*7fS#%1F&5->%MOxw!Z*2aXh=d6Q1ZT0{yJ2=NmLnwJck52KCD0lt&~$+)HfI%GDlD^PYVlsD=sIpv&XksYoh%(7!^Q9O+`1>_bm@nzElbD zhU`jX)wp*1@)i}H@gugAzri6u?C-Y-?Ml6sIlzau%&_N)p(_a7iM#&4JcQ{;D zHZ5|9LU}c+b-vv_Kwbb=nq+Km5ZB80Yp6^#1Yb?p*whReYF52%#vfHgY0y&J>P47 z7|cb_=aXjhC_*8PE=6O~a^0QjQt}2olp(^xI@JtCgg1dz16!LU%Z7kvX-}1e1bS~) zjDKC8t<+>XMuOt6o*Ehi1P;qyoIe^Q>zQ=QP>z5g%CaiF$F^AyMs3%Xwf2tQcJ-by z1DJFQ5=e)^yL@^Gan7jJJIQyP;dTDfGSpL^T>(n4!iYWf&vbq*dJ7lPlCXSHzm5DPlU8hz_Lib;_y07bwq7B>lso|oCLY1 zP4Dxbh-&lUkZnwCHky-=glJZLR1%6?tC%)a^;xYhj<+yoc!x8B*11;Mrw8Pza)rV9 zpt-5FM8&-@%`_~URga+YoX8tHe$=p0n5M1?E(6mTQVpdEiyH!B=>y{i%7BGap7QBZ zhbR69D*CK2X&A!IEiI{fAE9anK}iiS-a^GYt~eUsXVsYSEAExVX@S zM43M?chAL&C5SvILEXCD+ac$ioL>p#&JuUc>QU0^(c^~+u3X`#78j-DQ(XoD5b=q6IqTTp{#p54V-x3sB>Xn_TH>Ls^8V%qrfP?;v z#|GWb_ttD6C& z@ETVKXZG>wv^IQYY3&B!DHu3Rd5ZegM~rDaA`a6DG~gu!vj+7TT^4 z3O+P(K#~RX^4HwVWEj>|!yrs`%N}8hZ)dUsCXHXo`!RBfpA08Mi2ve+cOralebW|? zY$6J~+D+f>vy&OQ!X60#qBOU?RkOcYF5+`Q-S0AR#%Rrnca#OZ?IWi3cQqDABnO>@UIB`#1 z>VXMFZb0u&9Y^Fk69oMv7NKYIc)x#b`*_(bF2C0q!;YFf%&)eEjf~`ex|=O*yXx^A z%W4lXh~fmb^44#hK~g3D3)o{oqEKHY2f!#!xoWwZUZ^-tB21#B|MFQ*Ypegj06wX@ zTfdYpsz@wQT(Dt1vz8)67v|@tmg5U1>!^TtD6fppV&F^MDI+gm_gVa<#{su13 zI(o6jnWFGET%PP!8$aAE*}IpR!&!S7)h;(3|4o0|{sJ7%s@Pk#zz}9thgjlhJoe8c zd6=AXW%vBzWGZ5`AkuHcr|swpLlsN<%eMQ6tJV%gI@phIhk6uvXoQ|I>hT{faCX=j zR8)VdNNn}Mz+zb`^ z-Bk4jg5xd8f7OxWL&h1Q!k5?dfn<}2-RU1)@9}?&Km1L~0G9DVpW;rJpb|yLfFxQT zl&9co%N~1lceB&H{#_B^dPyOfYyAj!+b+qBEJ_YicDEVjM%F3&3$HOj0$5H6;dzs` zAyD}eAKYRz3}7aX-PyR?s6o7O{ifTn&YEbkO*!nx)R~%J|1<2V!v59wi@bQ+yy>ms z(r!BvB+PPAE$K83cL^@|>t6zfGG^bMJ3$0J_uEfs?3M0cYTuf8wMrC&F+ea(*kghs zVgHpA1jKxF(B7aJANpF`Gwnsw?pFfOyT8CE6}Y=|sPTBNU9%hI_ zY5F@FUIY;wcAYv!VnWPm2pz1^(?=1$D;fE6z7QR*r8Eu0@~5MSHo*c@V8*Y#rE@%G zWh@YId-7!m_hx2_xrp-$o7*!dCLkgFi3F6BBB_5%?ou%Ltik8b4>)O&gh60py2^(l zLITui&M&;Dv*x?F_@VJop5SBM!<76lyK>Gt`;-hW?R+b%kf1cnmAde(tXvVu+QTu< zy|Y+dlfmw*6Aymh?(`;3pODikG$dr?)P8ff=dsQY5^!dwYq=f>^h~xZBWs^qh}r3 zb6`*XmXuh^6Dcsb$nnPw(7DE;E=!`W3XuBY4+=A!hmpj ze%T(1X~l!EeX?kt`P3D}*bXb*ZfMOZple_{{3Sl(nMnfQw;kX|!g))K0|l<1I%lm( zXqSxW4gl+Cb^3Db+;BQ<5n%D}#_)CEY@wkG#Dx0?sfx|1NbbR>w1^9rU#PX`Dfy%h= z?tw(YPL{V5+;aAtp8WcU6Ug$}_DtH9$(5ZSKHL|8p^1(sMkDw0b}d+HYT);Gg5G|U zx**RiaE+3k9r$9!?anVS+)4dk-_)yWiztn}Kl}hYD-u5{IK_iQ19&Fe2_iBR*4gx^+-$Rk&ehMn-5tDOr!asYS&Y1xRe7?8>^+i?#8y8nA z0Gc9@5aTJ66%-R#4bk|tfrut+YM{Tt#C-l9PGD9amnXQ00{p`Da`Sqr{}IxQLc80r z>BYWfpHo}QeMGXb2!0lOFc#XT@S&@#E8kgJ8U3Nx{jgJ|?`Km}oQH{><^AE>Y5Buw zBB!nnqjVf+Uh(G0AWBeyX1Rg&qyO8V{Xd$oyQeO1!<0=YVk+OgJf60-EcRXoha3Um2S%~FSo`YxqIw}CdSA2 zFIq2+ULVdiz2EOiogkqxuu13;zU8zrWvd0tP|Omj*{XAttv3Z8ZfX)VTooyoHotDP z4v*ZVOQrje3wY36$Mto!nt_CW{Ub0w30M!HAy~}K4}mD)P#Q9y`X&3Vysjo$xzhsz znnbyb!#0PkdY(3mss$vCP5KoiFrmPtmzU|(`KnkvM9zK25Uh*+y(;)1B?`P|DppQg zm_HjFl1A|^FgCa*@%&ApiT)twI>mMCGADG}dnFc}hIQ_OjP7^quOo*Vn_Qe`^S&>} zFfMC$sP{GuZBSmX;Y))_W&@GI=GK1HzxUgqJv~4Y5cM{9| z_ams2iIPSbVGuKCLG+0L9YPReXvkinwUA-2Bhyk#h~aHyvJaodP1}}XI>%Z zTT99xO+j!S%Z)aEB2INAbxT!O_)v;LE5f)|ru>>XH6aFH;bd|^5I7nHpa7a)f8<@x3x~$12uwmb*c*|qzhMPh9jwKVrr`QZ1;Kk_Zblj zOqT^`+JvQ!rE$wHuoI3kjKny@mTNSLA-}1BgLo%HyYjFJ`j*qG+e1A~4 zbh(+72X{G3n{iaxp~^x8cJUoY5>Y9`B_b9*n$_+MkC)4GMaq;;Ve{x9v2n$9zual# zy*R$(roJ zFTz=$xS=juu0p}dTrTXf6zW0_tN&1)@Yxao9&8nV3Gn?%V9K(U*5%jVQLVk?~67c#Exm`Oo30@~jcmbtYQ@bgEq8#1lTL4^M;D-|Y=APd zlWKe+Ey?b$Y)-_@-MlepR-aT>wv{75g@Dr5C09`_&8$RjX8yj_%bJX~^|`c*x{2rjF`{fsY}{cC$& zm<-i&s!UXsd`V@v#h9iLUJ%QSO_xGV#J_Fu>-;qtL0FhM7Stag_$drUMwamU(J!PM z%gru%T!2o`<e^XPLfRFvzqyL_ zL6aqQ^%G+=&>&J7>sy0$;0GMYu$;EqKoS*-nHgaRCkzkR z962)C?s)YQHZU;kKCIrleSSL1PcANBAH!5x^Bu-$@gc$?laTQ85|PC6FJF*;d3{}~ zEpi%qh=_O#P_sN=y}LEd!Q* zFVO$gWZ*HEDR->21qKCS@es%@bsSdfR%2JGzJW5=t-b)dyTG5)BbRCu_Efq+=wFkj zr)s$<&}Eoaw4D&FtSG2MrZOYk{Ak+SL5JKpynPNbbVM?i@?n@zlZS#Qq(gFGa&Uq< z(nXCoh`sAUWPGyZwm4C=06$ZU5G7SFPdeZo*K_`XfrWL`e>i;pGCV%I@7E8q`G7vG zb)BWyaKH5AbNTdaY3<3bYDxDtoVd>c%X4+ne3?%Z1`WmL~0w1m9*_ zBBA~RRZ7OLN0!}27ESR?C4T|Jj`MZf>=f4PLapw~5hh7qEA~qZ-tCHlus)AJ($l%mySL&oX1Z@znImweUNUW;##yS+fkuEu-js_A&L94En$?g(?2io zir1%C5XG?~gvyw7!_aU@gk^l(u~-p@`A0Yt_E)9$)BKVWr#@b%^H5FQ7z~84w{`=e z9j5eQM-CE%WM$e!ptr$O0*-F}aQUKqgDK;Ca>}eB5H5S)`8|IU@K-USsw^NV-7cVa9wTJZqnGcZQE93+iKF-Zfv758=ly9nxwI98;$wx=biax@+X-ylR10eSnFCB zsxF8&eS3nrw}g!|v~(&g7dZ%}?`u6a!)_VOmGywSrZeKC%Y>%%Of`yI`M|U|oT4+9)59aQ;s2NNy zSvQ-bLe;C*4bJ6s!G%5VvI=7B$Q! zELM&(8iBug48A)MMY49~;4Mr-Lsm8^d+a}MSlFM9+y3{BfH3^(AcY%P=vaE46~_li z$5S0>h6D&vq}sT8NME9hm8UoCK6-cy_Fq^{)Jx z?;|xM;>EJ-yZIz=|Ba-Z%2UG#V_RR%jI>#_5wg99$a1^R+IV7E?#;2o4YkJ^MtU<% z6#A{r8=)A1m0z~ioV9uRH5%Q!fhb4x+f@Fka2BHz*g9WMI4#u1#U%P0{X z1gsu9?*z~@k=K6d{DPgrh}S@IQ&XhR)jR1?UI2N6We!2ho}~q5!CbLDsl(5h7+(e~ zt8voF0>?J*8*l06gY^|0uVGC|f1$rLjCkbb2){7ks4y@k{i-F@Qc{O9tDp_(lfTLF zR5r#eWN{Zesuu-U^l!Tx2iIlD%g>#y=xRxuodpJk0(j_cHf<-;SM{X9)*$f3A8S~1 zuWfQkBW`@7%_|QcFrJ;8?^8J&9eS#CEWhDoRh12M!#6fXJv^Abyc7*TrmnPIS10Zs z{%G>@r}2C|;f|*p;@*8Ewqt*>@pzu{82dYBN~Bfc*rs3k=1TeBIxQ)oa^(}GN=8jy zi5ayXv}QB;j~5<;6C)*0g-(|WCyH|Y46vM!I@O$R_Uy&+bM3bQ zH-UFoZZpu4^GhL3G-)${F`6euiWL|G0F8X6K*l$wt`Oi~Xx8XXoN9ocUO+YEe}CZ^ z4`5;AH@7|w_Z(buk+?sq;}kiJ`h3qj%cJyx!7!W?%*c+Kiy2XR0 zY4F~B9qmt^3tB3K)EK}JLEwItt@>lK&AMMZnwEiXe^~e(*5hrG*?k9Zo4L2FdY%xI z5JAXyz9EZjpE?VRaR{SiD3moSLWbAkZdx3<%kyS;?NLcWWc^Vo7|Jf2F%zmG3(BAB zEo$ke1}`Ec`KZszHlO=;YOq%ZZCsdC5gI;7mG%gN<1(yoAtH&wih_sDbj&sa1Elb9 z;;_ufy!`nL`?N5%os68!9cByzE}sp))s7OE%N))8l?DUghp{$p4aHXecy?%R;qAP{ zC|3Q@%VMY>Qe{JdpkYXaEDrO&4jK8i!cspB1TX|0F>A9km}6UzLtMivLSU6b7EMU3 z<#GWJ;pFnTfH@4-;Q%IixGsbQ#vD7gQ{-x-d2d9vGQf?*Rf@1U`J3Z?>#_BTh$?Lz z&jI{sp8>X}ttmeYBNnw>ag;#^m*kIM90|xKO_qhq6qkZ}rR-#~ay^~EvGxY7*HSIJ z>_uMC(-U8s+a4?EW24h}e48F`)pA53UmF=F5e@%EP_O`-xOs75=fP8|l8abg)RL+h zhmH#R+)2}6Q+^BPAr6?ORn)SSO-x$%RxYU}B=*ILl1)%jXZJ4YaqS5XcHsQ|*MB7g z>@B+6e@@yA^A{`PaT{@rK`~(xrn6_XlarRV8zavufzuTW0B&l&`oo`)$1W$w^FhO> z`oo4@Lt_V)4Vs)Q3pGo@UuksA<#zMdC&OdB>F%CVD4u%3y2+-x`*b}2@$s?4sSW&- zh(eZveNIZ;Y%Jk|D+>|C=>S`kv3H>hKgJ&7_~_%*083utIBUg zXkZ9ZMjlF>#OJqcGWFg#%+;zIhGeBCy;M=+;^HDIV+24I63TO!-~Z&vQ3Uvq38B;s zgBR`%-QMs1eFeZ?sW5YY^n5n9z$UIF$S$T*)-5yDFVFm|%9(0$`ffygiuKKokf?&Y zt!(q$^qmTOA9ws6(rZ|m-_Qqlj?VkJ|SY=K>k&~tDaDmj`|P| za)1A?>A)pl>z+{SXZ&?P`zUcViO7Nkk3A`Yi-0*)S?}VBxszxH-x-21f#UPx2Bimw zr=as>=n_3NH+?F!{S1`ba4?u?ISAdm{ov-|4#5uW^fah_JCF)08caH_=ct_~%KVqP znG=QZ7v%z!ItyJ=wcIkVbs|9PaeQ?)e0H;Y<9XxV=_yF`98jZFoqPM-dnEp$^ugD{ z0Ui1qhn3oxAwegdx9}p7b3n|}#0J}GL6`G%y`ToV_~j?1a$)B?bkR~4Ep3K`-Gya) z2fx(1R=Ik?T*ma-MEZn#h=f}QB48+8?{O6vIs@z{!1ZfSme-^8$yX?i(FY;EG!KX} zVLRPhzTh>tlrj|MTs%3ofp1gl85VbP=YpzAD_PXk<>LcyZVUbaua0s^HY!6y840uw zz72l-?_lRv7=!8+3+8!RJ~b)f_0Jpf30 zvRN?7aM{;rB-+nF_@(a)9*0`(5WXe}8}xIgY{-<=xEbf#%g-Mdq1eK##b<{(z@Ng@ z2`s;-Cok;~OE)u^*)j?&imU&`7-n7yMc(-M^we~v-ok$^Ue8hg_#c9J5(Qu_>Q^H4 z(0q=#jF_(pL>&pzgv_**G0CE#Q!AM7{*Ls0-F28-Umw>3X*HaVEmS^leS+(1heoem ztZkjJ5R@7e)=NyZvTo-^aJ^0MC>De`1JFIYDvMDMS6n(1DHP8Kr z8`}O$D8tZ!?gO zBm7$4d(*oHi)&7RgNY^k1#u*KRls={%`*FNx-i~fXy44AdVOMPuyoaVhPA%7mX|M3 zkO$iU>*#A3(5hBNO2M!Cnap3CUsQO5K&k; z{;ux|Ukj8+$b!FbNsMkFbFLvTyW8nb$rPin41GkS0yE;bD1rG^j40}0Wf?dGFmSX1 z$)crc&Og*+$#K~@jvXX$=7(0sQ;Ki9ejIoAM6KHzpk(q+x>Oqg9@=()oSUipl}n^! z4Nxmo)PaHW%t;JQYPpv`erz)-_`qy&z`rwV9LCQ3MYQ!x|4E_O)d=D<$NkGGL7sVl zlYzD9PY(j|KBk-1X32YY8tSgDeYdeIZfL<)K~bhp-M2C~j_jA_#sStkZE%1 zW2aBf%>^3p)ngY#15eCk^%OLE_l_I@Uu6mC1NRjoc58A2Xj6gzi7uT6qyQ9X_cmi? z{=B4oWkNddb*g2aF0c|IlA$z-p|tVJHd4McNxqcBJWDhAZOc}x<=2LSy*qdN%EtWE zB^5VftoY1k8>8f_38^5_()ADh~JxxrK#= zDKSQpp^kblFMRyYip5o!z~)XeHJj~=IxuwcJS<+aK07ymFPTu+NMZLA!_2FR)H<#Z zuIYXy4dvBYW-NfG1iXo~eP==iZqkkFmIQlEL`>(4aBw*Z5n{#A@$#V1i;5t*CYFuq z*Sw@Wb9=5m2m5Bp>l~TNQk*Zv^y^j%-nMI{B5{*(W2jo+q-(b+JogPfpP#3j`F0A` z0atn!uL|ER*K}VY(F7Mdb(`lB&9N=e0tqBCp8`60k}6gjaG?y%jZMY3`b-K1iegA| zcq4izBS}}2?}t8W7nYit6K~Y@{w5EHf{ubi?UGfJ>PC;XzthcdZ6d6VlKp+JOad_K z7BUkZZA)ZWaTv-L`1Gso`S^6TJKSBFof(Zj7=Qp)mnlT%EBONDq%1ukom2LDMCw24 z5#FNzr}vfMq~IZr$R*K#lP|`|&#v$4bR{Wis&msKS`N&7O_}=PX6kEXv4g!w8fg=M zim7u4&BoG7%n7s@nw>5l31}Ytd~KS@;)SuN7T2ejW1zR*6j31V@FqSI4z;zpN0@#W zI5A&b7^KUaNvnT@%E-{v^n2EtMS^lb8v^*m|RZg+(Zm@JwKD78#o?&VdGMgz?|$1H+BEU*?O)&#AM)m-Nbf}uN&eCqD-Hr+;8`-2 zJ{d`!Cvm{@+4QwaGg=c=+|u$Z?!n#Ld;b!vr30X-$KhrD{*OPk-l^~W&zbjur>&z1 z_zd6+c#ciLWxp(Pmam`dxqbRir2&+eX;2XTT^y)utaYy^ zJqo?Y)F+u960s&T_mnGYV~ZOF2!HCnAZcX>P(`sUaxitBs~Y+}V`gS$K|ADr(Fc3u zB@K>ARGIIa4oMaFnEgfNtGhg=y1A>=pI1)WEqnDvniy#>YUhK}NtlD7+q`V}vmlP- z=LYE(ktc%v3u5O3F_0&#{fXGf5w5tXNwbe~m@TjpMB9TxB_BqsCTg`zO;U#ZR-^8$ zd?y|!DS_I^_q@nnUoChv&zmC8AXT(PloC+=(ftu(&`ALgtnrh5G<7^opdkRHsEhf8 z=*gKIoQT2Q`0slPSUNhA^YfK^pqkBi9%eGk&d-m3GD%4dlkHT;LP@{-O`VJzEXWCW z$!@Lkx=Jcli@f*Fn$R%QJ>OZ4?H0x@s{ekjFug0SeQSMT&dIs zUHCvNgShaAtabI-_eL)sM1!ElcOv%QG{TPMdNXTk zeZM&(`;O14hMRX@pvXUH6bMTCoO4sc(RhxbRaT#qb?2T=b3$o ztv{X5orjyKOY-@_))KTIljD7$7(^FXc1C?pqAD#sBG9>_mZ^USgc^JQ`jQg6Hsbl- zWg5eRAKCjB2y5n_=2`t0JyYl?0scanR60hylnwXNa2QRT%$k7US-sW1{sWbFi!3cn@2gf&&J`hI&1{Mrz$n<*;TLy8exa-_oXZN!k z8~Ar0V9iVC4{MsLx@cq9s#4O!)17oHinE`766!P$D}+N#5#bAcD8`6n3BA{gdJZ!y zD<>_2c)9OK?AdOUIvCj4&>H~Ff5(vrFmj&1tdK+rtrY_e!v&FSyYe~lgws0Z)kk8yI``hJuBO2if&)!1B{VXZNBlWqC$Y>j55H(x${$H5o#b5rU1&r46cm1 zL*m#z68HkkhJYheK%Flw4Gj#R{MW{W0PVT-N7&_G`mi6^kb%jE6T343U1&32#(BNi z`L=YZouAKiC2=)_marQeUVqD@pB`O4i9UR4zb<|4k)K8>vJ^31X5TfGHRg_`!SM^^ z_^uj^4bb-Mf{>rXuMvzIxJ(NBzo>z>U&glU^TL@j<1-`G&|J5J5mZRmaB&q9Fuhoe zGgT(5bEb(pCp1WDr?ZglZGYxgPoodbOr{i3C2FPd9}YtP%n26Ao&z6H29%#kY2Q$h zfig!)$cvsj$Mw6eJWgO*8dT@zHKEAn>nW(Q7sblHHAa zsrEDCVlSqmK>wDk%&;)hwM{P%%nqBZkukRtYxN?0QIw|-%+h+}57$Y)*UzV|%&Hjz zDF~*oOyb*q+oao^z9B|vjE=n5Ro03~`3n_ZW-G)}7}#IDyvznWc45qm<R zfcy;@0lDo0KGpjcaBUB(>-j}XF5GQD+g6=P>T?>ws{Zx zCu+6A6h_EZi5Ab~FWSsxF{b}OLeR8bXE0@FC(!pil}*7qL|n1wdObprpkwiUKKSKd zg9%n9l7GY;AYMTu&dI>h)kzXxAEeK9Rc6r$^shP(eZ%^mtC6ISn39Qk>yCoIj2^mn zJPcspa#c_~SkeQnH2!{D08n6@txCX11p=AKeQpG+`KGBh4b!)GxbnAfWEbVJ)LDBFW`Wh-`y4l&_^?VSnCYVxta{l8$tA{VEOUOXz$n_2w_FSG$ZZf<`8~Bi17to7o<%b z{4F7&GWdf_&A{Md0i(UmlmqW%y^TFb5RH;Twy>lm?6#im@82<6X8O|3&Pz~b%x%3h z@Ov3eO@3#mK*`0ACT~ISV6fns5LQxDHD|Vx5DA2mkalMD7npXwV}MVa7eF-kCtehE z->oIDfY=ozI!RRiRrxcHUHAp#WFRd6`++}Uj)1qPJUqge4&+0Z;}O<&w;xv?=i8*g z|Ak0`w5se|+b|u`nVbYHBQoHiU}0JNaZl-Hio$g1%JS3a2#O*G#Dsi!db!*k69#y` z9)mFLyDwT!wZfl)2$g|caqLB}FAhyPf&UrN@5 z`G^2X1;o@=z~gHKJOVisrQ=x>uF&J!xe5x-`OSL_K$CoV1S1>`_eiKWs;t)H*#TS~PQ%;9B#3yeP|H`(J@f(F8;UNU8aE0uJQQ6TT98 z+-mDeG#`qeQE-n8ZR)tuN!ovQ9J39+v}mt?GUkE@>jzuOq9taN1v1gMhCo?F*UHi1 z0B#Oal9HiIt-l*xG}40dML~1<_cQnv?ezq^G*LMf!k zpF0EoV6``Ma?iBWYaOM_mMaB}@;daZJI={gn{Es&O6R<^2t&n#9kaCkg4!U?kuiK(JhEG8BeMzc8Fc-;!NbA8nvv9#`TM-39UYyzp7DF8RJbcXN}hjRpfL!ME_ehAW67@tTsm;0H@CgU zd7C}o!?Q5u=+%JND{?XFZYWO@>ky_x?R)h|*yLiJP82R3W zF5%?#Es*z{G%RW;%`+##S%K*Bc4_l}Ln+73F84PW)=&!y<^W`78(Z5tZ3dv|B9?z9%4WDBGeE}XDZQm`DnCCcM*BG{2f?>03xoo`(kxS^Nz z)_$L(s~C?aNEWX&xP)(!p6J}% zi(nvV9$?81^_KQN_R3KR3q^x}LVaMWI>rJE_-QVHIKmblG@E=GB<6H8LnDc{22d{Z z_7wlqDFBX(nZh5eB^9AXiVCqA@2@RTzU#<(EoI>15S~w~XXzimgr&_dsjtSUs5@?A zJU~?^S0`0*%X$ovm}x(5C#Nfq0-+79{@nfBdtq;(odMj>kgtZKEIv(vlS$xZS#SK) zRHJdgd2dm#u8k^NAg>${`tDxngQv^#AWq^zl3@#42ZGG*d&Ld81 zV9n=N+omdqJ4~}n5E4-W7CBW0|y!AyA4j!c~$L;J`*?g*!?0s+pyb_Xn#{@+Oic-ER0bsW12-O&Xg}5 zPfEa3%eYzqF<2;B<1(k9l#pA^C0%tiT|g*m;ZwcY{dG*Ei6UdS^u$Ae<@>QR2cE)m zS5B!?5Nz-i2_K?$V>f+&kxHL&Qxn40m538hj&JQ9fTkf6GMV0I3Q)xm&xfdRB6~kx zjvVC)_RW}4c0R0%9d^GI?+(4lkidY~boyd@tP8P|d~+>k)lyIIYAzni7|O}&-5w^R z#lwmN4sXpW-634uHTK{-r(Z}auGkm?^f;obqv}7%^97@J84jn+khdD|qeyBBQ7dLs2>1M4ub`{(19VXH^Yb(|Ld;h2zrVJR zE{Coxz3o%7m^VemA1&yDQu6{`)CbO3=4W#GKuFD)UI)urOpZ(&nJTbF-l!ouz zUK-W<-&$IbR1x5oEtEQn7h?zH7Is{{8CmI~WpOdWp0*N(Bdh4@;2v75C&^R!3tGr& zADySeBd^01S{Jpy(IA1Yda@YdFcHH2mcKN)J`f7Z#Wvjx{r0)cSd*CHP~vNx+Fj{+ zPpfA)YB1Tb1;iK}uI(juhIyHpBPED6E=Pock?=pYG=i7~E)q#t^m4TG3l!pq&ZUhb z#Qqr=#UUX=hCTl~^0`>DZW8igoS&N}lTA5^O~^$1fP>=Yz(b6Tj5IelPe@J{e?__& z9sf(gONrZMcma(r`@@|-D_{kE0S6)$s%u6<%oz?!4LoPH>0lH8&~c~CBns$oV(|@{ zrFb!KA4x4N{<8TToF}%Ek^DMx*gDNYNChya!3fMnyNQ95y8wkbnFJn4j zoVzdmfP*933*98J-s*;K*?d{D4o77Ht_?YT&ayZP#nNEPZ=0~E%X65R1U%K7S<*pk zR^u>h`YTmC3(`B;_Kd2wLb6rQzblKSIUvHCdd`2`y8QXNRr$E(>nFWQ%H^=K1Tn+m zaOX{Ul(Q7h{rO6gda!jfkc8cOK0AZjl849I$sLaDKYqQF`-kYGZiOHMuIok+UqJkg z)61P}WcRV!`1-t0xdn$B#+suV(l@6sLeoK{Xo1w414YElTyjKTsY#d7yX%_(AQ)lL z-Zm(=V|h`cv!TiN)MOVir^mq?P;eZXaDzq4sMtn=RfW-I3=5G!OH!N0 zH_(9prHC_;vouktV0(b|prN6W&Eo|A69MFVP^g+k(FO-)q@_|`4=3O)IF#J0{JlA$ zMJXd^?hcn-M)5)JPbWb{B*H|PR%n?P%ehpSm+D{e?j4~WRJt1`LDj@kEo{#VCmGPU zFWPme?i?Ds74vsGSafu(!>g%LVU!e{0sKgzT;dI=tyNKc(AB8)PX`=+Fs=^JWZB#K_3=RU#JsA z*ke6vPgrC_7r7)*WCKmRKbB;|V7ndSBj;0BpXXGYfULZ{fRBM*i#=hfq8GpOF(wdR zQepxb+~VP96SHjaog=fsU2eO+siLa9cu_aH38-HUE?UqL6jgu%gUS%Tszr1be|^&^ z=hU0g+ydgVTSeP*|9on6fs^73Cy`kS3_=pcC>(+x9xCEcy)(zk(YZ>hrv4zDE!UN? zF72A} zq=KFeA>=11d#-1j zdp=Jd=2g9>Ww(lh*VX@0tD6ds02TZw)-ge3)TMMvkCUxP-PCm1MGf?_v5H4p`d_pH z0vj-qyn(L@+eM2iF2?rfH-`M^cZ%Q5WUN)3vQ=!dlOt5cZhEQ>&az|n(l(Yzv{h>f z*@>a7Gd_t%k%CEzS3QE6!qLA|QqqA9RcPpVUEwIBNlySy`l+ol$FYnB(dhm4&maYw znks8L+GKYNaGK09^W^bY=isIQ53y5p0i;$VKDqoYvR7GKTShkW@z%A-&6w|TNiUSQ zn_*WeM`$20i2MT@T#cz)#{OS+EffX?t45#WPjML;m>ni7TdMRr7QNQMycN6)<=rTu z4dYF-gw<^quLUZe)f9Wx!ecs+I(v({F5Lo_c8l(ea&WnYc@lCKM@pf%zhC*4^tK&E z=Y-ptlb`hmlqXlr4(pFul-$>s6-&yeUPWxaWfVvy7CQCS6b~;9}(9ke11^NB%pRg#BZeSM{E;C~$K#bo& zl7)-8qZpM{H~?m#Rjd@|$~u@i6{~xtO37&{7^yD9WT1cG-zs0{20krkv;v})Iq0@^ z87^ii!}U7$9nTo&YPD^ayN+NWA*n}&^#^miq?haVQ20F#%v$)TPdE?=mUCu`Uf8Ua zJznlEM@AC;%&}jCNl^m(tna!#nxAWFA~k?j0Nkd%Yh>l+C>(ep?b-TDiC-sS5ejK; z4}KYWUnt3qk?@kg{_g$lk_{x&+A(fe0eZ`7<}AXFfw;0> zhi=L`m(PL`1t!1}im%aIP&Y@hIjPq6RlhpZ8!Y3bfHEZmpW#$bfl3vX=Hb|&P{KF? zWXJ-R<6DJ(c5f|UT2prWeoO$W+~^F>&EbC`^Qom-d=3CLabNKBiM?RU@4sGF1 zD&Hw40#bH*T>={Zg9_`gbpKIBD+-BUM<0j?pwhE_rj_nUqlqdrLaFQ0thLY(Rlv^$ z>r}ctJ23B^efsY?Xj5++K-f#}>VJg?BWHn1hmePc3S)1Eug)APy83Ked1oBQyyeaU zY5Gm3(DvBuTJOSlZH^Sh`;R}}GLVD=Z+xj)ld?IMb@Jak%VO2kXo>7iwisaE0&$I6klM;|P zXs&SP6t4-6?f71w&!3|x{0{kBl!v&}bap11DF8FEoA9LZ z`0nGRTEdr)#!{OBE|Mks9HGctpS3%dUs=9-G6#{q6z>?30`KulaT(=Bx3z*)qj&`U zi+i|NyiYW|CVpjXnBp9`FpGxze-|wEV2+h(?H%4?vZ5abW3xUifpk7Zpeh92 zPda1XYwUg+rpB|)I4|47+d=AhPJSn_ZPyvxm5Z~bfbap-%q6F9B1JQfeUMuJo{xrc zI8SG-!}pS%_NtZXaeiK`X@v=dQ^+!GwWrc8Y*L-yovrh3o8`9SSGRFI1!;#@Mb*z) z^brz}ts&9b8ZV>O&M(%xf^G++z3toXy_y335P&8E7B(y*3LXH88)zRJxbeEM>#Cfn zSmv3TvMeeUI5Lmn5ens%hP(rJqM5s|S4;ovz`1gHKno|bGO_~+j@1Mc4bb8MA)o>M z2`Ghth++W!VbismF0sSsb3GR6c)0j44X8_lPj*xmCk846rhCdX&;S~UmWiMjL(%8b zha&$oD1oM`DkG!Vm!7bFS~Wew?)DgW(fV1!8v~o%s*F9Uqv&oOufH*o!G1esikJuj zz?>1!_p(I8wTDCc2K*>WitS&1(3r6~0v1v0hoAvmC6+;TWT>BHnX@fa-6JXUmZ5Sd zTLTNzyhGw|?58FHU>u=CIoNDE$aHj!LF}a_<@NGizvt7;@_+~8(e2qWyAvrwH4P^N z`G(&PnAX^!#Rt665TE=10y}zia7SjlCs?5mXrPTkQq1OI=ujHUYHXCx^?SfSoX{gq zUR0ecd8b+>9fXL+dgo{O$FSC{aWQ}bw%TZeIsN2g|1)|x%zsnP#WmBhdUP!Mua{Y3 z6*LkF)Qx`a$&ny~Q8yzvYWW~uAmHZ-g&Rn^Nr!Waea(nN3K@!u~EPnQeEoU2V4e7LG(XV)yF|jcC@OKX}GkqGqXJ z=8uPJCWY)dAI?u;T9ChRGJ~&>o|GgjFFTZy64Pfc2Ab=*zr7Bf$+ucefqlC?#WnvO zy5vnyO1g7Cb=asb59M&i6@ZDLSeneJ*9rNw89PD}7P%*Qh_aGJoaYyPivfr5{_;pp zy##_?l5AasE0mJIH~vC{0*A}!MXyYk5UhJy69Oh^a#@tH-up|FTtq4pH2QC@Mv|5# zqY@f36{}C|Aos#zh!GTJw;Vb!Vx1*=GJ5>h0VHm>2)WT~Z3x1fnf{x45~|&JRM0cr zwBd8LZuCo!g7$lj+wFRMxY>)p`ZxQ{!?Tt@o6t16B;xq6nJO!<<~+a_08gb+vYE$<{;8A#-wJuH7QZiz@_frjoXXQ z0*pzjd%r)$C}vJv0i($l$n&s>!ic#O*HOwUMj2uyHgpjPlT{Jqn zDOele>>`1I34#*cdp1CKP7RovBy2q`gqL}2e1bubjFjcj*K{|x5DWe@wQXd)+~L7& z+0ZhwJQm)YKRPNZ?A*H6{8c*61hLnYDUHXyK7IC9j%^k{U<(i{r9@Nx+vK;8lkwIk z8z@CZs8hj%Ll_d0<|Oq|DOqlm01STIVOXaUgsx}FFBPtm&`BFGj~khMeh=9eVq|ZC zO$59vN)8dKgdF9m3ap=?I4u)Q%;riXot#?)%Gpq7y^YnCFK`;fX4Oi*3BNJ@6(K`edo?Di&Qb1Esq7> zJ6Bkxq^jNdgWT{Mp$avJfT)4bjfw`9^!srKcVBAcSUYPl zrsFZ3GOwX@jWgaN_y6ou;cJVMOIdFFDhEDSW2dPXjf(SS_0f9D#YlK8_}3e4;SnI8 zjmhFo%V;qY{hWDcN!MK@tE7-S-)tN{`XJ=jG;Ppf#Zjl^!I3YKpi*cLlTAK!+#m7B zV#*#~GU}Q6-Ngunh&Kh47@6n3b>m5tS7C152W!pF?S*2PIQ{aE?iU!az(}L@(|%gi z9$)Jgp_M^2K38N0J%}>uf+N@e^Bs$srSo+FnRLo&IER_lXAvSPY5vj7W#|Nf;bhQw z8t`J=pd*%(Gwlb{Lyd()U^R}1xD~`fLqqdjC5NPs^3-Gjz|bdH^@IqFQ0gdh!<@NN zTWU)KjzkXO*x&)tqsbiY9{+)rEyT#pJe58egf3L`Gi=xQ7vpTM1-rG}fzW+o;R1$j z9Le(D=?*0aKxWX?WdCt>B+bAAneC$`tNumBp{XmmE22!3&G~qGCK71|iTrT-Y`czs zTdBwGJ=-|MeI+65f{AIFu=Z~Usoz|k&36o?>OwS1!&j}|@OjN)r9T?2JXgDkZ#!*U zlIEA9d(by6kW<$ND@y|J&&dc~#xl|9*k2e@u?S*4@uCYyCUb1FSPBoLM26$KT3;`< zo({9%a($hJHrf%Ro^<%#&nLD%yK(Gd7$hXnv#QcGKq-22v?d-Vq&{$ab5mStCz*Q( zdGz1Jxxa#0XSpfre_=T`Fshr36A!21S#f^7SRnusrnl(VSd1CcbPb<|sZAneC^cc# zjR6|e!$re-GbSN3oRth}aY3)Kn-Rl+NsCF#;;t)C;p)DAbr7kraNhgtqmP{u!YmQ2 zdSF4Zadq{MgzUclDZ0E=b%r}>i@w+QWZ(k({{6eTMUIOBE8f@t%Dh{{+GN}7%28{{ zztI8VP-2N{7&@Ka!Q;nIyYnaPDOxXAekF4!$HMtNM~9*!^GtZTN+!~Q{xdMYbJ6VHI$+N}N^hcWVpiEfp#czi46GxbS zp`%lf*PtB#q}d*@8Rwj)s(6nq>~BKW7q{$?H+C^C-GQBG<(oKO> zHOp3+KH6 z!tT$OeC+0|o6?hljJE!v;p{d-2h&8oH9k;d0q(a|SuFq=L{{P3L8nSl>!sGxOt;^w zbvTX&5*AVH^7?y+$If3`bQxKj)mKwM|H`}vkoaG*KMbsDijwqK}<<+tp|2G zh(u>XO!+%0!}DtKC1eDpF4T;Q)HIB~>pR9|k1xXK^S@7R7Kehuy%<=jKl)smGjmci zKIRV2d@V!i`Kxc9&gL}%P9M_+7X(6Y@W77x5fq_|Ri$^t=5>27pX)2=-VuvVjg#!FA!Kr9B1L6HjA~kGVgctzyce&@hG} z_7275zL&HrA7$dF;N^fbz$)xoe2SkEI!HXLk*=}zT9AtGe%D++M3YR+vVZ2^^7~gw z7sV|OUS<5{cv@)942c?;dXZ66Q|p^Z#)N^3KVAyr5z8h{R_K4}@<9utS!KY>I;r7-!4ufbXdg{n!jj+XOj*(lM zw*S~ApX3c(Ts0_?o{3<1do#8toJ=+xfR-mFip$Dil1E>?=7A)Rh7}f^PSDA}+uPc; zuB|0RNGMy7X5;gfK%-!LN32eZA2t51yAKgw%m3c3kl=e9K96>@oG$|_1&c%uIYCj8 z4J5_bmlrAikg}qM{+g13U~X~Cunxo|0u8Jstt!kosSY}yM`jjh`IKN~mG9sbu(^I@ zW#SVDmY>0ytg_{@>->*Im!3OZf4}|ZRdGyu%XwB$(@dP<3cefXP}M6<%FdP7wZyBc zpW7qjXIwpB&95AuTXPWp%Rc3cxnr%%<=qt+N9Z$GXXe1vF}|R!mn30hGp??l-S>lO z*rp0he?>Vczt38pgt3Z~mbPkME>x;^rIJDSPD6b0x8GXPtC2 z)HuLIlnhp%OZJ9}#r1MF!?4S{&S9&YC2wFfqmZ1U*aG6fhj}Sj6e(8oo0~ueqah}K{4TZAP2yl3w7riv!qdP?lJe16uXaWiMF1)2SQkwGBf zK#7&wqjisql~IO^kPS4car{{~dki4<$&KWtlHA@ztJojj%m`Nj)fp~k%je3fTA^-F zWwsOS6>qKDm^kXXP|%O!eFgbQRXhf$hsL|;!J{JX;Xv4qIlFasrV23~J~q8=|Gzn< zXc{IVIrrwwL~bu{$7IXDu{kukl{4WbMot|Y)*wzNr}KtQ|76b2nB6ex+L zMkasg6DWJfFLl9~%*yD~B;tE6L9uI~E4jU#-HNx{(Yv{MXGGUl1A z-5KadRh9VO%0mSM9xwRJW5oCt1=#Dm+)8-jH}joyA*}Wa5A4(7?3W3s$sc5xUJ(ZU zlu~mzqHx%wh%8+4+ARnI=-gQTZ3$jA-EtP8x6ReepJ$Yl_-;fSg7q_5{FKE9=^)#F zuB|~-@mBLUnwlx~;c7wkDL=&5m)QE@NJ`3DTjb^gP}#>3{qf5k)lS@&84f>`*psiK zoZRkiH1qBlGxo?OGb3XvCXPA206bot+vRw-%0S!pVwUV*K98JaibzUZ?t0(7#eB0^ zs3Sx?5mi$%A0(pNmGGk9jWMU0x@ZS)Tlfh8@cKx!vC=bDg*{Fqf*dj&&-KMr)p%LX z5P&drVsLQ#MVfan6c)2bWrC$0!tpIz>2Oj=WF1dABHWPmq0M#{-gnlnN7P6SYBkh% zgIWxcU#4f(EKCq2Bq0ghp~F26>4`p9teBmTa+oDq$S_k!u4kmDq+CA^^jcI@4Xfc0 zO#1B~H$1yZH~4cJWN#$}U=eIRKKg%wwAg+6L#)GRDKLNq|2W1>#^zyB9NKZ|73#6+ z%|rGNBoS`>a_oAXaM5(}bhEbuL%r*%i`X-D};tiGpkI+q>fRckGQCffIFSudqd*k<5y&>?}a@2XA za4IV!M+)+jj)9F#$zv+nU*?^%kxhDfICE${>K5kGXl3miWx0n13M5`NYSv04=9Y`3 zp`e3ut2(A<()?!vp9fX9qpss{WXk6Z>P~M02(h(hyL8@vaGSpW7zvOb9}8=Q5S+n- z%?4TAWAMl3%dry|MD%Ot=WkDv4$gViQCwqY^4)at)R@zMYJw=q1!JG1{XS#i;_~tx z9+~`)2sk`zOM4SwT%r5*xXOQ~W8f^3*3_1_rvH&-lrv7}#WnPXm<7kUno8;5?%>DU z+z;R8(Shi=%?}u(gV*|QGOs?6RRihw)Qq{7?shcJ0`+@#mR3+_)w;Zy8Xjx>pd>4o zgqIh=p8_bEB)*@>Hrwgp&baL73G^*~g+4}uPQ$jBG@1aP{5?f)eo@hrmh0G0W4RYej_bLA95g(Jkgc{U(r>_yB;u{ zcX#JnS=ro`HIqpSnXoi_Z@(W0$m%VAqVNcCj7j~nEtea|vqPWYW*lW@WyYK9UJP%} zf#-tFnjrEPTjcsx55BczGEQ>zSgC<>@}new%_@CNjX(f!d;mf^JhqrDmnIFYIl!yf z*l>jX39yaWG@7+U$}sXCHja5vmxUbzLq$2|dkl)KJ{3BB^xODWZldjUSL z_yEcM{YFZ`F3eJ;4y%(fSOj1wcb-^>dcM&^++b-Ss~Q}(!2dvK-dE45-LDRrWXv(! z-~tUW8IrS8M4U~@pmO5qzHwq&!XKn+5b!w1B+cF?Ou6kW&j9V=4=((i)fQXV9|dB8 z1-32K&RHEOU%|!YeZdJ2aNN(2BNO?zam-RU2&SY?CsK2Bb}mSgZfvTQ4G+4jsMzAb z0$m;*j8~|dqC|_I**?u2A<}Z@67IL`L|mh+8(9-9%V!yA)Tg)GNDFD|J#X~%-4^^% zqhus0-zs(Qy+{TKJ%yoZcF*q5TCJZPRnauQr773_;dMq+|kUZTW*RKlk?`>g#7|X?a^< z9>(IH9K%?E5U&`hADVjFhv*PsMKd&OKXkq`Ln!Uz@kwXmJG9r0PMskC*Vp%n8Rnd= zA<-7uF#N;zEHr)6X&o=~x*q)OH}3j$3BcCJrgo<--U7L!pQeoarG+LQpHdsdyA zl^8Zo*!{&&2x{;~GjBXm(VG^x_!lmXZj^6hWls|qzdx*qUJ8QWiMNCA?l>g>7fIAv z?G;4gcvi)ohlyQL0n)kNv+?J3^{ow4D}=FVph_Ib=#v&WZwNBH*l?}{5sp4*zc zs;16?M<+F}PR8BYLUK^iaIJR5$x;XP3T_n*Q)&S6)9R&chkL!4q#b2? z_pMhZ`+h!GVsa66odFd#)@e0kPX}M?fYMkew%tyf5p2$dp7Dhoj)!O?xrz#`usgrN zgR!-m_C>akQ`nCTc?Qf><0p#?W-#J^fA9lLXMfv%2Otp5J#}?FQH&fw4Z$8rP><6p zknX~`)}ERa1qalfU!@gCpIm*WMR)cR${ZQ%^^OGz2L4dfr@5@%olG?EG;Hi_w_D{t z@GGK-U7>sI4&vr|zX*Oj{FgGFC?~(Ii-Y_o$?9sY)cyIfZhA7BOwH?di($9w{hBk3 z#+MTZU|YNYV~hhB)-eVu<<(UZ%`V19&#U*RCs)RTb@1#07{GAiUUwzOR_c1H)KGKl z@=Gob3{5^*|38|}DLBxk+rqIm!Ni={HYVo8wl%TMiEZ1qZ6_1kp4d*#`~6iXRjJBd zF1p|D-D^L4tt-<8$c#lPApG65AuVzV`~Gx2MY>q0zx8H6Aesa9e5)y=N8k;w!}Xh=FB;?9>r4(P|rp)lN?aoH`Yvv3A3#;45 zZOBXrO+~Y$gy}6m%x2x{@G$f9;sR@ch(2@3X2fedN8;^yGxs8XZoaFc?+^m24QfWG z-HDuQb@9OKEc?T&$%}50tx0f5Aw~=ZYpI7rNesC}#Zn(5QKM=ujnfduCo2Qb%AZ?gekO{@BEFYtA^+)$AwCeyrW4OjOP83^w{;wp;c-$mGPfbkhwrF;V8bhq1Wo!cGJix3nx@X6N!3 zto{=E`ur$uRK6QRrdh=g)`iDkGj&{CfFB)Ge(b&vlC3b=s1=OF`WqsL$zWCz5FS2# z;czKu0fXbu;+({z1E{|jrZ41+CKySf@dt~Y>j}+V)`#U=`6P^^i~fTmgu%Q9 zX8)B<5D@eR4vhman2^0jy*M+ZQ4kh9T3qGX++ zB)q5u$WuAK8+gg?%F2KsfyZMOJT^q(?pVZP`>$dhR-5un`iGl)V;rjG{)(Dt2SR9od^b#p`gg-wtHN@>~o|n?`|8>SxJRY&_^rXkojF3 zM7IYvM-tQy3c$O0!+jn9eOnlLA{-tnA*?y8eXd)aFkW$f<1r~Ism@_&ymnAQQT2Q6 zhlcQ)i5YXLYfM8=N>b9z0PYtV1%ty`Npxq{iYkQJLrQY;QPZ!o-q`rKF@ddDPGH8q zWZvQQd3MA7gVx<%Fdjt?V}GRydOba-_N$TL*gsH0C2E~04FSp~l_`nJNbI=@B%Rj= z0p!%eV#95b)`#y+3WU3H;=y9(09};2VzT}X$B+?gbo^0jGSPYx#o}PDBnG4)of}1N zsXlI9UYgh2o*3;VvnC&3tQH+S2b2&LH+B><`x@`Q0^46sTLIFAaOsMPj1gqx&9n8u zfiXQFKP+6zZKV+j-PnlQVCa~p?f9^xpE*Tpg4|b4P=e$3>;3p563-o0LxU;#u_9kl z{8v=ae{9o1Y>qvf4-Is{KjUu0b#|%o3CUlU9=`*Rgqjx1OK)oC2oPk09(SPl8fW}} zd^Saq?+3{V7`(n5vo!mDnTMdVU#9V3cJ%uw7le>2YSGjg>YU_ft!fV(L=foD2QM?> zEcyiBNY#P~=kVi8N-!$U=f3PjUrg!gn@b2!;6@a!S?gURW|Iv)#kXBJSY)l@0K9Z_ zxllZ*NC}!kBFa$vReUJG=(5rEMvjvUh2blP=z2?93?jkizB@6AKV1#0o^8gu9=QMD zvR!aD2wTPk_&~FZSUl!sW5I$v>yhfl(}hE;AqUltXuOqfSjQKxvvd;ydXu%Hd7Jqn$E_z8l^BS43X+!jM;>`ArG0w4k0>%nq9+Jy&em}UAki4L9hlaTwq^pr z>}FHH85b7ap6;2{JKmoz1w~)1#rYmkZr5lES1c&cDJfyCv>Xj|GgOt5 z>i8!qb+}wmy0mOYf<};HGAZ=cCO-hk#;h&$w*-V_sKK8lk$$CM-5~r>$v?bw=mWe1&o$FLYEjw0*N%UlcyiY~0_;1_&gjWVrQf9yyG93I(5{bdo+b# zCMb*(F~s+#RslPmtzO253S@$Qm$awtR#R5KUaPoMzYenHDa@?q8wHH_jjPIzPChr4 zGpXV>1q=^hvVCuYLUjrN8T6(8@cnGa*Wup*)hd%kRfG9<0rD`!6C5+p%t=bxCuhv$ zCKCYq;(M!CVX75*uFJANvo`1JF_bY=Vm%Mc)eV0m9PfGoFRc8tWscnaL}kWN6$Tg_ zM5-zr%o-fwnt3MYbN5JG_P=LrM=KpM|JrJd^v?8B?a#L&jGlDMx1R}%Y0P4;L$-6r zChu`LI`tUBr6<(uX5ZQxd~33SA>rh&#%!Pg7ap#21zSQHKTn=Ppu_$49c!HCbWN~% zBmlRqt<7q^y=u3ZH5cP=q0WNQ63JL(kQCU}E+Q(&kDI`d zR*)SP%%_S|(1?NsP28C+DH#~6Zt`7*r?&HWW#zpr?+$~Crzt^7^vkHQm>)@;W-n&` zPkPtJGugiY*L&Z7l&Em2=a-#8zjU6!iU3fdMoEw3w<{`+H-=5sxMQavU*w|&W0UWa z@r9jZEI*gAv~T{t2&)@1gt?7%90d3wge!a*~KM9OgB=>@7b zojR6shub1-S_|CPFbpJ0g}; zi~m69V2}r%%hUOS9ndi?Eo*uuJP5qRUpHcHrJj!_;1e@2Am#!I>IBPh|m09*hA%khhByEX10-5QtD zgYJ-tC0!Lp9Eo)*mt!8XI|jOgxI;|@AC@P<8#;(e+WC7=+X)oP-KO)gzE@87u%w)G zzJr?jl@pKAnO1!P+9`?i_*5Xod)%6)`Gv4Be-4H%83*Z-6Fs?2*Zoj7JVIqw8i-Y$ z*&g!;2i2jO>g{gN5k|#oKHrwxGWd$RP(E1Ik>7Eh^vfRqjsyM;lZYMY@i{c4F}ZFD z7WMy&R^Pu4Lz8j8_VYpW93Cz*FO#JZOt&#gml1hV|`cr7^fy5U>?+u;D@%&wg zMi#Tdb00_cfH1M@)qJ@c|Gzv*WWIM4s6gV%FDScJ;;9UtnBUdu1H*{8U61fMh+J76 zv#tl~bIc9i(@MXYl)M^yt+hs?cP$2Wj1YD8PZn1ncIhMmy1FgB&CH!vQyleexHkbd zNu6}@OKT(g_r;=8F9TFp_J8uT_3|WXLz4L6pUvo(xRFvHi|X5A6=n%jmL%8rxHV*f zn>7j;uw`urV)CGxi`#N)e%*UIJqEo~$4HetMCpJ|kfj6Nb0)1mklGmVPv|Cn`olf* z>~0iw7+xe9=(QiSXkqKIsWF4tL3c7w8;rFn4n3>E>Rysq&c={>1{fN$-}@faeuDQ% zU?jDYd=b&=qCZ*)_`bl46cx`=Q#0djVrn~@aRHx4UP!T`QUQCjN*KPbFJJADj6MzO z0|#D)e=Z^^ndDy4%N@qsWJPNOHN(tRDkxvl6o&b&VI>>_$P0xW^Nar*hJf-2901fs zcJI4Xx^#T?ITse2W3#+(w6{JBHl(_TA;gD z?UEbAI4K#K{qDio`{$#8-IVk4A2uJm&6rB{=FE!f%qbq*F1q#K#B4tjx_^ws&liQr zC~?~9GQ)MOR#eq|*iD*=_LWz8aD_&%|&!xk(6 znC-^{jPo2bIFR4yY&G)1F}3?n4BqLjOB!}tk~8$W`2;$3il#7l`z}yN|Cr6d)HnG2 zEpWh*K;A3HnsGcF=hv1Xe=%fm4kVjr6Vr4G$vO&j?T#hbGvBqq4(N_hE*olATx!^$ zl7v^(pH7QZ-%d>~xeSzN(k6DhXN{bgF}Pq4Rfdp~FNQUR(o%?M(mtJ@sL_Q(vcq#F zmMdi;BHOAj$j+aXv>O9~$g+Jl$e+7EMai_$zhCYi=YadDb3dU|D8N@Dkp&NBusbx8 zUPH@bJi82d^cW=qNi&u=S?m7f!C9)lTOBD}asojtvfo9j*l`msdvf+}d%xc@bTC2& zer^!v8}aZNiT`o62Xv5rpzyN${aS(gcJk0i_XnJm6f2Ff&)ffOGL0qsb7SiJ69Ixj zy@aA0os_Js7+UF!BYGTZ*bM(mB3s3>+r@-=0=Fo0&i}Ij(me`!>%@pSyrC5}ZRyx7 zW_C9V5woWOzSa}=_oLtbdj%7C><|;WNRYQ9VF^764tTE-gQiYMufE;M;qkOCOKW2R zbC2HO=X^U6^3+&!@j5xkFE5a0EoAEH^f!{Uh#S*-)d6{(o$ppGkNy2ZvN`-0Y~)Q% zt~uabkx+bUvT40nHQ9o}lWnAuBwtDHoIS7Py`vvS?(f*Zb?jkHDBy)6X>e=S@}_lA zIgp!zfn}HV1f&kov-i+&;>fe13JTS7*3 zuSKFWbkKpc-y}L6H1cV~?R2o0f|;hZdbqI{`S;*-|L(|+Z6qvh);5aGBV36}ZP{xxyqXeEis9`mMkHM}x-J}Q57_#yzRa5>?taW54U3US;@+ZSl zXEir7&tNItEn?v76kub!QNfsthZP0NESE4>lD#=X9|VhOH^IsdBJM0%OWyj^fz3d{ zV*|`YJn;`q5e4Ime{5dQeIYjMY?^d@P%*jEJ%T4uee1-B%@Za|=c_;}SRmK3?!XCC z!2osl!qU?1Yv*z*izm|AvOD}^fSB;Q?B)rN1Kw$xwb!&!iw4z7*2t%IMrmAK6#=so zr5yjA^2#1k5dhz1_1fK^w82@IQ9;s`{LuHzTTp(PX}skY)SV`fteB5WOulrz1klv$ z-e1ei9`XXKmyLipc$r}<>2X!yXQ&!(++^r}YpeT3A=Z^W3;q^#i081#=`d&m8Tdye zQkm)e7)5o#3SO^~JWvG8lD&Zt3%n6J(pd#&KdzM^>`Qo$jkH^k1Uam}eOZV!4XV|9 z+;!CdbE`Sd=f*4sA{OHe47_*BQNO1Jt~?(#fiuf){nt0Xp??g^@+z7bvyP>#a+8Oq zNPo({0w@6Pao}!dd(H41O4%^RXymcM$Gdk`{jk>|#+n$AA#A<6B&;9th=PWOd`3iLNZFWELvuWK`!je5x2voBW40>6|Ff$z0iGgK zmYjm86T2JajN{z!Ut>tErb-+!0gQ@%Dx*CkEbQfPX}~+4CxdMxv#dq!p;Fgxhc4c0 z^Xinhb4dxHxdH&(Qm;L7v*XFlE<~&yiiy;ZdTjip5)X z3M4fWs=ECd%!lXAVNU7r>%Z=p;gHllp>H&MfNFL$pJyGN)^1am9LJUEjNnuapdfT# z3Ck!m{)~h{kj+e_Y`(R1hk?=VPyC5gCThrsI)eLrC5C3}S$G4g*I*Z}uVyzjdb2q~ z;esN%>?Zn1a1OnRQP8OE!Sj_kaf2-er%g2Xj>CUn zou^Gz!s}M?{Y0OXmwiNE+)@5;P?#YZtl?s#C5!-H%9;RMY9L7KjK>V7#K!?O?<;75 z+?q&wGRJ@Yl94$#&v-@>I|d`K5Qbe&cReBi;b`0o_P8$BU0@ns0WnGOOTXp;XxQD3 zQTWC@19B9OqOwye+wboXj-?EQ!=l80z-TWu4OxzYt+*@3aVJ{X7jK6V^P_OQ=CP7ox>q}v79eN#xL)l zVP?RWX+DUYS*F7{ahbhMta~b|0Ry2POxO+s0ji)Sr=5ywNZKtF`oF?rrQ4dvuhK-p zImtD@K#`{qTdnmxb~saj{2cxcApNg}k?#Popz{$n;ODxm&Z*}X=Uf9$gK)h>_+WErvBOxJ=o91e@jJQbezCeswztyUzaRbbUm6usUdR|VHGS#6EaKVAUa72F`!15H}3(2sk<6wzVh zotTo?V14*V&b93OdFSi(l;wI99xherb~hy+z%_~Rtf>LFN`CtHX1{V{i}k9_t)#p? z9e`M$0ln}`sJ77-yy`~+CE+)pjrz1Zo1Un-@$u539Xsxq{Z6&En>I6HDX&&zL%7wn zZp<`h7AI|1ey?P_?DtwH78cV_?2dR;yQI=@mKX!A_TZ9I4tjc;ultJSbc@7OxMvG$ zjHB);8Pd|F)#bU(YmrsWP$8SeCtZ~s=@PO6W_Lf#SsSM>{3zQQ02_bEz)hQy=fnyy zK+l^kj(Q95+U?F#PR6M^N^ zFHm8cgm3JiWPVraPLLaHPZ%!U5A5wkbd;KK8IPALjky>AB|2#$j-suCFwyC0G)(&+ z%;Gp7W#x6@%-v$WUU*DjQEvE%7SrIh-W+@Uy7};VbykxVH|;v{BgMSYc#Pas?*rma zz?1nP$SP?R2v`xaoU~^Bm&WUk1^5%ruUZ3b98o>*A+}{5+-MY|_*b~#4VSGmQlMSh zcdDej4k-u>E#w0rnz^&{Htu`ntf7pIkQpOUI7t|l1pstt#u)b|CXT`e?)L8z(>|Ur zMktj`f8=mlu_IYMHCI`L0ybA)exL}r{E2cr>m+O`@U;$F3 zboJRdZo?b6t*tOT`_W-S^Bsh_ftkzqT;1d8bn3-u20*ClF+kgiD$GG14+#z4YXwP3 zNi#17^jUDI{%yp$yu>;C%(|RLR=0dX`Y51lblcNNb65>)Jn1I>{;sR3Nxik?{bZPvnm{MSq>kR);z}F~+e(u2kN+!C@DR*;J~8We z8w(DDqKAP1oemt<>N7Jd3f?5%2K^#>=p~0EQjmdAZJ+RhD?j`lB1rxEZh$LEu8$aN zlQ3LPj0Y711M_UTH$l+dH&9w1hFZtwG(@_LT8YL(`F-Ds)BUQ3koCnKSce#3ii?gD z&l3Ds(kQ_1x$T9m_7Pl85QMdNYi~pG*z>(b6R1>Rpq{l|aK7u&XY|qs+vE|ig@vv)pOw>Qx|>l} z8wq|$4CjG`&HMVO>2j%GZjRx9E?s5!w4vN8E-IQ;%|oG*M3pT8@0bd28WxIbLzNcA zRw*J=PRuMkU$CD>$It70hDa)rvuE}d7>L=f>mYE2sB({3p4NcNk!8V?(bt zo$cH_BSZ?|7(kpv(u7*A{XlU;_Q%6B8eqkT8{`Ar0nxYmx#zb-muPg1I2EGf>+evS%cj_M`Vj<6nJvcDdY~psc z27qyGUT10zjVMf}>?YxM4|bNC%&~jy`5&es$}@SwA)IzQL`_Xwkg45+kdpC~Tt0tv zaMc`#L+}-Aw&-~ZPg#mtj?;f*G3xtS34}}JBIiK|4xAca?f!5&UzxS`6cwX^^AN4J zPq6t5f{;M|x^d+c?)5cKuKS|TFFI7x_4rnOvjDm(B7&<@=s}rkH~l-P4xgnWz5`QeSF1)~x2MJMjYsypr*#37feltotIyjl+jFK% zNgHo#yrRAgMVTC=af04SPuiLG3e>R0qYNGw0(Oy?d^KioE)R}0$$w89i8(x=S`U*g zbl10huRh3|;;pCw#1cXG60hrP*SG*o-`sDr>ogb z>x@4Aom=er|IScFrOgJWd95Orz0SDFHdCaO89Noa`}0MXz5Xa*eyH@f7~PIHy;ha0 z9E`Lm*Bg7yF`)c&nt0eXPEQ)YVz9It9wAhxJ7QpJbA}BT7V8keH?<7RJ!G8ztqWY{ z1q8!lk^&V8$B8_P#qh+Quf^l2;ktyO&ihX@TAiL%vw$#w7y?k|72^4re@kc8hWax$ zf7fFn0{_@E*1XGk$zAyYSIvSW~w z#(!6{2c)S*wg`G>D=$n2pCaR!NWw_3lx;`LO3517K2#s_nSngYCIGbs6cw&KtkFC^ z(jxkKyhY_gLMfoTzht-Z-VG_`4d%^7meE!juTsp;jMLE290lXPUY|E?GXg1Dvq<7( z)ArmK?=Lg+!WPs#+gC8KH2q%zz>N&XyFeXZYhSi??P~}k`gs6j@^VmVwok2GpS%59S;M}R~w$d$XSlh zo0jgbe_W?FWoRGH#_&6NGA;C0z+H*Bsza zTH5^DTt7g20>VxyX(a??jQm`%s)2rh}z zr_6I#vsLYDDk&?AxNBg;1%b&iFyI8S=c`@mx?HK3O32DiH$A_Hr5 zH)qLHCM6~%$GUtXXjqJqFDsTQJDsj2J>sv~JEmlW{hl8-z=v14d1#*c&PK-)k#L*< zNaA!r_~BENeU{=_PN1#HP7RGh#>sOn@DFRAw#7_^grrNB8w{3xnlE@l^P-K5%8-Hq z>Os+l#DBX@3A$o{j=J1RU$1;NcZ#9bgHJk^tz5S%j;3$xh#bqo!SNR&PiJ6WHH5IQ zIHV$Og+>f0cs&kAmW>q{Y%dyJ5c(qD>I*)?l;4sHbjW?34byKphF2HJD4g)Kf(>(b zu8lbiRjUBEW!pZdd63aoh^{qU9;{07L3Mn1eWjY6$88t8$5D;+=7#F}zFz~T6ZKW} zN^xe4CvLkzeZ2R7*JU!F@d9?bgYAv*rBk}a4fpJS=VXJvn;vc0#uD|#+TD;`F=&lP zh9NGCEa1==mNeYdfSXQTnB-;F3n4jRpHz(sK9n8923J^d*5)8WM>@bWr$zoGB*b}n zLpwN=j;&$v=kI>@^!&DS5fvgem5nx{(csF!1sTodb+RTX9V45(9n8ndM*gwB^Y2<=#~f5@*#CPoQteGnw_q;Hg|#j0(;F?wY*uUBK>-QGCnqMwo+@f+;sC(Ko3ZP zlG6QTyGlg#z1*)GE8uiFcPlEC&Wqv55JN0kZjXA_uA^hpxjYp8`^7Ib+il%6LSIs2nI$gJ*ZY#8-6U5os%$bDXnqmz z%Vs!L)GUVh(cZUqv2=0jgaC!*4&Ql0z#1uB(^EkBvbR~BqgqZ-7W6LrZF1E>c|U?dcV{w9nD=P|)0}lqIlHaRzSWJ% z9}@m(rGC&XG*xTd1%(rArE*f>cORJ8ePl^d7;ZIglKVtT23w5@8cf~Zr)E)OwOg^# z?*bVMe+_4;2XJ6R9A@ItA9HqCtcS`#IT9c@ON~==%J(HI_;_^<+7rNjdB2HA)UQvK#@iX`9(-XDo}JU^+E;)nL}@nMay7Sqn)TrefD zlZvViA5<8T#pm+9)Gp!_Rj6cYL&3t5@Ve4%v|0_&?ebjJ=^obxdzZnb#g}{z(efCX z?{cJY`EU*m$R~O4>~goeh2UMV?EZS;nAT-=F*iOss5iWmg+e%)X?H%O!BE3^eyz1w zfZ?{?mRv|{P#sFez>s_fQrOK=bu2oyON>5p-c~-B4I<#$WtMdO%q%jo#w1ER#>j(wpb^Pvp?qh zuPT8;Pklu{;Z7{-ddmkJZYM9l1~Vo6_L_|G(nTprZb?=gHYM_HMeFx2*RL59Zh@ly zk>!xuYrFjXf>0|wNjDMBJcB$|IBOAkI~0FGf8ZS0Jv)v_X~E3a%{FHxC|$Hnl!A0< z>l`-D4H4V_dmuDibQILpGHZI3o=KT;YOiOsQO5)Uu$2pzbkuYa`-tuT6c zf4%^kCNuoJ+fuM-uHNIk-gMBff|SiY^%7~-?o{S8D_^ZxZ>BHsiNzOiKMK=eG=YS) zH}g&STI(8HS0x_)SZU7fYn{xB#}4o&LQuj-C=QKipzF(>Rb~&8jdF!BsVbDz(k z21ems1>>KVVt?NGJkpG3>EPG9JJOV1Y|ff+V}Y>4^JL-&NYCRmWJP4H_Mt!ws^R0U z&AdWZeWYD15xh@HL$$N7a|mZ(tyrr*h2wG@)%kKbS%9jMzGzDwwSR$07_;BMR5D2N z#!(I_+TehMv=AP}41ITJz-v^aWsA$nnQE9pI(S&7P*gWpq?nJ&_>F}Cbu`_Ta&X{l zrEw%KLQ9wP3JQzb2V$nE==QK~dzS46e!Us|a55=_u92ZHzrKUJ+7j_F5QwZn}oa*jmO^) zbgaoVwlU(yj49FKl&LW+n{WW+4OlFGe*WjzS5y>~pZfYleZ<87?GAM}&TnzwSfj)9 z?Ujv4NPfV;BmZEfO$;4{2?(r8)Ts@aoJiB|OqEF}{&n7+B9zy=yquDoO9Tc6hDRS_ z43{J&>Lhb0e3`pLBo>4H%j)iE5tYxfDZQ25J~D^XKdwNG+2YoCt@-ycYfVu4U$@em zQeyjtq|Jvp;5uEN2EXkH8EDsf-opon9snd_1a&Pa|Dx!v6WGV0t(yMv5-TQo+-*Fi&0 za)SF%`x~Ys57t^^9bMnf>8S=4mCDKfFNXxIj3rj+sRP(WnOfwW`Yzq=?GfB0?8W~Q z7Ya$$&K4xDjCV-TF%0Q6|8W`woHnuxpJLmVI3ey zA0pUQxxHLOIT@1Yy|b7m76Zj$V`XsTYNy33VP^MCW>_>(9-&BU$%y54`G`qLN1tHG z#qp3jm#?Uc^Hg3W*C6RQ{GHuax4+ds?tH7OyiWzOJq{?rUv4MTthPE=mWucry&UPm zd)C`;RE|EM!J%hbm6aL?+7h#-5^}r@m$ZZMUe(j|<$>(ulg(91;(uZuro5M46(QZlZvVlgVn%~RU(jR0k5>i*PK8TadXAVww~bNd7) zz)zcAyi7S?vF!Y^K|byvVoaMeMM^emF!rhRsXj1Y1M6nRZ%RX{{YxAFnK`mKqDXIxY(E4 zTK1E?J#rNbi&Uj(WpCdRRP>c)@hCDRl)v&cQMI`qt@=UA_g7sATQ%4~#)`)^^G!0XQN zdS^YA*PWzFvq^+JK|xb>dRXTz?d_1ng^=4c!6y=A(A9FH;Yl|4SA?na=XRsTkEm5I zD=U^n6>9our;b$;1~|uA{#&B*&m?44WQxpPFR66WvyjvbeNJoUK0BFsBHF@gnnaeL z0?>m7-`9h5?om3pc@R=Wq9Z9uxMqUdi@9m~7*R@{OwdoDb=KFLOZ$U=TM1ShuO))` zY@2JTE*(-bgmj1x{NdT{ddYR(eEi8l|I?*-7KUv151*><_F!ruER^39!H1uiLevR= zVa9@VhrNN1nc;JY*Bgng_YDVU|2%esGfb)E z@$PoQS-3C0VVmqL^gM8I}^I5PI-eS08ggV6!mJt#=V=MJ&q7(Sq` zVfp(4HDzDu=|+#f82hZf9bA#vo6s78mawkBI=h+<^s3H57j1@S62Q5T>S$B1#O_a{~r0HsVI$0HMkwUDyP6RnBg2zrFpe*}w z!9u0%VyfPP$#DVOponZrhpUgV{$Hya?FF~pz0z}ZPRIxrxBSPI z?UvtyKKJ8LVxNf_*)6>N3S;uD^jm!}yKFAFU$>e4fP1&r z9hu`OAw7P)46P(II;_~jO35r_fA0D1ZU5?uw~Vt41`$c9N>Nc$byHyeOD`>d8=WHk5)}aZ}WZ^X(TkIYN(QCTymg@*F@?h zLQH3j{n)TjT#TLna;t77)asfe1Y@zaN(j0qhC8^_iWvzBQW11C`~CTBR!KR;fWFWd z-O1v#?ieH=m*R-5){UALlQC!~vIvAdWMwowa&lJiazI$(ACEdRE1*ViB1PP^w z8w>iSWFwR{cC&D~ov`Bb2#lW8F(kzQWA|^y3?Py)eMI=%>25?GS@T&8jDT&~Nt1Df z=J%64UTjG#?m@OcoE*v0Z~PpE@ISGe*Fk_iMtiww!NB7pi{kCnwIw3^k&s}9w(9-N znep^FbU84>m}P;Oiuz= zp+W_Lz)P#?@_U!ibhg%Oo$F7%@Xjt;T@IGUZz;!}KSvAZsmU-MZsDH|SEcH$?<-12 ze?|S6yxkg`nE3IdYt6G+=^!rm5+YFAnGpnU*9~}U%g0ahG&qU{^DHiX7^Gq2c1Kq~b#3QGTv953Rw<@EGFY)IWiDgMVjJ(82UQKGBH*08xS+rEH zGx*!Psbxf0BmVC0xvd)hk9*F5zz^!E!^6Xyap{`&sLqQ}pw%!bP_p`PEZg5da6+&R zE>{EP^L@7%XZBk$8Um!KXeM{c=;8URk})~~-e7`jbdkmWI6ri-^eKAhBe_~|bU(|5 zV$_T+b%4*<%)u|u$V>$^%Jtf@qyCkh9sSp*D>Fr#bD=xa$~4a89*-x|AG`>4-zAx| z6eXn+%v}($Mb;+GEV!EM6Hi|fS@~amu&J=;$XASva5C5!c9jFl3`($gg*RcL&OF7> z2W|VQ%|dqSN#m@hSB81B-!_^^s1l)+Y$s&J#o|2k#| zze64I?H0QrKt1o`niGPLAgw!=2<`Amy4d~O+mO6@`-wb^DX=n zws*qW8UW)zhM(uUR2#Aa+ha2Xs^ zPdpB4KJMS{k9qnDF)waov5Kl6{*s^~qAM%)Bur3&{w>=YG6l7>UN?u-xbj9AxYCQ->4pOrnaBA<5+qnp>uL>>!;kedG(>d1nmmc(Q2>9Z>+Wu+ddYo zK`!&PZSjx=(0%()xM+xvhkPQI^a_lI;~9d?2vFb*2suNyGpZ|&xEx3%d{luQ>l-6^ z*6b9+OGJtqfno=|*9led>lt%%hWyVv--aV$jpmDoPMj{EE?#8~_h2tOY7ikImCdNrV!$xK`Zn)ld+$;=HAl5su3=0hGnrK`( zoWJ2z>i6-)jas&Ls8T|7@)n&L%2z<>x{tGUd4xwur#)VKig2X$t~Gg*CG6ONe|~N` z%awxz56>1K!WJZtm9Xtz6nL!K|$#P3rC^7Gol>I_nM`PgV~cCAiUmUBube9qVy zd&-rr{Y6bpUCvY>9z(*+oIlKELSRYH7Jc9~ag=$o5%=fOy6tZ#cFKV8&Eu2VXl$R; zzl9r32jU-ZaChIohOe|-^IHa1!+UCwK|i}qr#72@t1ad^L^Aiv_TkxMr~EUZ&r95I zqPE>gEsT|7GBugT^QI_)Di0$ba!s}YKeH)>Fcv!GxDP3Y_{-Vp(=( zQ2emNUu)?WN>ZtZXq~VBW-5N}hWcECedn^mgW~s8;yd~_FHl%Hn3Y%^gLMz3>fIC^ zHbow1uMjVFJY$LF3svyaI-w*VJAi8|W7_|Ra;f?wc+aqfLB*St*gyc8f5m@Jaf~{9 z+~4zCT(`FR0bwtFQKdy%TBGldk77gpd0nUQ7!57y=gr6{O{4ZSEhmVW#7UXu?*P!9 z-7un*OWMx9{k-qb+Znrq>}8w1{WBv{I?FhrSNSIWFn37AnSDjls|eWa3D==@wA!uF z{UolK*;PRABUe#lwHx{10G;t-_sQ+HOs<;3N5*Lh@RYgRtK>>dZ2g+4ECTv&XyP#q z?)&8Qdeeo@8B6yaMTEq8)oEBx`|9WpTvZut_AXee1*%kSwhJhYD)ij9N8Qq6auelK zHC=&yPM$f$7pU&Yzr=Gg4W&z;UtXBKo*9FY3B^Q2{z$HpD$ShEmvEp_L{m_YuUHtP zh&G?|j6!eI9ST|MJR~lm;o@ry^hlU6v#`9Bcz_+rMe4lC=3PpQ`)Bx9KOzr#u?7Td z#f}oU`d>#~gRf80!0C!RhrxKxA*QO@6LEs*x+9FO{W)YFor0EDUNdHfl=^iT4H+av zM6Nh=<;!_-Jj;dty|({BT$`n$SONz+lT$Ov&s`2?;@rRl0%> z)Bg>$V;dufJGM7i)c3E+->GMn*)-?<_CkuHyGiSrhTFTOP$aGk-UGm7-;u>NSh zPBH|-t71M1-}Gv922%OGVeZQ=9_O6_4eQskIN|O)*_jP{iCpq@$~pB5`&#p}o8S@# z=dOccTlE-^V}Gl+A2Ppg)3zoJ2G~mw6csOR&1^veg_a9uyz`KA2Lylws@FMCTzzh% z-g|&oX^HQjQpKrWA_6rk`gcv2Yld)=4EB$qLaG|a$4b~maI~vSwQB8MAw!ZDgwCN# z@HSjPi5i<4I~3Z3lqC=l1X?0KpFWLef3t@bqGm0#@{})zlN3fV@c2~(c!I?4&qOOS z@@b;TytxTqNaoq7j{UsJWzSiA2SzQsdugePytY9X27-xJR&I9p_k|orgt%_IQ!bx|P%INf zksVSD808H|6%}g#!HyYNOLCq`O2!WD{QYR@wq*o~rMuIU{W&s*4pP^UrO#^_agf}SOn3Q|;fs&bai&W@C^fESq7 zqcyq@ltfQytt^sf0}`M{r5!JeMd9z9iZ`{z(M6}Tq=joZuD*B}YWy%wy#esmH>1w& zA+O`IErTN4qraaLm!E71K;90NV)cIN+7SHLT77dvLr0a7w~H-Al>mym!jh7N*9L^{Cvzk_)_>MWN7E0xEWc!;dXSS?v&9_faeR(+7`GK7z_qB@B5oSb{{bNJ=YdI z)M{o;y9b3C=M{5i&St~<4ONFbU@WY23g#pjngb@Ssh!DIaTRTeb9NXm!F$3dyv6(G zPQMS4g?0?5Dyx8@6$jpW1|F68STQ@-_+>5%l{X&Vrj2#dGj)uZdV$Gz@Rr!R#rx7Nhx}R9=+c9xKgD= ztJR>7WHLL6IMP!zVqk;(t zOfyHhU#Z0Z_n(o4InEqA^>QXl*KQ^yBhz7fcJI)J;REV6!ZH{P+&W+&dAXH72QC5O z*j{5|HRdE31Rx8jyGO%;Okq49i*GwS45xF5Bitg4wB#wH5pmS5f(+wpr;={NmhYfr zYiTzsE`byaB)XLzeyBZbE*IOnyO4)x*{1c@pzsfXIj_Um$>8I#EN)FHtk&6~ROQ1Dy+%6HBLH}|6c>IIu1ce7VD+GsOFc>JvDI_l|m)y);akIxG6b2d(wHEVA(P8cDCGDC`4SiwNI+-+ z0gVC(3=JSKEWr4EXaHV*UNu%#oj!D$_aFU;<9qD(a(EMw7tNY!d|mFO%I8*nM4?bJ zcI;D(8ub_sU44 zf7BRHt&Et)DpX4Ib8qRHI=d7yz4&fAKd-i+;>v~a@$uy8r^YgA(k(QPjdWLH*MVMd zATjY$jTN;QlG1tc#Rcr!Z-sZIiK8i*OvZb?sVIf2MyCK3#EX#wo5WT^`rrihFy!UUr zm^jzQ^gG899#Z%D#Id8txbN>4s#W63mmC9;HiZRTR`dp6;Xu56fn1INu>!yr46ig&b#w3^VLuF z!uQj0$YgNW{YD9;b{#+^UF)YC3rS0X?-szv??AC+MxmCX1BM{7(c)(slh^4$u+%}B zi%ceC!n5PKd(NGB`qb|VAH7ab+W9mRPh24JL?RbXC6Ra{k@Tbt^0IR6t`%7qO0|-p z@F1GR#c)&Gn`qkhCe&IFmVU5|L)+|He60hb5iub+Tmu4qfQ>-yZk_dr&YcG`e*Ckv zZQC1-rhdQH>k9^hp0#Vg=Kc2{#bB^Y@^=|90kMuMB>_1Q1GM<}D+*)s;A#TF+r;-Z zz4i@YPMMkQymHSy%$__2mC`o7U8%{=%j1bpKH-N=f7rZM-!8Cxo^+mM6)7u+q%>*P zTK^}^`9PYr8VW6%s`>VVNc?={czMbQZ)Dl)w5(ht@uKwFQza!L;~q)k^!fTFw^5ad zh#+2=F`3b$dJ_@R@C!k#B`2qVjEu_X0D1X^y#K*67BAjp+u|lZS+t&77JTy+v9WFm zT`4(p`V8NGvyctzH%KiHT8*a7n$j~qo}TeNY2TqeN*DW#y%8~pBJY0rJ$VK7Ba`2? zZ7asz)*pb3j0}GLbvexs9ijd1eYHL>1-OgqiS@)S2oDKj`km(0@qF;!`~0}*$Ew2jbrDFiMZwn{sqI zkvpHf$f4twnP}ZGC=@VqtTEZpr8{_fIXj|;k6sV^cEj7R!uHM1jt1Z!L>oMM1U>?s zF6ydKDwy!>ct$-kl90v{3SrxU^3rmWPbZUj@`5p$a59k#CzH6CkVJWzQ#x2&oyCY& zczp=lyfS<8iDmqeyT4i~b=+b2!dHK?JF`T_n#`s5)C@iW! zehjtIu3b}RJU@}!2X`ePpne*`+Y3)*U4s3Eg;@84|P zx!2iYn8m%Lh7i{@22m9G{rAV)#cG1nYM1B}fxFRDQ6r=U0{^Sc;MoMe-+zsw zT^nmcuN9qM&&FN**}DIb-4lH^F?>L8x_7Ai?^ae;#*jg`lbc(qW3e0v1+wiFo>`ci zV7MJvW8YA$qZ1wYN&JdH0-PO+!#K@Zh6&@zwEVTR3X$RVh^Ypu83N9J7-l?RpUq0j zAlXdmQ4g;$6l(7}=cT3V82P{jyW9XYIQkBR`yYY$KHy(_cZeGc$-M$UFNV3VLbl^H z0PEmIMBcP%1%WmgHN9PiF1Oyy)K~ALRo9ltOGvJY9X zV3s{^PO^YLKqN2#hzD8%4Ythp>9ON@9~ z?bF4Oc?ELvrCF<}1nzv^n6$W&Y0_B5_a8+P6ksfF^Yf7t5@cPWo4vXi01g}}=7Hyv zDJgYs_oCDc9N3vhrj4L`_tu1k1-fOFfV{jSe*R?}vu1xuMur_a?`udheD?W#qN3gM zi`HN;7+Cb(BIbSasoB>GY86C=LR6UXcTdgLwcuPb95`l_#MdUvi$O0Mz zFCrt>LTfMWvrnSAdx{m2*Gy7cI!o7WCOyk}>Lm)foSD<^LE};PweH6C8<;(FcGcl! zz<7JaW(npd7y>bxB)TM8G%OVVM_+oOXu#bJdJKFce9uf?tFt4%1|CFYfz)x;fB;+s zA}S89`rJNRvsby03gu>0YiYbAkgLp-iP*ZkkVj^xP=~LQn~JpU01rJ50|r58xP9)N z8#?)U@b`XL^cDQJ)OZEyI(z{9dybc~8qNl__> zw;yKz#slo%u%GkC6CJW|1Ll8-Ot)zTqg>Jo8h|H5ZOCLYI&~UI|Ni4?*RBs?VNHz#G{QOw*@+B1LOzGuAOG+U*UApxW&cnSk&AZNSh(t%K`2NGlYY7Fp zTp%V=iCk{|HLkt97yx$eFXG|ZDU_Et%o~{CAV2QC=Qf59?@9ai&G7NLu{!dKi_2KP zdpYbbdUS*V-Hl&y z&1zSL5k)wA5e^)M{YQ-nhhzVkFCSeMPft&}cJD^d_?~p@-iX(@Mnv&ifDGfVO8RtBaz31=h(|%)-G`gXoYB*VS^1c0nSw%P%7Z!HZUV8 zXEj+laK()5z1BAxnZo=)zWezKZ+&XlLxYA(cqEJ(554+BTw7zp!Ceti9Z`goi?D4I zEc^oga@jV?Uoq-_OLN2^a1X{RahD~cSp?&r97E4xJ!upbB5B23dQt|PmuzPL#seJQ zafI?x*RNcuC!_-{CHc$~XoazhGsfn%>In*kl3u;;pl{!Cv~Jy<;NS=Z!MPnhu1INV zF@OBAh|fNIj>1A4O9$PUg-j-6Q0JQ&+qWuPF?oNNzy^2NDukwrv|f z{;`q5Qaftco4AJ^6c69bHF}jv$@ygK5135x<0^Rn8|l`oFT^xfvGDy!LW8fr)H82;D=dk$IudC<6VW4dVo;A5ir4G5tM@0Sq_K3}7A{|L)bVJ|$Ye5} zzHbr%X8c^GB&Tr4@R3!A6M?2+!bRJ`Sdw5^1W4P9VkbP&@)VD7r#OKS=lO?9!U<0C zn(#J%*zU_b3X$a!gk&yv1K(C0=-Li8d~M%N%{8^t`Zqx)v#bKnZTc(`G8uG_hrz?4 zYfos_0{jDR%r1x05;%DrR{ds7D!7jPQB8agOqDFT03e_RQUPDd*0dv`(V+}~a47A1 zw)wV6( z8ZACrE#6uUS`QCAJv4Z#)p)4Yh@!~loE*}!vq`?3LE@!!&ZMM}a50ICmoGa`Z&xG> zFsUQiu{A9D5JDtWeYM1&%p61!o_Y&*+Ra|X_2|}7%g3*U;aee@pjOF6($L zBgal%3;?S)=kwg_X*X0Swo<9!juG+Pc3W54cW6qJm@onYyz8x`QhB+KQ>T)c_rK+Q zxnQ+(^ucR*{djqK@$tNmY1^)yW8Oe8W~zXI

1-2rGLHou=cE)% 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

#YnRgiubbWl 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'K< zx=(ys--{BsAGPUD;2il<7>b2=!LI*IA(Y8t_UENGRAeh*D?Y_*mP_7fb6}%af3uAO zU$4lyttUdV;A1>4OOAS?M{<6Jx-M3{P2x;_ugVc@RW%*G8Y;y;B>} zkXAcD$-*L#v}b2@LW(^2WR=4t1>@L-cT~GOe|V!`z_$9QcKF#-n!>eQXzbYxoH;)4 zmdlYB^_KGWXTLDbc(%p;*K{4H?+LnWn&+%)98F7(2xcBcnB5r56%dckWg}I0$(X1uxfIS~BizLK-qCNGAbM zz9So47!w&0|1K^YC112J>JD&&AqjJ{uOc2cbbu6AUqm6xkG7-7m^P;!NfTukCRRZl zBIY-o8o?fO9TNfzh{6aAM+8h7!mC`RKVS^1SOznSf{TE21L2s_K=J5f1tP=UuIyLn zO`0<$yn4dgQ{y*wXo#iPhp7D_H^Og~e%a8C_KsCfkwjf3kAtq!X`5*!<=)0J z_=t9-O55tHd|4nhnADjPqr^yX!nK}KQ5UL`MPz9zmWa|tyuRs4gh;JnW@BSxSs2wp za32rtQ~V+8v5kKajGB+xyLJ&kj)MtL)@Y{x%{mu- zQ|cN}yT198NS1vVxM*eso*`etDU1oi8YLqS+P?YsCoVQq+et1!CGOQK1QzMImm?Z6 z^UC23p z#m036b^`{)bmH#M>-)*?`m<6B3#X`I88S(t|JD$7vZdA6_}XSY#iMr&PRDU-tvBs? zsKweHS?z;eWM+-ak5>n`*_^Nfq3FPz7>-deiQ_i2#P|yu75E-GWxXD(Z;#hfxM~KG zfUf#CVl9iI)%$NW^$=KM9ZQDOaf^b0OJ>G&P=;v0z~-?s%@?rkg1Ijj1mFYKjt+p@ zh~3)_v|ZOc6=o9BMn8_01+yBX#QDFH6t^al^O}wCC*I!e;W=3S6h6xobSMKQ1*8ts zUrJ!OtK1Jz!(F7SZc5&op3qw@xv+ibhKW#c%N~lD7mU+@Xk6|b3k6s%#Md0T7Bqg;+ef)s zxT5Lypao>Mp|9#_wYVunYY4^NhTejt0oYw;0djCiID_OxyJ`9Dp>K0sjxJxnML(k9 z^=SaVmJg*@%vIuvJ=#*23&<+wUoQH4z*oC#FPfuu;zwu$5JTf{liV-gS zfyWga48d$HA{$xYB}E$1U(w5JzwYBnm_2JC!TYea2+Lq~8mcihNIp$dv4;F)r@Mam z4=&)~pQSl>hfV(BO^q@p{JCU+1AHloiN#227M#McQI>f2-`|mQfjG`Tt0gcvz{|a4 z%S&gsW0_%=Sp~~p)JZHA6K`$guPa1bXbK^tCo!iYbwUr|^#GSu2 zHDz1g<;o_X@5fTY#6R#{H(J>wQz=HUOr>+R&1c|*_Ys*$J(=4a?TFeSl244gEK9tR zR~}k`DLlRLn|fR*C%?q&P-nFb0UV%g>moFiod}w=6cSBtEJ1@AZbUTLn}3_W-rNj} zny>Y?yz~bgK)Pwog&z&4?p-v}UHy4u3%BHlmAHEG7@P+EWPU+Q{mj zEVCdF-1MKU=N56kH-^bs?6?HXgH z{I_#0m14xU+xM##^O#G7MEsHPr~No=T_Rq!EKklbe`BLU~uVs=0S56^XqtM zFhN%)&E)O$3`D_kYU~PyN~&{F`6Ju7qE;aCr+OI1B^S};@8!LuvswFHpiWb!+)p7- zrIBK-!2hhI1IgXXYO(N6O$>1V5NRlS%$7ir`O2_4)o5K++ar`cEWr3R_=3=-yey(4 z=QY6w5BS5UW^KW;|JL0T*^c3(B2ei5Ix$~(bM|!#q@jO%mSw(_LyZ4XL3Dd2k*9zA z`o`a(C78P3cSsn*=onZe%IBXkceFmjxs%Y#mainej#SE7Y+q4&$zRAtP&oMf)ecA~ z^#}QQT%lrRCf`SA@(Td^Ns3<6b)&BTH!0^pSM zzSM+#Z*30c)=AL-*sJzr=tz*d%eU36r z^YuF2Gh^aph<|{80CCLSwy;d;AcO>VRK4$^87Viv*1N)9#-Eja6H&cI{r*`NW>Fo( zzJpvqv;Op1HRLwiiRfkN>v8Y;hNGsSZTaM@T^u@ocN4i>MY@T|p9EV)c-yY5{#^aQ z=}kSjYWX7-cSf?Z?xFbGe?4dYJzcs7Kf72N z@FBZ8#zVJnPRK^0YolD#C2ukLwkSm>j8Hvc*M9^m!+Sr*!rQFjLlE$MXSDUV0SR&L z)y{PdD|yKZJke<8pV|36N|Lg6=NQVZSvN4|n|To1uOxKfvkLsWCJ#=sA~`|v{aiU* zytv9qOt>%i^_awSBJM@$TSz&U)U^e49=)~>zg)g!^Xb2(hlZzZn$j=w1Mb<}p`Vps*og>cdFNh@N;hE8%*f;=Oox*a+BZxF~ zgI5zRz+{u}D08C0*hXeo)b_{@x=P#JY=~1MfV=XXV5Jyl6Fr!m+(mf}H=tQ952Rhm z5Vee*q|mrnkq;UlUpBx+gmqY__1=mDc)Qk;!+!ZVz4$XROr&8}LT+mIztVcCn~|B8 znTZRX=B_(6D<6hsW;V>sCU~^#`QE*C`SJ3R_hDR1f3ISuhhwQz;*givH$ILlx06$F zRJ7jnQysIUexF9AC$zeXR!K6wpPRQ(#Y_;HF$6cS?@My(XKGe-L`s0&c@XM=6|az) zxyGz@Ba6hA`)6ggya{!(&4FACmMtgRslUD=;8&RWm||vC!B|?~NX!rJUtdD^8ko}P zL!B8JJVzB+V&s%{N)B8XLdkxOJB%70=0r0GkCBCD=CMAJZZ|OXA(k%uDRk=Bgf;)_ z5EY${0U|YXY9sr!F}B~3JsUJ8hwayF%Lm#3RlohtGg^x|OR?09P{yhfS35*smDOeK zFkx)gE8SQH>8?dRYe;8%q$ooF6j9nn4|v^H*3v$p)mGnN696Crlq^BE*!6WC(f4N6 z9UUE99UV~G*lsXf>mYD9cPayf<;VzuJBPDFc|hplV`po4n(h zH7s}B-tt$z{b^_zh~R9)&z?ABW}8#UU^7rOGDoLcip#vbKX9HDIC|~!_vyNO@$-Lt zUZ2yx*Hi$lGj1VDk99zFh5per`+eZ}B+r1YfQvmD#~-~yv!qU_HDtJv#8LO#E?asm z;~l_>7{et> zx3)}9TA+~Q@~1Cu{=G!bw!dxHK%I}PzAta@5H{J`povw`T3JMzS>Dv}21K*%FuBYc zh;WH8F;TO;!phs`et8auA7s0RCjhd2Tn4RpOoP6w&K*>Y$F$ZagHr>L3&#hHYxnjb zTfTA5sZSzkW??16*8T+3>{2n{vn!9boYoF=wlpu>j@F$o+g|*R7#lZN9(}`dV)?>f z5>m>2v75&bn(gPik}wBVce{`uZOyn}x-MV3HocEF`P}&)^WI*sHw3p1UXgFN*alUr zqnW|?i!^-#3bjoYOO82YvE+9eIvUnFO?FQFO3yh)vsH}@|Fr22QLD~NR;abySAQ*5 zwQ7uBt>iVKbKUZp8^?*!MqrM8pAQppK~OC-VjsIip-r7rO@2@UI>yEqUDsztOG5EN zusbn+ddn52?U1E_TYzsg92Y%8o4RL9U~ZckHet$sZ@;!>lQCUjH^F)@r)V6t+ILx) z;y^M94E0*g!^yh%k*JC^^ar+i{SCZrkJWpe6EqW?MN6&bWbi8w%X$4QAYu`mm7y#x zDP4`mYZW=R3Oqu@A6~csT^ONE-D5p2rw}&Y@-%fhy^I~7b=13I_R>!6m2^Q-Q8<#+_zlaAy&7~M89yBLoT&av016w{3@tTK7k4!7E%&Q(tS1{ZrAlIPF%N)U@ z$CuoT%aisiR;EjF$;`F!bz?J|Th`kwT*kYgit#gCHkIWPnou)+i`!k6<|k1zqI6NV z##Eh%w9FmRCRJZ9)|b8;JBtk`?&d_?HT(?+S?B(P++^I<^_^dJ_M8ij*=zh+HxqV; zHM42ao}_FY6XP~?>`bn$b49+r)5GMUv~WJ6+U+EYpw%pIKl+ZxCwZhu|Kz^#$} zA|uoD{8wkbrsq-jHbdjaI3m>CAVs;7MpBe2g=%EI++ae^6T{}wOVZ|L^(!k|kpdeH zw5fdXxCR>TLY;C5r=?k0B)ds?Ouoor;M6z~(Lqm=c~eE|3hSOjH6|-tqi%koTBk}@ zcW60V*zovSO|Oo{0tY{`6Asg^kXK#U(}?Ks={F3z+zUVsCgiBHSR zzYIEWw{5odt%2yduZ_vJMzx!i{XMElnkuXU87gqH4sx~eK6Lf}T+kjK2SL_r3ad?@ zxMrNyf9K%#ce^9u$|{I3+sUjWO~=|+d~Jqv8DwpF79(;owfJc|lj-Gy3aD(hJ!Kkc z>kc%|;6crE&JfEa!yoh!EY5hMdiZ#J6ZH7#uAk!06WEiR1RGzaVuoS44TaIU0-!;J z_(D~E%LQ^0CA!sGw${yvsg=?x+R$>L_^KIU{W)b-YJpncsd4u~jkI<{p=}HP60GTn zsmQ6P(yMeZ%ydz>zUv{l$OY=aw96v$NWI~E zWg3H6gPcTM)q}{?3LW}bSf*-q7B!$~me zEjP&4_{>sqO<*DS$4n&oO0%u$MDnJze&iX(KcMOE-LAX{Ky`67Thm+f>m8|# zvbNc*nDBV{r`I@PvIdHUt6Tf{VAUSYaemunEcD)Y5#C2m?BGl62>l${|H)+Np7Wt+ zLn_AW}_YsWu=6##s4Pd@?y{)yhky3cODMDIrfV3|pX8j@travj?k=$%!<54m=C} zuhkds0lHT90vZ~XK`U7ZDpD7XZ;I`b2zE#wFsRjw+aOyqk)nrZribFGp(Ik7B=V7Q zd<~ABLD20+aUbci$;*+nQvd<}wUo2jsyo^J+=24Tkt3xtH#P0WkDa=NlOF_} zKUN__dN@OO3SDN&NFalaH2%nY8DtHkCZx;i_0{2|4HqQ*+Ey`K{$Y5nfhZ*md#0>G zG$DqQHH@aT%AaEA#cx8n(d21Uam7uoldWe(Vw-*U&f$-^20|ix`iO6lOeBe^9rze~ z^5^+rI{G+x?aui~zy0_&4m%_IoFW>QFss8&moqXlVo5`Q`c5oXhN0kJ3S6PT^;V6Q`%0TJ**$vZXQ~9e=95;_0rtd zoksUTAuTJvdbACKAi=GI`1nFmi(H1J6<{?_aQ0Sbz_1KkgL#k4-{_`PicBH!^&{wk zvuNAvpVoCWToWw@xg|OuMS8H|BQ+Q2LqbddA%`HnbSzC2AvIjs1&&0%%_Q4O3%{qm zCKaw0(Tp=G^lvycB57#7ZyAwI?6qL1LLB`UQju@rwDljTVwZxl{zv*hmouYnZ_j=` z3q68I`VK{zkDmm}7znnixU|zNA-I&@W56*r*?VT`g*m^%9QsqA$Y9vf&L+XKb<3&t;OqF$TaH*vuUF7?Z@MorfM7>Pf#}?tQQ4QfaG- z3X}SN$1#z>7k_UE@;p>d9yK<~Jb^)DMH~uX+Kpm`Ap!`~L@)bcnJ}jA{>3BT_&2f0 zk3_>}Ovl2jAY%-QADSlp!LEYs>s2Sga>^jOo_#@0R(IKe$=kd}`GatNUnD>= z7G%yeJ2MV8>D7?g+nE6QecPV-j4>Jy1}_l$?mcMgc{W<$o$T=y+rT>ywRm~EEq!k& zY;x@9cI-GHG=aZQN2^1C0|`HOioth1wfHtW_3fb+W#(O1=!w}7W2AidTRbuwqMr2C zv~rJ>L?DJyDAsW;b#WgL9E?}x^qMoo;=-{eV|~qZ^)y6bV%( zfjUe`b}cRib@|QaLk7qaxwkUc#$4EU_n-gs9Nypu*r37_M}?k zl%(j15z-iWCEyq3Im(>h6^;~_i{i-Xv1Rke$W>V@$f~3WXQ^i(LEb5zl*2aFu8u?Q zdVCY=oBR`N_IVF<_EjF8XtAD2rPSGoKf+Q23=oInOiBf=4Tj*%a0v~CW3@}47SDEgfHd6I)t;En_nSW;j%TuRY7{~)@8)^epXRn^ueDm;ZTNlZwWSV3_B9bz zPa>NW!-58zOW~g|9vG314LCj>XM7@(Ff4pNEDD@lCI20H2;RIAScfl1M2^|)jD6G0 zhBp|{Nt;uiF(0&U=+1}Cv5W`BT0tl)JLoPv4|pud2(Ge?#4eMOFcR2*X{+Y{~;3K zWcg~=ueEPK2xrx;n1=Mmga5K-R~cWVdK_?-?NDD=6D8W$Ql=ef2JVf5w_-j!vvs!_ zs&(J!#T^6FFO7rF6uW4ZL4>jGkb&z|*Sis2W%Y8Ja$X5O?Ekv|oEH8dx`}9ktW4lA zr~W``K2SGCM(oB;{E@15mncMQb}j-ZTNNQ^Vl22M{KEl$ddWBEI9zZ$^lu^=Kh?Sq z5EAl*SO=H=mydo}r(qW5ar!a-Vw-p5aFC(p8KE~+k$JD7BhI=K3}^GBye|VWmBaq% zBFnX8(7nOy$lx)BODC(L6Ca{?$5TAPIh9Wv#pbJdQ%v4nv-)6#;s_VnhDcp149}$f zOTc@+6ikTLj@K0c1;-JOu-#*B3-0Ypim)M>z2P18?OXuqSyO+lngsFqM34~+MgTf{ zvM#VQnqO)ApUHmP<14cL=ST2?aLAL@d34#3vCu9YrZFMD2StC79g}~!cnSiUv2j<3 zJvF!YK-a}VYuBw9v`76hv#3Qlvheglf!&XvYrAmRIdK;Wb9$$nof_9&a2r+m|HK0? z{Vn;EBm>Lb4RV-*GO(Byl;cO1R|VSg(*)7$Dfd4p2*fADuL9C>^6 z>G7d<$0ND07w8aSX)zf6bJK+$TgF!>E`elHw8ZyceBM$gF%VdhOvYVn(!0loz$_k& zLi#RkA!7taoo?deia+XVoKoS%XgY9SU6-}03l!wYk#@MHwVY&ylqdI(uwDf)L#}v( zVg8v*?nngme*bM&$F`4j%=y>dHBi|Xsar}=uX{dKI{$I#eV?wk?>UJ_MOFgYJA8Epkb>Th`9w<4cJ#b*-R9=B77VJ2<}Vsm zBjEoIlBG(WOAMaBMACqb{Qa&O)qt6P!mGY~KYnnOqR(!*yiO9&%2YCE)gtXoknYxC z*9+{#?-6h3(S%y3ESUGsncGOmDi(Nmyk`kBL|g>O@%8h=Z>jxZ(c2qbtWQnpQem_@ zJ?Y9J48@SRV)v@7;nEcm(F)ZZKpB{r)(W0Lx;4Q}?UDRuGL^DH?J$$a*lmw-=mK|v zb_8Ev^P~4%8BF{iMl@KTeV-6aosl z-Zgg5#k{0tYy$*oR@@tY{u~%N&(A7%x`X>yP>)C-UK1Re=*|S}2XO$A;q=^hwQS0b zuz{h%@5SL_c!i)SNJb)8H;T#^_@kA-_PTva=xaK=(-erh%BQdf8nT)us0i2=g{lB$>3)ckuc6y~W$Zu%bR3K;@*Ljk=aNwF+rf++!HvU?9^ z*CX2@r^e zKP20R3Yorw;R(u%efP*t>mRNl&?7uSBOwG`+fdJEG|KY#!R^=vXm8H9;&V#I!p$;$ zH{c0ip9>w)9)Ku#oS17%6FV%A!ErPm;DY6Mqbbw1&FgQswBu6nUgq97&qN?rUpht{ z<*eR+X!C2~d)_!ZHh=V3IgcaQqYg;tkD>1B^!Ntdm&-IxLn1ya?mzVNkgR{}v0Qtj|3KXGcOiVa9tK1tQ3QK#EOH-s3wWZk?N7qmriOB=Or#L%luc zM{mUhZpcH&TK#D%M{lDz{ZdtbZ8fAq}_ShyEE(ea+aPBfg{g!?HB)3h%Gg zOOzz%ycVVO%ch{W-UxabY?XuII7Gm1Ha7H%?b4kJ<_%2ftDVK>w($&*$Sm5!d!;Sm z*t-YkesdMu^0BBLniyp zsXZ>A=;`Cy1!+jVv`(ab>H~&X&`vct#BcFkcwlGbP<1|2&jWLt#l~(m#g2ht5e@h_ z3v`c%AlJpL^hrnWzUvU^RFUIkn%c_;)JN0ge5;pe+S!*T!VVHY{5Qsu^LhH_Divaj zD(U?i)88lbCPSV08F?6pyzpY;vl7TkHfljz!?m@nM>{^7C_ zyrYc1bf?q)g`I+P9j!o}Su%VpwTI1d9e5*?&W9b-Is60Q_&iG6XCHAuwo|uk3I8?j z?2dhA7rO*8niQ`Q?%e!M&cz!cy*rS+E&w|4QDguY^|e;E>HA?bR9>E;`UhokSR z;T^hfRy`tMM-R-OvsL>$&?bpX3>f!6zlX4zgXP6Jh<$MhDK%45FwMHUH{~4QMJzZr zQ@mWm24j47(I|T%Nx;-{yL`P9blsHne4}csrA=?~JaLJTGYS%nWySwmy;5GRr^~Wr zC~)((JL%ZLjqp6Q1N+a)#Goj9Vs0}JCKeCQ0&^FOaKb{`9}vwXkE<`)q5=9;_f%P= z%D&`5Et_CPDS8_U^n&0)z*OV#+zY@eh?T|*LkZnet?M%`grT~BZ$E2#)%bOJfwwBA zW^*;_&!oE!*Wx{eBm7EfD_IOO{`8jT@G&9lYu+J$4w2&TY^wRNe3c^p#J&W-d^2Rq zu&#?!&;w)us;B!zWeOQTC4q{9wbo%Z9KN4LfNqZOV?F~9XU<~Z+86-O)X`PdKK=VT zpHj-f&W@Z>)+JJrL);Jjg`>w&=@wW9cr*~LOYj2KBgiE9 zH(f6^9z*OkC8)OfT>;~e;{2|RSn6jz;pA)ElDJF688r?PBjVZ~-R~SoES;sLznG+* zYWokOvcI*FPMcFukLq{2X@S0b)jw!NR#jC+wX!W~4|5P_=Vx{SYW~Rdk9OZNgcB!f z1adcOq6j>5(-q=uJlpCRUGF03q^)&oa}S(rMcsm@I^n~J0KQkKlvap`Mn&ri<3(Ju;YjXj)PQCzb zp%3YbiqhNq0@Q6p!}IBx$fiX@$3%B7GCuAwD9OtiVpfWQy*(8nT@^1PCNSm*VhUao zf#eVhLJ!oQR8_R2d^mazUB)q~Fwr|N(y zL9TgMPE3AsXG&SBYXrn>2G5&Y0xz^UEVH3wQ%VAZoFC=SrKLUrDNjrThwi^E;8);r zUOxB|8O&l|94OH?!MKa9UiZ-PeSA>`7$MN*b0oVm(^0@apsW7DoPdqHaXW{tInR5Z zR0`huk99s{a7+oQccabg57Z8u(^E2t>HJpHN8idpvP?f+37}zWst-BiIm{-q9q<6b z8Cduq9;xDFr$*Srmoe$+KoRVi?I0#(Xe@9i+lh_0(h_QTGjdocz})?VW3ZeP0NYkd z7y5;41X5J>+tE+)zE54TnM{-O$wf~crt=~;Qv9K>G2VlOTFHkp`)v$ptT|6a&DmoL zdVm=8V5Pp$PrdczEgXO4-h~XPla?;Knb-iUB8AXYFx;?45&QSe)F%L0 z#i2<8HbYHAX)xQ2BLGg(KkM4U=1;Q@3uoP=j*)>m;I$4?)XMiGHcYB{Y$y5LeB=0jcsI0ldX=?7N3 z%9m_+Vl<-ls45cK^wTqYka|z}U0DrZy_(0hk?Ow0&nprk!}bUo>iS?OIimN^3ndoV z0MyN&h8C*pdVWTJHEc?LDJ*0bX9+cVl+VA*031Mlgys{sl` zR9B<=u$OW+u$L-bS-|M>K__hsK!-4R1@Oi)NqT-Ca2pA_EU!Ix25{{oBqqat0qu|^_gJp+A{;A%N)QE5zepNjCqr* znXoOPs5^3v!<}vD*V&Kg9jiXAX(=QB08|FdU)z7s8cYkdnzIPMM`JPch%tzdHANUR z;~=u)AVTBbnUF)T%R_RZW6WXv7ydVK7Pg~=g*F?2av>Rs?0!%8nS;k?EgmuzK3`~I z0&}>-?wNIm8u2JhX8D^h{YO(D3diju7(3A?0Y_t)m6*UFVxzyCc>+JGNTN&p5-Nb1 zLPFx6w2(T71|c;ybaYhI)HGA0`}5z2h4Jx<%uH1_wo0=S81n(h6e!{({$)IMIq_vw zj!6@6?FVV?F)^^2!BJ2>2%nJnn4c;Z?ORI%G!b>@hN?#+@iq-pWT;>LFW|xLh|ZkC zPkj045JoBF`+|xfJHsgB_~d_qzJGI$bu74X6JN@V9I}agL`9CQ64xf?b1GDIcLF_$ z7YW_QwlP3}WiU%ogtWRFK$go7KK+DSr~D{Fa^m}PH>q%0>bEZZ10gLfLLQhPVi^>z zQ!86QNIg3{vndRCL`t`}!p%gBll!e7Kc~U)IeoA0MLhDst?ZYbX{21i=-+=)%pt{~ zrNW*hKs9#1Bu|m?P}VK-Frxu>r@O(N69|q7MXgi5e&7L}KlxFUwC9%)7M`DvG-RCW z`Z|OB3Kpc!iuEK-B$`|V>JNI29BIphmNw>Bg45H}P-WD{A;j=~!iN!d1;xird)!9mFzc+ zdeOR`Ol}7h9^ZBuJYZ@al1_!rxZIM6G+60r=)Z^tJvoZ5Ww02BEV78IEB}i;B2sO}g&}Nig_JWtqAS+o0JVDzoP-TqVx8 z8P|rcs0lhcoV3XcnFg#PbS4SiuwtJF`r70D$rgUfPSwFL-FH9pJl%ZRo_K50dULqt zHtR9b`(IEUD4@puT9!krJh6C2HdYxgapBL*A39zKn=_03Wt`u5DnT3M(Q8N7XDTKy zO^VA$*Ze$ufi9f7q$zG)vpiFSX`@h#50_ob(F_Zd>O*aUCxet4Ur-w_^f}DNGt6>B z!|ohV`y#Ll2&i(vefX{{W#W8&Q}^i%?&H#-Gr%Mx>`-w&ABCI&4*9JW4~8BKX;2P+ zCls(gx0kOQtFM5`(5}!#1rXKW=v_lod`h1N2a#`v=q4p{)3<=+Bmfc39)39u2kS>yt?O8g?xH($21IDArQuxfKz05#ex+ zfaPx*Jrh&URC@bAHzw1}(FRtsZn;Zs#ivzy?As{sixfz|V!OYL57lz|rXRVf9zCQ@ zo>zPZeg(+H)eWAnUpWkYKCa-rzl6~Yt0!`kkQyk+#5wzZ>0z9nd4>)&*+hdF2uB2a zZ@kThiZ)viX@J^x3xLYMd4b`cKft=mi?Zt7MaVr&-JwMYp)mBUVGdfuP`o_$d1+uQ z{q&dXqO+;%N!p|RPg=*w=uKFssj2CNghXAa(19)$$L9W2!cJ`xCL;e1F)$fV2;k{uCAe#wzxh_LpUJu-Rnrd^T`RMp3B64U^| zL_iD$NhsO#K164Xsf4-J{l(EcA;!7c^4c{pRjtADqV2=t;Dn&$Mr$&o%~^lDk8*wO z`Yw#fT@jzlZoO5Zr8X)zU&nrMvE#EDqvCDG#P z`}a;FqWfg8O`)2nht4{2la8ne%OKGPDa7QtK<}{K3Hi zoNAvvem*LL4&dNIX`*&^Rr0}`BJb&q*25$&>fsmwRgle>wd!NFT^|guM#QQPu`XD5 zEI@+U13uiGyzx6ERg|-N8;D|V^*g8`Fl=x7vD_-TzWhd!_OD>doB!n<1?9M|^9YQN zsE(9>;ywuxS=xBIK*Wy*2@kU%@ab2V$`j$2EtM07FST*X*EiJBI!xHqrv8P>)RSYU zd8Qp0hv%Z2mfAg&LdH=hqiYBlan3ko{c=rEgkiA;A8jnNsMNkDN*b!coe_2+Csh!-^<*L4Vq{ym=Gq^Qs7^Ga=-rn4VAg43b*MuO zk@K>HO|^@cy2l|<=>fAL6h%OJ1H@?x%8eJkeo*$!d?FJCc;j) z$&?RSWjmscv=5cq)8taIzUGvWxQx@hv|S+mF5#Q=trVSiIlU?cfzWm~$%uWIklo8K zWPYxVd^Mx?o9z#QJ^~s^74#42ZU;Y}OCI=N!||5Nqn&)ZZR$taj|-tzeye26T83vr zdNT3hNv2{Lq#^i#8og69l=thQFzej;3eb%TXT&I7A<}|qyMj!}E;P`Jwe3c9|W1OB- zmn-_D(~R%K=m&cF_P3rVf1!~00B0!0R4$ubn!_)Af)m=rV%u|nw z{XRG`YccXcsBeCax0Wy}e8!BYfoG=nioJh_x>i%-O8Y3AB$>Ww_E3xB=O>}UOX;_z z{M36OIcTeGmwby0&1lAKP9t3cr_sUKynQ#(b|HY`#u zv~H@mIDK$cA+{56Xd}!V_M!jWKIiF@;Zzul?7!q6@|l`aKb+wh6>J|Rz)rvBo-jyM zJGPt^_n`BsmqB7$N3OGSzNV~ONlzO5pZ5*N5S-+QkY5V2aC5W#!M+8aB0Bu6#0TD0 zHC~Fj15WJqcexB~vXzgz91f7jeEIuAHKqJ8cv^i@z7ST|;I}KT5(Q^;Mjj*bPG6|c zzT(X~?Y=HiAL!>*j}I;=m_9_)(ck)VMh6^^S2zo7JWn9^XL>!EkC{g973hJFy+mKK;2!y@?Kif=l&Cb2R6-34;9K>AB-?COL%;x zL0s*G-DGAL-CFF}irII<4A7x*|L>x&!pDH6PL)#6DfXD6Pgv-PB|!9Z7VZlVgg)EP zuaN_k!-o0*+g&mh=b~g?({=mTek!#7vu+zB!Xc=hK5;QtwD`{vFwWJ>R|9r}CYE>U z900bqe1!6~0;#Zx7K;>$P!cZsScKS{xZ|}lakX2x!CkL|Zu^PIuAo&1U4>5u_~=*R z2f6EIHvTF}TM4<%0T%XFA4bM`At3AU`)9j{u*BZUH(6Iq&yfvTn zS>n`I^hv4M1x5eQLf^1JE0hc!nrXuk<^udvebo&1yJRY@3xK1Sxz@UM%mc)R;lL2{ zed^Oilm9w`=nf{n*$g;#1MB1300WHYLWEs&hhAr8mYKp`;mPrEweN7LyXscA<5cw8 z`xxk3f3^SM-In=3w#{;p6}@1N7rYA#0HJ#5P@&dkn;A>ERyox^mmYw6l6d}nz;Yf_ zb>1@&KN;K_x^E4vXei&=`LtlB!`TrX0S~Zb0&ot=0IPElva1D)ER=;ll6;}N;X7-> z#XHQA6p1g2z9CRI6C`;Y)F+lArZ`+AdG>_h9FhT6=Yo)3 zEs7S3P%ig*2r;28ysN{-jFrpoI~w}?MDydsYe6dy8vO&yf9O-_UU*dtp0EHAdRG?i z{H$;hlzPHb02|3k6~=W0Jla6g(M)d{=-n?=eJn}t9Mz>xyl80j)5B_0-CU4h^acko z;CPMz?4hGHI{~;*ABS*3cyXz?nztK+U0n{gv!96GH_*@~joTf);A$y!%!(W-cZ&r8 z$OcIu0URu1@(BTwQr4>>@Uc3H$3$ac7U)(2&#vaskmPYlmsp_DFQmY)US-Y$*UpWE zAhjrfA*R#B)eKT$*W6xol}0J?Wdut6L3#8s26^;XgU&zv19?irHY4(k#p zS^_j+%G-+oo}C2olmJ6ar^BPzm73ahqB4h&dy!8D7sp@8zW0s6*Hf|kUYG%T`z?BJ zEnZu%T5TzE9rjn|2B$eP0#+Q>aU~Y<5Tb?WQHSa?IPg3syANPM8~&Rr_65nWrb}$l zvLP_-?Rk=6kudax5kZ#nP4P%W!0j&Rk=_7!`0dD9r}ICO0zB>cGD!yfZ)_@Ca~DjF-61 zjCeZgCU+PZ?|mo?f*ux9jd&Mf*UuMU7eI)74cisYd)-1N#t*uuHaonYiNBnS=o~uU z>AkCX9g^}}Hf5QrEN>37gjZ|aTzebD^gQ0z&pQn6oqAUrjanbk~fen^eudM!sWtzAqK;#7rB?t z^}U>ny`BlvpzZs5?HeBZtmK5LR-=$%`k4WQapC&E9ABxzxm zMSwxCqi_;{G8%e1+(CqnU?*bcHMAZR0UjNb(Va}KEr@p&u zsgL2vy_Q`ZYppI9n(YT@e!mURePfAzHiK+R!xe9G8fE|?`(F+fe%Ta+Rj*j-J6-v{ zjKI4kImQuFy@XL7!Ktcr)FlaxnZU=FTw23%@O2?{yZvJfm~J~sV`wDo{q|cVjXs0= z_xbLGz8F9EeKuA<4w_#sM6DHkfj(Q!^N`fu8q;K$w=ti@9DEbunvfKoHgsL)~7|BvfhN1gk7y{kO)zO zZ=lxyBHSdj#IX9(a8!LT=yE3ZdM=_Pe1)cj2l8 ztk!t#zSxao{Hl*m^s?M7*YXTuHAQ7lpRLW~(52+AWrr&iF3DyA+c2HX|GU^bts3uQ*`1`ztk zXuEa?yitrV^XQ76$4$BS&v33(77du%YuoXm%j7CMELDpc$hff|ep+F2!h5J|O{6;| zO{T==IWui{N~0iMY7PLsN{TM^$WgM{fh-e|G8Lj04GF8oD~Q!~>|6X-Nl#{QyJW=qkP^P`v~T?Y<@Zx<%|TPHExa?53fiyHdRW-m zI~oPpY$!La!ohxe2_-kr07;Kv5{`liV1RYMHl$PH{J_n=jawh5mUscqqiQN78RVfc zR~~`*QF?Sv=^y|$(QMOx+ye?>==XTV-#faGdb))lyUfTW^un41Kc4x${Yy*cl_`U^oDl{jt}H7SYA7sm$xQB}?zaRNER` z?IGnXUOT@=6r;>VWnfdn0m|-X+kB2P z<60{qi3-|$Ug2VTnAgYMDNr`iS6_ppef2T}?zT%F*fe~U>dzBV>1RZ@(a2d;F81D2 z<1o$^(wMZvEhACEDnhi7Bm`kwQ+{ZG)5^qqa+XV`@Mc$@Wj`<%D#0{dU7wDJ#=6LU zQhyX^oEY##Tv zdUW_GI{~uJgF&*hlY8}YYDsa!StUtw?Gl7{4fXZ;m|swz)e>aBm|$UgE% z67IJ);Z> zbCm(CuMhFVzy!c1nyZ;`p)el(nE64=zx$W;bnRv4n!Fm7vyW$yU1f9oWDEHA8YmX- z3O`@0hPt3pl%viuj#GS*5li`4BzY|$E`2NDEs>*M}@iIEPvL6;5PALrbRR)`EkAL zeU?GsK&|tD0NC4|FQKv zY+*8JvIpD)x>ZEGj7Th*A87t!7X{wwu1@dNZFz060`F8+k56Qb3!lL(&megNsE^L` z9yBHZ)xwUps{aQIm!h9%vEPeW_!V!1Pl?oos7$`wKRBE1M(rNL2rgFmN@!{%Az8Qt z;K%h1+guQrCKob}4!(aF=>DNir=$CO2iU{eZGl^3Gk_`>RmoCaMpcZd>H+m0%8H*G2nhf zIUZ#n(C-0$S6((f$QrwqkA|Gz&q1Vb)U~p(O<&l^maMkfX`HdZH&9{W=x12dJAMY> zthavtK@7OO0H2Pa#CTEim`dDFXPr(Pxc7rd2HigjZuEC-T!|tyu2C<&Sz)@+1YK`f z@|7&?Qov_LqzzQwAEIqJscc(+p@0znrwdmeAvtH-F9dMZ)kF*Pe<2sM^s9*;z>_AbHu-9X%Kn43ElY2q145Lr_~yq-zPXsOl%s7O?#xnRjQN?f z0^^-B5v=I$@R-1PZ~fv!7%@IgMAT>$-|Ue*r5akrLx=qW7k^TKot!*)R&X0&UQ}YW z1i(AfNJ8Qh5wg&Y7+BghbafC2uN9HC0moK-cW&MvJ9*w8J$c?AKV_aDJ!PSvUgx)+ zWWP9`{rq^oSN0G6&EKnzuc(P4H8^pjr34+QE1WMZ5TcW5MtOGtN0uc~!^kCZqp2v8 z=SRw20AGy-o$4+Da1-ZW{6ib!2NDsrK$-1}F9KX5NeyQ?i>NN26Vr`$av!)c;*2X% zgrgj7^lR)L{q7F2lq-2Uh={Nz%n}?~o-Q3_4K#>s?FzWEo-7!IfjO1DAGH!EMezk$kL4U_Jk#Zb0sF z;C3(m8bijXiHOd`3)wR6Yx^8f1G7RE{ouWe`N;bQX1?Uq0J3FyxRY-~d@#h#uL)&@ zu;O(bgaXM!XKk^?7F*2PdD%+<|HsB&Vr=Xs#>U28V(iSo+xfujiHV8%6BEG4vDQ^n zC=?3NjhS<<3%&^O8id;gCoax+d7RY5fANy&+W}f*!vo)Ic;K&y2|DX>QrG{QUKJe> z0$29fl4JgKfaO&aGh1*={GgtSe)H%~-39Q~Sk7nqqyTUE?q7tC!={NDsl$N#rvWC1 zI&$Eqv2$qa7k_VGVCv5gFv7`0ff+*^L(EuvKmZUrUco`otb5+|R=3z}yX zB+op5Vq)S4f!n~XwZPMt=r&n{WP!VBp-@mep~W7Xqr2!MEa3{g0m3ZtnIZ7=^H|}{ zrj79tu~Xw8IlX*EOt6p|ob>g-rYA)QgsvBKwaG4r5&A1D*Wub1P{D2XPbBYh5?D-S z+zbE)-2GsWcW%R&KadEbN6$dp$0ZM}0WN#DxH%Msnhu}nX3-Ioe{jiYC-;N9z9Ht# z8wPLSAZ3SpzUOPklB0=aCWJ1F%md zS&IASu?T>(-ub=XKd(XJM=vC5GzQ!~A^G(+!L<*7M?WlX6E}s7D0DB4{?I=P1Jj>w zLI5u^(#hXJLyYMdu0#=Ls%*kL}C;2AuS({5k6SBNIz}drn}elkepiN5N^3o4=(*00?b6au9OL zU3NL!JFwb5crY1^ZDd>XySY$wZ(|8KTOh2Kgj+^{Yoz|? z_u0G+3|Ki#8Zr{T_1^L)KehM!pSq*_pF-zSsaq-;319QHbDz5$s--%2zRY#2OU?L5 zfvnweliD4_Sh|)$X$I2{fgY)@K#oU$OZQGC#Ow>q)1j0W!YDyjzb@GjgAurHj>bk0gx zPg)T@dv4_c@JTz;(;G^E?$f^&_+=81^SVR6p zxkZcK<-^C!xVf!1y&XIZ)`5RtgFV|7N~T4(Q{`d382~=Zyru|jTs)%ORa~4H^qXHi zCUB?PzZ@#u7z5s2xK9aBC0unDNIbP)j zDj?)u*{ufXZ{O!#EWC?_4ld$xkiCRTO8{w!zAaN2t*fi6OFu2{23HzYX;h_Am1;o; z3G)CJQG@8&$VFFE#T~!-|Fb&=Z2N1P#eK=yFc%iXdh4yX-r_*(w~aKq0|W-A@^Ph? z$`kT3pUNLj`6ND+*gDL8`O>J(!N|?Q=yCjNnus2a;r81BKD4!crgH?y5u4%`z!Jd+3EG@;^ngLv+wZ73kr2hki_R2hj!*e+&xq~?Ia=BI z+6@wXXkWlm#L+1Qg#!PLaHY`BzA#ckTe#)m022p5I#>ZFHtO1I8&j^Ge< z*ueGw3{jh7QOmLDWm!Yy(ir*VVaYr0ZfW-pfIZy#`pZ&3J{acauWV}|uhc#qM1AfL z110LBFY#!=ZeZ8zk7Xs4g)hHs4(0^M?-wMis{dk+fbOj?9uXM;UQ=Iyzz(***J|Fn z*pY$OP!7gEc@a;W^z`()ZK`1rnGjdkfM4{D=7>e5)y3CDF`nsOCEcB#o}S)(>E_Lw zHzzy7l3raL#>$>@Vcb@$CM@0OO!t)U_QtcKR>ZKmQ=^8RH$%x~>jP)22-mE@JMMC)%dXMS$D-z5KR-FN2=40~ar?j+^w6 zezrRRZW85Spwm6WbD!iSr^5763fcUzl#~jknv0i-1ra}5)N(v(Ir@;XqgN5ROzIck z?D-*qCGhB0cJ)sq+1uGyAa00ZXT&F#4*>7XE*#_oU2i-~T^D!`?0#6_z!h@2IpGW8 zMKz`cAut?tO;e&thS0x0x;>^D4Zzo%uo@81*uG?~Z$Hn5PhAL&A&>f9{y#_h{{E#l z>8N!$riR}k>IjfbW5vZ!dCoU2w^DAkU4_*o#O{zQ=@k~f_FiH5+IwB3S6Et3>8e{F zp(RF+LU|?>zs?*^pV`Kl#@SCfTZ|%xf8Eh=E7-`MfGEw%m1QGKq5fSypLUi$liS{?qKS0X(Wc@Xw2zuCL)m_WjK7o)y^ab0-xdz|JLv@ z#+i3%!x{!bJNWxEZTh{-6uplYj9>}&VC9;asf@t@+Jklw15(P_QBuxcHYw%o$WRDH zD1dYZE+4WGgD8YU3bN@XCF!2lKP<2dxH*8v9IMi+P~go9i|@vqhn&m3d8}M%SHaAq^9jO?@b)aH#meE+ z1G7%9v34u8km{!T8W?c*gPT169Kd+^YILiKOPuV{rvQ5XO8LgVyvx3PV{h)|Kv0hR zXB=Q0kmW#2FZ*F%_Oh3K*#OHQ_B};*_*;Fh-|BPyRuQRY5sZv0H`{jcxN3#CY8?S; zU47!h1C;?nvE_L5=2+BnEP7c2B9@8V+i_dhw*Ojyy`OyF85!Qh8*=21)%LxGFH@-{!7R`IMaD>EY5F96#>x) z2ATVbcmHGD)ekey7p-~_GZwz{T<>=uD|2s0nY)kwcxCQB7P336ZMp{+kNKHb8I1k@ zcn}yx*uwcZF|W4u9Z>5C z@7%PJr>c=~i*TV3gT=x1hdeXmUE-!c?WVDQ`1H=|9Wn?=7w7Mb*7pZ z0yu^~phuf&o}6@)x6d2<-Hp>e*$~r0sDC_V(U7m?MZQU1uJR(wWg`ZRO_m5Ntgv{p zxKtRfutJ5fFlz+?vLUGf)j+xd+5hr=zwM!@WjS^v>}tU_M+4pev&vZsOulFETdXPs zw+nzfdid6;4zW$V3kJUV-pUUI5IUA~khAHnDKs=Rhoe(9f-PtRiLxy)n8-XAIJiR> z_<~F{33&PSK;X&=-RF@rar?Z6>U4-9p!W`?_t>vL9n-VOuyvNi!SAL%x;Z@)DV#BYJ`O@y}KXfNS~=#VCsTrFaCIC z?mhNLImeF|x;v<5KR@vchgRflRmE`T+sh}rzG;%%o2Ro)X_4FNY-@ZT->wLGI!kf(yO8{Y-P*LM@g($^S75yncWj*ZQdTdK1i1?J|<=!4W zZuilJUOGJ`J)44IXQuD{8>mubBOFq3{=?AF8GOJJMf!1I^-{nUO^Su1xwvy| zU(I4ldolKc2O6A~vF*#HPXS{yVvNfY5?byR-TWKZ=;7*@3mdioRLdfe#ZSkU9}KMm z(|_X;R2THk#sXABAZ$^$^hw`#f-jSfCFVWd{qy&JcSmm*Pvt+|ng3*W-jm(=PId(@ zOEDcx`{1Qxe_^Yp%**#LMG=_PwGAA^p`i!oi6Uxs%)m$ALPNylmUrX#Z9(aC9GLjJ zO?vC(H?788z&fkW#e+Qgl_OogAx>vkKth$%ekGk90;Vkl;;rYN5w z$4U-DfR?)(S94Tw(y2~^Di9)jr*|TV8w{PnH_L-b0uFxrKN8kJC>=SIBrhv=AX*5f z;?DhkPTo>ch^TKt%<(vP_CvkZ#FQy+ zGS&@aUuEHAu-bC#NyoZ+Rpq(HzJO9wIi?;S6P9ai)3PO6 z3?HQ6(b#2o*_m9)8&YJ*#e;^m%rpzo`A(9lxV2b5@t0cT%QwfAt^IGGgZN3NBt(^7 z!j;x7CuL@YKYo_V@3T{3O*rWydRxHNF@7u@_4tm#&;3Q&2@-^Y_1VL6O_ z^UqxovLzOJ!A+l0jd6twQ%xC6k>yA*7PliDn028uvXL>ZALz-Y7tma249s$P>Fl=`*cmXuUg;yB=23uW;;EY79P@Mfm8Bc) z5x4@(nLG5*nc6VvkUvN;>x^zC)jY*O2hg+yRR#v9SuXKi67U!Vo~)R((C*N6`BERc zvrZ{BBrgDr0xQC{Xc8l|QWk3DuKFUP4Q94c!V?ETP4{>F{k&r*>U+ER`$1p)+Mv(h zHpmONmAd%8cY-u_wAhSohCT+~)jDKbOs`El{OW(hYEUJcdvc%WjB-s~3u^g;0PO$C zPu1uw=Ud5OGsgaIfHccEC<3~lR86rSZl0_RjJ!BuE48PtTS-VOL0# z#Fk=@qKCLOJi5@Q?F<_t{4R8aysJfb{2mZCYyt2jJZT7I`R%5!2b!b_Oy+F^sKPd+MEkOX3rB?R3zo3hw#GCvK})OA}BMtb!_JAL`1&Hm3w-BHVO-p9~?P6f=F zMp$uNoG<)_(~X)&KWkJ6?`Kb!d~HL*Wi{V_7of_VJLuzAfNc#1pLc0Pf|VR3f5oq; zAvBy%b$)h4LERD(CUB#$5e`s7kXH<%L8iJ96G>vl-Zgjjuz0*Zd6E!mJpypGQ=;2h zaUG~xoX7Uz*K+n86(a@)|mZC~oY+qywo5(acds(I9u ztf@2+ALqmNmel-Loy%!+IknVi@B2$x+s$=6E^)TAeR8ToSr(NiL%JmjK3|o%a#&CRED)oNvN<; zc>qM?+x&js%#GTgZIstOFv_bR81VUT_@oEe{{BxC86DZy71`GL_E`F=6J+yvY-H-wNRE+zJ$d2|9Z4*q0CV8_CWW?B>WYs`r53wQ+7>LCI- z#M{kaZw4mAG(DM1&|v6pDtLC6sOVG^G#6SK_}EGx{b~cm-3jfkdbpdMC^ET0=LI;M zEL`J)f%e*TMEAY*-2tYRIN(q9=BpKtqsC14N!p-q0qGlCh9FM4F|eb}pVy@YDz`<# zVyc>(E-(29&6(5wK|N}iMP$d>XJKyAn=35Y=XH<=1&*+Ez1IK1>_RtK;o)dr906;_ z<_qJ@?2;H$7anJfqXJEeQGPM8=S1hkx>z!)RA(6V&JM|ue*|;`X{v-wrRy5Z?JDn- zzmXVzo#&QNd9c_*VSK6&zZojMW#HYDf9lWvvjNnPOm%yv4DXN~SM?VXz}VD`Hvaj> z%cV2e*jxp0`LAs+Cq+KvxmF94s2_~@Q#gtqZB?z3pj}QmA{fdj#Lk)YB@z+ znLKU>EIJd7Nbn!%0VYON-0wfZ^*Aw1JbLk2F=vXvFWgvoKxmI{-tYp#0&18-KtoAm zV6qDf9q1b2Y)3d%TxKW;N{WqW3^jL?{i)mXrZ`|gPgX>&oIKE6n3XkQh~5+QkICfb z`wvwd`wMNMOUzYgay4e^n5dCL&j9o-CDE&HEHS<}`sGe_zM_RCSd$j=HpY^p<+=%6 z7NbMg?sBVBNqIH_`#~_-{U&`JikOBLur5N6J0lN01|jlOU7{I4Y0%`TC>_}0G~2_w zIsw+LSoi0TVW+MXd7!;kQF9Qb^A2u~mp~(jAR-MTGm=ns;C7>I(}q9!(aul4H`2-9 z=UI*bY#o7a&*Ws=%LSKuB$$7e32hp0TsnbEDrG?hFdRPjp3&MGx?f&$=*z9A#x}wD zGuH1C0Mg9215hP@EN~xG1&+ElB*by6U<0KIxzV6KSSQu`&wl~BzKTc`pB2-_b}JTm z$`!&$bUP^S4mG_x0S#gH)+WI5jmklZvgj)cd4|_TeW0mZ>}$)~7$+Dxvr~0c;QV#= zvLLqBr$bE8kKVG;*HFoM&`T5qffd>I&>^7eQ6tXaHeC{q~6v0@}>r^Xro2c z3gc==jpK%u(S55pZRO-r&K$J^W6~3fZbU0wzSR@%OeTo&Z-OEQXbpY^KT-uKdNgh&P65QQTBNrK+ z9|0n9b6_7$2m;Fmi9rES7%T&CQn zgoj!f(zR=(#RDtMEUPr|jrvE^WgIlzQ)rBV&q_JD)~ycZf=v^wVEYv?>~g_NA}A(} zKO@Gi1{Iu@0Y3kdlsuIeoIJld17M%$*hS}_r&lD%Kk}78mediHJP9|oL;S2g>*hcE z?}~oy35F;-D zH2Z88&He~@mBQTx=I;(?Yc+OESSUiM9s_R;2&hMxDWoK7aBBsL-9&+Z*4kP+B~4@i7DT0W|*A^N&OSrAv(;OAzf3<>A11V zSQJ8vI&z?{$;JzJs?8HI_`o=|loy^LY+2JOj=#T(LF7ONLGrSn{J%*OBFOitoCGRf zIS8ZVvrYbN3e8&o@2pShzDO|r_kGQlc8u(z7```Qv-gaf`|Q8})<*rz?;dMjgX~#% ze){m<@7zDseuqs1uJyj()oMsP=H%m&ut#(>_VtxVzS=tO^~=5m1-JwJ2(McUQOyRpF{(C!Igb2d>%yJBP1yrTvQ^qsODMj**abj9G;mwoxfP(Q=cFCGrxcAc{Q@<-Obr|_jz%9>CH}n_w=r6E_w-4 zzwor#fE`$6&L8vYn!{bba+=%o662>fHqlzit!C*B~hwJh|2d6@C5vL61>H;>z zX;`lhy`hf5Qs#M_dzJ&n7{Q$ViN1oh& z^X_iBWBfOMsnli{aIN?Ku2w_Vr-U9WSQ=p`&UkyyL7)EYQLeT`cOV0dgFC`8;WkC* zTLQprhf@|iuHyMI>%1W_8Bp*M@|~(0qV|dZk?V2re#8jw{s_=-j$rNkrts^)q9>W+ zZ7W#p6HEhmO-zMTvvGI$#dwJqmK4}a(^bulP#v6Ex5XGgEw6P-vp%Hy5hL|Hn6|&P z$^o&(ojI5*^H~?G$C|r(LtS?CGlpil;Vs^O-whF-ZBTSi$U^pom`2nP4HApb`uXEE zgD%Q1xF^RIwznTZJruDLPvMJ(8_BS5jkqj>Y@C2L5bvFlHw zY(ytPsGV?)P%O;)ON`nn;Tkb=OMEI;5WBE-H~pFaRP57VxY^JChsB(L^t^jmZlB^n%`p)rPxsB(% z1pw5TGt=Cj%}QQ0jbn=ypa?S=X88wszYt|#sg24!v@b=rFxTuc32TI(cZ%6A%`ofV z2*oDTcNT(g*W|cfhpy9p+eP>Iuf5xmr7$lYCSy`6g+A-fe;XFn%b@2 z6`)1q3pLUrPuK$_Dc9+iC?fO=9Q~)A`12j|K4JG?oqc{}Qt}=^WO&G$p+52rLK>T3 zXC|1~P@Zd*?JJ#S9!n2c;yx#Rkn?t!>rIf3ceNQWIxwy1x(Qbb2q8jmhfK*EA?Q&% zl|n8L`AAHG&`M~HS$Ahl8^}PVz%*UaD96qE?1wezI^DNlc=!M6FF3N0pPL@c?$61o zz|MY4a=)lT$S&D7p!QT(A;Irkl$he3ON|m^c%;jpySFF5USVB_NN*0rkKS}f=cPTwZdehueD4ea_ynR{dpQ9vf(T;Zg6WMdJLaK%_lq>6^1BSZi%ZDA_$b% zPDnN2@{-{@t&82Kj+}C-!&5DO?=|(b$Py|5e*%|AiCf6@;fRA;tH_V|M%(8{`rhsV zL~2zXj|?b!g6I>mN4M-zR@J`Tdh;URz8)-fkFUJgeH`_2NT<5p^y9D+=G9uX>M;O3 zHfI3A^6sBotyMbOXYm0{SzHzKZvSm4RW{0beNwi=N-yX-{db&yxBv1lIkJ$Sj}FXV zf%mV#Uj9zxf;I_UK zDt3ALapNt@>4CspgJJ4Mo`#4YUo^4D`&m!Lfs@!o?tR#T_3#E?tq{Q(a9Oj=EL;uj zKtu|>V3U4XGNlfLo;R(dMcUN3w@EY*_yvwRGP{O+!8`8xYg+NU08z$O9gi?U`2+!i zy*iBDR@1)BndGaKwTm7sYnPKcNRLa5vymSp<<}GDIi5}mW^U1Q;ha=?qvY&ru_MZL z$WiPnM{i{!`i4^6x+35>=LKEI`_oq)@IQHzBMZgj2o{(!zNS?6XWIYIK@zy}7e(#% zmFWdL&^g*fY5E5jN6aY$#H(?xUb&yg|8U;pMg*pPn0|GhbP~eKP*-I0)S&x&jW$zq zNi>JWUB!)jN_;@yAr}iSXnE5;+|MFP;kt(=^20V*@qy&;2oYq)XeFfcakW*VtHuGm z<0>Q5rHlH1Mg#VOucl1PH#W;PJkza9_?`N3T$bxHB%{ams<@P~hi`cQB{*3Z9 zR*|n%KFjoAMLV3zC}#)(KxC&DUe`k-Q_a1Ypa|XCIiNhfi(0OvkxLtUCPrP%+*K(u z9eT#M4)UMBe&WA)x%UfXq1@dH@I1Eyd;Pnb&mshl7PJM`bF^U>4w$AC)4`umzgZ6# z-P_||oBeP;0&`*%T|RD40-16JRV*8nBZgXY^0b-(t-)azC{>Cy$I2hDO$W-HMpAr-Bn$GvpM^wkpu=jePMXXS-)OJOriWdQY z#`yyB{l4h#KhOtn1MYC+kAX_xQ~7bE+%0?9pCq@-DhLT_6Hq7z8}N}YvO^Nn-IZaeT1wK!_@)PoB(g? z8l}yY7J?`_l0Ffr)mffhV>qG3{q3v-x?HjBv zUn;?b4&Ck(lfVE;Nl52iPfa&ni$i@N0HIyLz)29GD1{I}?N@rpp|Ih(hL~PL8hCLHlno zw8~5;VXdfBLqEIk^tt`MaoSY}8ncFpB^VbltlzNDp*kkO-3Q5WxSm4)#Hug5Ku0L1 zfi7EJjEixicR4QJwM}oMGSxBV{b~_5l2Y3Z;XreBnI@@&>=3Uo+Iv|MV)ZpFUjw!N zl7(G7SWa`=`9^E@GM`L=+3~3sgI-BaqzfHSdOS=&H(duu#Di>#7B_%evFwDkqXy<~ zuM|pgzvXTH?Z4*8LUkcp1fRmKz(ikMf%+qt_I3gTiqbUiT+&^Sa~~#@6Evp`sT+W9 z65MVzMGd<<{XkcvJW~y#@$#478Y4R&s-r6QgJTmo$OwvgVOeAWh%g=;)*=fOr>i}} zHQ;@70q3>^@sk1&ZB)UKF`J>5?p?u1|eQGMnyWaxZQObs0tMF!FrIV)DEHAYi*8W@nj z422nn0&NNT_@}XOMB+S6c3q|X5VZZ|`fbTVqr)n=XcWXu*kCu>f)5lpr?9EDBPEeU ztBpI=l~ze4%xSZW8vc`oiXo~ewF0WM28sa%GloP}*Sy*L`HuFRpg7nNEARVmL_i26 z*%#N0f)$IGH|(8oKe9QrNT>^xF>v0R(T$d2!dj8wBa8b&4Z~@j0Fj{^V?R#9*@mofa+Wm)j3MR z&=6BD{j6%3C+zBej!vcGury8wA_RNEZo68~k)m+|uN_-WfeFo-cMVni&GQRDq6cEk13wGq7jnY(FTom$5 z=SFkyx&fI)LjE94)T}aWn||%05>#)LifIE9HM}W`sT*3`z2)tQ@H|5HWXzGGSAh4P z^+I0fuWt%qTfuSdGBji~N7`ZFmTx+U9Y!n-^=HK%4;u&feD>9TwmamQA8*5{Z4sOq zS^tdB+ORp6nA)l<0PNMaT!cL=C_-_9Awr7+?MHu(nO+1g_smMALJ$y>OsTI5gm$rx zt_OpFF^k8ZC>E4j%%zE_maYQOT7bhao+R*p2Q`e+oKUZPu_>wxM>poZn*UIZ${)pT zZ9I@Y7Kv$ROY#aSdU1I1X}%P`ifCa%_pH-7uF3=eT|lD0_3x=U(x7yuGX!Erq8Cu# zsF7U;{qKIbr?cCF$59zFj)ToKbpQNw0NFk^kAK*P^|3~+HFTY#?9{Fmf)}$WUfi;% zRm;)S$k%=)qYtEM+~!JBs9hS`!Z~|`;JINPEXs$~^y%wjPX;AQOeq4E&?*Ns2B{Gl z2on61H&ny!)}~W#l|7(3cr$E>nU@Y|MDzu$zCd`D0tCq*(}orxKSdqDn~ypwuoDw$ zz*$;wT3o2ssLMb$(@%i7wD<(|-r=m+>%RJ3p5C?7lW)qvb59LbGvl!6iS)zvv;EPF zcqLe6Dn+X(d$p-Lc!sj<rDMr%1-SGu8^|D{f%1oXxjJv1cUz%x1UaFzy_`5 zW$}XWH}Z#dFe}<=n5J3YzF_Ey()XaLM(m0DrhTa-?8B#1!yb?A1Uhue8&PXhff-_Y z$70kp+}+a}T3_rGAObFd<*JUT1%>eLWuQY;g{j(!HE>wfQb$d}d*4IWSDqP&9o9#E zY>3ma?+4m#?`!k83_&Q1nILI@FW5hlkS)D=ve2@#VM8qRQHm;xkTaGYxrlm9%2zk0 zZ6RB$aSy6;TsiM52K(6c%$q#u={VUN{mXY`&Zt+$?r;2g0D>WeZLuopeE zX=?U2>@4mwg*DX14&ECU=#4eBynhnF5>F^Vuryu`C{Tu?C&0^>E@suK9hK0l4X}Z$ z2^&swR+aq|s4Tgb*MST1upt++#P ztm23yWO#RPzIwqoUww!VygKJDv0Lg}Nb32%3V^-Zkc-M-A?2wI_OvdvZ~Z2cP?oA` zjKbYnk8uo_iV#Q}pbM=?EW z-Hoxt-SO1w^1*wU5U{hMoB$UM)~Z-xGDRH)Z(mBhGaXXrF>`#EHXSUEaa8njw8rj5 z6$SZ(NPR|cOAqy9Q)o>80@(k)8;ALXgF4q z-S3FqC2j#LO%1&Xn}T2w6;{`y_WkVS)1FJ|8o0fxpqM|NOI>j4$4A#mH49-Fs=MWB zOt3f7dMM41QZ*xP`jhWLbuKByHrSI-r-B3ND@9SI^{B2oz#6yS2W>&su*0PjgrrIC zh=AkoJ5jC$h@@abF9}}1Bu3YxQM5+UEj+}L96Z8N;k%vBqZAUq7o<^h+BSMK z_GQ!QMMZerUm~b@5(rfli^C$w+-p=-6eNsy(^U}Qj{x1I%7Ac+zT!gfzyAph(C|$u zX#i`zdLh+GOPoGYU%}OHL|Xp(w2Id!0hd8*M*YMAA@>~dmlXGJ9J}oVy{8Zh zVdqqH)75Er(7!0%PkdDRJbS(Wz9k}RSI6$GiW*SjKDG6PkD$^Ms~RCJsoSyO4-4_({VDZT1Bv~)q*4_u2!)C=#{KuNhuUQ9Psik%igx!B zMC1qs1+|q!)Bp?ZCmvsE=tx4DJ4`kR5Ntj>5E257vnYCkv2=lD5T}?49Sr@BW=$U# zALXEk&4F6meF~*wFlA*fQBu6Ltq3_ZHX@>CX*zH2IdZnqucAC#Cua1qSEK@)lz^bnpXgcRq+dum}a`#s~E8#fnoI zUqMI`3D%%m>Oe(1Lq7Rg7~gf{L+L}dR8yyr=*Qv2V;$sEDRO<)Kw^h>>ZtUoWSZah z{r7ze)CMqKVVBM%=}OOe4+Bk(lAWM>=8$D6IQPb!L1wqnop8jCH;9x6Pk}2|AO;Me z@YEW*!fB>4#l)o(dPjC(MZx)D&Z&I5BR-L_;U?N4eV^9_S68$~A}Mi!Uo5dvhNxO| zdOj=Cz@ZMM2&p1qE4ZPEGf_*|KK=P<<+kLPQ5qzL+NlHsKI~c+k}(40KDXN*ahDaP z>&V=bb~HilkBXhT$rM!LNctOU$u6j#XOM)&HoPeo0x&@AK?0h8m}U?l7zR3e17V=| zuc2_qCCMGkI;uG+S6k3M`a^R&a!lpZA0xX9{ zQ6uXC##hD?09mD}xN1vVlVhim*4&}nmH^5-sj7|^jKI;wLU<9GD{X>Z+GkOkS*`^f zS?)2Q_Ki~P6+TatC^g?tqM-+>y~?x+mh0T}@Lw=o*aM!71a&+{1l$MDg8d#@#{{A& z{KhNN9UlHmS)r^G(v+SSQ~Bm6IOcyLv&QHVVC9JbTma2$k$Ch{e$KO5kU){e>_LKK zQ&zH~w_za>q);^_v^C^YpQDM}W~5R;7&59lvmqYAS1iPzAxbigxb2f7L8)e(M_`(G zJNMs*+E%fe7wp#BA3}+vY3r#9OgYp|797??9M*W^58zH%dJ0b{K(GOP5F}F%3ACng z-#s*Ri4z{oQd(&zDJ*eg;Ln^>!gsr5#%TFca_B)9@K2I8_3V;}$myRI@y&ex>i=S! zD<$Mx3>`|aG1-#Fw@`zsv8J>(?K57$ZLWz$X(*MAsuqSJIH!d)*)=77E9}$tmADRn z@SDB=zIJMyEwE$DL&bC6M^F>k-hpc8?14n#_%k8|zk?Z!1M#2{#iu58i|2W%mWZ<> zK647)FK|laazIj=4+`);Ck)`lmT3M_Nj&;kQ`mjM-h#Jbz|F;ehf^g4g>(rUU#3wb zi>m}KE92;+)-H$la9t~<-yF3Wiv?qRF@IPGeNnQCH8`R}Wh_;R6+(r )hTH3Y$G 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 z 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

uIBgJO58*C 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

  • bSY$reJy{YiScJp!R!i?55HpuzH1oPwvT~#PQ@0N06`v zWxD{)O4lH?rHaRYZb{$XYPZWKnIt%!F0pf+fwl9CIla>jl_=GIg2+P8D> z+D(k2q9UGs>KV5FvGtP2Y1D9eZx}Ji`qi!drBz`h2~MWLuKloczct`+;F$gL(X|N- z3}nEdfecO_%)mhdY30Gjy3LheHvYlZzxOqKpce_yYIxy(Yqs!)4I4Rf{JDM)>#?3h#-RyJ|%q*Y_ z5;C-Wvx_#sspp{-G<>^J1g?+bbP{ahC;YraG#s=55e zV0w)RphI^xvC#rrzvHS7q6BAhBzA77V)cKEII-1drMZ5@s{1X^-HgDkShK`^mX@8= zjC(Yk2bN1Ht`CV zrBX$pumTS3HM3<=8Jj*Y!C2kEh=O(TdNq{<=0sEM;Q-1ogwQv;H$J55WrP;hR}Doj&_Mn z_g*8n9De?^oW=9BM$VqydzkygTyk@A>OCeg79O}6 zrjG@^&b9R_4Y21hY~KsNZH4W7oc}yXNJwD7zyS;xG?0G%`VkV^jO0T+L{Uj8Z+!B# z*B#xLqD5plkIcFeQ55;|%Y{@{RuWQJ#OOsoc+3Xv`0EII!FBcil=Ms%ui8Lvp{LxV z^`lTI_}8o(iLm2+m3}sze~g<@dpHGX2R6EBdl*Lo3=08yYf;>UCRo9Q=OUSKOArZR zzWWAk2njfFLS(^X1?*X7XLEu2nTW*CGMHsAw*X&M9~jUR)_m&TMeS{Brw?y~Lg85Q zpTFs|JO~QtbfupD{|Kb}-~igRQxYB0Jjk<%jU7nQU8)k60=qWv_8 zQe_P|bh%QGK14ttqCg*{ARtg6AW%VoPCy$VAW2Y|XQ3d=LT;Lw?9*nlju|<7$Vh&Q z$#YeL68V75wza*x!lJh!CPKdD9O+MH50V5Az6^i-E#I8J&cNP!-hHkWq1A#3T8)Cl zIJGR&RylcQiriGi0PxHDQXY9Bvsvvmlo}W?IfOoA^tA7#At6CQWKiS1*QgTV*lCfa zAC&Oh`$gWVYOd$}2?`40-4EWSN6(&~wWpD>>ep2~`_wb_N+NY`3;&u4lSWySGTlK* z8Eo7EYks!|9I~9$ClLgJ&Rx1N@La&5*JZuXXqu#&sK;5f@;CM!Iqq#U>ZM&`9CuHh zKtVwPixw>bKwnnI*oB_!D;zL+B7sjo>GbPOCNsZo+0O5~_aphp2V=h;U6^?FFuRWZ z@B9DdvrpNat`PcMp(QC! zfua#);HBqDY~NVL®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%0ArdbMBUbTt`8k!veSvR~TSBm%h=={5KY<%(?E+ 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 literal 0 HcmV?d00001 diff --git a/docs/reST/_static/pygame_ce_powered.png b/docs/reST/_static/pygame_ce_powered.png deleted file mode 100644 index 2e6ba0cf807dce1a12881209a0b8f44d5e1f0060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274085 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ᮦqniK#AOJ~3K~yTxx>>r$TbM*RmSPJk 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Ν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 z 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

    -LAYwE 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 diff --git a/docs/reST/_static/pygame_ce_powered.webp b/docs/reST/_static/pygame_ce_powered.webp new file mode 100644 index 0000000000000000000000000000000000000000..65a348750c8db4c194b6de22a849199d0d6574a4 GIT binary patch literal 150210 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

    itTH)bxqkTYv}at=!iGdQ=I|nf1)l+ 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 MFhkiEK$AcK06B!R2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/reST/_static/pygame_ce_powered_lowres.png b/docs/reST/_static/pygame_ce_powered_lowres.png deleted file mode 100644 index 6b4590a331512b961ab40cefed439448b397282c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11853 zcma)ibyQn@)-LW)C{VNz+zJHOlok)}PSFH{ySr1|id&⋘SSM-HN+wkrpZb(Y`b9 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 diff --git a/docs/reST/_static/pygame_ce_powered_lowres.webp b/docs/reST/_static/pygame_ce_powered_lowres.webp new file mode 100644 index 0000000000000000000000000000000000000000..10379a7c5a3b01812f33f970ef998d0e546fcca3 GIT binary patch literal 8758 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 literal 0 HcmV?d00001 diff --git a/docs/reST/_static/pygame_ce_tiny.png b/docs/reST/_static/pygame_ce_tiny.png deleted file mode 100644 index 648b2d80185dbbfcc3d15ec2bbb325bb3d421363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25134 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 S0mP(hKsjb8I}c`_ - | `pygame_ce_logo.png <_static/pygame_ce_logo.png>`_ - 1560 x 800 + | `pygame_ce_logo.webp <_static/pygame_ce_logo.webp>`_ - 1560 x 800 - .. image:: _static/pygame_ce_lofi.png + .. image:: _static/pygame_ce_lofi.webp | `pygame_ce_lofi.svg <_static/pygame_ce_lofi.svg>`_ - | `pygame_ce_lofi.png <_static/pygame_ce_lofi.png>`_ - 1560 x 800 + | `pygame_ce_lofi.webp <_static/pygame_ce_lofi.webp>`_ - 1560 x 800 - .. image:: _static/pygame_ce_powered.png + .. image:: _static/pygame_ce_powered.webp | `pygame_ce_powered.svg <_static/pygame_ce_powered.svg>`_ - | `pygame_ce_powered.png <_static/pygame_ce_powered.png>`_ - 1560 x 824 + | `pygame_ce_powered.webp <_static/pygame_ce_powered.webp>`_ - 1560 x 824 - .. image:: _static/pygame_ce_tiny.png + .. image:: _static/pygame_ce_tiny.webp - | `pygame_ce_tiny.png <_static/pygame_ce_tiny.png>`_ - 214 x 110 + | `pygame_ce_tiny.webp <_static/pygame_ce_tiny.webp>`_ - 214 x 110 - .. image:: _static/pygame_ce_powered_lowres.png + .. image:: _static/pygame_ce_powered_lowres.webp - | `pygame_ce_powered_lowres.png <_static/pygame_ce_powered_lowres.png>`_ - 101 x 53 + | `pygame_ce_powered_lowres.webp <_static/pygame_ce_powered_lowres.webp>`_ - 101 x 53 From 31aac3081ce76c5057431b44a7044ac3fe2fe2a0 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 28 Feb 2025 23:04:50 -0800 Subject: [PATCH 087/441] Minify upstream logos zip Using lossless webp. Saves 385 kb. --- docs/reST/_static/upstream_logos.zip | Bin 716699 -> 322360 bytes docs/reST/logos.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/_static/upstream_logos.zip b/docs/reST/_static/upstream_logos.zip index 80ffee46edceb0191a518321d3a1bf73aafe92be..d3f5eb45cf920bc5a3a2db5aa6c0f31a29a33860 100644 GIT binary patch delta 240569 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

    yYR%SvhkT5l6zzwTFd(_9<*n|5+v(`!WPr8|oYA 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ä!ozor@tXyyN68?k!uBD96|cedA4{ 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 {K(>lo)JX0K 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 z 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
    6KN)9Ma2SNi41+L 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 m1o4@ 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 diff --git a/docs/reST/logos.rst b/docs/reST/logos.rst index 30a6236e18..cda55648ec 100644 --- a/docs/reST/logos.rst +++ b/docs/reST/logos.rst @@ -48,7 +48,7 @@ August 29, 2021. .. container:: fullwidth - | `upstream_logos.zip <_static/upstream_logos.zip>`_ - 699 KB + | `upstream_logos.zip <_static/upstream_logos.zip>`_ - 314 KB There is a higher resolution layered photoshop image available `here `_. *(1.3 MB)* From 325a85e1c45601a4542590bd987e09088584c6a4 Mon Sep 17 00:00:00 2001 From: Michael de Villiers Date: Sat, 1 Mar 2025 15:14:29 +0200 Subject: [PATCH 088/441] Fixed stub for pygame._sdl2.video.Texture.__init__ Added the `depth` argument between `size` and `static` as per the Cython function definition. --- buildconfig/stubs/pygame/_sdl2/video.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/buildconfig/stubs/pygame/_sdl2/video.pyi b/buildconfig/stubs/pygame/_sdl2/video.pyi index 8e741e8ab4..cbae2e3f8c 100644 --- a/buildconfig/stubs/pygame/_sdl2/video.pyi +++ b/buildconfig/stubs/pygame/_sdl2/video.pyi @@ -45,6 +45,7 @@ class Texture: self, renderer: Renderer, size: Iterable[int], + depth: int = 0, static: bool = False, streaming: bool = False, target: bool = False, From a3257073ec1f71a971fc33e76f36c6cadb16fc2a Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 1 Mar 2025 23:21:03 +0530 Subject: [PATCH 089/441] Use spaces instead of tabs in docs rst files --- docs/reST/c_api/slots.rst | 4 ++-- docs/reST/ref/bufferproxy.rst | 6 +++--- docs/reST/ref/mask.rst | 4 ++-- docs/reST/ref/mouse.rst | 2 +- docs/reST/ref/sdl2_video.rst | 8 ++++---- docs/reST/tutorials/en/tom-games6.rst | 26 +++++++++++++------------- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/reST/c_api/slots.rst b/docs/reST/c_api/slots.rst index 4eb9a95fa8..9477b397cd 100644 --- a/docs/reST/c_api/slots.rst +++ b/docs/reST/c_api/slots.rst @@ -16,7 +16,7 @@ base.c has this exposing the pg_RGBAFromObj function to the `c_api` structure: Then in src_c/include/_pygame.h there is an - #define pg_RGBAFromObj. + #define pg_RGBAFromObj. Also in _pygame.h, it needs to define the number of slots the base module uses. This is PYGAMEAPI_BASE_NUMSLOTS. So if you were adding another function, you need to increment this PYGAMEAPI_BASE_NUMSLOTS number. @@ -25,6 +25,6 @@ Then to use the pg_RGBAFromObj in other files, 1) include the "pygame.h" file, 2) they have to make sure base is imported with: - import_pygame_base(); + import_pygame_base(); Examples that use pg_RGBAFromObj are: _freetype.c, color.c, gfxdraw.c, and surface.c. diff --git a/docs/reST/ref/bufferproxy.rst b/docs/reST/ref/bufferproxy.rst index 79f574a97c..5d826ed575 100644 --- a/docs/reST/ref/bufferproxy.rst +++ b/docs/reST/ref/bufferproxy.rst @@ -47,8 +47,8 @@ ``"strides"`` : tuple : (optional) Array stride information as a tuple of integers. It is required - only of non C-contiguous arrays. The tuple length must match - that of ``"shape"``. + only of non C-contiguous arrays. The tuple length must match + that of ``"shape"``. ``"parent"`` : object : (optional) The exporting object. It can be used to keep the parent object @@ -57,7 +57,7 @@ ``"before"`` : callable : (optional) Callback invoked when the :class:`BufferProxy` instance exports the buffer. The callback is given one argument, the - ``"parent"`` object if given, otherwise ``None``. + ``"parent"`` object if given, otherwise ``None``. The callback is useful for setting a lock on the parent. ``"after"`` : callable : (optional) diff --git a/docs/reST/ref/mask.rst b/docs/reST/ref/mask.rst index ef2716c0ef..873a38eba9 100644 --- a/docs/reST/ref/mask.rst +++ b/docs/reST/ref/mask.rst @@ -535,8 +535,8 @@ to store which parts collide. component. :param int minimum: (optional) indicates the minimum number of bits (to - filter out noise) per connected component (default is 0, which equates - to no minimum and is equivalent to setting it to 1, as a connected + filter out noise) per connected component (default is 0, which equates + to no minimum and is equivalent to setting it to 1, as a connected component must have at least 1 bit set) :returns: a list containing a :class:`Mask` object for each connected diff --git a/docs/reST/ref/mouse.rst b/docs/reST/ref/mouse.rst index 9a99fd22c6..dd2096ed23 100644 --- a/docs/reST/ref/mouse.rst +++ b/docs/reST/ref/mouse.rst @@ -275,7 +275,7 @@ scroll, such as ``which`` (it will tell you what exact mouse device trigger the .. note:: Code that unpacked a get_cursor() call into ``size, hotspot, xormasks, andmasks`` will still work, - assuming the call returns an old school type cursor. + assuming the call returns an old school type cursor. .. versionchangedold:: 2.0.1 diff --git a/docs/reST/ref/sdl2_video.rst b/docs/reST/ref/sdl2_video.rst index 4c59b06f70..99ce737c7f 100644 --- a/docs/reST/ref/sdl2_video.rst +++ b/docs/reST/ref/sdl2_video.rst @@ -7,10 +7,10 @@ :synopsis: Experimental pygame module for porting new SDL video systems .. warning:: - This module isn't ready for prime time yet, it's still in development. - These docs are primarily meant to help the pygame developers and - super-early adopters who are in communication with the developers. - This API will change. + This module isn't ready for prime time yet, it's still in development. + These docs are primarily meant to help the pygame developers and + super-early adopters who are in communication with the developers. + This API will change. | :sl:`Experimental pygame module for porting new SDL video systems` diff --git a/docs/reST/tutorials/en/tom-games6.rst b/docs/reST/tutorials/en/tom-games6.rst index 5ac50550b3..ef170eebd4 100644 --- a/docs/reST/tutorials/en/tom-games6.rst +++ b/docs/reST/tutorials/en/tom-games6.rst @@ -28,19 +28,19 @@ after we've worked out the new position of the ball. :: - if not self.area.contains(newpos): - tl = not self.area.collidepoint(newpos.topleft) - tr = not self.area.collidepoint(newpos.topright) - bl = not self.area.collidepoint(newpos.bottomleft) - br = not self.area.collidepoint(newpos.bottomright) - if tr and tl or (br and bl): - angle = -angle - if tl and bl: - self.offcourt(player=2) - if tr and br: - self.offcourt(player=1) - - self.vector = (angle,z) + if not self.area.contains(newpos): + tl = not self.area.collidepoint(newpos.topleft) + tr = not self.area.collidepoint(newpos.topright) + bl = not self.area.collidepoint(newpos.bottomleft) + br = not self.area.collidepoint(newpos.bottomright) + if tr and tl or (br and bl): + angle = -angle + if tl and bl: + self.offcourt(player=2) + if tr and br: + self.offcourt(player=1) + + self.vector = (angle,z) Here we check to see if the ``area`` contains the new position of the ball (it always should, so we needn't have an ``else`` clause, From da101948f0e42ef81c3646365673c0ee1f098c83 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 2 Mar 2025 09:21:15 -0600 Subject: [PATCH 090/441] Updated run-on-arch-action to 3.0.0 --- .github/workflows/build-debian-multiarch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian-multiarch.yml b/.github/workflows/build-debian-multiarch.yml index e634673e9e..41e495898c 100644 --- a/.github/workflows/build-debian-multiarch.yml +++ b/.github/workflows/build-debian-multiarch.yml @@ -68,7 +68,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Build sources and run tests - uses: uraimo/run-on-arch-action@v2.8.1 + uses: uraimo/run-on-arch-action@v3.0.0 id: build with: arch: ${{ matrix.base_image && 'none' || matrix.arch }} @@ -134,7 +134,7 @@ jobs: done - name: Test armv7 wheel on armv6 - uses: uraimo/run-on-arch-action@v2.8.1 + uses: uraimo/run-on-arch-action@v3.0.0 with: arch: armv6 distro: bookworm From b0121ed3fda980c961e52675638578b01de90949 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 2 Mar 2025 10:19:55 -0600 Subject: [PATCH 091/441] No more one-line statements without braces --- src_c/.clang-format | 1 + src_c/SDL_gfx/SDL_gfxPrimitives.c | 129 ++++++---- src_c/_camera.c | 66 +++-- src_c/_freetype.c | 147 +++++++---- src_c/alphablit.c | 41 ++-- src_c/base.c | 33 ++- src_c/bitmask.c | 171 ++++++++----- src_c/camera_v4l2.c | 19 +- src_c/camera_windows.c | 3 +- src_c/circle.c | 6 +- src_c/color.c | 57 +++-- src_c/display.c | 392 ++++++++++++++++++++---------- src_c/draw.c | 243 ++++++++++++------ src_c/event.c | 159 ++++++++---- src_c/font.c | 21 +- src_c/freetype/ft_cache.c | 3 +- src_c/freetype/ft_layout.c | 7 +- src_c/freetype/ft_unicode.c | 15 +- src_c/freetype/ft_wrap.c | 24 +- src_c/gfxdraw.c | 98 +++++--- src_c/image.c | 150 ++++++++---- src_c/imageext.c | 6 +- src_c/include/_pygame.h | 3 +- src_c/joystick.c | 3 +- src_c/key.c | 36 ++- src_c/line.c | 3 +- src_c/mask.c | 27 +- src_c/math.c | 374 ++++++++++++++++++---------- src_c/mixer.c | 99 +++++--- src_c/mouse.c | 81 ++++-- src_c/music.c | 42 ++-- src_c/pixelarray_methods.c | 9 +- src_c/pixelcopy.c | 3 +- src_c/rect_impl.h | 45 ++-- src_c/rotozoom.c | 3 +- src_c/rwobject.c | 45 ++-- src_c/scale_mmx32.c | 24 +- src_c/scale_mmx64.c | 24 +- src_c/scale_mmx64_msvc.c | 24 +- src_c/scrap.c | 30 ++- src_c/scrap_win.c | 57 +++-- src_c/simd_transform_sse2.c | 3 +- src_c/surface.c | 303 +++++++++++++++-------- src_c/surface_fill.c | 39 ++- src_c/system.c | 12 +- src_c/time.c | 45 ++-- src_c/transform.c | 386 +++++++++++++++++++---------- src_c/window.c | 96 +++++--- 48 files changed, 2406 insertions(+), 1201 deletions(-) diff --git a/src_c/.clang-format b/src_c/.clang-format index 631dea0b97..1f6a6ac97c 100644 --- a/src_c/.clang-format +++ b/src_c/.clang-format @@ -7,6 +7,7 @@ AlignAfterOpenBracket: Align BreakBeforeBraces: Stroustrup ColumnLimit: 79 DerivePointerAlignment: false +InsertBraces: true # These settings are mirrored in .editorconfig. Keep them in sync. IndentWidth: 4 Language: Cpp diff --git a/src_c/SDL_gfx/SDL_gfxPrimitives.c b/src_c/SDL_gfx/SDL_gfxPrimitives.c index 04ebb81bb9..15371eba5d 100644 --- a/src_c/SDL_gfx/SDL_gfxPrimitives.c +++ b/src_c/SDL_gfx/SDL_gfxPrimitives.c @@ -2069,8 +2069,9 @@ _clipLine(SDL_Surface *dst, Sint16 *x1, Sint16 *y1, Sint16 *x2, Sint16 *y2) draw = 1; break; } - else if (CLIP_REJECT(code1, code2)) + else if (CLIP_REJECT(code1, code2)) { break; + } else { if (CLIP_INSIDE(code1)) { swaptmp = *x2; @@ -3270,10 +3271,12 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, end %= 360; // 0 <= start & end < 360; note that sometimes start > end - if so, arc // goes back through 0. - while (start < 0) + while (start < 0) { start += 360; - while (end < 0) + } + while (end < 0) { end += 360; + } start %= 360; end %= 360; @@ -3317,13 +3320,15 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, // pixel at x = ((int)temp). // and whether to draw in this octant initially - if (oct % 2) + if (oct % 2) { drawoct |= (1 << oct); // this is basically like saying drawoct[oct] // = true, if drawoct were a bool array - else + } + else { drawoct &= 255 - (1 << oct); // this is basically like saying // drawoct[oct] = false + } } if (oct == endoct) { // need to compute stopval_end for this octant @@ -3364,10 +3369,12 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, drawoct &= 255 - (1 << oct); } } - else if (oct % 2) + else if (oct % 2) { drawoct &= 255 - (1 << oct); - else + } + else { drawoct |= (1 << oct); + } } else if (oct != startoct) { // already verified that it's != endoct drawoct |= (1 << oct); // draw this entire segment @@ -3421,25 +3428,31 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, xmcx = x - cx; // always check if we're drawing a certain octant before adding // a pixel to that octant. - if (drawoct & 4) + if (drawoct & 4) { result |= fastPixelColorNolock( dst, xmcx, ypcy, color); // drawoct & 4 = 22; drawoct[2] - if (drawoct & 2) + } + if (drawoct & 2) { result |= fastPixelColorNolock(dst, xpcx, ypcy, color); - if (drawoct & 32) + } + if (drawoct & 32) { result |= fastPixelColorNolock(dst, xmcx, ymcy, color); - if (drawoct & 64) + } + if (drawoct & 64) { result |= fastPixelColorNolock(dst, xpcx, ymcy, color); + } } else { - if (drawoct & 6) + if (drawoct & 6) { result |= fastPixelColorNolock( dst, x, ypcy, color); // 4 + 2; drawoct[2] || drawoct[1] - if (drawoct & 96) + } + if (drawoct & 96) { result |= fastPixelColorNolock(dst, x, ymcy, color); // 32 + 64 + } } xpcy = x + cy; @@ -3447,22 +3460,28 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, if (cx > 0 && cx != cy) { ypcx = y + cx; ymcx = y - cx; - if (drawoct & 8) + if (drawoct & 8) { result |= fastPixelColorNolock(dst, xmcy, ypcx, color); - if (drawoct & 1) + } + if (drawoct & 1) { result |= fastPixelColorNolock(dst, xpcy, ypcx, color); - if (drawoct & 16) + } + if (drawoct & 16) { result |= fastPixelColorNolock(dst, xmcy, ymcx, color); - if (drawoct & 128) + } + if (drawoct & 128) { result |= fastPixelColorNolock(dst, xpcy, ymcx, color); + } } else if (cx == 0) { - if (drawoct & 24) + if (drawoct & 24) { result |= fastPixelColorNolock(dst, xmcy, y, color); // 8 + 16 - if (drawoct & 129) + } + if (drawoct & 129) { result |= fastPixelColorNolock(dst, xpcy, y, color); // 1 + 128 + } } /* @@ -3471,16 +3490,20 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, if (stopval_start == cx) { // works like an on-off switch because start & end may be in // the same octant. - if (drawoct & (1 << startoct)) + if (drawoct & (1 << startoct)) { drawoct &= 255 - (1 << startoct); - else + } + else { drawoct |= (1 << startoct); + } } if (stopval_end == cx) { - if (drawoct & (1 << endoct)) + if (drawoct & (1 << endoct)) { drawoct &= 255 - (1 << endoct); - else + } + else { drawoct |= (1 << endoct); + } } /* @@ -3519,20 +3542,26 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, // always check if we're drawing a certain octant before adding // a pixel to that octant. - if (drawoct & 4) + if (drawoct & 4) { result |= pixelColorNolock(dst, xmcx, ypcy, color); - if (drawoct & 2) + } + if (drawoct & 2) { result |= pixelColorNolock(dst, xpcx, ypcy, color); - if (drawoct & 32) + } + if (drawoct & 32) { result |= pixelColorNolock(dst, xmcx, ymcy, color); - if (drawoct & 64) + } + if (drawoct & 64) { result |= pixelColorNolock(dst, xpcx, ymcy, color); + } } else { - if (drawoct & 96) + if (drawoct & 96) { result |= pixelColorNolock(dst, x, ymcy, color); - if (drawoct & 6) + } + if (drawoct & 6) { result |= pixelColorNolock(dst, x, ypcy, color); + } } xpcy = x + cy; @@ -3540,20 +3569,26 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, if (cx > 0 && cx != cy) { ypcx = y + cx; ymcx = y - cx; - if (drawoct & 8) + if (drawoct & 8) { result |= pixelColorNolock(dst, xmcy, ypcx, color); - if (drawoct & 1) + } + if (drawoct & 1) { result |= pixelColorNolock(dst, xpcy, ypcx, color); - if (drawoct & 16) + } + if (drawoct & 16) { result |= pixelColorNolock(dst, xmcy, ymcx, color); - if (drawoct & 128) + } + if (drawoct & 128) { result |= pixelColorNolock(dst, xpcy, ymcx, color); + } } else if (cx == 0) { - if (drawoct & 24) + if (drawoct & 24) { result |= pixelColorNolock(dst, xmcy, y, color); - if (drawoct & 129) + } + if (drawoct & 129) { result |= pixelColorNolock(dst, xpcy, y, color); + } } /* @@ -3562,16 +3597,20 @@ arcColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, if (stopval_start == cx) { // works like an on-off switch. // This is just in case start & end are in the same octant. - if (drawoct & (1 << startoct)) + if (drawoct & (1 << startoct)) { drawoct &= 255 - (1 << startoct); - else + } + else { drawoct |= (1 << startoct); + } } if (stopval_end == cx) { - if (drawoct & (1 << endoct)) + if (drawoct & (1 << endoct)) { drawoct &= 255 - (1 << endoct); - else + } + else { drawoct |= (1 << endoct); + } } /* @@ -4362,11 +4401,13 @@ aaellipseColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, xp--; d += t - b2; - if (d >= 0) + if (d >= 0) { ys = yp - 1; + } else if ((d - s - a2) > 0) { - if ((2 * d - s - a2) >= 0) + if ((2 * d - s - a2) >= 0) { ys = yp + 1; + } else { ys = yp; yp++; @@ -4423,11 +4464,13 @@ aaellipseColor(SDL_Surface *dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, yp++; d -= s + a2; - if (d <= 0) + if (d <= 0) { xs = xp + 1; + } else if ((d + t - b2) < 0) { - if ((2 * d + t - b2) <= 0) + if ((2 * d + t - b2) <= 0) { xs = xp - 1; + } else { xs = xp; xp--; diff --git a/src_c/_camera.c b/src_c/_camera.c index 9430258800..d1542a991e 100644 --- a/src_c/_camera.c +++ b/src_c/_camera.c @@ -93,8 +93,9 @@ surf_colorspace(PyObject *self, PyObject *arg) /*get all the arguments*/ if (!PyArg_ParseTuple(arg, "O!s|O!", &pgSurface_Type, &surfobj, &color, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } if (!strcmp(color, "YUV")) { cspace = YUV_OUT; @@ -119,13 +120,15 @@ surf_colorspace(PyObject *self, PyObject *arg) } /* check to see if the size is the same. */ - if (newsurf->w != surf->w || newsurf->h != surf->h) + if (newsurf->w != surf->w || newsurf->h != surf->h) { return RAISE(PyExc_ValueError, "Surfaces not the same width and height."); + } /* check to see if the format of the surface is the same. */ - if (PG_SURF_BitsPerPixel(surf) != PG_SURF_BitsPerPixel(newsurf)) + if (PG_SURF_BitsPerPixel(surf) != PG_SURF_BitsPerPixel(newsurf)) { return RAISE(PyExc_ValueError, "Surfaces not the same depth"); + } PG_PixelFormat *src_fmt = PG_GetSurfaceFormat(surf); if (!src_fmt) { @@ -146,8 +149,9 @@ surf_colorspace(PyObject *self, PyObject *arg) Py_INCREF(surfobj2); return (PyObject *)surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } /* list_cameras() - lists cameras available on the computer */ @@ -245,16 +249,20 @@ PyObject * camera_stop(pgCameraObject *self, PyObject *_null) { #if defined(__unix__) - if (v4l2_stop_capturing(self) == 0) + if (v4l2_stop_capturing(self) == 0) { return NULL; - if (v4l2_uninit_device(self) == 0) + } + if (v4l2_uninit_device(self) == 0) { return NULL; - if (v4l2_close_device(self) == 0) + } + if (v4l2_close_device(self) == 0) { return NULL; + } #elif defined(PYGAME_WINDOWS_CAMERA) if (self->open) { /* camera started */ - if (!windows_close_device(self)) + if (!windows_close_device(self)) { return NULL; + } } #endif Py_RETURN_NONE; @@ -267,14 +275,17 @@ camera_get_controls(pgCameraObject *self, PyObject *_null) { #if defined(__unix__) int value; - if (v4l2_get_control(self->fd, V4L2_CID_HFLIP, &value)) + if (v4l2_get_control(self->fd, V4L2_CID_HFLIP, &value)) { self->hflip = value; + } - if (v4l2_get_control(self->fd, V4L2_CID_VFLIP, &value)) + if (v4l2_get_control(self->fd, V4L2_CID_VFLIP, &value)) { self->vflip = value; + } - if (v4l2_get_control(self->fd, V4L2_CID_BRIGHTNESS, &value)) + if (v4l2_get_control(self->fd, V4L2_CID_BRIGHTNESS, &value)) { self->brightness = value; + } return Py_BuildValue("(NNN)", PyBool_FromLong(self->hflip), PyBool_FromLong(self->vflip), @@ -300,18 +311,22 @@ camera_set_controls(pgCameraObject *self, PyObject *arg, PyObject *kwds) brightness = self->brightness; if (!PyArg_ParseTupleAndKeywords(arg, kwds, "|iii", kwids, &hflip, &vflip, - &brightness)) + &brightness)) { return NULL; + } /* #if defined(__unix__) */ - if (v4l2_set_control(self->fd, V4L2_CID_HFLIP, hflip)) + if (v4l2_set_control(self->fd, V4L2_CID_HFLIP, hflip)) { self->hflip = hflip; + } - if (v4l2_set_control(self->fd, V4L2_CID_VFLIP, vflip)) + if (v4l2_set_control(self->fd, V4L2_CID_VFLIP, vflip)) { self->vflip = vflip; + } - if (v4l2_set_control(self->fd, V4L2_CID_BRIGHTNESS, brightness)) + if (v4l2_set_control(self->fd, V4L2_CID_BRIGHTNESS, brightness)) { self->brightness = brightness; + } return Py_BuildValue("(NNN)", PyBool_FromLong(self->hflip), PyBool_FromLong(self->vflip), @@ -326,8 +341,9 @@ camera_set_controls(pgCameraObject *self, PyObject *arg, PyObject *kwds) brightness = -1; if (!PyArg_ParseTupleAndKeywords(arg, kwds, "|iii", kwids, &hflip, &vflip, - &brightness)) + &brightness)) { return NULL; + } self->hflip = hflip; self->vflip = vflip; @@ -356,8 +372,9 @@ camera_query_image(pgCameraObject *self, PyObject *_null) return PyBool_FromLong(v4l2_query_buffer(self)); #elif defined(PYGAME_WINDOWS_CAMERA) int ready; - if (!windows_frame_ready(self, &ready)) + if (!windows_frame_ready(self, &ready)) { return NULL; + } return PyBool_FromLong(ready); #endif @@ -374,8 +391,9 @@ camera_get_image(pgCameraObject *self, PyObject *arg) pgSurfaceObject *surfobj = NULL; int ret, errno_code = 0; - if (!PyArg_ParseTuple(arg, "|O!", &pgSurface_Type, &surfobj)) + if (!PyArg_ParseTuple(arg, "|O!", &pgSurface_Type, &surfobj)) { return NULL; + } if (!surfobj) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN @@ -390,8 +408,9 @@ camera_get_image(pgCameraObject *self, PyObject *arg) surf = pgSurface_AsSurface(surfobj); } - if (!surf) + if (!surf) { return NULL; + } if (surf->w != self->width || surf->h != self->height) { return RAISE(PyExc_ValueError, @@ -426,8 +445,9 @@ camera_get_image(pgCameraObject *self, PyObject *arg) int width = self->width; int height = self->height; - if (!PyArg_ParseTuple(arg, "|O!", &pgSurface_Type, &surfobj)) + if (!PyArg_ParseTuple(arg, "|O!", &pgSurface_Type, &surfobj)) { return NULL; + } if (!surfobj) { surf = PG_CreateSurface(width, height, SDL_PIXELFORMAT_XRGB8888); @@ -436,16 +456,18 @@ camera_get_image(pgCameraObject *self, PyObject *arg) surf = pgSurface_AsSurface(surfobj); } - if (!surf) + if (!surf) { return NULL; + } if (surf->w != self->width || surf->h != self->height) { return RAISE(PyExc_ValueError, "Destination surface not the correct width or height."); } - if (!windows_read_frame(self, surf)) + if (!windows_read_frame(self, surf)) { return NULL; + } if (surfobj) { Py_INCREF(surfobj); diff --git a/src_c/_freetype.c b/src_c/_freetype.c index f4da7757fd..7b032671cc 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -371,16 +371,19 @@ numbers_to_scale(PyObject *x, PyObject *y, Scale_t *size) int rval = 0; min_obj = PyFloat_FromDouble(0.0); - if (!min_obj) + if (!min_obj) { goto finish; + } max_obj = PyFloat_FromDouble(FX6_TO_DBL(FX6_MAX)); - if (!max_obj) + if (!max_obj) { goto finish; + } for (o = x, do_y = 1; o; o = (do_y--) ? y : 0) { cmp_result = PyObject_RichCompareBool(o, min_obj, Py_LT); - if (cmp_result == -1) + if (cmp_result == -1) { goto finish; + } if (cmp_result == 1) { PyErr_Format(PyExc_OverflowError, "%128s value is negative" @@ -389,8 +392,9 @@ numbers_to_scale(PyObject *x, PyObject *y, Scale_t *size) goto finish; } cmp_result = PyObject_RichCompareBool(o, max_obj, Py_GT); - if (cmp_result == -1) + if (cmp_result == -1) { goto finish; + } if (cmp_result == 1) { PyErr_Format(PyExc_OverflowError, "%128s value too large to convert to a size value", @@ -438,12 +442,14 @@ number_to_FX6_unsigned(PyObject *n) PyObject *f_obj = PyNumber_Float(n); double f; - if (!f_obj) + if (!f_obj) { return 0; + } f = PyFloat_AsDouble(f_obj); Py_XDECREF(f_obj); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return 0; + } return DBL_TO_FX6(f); } @@ -462,14 +468,17 @@ obj_to_rotation(PyObject *o, void *p) goto finish; } full_circle_obj = PyLong_FromLong(360L); - if (!full_circle_obj) + if (!full_circle_obj) { goto finish; + } angle_obj = PyNumber_Remainder(o, full_circle_obj); - if (!angle_obj) + if (!angle_obj) { goto finish; + } angle = PyLong_AsLong(angle_obj); - if (angle == -1) + if (angle == -1) { goto finish; + } *(Angle_t *)p = (Angle_t)INT_TO_FX16(angle); rval = 1; @@ -483,8 +492,9 @@ obj_to_rotation(PyObject *o, void *p) static void free_string(PGFT_String *p) { - if (p) + if (p) { _PGFT_FreeString(p); + } } /* @@ -744,10 +754,12 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) } } - if (file == original_file) + if (file == original_file) { Py_INCREF(file); - if (!PG_CHECK_THREADS()) + } + if (!PG_CHECK_THREADS()) { goto end; + } source = pgRWops_FromObject(file, NULL); if (!source) { goto end; @@ -1008,8 +1020,9 @@ _ftfont_setsize(pgFontObject *self, PyObject *value, void *closure) DEL_ATTR_NOT_SUPPORTED_CHECK("size", value); - if (!obj_to_scale(value, &face_size)) + if (!obj_to_scale(value, &face_size)) { goto error; + } self->face_size = face_size; return 0; @@ -1358,26 +1371,30 @@ _ftfont_getrect(pgFontObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords( args, kwds, "O|iO&O&", kwlist, &textobj, &style, obj_to_rotation, - (void *)&rotation, obj_to_scale, (void *)&face_size)) + (void *)&rotation, obj_to_scale, (void *)&face_size)) { goto error; + } /* Encode text */ if (textobj != Py_None) { text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } } ASSERT_SELF_IS_ALIVE(self); /* Build rendering mode, always anti-aliased by default */ if (_PGFT_BuildRenderMode(self->freetype, self, &render, face_size, style, - rotation)) + rotation)) { goto error; + } - if (_PGFT_GetTextRect(self->freetype, self, &render, text, &r)) + if (_PGFT_GetTextRect(self->freetype, self, &render, text, &r)) { goto error; + } free_string(text); return pgRect_New(&r); @@ -1455,13 +1472,15 @@ _ftfont_getmetrics(pgFontObject *self, PyObject *args, PyObject *kwds) /* parse args */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&", kwlist, &textobj, - obj_to_scale, (void *)&face_size)) + obj_to_scale, (void *)&face_size)) { goto error; + } /* Encode text */ text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } ASSERT_SELF_IS_ALIVE(self); @@ -1470,13 +1489,15 @@ _ftfont_getmetrics(pgFontObject *self, PyObject *args, PyObject *kwds) * for rotation/styles/size changes in text */ if (_PGFT_BuildRenderMode(self->freetype, self, &render, face_size, - FT_STYLE_DEFAULT, self->rotation)) + FT_STYLE_DEFAULT, self->rotation)) { goto error; + } /* get metrics */ list = get_metrics(&render, self, text); - if (!list) + if (!list) { goto error; + } free_string(text); return list; @@ -1630,21 +1651,25 @@ _ftfont_getsizes(pgFontObject *self, PyObject *_null) PyObject *size_item; nsizes = _PGFT_Font_NumFixedSizes(self->freetype, self); - if (nsizes < 0) + if (nsizes < 0) { goto error; + } size_list = PyList_New(nsizes); - if (!size_list) + if (!size_list) { goto error; + } for (i = 0; i < nsizes; ++i) { rc = _PGFT_Font_GetAvailableSize(self->freetype, self, i, &size, &height, &width, &x_ppem, &y_ppem); - if (rc < 0) + if (rc < 0) { goto error; + } assert(rc > 0); size_item = Py_BuildValue("llldd", size, height, width, x_ppem, y_ppem); - if (!size_item) + if (!size_item) { goto error; + } PyList_SET_ITEM(size_list, i, size_item); } return size_list; @@ -1681,15 +1706,17 @@ _ftfont_render_raw(pgFontObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords( args, kwds, "O|iO&O&i", kwlist, &textobj, &style, obj_to_rotation, - (void *)&rotation, obj_to_scale, (void *)&face_size, &invert)) + (void *)&rotation, obj_to_scale, (void *)&face_size, &invert)) { goto error; + } /* Encode text */ if (textobj != Py_None) { text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } } ASSERT_SELF_IS_ALIVE(self); @@ -1699,17 +1726,20 @@ _ftfont_render_raw(pgFontObject *self, PyObject *args, PyObject *kwds) * rotation/styles/vertical text */ if (_PGFT_BuildRenderMode(self->freetype, self, &mode, face_size, style, - rotation)) + rotation)) { goto error; + } rbuffer = _PGFT_Render_PixelArray(self->freetype, self, &mode, text, invert, &width, &height); - if (!rbuffer) + if (!rbuffer) { goto error; + } free_string(text); rtuple = Py_BuildValue("O(ii)", rbuffer, width, height); - if (!rtuple) + if (!rtuple) { goto error; + } Py_DECREF(rbuffer); return rtuple; @@ -1754,20 +1784,23 @@ _ftfont_render_raw_to(pgFontObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords( args, kwds, "OO|OiO&O&i", kwlist, &arrayobj, &textobj, &dest, &style, obj_to_rotation, (void *)&rotation, obj_to_scale, - (void *)&face_size, &invert)) + (void *)&face_size, &invert)) { goto error; + } if (dest && dest != Py_None) { - if (parse_dest(dest, &xpos, &ypos)) + if (parse_dest(dest, &xpos, &ypos)) { goto error; + } } /* Encode text */ if (textobj != Py_None) { text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } } /* @@ -1775,12 +1808,14 @@ _ftfont_render_raw_to(pgFontObject *self, PyObject *args, PyObject *kwds) * rotation/styles/vertical text */ if (_PGFT_BuildRenderMode(self->freetype, self, &mode, face_size, style, - rotation)) + rotation)) { goto error; + } if (_PGFT_Render_Array(self->freetype, self, &mode, arrayobj, text, invert, - xpos, ypos, &r)) + xpos, ypos, &r)) { goto error; + } free_string(text); return pgRect_New(&r); @@ -1829,8 +1864,9 @@ _ftfont_render(pgFontObject *self, PyObject *args, PyObject *kwds) /* optional */ &fg_color_obj, &bg_color_obj, &style, obj_to_rotation, (void *)&rotation, - obj_to_scale, (void *)&face_size)) + obj_to_scale, (void *)&face_size)) { goto error; + } if (fg_color_obj == Py_None) { fg_color_obj = 0; @@ -1876,30 +1912,36 @@ _ftfont_render(pgFontObject *self, PyObject *args, PyObject *kwds) if (textobj != Py_None) { text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } } if (_PGFT_BuildRenderMode(self->freetype, self, &render, face_size, style, - rotation)) + rotation)) { goto error; + } surface = _PGFT_Render_NewSurface( self->freetype, self, &render, text, &fg_color, (bg_color_obj || self->is_bg_col_set) ? &bg_color : 0, &r); - if (!surface) + if (!surface) { goto error; + } free_string(text); surface_obj = (PyObject *)pgSurface_New(surface); - if (!surface_obj) + if (!surface_obj) { goto error; + } rect_obj = pgRect_New(&r); - if (!rect_obj) + if (!rect_obj) { goto error; + } rtuple = PyTuple_Pack(2, surface_obj, rect_obj); - if (!rtuple) + if (!rtuple) { goto error; + } Py_DECREF(surface_obj); Py_DECREF(rect_obj); @@ -1956,8 +1998,9 @@ _ftfont_render_to(pgFontObject *self, PyObject *args, PyObject *kwds) &pgSurface_Type, &surface_obj, &dest, &textobj, &fg_color_obj, /* optional */ &bg_color_obj, &style, obj_to_rotation, (void *)&rotation, - obj_to_scale, (void *)&face_size)) + obj_to_scale, (void *)&face_size)) { goto error; + } if (fg_color_obj == Py_None) { fg_color_obj = 0; @@ -1966,8 +2009,9 @@ _ftfont_render_to(pgFontObject *self, PyObject *args, PyObject *kwds) bg_color_obj = 0; } - if (parse_dest(dest, &xpos, &ypos)) + if (parse_dest(dest, &xpos, &ypos)) { goto error; + } if (fg_color_obj) { if (!pg_RGBAFromObjEx(fg_color_obj, (Uint8 *)&fg_color, PG_COLOR_HANDLE_ALL)) { @@ -2006,13 +2050,15 @@ _ftfont_render_to(pgFontObject *self, PyObject *args, PyObject *kwds) if (textobj != Py_None) { text = _PGFT_EncodePyString(textobj, self->render_flags & FT_RFLAG_UCS4); - if (!text) + if (!text) { goto error; + } } if (_PGFT_BuildRenderMode(self->freetype, self, &render, face_size, style, - rotation)) + rotation)) { goto error; + } surface = surface_obj ? pgSurface_AsSurface(surface_obj) : NULL; if (!surface) { @@ -2022,8 +2068,9 @@ _ftfont_render_to(pgFontObject *self, PyObject *args, PyObject *kwds) if (_PGFT_Render_ExistingSurface( self->freetype, self, &render, text, surface, xpos, ypos, &fg_color, (bg_color_obj || self->is_bg_col_set) ? &bg_color : 0, - &r)) + &r)) { goto error; + } free_string(text); return pgRect_New(&r); @@ -2085,12 +2132,14 @@ _ft_autoinit(PyObject *self, PyObject *_null) int cache_size = FREETYPE_MOD_STATE(self)->cache_size; if (!FREETYPE_MOD_STATE(self)->freetype) { - if (cache_size == 0) + if (cache_size == 0) { cache_size = PGFT_DEFAULT_CACHE_SIZE; + } - if (_PGFT_Init(&(FREETYPE_MOD_STATE(self)->freetype), cache_size)) + if (_PGFT_Init(&(FREETYPE_MOD_STATE(self)->freetype), cache_size)) { return RAISE(PyExc_RuntimeError, "Failed to initialize freetype library"); + } FREETYPE_MOD_STATE(self)->cache_size = cache_size; } diff --git a/src_c/alphablit.c b/src_c/alphablit.c index f428dd1bac..5473d3008f 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -80,18 +80,22 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* Lock the destination if it's in hardware */ dst_locked = 0; if (SDL_MUSTLOCK(dst)) { - if (SDL_LockSurface(dst) < 0) + if (SDL_LockSurface(dst) < 0) { okay = 0; - else + } + else { dst_locked = 1; + } } /* Lock the source if it's in hardware */ src_locked = 0; if (SDL_MUSTLOCK(src)) { - if (SDL_LockSurface(src) < 0) + if (SDL_LockSurface(src) < 0) { okay = 0; - else + } + else { src_locked = 1; + } } /* Set up source and destination buffer pointers, and BLIT! */ @@ -578,10 +582,12 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, } /* We need to unlock the surfaces if they're locked */ - if (dst_locked) + if (dst_locked) { SDL_UnlockSurface(dst); - if (src_locked) + } + if (src_locked) { SDL_UnlockSurface(src); + } /* Blit is done! */ return (okay ? 0 : -1); } @@ -1039,8 +1045,9 @@ blit_blend_rgba_min(SDL_BlitInfo *info) LOOP_UNROLLED4( { REPEAT_4({ - if ((*src) < (*dst)) + if ((*src) < (*dst)) { (*dst) = (*src); + } src += incr; dst += incr; }); @@ -1174,8 +1181,9 @@ blit_blend_rgba_max(SDL_BlitInfo *info) LOOP_UNROLLED4( { REPEAT_4({ - if ((*src) > (*dst)) + if ((*src) > (*dst)) { (*dst) = (*src); + } src += incr; dst += incr; }); @@ -2871,8 +2879,9 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, srcx = 0; } maxw = src->w - srcx; - if (maxw < w) + if (maxw < w) { w = maxw; + } srcy = srcrect->y; h = srcrect->h; @@ -2882,8 +2891,9 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, srcy = 0; } maxh = src->h - srcy; - if (maxh < h) + if (maxh < h) { h = maxh; + } } else { srcx = srcy = 0; @@ -2906,8 +2916,9 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, srcx += dx; } dx = dstrect->x + w - clip.x - clip.w; - if (dx > 0) + if (dx > 0) { w -= dx; + } dy = clip.y - dstrect->y; if (dy > 0) { @@ -2916,8 +2927,9 @@ pygame_Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, srcy += dy; } dy = dstrect->y + h - clip.y - clip.h; - if (dy > 0) + if (dy > 0) { h -= dy; + } } if (w > 0 && h > 0) { @@ -2955,9 +2967,10 @@ premul_surf_color_by_alpha(SDL_Surface *src, SDL_Surface *dst) return -2; // signal SDL error to caller } - if (src_blend == SDL_BLENDMODE_NONE && !(src_format->Amask != 0)) + if (src_blend == SDL_BLENDMODE_NONE && !(src_format->Amask != 0)) { return -1; - // since we know dst is a copy of src we can simplify the normal checks + } + // since we know dst is a copy of src we can simplify the normal checks #if !defined(__EMSCRIPTEN__) #if SDL_BYTEORDER == SDL_LIL_ENDIAN if ((PG_SURF_BytesPerPixel(src) == 4) && pg_has_avx2()) { diff --git a/src_c/base.c b/src_c/base.c index fd9f58fc3f..7363a36c68 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -270,8 +270,9 @@ pg_mod_autoinit(const char *modname) int ret = 0; module = PyImport_ImportModule(modname); - if (!module) + if (!module) { return 0; + } funcobj = PyObject_GetAttrString(module, "_internal_mod_init"); @@ -306,14 +307,17 @@ pg_mod_autoquit(const char *modname) return; } - if (PyObject_HasAttrString(module, "_internal_mod_quit")) + if (PyObject_HasAttrString(module, "_internal_mod_quit")) { funcobj = PyObject_GetAttrString(module, "_internal_mod_quit"); - else + } + else { funcobj = PyObject_GetAttrString(module, "quit"); + } /* Silence errors */ - if (PyErr_Occurred()) + if (PyErr_Occurred()) { PyErr_Clear(); + } if (funcobj) { temp = PyObject_CallNoArgs(funcobj); @@ -321,8 +325,9 @@ pg_mod_autoquit(const char *modname) } /* Silence errors */ - if (PyErr_Occurred()) + if (PyErr_Occurred()) { PyErr_Clear(); + } Py_DECREF(module); Py_XDECREF(funcobj); @@ -353,12 +358,14 @@ pg_init(PyObject *self, PyObject *_null) /* initialize all pygame modules */ for (i = 0; modnames[i]; i++) { - if (pg_mod_autoinit(modnames[i])) + if (pg_mod_autoinit(modnames[i])) { success++; + } else { /* ImportError is neither counted as success nor failure */ - if (!PyErr_ExceptionMatches(PyExc_ImportError)) + if (!PyErr_ExceptionMatches(PyExc_ImportError)) { fail++; + } PyErr_Clear(); } } @@ -450,10 +457,12 @@ _pg_quit(void) if (PyCallable_Check(quit)) { temp = PyObject_CallNoArgs(quit); - if (temp) + if (temp) { Py_DECREF(temp); - else + } + else { PyErr_Clear(); + } } else if (PyCapsule_CheckExact(quit)) { void *ptr = PyCapsule_GetPointer(quit, "quit"); @@ -469,8 +478,9 @@ _pg_quit(void) } /* Because quit never errors */ - if (PyErr_Occurred()) + if (PyErr_Occurred()) { PyErr_Clear(); + } pg_is_init = 0; @@ -873,8 +883,9 @@ pg_set_error(PyObject *s, PyObject *args) { char *errstring = NULL; #if defined(PYPY_VERSION) - if (!PyArg_ParseTuple(args, "es", "UTF-8", &errstring)) + if (!PyArg_ParseTuple(args, "es", "UTF-8", &errstring)) { return NULL; + } SDL_SetError("%s", errstring); PyMem_Free(errstring); diff --git a/src_c/bitmask.c b/src_c/bitmask.c index b434936f31..2246538fa8 100644 --- a/src_c/bitmask.c +++ b/src_c/bitmask.c @@ -81,8 +81,9 @@ bitcount(BITMASK_W n) /* Handle non-32 or 64 bit case the slow way */ unsigned int nbits = 0; while (n) { - if (n & 1) + if (n & 1) { nbits++; + } n = n >> 1; } return nbits; @@ -176,8 +177,9 @@ bitmask_copy(bitmask_t *mask) void bitmask_clear(bitmask_t *m) { - if (!m->h || !m->w) + if (!m->h || !m->w) { return; + } memset(m->bits, 0, m->h * ((m->w - 1) / BITMASK_W_LEN + 1) * sizeof(BITMASK_W)); @@ -293,27 +295,33 @@ bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, { for (i = 0; i < astripes; i++) { for (ap = a_entry, app = ap + a->h, bp = b_entry; - ap < a_end;) + ap < a_end;) { if ((*ap++ >> shift) & *bp || - (*app++ << rshift) & *bp++) + (*app++ << rshift) & *bp++) { return 1; + } + } a_entry += a->h; a_end += a->h; b_entry += b->h; } - for (ap = a_entry, bp = b_entry; ap < a_end;) - if ((*ap++ >> shift) & *bp++) + for (ap = a_entry, bp = b_entry; ap < a_end;) { + if ((*ap++ >> shift) & *bp++) { return 1; + } + } return 0; } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { for (ap = a_entry, app = ap + a->h, bp = b_entry; - ap < a_end;) + ap < a_end;) { if ((*ap++ >> shift) & *bp || - (*app++ << rshift) & *bp++) + (*app++ << rshift) & *bp++) { return 1; + } + } a_entry += a->h; a_end += a->h; b_entry += b->h; @@ -326,9 +334,11 @@ bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, { astripes = (MIN(b->w, a->w - xoffset) - 1) / BITMASK_W_LEN + 1; for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end;) - if (*ap++ & *bp++) + for (ap = a_entry, bp = b_entry; ap < a_end;) { + if (*ap++ & *bp++) { return 1; + } + } a_entry += a->h; a_end += a->h; b_entry += b->h; @@ -395,52 +405,57 @@ bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, int xoffset, if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { if (*ap & (*bp << shift)) { *y = (int)(ap - a_entry) + yoffset; *x = (xbase + i) * BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift)); return 1; } + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { if (*ap & (*bp >> rshift)) { *y = (int)(ap - a_entry) + yoffset; *x = (xbase + i + 1) * BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift)); return 1; } + } b_entry += b->h; } - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { if (*ap & (*bp << shift)) { *y = (int)(ap - a_entry) + yoffset; *x = (xbase + astripes) * BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift)); return 1; } + } return 0; } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { if (*ap & (*bp << shift)) { *y = (int)(ap - a_entry) + yoffset; *x = (xbase + i) * BITMASK_W_LEN + firstsetbit(*ap & (*bp << shift)); return 1; } + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { if (*ap & (*bp >> rshift)) { *y = (int)(ap - a_entry) + yoffset; *x = (xbase + i + 1) * BITMASK_W_LEN + firstsetbit(*ap & (*bp >> rshift)); return 1; } + } b_entry += b->h; } return 0; @@ -473,8 +488,9 @@ bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, int xoffset, *y += yoffset; return 1; } - else + else { return 0; + } } } @@ -512,23 +528,26 @@ bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { count += bitcount( ((*ap >> shift) | (*(ap + a->h) << rshift)) & *bp); + } a_entry += a->h; a_end += a->h; b_entry += b->h; } - for (ap = a_entry, bp = b_entry; ap < a_end;) + for (ap = a_entry, bp = b_entry; ap < a_end;) { count += bitcount((*ap++ >> shift) & *bp++); + } return count; } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { count += bitcount( ((*ap >> shift) | (*(ap + a->h) << rshift)) & *bp); + } a_entry += a->h; a_end += a->h; b_entry += b->h; @@ -541,8 +560,9 @@ bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, { astripes = (MIN(b->w, a->w - xoffset) - 1) / BITMASK_W_LEN + 1; for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end;) + for (ap = a_entry, bp = b_entry; ap < a_end;) { count += bitcount(*ap++ & *bp++); + } a_entry += a->h; a_end += a->h; @@ -602,8 +622,9 @@ bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, { for (i = 0; i < astripes; i++) { for (ap = a_entry, bp = b_entry, cp = c_entry; ap < a_end; - ap++, bp++, cp++) + ap++, bp++, cp++) { *cp |= *ap & (*bp << shift); + } /* The c_entry (output mask) must advance with a_entry. */ a_entry += a->h; @@ -611,23 +632,26 @@ bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, c_entry += c->h; for (ap = a_entry, bp = b_entry, cp = c_entry; ap < a_end; - ap++, bp++, cp++) + ap++, bp++, cp++) { *cp |= *ap & (*bp >> rshift); + } b_entry += b->h; } /* This is the '.. zig' to handle the remaining bits. */ for (ap = a_entry, bp = b_entry, cp = c_entry; ap < a_end; - ap++, bp++, cp++) + ap++, bp++, cp++) { *cp |= *ap & (*bp << shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { for (ap = a_entry, bp = b_entry, cp = c_entry; ap < a_end; - ap++, bp++, cp++) + ap++, bp++, cp++) { *cp |= *ap & (*bp << shift); + } /* The c_entry (output mask) must advance with a_entry. */ a_entry += a->h; @@ -635,8 +659,9 @@ bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, c_entry += c->h; for (ap = a_entry, bp = b_entry, cp = c_entry; ap < a_end; - ap++, bp++, cp++) + ap++, bp++, cp++) { *cp |= *ap & (*bp >> rshift); + } b_entry += b->h; } @@ -685,31 +710,36 @@ bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, { for (i = 0; i < astripes; i++) { for (bp = b_entry, ap = a_entry, cp = c_entry; bp < b_end; - bp++, ap++, cp++) + bp++, ap++, cp++) { *cp = *ap & (*bp >> shift); + } b_entry += b->h; b_end += b->h; for (bp = b_entry, ap = a_entry, cp = c_entry; bp < b_end; - bp++, ap++, cp++) + bp++, ap++, cp++) { *cp |= *ap & (*bp << rshift); + } a_entry += a->h; c_entry += c->h; } for (bp = b_entry, ap = a_entry, cp = c_entry; bp < b_end; - bp++, ap++, cp++) + bp++, ap++, cp++) { *cp = *ap & (*bp >> shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { for (bp = b_entry, ap = a_entry, cp = c_entry; bp < b_end; - bp++, ap++, cp++) + bp++, ap++, cp++) { *cp = *ap & (*bp >> shift); + } b_entry += b->h; b_end += b->h; for (bp = b_entry, ap = a_entry, cp = c_entry; bp < b_end; - bp++, ap++, cp++) + bp++, ap++, cp++) { *cp |= *ap & (*bp << rshift); + } a_entry += a->h; c_entry += c->h; } @@ -743,8 +773,9 @@ bitmask_overlap_mask(const bitmask_t *a, const bitmask_t *b, bitmask_t *c, edgemask = (~(BITMASK_W)0) >> shift; c_end = c->bits + n * c->h + MIN(c->h, b->h + yoffset); - for (cp = c->bits + n * c->h + MAX(yoffset, 0); cp < c_end; cp++) + for (cp = c->bits + n * c->h + MAX(yoffset, 0); cp < c_end; cp++) { *cp &= edgemask; + } } } @@ -781,26 +812,31 @@ bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap |= (*bp << shift); + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap |= (*bp >> rshift); + } b_entry += b->h; } - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap |= (*bp << shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap |= (*bp << shift); + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap |= (*bp >> rshift); + } b_entry += b->h; } } @@ -843,26 +879,31 @@ bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap |= (*bp >> shift); + } b_entry += b->h; b_end += b->h; - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap |= (*bp << rshift); + } a_entry += a->h; } - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap |= (*bp >> shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap |= (*bp >> shift); + } b_entry += b->h; b_end += b->h; - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap |= (*bp << rshift); + } a_entry += a->h; } } @@ -893,8 +934,9 @@ bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) edgemask = (~(BITMASK_W)0) >> shift; a_end = a->bits + n * a->h + MIN(a->h, b->h + yoffset); - for (ap = a->bits + n * a->h + MAX(yoffset, 0); ap < a_end; ap++) + for (ap = a->bits + n * a->h + MAX(yoffset, 0); ap < a_end; ap++) { *ap &= edgemask; + } } } @@ -933,26 +975,31 @@ bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap &= ~(*bp << shift); + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap &= ~(*bp >> rshift); + } b_entry += b->h; } - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap &= ~(*bp << shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap &= ~(*bp << shift); + } a_entry += a->h; a_end += a->h; - for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) + for (ap = a_entry, bp = b_entry; ap < a_end; ap++, bp++) { *ap &= ~(*bp >> rshift); + } b_entry += b->h; } } @@ -995,26 +1042,31 @@ bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) if (bstripes > astripes) /* zig-zag .. zig*/ { for (i = 0; i < astripes; i++) { - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~(*bp >> shift); + } b_entry += b->h; b_end += b->h; - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~(*bp << rshift); + } a_entry += a->h; } - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~(*bp >> shift); + } } else /* zig-zag */ { for (i = 0; i < bstripes; i++) { - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~(*bp >> shift); + } b_entry += b->h; b_end += b->h; - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~(*bp << rshift); + } a_entry += a->h; } } @@ -1024,8 +1076,9 @@ bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset) { astripes = (MIN(a->w, b->w - xoffset) - 1) / BITMASK_W_LEN + 1; for (i = 0; i < astripes; i++) { - for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) + for (bp = b_entry, ap = a_entry; bp < b_end; bp++, ap++) { *ap &= ~*bp; + } b_entry += b->h; b_end += b->h; a_entry += a->h; @@ -1046,8 +1099,9 @@ bitmask_scale(const bitmask_t *m, int w, int h) nm = bitmask_create(w, h); - if (!nm) + if (!nm) { return NULL; + } ny = dny = 0; for (y = 0, dy = h; y < m->h; y++, dy += h) { @@ -1088,8 +1142,11 @@ bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *output, xoffset += b->w - 1; yoffset += b->h - 1; - for (y = 0; y < b->h; y++) - for (x = 0; x < b->w; x++) - if (bitmask_getbit(b, x, y)) + for (y = 0; y < b->h; y++) { + for (x = 0; x < b->w; x++) { + if (bitmask_getbit(b, x, y)) { bitmask_draw(output, a, xoffset - x, yoffset - y); + } + } + } } diff --git a/src_c/camera_v4l2.c b/src_c/camera_v4l2.c index 6861ac3466..071ded7c90 100644 --- a/src_c/camera_v4l2.c +++ b/src_c/camera_v4l2.c @@ -188,9 +188,9 @@ v4l2_xioctl(int fd, int request, void *arg) { int r; - do + do { r = ioctl(fd, request, arg); - while (-1 == r && EINTR == errno); + } while (-1 == r && EINTR == errno); return r; } @@ -203,8 +203,9 @@ int v4l2_process_image(pgCameraObject *self, const void *image, int buffer_size, SDL_Surface *surf) { - if (!surf) + if (!surf) { return 0; + } PG_PixelFormat *fmt = PG_GetSurfaceFormat(surf); if (!fmt) { @@ -376,8 +377,9 @@ v4l2_query_buffer(pgCameraObject *self) } /* is there a buffer on outgoing queue ready for us to take? */ - if (buf.flags & V4L2_BUF_FLAG_DONE) + if (buf.flags & V4L2_BUF_FLAG_DONE) { return 1; + } } /* no buffer ready to take */ @@ -665,11 +667,13 @@ v4l2_init_device(pgCameraObject *self) /* Buggy driver paranoia. */ min = fmt.fmt.pix.width * 2; - if (fmt.fmt.pix.bytesperline < min) + if (fmt.fmt.pix.bytesperline < min) { fmt.fmt.pix.bytesperline = min; + } min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height; - if (fmt.fmt.pix.sizeimage < min) + if (fmt.fmt.pix.sizeimage < min) { fmt.fmt.pix.sizeimage = min; + } v4l2_init_mmap(self); @@ -679,8 +683,9 @@ v4l2_init_device(pgCameraObject *self) int v4l2_close_device(pgCameraObject *self) { - if (self->fd == -1) + if (self->fd == -1) { return 1; + } if (-1 == close(self->fd)) { PyErr_Format(PyExc_SystemError, "Cannot close '%s': %d, %s", diff --git a/src_c/camera_windows.c b/src_c/camera_windows.c index a99874d1ee..4a44975741 100644 --- a/src_c/camera_windows.c +++ b/src_c/camera_windows.c @@ -140,8 +140,9 @@ int _is_supported_input_format(GUID format) { for (int i = 0; i < NUM_FORM; i++) { - if (format.Data1 == inp_types[i]->Data1) + if (format.Data1 == inp_types[i]->Data1) { return 1; + } } return 0; } diff --git a/src_c/circle.c b/src_c/circle.c index 1ff72b6737..03b36c94af 100644 --- a/src_c/circle.c +++ b/src_c/circle.c @@ -539,11 +539,13 @@ pg_circle_contains(pgCircleObject *self, PyObject *arg) if (pgCircle_Check(arg)) { pgCircleBase *circle = &pgCircle_AsCircle(arg); /*a circle is always contained within itself*/ - if (circle == scirc) + if (circle == scirc) { Py_RETURN_TRUE; + } /* a bigger circle can't be contained within a smaller circle */ - if (circle->r > scirc->r) + if (circle->r > scirc->r) { Py_RETURN_FALSE; + } const double dx = circle->x - scirc->x; const double dy = circle->y - scirc->y; diff --git a/src_c/color.c b/src_c/color.c index 11628aaa45..baea8bb96c 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -501,14 +501,18 @@ _hexcolor(PyObject *color, Uint8 rgba[]) } if (name[0] == '#') { - if (len != 7 && len != 9) + if (len != 7 && len != 9) { return TRISTATE_FAIL; - if (!_hextoint(name + 1, &rgba[0])) + } + if (!_hextoint(name + 1, &rgba[0])) { return TRISTATE_FAIL; - if (!_hextoint(name + 3, &rgba[1])) + } + if (!_hextoint(name + 3, &rgba[1])) { return TRISTATE_FAIL; - if (!_hextoint(name + 5, &rgba[2])) + } + if (!_hextoint(name + 5, &rgba[2])) { return TRISTATE_FAIL; + } rgba[3] = 255; if (len == 9 && !_hextoint(name + 7, &rgba[3])) { return TRISTATE_FAIL; @@ -516,14 +520,18 @@ _hexcolor(PyObject *color, Uint8 rgba[]) return TRISTATE_SUCCESS; } else if (name[0] == '0' && name[1] == 'x') { - if (len != 8 && len != 10) + if (len != 8 && len != 10) { return TRISTATE_FAIL; - if (!_hextoint(name + 2, &rgba[0])) + } + if (!_hextoint(name + 2, &rgba[0])) { return TRISTATE_FAIL; - if (!_hextoint(name + 4, &rgba[1])) + } + if (!_hextoint(name + 4, &rgba[1])) { return TRISTATE_FAIL; - if (!_hextoint(name + 6, &rgba[2])) + } + if (!_hextoint(name + 6, &rgba[2])) { return TRISTATE_FAIL; + } rgba[3] = 255; if (len == 10 && !_hextoint(name + 8, &rgba[3])) { return TRISTATE_FAIL; @@ -1943,8 +1951,9 @@ _color_set_slice(pgColorObject *color, PyObject *idx, PyObject *val) &slicelength) < 0) { return -1; } - if ((step < 0 && start < stop) || (step > 0 && start > stop)) + if ((step < 0 && start < stop) || (step > 0 && start > stop)) { stop = start; + } if (!(fastitems = PySequence_Fast(val, "expected sequence"))) { return -1; @@ -2083,11 +2092,13 @@ _color_getAttr_swizzle(pgColorObject *self, PyObject *attr_name) } attr_unicode = PyUnicode_FromObject(attr_name); - if (attr_unicode == NULL) + if (attr_unicode == NULL) { goto swizzle_failed; + } attr = PyUnicode_AsUTF8AndSize(attr_unicode, &len); - if (attr == NULL) + if (attr == NULL) { goto swizzle_error; + } /* If we are not a swizzle, go straight to GenericGetAttr. */ if ((attr[0] != 'r') && (attr[0] != 'g') && (attr[0] != 'b') && @@ -2104,8 +2115,9 @@ _color_getAttr_swizzle(pgColorObject *self, PyObject *attr_name) res = (PyObject *)PyTuple_New(len); } - if (res == NULL) + if (res == NULL) { goto swizzle_error; + } for (i = 0; i < len; i++) { switch (attr[i]) { @@ -2137,8 +2149,9 @@ _color_getAttr_swizzle(pgColorObject *self, PyObject *attr_name) ((pgColorObject *)res)->data[i] = value; } else { - if (PyTuple_SetItem(res, i, PyLong_FromLong(value)) != 0) + if (PyTuple_SetItem(res, i, PyLong_FromLong(value)) != 0) { goto swizzle_error; + } } } @@ -2168,13 +2181,15 @@ _color_setAttr_swizzle(pgColorObject *self, PyObject *attr_name, PyObject *val) Uint8 entry[4] = {0}; int entry_was_set[4] = {0}; - if (len == 1) + if (len == 1) { return PyObject_GenericSetAttr((PyObject *)self, attr_name, val); + } /* Handle string and unicode uniformly */ attr_unicode = PyUnicode_FromObject(attr_name); - if (attr_unicode == NULL) + if (attr_unicode == NULL) { return -1; + } attr = PyUnicode_AsUTF8AndSize(attr_unicode, &len); if (attr == NULL) { @@ -2240,11 +2255,13 @@ _color_setAttr_swizzle(pgColorObject *self, PyObject *attr_name, PyObject *val) entry_long = PyLong_AsLong(entry_obj); Py_DECREF(entry_obj); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { goto swizzle_error; + } - if (entry_long >= 0 && entry_long <= 255) + if (entry_long >= 0 && entry_long <= 255) { entry[idx] = (Uint8)entry_long; + } else { PyErr_SetString( PyExc_TypeError, @@ -2254,9 +2271,11 @@ _color_setAttr_swizzle(pgColorObject *self, PyObject *attr_name, PyObject *val) } /* Swizzle successful */ - for (i = 0; i < 4; ++i) - if (entry_was_set[i]) + for (i = 0; i < 4; ++i) { + if (entry_was_set[i]) { self->data[i] = entry[i]; + } + } return 0; /* Swizzling failed! Fallback to PyObject_GenericSetAttr */ diff --git a/src_c/display.c b/src_c/display.c index 3ff35d4fa0..fa45a6f1ca 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -132,17 +132,20 @@ pg_display_resource(char *filename) PyObject *name = NULL; pkgdatamodule = PyImport_ImportModule(pkgdatamodule_name); - if (!pkgdatamodule) + if (!pkgdatamodule) { goto display_resource_end; + } imagemodule = PyImport_ImportModule(imagemodule_name); - if (!imagemodule) + if (!imagemodule) { goto display_resource_end; + } fresult = PyObject_CallMethod(pkgdatamodule, resourcefunc_name, "s", filename); - if (!fresult) + if (!fresult) { goto display_resource_end; + } name = PyObject_GetAttrString(fresult, "name"); if (name != NULL) { @@ -159,8 +162,9 @@ pg_display_resource(char *filename) result = PyObject_CallMethod(imagemodule, load_basicfunc_name, "O", fresult); - if (!result) + if (!result) { goto display_resource_end; + } display_resource_end: Py_XDECREF(pkgdatamodule); @@ -202,18 +206,21 @@ _pg_mac_display_init(void) int status; module = PyImport_ImportModule("pygame.macosx"); - if (!module) + if (!module) { return 0; + } rval = PyObject_CallMethod(module, "Video_AutoInit", ""); Py_DECREF(module); - if (!rval) + if (!rval) { return 0; + } status = PyObject_IsTrue(rval); Py_DECREF(rval); - if (status != 1) + if (status != 1) { return 0; + } #endif /* Mac */ return 1; } @@ -231,19 +238,24 @@ pg_display_init(PyObject *self, PyObject *_null) SDL_setenv("SDL_VIDEODRIVER", "windows", 1); } if (!SDL_WasInit(SDL_INIT_VIDEO)) { - if (!_pg_mac_display_init()) + if (!_pg_mac_display_init()) { return NULL; + } - if (SDL_InitSubSystem(SDL_INIT_VIDEO)) + if (SDL_InitSubSystem(SDL_INIT_VIDEO)) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } - if (!pg_mod_autoinit(IMPPREFIX "time")) + if (!pg_mod_autoinit(IMPPREFIX "time")) { return NULL; - if (!pg_mod_autoinit(IMPPREFIX "event")) + } + if (!pg_mod_autoinit(IMPPREFIX "event")) { return NULL; - if (!pg_mod_autoinit(IMPPREFIX "window")) + } + if (!pg_mod_autoinit(IMPPREFIX "window")) { return NULL; + } Py_RETURN_NONE; } @@ -274,43 +286,60 @@ pg_vidinfo_getattr(PyObject *self, char *name) { pg_VideoInfo *info = &((pgVidInfoObject *)self)->info; - if (!strcmp(name, "hw")) + if (!strcmp(name, "hw")) { return PyLong_FromLong(info->hw_available); - else if (!strcmp(name, "wm")) + } + else if (!strcmp(name, "wm")) { return PyLong_FromLong(info->wm_available); - else if (!strcmp(name, "blit_hw")) + } + else if (!strcmp(name, "blit_hw")) { return PyLong_FromLong(info->blit_hw); - else if (!strcmp(name, "blit_hw_CC")) + } + else if (!strcmp(name, "blit_hw_CC")) { return PyLong_FromLong(info->blit_hw_CC); - else if (!strcmp(name, "blit_hw_A")) + } + else if (!strcmp(name, "blit_hw_A")) { return PyLong_FromLong(info->blit_hw_A); - else if (!strcmp(name, "blit_sw")) + } + else if (!strcmp(name, "blit_sw")) { return PyLong_FromLong(info->blit_hw); - else if (!strcmp(name, "blit_sw_CC")) + } + else if (!strcmp(name, "blit_sw_CC")) { return PyLong_FromLong(info->blit_hw_CC); - else if (!strcmp(name, "blit_sw_A")) + } + else if (!strcmp(name, "blit_sw_A")) { return PyLong_FromLong(info->blit_hw_A); - else if (!strcmp(name, "blit_fill")) + } + else if (!strcmp(name, "blit_fill")) { return PyLong_FromLong(info->blit_fill); - else if (!strcmp(name, "video_mem")) + } + else if (!strcmp(name, "video_mem")) { return PyLong_FromLong(info->video_mem); - else if (!strcmp(name, "bitsize")) + } + else if (!strcmp(name, "bitsize")) { return PyLong_FromLong(PG_FORMAT_BitsPerPixel(info->vfmt)); - else if (!strcmp(name, "bytesize")) + } + else if (!strcmp(name, "bytesize")) { return PyLong_FromLong(PG_FORMAT_BytesPerPixel(info->vfmt)); - else if (!strcmp(name, "masks")) + } + else if (!strcmp(name, "masks")) { return Py_BuildValue("(iiii)", info->vfmt->Rmask, info->vfmt->Gmask, info->vfmt->Bmask, info->vfmt->Amask); - else if (!strcmp(name, "shifts")) + } + else if (!strcmp(name, "shifts")) { return Py_BuildValue("(iiii)", info->vfmt->Rshift, info->vfmt->Gshift, info->vfmt->Bshift, info->vfmt->Ashift); - else if (!strcmp(name, "losses")) + } + else if (!strcmp(name, "losses")) { return Py_BuildValue("(iiii)", info->vfmt->Rloss, info->vfmt->Gloss, info->vfmt->Bloss, info->vfmt->Aloss); - else if (!strcmp(name, "current_h")) + } + else if (!strcmp(name, "current_h")) { return PyLong_FromLong(info->current_h); - else if (!strcmp(name, "current_w")) + } + else if (!strcmp(name, "current_w")) { return PyLong_FromLong(info->current_w); + } else if (!strcmp(name, "pixel_format")) { const char *pixel_format_name = SDL_GetPixelFormatName(info->vfmt->format); @@ -366,11 +395,13 @@ static PyObject * pgVidInfo_New(const pg_VideoInfo *i) { pgVidInfoObject *info; - if (!i) + if (!i) { return RAISE(pgExc_SDLError, SDL_GetError()); + } info = PyObject_New(pgVidInfoObject, &pgVidInfo_Type); - if (!info) + if (!info) { return NULL; + } info->info = *i; info->info.vfmt = &info->info.vfmt_data; return (PyObject *)info; @@ -445,14 +476,17 @@ pg_get_wm_info(PyObject *self, PyObject *_null) SDL_VERSION(&(info.version)) dict = PyDict_New(); - if (!dict) + if (!dict) { return NULL; + } win = pg_GetDefaultWindow(); - if (!win) + if (!win) { return dict; - if (!SDL_GetWindowWMInfo(win, &info)) + } + if (!SDL_GetWindowWMInfo(win, &info)) { return dict; + } (void)tmp; #if defined(SDL_VIDEO_DRIVER_WINDOWS) @@ -558,8 +592,9 @@ pg_get_driver(PyObject *self, PyObject *_null) const char *name = NULL; VIDEO_INIT_CHECK(); name = SDL_GetCurrentVideoDriver(); - if (!name) + if (!name) { Py_RETURN_NONE; + } return PyUnicode_FromString(name); } @@ -571,8 +606,9 @@ pg_get_surface(PyObject *self, PyObject *_null) if (pg_renderer != NULL || state->using_gl) { pgSurfaceObject *surface = pg_GetDefaultWindowSurface(); - if (!surface) + if (!surface) { Py_RETURN_NONE; + } Py_INCREF(surface); return (PyObject *)surface; } @@ -585,8 +621,9 @@ pg_get_surface(PyObject *self, PyObject *_null) if (sdl_surface != old_surface->surf) { pgSurfaceObject *new_surface = (pgSurfaceObject *)pgSurface_New2(sdl_surface, SDL_FALSE); - if (!new_surface) + if (!new_surface) { return NULL; + } pg_SetDefaultWindowSurface(new_surface); Py_INCREF((PyObject *)new_surface); return (PyObject *)new_surface; @@ -602,13 +639,16 @@ pg_gl_set_attribute(PyObject *self, PyObject *arg) { int flag, value, result; VIDEO_INIT_CHECK(); - if (!PyArg_ParseTuple(arg, "ii", &flag, &value)) + if (!PyArg_ParseTuple(arg, "ii", &flag, &value)) { return NULL; - if (flag == -1) /*an undefined/unsupported val, ignore*/ + } + if (flag == -1) { /*an undefined/unsupported val, ignore*/ Py_RETURN_NONE; + } result = SDL_GL_SetAttribute(flag, value); - if (result == -1) + if (result == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -617,11 +657,13 @@ pg_gl_get_attribute(PyObject *self, PyObject *arg) { int flag, value, result; VIDEO_INIT_CHECK(); - if (!PyArg_ParseTuple(arg, "i", &flag)) + if (!PyArg_ParseTuple(arg, "i", &flag)) { return NULL; + } result = SDL_GL_GetAttribute(flag, &value); - if (result == -1) + if (result == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyLong_FromLong(value); } @@ -672,15 +714,17 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) _DisplayState *state; SDL_Window *window; - if (event->type != SDL_WINDOWEVENT) + if (event->type != SDL_WINDOWEVENT) { return 0; + } pygame_window = pg_GetDefaultWindow(); state = DISPLAY_MOD_STATE((PyObject *)userdata); window = SDL_GetWindowFromID(event->window.windowID); - if (window != pygame_window) + if (window != pygame_window) { return 0; + } if (state->unscaled_render && pg_renderer != NULL) { if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { @@ -847,8 +891,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) winid_env = SDL_getenv("SDL_WINDOWID"); if (!PyArg_ParseTupleAndKeywords(arg, kwds, "|Oiiii", keywords, &size, - &flags, &depth, &display, &vsync)) + &flags, &depth, &display, &vsync)) { return NULL; + } if (hwnd == 0 && winid_env != NULL) { hwnd = (intptr_t)SDL_strtoull(winid_env, NULL, 0); @@ -863,11 +908,13 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) } if (size != NULL) { - if (!pg_TwoIntsFromObj(size, &w, &h)) + if (!pg_TwoIntsFromObj(size, &w, &h)) { return RAISE(PyExc_TypeError, "size must be two numbers"); - if (w < 0 || h < 0) + } + if (w < 0 || h < 0) { return RAISE(pgExc_SDLError, "Cannot set negative sized display mode"); + } } else { w = 0; @@ -879,8 +926,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (!SDL_WasInit(SDL_INIT_VIDEO)) { /* note SDL works special like this too */ - if (!pg_display_init(NULL, NULL)) + if (!pg_display_init(NULL, NULL)) { return NULL; + } } if ((vsync == -1) && ((flags & PGS_OPENGL) == 0)) { @@ -895,14 +943,16 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (state->scaled_gl) { if (PyErr_WarnEx(PyExc_FutureWarning, "SCALED|OPENGL is experimental and subject to change", - 1) != 0) + 1) != 0) { return NULL; + } } if (!state->title) { state->title = malloc((strlen(DefaultTitle) + 1) * sizeof(char)); - if (!state->title) + if (!state->title) { return PyErr_NoMemory(); + } strcpy(state->title, DefaultTitle); title = state->title; } @@ -955,34 +1005,42 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) } if (flags & PGS_SCALED) { - if (w == 0 || h == 0) + if (w == 0 || h == 0) { return RAISE(pgExc_SDLError, "Cannot set 0 sized SCALED display mode"); + } } - if (flags & PGS_OPENGL) + if (flags & PGS_OPENGL) { sdl_flags |= SDL_WINDOW_OPENGL; - if (flags & PGS_NOFRAME) + } + if (flags & PGS_NOFRAME) { sdl_flags |= SDL_WINDOW_BORDERLESS; + } if (flags & PGS_RESIZABLE) { sdl_flags |= SDL_WINDOW_RESIZABLE; - if (state->auto_resize) + if (state->auto_resize) { SDL_AddEventWatch(pg_ResizeEventWatch, self); + } } - if (flags & PGS_SHOWN) + if (flags & PGS_SHOWN) { sdl_flags |= SDL_WINDOW_SHOWN; - if (flags & PGS_HIDDEN) + } + if (flags & PGS_HIDDEN) { sdl_flags |= SDL_WINDOW_HIDDEN; - if (!(sdl_flags & SDL_WINDOW_HIDDEN)) + } + if (!(sdl_flags & SDL_WINDOW_HIDDEN)) { sdl_flags |= SDL_WINDOW_SHOWN; + } if (flags & PGS_OPENGL) { /* Must be called before creating context */ if (flags & PGS_DOUBLEBUF) { flags &= ~PGS_DOUBLEBUF; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); } - else + else { SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0); + } } #pragma PG_WARN(Add mode stuff.) @@ -1011,10 +1069,14 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) // if the program goes into fullscreen first the "saved // x and y" are "undefined position" that should be // interpreted as a cue to center the window - if (x == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(display)) + if (x == + (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(display)) { x = SDL_WINDOWPOS_CENTERED_DISPLAY(display); - if (y == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(display)) + } + if (y == + (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(display)) { y = SDL_WINDOWPOS_CENTERED_DISPLAY(display); + } } else { int old_w, old_h; @@ -1049,10 +1111,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) } if (SDL_GetHintBoolean("SDL_HINT_RENDER_SCALE_QUALITY", - SDL_FALSE)) + SDL_FALSE)) { fractional_scaling = SDL_TRUE; - if (state->scaled_gl) + } + if (state->scaled_gl) { fractional_scaling = SDL_TRUE; + } if (fractional_scaling) { float aspect_ratio = ((float)w) / (float)h; @@ -1075,8 +1139,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) scale = xscale < yscale ? xscale : yscale; - if (scale < 1) + if (scale < 1) { scale = 1; + } w_1 = w * scale; h_1 = h * scale; @@ -1102,8 +1167,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) w_actual = w_1; h_actual = h_1; } - if (!win) + if (!win) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } else { /* set min size to (1,1) to erase any previously set min size @@ -1132,10 +1198,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) SDL_SetWindowResizable(win, flags & PGS_RESIZABLE); SDL_SetWindowBordered(win, (flags & PGS_NOFRAME) == 0); - if ((flags & PGS_SHOWN) || !(flags & PGS_HIDDEN)) + if ((flags & PGS_SHOWN) || !(flags & PGS_HIDDEN)) { SDL_ShowWindow(win); - else if (flags & PGS_HIDDEN) + } + else if (flags & PGS_HIDDEN) { SDL_HideWindow(win); + } SDL_SetWindowPosition(win, x, y); @@ -1308,8 +1376,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) Py_INCREF(surface); } if (!surface) { - if (newownedsurf) + if (newownedsurf) { SDL_FreeSurface(newownedsurf); + } _display_state_cleanup(state); goto DESTROY_WINDOW; } @@ -1326,15 +1395,17 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) /*set the window icon*/ if (!state->icon) { state->icon = pg_display_resource(icon_defaultname); - if (!state->icon) + if (!state->icon) { PyErr_Clear(); + } else if (icon_colorkey != -1) { SDL_SetColorKey(pgSurface_AsSurface(state->icon), SDL_TRUE, icon_colorkey); } } - if (state->icon) + if (state->icon) { SDL_SetWindowIcon(win, pgSurface_AsSurface(state->icon)); + } if (depth != 0 && PG_SURF_BitsPerPixel(surface->surf) != depth) { if (PyErr_WarnEx(PyExc_DeprecationWarning, @@ -1383,10 +1454,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) DESTROY_WINDOW: - if (win == pg_GetDefaultWindow()) + if (win == pg_GetDefaultWindow()) { pg_SetDefaultWindow(NULL); - else if (win) + } + else if (win) { SDL_DestroyWindow(win); + } return NULL; } @@ -1433,8 +1506,9 @@ pg_window_size(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); int w, h; - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } SDL_GetWindowSize(win, &w, &h); return pg_tuple_couple_from_values_int(w, h); } @@ -1444,8 +1518,9 @@ pg_get_window_position(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); int x, y = 0; - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } SDL_GetWindowPosition(win, &x, &y); return pg_tuple_couple_from_values_int(x, y); } @@ -1457,17 +1532,20 @@ pg_set_window_position(PyObject *self, PyObject *arg) PyObject *pos = NULL; int x, y = 0; - if (!PyArg_ParseTuple(arg, "O", &pos)) + if (!PyArg_ParseTuple(arg, "O", &pos)) { return NULL; + } if (pos != NULL) { - if (!pg_TwoIntsFromObj(pos, &x, &y)) + if (!pg_TwoIntsFromObj(pos, &x, &y)) { return RAISE(PyExc_TypeError, "position must be two numbers"); + } } - if (win) + if (win) { /* Will raise errors with SDL 3, deal with it during the porting */ SDL_SetWindowPosition(win, x, y); + } Py_RETURN_NONE; } @@ -1512,13 +1590,15 @@ pg_mode_ok(PyObject *self, PyObject *args, PyObject *kwds) SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, 0); } if (!SDL_GetClosestDisplayMode(display_index, &desired, &closest)) { - if (flags & PGS_FULLSCREEN) + if (flags & PGS_FULLSCREEN) { return PyLong_FromLong((long)0); + } closest.format = desired.format; } if ((flags & PGS_FULLSCREEN) && - (closest.w != desired.w || closest.h != desired.h)) + (closest.w != desired.w || closest.h != desired.h)) { return PyLong_FromLong((long)0); + } return PyLong_FromLong(SDL_BITSPERPIXEL(closest.format)); } @@ -1552,17 +1632,20 @@ pg_list_modes(PyObject *self, PyObject *args, PyObject *kwds) if (bpp == 0) { SDL_DisplayMode curmode; - if (SDL_GetCurrentDisplayMode(display_index, &curmode)) + if (SDL_GetCurrentDisplayMode(display_index, &curmode)) { return RAISE(pgExc_SDLError, SDL_GetError()); + } bpp = SDL_BITSPERPIXEL(curmode.format); } nummodes = SDL_GetNumDisplayModes(display_index); - if (nummodes < 0) + if (nummodes < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } - if (!(list = PyList_New(0))) + if (!(list = PyList_New(0))) { return NULL; + } for (i = 0; i < nummodes; i++) { if (SDL_GetDisplayMode(display_index, i, &mode) < 0) { @@ -1570,14 +1653,18 @@ pg_list_modes(PyObject *self, PyObject *args, PyObject *kwds) return RAISE(pgExc_SDLError, SDL_GetError()); } /* use reasonable defaults (cf. SDL_video.c) */ - if (!mode.format) + if (!mode.format) { mode.format = SDL_PIXELFORMAT_XRGB8888; - if (!mode.w) + } + if (!mode.w) { mode.w = 640; - if (!mode.h) + } + if (!mode.h) { mode.h = 480; - if ((int)SDL_BITSPERPIXEL(mode.format) != bpp) + } + if ((int)SDL_BITSPERPIXEL(mode.format) != bpp) { continue; + } if (last_width == mode.w && last_height == mode.h && last_width != -1) { continue; @@ -1666,8 +1753,9 @@ static PyObject * pg_num_displays(PyObject *self, PyObject *_null) { int ret = SDL_GetNumVideoDisplays(); - if (ret < 0) + if (ret < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyLong_FromLong(ret); } @@ -1675,8 +1763,9 @@ pg_num_displays(PyObject *self, PyObject *_null) static SDL_Rect * pg_screencroprect(SDL_Rect *r, int w, int h, SDL_Rect *cur) { - if (r->x > w || r->y > h || (r->x + r->w) <= 0 || (r->y + r->h) <= 0) + if (r->x > w || r->y > h || (r->x + r->w) <= 0 || (r->y + r->h) <= 0) { return 0; + } else { int right = MIN(r->x + r->w, w); int bottom = MIN(r->y + r->h, h); @@ -1698,16 +1787,18 @@ pg_update(PyObject *self, PyObject *arg) VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "Display mode not set"); + } if (pg_renderer != NULL) { return pg_flip(self, NULL); } SDL_GetWindowSize(win, &wide, &high); - if (state->using_gl) + if (state->using_gl) { return RAISE(pgExc_SDLError, "Cannot update an OPENGL display"); + } /*determine type of argument we got*/ if (PyTuple_Size(arg) == 0) { @@ -1724,18 +1815,20 @@ pg_update(PyObject *self, PyObject *arg) if (gr) { SDL_Rect sdlr; - if (pg_screencroprect(gr, wide, high, &sdlr)) + if (pg_screencroprect(gr, wide, high, &sdlr)) { SDL_UpdateWindowSurfaceRects(win, &sdlr, 1); + } } else { PyObject *iterable, *single_arg, *r; Py_ssize_t num; int count; SDL_Rect *rects; - if (PyTuple_Size(arg) != 1) + if (PyTuple_Size(arg) != 1) { return RAISE( PyExc_ValueError, "update requires a rectstyle or an iterable of rectstyles"); + } single_arg = PyTuple_GET_ITEM(arg, 0); num = PyObject_Size(single_arg); @@ -1747,10 +1840,11 @@ pg_update(PyObject *self, PyObject *arg) num = 8; } iterable = PyObject_GetIter(single_arg); - if (!iterable) + if (!iterable) { return RAISE( PyExc_ValueError, "update requires a rectstyle or an iterable of rectstyles"); + } rects = PyMem_New(SDL_Rect, num); if (!rects) { @@ -1783,8 +1877,9 @@ pg_update(PyObject *self, PyObject *arg) "update_rects requires a single list of rects"); } - if (gr->w < 1 && gr->h < 1) + if (gr->w < 1 && gr->h < 1) { continue; + } if (count >= num) { /* About to overstep boundary, need reallocing */ @@ -1799,8 +1894,9 @@ pg_update(PyObject *self, PyObject *arg) } /* bail out if rect not onscreen */ - if (!pg_screencroprect(gr, wide, high, &rects[count])) + if (!pg_screencroprect(gr, wide, high, &rects[count])) { continue; + } ++count; } @@ -1829,10 +1925,12 @@ pg_set_palette(PyObject *self, PyObject *args) Uint8 rgba[4]; VIDEO_INIT_CHECK(); - if (!PyArg_ParseTuple(args, "|O", &list)) + if (!PyArg_ParseTuple(args, "|O", &list)) { return NULL; - if (!surface) + } + if (!surface) { return RAISE(pgExc_SDLError, "No display mode is set"); + } Py_INCREF(surface); surf = pgSurface_AsSurface(surface); @@ -1926,15 +2024,18 @@ pg_set_gamma(PyObject *self, PyObject *arg) SDL_Window *win = pg_GetDefaultWindow(); Uint16 *gamma_ramp; - if (!PyArg_ParseTuple(arg, "f|ff", &r, &g, &b)) + if (!PyArg_ParseTuple(arg, "f|ff", &r, &g, &b)) { return NULL; - if (PyTuple_Size(arg) == 1) + } + if (PyTuple_Size(arg) == 1) { g = b = r; + } VIDEO_INIT_CHECK(); gamma_ramp = (Uint16 *)malloc((3 * 256) * sizeof(Uint16)); - if (!gamma_ramp) + if (!gamma_ramp) { return PyErr_NoMemory(); + } SDL_CalculateGammaRamp(r, gamma_ramp); SDL_CalculateGammaRamp(g, gamma_ramp + 256); SDL_CalculateGammaRamp(b, gamma_ramp + 512); @@ -1948,8 +2049,9 @@ pg_set_gamma(PyObject *self, PyObject *arg) } } if (gamma_ramp) { - if (state->gamma_ramp) + if (state->gamma_ramp) { free(state->gamma_ramp); + } state->gamma_ramp = gamma_ramp; } return PyBool_FromLong(result == 0); @@ -2017,8 +2119,9 @@ pg_set_gamma_ramp(PyObject *self, PyObject *arg) Uint16 *gamma_ramp = (Uint16 *)malloc((3 * 256) * sizeof(Uint16)); Uint16 *r, *g, *b; int result = 0; - if (!gamma_ramp) + if (!gamma_ramp) { return PyErr_NoMemory(); + } r = gamma_ramp; g = gamma_ramp + 256; b = gamma_ramp + 512; @@ -2038,8 +2141,9 @@ pg_set_gamma_ramp(PyObject *self, PyObject *arg) } } if (gamma_ramp) { - if (state->gamma_ramp) + if (state->gamma_ramp) { free(state->gamma_ramp); + } state->gamma_ramp = gamma_ramp; } return PyBool_FromLong(result == 0); @@ -2058,19 +2162,22 @@ pg_set_caption(PyObject *self, PyObject *arg) __analysis_assume(title = "inited"); #endif - if (!PyArg_ParseTuple(arg, "s|s", &title, &icontitle)) + if (!PyArg_ParseTuple(arg, "s|s", &title, &icontitle)) { return NULL; + } - if (state->title) + if (state->title) { free(state->title); + } state->title = (char *)malloc((strlen(title) + 1) * sizeof(char)); if (!state->title) { return PyErr_NoMemory(); } strcpy(state->title, title); - if (win) + if (win) { SDL_SetWindowTitle(win, title); + } /* TODO: icon title? */ Py_RETURN_NONE; @@ -2104,14 +2211,16 @@ pg_set_icon(PyObject *self, PyObject *surface) } if (!SDL_WasInit(SDL_INIT_VIDEO)) { - if (!pg_display_init(NULL, NULL)) + if (!pg_display_init(NULL, NULL)) { return NULL; + } } Py_INCREF(surface); Py_XDECREF(state->icon); state->icon = surface; - if (win) + if (win) { SDL_SetWindowIcon(win, pgSurface_AsSurface(surface)); + } Py_RETURN_NONE; } @@ -2120,8 +2229,9 @@ pg_iconify(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } SDL_MinimizeWindow(win); return PyBool_FromLong(1); } @@ -2191,15 +2301,18 @@ pg_is_fullscreen(PyObject *self, PyObject *_null) int flags; VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } flags = SDL_GetWindowFlags(win) & SDL_WINDOW_FULLSCREEN_DESKTOP; - if (flags & SDL_WINDOW_FULLSCREEN) + if (flags & SDL_WINDOW_FULLSCREEN) { Py_RETURN_TRUE; - else + } + else { Py_RETURN_FALSE; + } } static PyObject * @@ -2209,26 +2322,32 @@ pg_is_vsync(PyObject *self, PyObject *_null) _DisplayState *state = DISPLAY_STATE; VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } if (pg_renderer != NULL) { SDL_RendererInfo info; - if (SDL_GetRendererInfo(pg_renderer, &info) != 0) + if (SDL_GetRendererInfo(pg_renderer, &info) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } - if (info.flags & SDL_RENDERER_PRESENTVSYNC) + if (info.flags & SDL_RENDERER_PRESENTVSYNC) { Py_RETURN_TRUE; - else + } + else { Py_RETURN_FALSE; + } } if (state->using_gl) { - if (SDL_GL_GetSwapInterval() != 0) + if (SDL_GL_GetSwapInterval() != 0) { Py_RETURN_TRUE; - else + } + else { Py_RETURN_FALSE; + } } Py_RETURN_FALSE; @@ -2242,15 +2361,18 @@ pg_current_refresh_rate(PyObject *self, PyObject *_null) int display_index; VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } display_index = SDL_GetWindowDisplayIndex(win); - if (display_index < 0) + if (display_index < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } - if (SDL_GetCurrentDisplayMode(display_index, &mode) != 0) + if (SDL_GetCurrentDisplayMode(display_index, &mode) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyLong_FromLong(mode.refresh_rate); } @@ -2305,8 +2427,9 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) SDL_RendererInfo r_info; VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } flags = SDL_GetWindowFlags(win); @@ -2519,10 +2642,12 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) // if the program goes into fullscreen first the "saved // x and y" are "undefined position" that should be // interpreted as a cue to center the window - if (x == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display)) + if (x == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display)) { x = SDL_WINDOWPOS_CENTERED_DISPLAY(window_display); - if (y == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display)) + } + if (y == (int)SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display)) { y = SDL_WINDOWPOS_CENTERED_DISPLAY(window_display); + } SDL_SetWindowResizable(win, flags & SDL_WINDOW_RESIZABLE); @@ -2667,8 +2792,9 @@ pg_display_resize_event(PyObject *self, PyObject *event) GL_glViewport_Func p_glViewport = NULL; VIDEO_INIT_CHECK(); - if (!win) + if (!win) { return RAISE(pgExc_SDLError, "No open window"); + } flags = SDL_GetWindowFlags(win) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP); @@ -2778,8 +2904,9 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) SDL_bool escape_button_used = SDL_FALSE; if (escape_button_index_obj != Py_None) { escape_button_index = PyLong_AsLong(escape_button_index_obj); - if (escape_button_index == -1 && PyErr_Occurred()) + if (escape_button_index == -1 && PyErr_Occurred()) { return NULL; + } escape_button_used = SDL_TRUE; } @@ -2820,8 +2947,9 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) msgbox_data.title = title; if (PyUnicode_Check(message)) { msgbox_data.message = PyUnicode_AsUTF8(message); - if (!msgbox_data.message) + if (!msgbox_data.message) { return NULL; + } } else if (message == Py_None) { msgbox_data.message = title; @@ -2895,8 +3023,9 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) buttons_data = malloc(sizeof(SDL_MessageBoxButtonData) * num_buttons); for (Py_ssize_t i = 0; i < num_buttons; i++) { PyObject *btn_name_obj = PySequence_GetItem(buttons, i); - if (!btn_name_obj) + if (!btn_name_obj) { goto error; + } if (!PyUnicode_Check(btn_name_obj)) { PyErr_SetString(PyExc_TypeError, @@ -2905,19 +3034,22 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) } const char *btn_name = PyUnicode_AsUTF8(btn_name_obj); - if (!btn_name) + if (!btn_name) { goto error; + } buttons_data[i].text = btn_name; buttons_data[i].buttonid = (int)i; buttons_data[i].flags = 0; - if (return_button_index == buttons_data[i].buttonid) + if (return_button_index == buttons_data[i].buttonid) { buttons_data[i].flags |= SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT; + } if (escape_button_used && - escape_button_index == buttons_data[i].buttonid) + escape_button_index == buttons_data[i].buttonid) { buttons_data[i].flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; + } } } diff --git a/src_c/draw.c b/src_c/draw.c index 4244c1fa02..c837c7a5c7 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -208,12 +208,14 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4((int)startx, (int)starty, 0, 0); + } } /* Draws a line on the given surface. @@ -281,12 +283,14 @@ line(PyObject *self, PyObject *arg, PyObject *kwargs) /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(startx, starty, 0, 0); + } } /* Draws a series of antialiased lines on the given surface. @@ -501,12 +505,14 @@ aalines(PyObject *self, PyObject *arg, PyObject *kwargs) /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(l, t, 0, 0); + } } /* Draws a series of lines on the given surface. @@ -629,12 +635,14 @@ lines(PyObject *self, PyObject *arg, PyObject *kwargs) /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(x, y, 0, 0); + } } static PyObject * @@ -709,12 +717,14 @@ arc(PyObject *self, PyObject *arg, PyObject *kwargs) /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(rect->x, rect->y, 0, 0); + } } static PyObject * @@ -781,12 +791,14 @@ ellipse(PyObject *self, PyObject *arg, PyObject *kwargs) } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(rect->x, rect->y, 0, 0); + } } static PyObject * @@ -816,8 +828,9 @@ circle(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!OOO|iiiii", keywords, &pgSurface_Type, &surfobj, &colorobj, &posobj, &radiusobj, &width, &top_right, - &top_left, &bottom_left, &bottom_right)) + &top_left, &bottom_left, &bottom_right)) { return NULL; /* Exception already set. */ + } if (!pg_TwoIntsFromObj(posobj, &posx, &posy)) { PyErr_SetString(PyExc_TypeError, @@ -890,12 +903,14 @@ circle(PyObject *self, PyObject *args, PyObject *kwargs) return RAISE(PyExc_RuntimeError, "error unlocking surface"); } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(posx, posy, 0, 0); + } } static PyObject * @@ -925,8 +940,9 @@ aacircle(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!OOO|iiiii", keywords, &pgSurface_Type, &surfobj, &colorobj, &posobj, &radiusobj, &width, &top_right, - &top_left, &bottom_left, &bottom_right)) + &top_left, &bottom_left, &bottom_right)) { return NULL; /* Exception already set. */ + } if (!pg_TwoIntsFromObj(posobj, &posx, &posy)) { return RAISE(PyExc_TypeError, @@ -1021,12 +1037,14 @@ aacircle(PyObject *self, PyObject *args, PyObject *kwargs) return RAISE(PyExc_RuntimeError, "error unlocking surface"); } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(posx, posy, 0, 0); + } } static PyObject * @@ -1138,12 +1156,14 @@ polygon(PyObject *self, PyObject *arg, PyObject *kwargs) } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(l, t, 0, 0); + } } static PyObject * @@ -1231,8 +1251,9 @@ rect(PyObject *self, PyObject *args, PyObject *kwargs) result = SDL_FillRect(surf, &clipped, color); pgSurface_Unlock(surfobj); pgSurface_Unprep(surfobj); - if (result != 0) + if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } return pgRect_New(&clipped); } @@ -1266,12 +1287,14 @@ rect(PyObject *self, PyObject *args, PyObject *kwargs) } if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(rect->x, rect->y, 0, 0); + } } /* Functions used in drawing algorithms */ @@ -1297,8 +1320,9 @@ get_antialiased_color(SDL_Surface *surf, SDL_Rect surf_clip_rect, { Uint8 color_part[4], background_color[4]; if (x < surf_clip_rect.x || x >= surf_clip_rect.x + surf_clip_rect.w || - y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) + y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) { return original_color; + } PG_GetRGBA(original_color, surf_format, PG_GetSurfacePalette(surf), &color_part[0], &color_part[1], &color_part[2], &color_part[3]); @@ -1413,8 +1437,9 @@ set_at(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, Uint32 color) Uint8 *pixels = (Uint8 *)surf->pixels; if (x < surf_clip_rect.x || x >= surf_clip_rect.x + surf_clip_rect.w || - y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) + y < surf_clip_rect.y || y >= surf_clip_rect.y + surf_clip_rect.h) { return 0; + } switch (PG_SURF_BytesPerPixel(surf)) { case 1: @@ -1441,8 +1466,9 @@ static void set_and_check_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x, int y, Uint32 color, int *drawn_area) { - if (set_at(surf, surf_clip_rect, x, y, color)) + if (set_at(surf, surf_clip_rect, x, y, color)) { add_pixel_to_drawn_list(x, y, drawn_area); + } } static void @@ -1751,8 +1777,9 @@ static void drawhorzlineclip(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, int x1, int y1, int x2) { - if (y1 < surf_clip_rect.y || y1 >= surf_clip_rect.y + surf_clip_rect.h) + if (y1 < surf_clip_rect.y || y1 >= surf_clip_rect.y + surf_clip_rect.h) { return; + } if (x2 < x1) { int temp = x1; @@ -1763,8 +1790,9 @@ drawhorzlineclip(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, x1 = MAX(x1, surf_clip_rect.x); x2 = MIN(x2, surf_clip_rect.x + surf_clip_rect.w - 1); - if (x2 < surf_clip_rect.x || x1 >= surf_clip_rect.x + surf_clip_rect.w) + if (x2 < surf_clip_rect.x || x1 >= surf_clip_rect.x + surf_clip_rect.w) { return; + } if (x1 == x2) { set_at(surf, surf_clip_rect, x1, y1, color); @@ -1777,8 +1805,9 @@ static void drawhorzlineclipbounding(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, int x1, int y1, int x2, int *pts) { - if (y1 < surf_clip_rect.y || y1 >= surf_clip_rect.y + surf_clip_rect.h) + if (y1 < surf_clip_rect.y || y1 >= surf_clip_rect.y + surf_clip_rect.h) { return; + } if (x2 < x1) { int temp = x1; @@ -1789,8 +1818,9 @@ drawhorzlineclipbounding(SDL_Surface *surf, SDL_Rect surf_clip_rect, x1 = MAX(x1, surf_clip_rect.x); x2 = MIN(x2, surf_clip_rect.x + surf_clip_rect.w - 1); - if (x2 < surf_clip_rect.x || x1 >= surf_clip_rect.x + surf_clip_rect.w) + if (x2 < surf_clip_rect.x || x1 >= surf_clip_rect.x + surf_clip_rect.w) { return; + } if (x1 == x2) { set_and_check_rect(surf, surf_clip_rect, x1, y1, color, pts); @@ -1851,10 +1881,12 @@ draw_filltri(SDL_Surface *surf, SDL_Rect surf_clip_rect, int *xlist, int x1 = p0x + (int)((y - p0y) * d1); int x2; - if (y < p1y) + if (y < p1y) { x2 = p0x + (int)((y - p0y) * d2); - else + } + else { x2 = p1x + (int)((y - p1y) * d3); + } drawhorzlineclipbounding(surf, surf_clip_rect, color, x1, y, x2, draw_area); @@ -1873,8 +1905,9 @@ draw_line_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, int xinc = 0; int extra_width = 1 - (width % 2); - if (width < 1) + if (width < 1) { return; + } if (width == 1) { draw_line(surf, surf_clip_rect, x1, y1, x2, y2, color, drawn_area); return; @@ -1889,8 +1922,9 @@ draw_line_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, xinc = 1; } - if (!clip_line(surf, surf_clip_rect, &x1, &y1, &x2, &y2, width, xinc)) + if (!clip_line(surf, surf_clip_rect, &x1, &y1, &x2, &y2, width, xinc)) { return; + } if (x1 == x2 && y1 == y2) { /* Single point */ start_draw = MAX((x1 - width) + extra_width, surf_clip_rect.x); @@ -2009,9 +2043,10 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, } if (x1 == x2) { /* Vertical line */ dy = (y1 < y2) ? 1 : -1; - for (sy = 0; sy <= abs(y1 - y2); sy++) + for (sy = 0; sy <= abs(y1 - y2); sy++) { set_and_check_rect(surf, surf_clip_rect, x1, y1 + dy * sy, color, drawn_area); + } return; } dx = abs(x2 - x1), sx = x1 < x2 ? 1 : -1; @@ -2041,13 +2076,15 @@ check_pixel_in_arc(int x, int y, double min_dotproduct, double invsqr_radius1, // Check outer boundary const double x_adjusted = x * x * invsqr_radius1; const double y_adjusted = y * y * invsqr_radius2; - if (x_adjusted + y_adjusted > 1) + if (x_adjusted + y_adjusted > 1) { return 0; + } // Check inner boundary const double x_inner_adjusted = x * x * invsqr_inner_radius1; const double y_inner_adjusted = y * y * invsqr_inner_radius2; - if (x_inner_adjusted + y_inner_adjusted < 1) + if (x_inner_adjusted + y_inner_adjusted < 1) { return 0; + } // Return whether the angle of the point is within the accepted range return x * x_middle + y * y_middle >= min_dotproduct * sqrt(x * x + y * y); @@ -2113,40 +2150,46 @@ calc_arc_bounds(SDL_Surface *surf, SDL_Rect surf_clip_rect, double angle_start, // also account for the surface's clip rect. This allows us to bypass the // drawn area calculations int minx = -radius1; - if (-x_middle < min_dotproduct) + if (-x_middle < min_dotproduct) { minx = MIN(MIN(x_start_inner, x_stop_inner), MIN(x_start_outer, x_stop_outer)); + } minx = MAX(minx, surf_clip_rect.x - x_center); int miny = -radius2; - if (-y_middle < min_dotproduct) + if (-y_middle < min_dotproduct) { miny = MIN(MIN(y_start_inner, y_stop_inner), MIN(y_start_outer, y_stop_outer)); + } miny = MAX(miny, surf_clip_rect.y - y_center); int maxx = radius1; - if (x_middle < min_dotproduct) + if (x_middle < min_dotproduct) { maxx = MAX(MAX(x_start_inner, x_stop_inner), MAX(x_start_outer, x_stop_outer)); + } maxx = MIN(maxx, surf_clip_rect.x + surf_clip_rect.w - x_center - 1); int maxy = radius2; - if (y_middle < min_dotproduct) + if (y_middle < min_dotproduct) { maxy = MAX(MAX(y_start_inner, y_stop_inner), MAX(y_start_outer, y_stop_outer)); + } maxy = MIN(maxy, surf_clip_rect.y + surf_clip_rect.h - y_center - 1); // Early return to avoid setting drawn_area with possibly strange values - if (minx >= maxx || miny >= maxy) + if (minx >= maxx || miny >= maxy) { return; + } // dynamically reduce bounds to handle special edge cases with clipping // I really hope you have code folding otherwise good luck I guess :) int exists = 0; // Reduce miny bound area while (!exists) { - if (miny >= maxy) + if (miny >= maxy) { return; + } // Go through each pixel in the circle for (int x = minx; x <= maxx; ++x) { @@ -2165,8 +2208,9 @@ calc_arc_bounds(SDL_Surface *surf, SDL_Rect surf_clip_rect, double angle_start, while (!exists) { // Early return to avoid setting drawn_area with possibly strange // values - if (maxy <= miny) + if (maxy <= miny) { return; + } // For every pixel in the row for (int x = minx; x <= maxx; ++x) { @@ -2185,8 +2229,9 @@ calc_arc_bounds(SDL_Surface *surf, SDL_Rect surf_clip_rect, double angle_start, while (!exists) { // Early return to avoid setting drawn_area with possibly strange // values - if (minx >= maxx) + if (minx >= maxx) { return; + } // For every pixel in the row for (int y = miny; y <= maxy; ++y) { @@ -2205,8 +2250,9 @@ calc_arc_bounds(SDL_Surface *surf, SDL_Rect surf_clip_rect, double angle_start, while (!exists) { // Early return to avoid setting drawn_area with possibly strange // values - if (minx >= maxx) + if (minx >= maxx) { return; + } // For every pixel in the row for (int y = miny; y <= maxy; ++y) { @@ -2233,13 +2279,16 @@ draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, double angle_stop, Uint32 color, int *drawn_area) { // handle cases from documentation - if (width <= 0) + if (width <= 0) { return; - if (angle_stop < angle_start) + } + if (angle_stop < angle_start) { angle_stop += 2 * M_PI; + } // if angles are equal then don't draw anything either - if (angle_stop <= angle_start) + if (angle_stop <= angle_start) { return; + } // Calculate the angle halfway from the start and stop. This is guaranteed // to be within the final arc. @@ -2278,8 +2327,9 @@ draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, &minx, &miny, &maxx, &maxy); // Early return to avoid weird bounding box issues - if (minx >= maxx || miny >= maxy) + if (minx >= maxx || miny >= maxy) { return; + } // Iterate over every pixel within the circle and // check if it's in the arc @@ -2297,9 +2347,10 @@ draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, // use 0 as the inner radius by default const int x_outer = (int)(radius1 * sqrt(1.0 - y2 * invsqr_radius2)); int x_inner = 0; - if (y < inner_radius2) + if (y < inner_radius2) { x_inner = (int)(inner_radius1 * sqrt(1.0 - y2 * invsqr_inner_radius2)); + } // Precalculate positive and negative y offsets const int py_offset = y_center + y; @@ -2317,8 +2368,9 @@ draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, const int neg_x = (-x >= minx) && (-x <= maxx); // Skip coordinate to avoid unnecessary calculations if neither // positive nor negative x are within the allowed ranges - if (!(pos_x || neg_x)) + if (!(pos_x || neg_x)) { continue; + } // Precalculate offsets for positive and negative x const int px_offset = x_center + x; @@ -2332,14 +2384,18 @@ draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, const double x_dot = x * x_middle; // Check if the point is within the arc for each quadrant - if (pos_y && pos_x && (x_dot + y_dot >= cmp)) + if (pos_y && pos_x && (x_dot + y_dot >= cmp)) { unsafe_set_at(surf, px_offset, py_offset, color); - if (pos_y && neg_x && (-x_dot + y_dot >= cmp)) + } + if (pos_y && neg_x && (-x_dot + y_dot >= cmp)) { unsafe_set_at(surf, nx_offset, py_offset, color); - if (neg_y && pos_x && (x_dot - y_dot >= cmp)) + } + if (neg_y && pos_x && (x_dot - y_dot >= cmp)) { unsafe_set_at(surf, px_offset, ny_offset, color); - if (neg_y && neg_x && (-x_dot - y_dot >= cmp)) + } + if (neg_y && neg_x && (-x_dot - y_dot >= cmp)) { unsafe_set_at(surf, nx_offset, ny_offset, color); + } } } @@ -2409,8 +2465,9 @@ draw_circle_bresenham(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, dx += double_radius_squared; dy -= double_radius_squared; d1 += dx - dy + radius_squared; - if (line && y < radius_inner) + if (line && y < radius_inner) { line = 0; + } if (!line) { while (d1_inner < 0) { x_inner += 1; @@ -2460,8 +2517,9 @@ draw_circle_bresenham(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, dy -= double_radius_squared; d1 += dx - dy + radius_squared; } - if (line && y < radius_inner) + if (line && y < radius_inner) { line = 0; + } if (!line) { if (dx_inner < dy_inner) { while (d1_inner < 0) { @@ -2476,11 +2534,12 @@ draw_circle_bresenham(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, d1_inner += dx_inner - dy_inner + radius_inner_squared; } else { - if (!d2_inner) + if (!d2_inner) { d2_inner = radius_inner_squared * ((x_inner + 0.5) * (x_inner + 0.5) + (y_inner - 1) * (y_inner - 1) - radius_inner_squared); + } if (d2_inner > 0) { y_inner--; dy_inner -= double_radius_inner_squared; @@ -2555,18 +2614,22 @@ draw_circle_quadrant(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, int i_ddF_y = -2 * i_y; int i; if (radius == 1) { - if (top_right > 0) + if (top_right > 0) { set_and_check_rect(surf, surf_clip_rect, x0, y0 - 1, color, drawn_area); - if (top_left > 0) + } + if (top_left > 0) { set_and_check_rect(surf, surf_clip_rect, x0 - 1, y0 - 1, color, drawn_area); - if (bottom_left > 0) + } + if (bottom_left > 0) { set_and_check_rect(surf, surf_clip_rect, x0 - 1, y0, color, drawn_area); - if (bottom_right > 0) + } + if (bottom_right > 0) { set_and_check_rect(surf, surf_clip_rect, x0, y0, color, drawn_area); + } return; } @@ -2589,57 +2652,66 @@ draw_circle_quadrant(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x0, i_ddF_x += 2; i_f += i_ddF_x + 1; - if (thickness > 1) + if (thickness > 1) { thickness = y - i_y; + } /* Numbers represent parts of circle function draw in radians interval: [number - 1 * pi / 4, number * pi / 4] */ if (top_right > 0) { for (i = 0; i < thickness; i++) { y1 = y - i; - if ((y0 - y1) < (y0 - x)) + if ((y0 - y1) < (y0 - x)) { set_and_check_rect(surf, surf_clip_rect, x0 + x - 1, y0 - y1, color, drawn_area); /* 2 */ - if ((x0 + y1 - 1) >= (x0 + x - 1)) + } + if ((x0 + y1 - 1) >= (x0 + x - 1)) { set_and_check_rect(surf, surf_clip_rect, x0 + y1 - 1, y0 - x, color, drawn_area); /* 1 */ + } } } if (top_left > 0) { for (i = 0; i < thickness; i++) { y1 = y - i; - if ((y0 - y1) <= (y0 - x)) + if ((y0 - y1) <= (y0 - x)) { set_and_check_rect(surf, surf_clip_rect, x0 - x, y0 - y1, color, drawn_area); /* 3 */ - if ((x0 - y1) < (x0 - x)) + } + if ((x0 - y1) < (x0 - x)) { set_and_check_rect(surf, surf_clip_rect, x0 - y1, y0 - x, color, drawn_area); /* 4 */ + } } } if (bottom_left > 0) { for (i = 0; i < thickness; i++) { y1 = y - i; - if ((x0 - y1) <= (x0 - x)) + if ((x0 - y1) <= (x0 - x)) { set_and_check_rect(surf, surf_clip_rect, x0 - y1, y0 + x - 1, color, drawn_area); /* 5 */ - if ((y0 + y1 - 1) > (y0 + x - 1)) + } + if ((y0 + y1 - 1) > (y0 + x - 1)) { set_and_check_rect(surf, surf_clip_rect, x0 - x, y0 + y1 - 1, color, drawn_area); /* 6 */ + } } } if (bottom_right > 0) { for (i = 0; i < thickness; i++) { y1 = y - i; - if ((y0 + y1 - 1) >= (y0 + x - 1)) + if ((y0 + y1 - 1) >= (y0 + x - 1)) { set_and_check_rect(surf, surf_clip_rect, x0 + x - 1, y0 + y1 - 1, color, drawn_area); /* 7 */ - if ((x0 + y1 - 1) > (x0 + x - 1)) + } + if ((x0 + y1 - 1) > (x0 + x - 1)) { set_and_check_rect(surf, surf_clip_rect, x0 + y1 - 1, y0 + x - 1, color, drawn_area); /* 8 */ + } } } } @@ -3240,8 +3312,9 @@ draw_fillpoly(SDL_Surface *surf, SDL_Rect surf_clip_rect, int *point_x, if (n_intersections % 2 == 0) { intersect = (float)floor(intersect); } - else + else { intersect = (float)ceil(intersect); + } x_intersect[n_intersections++] = (int)intersect + x1; } } @@ -3299,14 +3372,18 @@ draw_round_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, { int pts[16], i; float q_top, q_left, q_bottom, q_right, f; - if (top_left < 0) + if (top_left < 0) { top_left = radius; - if (top_right < 0) + } + if (top_right < 0) { top_right = radius; - if (bottom_left < 0) + } + if (bottom_left < 0) { bottom_left = radius; - if (bottom_right < 0) + } + if (bottom_right < 0) { bottom_right = radius; + } if ((top_left + top_right) > (x2 - x1 + 1) || (bottom_left + bottom_right) > (x2 - x1 + 1) || (top_left + bottom_left) > (y2 - y1 + 1) || @@ -3361,12 +3438,13 @@ draw_round_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, drawn_area); /* Fill gap if reduced radius */ } } - else + else { draw_line_width(surf, surf_clip_rect, color, x1 + top_left, y1 + (int)(width / 2) - 1 + width % 2, x2 - top_right, y1 + (int)(width / 2) - 1 + width % 2, width, drawn_area); /* Top line */ + } if (y2 - bottom_left == y1 + top_left) { for (i = 0; i < width; i++) { set_and_check_rect( @@ -3374,12 +3452,13 @@ draw_round_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, drawn_area); /* Fill gap if reduced radius */ } } - else + else { draw_line_width( surf, surf_clip_rect, color, x1 + (int)(width / 2) - 1 + width % 2, y1 + top_left, x1 + (int)(width / 2) - 1 + width % 2, y2 - bottom_left, width, drawn_area); /* Left line */ + } if (x2 - bottom_right == x1 + bottom_left) { for (i = 0; i < width; i++) { set_and_check_rect( @@ -3387,11 +3466,12 @@ draw_round_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, drawn_area); /* Fill gap if reduced radius */ } } - else + else { draw_line_width(surf, surf_clip_rect, color, x1 + bottom_left, y2 - (int)(width / 2), x2 - bottom_right, y2 - (int)(width / 2), width, drawn_area); /* Bottom line */ + } if (y2 - bottom_right == y1 + top_right) { for (i = 0; i < width; i++) { set_and_check_rect( @@ -3399,11 +3479,12 @@ draw_round_rect(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, drawn_area); /* Fill gap if reduced radius */ } } - else + else { draw_line_width(surf, surf_clip_rect, color, x2 - (int)(width / 2), y1 + top_right, x2 - (int)(width / 2), y2 - bottom_right, width, drawn_area); /* Right line */ + } draw_circle_quadrant(surf, surf_clip_rect, x2 - top_right + 1, y1 + top_right, top_right, width, color, 1, 0, 0, diff --git a/src_c/event.c b/src_c/event.c index 5d87e5a6d4..272babdcbf 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -188,8 +188,9 @@ _pg_unicode_from_event(SDL_Event *event) if (event->key.keysym.mod & KMOD_CTRL) { #endif /* Control Key held, send control-key related unicode. */ - if (key >= SDLK_a && key <= SDLK_z) + if (key >= SDLK_a && key <= SDLK_z) { return key - SDLK_a + 1; + } else { switch (key) { case SDLK_2: @@ -216,8 +217,9 @@ _pg_unicode_from_event(SDL_Event *event) } } if (key < 128) { - if (capitalize && key >= SDLK_a && key <= SDLK_z) + if (capitalize && key >= SDLK_a && key <= SDLK_z) { return key + 'A' - 'a'; + } return key; } @@ -323,8 +325,9 @@ _pg_get_event_unicode(SDL_Event *event) /* fallback to function that determines unicode from the event. * We try to get the unicode attribute, and store it in memory*/ *c = _pg_unicode_from_event(event); - if (_pg_put_event_unicode(event, c)) + if (_pg_put_event_unicode(event, c)) { return _pg_get_event_unicode(event); + } return PyUnicode_FromString(""); } @@ -559,8 +562,9 @@ pg_event_filter(void *_, SDL_Event *event) } else if (event->type == SDL_KEYDOWN) { - if (event->key.repeat) + if (event->key.repeat) { return 0; + } PG_LOCK_EVFILTER_MUTEX #if SDL_VERSION_ATLEAST(3, 0, 0) @@ -569,8 +573,9 @@ pg_event_filter(void *_, SDL_Event *event) pressed_keys[event->key.keysym.scancode] = 1; #endif if (pg_key_repeat_delay > 0) { - if (_pg_repeat_timer) + if (_pg_repeat_timer) { SDL_RemoveTimer(_pg_repeat_timer); + } _pg_repeat_event = *event; _pg_repeat_timer = @@ -622,16 +627,19 @@ pg_event_filter(void *_, SDL_Event *event) event->button.button - 1 < 5) { released_mouse_buttons[event->button.button - 1] = 1; } - if (event->button.button & PGM_BUTTON_KEEP) + if (event->button.button & PGM_BUTTON_KEEP) { event->button.button ^= PGM_BUTTON_KEEP; - else if (event->button.button >= PGM_BUTTON_WHEELUP) + } + else if (event->button.button >= PGM_BUTTON_WHEELUP) { event->button.button += (PGM_BUTTON_X1 - PGM_BUTTON_WHEELUP); + } } else if (event->type == SDL_MOUSEWHEEL) { // #691 We are not moving wheel! - if (!event->wheel.y && !event->wheel.x) + if (!event->wheel.y && !event->wheel.x) { return 0; + } SDL_GetMouseState(&x, &y); /* Generate a MouseButtonDown event and MouseButtonUp for @@ -739,8 +747,9 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null) if (!pg_evfilter_mutex) { /* Create mutex only if it has not been created already */ pg_evfilter_mutex = SDL_CreateMutex(); - if (!pg_evfilter_mutex) + if (!pg_evfilter_mutex) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } #endif SDL_SetEventFilter(pg_event_filter, NULL); @@ -962,8 +971,9 @@ _pg_name_from_eventtype(int type) case PGE_WINDOWDISPLAYCHANGED: return "WindowDisplayChanged"; } - if (type >= PGE_USEREVENT && type < PG_NUMEVENTS) + if (type >= PGE_USEREVENT && type < PG_NUMEVENTS) { return "UserEvent"; + } return "Unknown"; } @@ -1041,8 +1051,9 @@ dict_from_event(SDL_Event *event) } dict = PyDict_New(); - if (!dict) + if (!dict) { return NULL; + } switch (event->type) { case SDL_VIDEORESIZE: @@ -1160,14 +1171,18 @@ dict_from_event(SDL_Event *event) PyLong_FromLong(event->jhat.which)); _pg_insobj(dict, "hat", PyLong_FromLong(event->jhat.hat)); hx = hy = 0; - if (event->jhat.value & SDL_HAT_UP) + if (event->jhat.value & SDL_HAT_UP) { hy = 1; - else if (event->jhat.value & SDL_HAT_DOWN) + } + else if (event->jhat.value & SDL_HAT_DOWN) { hy = -1; - if (event->jhat.value & SDL_HAT_RIGHT) + } + if (event->jhat.value & SDL_HAT_RIGHT) { hx = 1; - else if (event->jhat.value & SDL_HAT_LEFT) + } + else if (event->jhat.value & SDL_HAT_LEFT) { hx = -1; + } _pg_insobj(dict, "value", pg_tuple_couple_from_values_int(hx, hy)); break; case SDL_JOYBUTTONUP: @@ -1706,8 +1721,9 @@ pgEvent_New(SDL_Event *event) { pgEventObject *e; e = PyObject_New(pgEventObject, &pgEvent_Type); - if (!e) + if (!e) { return PyErr_NoMemory(); + } if (event) { e->type = _pg_pgevent_deproxify(event->type); @@ -1730,8 +1746,9 @@ static PyObject * event_name(PyObject *self, PyObject *arg) { int type; - if (!PyArg_ParseTuple(arg, "i", &type)) + if (!PyArg_ParseTuple(arg, "i", &type)) { return NULL; + } return PyUnicode_FromString(_pg_name_from_eventtype(type)); } @@ -1740,8 +1757,9 @@ static PyObject * set_grab(PyObject *self, PyObject *arg) { int doit = PyObject_IsTrue(arg); - if (doit == -1) + if (doit == -1) { return NULL; + } VIDEO_INIT_CHECK(); @@ -1753,10 +1771,12 @@ set_grab(PyObject *self, PyObject *arg) SDL_SetWindowRelativeMouseMode(win, !PG_CursorVisible()); #else SDL_SetWindowGrab(win, SDL_TRUE); - if (PG_CursorVisible() == SDL_DISABLE) + if (PG_CursorVisible() == SDL_DISABLE) { SDL_SetRelativeMouseMode(1); - else + } + else { SDL_SetRelativeMouseMode(0); + } #endif } else { @@ -1823,8 +1843,9 @@ _pg_event_wait(SDL_Event *event, int timeout) * minor modifications */ Uint64 finish = 0; - if (timeout > 0) + if (timeout > 0) { finish = PG_GetTicks() + timeout; + } while (1) { _pg_event_pump(1); /* Use our custom pump here */ @@ -1859,8 +1880,9 @@ pg_event_poll(PyObject *self, PyObject *_null) VIDEO_INIT_CHECK(); /* polling is just waiting for 0 timeout */ - if (!_pg_event_wait(&event, 0)) + if (!_pg_event_wait(&event, 0)) { return pgEvent_New(NULL); + } return pgEvent_New(&event); } @@ -1877,15 +1899,17 @@ pg_event_wait(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - if (!timeout) + if (!timeout) { timeout = -1; + } Py_BEGIN_ALLOW_THREADS; status = _pg_event_wait(&event, timeout); Py_END_ALLOW_THREADS; - if (!status) + if (!status) { return pgEvent_New(NULL); + } return pgEvent_New(&event); } @@ -1915,18 +1939,21 @@ _pg_eventtype_as_seq(PyObject *obj, Py_ssize_t *len) Py_INCREF(obj); return obj; } - else if (PyLong_Check(obj)) + else if (PyLong_Check(obj)) { return Py_BuildValue("(O)", obj); - else + } + else { return RAISE(PyExc_TypeError, "event type must be numeric or a sequence"); + } } static void _pg_flush_events(Uint32 type) { - if (type == MAX_UINT32) + if (type == MAX_UINT32) { SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); + } else { SDL_FlushEvent(type); SDL_FlushEvent(_pg_pgevent_proxify(type)); @@ -1944,8 +1971,9 @@ pg_event_clear(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"eventtype", "pump", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Op", kwids, &obj, - &dopump)) + &dopump)) { return NULL; + } VIDEO_INIT_CHECK(); _pg_event_pump(dopump); @@ -1955,8 +1983,9 @@ pg_event_clear(PyObject *self, PyObject *args, PyObject *kwargs) } else { seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) /* error aldready set */ + if (!seq) { /* error aldready set */ return NULL; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); @@ -1976,8 +2005,9 @@ _pg_event_append_to_list(PyObject *list, SDL_Event *event) { /* The caller of this function must handle decref of list on error */ PyObject *e = pgEvent_New(event); - if (!e) /* Exception already set. */ + if (!e) { /* Exception already set. */ return 0; + } if (PyList_Append(list, e)) { Py_DECREF(e); @@ -2026,8 +2056,9 @@ _pg_get_all_events_except(PyObject *obj) SDL_Event eventbuf[PG_GET_LIST_LEN]; filtered_events = malloc(sizeof(SDL_Event) * filtered_events_len); - if (!filtered_events) + if (!filtered_events) { return PyErr_NoMemory(); + } list = PyList_New(0); if (!list) { @@ -2036,13 +2067,15 @@ _pg_get_all_events_except(PyObject *obj) } seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { goto error; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); - if (type == -1) + if (type == -1) { goto error; + } do { ret = PG_PEEP_EVENT(&event, 1, SDL_GETEVENT, type); @@ -2102,8 +2135,9 @@ _pg_get_all_events_except(PyObject *obj) } for (loop = 0; loop < len; loop++) { - if (!_pg_event_append_to_list(list, &eventbuf[loop])) + if (!_pg_event_append_to_list(list, &eventbuf[loop])) { goto error; + } } } while (len == PG_GET_LIST_LEN); @@ -2129,8 +2163,9 @@ _pg_get_all_events(void) int loop, len = PG_GET_LIST_LEN; list = PyList_New(0); - if (!list) + if (!list) { return PyErr_NoMemory(); + } while (len == PG_GET_LIST_LEN) { len = PG_PEEP_EVENT_ALL(eventbuf, PG_GET_LIST_LEN, SDL_GETEVENT); @@ -2140,8 +2175,9 @@ _pg_get_all_events(void) } for (loop = 0; loop < len; loop++) { - if (!_pg_event_append_to_list(list, &eventbuf[loop])) + if (!_pg_event_append_to_list(list, &eventbuf[loop])) { goto error; + } } } return list; @@ -2160,17 +2196,20 @@ _pg_get_seq_events(PyObject *obj) PyObject *seq, *list; list = PyList_New(0); - if (!list) + if (!list) { return PyErr_NoMemory(); + } seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { goto error; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); - if (type == -1) + if (type == -1) { goto error; + } do { ret = PG_PEEP_EVENT(&event, 1, SDL_GETEVENT, type); @@ -2179,8 +2218,9 @@ _pg_get_seq_events(PyObject *obj) goto error; } else if (ret > 0) { - if (!_pg_event_append_to_list(list, &event)) + if (!_pg_event_append_to_list(list, &event)) { goto error; + } } } while (ret); do { @@ -2191,8 +2231,9 @@ _pg_get_seq_events(PyObject *obj) goto error; } else if (ret > 0) { - if (!_pg_event_append_to_list(list, &event)) + if (!_pg_event_append_to_list(list, &event)) { goto error; + } } } while (ret); } @@ -2216,8 +2257,9 @@ pg_event_get(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"eventtype", "pump", "exclude", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OpO", kwids, &obj_evtype, - &dopump, &obj_exclude)) + &dopump, &obj_exclude)) { return NULL; + } VIDEO_INIT_CHECK(); @@ -2251,8 +2293,9 @@ pg_event_peek(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"eventtype", "pump", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Op", kwids, &obj, - &dopump)) + &dopump)) { return NULL; + } VIDEO_INIT_CHECK(); @@ -2260,14 +2303,16 @@ pg_event_peek(PyObject *self, PyObject *args, PyObject *kwargs) if (obj == NULL || obj == Py_None) { res = PG_PEEP_EVENT_ALL(&event, 1, SDL_PEEKEVENT); - if (res < 0) + if (res < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyBool_FromLong(res); } else { seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { return NULL; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); @@ -2279,8 +2324,9 @@ pg_event_peek(PyObject *self, PyObject *args, PyObject *kwargs) if (res) { Py_DECREF(seq); - if (res < 0) + if (res < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_TRUE; } res = PG_PEEP_EVENT(&event, 1, SDL_PEEKEVENT, @@ -2288,8 +2334,9 @@ pg_event_peek(PyObject *self, PyObject *args, PyObject *kwargs) if (res) { Py_DECREF(seq); - if (res < 0) + if (res < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_TRUE; } } @@ -2307,8 +2354,9 @@ static PyObject * pg_event_post(PyObject *self, PyObject *obj) { VIDEO_INIT_CHECK(); - if (!pgEvent_Check(obj)) + if (!pgEvent_Check(obj)) { return RAISE(PyExc_TypeError, "argument must be an Event object"); + } pgEventObject *e = (pgEventObject *)obj; switch (pg_post_event(e->type, e->dict)) { @@ -2337,8 +2385,9 @@ pg_event_set_allowed(PyObject *self, PyObject *obj) } else { seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { return NULL; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); @@ -2370,8 +2419,9 @@ pg_event_set_blocked(PyObject *self, PyObject *obj) } else { seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { return NULL; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); @@ -2402,8 +2452,9 @@ pg_event_get_blocked(PyObject *self, PyObject *obj) VIDEO_INIT_CHECK(); seq = _pg_eventtype_as_seq(obj, &len); - if (!seq) + if (!seq) { return NULL; + } for (loop = 0; loop < len; loop++) { type = _pg_eventtype_from_seq(seq, loop); @@ -2424,11 +2475,13 @@ pg_event_get_blocked(PyObject *self, PyObject *obj) static PyObject * pg_event_custom_type(PyObject *self, PyObject *_null) { - if (_custom_event < PG_NUMEVENTS) + if (_custom_event < PG_NUMEVENTS) { return PyLong_FromLong(_custom_event++); - else + } + else { return RAISE(pgExc_SDLError, "pygame.event.custom_type made too many event types."); + } } static PyMethodDef _event_methods[] = { diff --git a/src_c/font.c b/src_c/font.c index 2a91432127..bbc2987365 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -237,10 +237,12 @@ static void _font_set_or_clear_style_flag(TTF_Font *font, int flag, int set_flag) { int style = TTF_GetFontStyle(font); - if (set_flag) + if (set_flag) { style |= flag; - else + } + else { style &= ~flag; + } TTF_SetFontStyle(font, style); } @@ -936,8 +938,9 @@ font_metrics(PyObject *self, PyObject *textobj) } buffer = PyUnicode_AsUCS4Copy(textobj); Py_DECREF(textobj); - if (!buffer) + if (!buffer) { return NULL; + } list = PyList_New(0); if (!list) { @@ -1184,8 +1187,9 @@ font_dealloc(PyFontObject *self) self->font = NULL; } - if (self->weakreflist) + if (self->weakreflist) { PyObject_ClearWeakRefs((PyObject *)self); + } Py_TYPE(self)->tp_free((PyObject *)self); } @@ -1263,8 +1267,9 @@ font_init(PyFontObject *self, PyObject *args, PyObject *kwds) goto error; } - if (fontsize <= 1) + if (fontsize <= 1) { fontsize = 1; + } if (SDL_RWsize(rw) <= 0) { PyErr_Format(PyExc_ValueError, @@ -1359,12 +1364,14 @@ PyFont_New(TTF_Font *font) { PyFontObject *fontobj; - if (!font) + if (!font) { return RAISE(PyExc_RuntimeError, "unable to load font."); + } fontobj = (PyFontObject *)PyFont_Type.tp_new(&PyFont_Type, NULL, NULL); - if (fontobj) + if (fontobj) { fontobj->font = font; + } return (PyObject *)fontobj; } diff --git a/src_c/freetype/ft_cache.c b/src_c/freetype/ft_cache.c index c87962f6e1..f98f28d11c 100644 --- a/src_c/freetype/ft_cache.c +++ b/src_c/freetype/ft_cache.c @@ -147,8 +147,9 @@ _PGFT_Cache_Init(FreeTypeInstance *ft, FontCache *cache) cache_size = cache_size + 1; cache->nodes = _PGFT_calloc((size_t)cache_size, sizeof(FontGlyph *)); - if (!cache->nodes) + if (!cache->nodes) { return -1; + } cache->depths = _PGFT_calloc((size_t)cache_size, sizeof(FT_Byte)); if (!cache->depths) { _PGFT_free(cache->nodes); diff --git a/src_c/freetype/ft_layout.c b/src_c/freetype/ft_layout.c index ad46a7681a..7355207c96 100644 --- a/src_c/freetype/ft_layout.c +++ b/src_c/freetype/ft_layout.c @@ -525,8 +525,9 @@ _PGFT_LoadGlyph(FontGlyph *glyph, GlyphIndex_t id, const FontRenderMode *mode, * Load the glyph into the glyph slot */ if (FT_Load_Glyph(context->font, id, (FT_Int)load_flags) || - FT_Get_Glyph(context->font->glyph, &image)) + FT_Get_Glyph(context->font->glyph, &image)) { goto cleanup; + } /* * Perform any outline transformations @@ -539,8 +540,10 @@ _PGFT_LoadGlyph(FontGlyph *glyph, GlyphIndex_t id, const FontRenderMode *mode, bold_str = FX16_CEIL_TO_FX6(mode->strength * x_ppem); FT_Outline_Get_CBox(&((FT_OutlineGlyph)image)->outline, &before); - if (FT_Outline_Embolden(&((FT_OutlineGlyph)image)->outline, bold_str)) + if (FT_Outline_Embolden(&((FT_OutlineGlyph)image)->outline, + bold_str)) { goto cleanup; + } FT_Outline_Get_CBox(&((FT_OutlineGlyph)image)->outline, &after); strong_delta.x += ((after.xMax - after.xMin) - (before.xMax - before.xMin)); diff --git a/src_c/freetype/ft_unicode.c b/src_c/freetype/ft_unicode.c index fb2caf6fb0..314259486a 100644 --- a/src_c/freetype/ft_unicode.c +++ b/src_c/freetype/ft_unicode.c @@ -47,8 +47,9 @@ raise_unicode_error(const char *codec, PyObject *unistr, Py_ssize_t start, codec, unistr, (unsigned long)start, (unsigned long)end, reason); - if (!e) + if (!e) { return; + } Py_INCREF(PyExc_UnicodeEncodeError); PyErr_Restore(PyExc_UnicodeEncodeError, e, 0); @@ -65,8 +66,9 @@ _encode_unicode_string(PyObject *obj, int ucs4) int i, j; /* This Py_UCS4 src has to be freed later */ Py_UCS4 *src = PyUnicode_AsUCS4Copy(obj); - if (!src) + if (!src) { return NULL; + } len = srclen = PyUnicode_GetLength(obj); if (!ucs4) { @@ -163,14 +165,17 @@ _encode_bytes_string(PyObject *obj) PGFT_String * _PGFT_EncodePyString(PyObject *obj, int ucs4) { - if (PyUnicode_Check(obj)) + if (PyUnicode_Check(obj)) { return _encode_unicode_string(obj, ucs4); - else if (PyBytes_Check(obj)) + } + else if (PyBytes_Check(obj)) { return _encode_bytes_string(obj); - else + } + else { PyErr_Format(PyExc_TypeError, "Expected a Unicode or LATIN1 (bytes) string for text:" " got type %.1024s", Py_TYPE(obj)->tp_name); + } return NULL; } diff --git a/src_c/freetype/ft_wrap.c b/src_c/freetype/ft_wrap.c index 3385f278f1..50afd3bced 100644 --- a/src_c/freetype/ft_wrap.c +++ b/src_c/freetype/ft_wrap.c @@ -277,8 +277,9 @@ _PGFT_GetTextRect(FreeTypeInstance *ft, pgFontObject *fontobj, FT_Fixed underline_size; font_text = _PGFT_LoadLayout(ft, fontobj, mode, text); - if (!font_text) + if (!font_text) { goto error; + } _PGFT_GetRenderMetrics(mode, font_text, &width, &height, &offset, &underline_top, &underline_size); r->x = -(Sint16)FX6_TRUNC(FX6_FLOOR(offset.x)); @@ -473,8 +474,9 @@ RWops_read(FT_Stream stream, unsigned long offset, unsigned char *buffer, src = (SDL_RWops *)stream->descriptor.pointer; SDL_RWseek(src, (int)offset, SEEK_SET); - if (count == 0) + if (count == 0) { return 0; + } return (unsigned long)SDL_RWread(src, buffer, 1, (int)count); } @@ -512,16 +514,18 @@ _PGFT_TryLoadFont_RWops(FreeTypeInstance *ft, pgFontObject *fontobj, SDL_RWops * _PGFT_GetRWops(pgFontObject *fontobj) { - if (fontobj->id.open_args.flags == FT_OPEN_STREAM) + if (fontobj->id.open_args.flags == FT_OPEN_STREAM) { return fontobj->id.open_args.stream->descriptor.pointer; + } return NULL; } void _PGFT_UnloadFont(FreeTypeInstance *ft, pgFontObject *fontobj) { - if (fontobj->id.open_args.flags == 0) + if (fontobj->id.open_args.flags == 0) { return; + } if (ft) { FTC_Manager_RemoveFaceID(ft->cache_manager, @@ -600,17 +604,21 @@ _PGFT_Init(FreeTypeInstance **_instance, int cache_size) void _PGFT_Quit(FreeTypeInstance *ft) { - if (!ft) + if (!ft) { return; + } - if (--ft->ref_count != 0) + if (--ft->ref_count != 0) { return; + } - if (ft->cache_manager) + if (ft->cache_manager) { FTC_Manager_Done(ft->cache_manager); + } - if (ft->library) + if (ft->library) { FT_Done_FreeType(ft->library); + } _PGFT_free(ft); } diff --git a/src_c/gfxdraw.c b/src_c/gfxdraw.c index c3ded48fd8..09cbb050b8 100644 --- a/src_c/gfxdraw.c +++ b/src_c/gfxdraw.c @@ -125,12 +125,14 @@ Sint16FromObj(PyObject *item, Sint16 *val) PyObject *intobj; long tmp; - if (!(intobj = PyNumber_Long(item))) + if (!(intobj = PyNumber_Long(item))) { return 0; + } tmp = PyLong_AsLong(intobj); Py_DECREF(intobj); - if (tmp == -1 && PyErr_Occurred()) + if (tmp == -1 && PyErr_Occurred()) { return 0; + } *val = (Sint16)tmp; return 1; } @@ -159,8 +161,9 @@ _gfx_pixelcolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); - if (!PyArg_ParseTuple(args, "OhhO:pixel", &surface, &x, &y, &color)) + if (!PyArg_ParseTuple(args, "OhhO:pixel", &surface, &x, &y, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -185,8 +188,10 @@ _gfx_hlinecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); - if (!PyArg_ParseTuple(args, "OhhhO:hline", &surface, &x1, &x2, &y, &color)) + if (!PyArg_ParseTuple(args, "OhhhO:hline", &surface, &x1, &x2, &y, + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -212,8 +217,9 @@ _gfx_vlinecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhO:vline", &surface, &x, &_y1, &y2, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -316,8 +322,9 @@ _gfx_linecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhO:line", &surface, &x1, &_y1, &x2, &y2, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -342,8 +349,10 @@ _gfx_circlecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); - if (!PyArg_ParseTuple(args, "OhhhO:circle", &surface, &x, &y, &r, &color)) + if (!PyArg_ParseTuple(args, "OhhhO:circle", &surface, &x, &y, &r, + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -369,8 +378,9 @@ _gfx_arccolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhhO:arc", &surface, &x, &y, &r, &start, - &end, &color)) + &end, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -396,8 +406,9 @@ _gfx_aacirclecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhO:aacircle", &surface, &x, &y, &r, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -423,8 +434,9 @@ _gfx_filledcirclecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhO:filledcircle", &surface, &x, &y, &r, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -450,8 +462,9 @@ _gfx_ellipsecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhO:ellipse", &surface, &x, &y, &rx, &ry, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -477,8 +490,9 @@ _gfx_aaellipsecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhO:aaellipse", &surface, &x, &y, &rx, &ry, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -504,8 +518,9 @@ _gfx_filledellipsecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhO:filled_ellipse", &surface, &x, &y, &rx, - &ry, &color)) + &ry, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -531,8 +546,9 @@ _gfx_piecolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhhO:pie", &surface, &x, &y, &r, &start, - &end, &color)) + &end, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -558,8 +574,9 @@ _gfx_trigoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhhhO:trigon", &surface, &x1, &_y1, &x2, - &y2, &x3, &y3, &color)) + &y2, &x3, &y3, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -585,8 +602,9 @@ _gfx_aatrigoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhhhO:aatrigon", &surface, &x1, &_y1, &x2, - &y2, &x3, &y3, &color)) + &y2, &x3, &y3, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -612,8 +630,9 @@ _gfx_filledtrigoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OhhhhhhO:filled_trigon", &surface, &x1, &_y1, - &x2, &y2, &x3, &y3, &color)) + &x2, &y2, &x3, &y3, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -640,8 +659,9 @@ _gfx_polygoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); - if (!PyArg_ParseTuple(args, "OOO:polygon", &surface, &points, &color)) + if (!PyArg_ParseTuple(args, "OOO:polygon", &surface, &points, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -662,10 +682,12 @@ _gfx_polygoncolor(PyObject *self, PyObject *args) vx = PyMem_New(Sint16, (size_t)count); vy = PyMem_New(Sint16, (size_t)count); if (!vx || !vy) { - if (vx) + if (vx) { PyMem_Free(vx); - if (vy) + } + if (vy) { PyMem_Free(vy); + } return NULL; } @@ -713,8 +735,9 @@ _gfx_aapolygoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); - if (!PyArg_ParseTuple(args, "OOO:aapolygon", &surface, &points, &color)) + if (!PyArg_ParseTuple(args, "OOO:aapolygon", &surface, &points, &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -735,10 +758,12 @@ _gfx_aapolygoncolor(PyObject *self, PyObject *args) vx = PyMem_New(Sint16, (size_t)count); vy = PyMem_New(Sint16, (size_t)count); if (!vx || !vy) { - if (vx) + if (vx) { PyMem_Free(vx); - if (vy) + } + if (vy) { PyMem_Free(vy); + } return NULL; } @@ -787,8 +812,9 @@ _gfx_filledpolygoncolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OOO:filled_polygon", &surface, &points, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -809,10 +835,12 @@ _gfx_filledpolygoncolor(PyObject *self, PyObject *args) vx = PyMem_New(Sint16, (size_t)count); vy = PyMem_New(Sint16, (size_t)count); if (!vx || !vy) { - if (vx) + if (vx) { PyMem_Free(vx); - if (vy) + } + if (vy) { PyMem_Free(vy); + } return NULL; } @@ -861,8 +889,9 @@ _gfx_texturedpolygon(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OOOhh:textured_polygon", &surface, &points, - &texture, &tdx, &tdy)) + &texture, &tdx, &tdy)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -891,10 +920,12 @@ _gfx_texturedpolygon(PyObject *self, PyObject *args) vx = PyMem_New(Sint16, (size_t)count); vy = PyMem_New(Sint16, (size_t)count); if (!vx || !vy) { - if (vx) + if (vx) { PyMem_Free(vx); - if (vy) + } + if (vy) { PyMem_Free(vy); + } return NULL; } @@ -942,8 +973,9 @@ _gfx_beziercolor(PyObject *self, PyObject *args) ASSERT_VIDEO_INIT(NULL); if (!PyArg_ParseTuple(args, "OOiO:bezier", &surface, &points, &steps, - &color)) + &color)) { return NULL; + } if (!pgSurface_Check(surface)) { return RAISE(PyExc_TypeError, "surface must be a Surface"); @@ -969,10 +1001,12 @@ _gfx_beziercolor(PyObject *self, PyObject *args) vx = PyMem_New(Sint16, (size_t)count); vy = PyMem_New(Sint16, (size_t)count); if (!vx || !vy) { - if (vx) + if (vx) { PyMem_Free(vx); - if (vy) + } + if (vy) { PyMem_Free(vy); + } return RAISE(PyExc_MemoryError, "memory allocation failed"); } diff --git a/src_c/image.c b/src_c/image.c index 6141ae8871..f9176a00ba 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -103,11 +103,13 @@ image_load_basic(PyObject *self, PyObject *obj) static PyObject * image_load_extended(PyObject *self, PyObject *arg, PyObject *kwarg) { - if (extloadobj == NULL) + if (extloadobj == NULL) { return RAISE(PyExc_NotImplementedError, "loading images of extended format is not available"); - else + } + else { return PyObject_Call(extloadobj, arg, kwarg); + } } static PyObject * @@ -124,8 +126,9 @@ image_load(PyObject *self, PyObject *arg, PyObject *kwarg) } return image_load_basic(self, obj); } - else + else { return image_load_extended(self, arg, kwarg); + } } #ifdef WIN32 @@ -137,11 +140,13 @@ image_load(PyObject *self, PyObject *arg, PyObject *kwarg) static PyObject * image_save_extended(PyObject *self, PyObject *arg, PyObject *kwarg) { - if (extsaveobj == NULL) + if (extsaveobj == NULL) { return RAISE(PyExc_NotImplementedError, "saving images of extended format is not available"); - else + } + else { return PyObject_Call(extsaveobj, arg, kwarg); + } } static PyObject * @@ -243,19 +248,23 @@ image_save(PyObject *self, PyObject *arg, PyObject *kwarg) static PyObject * image_get_extended(PyObject *self, PyObject *_null) { - if (extverobj == NULL) + if (extverobj == NULL) { Py_RETURN_FALSE; - else + } + else { Py_RETURN_TRUE; + } } static PyObject * image_get_sdl_image_version(PyObject *self, PyObject *args, PyObject *kwargs) { - if (extverobj == NULL) + if (extverobj == NULL) { Py_RETURN_NONE; - else + } + else { return PyObject_Call(extverobj, args, kwargs); + } } #if PG_COMPILE_SSE4_2 @@ -536,8 +545,9 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) if (!PyArg_ParseTupleAndKeywords(arg, kwarg, "O!s|ii", kwds, &pgSurface_Type, &surfobj, &format, - &flipped, &pitch)) + &flipped, &pitch)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); #if SDL_VERSION_ATLEAST(3, 0, 0) @@ -569,10 +579,11 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) Ashift = format_details->Ashift; if (!strcmp(format, "P")) { - if (PG_SURF_BytesPerPixel(surf) != 1) + if (PG_SURF_BytesPerPixel(surf) != 1) { return RAISE( PyExc_ValueError, "Can only create \"P\" format data with 8bit Surfaces"); + } byte_width = surf->w; } else if (!strcmp(format, "RGB")) { @@ -590,10 +601,11 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) } else if (!strcmp(format, "RGBA_PREMULT") || !strcmp(format, "ARGB_PREMULT")) { - if (PG_SURF_BytesPerPixel(surf) == 1 || Amask == 0) + if (PG_SURF_BytesPerPixel(surf) == 1 || Amask == 0) { return RAISE(PyExc_ValueError, "Can only create pre-multiplied alpha bytes if " "the surface has per-pixel alpha"); + } byte_width = surf->w * 4; } else { @@ -614,8 +626,9 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) } bytes = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)pitch * surf->h); - if (!bytes) + if (!bytes) { return NULL; + } PyBytes_AsStringAndSize(bytes, &data, &len); if (!strcmp(format, "P")) { @@ -623,8 +636,9 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) for (h = 0; h < surf->h; ++h) { Uint8 *ptr = (Uint8 *)DATAROW(data, h, pitch, surf->h, flipped); memcpy(ptr, (char *)surf->pixels + (h * surf->pitch), surf->w); - if (padding) + if (padding) { memset(ptr + byte_width, 0, padding); + } } pgSurface_Unlock(surfobj); } @@ -1156,12 +1170,14 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "flipped", "pitch", NULL}; if (!PyArg_ParseTupleAndKeywords(arg, kwds, "O!(ii)s|ii", kwids, &PyBytes_Type, &bytes, &w, &h, &format, - &flipped, &pitch)) + &flipped, &pitch)) { return NULL; + } - if (w < 1 || h < 1) + if (w < 1 || h < 1) { return RAISE(PyExc_ValueError, "Resolution must be nonzero positive values"); + } PyBytes_AsStringAndSize(bytes, &data, &len); @@ -1175,18 +1191,21 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_INDEX8); - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); - for (looph = 0; looph < h; ++looph) + for (looph = 0; looph < h; ++looph) { memcpy(((char *)surf->pixels) + looph * surf->pitch, DATAROW(data, looph, pitch, h, flipped), w); + } SDL_UnlockSurface(surf); } else if (!strcmp(format, "RGB")) { @@ -1199,18 +1218,20 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "3 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } #if SDL_BYTEORDER == SDL_LIL_ENDIAN surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_BGR24); #else surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_RGB24); #endif - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); for (looph = 0; looph < h; ++looph) { Uint8 *pix = @@ -1244,15 +1265,17 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) } int alphamult = !strcmp(format, "RGBA"); - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } surf = PG_CreateSurface( w, h, (alphamult ? SDL_PIXELFORMAT_RGBA32 : PG_PIXELFORMAT_RGBX32)); - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); for (looph = 0; looph < h; ++looph) { Uint32 *pix = (Uint32 *)DATAROW(surf->pixels, looph, surf->pitch, @@ -1272,13 +1295,15 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "4 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_BGRA32); - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); for (looph = 0; looph < h; ++looph) { Uint32 *pix = (Uint32 *)DATAROW(surf->pixels, looph, surf->pitch, @@ -1298,13 +1323,15 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "4 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_ARGB32); - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); for (looph = 0; looph < h; ++looph) { Uint32 *pix = (Uint32 *)DATAROW(surf->pixels, looph, surf->pitch, @@ -1324,13 +1351,15 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) "4 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Bytes length does not equal format and resolution size"); + } surf = PG_CreateSurface(w, h, SDL_PIXELFORMAT_ABGR32); - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } SDL_LockSurface(surf); for (looph = 0; looph < h; ++looph) { Uint32 *pix = (Uint32 *)DATAROW(surf->pixels, looph, surf->pitch, @@ -1340,8 +1369,9 @@ image_frombytes(PyObject *self, PyObject *arg, PyObject *kwds) } SDL_UnlockSurface(surf); } - else + else { return RAISE(PyExc_ValueError, "Unrecognized type of format"); + } return (PyObject *)pgSurface_New(surf); } @@ -1378,8 +1408,9 @@ _as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len) if (obj == NULL || buffer == NULL || buffer_len == NULL) { return -1; } - if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0) + if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0) { return -1; + } *buffer = view.buf; *buffer_len = view.len; @@ -1415,16 +1446,19 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) static char *kwids[] = {"buffer", "size", "format", "pitch", NULL}; if (!PyArg_ParseTupleAndKeywords(arg, kwds, "O(ii)s|i", kwids, &buffer, &w, - &h, &format, &pitch)) + &h, &format, &pitch)) { return NULL; + } - if (w < 1 || h < 1) + if (w < 1 || h < 1) { return RAISE(PyExc_ValueError, "Resolution must be nonzero positive values"); + } /* breaking constness here, we should really not change this string */ - if (pgObject_AsCharBuffer(buffer, (const char **)&data, &len) == -1) + if (pgObject_AsCharBuffer(buffer, (const char **)&data, &len) == -1) { return NULL; + } if (!strcmp(format, "P")) { if (pitch == -1) { @@ -1436,10 +1470,11 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) "as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_INDEX8, data, pitch); } @@ -1453,10 +1488,11 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) "3 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_RGB24, data, pitch); } else if (!strcmp(format, "BGR")) { @@ -1469,10 +1505,11 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) "3 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_BGR24, data, pitch); } else if (!strcmp(format, "BGRA")) { @@ -1485,10 +1522,11 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) "4 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_BGRA32, data, pitch); } else if (!strcmp(format, "RGBA") || !strcmp(format, "RGBX")) { @@ -1502,10 +1540,11 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) } int alphamult = !strcmp(format, "RGBA"); - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom( w, h, (alphamult ? SDL_PIXELFORMAT_RGBA32 : PG_PIXELFORMAT_RGBX32), data, pitch); @@ -1520,17 +1559,20 @@ image_frombuffer(PyObject *self, PyObject *arg, PyObject *kwds) "4 as per the format"); } - if (len != (Py_ssize_t)pitch * h) + if (len != (Py_ssize_t)pitch * h) { return RAISE( PyExc_ValueError, "Buffer length does not equal format and resolution size"); + } surf = PG_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_ARGB32, data, pitch); } - else + else { return RAISE(PyExc_ValueError, "Unrecognized type of format"); + } - if (!surf) + if (!surf) { return RAISE(pgExc_SDLError, SDL_GetError()); + } surfobj = (pgSurfaceObject *)pgSurface_New(surf); Py_INCREF(buffer); surfobj->dependency = buffer; @@ -1598,8 +1640,9 @@ rle_line(Uint8 *src, Uint8 *dst, int w, int bpp) memcpy(&pix, src + x * bpp, bpp); x++; while (x < w && memcmp(&pix, src + x * bpp, bpp) == 0 && - x - x0 < TGA_RLE_MAX) + x - x0 < TGA_RLE_MAX) { x++; + } /* use a repetition chunk iff the repeated pixels would consume two bytes or more */ if ((x - x0 - 1) * bpp >= 2 || x == w) { @@ -1685,10 +1728,12 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) if (srcbpp == 8) { h.has_cmap = 1; h.type = TGA_TYPE_INDEXED; - if (have_surf_colorkey) + if (have_surf_colorkey) { h.cmap_bits = 32; - else + } + else { h.cmap_bits = 24; + } SETLE16(h.cmap_len, surf_palette->ncolors); h.pixel_bits = 8; output_format = SDL_PIXELFORMAT_INDEX8; @@ -1709,8 +1754,9 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) } } bpp = h.pixel_bits >> 3; - if (rle) + if (rle) { h.type += TGA_TYPE_RLE; + } SETLE16(h.yorigin, 0); SETLE16(h.xorigin, 0); @@ -1743,8 +1789,9 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) } linebuf = PG_CreateSurface(surface->w, 1, output_format); - if (!linebuf) + if (!linebuf) { return -1; + } if (h.has_cmap) { #if SDL_VERSION_ATLEAST(3, 0, 0) @@ -1766,8 +1813,9 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) /* Temporarily remove colorkey and alpha from surface so copies are opaque */ SDL_SetSurfaceAlphaMod(surface, SDL_ALPHA_OPAQUE); - if (have_surf_colorkey) + if (have_surf_colorkey) { SDL_SetColorKey(surface, SDL_FALSE, surf_colorkey); + } r.x = 0; r.w = surface->w; @@ -1799,8 +1847,9 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) /* restore flags */ SDL_SetSurfaceAlphaMod(surface, surf_alpha); - if (have_surf_colorkey) + if (have_surf_colorkey) { SDL_SetColorKey(surface, SDL_TRUE, surf_colorkey); + } free(rlebuf); SDL_FreeSurface(linebuf); @@ -1817,8 +1866,9 @@ SaveTGA(SDL_Surface *surface, const char *file, int rle) { SDL_RWops *out = SDL_RWFromFile(file, "wb"); int ret; - if (!out) + if (!out) { return -1; + } ret = SaveTGA_RW(surface, out, rle); SDL_RWclose(out); return ret; diff --git a/src_c/imageext.c b/src_c/imageext.c index bb5873c5d7..78d0aed7e4 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -101,8 +101,9 @@ image_load_ext(PyObject *self, PyObject *arg, PyObject *kwarg) } rw = pgRWops_FromObject(obj, &ext); - if (rw == NULL) /* stop on NULL, error already set */ + if (rw == NULL) { /* stop on NULL, error already set */ return NULL; + } if (name) { /* override extension with namehint if given */ type = iext_find_extension(name); @@ -143,8 +144,9 @@ image_load_ext(PyObject *self, PyObject *arg, PyObject *kwarg) free(ext); } - if (surf == NULL) + if (surf == NULL) { return RAISE(pgExc_SDLError, IMG_GetError()); + } final = (PyObject *)pgSurface_New(surf); if (final == NULL) { diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 8d410e1de1..2b2be56996 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -690,8 +690,9 @@ pg_tuple_couple_from_values_double(double val1, double val2) * to do the same thing. */ PyObject *tuple = PyTuple_New(2); - if (!tuple) + if (!tuple) { return NULL; + } PyObject *tmp = PyFloat_FromDouble(val1); if (!tmp) { diff --git a/src_c/joystick.c b/src_c/joystick.c index fe27a7e45b..42451f46ef 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -39,8 +39,9 @@ static PyObject * init(PyObject *self, PyObject *_null) { if (!SDL_WasInit(SDL_INIT_JOYSTICK)) { - if (SDL_InitSubSystem(SDL_INIT_JOYSTICK)) + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK)) { return RAISE(pgExc_SDLError, SDL_GetError()); + } PG_SetJoystickEventsEnabled(SDL_TRUE); } Py_RETURN_NONE; diff --git a/src_c/key.c b/src_c/key.c index 3de4387839..18e3b41a70 100644 --- a/src_c/key.c +++ b/src_c/key.c @@ -35,16 +35,19 @@ key_set_repeat(PyObject *self, PyObject *args) { int delay = 0, interval = 0; - if (!PyArg_ParseTuple(args, "|ii", &delay, &interval)) + if (!PyArg_ParseTuple(args, "|ii", &delay, &interval)) { return NULL; + } VIDEO_INIT_CHECK(); - if (delay && !interval) + if (delay && !interval) { interval = delay; + } - if (pg_EnableKeyRepeat(delay, interval) == -1) + if (pg_EnableKeyRepeat(delay, interval) == -1) { return NULL; + } Py_RETURN_NONE; } @@ -78,8 +81,9 @@ pg_scancodewrapper_subscript(pgScancodeWrapper *self, PyObject *item) { long index; PyObject *adjustedvalue, *ret; - if ((index = PyLong_AsLong(item)) == -1 && PyErr_Occurred()) + if ((index = PyLong_AsLong(item)) == -1 && PyErr_Occurred()) { return NULL; + } #if SDL_VERSION_ATLEAST(3, 0, 0) index = SDL_GetScancodeFromKey(index, NULL); #else @@ -180,11 +184,13 @@ key_get_pressed(PyObject *self, PyObject *_null) key_state = SDL_GetKeyboardState(&num_keys); - if (!key_state || !num_keys) + if (!key_state || !num_keys) { Py_RETURN_NONE; + } - if (!(key_tuple = PyTuple_New(num_keys))) + if (!(key_tuple = PyTuple_New(num_keys))) { return NULL; + } for (i = 0; i < num_keys; i++) { PyObject *key_elem; @@ -211,8 +217,9 @@ get_just_pressed(PyObject *self, PyObject *_null) PyObject *key_tuple = NULL; PyObject *ret_obj = NULL; - if (!(key_tuple = PyTuple_New(SDL_NUM_SCANCODES))) + if (!(key_tuple = PyTuple_New(SDL_NUM_SCANCODES))) { return NULL; + } int i; for (i = 0; i < SDL_NUM_SCANCODES; i++) { @@ -239,8 +246,9 @@ get_just_released(PyObject *self, PyObject *_null) PyObject *key_tuple = NULL; PyObject *ret_obj = NULL; - if (!(key_tuple = PyTuple_New(SDL_NUM_SCANCODES))) + if (!(key_tuple = PyTuple_New(SDL_NUM_SCANCODES))) { return NULL; + } int i; for (i = 0; i < SDL_NUM_SCANCODES; i++) { @@ -440,8 +448,9 @@ key_name(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"key", "use_compat", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|p", kwids, &key, - &use_compat)) + &use_compat)) { return NULL; + } if (use_compat) { /* Use our backcompat function, that has names hardcoded in pygame @@ -465,8 +474,9 @@ key_code(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"name", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwids, &name)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwids, &name)) { return NULL; + } /* in the future, this should be an error. For now it's a warning to not * break existing code */ @@ -499,8 +509,9 @@ key_set_mods(PyObject *self, PyObject *args) { int mods; - if (!PyArg_ParseTuple(args, "i", &mods)) + if (!PyArg_ParseTuple(args, "i", &mods)) { return NULL; + } VIDEO_INIT_CHECK(); @@ -570,8 +581,9 @@ key_set_text_input_rect(PyObject *self, PyObject *obj) Py_RETURN_NONE; } rect = pgRect_FromObject(obj, &temp); - if (!rect) + if (!rect) { return RAISE(PyExc_TypeError, "Invalid rect argument"); + } if (sdlRenderer != NULL) { SDL_Rect vprect, rect2; diff --git a/src_c/line.c b/src_c/line.c index 2b61906fbf..ff6171b4ad 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -29,8 +29,9 @@ pg_line_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { pgLineObject *self = (pgLineObject *)type->tp_alloc(type, 0); - if (self != NULL) + if (self != NULL) { memset(&self->line, 0, sizeof(pgLineBase)); + } return (PyObject *)self; } diff --git a/src_c/mask.c b/src_c/mask.c index a40212f18f..92c2cf9acd 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -169,8 +169,9 @@ mask_get_at(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *pos = NULL; static char *keywords[] = {"pos", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &pos)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &pos)) { return NULL; + } if (!pg_TwoIntsFromObj(pos, &x, &y)) { return RAISE(PyExc_TypeError, "pos must be two numbers"); @@ -196,8 +197,9 @@ mask_set_at(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"pos", "value", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", keywords, &pos, - &value)) + &value)) { return NULL; + } if (!pg_TwoIntsFromObj(pos, &x, &y)) { return RAISE(PyExc_TypeError, "pos must be two numbers"); @@ -231,8 +233,9 @@ mask_overlap(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"other", "offset", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", keywords, - &pgMask_Type, &maskobj, &offset)) + &pgMask_Type, &maskobj, &offset)) { return NULL; + } othermask = pgMask_AsBitmap(maskobj); @@ -560,8 +563,9 @@ mask_outline(PyObject *self, PyObject *args, PyObject *kwargs) break; } } - if (bitmask_getbit(m, x, y)) + if (bitmask_getbit(m, x, y)) { break; + } } /* covers the mask having zero pixels set or only the final pixel */ @@ -811,8 +815,9 @@ set_from_threshold(SDL_Surface *surf, PG_PixelFormat *surf_format, for (x = 0; x < surf->w; ++x, srcp += bpp) { PG_GetRGBA(bpp == 1 ? *srcp : *((Uint16 *)srcp), surf_format, surf_palette, &r, &g, &b, &a); - if (a > threshold) + if (a > threshold) { bitmask_setbit(bitmask, x, y); + } } srcp += src_skip; } @@ -836,8 +841,9 @@ set_from_threshold(SDL_Surface *surf, PG_PixelFormat *surf_format, x = 0; LOOP_UNROLLED4( { - if ((*srcp) > u_threshold) + if ((*srcp) > u_threshold) { bitmask_setbit(bitmask, x, y); + } srcp += bpp; x++; }, @@ -1130,8 +1136,9 @@ mask_from_threshold(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords( args, kwargs, "O!O|OO!i", keywords, &pgSurface_Type, &surfobj, &rgba_obj_color, &rgba_obj_threshold, &pgSurface_Type, &surfobj2, - &palette_colors)) + &palette_colors)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); if (surfobj2) { @@ -1856,8 +1863,9 @@ largest_connected_comp(bitmask_t *input, bitmask_t *output, int ccx, int ccy) /* write out the final image */ buf = image; - if (ccx >= 0) + if (ccx >= 0) { max = ufind[*(buf + ccy * w + ccx)]; + } for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { if (ufind[*buf] == max) { /* if the label is the max one */ @@ -1884,8 +1892,9 @@ mask_connected_component(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *pos = NULL; static char *keywords[] = {"pos", NULL}; - if (kwargs) + if (kwargs) { args_exist += PyDict_Size(kwargs); + } if (args_exist) { if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", keywords, &pos)) { diff --git a/src_c/math.c b/src_c/math.c index 24c04365ca..e53e14cd90 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -363,8 +363,9 @@ vector_elementwise(pgVector *vec, PyObject *args); static int RealNumber_Check(PyObject *obj) { - if (obj && PyNumber_Check(obj) && !PyComplex_Check(obj)) + if (obj && PyNumber_Check(obj) && !PyComplex_Check(obj)) { return 1; + } return 0; } @@ -381,8 +382,9 @@ PySequence_GetItem_AsDouble(PyObject *seq, Py_ssize_t index) } value = PyFloat_AsDouble(item); Py_DECREF(item); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return -1; + } return value; } @@ -503,8 +505,9 @@ _scalar_product(const double *coords1, const double *coords2, Py_ssize_t size) { Py_ssize_t i; double product = 0; - for (i = 0; i < size; ++i) + for (i = 0; i < size; ++i) { product += coords1[i] * coords2[i]; + } return product; } @@ -521,8 +524,9 @@ get_double_from_unicode_slice(PyObject *unicode_obj, Py_ssize_t idx1, } float_obj = PyFloat_FromString(slice); Py_DECREF(slice); - if (float_obj == NULL) + if (float_obj == NULL) { return 0; + } *val = PyFloat_AsDouble(float_obj); Py_DECREF(float_obj); return 1; @@ -679,39 +683,45 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) else if (op != (OP_MUL | OP_ARG_VECTOR) && op != (OP_MUL | OP_ARG_VECTOR | OP_ARG_REVERSE)) { ret = _vector_subtype_new(vec); - if (ret == NULL) + if (ret == NULL) { return NULL; + } } switch (op) { case OP_ADD | OP_ARG_VECTOR: case OP_ADD | OP_ARG_VECTOR | OP_ARG_REVERSE: case OP_ADD | OP_ARG_VECTOR | OP_INPLACE: - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = vec_coords[i] + other_coords[i]; + } break; case OP_SUB | OP_ARG_VECTOR: case OP_SUB | OP_ARG_VECTOR | OP_INPLACE: - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = vec_coords[i] - other_coords[i]; + } break; case OP_SUB | OP_ARG_VECTOR | OP_ARG_REVERSE: - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = other_coords[i] - vec_coords[i]; + } break; case OP_MUL | OP_ARG_VECTOR: case OP_MUL | OP_ARG_VECTOR | OP_ARG_REVERSE: tmp = 0.; - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { tmp += vec_coords[i] * other_coords[i]; + } ret = (pgVector *)PyFloat_FromDouble(tmp); break; case OP_MUL | OP_ARG_NUMBER: case OP_MUL | OP_ARG_NUMBER | OP_ARG_REVERSE: case OP_MUL | OP_ARG_NUMBER | OP_INPLACE: tmp = PyFloat_AsDouble(other); - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = vec_coords[i] * tmp; + } break; case OP_DIV | OP_ARG_NUMBER: case OP_DIV | OP_ARG_NUMBER | OP_INPLACE: @@ -722,8 +732,9 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) return NULL; } tmp = 1. / tmp; - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = vec_coords[i] * tmp; + } break; case OP_FLOOR_DIV | OP_ARG_NUMBER: case OP_FLOOR_DIV | OP_ARG_NUMBER | OP_INPLACE: @@ -734,8 +745,9 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) return NULL; } tmp = 1. / tmp; - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = floor(vec_coords[i] * tmp); + } break; default: Py_XDECREF(ret); @@ -857,11 +869,13 @@ vector_clamp_magnitude(pgVector *self, PyObject *const *args, Py_ssize_t nargs) pgVector *ret; ret = _vector_subtype_new(self); - if (ret == NULL) + if (ret == NULL) { return NULL; + } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = self->coords[i]; + } PyObject *ret_val = vector_clamp_magnitude_ip(ret, args, nargs); if (!ret_val) { @@ -928,8 +942,9 @@ vector_clamp_magnitude_ip(pgVector *self, PyObject *const *args, fraction = min_length / sqrt(old_length_sq); } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { self->coords[i] *= fraction; + } Py_RETURN_NONE; } @@ -982,8 +997,9 @@ vector_SetItem(pgVector *self, Py_ssize_t index, PyObject *value) } self->coords[index] = PyFloat_AsDouble(value); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return -1; + } return 0; } @@ -1013,19 +1029,24 @@ vector_GetSlice(pgVector *self, Py_ssize_t ilow, Py_ssize_t ihigh) Py_ssize_t i, len; /* make sure boundaries are sane */ - if (ilow < 0) + if (ilow < 0) { ilow = 0; - else if (ilow > self->dim) + } + else if (ilow > self->dim) { ilow = self->dim; - if (ihigh < ilow) + } + if (ihigh < ilow) { ihigh = ilow; - else if (ihigh > self->dim) + } + else if (ihigh > self->dim) { ihigh = self->dim; + } len = ihigh - ilow; slice = (PyListObject *)PyList_New(len); - if (slice == NULL) + if (slice == NULL) { return NULL; + } for (i = 0; i < len; i++) { PyObject *tmp = PyFloat_FromDouble(self->coords[ilow + i]); @@ -1050,14 +1071,18 @@ vector_SetSlice(pgVector *self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) return -1; } - if (ilow < 0) + if (ilow < 0) { ilow = 0; - else if (ilow > self->dim) + } + else if (ilow > self->dim) { ilow = self->dim; - if (ihigh < ilow) + } + if (ihigh < ilow) { ihigh = ilow; - else if (ihigh > self->dim) + } + else if (ihigh > self->dim) { ihigh = self->dim; + } len = ihigh - ilow; if (!PySequence_AsVectorCoords(v, new_coords, len)) { @@ -1089,10 +1114,12 @@ vector_subscript(pgVector *self, PyObject *key) Py_ssize_t i; if (PyIndex_Check(key)) { i = PyNumber_AsSsize_t(key, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) + if (i == -1 && PyErr_Occurred()) { return NULL; - if (i < 0) + } + if (i < 0) { i += self->dim; + } return vector_GetItem(self, i); } else if (PySlice_Check(key)) { @@ -1113,8 +1140,9 @@ vector_subscript(pgVector *self, PyObject *key) } else { result = PyList_New(slicelength); - if (!result) + if (!result) { return NULL; + } for (cur = start, i = 0; i < slicelength; cur += step, i++) { it = PyFloat_FromDouble(self->coords[cur]); @@ -1141,10 +1169,12 @@ vector_ass_subscript(pgVector *self, PyObject *key, PyObject *value) { if (PyIndex_Check(key)) { Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) + if (i == -1 && PyErr_Occurred()) { return -1; - if (i < 0) + } + if (i < 0) { i += self->dim; + } return vector_SetItem(self, i, value); } else if (PySlice_Check(key)) { @@ -1155,13 +1185,15 @@ vector_ass_subscript(pgVector *self, PyObject *key, PyObject *value) return -1; } - if (step == 1) + if (step == 1) { return vector_SetSlice(self, start, stop, value); + } /* Make sure s[5:2] = [..] inserts at the right place: before 5, not before 2. */ - if ((step < 0 && start < stop) || (step > 0 && start > stop)) + if ((step < 0 && start < stop) || (step > 0 && start > stop)) { stop = start; + } if (value == NULL) { /* delete slice not supported */ @@ -1174,8 +1206,9 @@ vector_ass_subscript(pgVector *self, PyObject *key, PyObject *value) double seqitems[VECTOR_MAX_SIZE]; Py_ssize_t cur, i; - if (!PySequence_AsVectorCoords(value, seqitems, slicelength)) + if (!PySequence_AsVectorCoords(value, seqitems, slicelength)) { return -1; + } for (cur = start, i = 0; i < slicelength; cur += step, i++) { self->coords[cur] = seqitems[i]; } @@ -1228,8 +1261,9 @@ vector_set_component(pgVector *self, PyObject *value, int component) } self->coords[component] = PyFloat_AsDouble(value); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return -1; + } return 0; } @@ -1287,10 +1321,12 @@ vector_richcompare(PyObject *o1, PyObject *o2, int op) other = o1; } if (!pgVectorCompatible_Check(other, vec->dim)) { - if (op == Py_EQ) + if (op == Py_EQ) { Py_RETURN_FALSE; - else if (op == Py_NE) + } + else if (op == Py_NE) { Py_RETURN_TRUE; + } else { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; @@ -1372,8 +1408,9 @@ vector_normalize_ip(pgVector *self, PyObject *_null) "Can't normalize Vector of length zero"); } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { self->coords[i] /= length; + } Py_RETURN_NONE; } @@ -1383,10 +1420,12 @@ vector_is_normalized(pgVector *self, PyObject *_null) { double length_squared = _scalar_product(self->coords, self->coords, self->dim); - if (fabs(length_squared - 1) < self->epsilon) + if (fabs(length_squared - 1) < self->epsilon) { Py_RETURN_TRUE; - else + } + else { Py_RETURN_FALSE; + } } static PyObject * @@ -1421,8 +1460,9 @@ vector_scale_to_length(pgVector *self, PyObject *length) } fraction = new_length / old_length; - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { self->coords[i] *= fraction; + } Py_RETURN_NONE; } @@ -1433,11 +1473,13 @@ _vector_move_towards_helper(Py_ssize_t dim, double *origin_coords, { Py_ssize_t i; double frac, dist, delta[VECTOR_MAX_SIZE]; - if (max_distance == 0) + if (max_distance == 0) { return; + } - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { delta[i] = target_coords[i] - origin_coords[i]; + } /* Get magnitude of Vector */ dist = sqrt(_scalar_product(delta, delta, dim)); @@ -1449,14 +1491,16 @@ _vector_move_towards_helper(Py_ssize_t dim, double *origin_coords, if (dist <= max_distance) { /* Return target Vector */ - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { origin_coords[i] = target_coords[i]; + } return; } frac = max_distance / dist; - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { origin_coords[i] += delta[i] * frac; + } } static PyObject * @@ -1468,19 +1512,22 @@ vector_move_towards(pgVector *self, PyObject *args) double max_distance; pgVector *ret; - if (!PyArg_ParseTuple(args, "Od:move_towards", &target, &max_distance)) + if (!PyArg_ParseTuple(args, "Od:move_towards", &target, &max_distance)) { return NULL; + } if (!pg_VectorCoordsFromObj(target, self->dim, target_coords)) { return RAISE(PyExc_TypeError, "Incompatible vector argument"); } ret = _vector_subtype_new(self); - if (ret == NULL) + if (ret == NULL) { return NULL; + } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = self->coords[i]; + } _vector_move_towards_helper(self->dim, ret->coords, target_coords, max_distance); @@ -1495,8 +1542,10 @@ vector_move_towards_ip(pgVector *self, PyObject *args) double target_coords[VECTOR_MAX_SIZE]; double max_distance; - if (!PyArg_ParseTuple(args, "Od:move_towards_ip", &target, &max_distance)) + if (!PyArg_ParseTuple(args, "Od:move_towards_ip", &target, + &max_distance)) { return NULL; + } if (!pg_VectorCoordsFromObj(target, self->dim, target_coords)) { return RAISE(PyExc_TypeError, "Incompatible vector argument"); @@ -1543,8 +1592,10 @@ vector_slerp(pgVector *self, PyObject *args) angle -= 2 * M_PI; t = -t; } - if (self->coords[0] * other_coords[1] < self->coords[1] * other_coords[0]) + if (self->coords[0] * other_coords[1] < + self->coords[1] * other_coords[0]) { angle *= -1; + } ret = _vector_subtype_new(self); if (ret == NULL) { @@ -1554,8 +1605,9 @@ vector_slerp(pgVector *self, PyObject *args) if ((fabs(angle) < self->epsilon) || (fabs(fabs(angle) - 2 * M_PI) < self->epsilon)) { /* approximate with lerp, because slerp diverges with 1/sin(angle) */ - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = self->coords[i] * (1 - t) + other_coords[i] * t; + } } /* special case angle==180 and angle==-180 */ else if (fabs(fabs(angle) - M_PI) < self->epsilon) { @@ -1599,8 +1651,9 @@ vector_lerp(pgVector *self, PyObject *args) if (ret == NULL) { return NULL; } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = self->coords[i] * (1 - t) + other_coords[i] * t; + } return (PyObject *)ret; } @@ -1636,8 +1689,9 @@ vector_smoothstep(pgVector *self, PyObject *args) if (ret == NULL) { return NULL; } - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = self->coords[i] * (1 - t) + other_coords[i] * t; + } return (PyObject *)ret; } @@ -1650,8 +1704,9 @@ _vector_reflect_helper(double *dst_coords, const double *src_coords, double norm_coords[VECTOR_MAX_SIZE]; /* normalize the normal */ - if (!PySequence_AsVectorCoords(normal, norm_coords, dim)) + if (!PySequence_AsVectorCoords(normal, norm_coords, dim)) { return 0; + } norm_length = _scalar_product(norm_coords, norm_coords, dim); @@ -1662,15 +1717,17 @@ _vector_reflect_helper(double *dst_coords, const double *src_coords, } if (norm_length != 1) { norm_length = sqrt(norm_length); - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { norm_coords[i] /= norm_length; + } } /* calculate the dot_product for the projection */ dot_product = _scalar_product(src_coords, norm_coords, dim); - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { dst_coords[i] = src_coords[i] - 2 * norm_coords[i] * dot_product; + } return 1; } @@ -1765,8 +1822,9 @@ static PyObject * vector_distance_to(pgVector *self, PyObject *other) { double distance_squared = _vector_distance_helper(self, other); - if (distance_squared < 0 && PyErr_Occurred()) + if (distance_squared < 0 && PyErr_Occurred()) { return NULL; + } return PyFloat_FromDouble(sqrt(distance_squared)); } @@ -1774,8 +1832,9 @@ static PyObject * vector_distance_squared_to(pgVector *self, PyObject *other) { double distance_squared = _vector_distance_helper(self, other); - if (distance_squared < 0 && PyErr_Occurred()) + if (distance_squared < 0 && PyErr_Occurred()) { return NULL; + } return PyFloat_FromDouble(distance_squared); } @@ -1824,8 +1883,9 @@ vector_repr(pgVector *self) "repr() for Vectors of higher dimensions are not implemented yet"); } - if (!_vector_check_snprintf_success(tmp, STRING_BUF_SIZE_REPR)) + if (!_vector_check_snprintf_success(tmp, STRING_BUF_SIZE_REPR)) { return NULL; + } return PyUnicode_FromString(buffer); } @@ -1854,8 +1914,9 @@ vector_str(pgVector *self) "repr() for Vectors of higher dimensions are not implemented yet"); } - if (!_vector_check_snprintf_success(tmp, STRING_BUF_SIZE_STR)) + if (!_vector_check_snprintf_success(tmp, STRING_BUF_SIZE_STR)) { return NULL; + } return PyUnicode_FromString(buffer); } @@ -1891,8 +1952,9 @@ vector_project_onto(pgVector *self, PyObject *other) factor = a_dot_b / b_dot_b; - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { ret->coords[i] = other_coords[i] * factor; + } return (PyObject *)ret; } @@ -1920,15 +1982,18 @@ vector_getAttr_swizzle(pgVector *self, PyObject *attr_name) return PyObject_GenericGetAttr((PyObject *)self, attr_name); } - if (len < 0) + if (len < 0) { goto swizzle_failed; + } coords = self->coords; attr_unicode = PyUnicode_FromObject(attr_name); - if (attr_unicode == NULL) + if (attr_unicode == NULL) { goto swizzle_failed; + } attr = PyUnicode_AsUTF8AndSize(attr_unicode, &len); - if (attr == NULL) + if (attr == NULL) { goto internal_error; + } /* If we are not a swizzle, go straight to GenericGetAttr. */ if ((attr[0] != 'x') && (attr[0] != 'y') && (attr[0] != 'z')) { goto swizzle_failed; @@ -1941,8 +2006,9 @@ vector_getAttr_swizzle(pgVector *self, PyObject *attr_name) /* More than 3, we return a tuple. */ res = (PyObject *)PyTuple_New(len); } - if (res == NULL) + if (res == NULL) { goto internal_error; + } for (i = 0; i < len; i++) { switch (attr[i]) { case 'x': @@ -1972,8 +2038,9 @@ vector_getAttr_swizzle(pgVector *self, PyObject *attr_name) ((pgVector *)res)->coords[i] = value; } else { - if (PyTuple_SetItem(res, i, PyFloat_FromDouble(value)) != 0) + if (PyTuple_SetItem(res, i, PyFloat_FromDouble(value)) != 0) { goto internal_error; + } } } /* swizzling succeeded! */ @@ -2002,17 +2069,20 @@ vector_setAttr_swizzle(pgVector *self, PyObject *attr_name, PyObject *val) int swizzle_err = SWIZZLE_ERR_NO_ERR; Py_ssize_t i; - if (len == 1) + if (len == 1) { return PyObject_GenericSetAttr((PyObject *)self, attr_name, val); + } /* if swizzling is enabled first try swizzle */ - for (i = 0; i < self->dim; ++i) + for (i = 0; i < self->dim; ++i) { entry_was_set[i] = 0; + } /* handle string and unicode uniformly */ attr_unicode = PyUnicode_FromObject(attr_name); - if (attr_unicode == NULL) + if (attr_unicode == NULL) { return -1; + } attr = PyUnicode_AsUTF8AndSize(attr_unicode, &len); if (attr == NULL) { @@ -2039,13 +2109,15 @@ vector_setAttr_swizzle(pgVector *self, PyObject *attr_name, PyObject *val) Py_DECREF(attr_unicode); return PyObject_GenericSetAttr((PyObject *)self, attr_name, val); } - if (entry_was_set[idx]) + if (entry_was_set[idx]) { swizzle_err = SWIZZLE_ERR_DOUBLE_IDX; + } if (swizzle_err == SWIZZLE_ERR_NO_ERR) { entry_was_set[idx] = 1; entry[idx] = PySequence_GetItem_AsDouble(val, i); - if (PyErr_Occurred()) + if (PyErr_Occurred()) { swizzle_err = SWIZZLE_ERR_EXTRACTION_ERR; + } } } Py_DECREF(attr_unicode); @@ -2053,9 +2125,11 @@ vector_setAttr_swizzle(pgVector *self, PyObject *attr_name, PyObject *val) switch (swizzle_err) { case SWIZZLE_ERR_NO_ERR: /* swizzle successful */ - for (i = 0; i < self->dim; ++i) - if (entry_was_set[i]) + for (i = 0; i < self->dim; ++i) { + if (entry_was_set[i]) { self->coords[i] = entry[i]; + } + } return 0; case SWIZZLE_ERR_DOUBLE_IDX: PyErr_SetString(PyExc_AttributeError, @@ -2161,8 +2235,9 @@ vector___round__(pgVector *self, PyObject *args) memcpy(ret->coords, self->coords, sizeof(ret->coords[0]) * ret->dim); if (o_ndigits == NULL || o_ndigits == Py_None) { - for (i = 0; i < ret->dim; ++i) + for (i = 0; i < ret->dim; ++i) { ret->coords[i] = round(ret->coords[i]); + } } else if (RealNumber_Check(o_ndigits)) { ndigits = PyNumber_AsSsize_t(o_ndigits, NULL); @@ -2170,9 +2245,10 @@ vector___round__(pgVector *self, PyObject *args) Py_DECREF(ret); return NULL; } - for (i = 0; i < ret->dim; ++i) + for (i = 0; i < ret->dim; ++i) { ret->coords[i] = round(ret->coords[i] * pow(10, (double)ndigits)) / pow(10, (double)ndigits); + } } else { PyErr_SetString(PyExc_TypeError, "Argument must be an integer"); @@ -2213,10 +2289,12 @@ _vector2_set(pgVector *self, PyObject *xOrSequence, PyObject *y) } } else if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 2)) + if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 2)) { return -1; - else + } + else { return 0; + } } else if (PyUnicode_Check(xOrSequence)) { char *delimiter[3] = {"Vector2(", ", ", ")"}; @@ -2267,8 +2345,9 @@ vector2_init(pgVector *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"x", "y", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:Vector2", kwlist, - &xOrSequence, &y)) + &xOrSequence, &y)) { return -1; + } return _vector2_set(self, xOrSequence, y); } @@ -2280,11 +2359,13 @@ vector2_update(pgVector *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"x", "y", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:Vector2", kwlist, - &xOrSequence, &y)) + &xOrSequence, &y)) { return NULL; + } - if (_vector2_set(self, xOrSequence, y) == 0) + if (_vector2_set(self, xOrSequence, y) == 0) { Py_RETURN_NONE; + } return NULL; } @@ -2294,8 +2375,9 @@ _vector2_rotate_helper(double *dst_coords, const double *src_coords, { /* make sure angle is in range [0, 2 PI) */ angle = fmod(angle, TWO_PI); - if (angle < 0) + if (angle < 0) { angle += TWO_PI; + } /* special-case rotation by 0, 90, 180 and 270 degrees */ if (fmod(angle + epsilon, M_PI_2) < 2 * epsilon) { @@ -2439,8 +2521,9 @@ static PyObject * vector2_cross(pgVector *self, PyObject *other) { double other_coords[2]; - if (self == (pgVector *)other) + if (self == (pgVector *)other) { return PyFloat_FromDouble(0.0); + } if (!pg_VectorCoordsFromObj(other, 2, other_coords)) { PyErr_SetString( @@ -2645,10 +2728,12 @@ _vector3_set(pgVector *self, PyObject *xOrSequence, PyObject *y, PyObject *z) } } else if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 3)) + if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 3)) { return -1; - else + } + else { return 0; + } } else if (PyUnicode_Check(xOrSequence)) { char *delimiter[4] = {"Vector3(", ", ", ", ", ")"}; @@ -2702,8 +2787,9 @@ vector3_init(pgVector *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"x", "y", "z", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO:Vector3", kwlist, - &xOrSequence, &y, &z)) + &xOrSequence, &y, &z)) { return -1; + } return _vector3_set(self, xOrSequence, y, z); } @@ -2715,11 +2801,13 @@ vector3_update(pgVector *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"x", "y", "z", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO:Vector3", kwlist, - &xOrSequence, &y, &z)) + &xOrSequence, &y, &z)) { return NULL; + } - if (_vector3_set(self, xOrSequence, y, z) == 0) + if (_vector3_set(self, xOrSequence, y, z) == 0) { Py_RETURN_NONE; + } return NULL; } @@ -2734,8 +2822,9 @@ _vector3_rotate_helper(double *dst_coords, const double *src_coords, /* make sure angle is in range [0, 2 PI) */ angle = fmod(angle, TWO_PI); - if (angle < 0) + if (angle < 0) { angle += TWO_PI; + } for (i = 0; i < 3; ++i) { axisLength2 += axis_coords[i] * axis_coords[i]; @@ -2751,8 +2840,9 @@ _vector3_rotate_helper(double *dst_coords, const double *src_coords, /* normalize the axis */ if (fabs(axisLength2 - 1) > epsilon) { normalizationFactor = 1. / sqrt(axisLength2); - for (i = 0; i < 3; ++i) + for (i = 0; i < 3; ++i) { axis[i] *= normalizationFactor; + } } /* special-case rotation by 0, 90, 180 and 270 degrees */ @@ -3522,8 +3612,9 @@ static PyObject * vectoriter_next(vectoriter *it) { assert(it != NULL); - if (it->vec == NULL) + if (it->vec == NULL) { return NULL; + } assert(pgVector_Check(it->vec)); if (it->it_index < it->vec->dim) { @@ -3578,8 +3669,9 @@ vector_iter(PyObject *vec) } it = PyObject_New(vectoriter, &pgVectorIter_Type); - if (it == NULL) + if (it == NULL) { return NULL; + } it->it_index = 0; Py_INCREF(vec); it->vec = (pgVector *)vec; @@ -3614,17 +3706,22 @@ vector_elementwiseproxy_richcompare(PyObject *o1, PyObject *o2, int op) vec = ((vector_elementwiseproxy *)o2)->vec; other = o1; /* flip op */ - if (op == Py_LT) + if (op == Py_LT) { op = Py_GE; - else if (op == Py_LE) + } + else if (op == Py_LE) { op = Py_GT; - else if (op == Py_GT) + } + else if (op == Py_GT) { op = Py_LE; - else if (op == Py_GE) + } + else if (op == Py_GE) { op = Py_LT; + } } - if (vector_elementwiseproxy_Check(other)) + if (vector_elementwiseproxy_Check(other)) { other = (PyObject *)((vector_elementwiseproxy *)other)->vec; + } dim = vec->dim; if (pgVectorCompatible_Check(other, dim)) { @@ -3783,20 +3880,23 @@ vector_elementwiseproxy_generic_math(PyObject *o1, PyObject *o2, int op) dim = vec->dim; - if (vector_elementwiseproxy_Check(other)) + if (vector_elementwiseproxy_Check(other)) { other = (PyObject *)((vector_elementwiseproxy *)other)->vec; + } if (pgVectorCompatible_Check(other, dim)) { op |= OP_ARG_VECTOR; - if (!PySequence_AsVectorCoords(other, other_coords, dim)) + if (!PySequence_AsVectorCoords(other, other_coords, dim)) { return NULL; + } } else if (RealNumber_Check(other)) { op |= OP_ARG_NUMBER; other_value = PyFloat_AsDouble(other); } - else + else { op |= OP_ARG_UNKNOWN; + } ret = _vector_subtype_new(vec); @@ -3814,17 +3914,20 @@ vector_elementwiseproxy_generic_math(PyObject *o1, PyObject *o2, int op) } break; case OP_SUB | OP_ARG_NUMBER: - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = vec->coords[i] - other_value; + } break; case OP_SUB | OP_ARG_NUMBER | OP_ARG_REVERSE: - for (i = 0; i < dim; i++) + for (i = 0; i < dim; i++) { ret->coords[i] = other_value - vec->coords[i]; + } break; case OP_MUL | OP_ARG_VECTOR: case OP_MUL | OP_ARG_VECTOR | OP_ARG_REVERSE: - for (i = 0; i < vec->dim; i++) + for (i = 0; i < vec->dim; i++) { ret->coords[i] = vec->coords[i] * other_coords[i]; + } break; case OP_DIV | OP_ARG_VECTOR: for (i = 0; i < vec->dim; i++) { @@ -4014,16 +4117,19 @@ vector_elementwiseproxy_pow(PyObject *baseObj, PyObject *expoObj, vec = ((vector_elementwiseproxy *)baseObj)->vec; dim = vec->dim; tmp = vec->coords; - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { bases[i] = PyFloat_FromDouble(tmp[i]); + } if (vector_elementwiseproxy_Check(expoObj)) { tmp = ((vector_elementwiseproxy *)expoObj)->vec->coords; - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { expos[i] = PyFloat_FromDouble(tmp[i]); + } } else if (pgVectorCompatible_Check(expoObj, dim)) { - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { expos[i] = PySequence_ITEM(expoObj, i); + } } else if (RealNumber_Check(expoObj)) { /* INCREF so that we can unify the clean up code */ @@ -4042,11 +4148,13 @@ vector_elementwiseproxy_pow(PyObject *baseObj, PyObject *expoObj, vec = ((vector_elementwiseproxy *)expoObj)->vec; dim = vec->dim; tmp = vec->coords; - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { expos[i] = PyFloat_FromDouble(tmp[i]); + } if (pgVectorCompatible_Check(baseObj, dim)) { - for (i = 0; i < dim; ++i) + for (i = 0; i < dim; ++i) { bases[i] = PySequence_ITEM(baseObj, i); + } } else if (RealNumber_Check(baseObj)) { /* INCREF so that we can unify the clean up code */ @@ -4067,8 +4175,9 @@ vector_elementwiseproxy_pow(PyObject *baseObj, PyObject *expoObj, } ret = (PyObject *)_vector_subtype_new(vec); - if (ret == NULL) + if (ret == NULL) { goto clean_up; + } /* there are many special cases so we let python do the work for us */ for (i = 0; i < dim; i++) { result = PyNumber_Power(bases[i], expos[i], Py_None); @@ -4164,8 +4273,9 @@ vector_elementwise(pgVector *vec, PyObject *_null) proxy = PyObject_New(vector_elementwiseproxy, &pgVectorElementwiseProxy_Type); - if (proxy == NULL) + if (proxy == NULL) { return NULL; + } Py_INCREF(vec); proxy->vec = (pgVector *)vec; @@ -4187,8 +4297,9 @@ invlerp(double a, double b, double v) static PyObject * math_clamp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - if (nargs != 3) + if (nargs != 3) { return RAISE(PyExc_TypeError, "clamp requires 3 arguments"); + } PyObject *value = args[0]; PyObject *min = args[1]; @@ -4209,8 +4320,9 @@ math_clamp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) Py_INCREF(min); return min; } - else if (result == -1) + else if (result == -1) { return NULL; + } // if value > max: return max result = PyObject_RichCompareBool(value, max, Py_GT); @@ -4218,8 +4330,9 @@ math_clamp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) Py_INCREF(max); return max; } - else if (result == -1) + else if (result == -1) { return NULL; + } Py_INCREF(value); return value; @@ -4234,9 +4347,10 @@ math_clamp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * math_invlerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - if (nargs != 3) + if (nargs != 3) { return RAISE(PyExc_TypeError, "invlerp requires exactly 3 numeric arguments"); + } double a = PyFloat_AsDouble(args[0]); RAISE_ARG_TYPE_ERROR("a") @@ -4245,14 +4359,16 @@ math_invlerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) double t = PyFloat_AsDouble(args[2]); RAISE_ARG_TYPE_ERROR("value") - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return RAISE(PyExc_ValueError, "invalid argument values passed to invlerp, numbers " "might be too small or too big"); + } - if (b - a == 0) + if (b - a == 0) { return RAISE(PyExc_ValueError, "the result of b - a needs to be different from zero"); + } return PyFloat_FromDouble(invlerp(a, b, t)); } @@ -4262,9 +4378,10 @@ math_invlerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * math_remap(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - if (nargs != 5) + if (nargs != 5) { return RAISE(PyExc_TypeError, "remap requires exactly 5 numeric arguments"); + } PyObject *i_min = args[0]; PyObject *i_max = args[1]; @@ -4283,10 +4400,11 @@ math_remap(PyObject *self, PyObject *const *args, Py_ssize_t nargs) double d = PyFloat_AsDouble(o_max); RAISE_ARG_TYPE_ERROR("o_max") - if (b - a == 0) + if (b - a == 0) { return RAISE( PyExc_ValueError, "the result of i_max - i_min needs to be different from zero"); + } return PyFloat_FromDouble(lerp(c, d, invlerp(a, b, v))); } @@ -4294,8 +4412,9 @@ math_remap(PyObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * math_lerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - if (nargs != 3 && nargs != 4) + if (nargs != 3 && nargs != 4) { return RAISE(PyExc_TypeError, "lerp requires 3 or 4 arguments"); + } PyObject *min = args[0]; PyObject *max = args[1]; @@ -4312,10 +4431,12 @@ math_lerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) ; // pass if do_clamp is false } else { - if (t < 0) + if (t < 0) { t = 0.0; - else if (t > 1) + } + else if (t > 1) { t = 1.0; + } } if (PyNumber_Check(min) && PyNumber_Check(max)) { @@ -4333,8 +4454,9 @@ math_lerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * math_smoothstep(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { - if (nargs != 3) + if (nargs != 3) { return RAISE(PyExc_TypeError, "smoothstep requires 3 arguments"); + } PyObject *min = args[0]; PyObject *max = args[1]; @@ -4464,14 +4586,18 @@ MODINIT_DEFINE(math) 0) || (PyModule_AddObject(module, "VectorIterator", (PyObject *)&pgVectorIter_Type) != 0)) { - if (!PyObject_HasAttrString(module, "Vector2")) + if (!PyObject_HasAttrString(module, "Vector2")) { Py_DECREF(&pgVector2_Type); - if (!PyObject_HasAttrString(module, "Vector3")) + } + if (!PyObject_HasAttrString(module, "Vector3")) { Py_DECREF(&pgVector3_Type); - if (!PyObject_HasAttrString(module, "VectorElementwiseProxy")) + } + if (!PyObject_HasAttrString(module, "VectorElementwiseProxy")) { Py_DECREF(&pgVectorElementwiseProxy_Type); - if (!PyObject_HasAttrString(module, "VectorIterator")) + } + if (!PyObject_HasAttrString(module, "VectorIterator")) { Py_DECREF(&pgVectorIter_Type); + } Py_DECREF(module); return NULL; } diff --git a/src_c/mixer.c b/src_c/mixer.c index 811cf13fb8..38672af019 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -289,8 +289,9 @@ static void endsound_callback(int channel) { if (channeldata) { - if (channeldata[channel].endevent && SDL_WasInit(SDL_INIT_VIDEO)) + if (channeldata[channel].endevent && SDL_WasInit(SDL_INIT_VIDEO)) { _pg_push_mixer_event(channeldata[channel].endevent, channel); + } if (channeldata[channel].queue) { PyGILState_STATE gstate = PyGILState_Ensure(); @@ -301,8 +302,9 @@ endsound_callback(int channel) channeldata[channel].queue = NULL; PyGILState_Release(gstate); channelnum = Mix_PlayChannelTimed(channel, sound, 0, -1); - if (channelnum != -1) + if (channelnum != -1) { Mix_GroupChannel(channelnum, (int)(intptr_t)sound); + } } else { PyGILState_STATE gstate = PyGILState_Ensure(); @@ -349,14 +351,18 @@ _init(int freq, int size, int channels, int chunk, char *devicename, channels = request_channels; } if (allowedchanges & SDL_AUDIO_ALLOW_CHANNELS_CHANGE) { - if (channels <= 1) + if (channels <= 1) { channels = 1; - else if (channels <= 3) + } + else if (channels <= 3) { channels = 2; - else if (channels <= 5) + } + else if (channels <= 5) { channels = 4; - else + } + else { channels = 6; + } } else { switch (channels) { @@ -438,8 +444,9 @@ _init(int freq, int size, int channels, int chunk, char *devicename, SDL_setenv("SDL_AUDIODRIVER", "directsound", 1); } - if (SDL_InitSubSystem(SDL_INIT_AUDIO)) + if (SDL_InitSubSystem(SDL_INIT_AUDIO)) { return RAISE(pgExc_SDLError, SDL_GetError()); + } if (Mix_OpenAudioDevice(freq, fmt, channels, chunk, devicename, allowedchanges) == -1) { @@ -568,11 +575,13 @@ pg_mixer_get_init(PyObject *self, PyObject *_null) int freq, channels, realform; Uint16 format; - if (!SDL_WasInit(SDL_INIT_AUDIO)) + if (!SDL_WasInit(SDL_INIT_AUDIO)) { Py_RETURN_NONE; + } - if (!Mix_QuerySpec(&freq, &format, &channels)) + if (!Mix_QuerySpec(&freq, &format, &channels)) { Py_RETURN_NONE; + } // create a signed or unsigned number of bits per sample realform = SDL_AUDIO_BITSIZE(format); @@ -610,8 +619,9 @@ pre_init(PyObject *self, PyObject *args, PyObject *keywds) if (!PyArg_ParseTupleAndKeywords( args, keywds, "|iiiizi", kwids, &request_frequency, &request_size, &request_channels, &request_chunksize, &request_devicename, - &request_allowedchanges)) + &request_allowedchanges)) { return NULL; + } if (!request_frequency) { request_frequency = PYGAME_MIXER_DEFAULT_FREQUENCY; } @@ -643,8 +653,9 @@ pgSound_Play(PyObject *self, PyObject *args, PyObject *kwargs) char *kwids[] = {"loops", "maxtime", "fade_ms", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iii", kwids, &loops, - &playtime, &fade_ms)) + &playtime, &fade_ms)) { return NULL; + } Py_BEGIN_ALLOW_THREADS; if (fade_ms > 0) { @@ -655,8 +666,9 @@ pgSound_Play(PyObject *self, PyObject *args, PyObject *kwargs) channelnum = Mix_PlayChannelTimed(-1, chunk, loops, playtime); } Py_END_ALLOW_THREADS; - if (channelnum == -1) + if (channelnum == -1) { Py_RETURN_NONE; + } Py_XDECREF(channeldata[channelnum].sound); Py_XDECREF(channeldata[channelnum].queue); @@ -693,8 +705,9 @@ snd_fadeout(PyObject *self, PyObject *args) CHECK_CHUNK_VALID(chunk, NULL); - if (!PyArg_ParseTuple(args, "i", &_time)) + if (!PyArg_ParseTuple(args, "i", &_time)) { return NULL; + } MIXER_INIT_CHECK(); @@ -726,8 +739,9 @@ snd_set_volume(PyObject *self, PyObject *args) CHECK_CHUNK_VALID(chunk, NULL); - if (!PyArg_ParseTuple(args, "f", &volume)) + if (!PyArg_ParseTuple(args, "f", &volume)) { return NULL; + } MIXER_INIT_CHECK(); @@ -761,13 +775,15 @@ snd_get_length(PyObject *self, PyObject *_null) MIXER_INIT_CHECK(); Mix_QuerySpec(&freq, &format, &channels); - if (format == AUDIO_S8 || format == AUDIO_U8) + if (format == AUDIO_S8 || format == AUDIO_U8) { mixerbytes = 1; + } else if (format == AUDIO_F32LSB || format == AUDIO_F32MSB) { mixerbytes = 4; } - else + else { mixerbytes = 2; + } numsamples = chunk->alen / mixerbytes / channels; return PyFloat_FromDouble((float)numsamples / (float)freq); @@ -1005,10 +1021,12 @@ sound_dealloc(pgSoundObject *self) Mix_FreeChunk(chunk); Py_END_ALLOW_THREADS; } - if (self->mem) + if (self->mem) { PyMem_Free(self->mem); - if (self->weakreflist) + } + if (self->weakreflist) { PyObject_ClearWeakRefs((PyObject *)self); + } Py_TYPE(self)->tp_free((PyObject *)self); } @@ -1038,8 +1056,9 @@ chan_play(PyObject *self, PyObject *args, PyObject *kwargs) char *kwids[] = {"Sound", "loops", "maxtime", "fade_ms", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|iii", kwids, &pgSound_Type, &sound, &loops, &playtime, - &fade_ms)) + &fade_ms)) { return NULL; + } chunk = pgSound_AsChunk(sound); CHECK_CHUNK_VALID(chunk, NULL); @@ -1051,8 +1070,9 @@ chan_play(PyObject *self, PyObject *args, PyObject *kwargs) else { channelnum = Mix_PlayChannelTimed(channelnum, chunk, loops, playtime); } - if (channelnum != -1) + if (channelnum != -1) { Mix_GroupChannel(channelnum, (int)(intptr_t)chunk); + } Py_END_ALLOW_THREADS; Py_XDECREF(channeldata[channelnum].sound); @@ -1090,8 +1110,9 @@ chan_queue(PyObject *self, PyObject *sound) { Py_BEGIN_ALLOW_THREADS; channelnum = Mix_PlayChannelTimed(channelnum, chunk, 0, -1); - if (channelnum != -1) + if (channelnum != -1) { Mix_GroupChannel(channelnum, (int)(intptr_t)chunk); + } Py_END_ALLOW_THREADS; channeldata[channelnum].sound = sound; @@ -1119,8 +1140,9 @@ chan_fadeout(PyObject *self, PyObject *args) { int channelnum = pgChannel_AsInt(self); int _time; - if (!PyArg_ParseTuple(args, "i", &_time)) + if (!PyArg_ParseTuple(args, "i", &_time)) { return NULL; + } MIXER_INIT_CHECK(); @@ -1174,8 +1196,9 @@ chan_set_source_location(PyObject *self, PyObject *args) float distance_f; PyThreadState *_save; - if (!PyArg_ParseTuple(args, "ff", &angle_f, &distance_f)) + if (!PyArg_ParseTuple(args, "ff", &angle_f, &distance_f)) { return NULL; + } angle = (Sint16)roundf(fmodf(angle_f, 360)); distance_f = roundf(distance_f); @@ -1203,8 +1226,9 @@ chan_set_volume(PyObject *self, PyObject *args) Uint8 left, right; PyThreadState *_save; - if (!PyArg_ParseTuple(args, "f|f", &volume, &stereovolume)) + if (!PyArg_ParseTuple(args, "f|f", &volume, &stereovolume)) { return NULL; + } MIXER_INIT_CHECK(); if ((stereovolume <= -1.10f) && (stereovolume >= -1.12f)) { @@ -1266,8 +1290,9 @@ chan_get_sound(PyObject *self, PyObject *_null) PyObject *sound; sound = channeldata[channelnum].sound; - if (!sound) + if (!sound) { Py_RETURN_NONE; + } Py_INCREF(sound); return sound; @@ -1280,8 +1305,9 @@ chan_get_queue(PyObject *self, PyObject *_null) PyObject *sound; sound = channeldata[channelnum].queue; - if (!sound) + if (!sound) { Py_RETURN_NONE; + } Py_INCREF(sound); return sound; @@ -1293,8 +1319,9 @@ chan_set_endevent(PyObject *self, PyObject *args) int channelnum = pgChannel_AsInt(self); int event = SDL_NOEVENT; - if (!PyArg_ParseTuple(args, "|i", &event)) + if (!PyArg_ParseTuple(args, "|i", &event)) { return NULL; + } channeldata[channelnum].endevent = event; Py_RETURN_NONE; @@ -1400,8 +1427,9 @@ static PyObject * set_num_channels(PyObject *self, PyObject *args) { int numchans, i; - if (!PyArg_ParseTuple(args, "i", &numchans)) + if (!PyArg_ParseTuple(args, "i", &numchans)) { return NULL; + } MIXER_INIT_CHECK(); if (numchans > numchanneldata) { @@ -1432,8 +1460,9 @@ set_reserved(PyObject *self, PyObject *args) { int numchans_requested; int numchans_reserved; - if (!PyArg_ParseTuple(args, "i", &numchans_requested)) + if (!PyArg_ParseTuple(args, "i", &numchans_requested)) { return NULL; + } MIXER_INIT_CHECK(); @@ -1444,8 +1473,9 @@ set_reserved(PyObject *self, PyObject *args) static PyObject * get_busy(PyObject *self, PyObject *_null) { - if (!SDL_WasInit(SDL_INIT_AUDIO)) + if (!SDL_WasInit(SDL_INIT_AUDIO)) { return PyBool_FromLong(0); + } return PyBool_FromLong(Mix_Playing(-1)); } @@ -1464,8 +1494,9 @@ mixer_find_channel(PyObject *self, PyObject *args, PyObject *kwargs) chan = Mix_GroupAvailable(-1); if (chan == -1) { - if (!force) + if (!force) { Py_RETURN_NONE; + } chan = Mix_GroupOldest(-1); } return pgChannel_New(chan); @@ -1526,8 +1557,9 @@ static PyObject * mixer_fadeout(PyObject *self, PyObject *args) { int _time; - if (!PyArg_ParseTuple(args, "i", &_time)) + if (!PyArg_ParseTuple(args, "i", &_time)) { return NULL; + } MIXER_INIT_CHECK(); @@ -1990,8 +2022,9 @@ pgSound_New(Mix_Chunk *chunk) { pgSoundObject *soundobj; - if (!chunk) + if (!chunk) { return RAISE(PyExc_RuntimeError, "unable to create sound."); + } soundobj = (pgSoundObject *)pgSound_Type.tp_new(&pgSound_Type, NULL, NULL); if (soundobj) { diff --git a/src_c/mouse.c b/src_c/mouse.c index 3f2cae3bd8..62d1ea6b77 100644 --- a/src_c/mouse.c +++ b/src_c/mouse.c @@ -35,8 +35,9 @@ mouse_set_pos(PyObject *self, PyObject *args) { int x, y; - if (!pg_TwoIntsFromObj(args, &x, &y)) + if (!pg_TwoIntsFromObj(args, &x, &y)) { return RAISE(PyExc_TypeError, "invalid position argument for set_pos"); + } VIDEO_INIT_CHECK(); @@ -77,8 +78,9 @@ mouse_get_pos(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"desktop", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|p", kwids, &desktop)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|p", kwids, &desktop)) { return NULL; + } VIDEO_INIT_CHECK(); if (desktop == 1) { @@ -109,23 +111,31 @@ mouse_get_pos(PyObject *self, PyObject *args, PyObject *kwargs) y -= vprect.y; #if SDL_VERSION_ATLEAST(3, 0, 0) - if (x < 0) + if (x < 0) { x = 0; - if (x >= vprect.w) + } + if (x >= vprect.w) { x = (float)vprect.w - 1; - if (y < 0) + } + if (y < 0) { y = 0; - if (y >= vprect.h) + } + if (y >= vprect.h) { y = (float)vprect.h - 1; + } #else - if (x < 0) + if (x < 0) { x = 0; - if (x >= vprect.w) + } + if (x >= vprect.w) { x = vprect.w - 1; - if (y < 0) + } + if (y < 0) { y = 0; - if (y >= vprect.h) + } + if (y >= vprect.h) { y = vprect.h - 1; + } #endif } } @@ -184,19 +194,22 @@ mouse_get_pressed(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwids[] = {"num_buttons", "desktop", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ip", kwids, &num_buttons, - &desktop)) + &desktop)) { return NULL; + } VIDEO_INIT_CHECK(); - if (num_buttons != 3 && num_buttons != 5) + if (num_buttons != 3 && num_buttons != 5) { return RAISE(PyExc_ValueError, "Number of buttons needs to be 3 or 5."); + } state = desktop ? SDL_GetGlobalMouseState(NULL, NULL) : SDL_GetMouseState(NULL, NULL); - if (!(tuple = PyTuple_New(num_buttons))) + if (!(tuple = PyTuple_New(num_buttons))) { return NULL; + } PyTuple_SET_ITEM(tuple, 0, PyBool_FromLong((state & SDL_BUTTON_LMASK) != 0)); @@ -222,8 +235,9 @@ mouse_get_just_pressed(PyObject *self, PyObject *_null) VIDEO_INIT_CHECK(); char *pressed_buttons = pgEvent_GetMouseButtonDownInfo(); - if (!(tuple = PyTuple_New(5))) + if (!(tuple = PyTuple_New(5))) { return NULL; + } for (int i = 0; i < 5; i++) { PyTuple_SET_ITEM(tuple, i, PyBool_FromLong(pressed_buttons[i])); @@ -239,8 +253,9 @@ mouse_get_just_released(PyObject *self, PyObject *_null) VIDEO_INIT_CHECK(); char *released_buttons = pgEvent_GetMouseButtonUpInfo(); - if (!(tuple = PyTuple_New(5))) + if (!(tuple = PyTuple_New(5))) { return NULL; + } for (int i = 0; i < 5; i++) { PyTuple_SET_ITEM(tuple, i, PyBool_FromLong(released_buttons[i])); @@ -256,8 +271,9 @@ mouse_set_visible(PyObject *self, PyObject *args) SDL_Window *win = NULL; SDL_WindowFlags window_flags = 0; - if (!PyArg_ParseTuple(args, "i", &toggle)) + if (!PyArg_ParseTuple(args, "i", &toggle)) { return NULL; + } VIDEO_INIT_CHECK(); win = pg_GetDefaultWindow(); @@ -359,23 +375,28 @@ _set_bitmap_cursor(int w, int h, int spotx, int spoty, PyObject *xormask, int xorsize, andsize, loop, val; SDL_Cursor *lastcursor, *cursor = NULL; - if (!PySequence_Check(xormask) || !PySequence_Check(andmask)) + if (!PySequence_Check(xormask) || !PySequence_Check(andmask)) { return RAISE(PyExc_TypeError, "xormask and andmask must be sequences"); + } - if (w % 8) + if (w % 8) { return RAISE(PyExc_ValueError, "Cursor width must be divisible by 8."); + } xorsize = (int)PySequence_Length(xormask); - if (xorsize < 0) + if (xorsize < 0) { return NULL; + } andsize = (int)PySequence_Length(andmask); - if (andsize < 0) + if (andsize < 0) { return NULL; + } - if (xorsize != w * h / 8 || andsize != w * h / 8) + if (xorsize != w * h / 8 || andsize != w * h / 8) { return RAISE(PyExc_ValueError, "bitmasks must be sized width*height/8"); + } #ifdef _MSC_VER /* Suppress false analyzer report */ @@ -393,11 +414,13 @@ _set_bitmap_cursor(int w, int h, int spotx, int spoty, PyObject *xormask, } for (loop = 0; loop < xorsize; ++loop) { - if (!pg_IntFromObjIndex(xormask, loop, &val)) + if (!pg_IntFromObjIndex(xormask, loop, &val)) { goto interror; + } xordata[loop] = (Uint8)val; - if (!pg_IntFromObjIndex(andmask, loop, &val)) + if (!pg_IntFromObjIndex(andmask, loop, &val)) { goto interror; + } anddata[loop] = (Uint8)val; } @@ -407,8 +430,9 @@ _set_bitmap_cursor(int w, int h, int spotx, int spoty, PyObject *xormask, xordata = NULL; anddata = NULL; - if (!cursor) + if (!cursor) { return RAISE(pgExc_SDLError, SDL_GetError()); + } lastcursor = SDL_GetCursor(); SDL_SetCursor(cursor); @@ -432,10 +456,12 @@ _set_bitmap_cursor(int w, int h, int spotx, int spoty, PyObject *xormask, Py_RETURN_NONE; interror: - if (xordata) + if (xordata) { free(xordata); - if (anddata) + } + if (anddata) { free(anddata); + } return RAISE(PyExc_TypeError, "Invalid number in mask array"); } @@ -472,8 +498,9 @@ _set_color_cursor(int spotx, int spoty, pgSurfaceObject *surfobj) surf = pgSurface_AsSurface(surfobj); cursor = SDL_CreateColorCursor(surf, spotx, spoty); - if (!cursor) + if (!cursor) { return RAISE(pgExc_SDLError, SDL_GetError()); + } lastcursor = SDL_GetCursor(); SDL_SetCursor(cursor); diff --git a/src_c/music.c b/src_c/music.c index 71bc776fb2..5cc41390bf 100644 --- a/src_c/music.c +++ b/src_c/music.c @@ -59,8 +59,9 @@ endmusic_callback(void) } if (queue_music) { - if (current_music) + if (current_music) { Mix_FreeMusic(current_music); + } current_music = queue_music; queue_music = NULL; Mix_HookMusicFinished(endmusic_callback); @@ -84,12 +85,14 @@ music_play(PyObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"loops", "start", "fade_ms", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "|ifi", kwids, &loops, - &startpos, &fade_ms)) + &startpos, &fade_ms)) { return NULL; + } MIXER_INIT_CHECK(); - if (!current_music) + if (!current_music) { return RAISE(pgExc_SDLError, "music not loaded"); + } Py_BEGIN_ALLOW_THREADS; Mix_HookMusicFinished(endmusic_callback); @@ -102,8 +105,9 @@ music_play(PyObject *self, PyObject *args, PyObject *keywds) val = Mix_FadeInMusicPos(current_music, loops, fade_ms, startpos); Mix_VolumeMusic(volume); Py_END_ALLOW_THREADS; - if (val == -1) + if (val == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -126,8 +130,9 @@ static PyObject * music_fadeout(PyObject *self, PyObject *args) { int _time; - if (!PyArg_ParseTuple(args, "i", &_time)) + if (!PyArg_ParseTuple(args, "i", &_time)) { return NULL; + } MIXER_INIT_CHECK(); @@ -201,8 +206,9 @@ music_set_volume(PyObject *self, PyObject *args) { float volume; - if (!PyArg_ParseTuple(args, "f", &volume)) + if (!PyArg_ParseTuple(args, "f", &volume)) { return NULL; + } MIXER_INIT_CHECK(); @@ -239,8 +245,9 @@ music_set_pos(PyObject *self, PyObject *arg) position_set = Mix_SetMusicPosition(pos); Py_END_ALLOW_THREADS; - if (position_set == -1) + if (position_set == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -259,8 +266,9 @@ music_get_pos(PyObject *self, PyObject *_null) } ticks = (long)(1000 * music_pos / denominator); - if (!Mix_PausedMusic()) + if (!Mix_PausedMusic()) { ticks += PG_GetTicks() - music_pos_time; + } return PyLong_FromUnsignedLongLong(ticks); } @@ -270,8 +278,9 @@ music_set_endevent(PyObject *self, PyObject *args) { int eventid = SDL_NOEVENT; - if (!PyArg_ParseTuple(args, "|i", &eventid)) + if (!PyArg_ParseTuple(args, "|i", &eventid)) { return NULL; + } endmusic_event = eventid; Py_RETURN_NONE; } @@ -415,14 +424,16 @@ music_load(PyObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"filename", "namehint", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|s", kwids, &obj, - &namehint)) + &namehint)) { return NULL; + } MIXER_INIT_CHECK(); new_music = _load_music(obj, namehint); - if (new_music == NULL) // meaning it has an error to return + if (new_music == NULL) { // meaning it has an error to return return NULL; + } Py_BEGIN_ALLOW_THREADS; if (current_music != NULL) { @@ -470,16 +481,18 @@ music_queue(PyObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"filename", "namehint", "loops", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|si", kwids, &obj, - &namehint, &loops)) + &namehint, &loops)) { return NULL; + } MIXER_INIT_CHECK(); queue_music_loops = loops; local_queue_music = _load_music(obj, namehint); - if (local_queue_music == NULL) // meaning it has an error to return + if (local_queue_music == NULL) { // meaning it has an error to return return NULL; + } Py_BEGIN_ALLOW_THREADS; /* Free any existing queued music. */ @@ -504,8 +517,9 @@ music_get_metadata(PyObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"filename", "namehint", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "|Os", kwids, &obj, - &namehint)) + &namehint)) { return NULL; + } MIXER_INIT_CHECK(); diff --git a/src_c/pixelarray_methods.c b/src_c/pixelarray_methods.c index 4651e910cb..6eb031d637 100644 --- a/src_c/pixelarray_methods.c +++ b/src_c/pixelarray_methods.c @@ -131,14 +131,16 @@ _make_surface(pgPixelArrayObject *array, PyObject *args) * create a new surface with the array dimensions */ if (!same_dims) { if (!(temp_surf = PG_CreateSurface((int)dim0, (int)dim1, - PG_SURF_FORMATENUM(surf)))) + PG_SURF_FORMATENUM(surf)))) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } /* Ensure the new surface has the same format as the original */ new_surf = PG_ConvertSurface(temp_surf, surf->format); - if (temp_surf != surf) + if (temp_surf != surf) { SDL_FreeSurface(temp_surf); + } if (!new_surf) { return RAISE(pgExc_SDLError, SDL_GetError()); @@ -151,8 +153,9 @@ _make_surface(pgPixelArrayObject *array, PyObject *args) } /* if the surf and array dims match just return a copy */ - if (same_dims) + if (same_dims) { return (PyObject *)new_surface; + } /* Acquire a temporary lock. */ if (SDL_MUSTLOCK(new_surf) == 0) { diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 627ca29497..75982bc8e5 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -508,8 +508,9 @@ array_to_surface(PyObject *self, PyObject *arg) return RAISE(PyExc_ValueError, "must be a valid 2d or 3d array\n"); } - if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) + if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) { return RAISE(PyExc_ValueError, "unsupported bit depth for surface"); + } stridex = view_p->strides[0]; stridey = view_p->strides[1]; diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index 27df1bc315..cc611f949f 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -1183,8 +1183,9 @@ RectExport_unionIp(RectObject *self, PyObject *const *args, Py_ssize_t nargs) InnerRect *argrect, temp; PrimitiveType x, y, w, h; - if (!(argrect = RectFromFastcallArgs(args, nargs, &temp))) + if (!(argrect = RectFromFastcallArgs(args, nargs, &temp))) { return RAISE(PyExc_TypeError, "Argument must be rect style object"); + } x = MIN(self->r.x, argrect->x); y = MIN(self->r.y, argrect->y); @@ -1783,8 +1784,9 @@ RectExport_collidedictall(RectObject *self, PyObject *args, PyObject *kwargs) } ret = PyList_New(0); - if (!ret) + if (!ret) { return NULL; + } /* If the calling rect has 0 width or height, it cannot collide with * anything, hence return an empty list directly. */ @@ -1934,8 +1936,9 @@ RectExport_clipline(RectObject *self, PyObject *const *args, Py_ssize_t nargs) PyObject *subtup1, *subtup2; subtup1 = TupleFromTwoPrimitives(x1, y1); - if (!subtup1) + if (!subtup1) { return NULL; + } subtup2 = TupleFromTwoPrimitives(x2, y2); if (!subtup2) { @@ -2012,22 +2015,28 @@ RectExport_clamp(RectObject *self, PyObject *const *args, Py_ssize_t nargs) if (self->r.w >= argrect->w) { x = argrect->x + argrect->w / 2 - self->r.w / 2; } - else if (self->r.x < argrect->x) + else if (self->r.x < argrect->x) { x = argrect->x; - else if (self->r.x + self->r.w > argrect->x + argrect->w) + } + else if (self->r.x + self->r.w > argrect->x + argrect->w) { x = argrect->x + argrect->w - self->r.w; - else + } + else { x = self->r.x; + } if (self->r.h >= argrect->h) { y = argrect->y + argrect->h / 2 - self->r.h / 2; } - else if (self->r.y < argrect->y) + else if (self->r.y < argrect->y) { y = argrect->y; - else if (self->r.y + self->r.h > argrect->y + argrect->h) + } + else if (self->r.y + self->r.h > argrect->y + argrect->h) { y = argrect->y + argrect->h - self->r.h; - else + } + else { y = self->r.y; + } return RectExport_subtypeNew4(Py_TYPE(self), x, y, self->r.w, self->r.h); } @@ -2069,22 +2078,28 @@ RectExport_clampIp(RectObject *self, PyObject *const *args, Py_ssize_t nargs) if (self->r.w >= argrect->w) { x = argrect->x + argrect->w / 2 - self->r.w / 2; } - else if (self->r.x < argrect->x) + else if (self->r.x < argrect->x) { x = argrect->x; - else if (self->r.x + self->r.w > argrect->x + argrect->w) + } + else if (self->r.x + self->r.w > argrect->x + argrect->w) { x = argrect->x + argrect->w - self->r.w; - else + } + else { x = self->r.x; + } if (self->r.h >= argrect->h) { y = argrect->y + argrect->h / 2 - self->r.h / 2; } - else if (self->r.y < argrect->y) + else if (self->r.y < argrect->y) { y = argrect->y; - else if (self->r.y + self->r.h > argrect->y + argrect->h) + } + else if (self->r.y + self->r.h > argrect->y + argrect->h) { y = argrect->y + argrect->h - self->r.h; - else + } + else { y = self->r.y; + } self->r.x = x; self->r.y = y; diff --git a/src_c/rotozoom.c b/src_c/rotozoom.c index 7b03652728..b888a84963 100644 --- a/src_c/rotozoom.c +++ b/src_c/rotozoom.c @@ -517,8 +517,9 @@ rotozoomSurface(SDL_Surface *src, double angle, double zoom, int smooth) /* * Sanity check */ - if (src == NULL) + if (src == NULL) { return (NULL); + } /* * Determine if source surface is 32bit or 8bit diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 172702ebb3..61e05b9428 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -191,8 +191,9 @@ pg_EncodeString(PyObject *obj, const char *encoding, const char *errors, } ret = _trydecode_pathlibobj(obj); - if (!ret) + if (!ret) { return NULL; + } if (PyUnicode_Check(ret)) { oencoded = PyUnicode_AsEncodedString(ret, encoding, errors); @@ -334,8 +335,9 @@ _pg_rw_size(SDL_RWops *context) Sint64 size; Sint64 retval = -1; - if (!helper->seek || !helper->tell) + if (!helper->seek || !helper->tell) { return retval; + } PyGILState_STATE state = PyGILState_Ensure(); @@ -408,8 +410,9 @@ _pg_rw_write(SDL_RWops *context, const void *ptr, size_t size, size_t num) PyObject *result; size_t retval; - if (!helper->write) + if (!helper->write) { return -1; + } PyGILState_STATE state = PyGILState_Ensure(); @@ -558,8 +561,9 @@ _pg_rw_seek(SDL_RWops *context, Sint64 offset, int whence) PyObject *result; Sint64 retval; - if (!helper->seek || !helper->tell) + if (!helper->seek || !helper->tell) { return -1; + } PyGILState_STATE state = PyGILState_Ensure(); @@ -584,8 +588,9 @@ _pg_rw_seek(SDL_RWops *context, Sint64 offset, int whence) } retval = PyLong_AsLongLong(result); - if (retval == -1 && PyErr_Occurred()) + if (retval == -1 && PyErr_Occurred()) { PyErr_Clear(); + } Py_DECREF(result); @@ -610,8 +615,9 @@ _pg_rw_read(SDL_RWops *context, void *ptr, size_t size, size_t maxnum) PyObject *result; Py_ssize_t retval; - if (!helper->read) + if (!helper->read) { return -1; + } PyGILState_STATE state = PyGILState_Ensure(); result = PyObject_CallFunction(helper->read, "K", @@ -712,21 +718,25 @@ _rwops_from_pystr(PyObject *obj, char **extptr) SDL_ClearError(); PyObject *cwd = NULL, *path = NULL, *isabs = NULL; - if (!os_module) + if (!os_module) { goto simple_case; + } cwd = PyObject_CallMethod(os_module, "getcwd", NULL); - if (!cwd) + if (!cwd) { goto simple_case; + } path = PyObject_GetAttrString(os_module, "path"); - if (!path) + if (!path) { goto simple_case; + } isabs = PyObject_CallMethod(path, "isabs", "O", obj); Py_DECREF(path); - if (!isabs || isabs == Py_True) + if (!isabs || isabs == Py_True) { goto simple_case; + } PyErr_Format(PyExc_FileNotFoundError, "No file '%S' found in working directory '%S'.", obj, cwd); @@ -751,19 +761,22 @@ pgRWops_FromObject(PyObject *obj, char **extptr) int retry = 0; again: rw = _rwops_from_pystr(obj, extptr); - if (retry) + if (retry) { Py_XDECREF(obj); + } if (!rw) { - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return NULL; + } } else { return rw; } fail: - if (retry) + if (retry) { return RAISE(PyExc_RuntimeError, "can't access resource on platform"); + } retry = 1; PyObject *name = PyObject_GetAttrString(obj, "name"); @@ -776,8 +789,9 @@ pgRWops_FromObject(PyObject *obj, char **extptr) #else SDL_RWops *rw = _rwops_from_pystr(obj, extptr); if (!rw) { - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return NULL; + } } else { return rw; @@ -868,8 +882,9 @@ MODINIT_DEFINE(rwobject) /* import os, don't sweat if it errors, it will be checked before use */ os_module = PyImport_ImportModule("os"); - if (os_module == NULL) + if (os_module == NULL) { PyErr_Clear(); + } return module; } diff --git a/src_c/scale_mmx32.c b/src_c/scale_mmx32.c index 7d1c62e7a0..bf14eddf26 100644 --- a/src_c/scale_mmx32.c +++ b/src_c/scale_mmx32.c @@ -226,8 +226,9 @@ filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); // clang-format off @@ -341,8 +342,9 @@ filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); // clang-format off @@ -429,16 +431,19 @@ filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } @@ -511,16 +516,19 @@ filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } diff --git a/src_c/scale_mmx64.c b/src_c/scale_mmx64.c index 8365d0c56f..13c196ea9f 100644 --- a/src_c/scale_mmx64.c +++ b/src_c/scale_mmx64.c @@ -231,8 +231,9 @@ filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); srcdiff64 = srcdiff; dstdiff64 = dstdiff; @@ -349,8 +350,9 @@ filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); srcdiff64 = srcdiff; dstdiff64 = dstdiff; @@ -438,16 +440,19 @@ filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } @@ -519,16 +524,19 @@ filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } diff --git a/src_c/scale_mmx64_msvc.c b/src_c/scale_mmx64_msvc.c index d37b41354c..3c776859fd 100644 --- a/src_c/scale_mmx64_msvc.c +++ b/src_c/scale_mmx64_msvc.c @@ -45,8 +45,9 @@ filter_shrink_Y_MMX(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); filter_shrink_Y_MMX_gcc(srcpix, dstpix, templine, width, srcpitch, @@ -64,8 +65,9 @@ filter_shrink_Y_SSE(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == 0) + if (templine == 0) { return; + } memset(templine, 0, dstpitch * 2); filter_shrink_Y_SSE_gcc(srcpix, dstpix, templine, width, srcpitch, @@ -86,16 +88,19 @@ filter_expand_X_MMX(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } @@ -117,16 +122,19 @@ filter_expand_X_SSE(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == 0 || xmult1 == 0) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } diff --git a/src_c/scrap.c b/src_c/scrap.c index eb1a95f4b5..43fd96b915 100644 --- a/src_c/scrap.c +++ b/src_c/scrap.c @@ -121,8 +121,9 @@ _scrap_init(PyObject *self, PyObject *args) * if (!SDL_GetVideoSurface()) * return RAISE(pgExc_SDLError, "No display mode is set"); */ - if (!pygame_scrap_init()) + if (!pygame_scrap_init()) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -175,8 +176,9 @@ _scrap_get_types(PyObject *self, PyObject *_null) list = PyList_New(0); types = pygame_scrap_get_types(); - if (!types) + if (!types) { return list; + } while (types[i] != NULL) { type = types[i]; tmp = PyUnicode_DecodeASCII(type, strlen(type), 0); @@ -209,10 +211,12 @@ _scrap_contains(PyObject *self, PyObject *args) return NULL; } - if (!PyArg_ParseTuple(args, "s", &type)) + if (!PyArg_ParseTuple(args, "s", &type)) { return NULL; - if (pygame_scrap_contains(type)) + } + if (pygame_scrap_contains(type)) { Py_RETURN_TRUE; + } Py_RETURN_FALSE; } @@ -236,8 +240,9 @@ _scrap_get_scrap(PyObject *self, PyObject *args) PYGAME_SCRAP_INIT_CHECK(); - if (!PyArg_ParseTuple(args, "s", &scrap_type)) + if (!PyArg_ParseTuple(args, "s", &scrap_type)) { return NULL; + } if (!pygame_scrap_lost()) { /* Still own the clipboard. */ @@ -283,8 +288,9 @@ _scrap_get_scrap(PyObject *self, PyObject *args) /* pygame_get_scrap() only returns NULL or !NULL, but won't set any * errors. */ scrap = pygame_scrap_get(scrap_type, &count); - if (!scrap) + if (!scrap) { Py_RETURN_NONE; + } retval = PyBytes_FromStringAndSize(scrap, count); #if defined(PYGAME_SCRAP_FREE_STRING) @@ -320,9 +326,10 @@ _scrap_put_scrap(PyObject *self, PyObject *args) } /* Set it in the clipboard. */ - if (!pygame_scrap_put(scrap_type, scraplen, scrap)) + if (!pygame_scrap_put(scrap_type, scraplen, scrap)) { return RAISE(pgExc_SDLError, "content could not be placed in clipboard."); + } /* Add or replace the set value. */ switch (_currentmode) { @@ -357,8 +364,9 @@ _scrap_lost_scrap(PyObject *self, PyObject *_null) return NULL; } - if (pygame_scrap_lost()) + if (pygame_scrap_lost()) { Py_RETURN_TRUE; + } Py_RETURN_FALSE; } @@ -377,11 +385,13 @@ _scrap_set_mode(PyObject *self, PyObject *args) return NULL; } - if (!PyArg_ParseTuple(args, "i", &_currentmode)) + if (!PyArg_ParseTuple(args, "i", &_currentmode)) { return NULL; + } - if (_currentmode != SCRAP_CLIPBOARD && _currentmode != SCRAP_SELECTION) + if (_currentmode != SCRAP_CLIPBOARD && _currentmode != SCRAP_SELECTION) { return RAISE(PyExc_ValueError, "invalid clipboard mode"); + } /* Force the clipboard, if not in a X11 environment. */ _currentmode = SCRAP_CLIPBOARD; diff --git a/src_c/scrap_win.c b/src_c/scrap_win.c index 188a1363c5..96391c3d97 100644 --- a/src_c/scrap_win.c +++ b/src_c/scrap_win.c @@ -52,16 +52,21 @@ _convert_format(char *type) static UINT _convert_internal_type(char *type) { - if (strcmp(type, PYGAME_SCRAP_TEXT) == 0) + if (strcmp(type, PYGAME_SCRAP_TEXT) == 0) { return CF_TEXT; - if (strcmp(type, "text/plain;charset=utf-8") == 0) + } + if (strcmp(type, "text/plain;charset=utf-8") == 0) { return CF_UNICODETEXT; - if (strcmp(type, "image/tiff") == 0) + } + if (strcmp(type, "image/tiff") == 0) { return CF_TIFF; - if (strcmp(type, PYGAME_SCRAP_BMP) == 0) + } + if (strcmp(type, PYGAME_SCRAP_BMP) == 0) { return CF_DIB; - if (strcmp(type, "audio/wav") == 0) + } + if (strcmp(type, "audio/wav") == 0) { return CF_WAVE; + } return -1; } @@ -105,8 +110,9 @@ _lookup_clipboard_format(UINT format, char *buf, int size) len = GetClipboardFormatName(format, buf, size); return len; } - if (len != 0) + if (len != 0) { memcpy(buf, cpy, len); + } return len; } @@ -124,8 +130,9 @@ _create_dib_buffer(char *data, size_t *count) LPBITMAPINFOHEADER bihdr; char *buf; - if (!data) + if (!data) { return NULL; + } bihdr = (LPBITMAPINFOHEADER)data; /* Create the BMP header. */ @@ -145,8 +152,9 @@ _create_dib_buffer(char *data, size_t *count) /* Copy both to the buffer. */ buf = malloc(sizeof(hdr) + (*count)); - if (!buf) + if (!buf) { return NULL; + } memcpy(buf, &hdr, sizeof(hdr)); memcpy(buf + sizeof(BITMAPFILEHEADER), data, *count); @@ -181,8 +189,9 @@ pygame_scrap_init(void) } #endif - if (retval) + if (retval) { _scrapinitialized = 1; + } _format_MIME_PLAIN = RegisterClipboardFormat(PYGAME_SCRAP_TEXT); return retval; @@ -211,24 +220,29 @@ pygame_scrap_put(char *type, Py_ssize_t srclen, char *src) } format = _convert_internal_type(type); - if (format == -1) + if (format == -1) { format = _convert_format(type); + } - if (!OpenClipboard(window_handle)) + if (!OpenClipboard(window_handle)) { return 0; /* Could not open the clipboard. */ + } - if (format == CF_DIB || format == CF_DIBV5) + if (format == CF_DIB || format == CF_DIBV5) { nulledlen -= sizeof(BITMAPFILEHEADER); /* We won't copy the header */ + } hMem = GlobalAlloc((GMEM_MOVEABLE | GMEM_DDESHARE), nulledlen); if (hMem) { char *dst = GlobalLock(hMem); if (dst) { memset(dst, 0, nulledlen); - if (format == CF_DIB || format == CF_DIBV5) + if (format == CF_DIB || format == CF_DIBV5) { memcpy(dst, src + sizeof(BITMAPFILEHEADER), nulledlen - 1); - else + } + else { memcpy(dst, src, srclen); + } } GlobalUnlock(hMem); @@ -260,11 +274,13 @@ pygame_scrap_get(char *type, size_t *count) return RAISE(pgExc_SDLError, "scrap system not initialized."); } - if (!pygame_scrap_lost()) + if (!pygame_scrap_lost()) { return PyBytes_AsString(PyDict_GetItemString(_clipdata, type)); + } - if (!OpenClipboard(window_handle)) + if (!OpenClipboard(window_handle)) { return NULL; + } if (!IsClipboardFormatAvailable(format)) { /* The format was not found - was it a mapped type? */ @@ -335,8 +351,9 @@ pygame_scrap_get_types(void) char tmp[100] = {'\0'}; int size = 0; - if (!OpenClipboard(window_handle)) + if (!OpenClipboard(window_handle)) { return NULL; + } size = CountClipboardFormats(); if (size == 0) { @@ -348,8 +365,9 @@ pygame_scrap_get_types(void) format = EnumClipboardFormats(format); if (format == 0) { /* Something wicked happened. */ - while (i > 0) + while (i > 0) { free(types[i]); + } free(types); CloseClipboard(); return NULL; @@ -357,8 +375,9 @@ pygame_scrap_get_types(void) /* No predefined name, get the (truncated) name. */ len = _lookup_clipboard_format(format, tmp, 100); - if (len == 0) + if (len == 0) { continue; + } count++; tmptypes = realloc(types, sizeof(char *) * (count + 1)); diff --git a/src_c/simd_transform_sse2.c b/src_c/simd_transform_sse2.c index 174ee09378..54176db107 100644 --- a/src_c/simd_transform_sse2.c +++ b/src_c/simd_transform_sse2.c @@ -289,8 +289,9 @@ filter_expand_X_SSE2(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == 0) + if (xidx0 == 0) { return; + } // This algorithm uses two multipliers, xm0 and xm1. Each multiplier // gets 32 bits of space, so this gives 64 bits per dstwidth. xmult_combined = (int *)malloc(dstwidth * factorwidth); diff --git a/src_c/surface.c b/src_c/surface.c index 9424452359..9dde1f92ff 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -368,13 +368,15 @@ surf_subtype_new(PyTypeObject *type, SDL_Surface *s, int owner) { pgSurfaceObject *self; - if (!s) + if (!s) { return RAISE(pgExc_SDLError, SDL_GetError()); + } self = (pgSurfaceObject *)pgSurface_Type.tp_new(type, NULL, NULL); - if (pgSurface_SetSurface(self, s, owner)) + if (pgSurface_SetSurface(self, s, owner)) { return NULL; + } return (PyObject *)self; } @@ -424,8 +426,9 @@ surface_cleanup(pgSurfaceObject *self) static void surface_dealloc(PyObject *self) { - if (((pgSurfaceObject *)self)->weakreflist) + if (((pgSurfaceObject *)self)->weakreflist) { PyObject_ClearWeakRefs(self); + } surface_cleanup((pgSurfaceObject *)self); Py_TYPE(self)->tp_free(self); } @@ -485,8 +488,9 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) char *kwids[] = {"size", "flags", "depth", "masks", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwids, &size, &flags, - &depth, &masks)) + &depth, &masks)) { return -1; + } if (PySequence_Check(size) && PySequence_Length(size) == 2) { if ((!pg_IntFromObjIndex(size, 0, &width)) || @@ -603,10 +607,12 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) } else { /* no depth or surface */ SDL_PixelFormat *pix; - if (depth && pgSurface_Check(depth)) + if (depth && pgSurface_Check(depth)) { pix = ((pgSurfaceObject *)depth)->surf->format; - else if (pg_GetDefaultWindowSurface()) + } + else if (pg_GetDefaultWindowSurface()) { pix = pgSurface_AsSurface(pg_GetDefaultWindowSurface())->format; + } else { pix = &default_format; #if SDL_VERSION_ATLEAST(3, 0, 0) @@ -725,8 +731,9 @@ surf_get_at(PyObject *self, PyObject *position) "position must be a sequence of two numbers"); } - if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) + if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) { return RAISE(PyExc_IndexError, "pixel index out of range"); + } PG_PixelFormat *format; SDL_Palette *palette; @@ -735,11 +742,13 @@ surf_get_at(PyObject *self, PyObject *position) } int bpp = PG_FORMAT_BytesPerPixel(format); - if (bpp < 1 || bpp > 4) + if (bpp < 1 || bpp > 4) { return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); + } - if (!pgSurface_Lock((pgSurfaceObject *)self)) + if (!pgSurface_Lock((pgSurfaceObject *)self)) { return NULL; + } pixels = (Uint8 *)surf->pixels; @@ -769,8 +778,9 @@ surf_get_at(PyObject *self, PyObject *position) rgba + 3); break; } - if (!pgSurface_Unlock((pgSurfaceObject *)self)) + if (!pgSurface_Unlock((pgSurfaceObject *)self)) { return NULL; + } return pgColor_New(rgba); } @@ -805,8 +815,9 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } int bpp = PG_FORMAT_BytesPerPixel(format); - if (bpp < 1 || bpp > 4) + if (bpp < 1 || bpp > 4) { return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); + } SDL_Rect clip_rect; if (!PG_GetSurfaceClipRect(surf, &clip_rect)) { @@ -823,8 +834,9 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) return NULL; } - if (!pgSurface_Lock((pgSurfaceObject *)self)) + if (!pgSurface_Lock((pgSurfaceObject *)self)) { return NULL; + } pixels = (Uint8 *)surf->pixels; switch (bpp) { @@ -859,8 +871,9 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs) break; } - if (!pgSurface_Unlock((pgSurfaceObject *)self)) + if (!pgSurface_Unlock((pgSurfaceObject *)self)) { return NULL; + } Py_RETURN_NONE; } @@ -881,16 +894,19 @@ surf_get_at_mapped(PyObject *self, PyObject *position) "position must be a sequence of two numbers"); } - if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) + if (x < 0 || x >= surf->w || y < 0 || y >= surf->h) { return RAISE(PyExc_IndexError, "pixel index out of range"); + } int bpp = PG_SURF_BytesPerPixel(surf); - if (bpp < 1 || bpp > 4) + if (bpp < 1 || bpp > 4) { return RAISE(PyExc_RuntimeError, "invalid color depth for surface"); + } - if (!pgSurface_Lock((pgSurfaceObject *)self)) + if (!pgSurface_Lock((pgSurfaceObject *)self)) { return NULL; + } pixels = (Uint8 *)surf->pixels; @@ -913,8 +929,9 @@ surf_get_at_mapped(PyObject *self, PyObject *position) color = *((Uint32 *)(pixels + y * surf->pitch) + x); break; } - if (!pgSurface_Unlock((pgSurfaceObject *)self)) + if (!pgSurface_Unlock((pgSurfaceObject *)self)) { return NULL; + } return PyLong_FromLong((long)color); } @@ -926,8 +943,9 @@ surf_map_rgb(PyObject *self, PyObject *args) Uint8 rgba[4]; int color; - if (!pg_RGBAFromObjEx(args, rgba, PG_COLOR_HANDLE_ALL)) + if (!pg_RGBAFromObjEx(args, rgba, PG_COLOR_HANDLE_ALL)) { return NULL; /* Exception already set for us */ + } SURF_INIT_CHECK(surf) @@ -961,8 +979,9 @@ surf_unmap_rgb(PyObject *self, PyObject *arg) return RAISE(pgExc_SDLError, SDL_GetError()); } - if (SDL_ISPIXELFORMAT_ALPHA(format->format)) + if (SDL_ISPIXELFORMAT_ALPHA(format->format)) { PG_GetRGBA(col, format, palette, rgba, rgba + 1, rgba + 2, rgba + 3); + } else { PG_GetRGB(col, format, palette, rgba, rgba + 1, rgba + 2); rgba[3] = 255; @@ -975,8 +994,9 @@ static PyObject * surf_lock(PyObject *self, PyObject *_null) { SURF_INIT_CHECK(pgSurface_AsSurface(self)) - if (!pgSurface_Lock((pgSurfaceObject *)self)) + if (!pgSurface_Lock((pgSurfaceObject *)self)) { return NULL; + } Py_RETURN_NONE; } @@ -1004,8 +1024,9 @@ surf_get_locked(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - if (surf->locklist && PyList_Size(surf->locklist) > 0) + if (surf->locklist && PyList_Size(surf->locklist) > 0) { Py_RETURN_TRUE; + } Py_RETURN_FALSE; } @@ -1017,13 +1038,15 @@ surf_get_locks(PyObject *self, PyObject *_null) int weakref_getref_result; PyObject *tuple, *tmp; SURF_INIT_CHECK(pgSurface_AsSurface(self)) - if (!surf->locklist) + if (!surf->locklist) { return PyTuple_New(0); + } len = PyList_Size(surf->locklist); tuple = PyTuple_New(len); - if (!tuple) + if (!tuple) { return NULL; + } for (i = 0; i < len; i++) { weakref_getref_result = @@ -1056,12 +1079,14 @@ surf_get_palette(PyObject *self, PyObject *_null) pal = PG_GetSurfacePalette(surf); - if (!pal) + if (!pal) { return RAISE(pgExc_SDLError, "Surface has no palette to get\n"); + } list = PyTuple_New(pal->ncolors); - if (!list) + if (!list) { return NULL; + } for (i = 0; i < pal->ncolors; i++) { c = &pal->colors[i]; @@ -1089,16 +1114,19 @@ surf_get_palette_at(PyObject *self, PyObject *args) int _index; Uint8 rgba[4]; - if (!PyArg_ParseTuple(args, "i", &_index)) + if (!PyArg_ParseTuple(args, "i", &_index)) { return NULL; + } SURF_INIT_CHECK(surf) pal = PG_GetSurfacePalette(surf); - if (!pal) + if (!pal) { return RAISE(pgExc_SDLError, "Surface has no palette to set\n"); - if (_index >= pal->ncolors || _index < 0) + } + if (_index >= pal->ncolors || _index < 0) { return RAISE(PyExc_IndexError, "index out of bounds"); + } c = &pal->colors[_index]; rgba[0] = c->r; @@ -1129,16 +1157,19 @@ surf_set_palette(PyObject *self, PyObject *seq) SURF_INIT_CHECK(surf) - if (!PySequence_Check(seq)) + if (!PySequence_Check(seq)) { return RAISE(PyExc_ValueError, "Argument must be a sequence type"); + } pal = PG_GetSurfacePalette(surf); - if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) + if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { return RAISE(pgExc_SDLError, "Surface colors are not indexed\n"); + } - if (!pal) + if (!pal) { return RAISE(pgExc_SDLError, "Surface is not palettitized\n"); + } old_colors = pal->colors; len = (int)MIN(pal->ncolors, PySequence_Length(seq)); @@ -1166,8 +1197,9 @@ surf_set_palette(PyObject *self, PyObject *seq) } ecode = SDL_SetPaletteColors(pal, colors, 0, len); - if (ecode != 0) + if (ecode != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -1181,16 +1213,18 @@ surf_set_palette_at(PyObject *self, PyObject *args) PyObject *color_obj; Uint8 rgba[4]; - if (!PyArg_ParseTuple(args, "iO", &_index, &color_obj)) + if (!PyArg_ParseTuple(args, "iO", &_index, &color_obj)) { return NULL; + } SURF_INIT_CHECK(surf) if (!pg_RGBAFromObjEx(color_obj, rgba, PG_COLOR_HANDLE_SIMPLE)) { return NULL; } - if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) + if (!SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { return RAISE(pgExc_SDLError, "Surface colors are not indexed\n"); + } pal = PG_GetSurfacePalette(surf); @@ -1207,8 +1241,9 @@ surf_set_palette_at(PyObject *self, PyObject *args) color.b = rgba[2]; color.a = pal->colors[_index].a; /* May be a colorkey color. */ - if (SDL_SetPaletteColors(pal, &color, _index, 1) != 0) + if (SDL_SetPaletteColors(pal, &color, _index, 1) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -1222,8 +1257,9 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args) int result; int hascolor = SDL_FALSE; - if (!PyArg_ParseTuple(args, "|Oi", &rgba_obj, &flags)) + if (!PyArg_ParseTuple(args, "|Oi", &rgba_obj, &flags)) { return NULL; + } SURF_INIT_CHECK(surf) @@ -1252,8 +1288,9 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args) } pgSurface_Unprep(self); - if (result == -1) + if (result == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -1279,10 +1316,12 @@ surf_get_colorkey(pgSurfaceObject *self, PyObject *_null) return RAISE(pgExc_SDLError, SDL_GetError()); } - if (SDL_ISPIXELFORMAT_ALPHA(format->format)) + if (SDL_ISPIXELFORMAT_ALPHA(format->format)) { PG_GetRGBA(mapped_color, format, palette, &r, &g, &b, &a); - else + } + else { PG_GetRGB(mapped_color, format, palette, &r, &g, &b); + } return Py_BuildValue("(bbbb)", r, g, b, a); } @@ -1298,8 +1337,9 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) SDL_Rect sdlrect; SDL_Surface *surface; - if (!PyArg_ParseTuple(args, "|Oi", &alpha_obj, &flags)) + if (!PyArg_ParseTuple(args, "|Oi", &alpha_obj, &flags)) { return NULL; + } SURF_INIT_CHECK(surf) if (alpha_obj && alpha_obj != Py_None) { @@ -1310,28 +1350,35 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) return RAISE(PyExc_TypeError, "invalid alpha argument"); } } - else + else { return RAISE(PyExc_TypeError, "invalid alpha argument"); + } - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND) != 0) + if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } else { - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) + if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } - if (alphaval > 255) + if (alphaval > 255) { alpha = 255; - else if (alphaval < 0) + } + else if (alphaval < 0) { alpha = 0; - else + } + else { alpha = (Uint8)alphaval; + } if (alpha == 255 && (PG_SURF_BytesPerPixel(surf) == 1)) { /* Can't blend with a surface alpha of 255 and 8bit surfaces */ - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) + if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } pgSurface_Prep(self); result = @@ -1351,12 +1398,14 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) SDL_FreeSurface(surface); } /* HACK HACK HACK */ - if (result == 0) + if (result == 0) { result = SDL_SetSurfaceAlphaMod(surf, alpha); + } pgSurface_Unprep(self); - if (result == -1) + if (result == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } Py_RETURN_NONE; } @@ -1370,14 +1419,17 @@ surf_get_alpha(pgSurfaceObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) + if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } - if (mode != SDL_BLENDMODE_BLEND) + if (mode != SDL_BLENDMODE_BLEND) { Py_RETURN_NONE; + } - if (SDL_GetSurfaceAlphaMod(surf, &alpha) != 0) + if (SDL_GetSurfaceAlphaMod(surf, &alpha) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyLong_FromLong(alpha); } @@ -1390,8 +1442,9 @@ surf_get_blendmode(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) + if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return PyLong_FromLong((long)mode); } @@ -1409,8 +1462,9 @@ surf_copy(pgSurfaceObject *self, PyObject *_null) pgSurface_Unprep(self); final = surf_subtype_new(Py_TYPE(self), newsurf, 1); - if (!final) + if (!final) { SDL_FreeSurface(newsurf); + } return final; } @@ -1428,13 +1482,15 @@ surf_convert(pgSurfaceObject *self, PyObject *args) Uint8 key_r, key_g, key_b, key_a = 255; int has_colorkey = SDL_FALSE; - if (!PyArg_ParseTuple(args, "|Oi", &argobject, &flags)) + if (!PyArg_ParseTuple(args, "|Oi", &argobject, &flags)) { return NULL; + } - if (!argobject && !SDL_WasInit(SDL_INIT_VIDEO)) + if (!argobject && !SDL_WasInit(SDL_INIT_VIDEO)) { return RAISE(pgExc_SDLError, "cannot convert without format " "when pygame.display is not initialized"); + } SURF_INIT_CHECK(surf) @@ -1442,11 +1498,13 @@ surf_convert(pgSurfaceObject *self, PyObject *args) if ((has_colorkey = SDL_HasColorKey(surf))) { SDL_GetColorKey(surf, &colorkey); - if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) + if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) { SDL_GetRGBA(colorkey, surf->format, &key_r, &key_g, &key_b, &key_a); - else + } + else { SDL_GetRGB(colorkey, surf->format, &key_r, &key_g, &key_b); + } } if (argobject) { @@ -1538,9 +1596,11 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } mask = format.Rmask | format.Gmask | format.Bmask | format.Amask; - for (bpp = 0; bpp < 32; ++bpp) - if (!(mask >> bpp)) + for (bpp = 0; bpp < 32; ++bpp) { + if (!(mask >> bpp)) { break; + } + } } else { pgSurface_Unprep(self); @@ -1555,7 +1615,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) format.BitsPerPixel = (Uint8)bpp; format.BytesPerPixel = (bpp + 7) / 8; #endif - if (PG_FORMAT_BitsPerPixel((&format)) > 8) + if (PG_FORMAT_BitsPerPixel((&format)) > 8) { /* Allow a 8 bit source surface with an empty palette to be * converted to a format without a palette (pygame-ce issue * #146). If the target format has a non-NULL palette pointer @@ -1563,6 +1623,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) * empty-- that at least one entry is not black. */ format.palette = NULL; + } if (SDL_ISPIXELFORMAT_INDEXED(SDL_MasksToPixelFormatEnum( PG_FORMAT_BitsPerPixel((&format)), format.Rmask, format.Gmask, format.Bmask, format.Amask))) { @@ -1585,8 +1646,9 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } else { newsurf = pg_DisplayFormat(surf); - if (newsurf) + if (newsurf) { SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE); + } } if (newsurf == NULL) { @@ -1605,8 +1667,9 @@ surf_convert(pgSurfaceObject *self, PyObject *args) pgSurface_Unprep(self); final = surf_subtype_new(Py_TYPE(self), newsurf, 1); - if (!final) + if (!final) { SDL_FreeSurface(newsurf); + } return final; } @@ -1674,12 +1737,14 @@ surf_convert_alpha(pgSurfaceObject *self, PyObject *args) SURF_INIT_CHECK(surf) - if (!SDL_WasInit(SDL_INIT_VIDEO)) + if (!SDL_WasInit(SDL_INIT_VIDEO)) { return RAISE(pgExc_SDLError, "cannot convert without pygame.display initialized"); + } - if (!PyArg_ParseTuple(args, "|O!", &pgSurface_Type, &srcsurf)) + if (!PyArg_ParseTuple(args, "|O!", &pgSurface_Type, &srcsurf)) { return NULL; + } if (srcsurf != NULL) { if (PyErr_WarnEx(PyExc_DeprecationWarning, @@ -1690,12 +1755,14 @@ surf_convert_alpha(pgSurfaceObject *self, PyObject *args) } newsurf = pg_DisplayFormatAlpha(surf); - if (newsurf) + if (newsurf) { SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_BLEND); + } final = surf_subtype_new(Py_TYPE(self), newsurf, 1); - if (!final) + if (!final) { SDL_FreeSurface(newsurf); + } return final; } @@ -1716,8 +1783,9 @@ surf_set_clip(PyObject *self, PyObject *args) } else { rect = pgRect_FromObject(args, &temp); - if (!rect) + if (!rect) { return RAISE(PyExc_ValueError, "invalid rectstyle object"); + } sdlrect.x = rect->x; sdlrect.y = rect->y; sdlrect.h = rect->h; @@ -1765,8 +1833,9 @@ surf_fill(pgSurfaceObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"color", "rect", "special_flags", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|Oi", kwids, &rgba_obj, - &r, &blendargs)) + &r, &blendargs)) { return NULL; + } SURF_INIT_CHECK(surf) if (!pg_MappedColorFromObj(rgba_obj, surf, &color, PG_COLOR_HANDLE_ALL)) { @@ -1779,8 +1848,9 @@ surf_fill(pgSurfaceObject *self, PyObject *args, PyObject *keywds) temp.w = surf->w; temp.h = surf->h; } - else if (!(rect = pgRect_FromObject(r, &temp))) + else if (!(rect = pgRect_FromObject(r, &temp))) { return RAISE(PyExc_ValueError, "invalid rectstyle object"); + } /* we need a fresh copy so our Rect values don't get munged */ if (rect != &temp) { @@ -1811,8 +1881,9 @@ surf_fill(pgSurfaceObject *self, PyObject *args, PyObject *keywds) pgSurface_Unlock((pgSurfaceObject *)self); pgSurface_Unprep(self); } - if (result == -1) + if (result == -1) { return RAISE(pgExc_SDLError, SDL_GetError()); + } return pgRect_New(&sdlrect); } @@ -1832,8 +1903,9 @@ surf_blit(pgSurfaceObject *self, PyObject *args, PyObject *keywds) static char *kwids[] = {"source", "dest", "area", "special_flags", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "O!|OOi", kwids, &pgSurface_Type, &srcobject, &argpos, - &argrect, &blend_flags)) + &argrect, &blend_flags)) { return NULL; + } src = pgSurface_AsSurface(srcobject); SURF_INIT_CHECK(src) @@ -1851,12 +1923,14 @@ surf_blit(pgSurfaceObject *self, PyObject *args, PyObject *keywds) dx = sx; dy = sy; } - else + else { return RAISE(PyExc_TypeError, "invalid destination position for blit"); + } if (argrect && argrect != Py_None) { - if (!(src_rect = pgRect_FromObject(argrect, &temp))) + if (!(src_rect = pgRect_FromObject(argrect, &temp))) { return RAISE(PyExc_TypeError, "Invalid rectstyle argument"); + } } else { temp.x = temp.y = 0; @@ -1870,14 +1944,16 @@ surf_blit(pgSurfaceObject *self, PyObject *args, PyObject *keywds) dest_rect.w = src_rect->w; dest_rect.h = src_rect->h; - if (!blend_flags) + if (!blend_flags) { blend_flags = 0; + } result = pgSurface_Blit(self, srcobject, &dest_rect, src_rect, blend_flags); - if (result != 0) + if (result != 0) { return NULL; + } return pgRect_New(&dest_rect); } @@ -1919,8 +1995,9 @@ surf_blits(pgSurfaceObject *self, PyObject *args, PyObject *keywds) SURF_INIT_CHECK(dest) if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|i", kwids, &blitsequence, - &doreturn)) + &doreturn)) { return NULL; + } if (!PyIter_Check(blitsequence) && !(issequence = PySequence_Check(blitsequence))) { @@ -1944,8 +2021,9 @@ surf_blits(pgSurfaceObject *self, PyObject *args, PyObject *keywds) else { ret = PyList_New(0); } - if (!ret) + if (!ret) { return NULL; + } } iterator = PyObject_GetIter(blitsequence); @@ -2603,28 +2681,37 @@ surf_get_flags(PyObject *self, PyObject *_null) } } sdl_flags = surf->flags; - if ((is_alpha = _PgSurface_SrcAlpha(surf)) == -1) + if ((is_alpha = _PgSurface_SrcAlpha(surf)) == -1) { return NULL; + } if (is_alpha) { flags |= PGS_SRCALPHA; } - if (SDL_HasColorKey(surf)) + if (SDL_HasColorKey(surf)) { flags |= PGS_SRCCOLORKEY; - if (sdl_flags & SDL_PREALLOC) + } + if (sdl_flags & SDL_PREALLOC) { flags |= PGS_PREALLOC; - if (PG_SurfaceHasRLE(surf)) + } + if (PG_SurfaceHasRLE(surf)) { flags |= PGS_RLEACCELOK; - if ((sdl_flags & SDL_RLEACCEL)) + } + if ((sdl_flags & SDL_RLEACCEL)) { flags |= PGS_RLEACCEL; + } if (is_window_surf) { - if (window_flags & PG_WINDOW_FULLSCREEN_INCLUSIVE) + if (window_flags & PG_WINDOW_FULLSCREEN_INCLUSIVE) { flags |= PGS_FULLSCREEN; - if (window_flags & SDL_WINDOW_OPENGL) + } + if (window_flags & SDL_WINDOW_OPENGL) { flags |= PGS_OPENGL; - if (window_flags & SDL_WINDOW_RESIZABLE) + } + if (window_flags & SDL_WINDOW_RESIZABLE) { flags |= PGS_RESIZABLE; - if (window_flags & SDL_WINDOW_BORDERLESS) + } + if (window_flags & SDL_WINDOW_BORDERLESS) { flags |= PGS_NOFRAME; + } } return PyLong_FromLong((long)flags); @@ -2788,12 +2875,14 @@ surf_subsurface(PyObject *self, PyObject *args) return RAISE(pgExc_SDLError, SDL_GetError()); } - if (!(rect = pgRect_FromObject(args, &temp))) + if (!(rect = pgRect_FromObject(args, &temp))) { return RAISE(PyExc_ValueError, "invalid rectstyle argument"); + } if (rect->x < 0 || rect->y < 0 || rect->x + rect->w > surf->w || - rect->y + rect->h > surf->h) + rect->y + rect->h > surf->h) { return RAISE(PyExc_ValueError, "subsurface rectangle outside surface area"); + } pgSurface_Lock((pgSurfaceObject *)self); @@ -2806,8 +2895,9 @@ surf_subsurface(PyObject *self, PyObject *args) pgSurface_Unlock((pgSurfaceObject *)self); - if (!sub) + if (!sub) { return RAISE(pgExc_SDLError, SDL_GetError()); + } /* copy the colormap if we need it */ if (SDL_ISPIXELFORMAT_INDEXED(format->format) && palette) { @@ -2856,8 +2946,9 @@ surf_subsurface(PyObject *self, PyObject *args) } data = PyMem_New(struct pgSubSurface_Data, 1); - if (!data) + if (!data) { return NULL; + } subobj = surf_subtype_new(Py_TYPE(self), sub, 1); if (!subobj) { @@ -2882,8 +2973,9 @@ surf_get_offset(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) subdata = ((pgSurfaceObject *)self)->subsurface; - if (!subdata) + if (!subdata) { return pg_tuple_couple_from_values_int(0, 0); + } return pg_tuple_couple_from_values_int(subdata->offsetx, subdata->offsety); } @@ -2898,8 +2990,9 @@ surf_get_abs_offset(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) subdata = ((pgSurfaceObject *)self)->subsurface; - if (!subdata) + if (!subdata) { return pg_tuple_couple_from_values_int(0, 0); + } subdata = ((pgSurfaceObject *)self)->subsurface; owner = subdata->owner; @@ -2924,8 +3017,9 @@ surf_get_parent(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) subdata = ((pgSurfaceObject *)self)->subsurface; - if (!subdata) + if (!subdata) { Py_RETURN_NONE; + } Py_INCREF(subdata->owner); return subdata->owner; @@ -2985,15 +3079,17 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) Uint8 keyr, keyg, keyb; char *kwids[] = {"min_alpha", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i", kwids, &min_alpha)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i", kwids, &min_alpha)) { return RAISE(PyExc_ValueError, "get_bounding_rect only accepts a single optional " "min_alpha argument"); + } SURF_INIT_CHECK(surf) - if (!pgSurface_Lock((pgSurfaceObject *)self)) + if (!pgSurface_Lock((pgSurfaceObject *)self)) { return RAISE(pgExc_SDLError, "could not lock surface"); + } PG_PixelFormat *format; SDL_Palette *palette; @@ -3141,8 +3237,9 @@ surf_get_bounding_rect(PyObject *self, PyObject *args, PyObject *kwargs) break; } } - if (!pgSurface_Unlock((pgSurfaceObject *)self)) + if (!pgSurface_Unlock((pgSurfaceObject *)self)) { return RAISE(pgExc_SDLError, "could not unlock surface"); + } rect = pgRect_New4(min_x, min_y, max_x - min_x, max_y - min_y); return rect; @@ -3357,8 +3454,9 @@ surf_premul_alpha(pgSurfaceObject *self, PyObject *_null) pgSurface_Unprep(self); final = surf_subtype_new(Py_TYPE(self), newsurf, 1); - if (!final) + if (!final) { SDL_FreeSurface(newsurf); + } return final; } @@ -4160,14 +4258,17 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, dstrect->x -= suboffsetx; dstrect->y -= suboffsety; } - else + else { pgSurface_Unprep(dstobj); + } pgSurface_Unprep(srcobj); - if (result == -1) + if (result == -1) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); - if (result == -2) + } + if (result == -2) { PyErr_SetString(pgExc_SDLError, "Surface was lost"); + } return result != 0; } diff --git a/src_c/surface_fill.c b/src_c/surface_fill.c index 6fa3f984dd..9e9ad0be04 100644 --- a/src_c/surface_fill.c +++ b/src_c/surface_fill.c @@ -40,36 +40,48 @@ surface_respect_clip_rect(SDL_Surface *surface, SDL_Rect *rect) /* Code here is nearly identical to rect_clip in rect.c */ /* Left */ - if ((A->x >= B->x) && (A->x < (B->x + B->w))) + if ((A->x >= B->x) && (A->x < (B->x + B->w))) { x = A->x; - else if ((B->x >= A->x) && (B->x < (A->x + A->w))) + } + else if ((B->x >= A->x) && (B->x < (A->x + A->w))) { x = B->x; - else + } + else { return; + } /* Right */ - if (((A->x + A->w) > B->x) && ((A->x + A->w) <= (B->x + B->w))) + if (((A->x + A->w) > B->x) && ((A->x + A->w) <= (B->x + B->w))) { w = (A->x + A->w) - x; - else if (((B->x + B->w) > A->x) && ((B->x + B->w) <= (A->x + A->w))) + } + else if (((B->x + B->w) > A->x) && ((B->x + B->w) <= (A->x + A->w))) { w = (B->x + B->w) - x; - else + } + else { return; + } /* Top */ - if ((A->y >= B->y) && (A->y < (B->y + B->h))) + if ((A->y >= B->y) && (A->y < (B->y + B->h))) { y = A->y; - else if ((B->y >= A->y) && (B->y < (A->y + A->h))) + } + else if ((B->y >= A->y) && (B->y < (A->y + A->h))) { y = B->y; - else + } + else { return; + } /* Bottom */ - if (((A->y + A->h) > B->y) && ((A->y + A->h) <= (B->y + B->h))) + if (((A->y + A->h) > B->y) && ((A->y + A->h) <= (B->y + B->h))) { h = (A->y + A->h) - y; - else if (((B->y + B->h) > A->y) && ((B->y + B->h) <= (A->y + A->h))) + } + else if (((B->y + B->h) > A->y) && ((B->y + B->h) <= (A->y + A->h))) { h = (B->y + B->h) - y; - else + } + else { return; + } rect->x = x; rect->y = y; @@ -915,8 +927,9 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, /* Lock the surface, if needed */ if (SDL_MUSTLOCK(surface)) { - if (SDL_LockSurface(surface) < 0) + if (SDL_LockSurface(surface) < 0) { return -1; + } locked = 1; } diff --git a/src_c/system.c b/src_c/system.c index 4e7c21162a..2c9e2b4e5f 100644 --- a/src_c/system.c +++ b/src_c/system.c @@ -40,10 +40,12 @@ pg_system_get_cpu_instruction_sets(PyObject *self, PyObject *_null) INSERT_INSTRUCTIONSET_INFO("LSX", SDL_HasLSX); INSERT_INSTRUCTIONSET_INFO("LASX", SDL_HasLASX); #else - if (PyDict_SetItemString(instruction_sets, "LSX", Py_False)) + if (PyDict_SetItemString(instruction_sets, "LSX", Py_False)) { goto error; - if (PyDict_SetItemString(instruction_sets, "LASX", Py_False)) + } + if (PyDict_SetItemString(instruction_sets, "LASX", Py_False)) { goto error; + } #endif #undef INSERT_INSTRUCTIONSET_INFO @@ -232,13 +234,15 @@ pg_system_get_power_state(PyObject *self, PyObject *_null) ); // clang-format on - if (!return_kwargs) + if (!return_kwargs) { return NULL; + } return_args = Py_BuildValue("()"); - if (!return_args) + if (!return_args) { return NULL; + } if (!PowerState_class) { return RAISE(PyExc_SystemError, "PowerState class is not imported."); diff --git a/src_c/time.c b/src_c/time.c index a44d859209..b89e43e9de 100644 --- a/src_c/time.c +++ b/src_c/time.c @@ -185,8 +185,9 @@ pg_time_autoinit(PyObject *self, PyObject *_null) /* allocate a mutex for timer data holding struct */ if (!pg_timer_mutex) { pg_timer_mutex = SDL_CreateMutex(); - if (!pg_timer_mutex) + if (!pg_timer_mutex) { return RAISE(pgExc_SDLError, SDL_GetError()); + } } #endif Py_RETURN_NONE; @@ -318,8 +319,9 @@ accurate_delay(Sint64 ticks) // loop Uint64 maximum_delay = (SDL_MAX_UINT64 >> 1); - if (ticks <= 0) + if (ticks <= 0) { return 0; + } #if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_WasInit(SDL_INIT_TIMER)) { @@ -350,8 +352,9 @@ static PyObject * time_get_ticks(PyObject *self, PyObject *_null) { #if !SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_WasInit(SDL_INIT_TIMER)) + if (!SDL_WasInit(SDL_INIT_TIMER)) { return PyLong_FromLong(0); + } #endif return PyLong_FromUnsignedLongLong(PG_GetTicks()); } @@ -360,16 +363,19 @@ static PyObject * time_delay(PyObject *self, PyObject *arg) { Sint64 ticks; - if (!PyLong_Check(arg)) + if (!PyLong_Check(arg)) { return RAISE(PyExc_TypeError, "delay requires one integer argument"); + } ticks = PyLong_AsLongLong(arg); - if (ticks < 0) + if (ticks < 0) { ticks = 0; + } ticks = accurate_delay(ticks); - if (ticks == -1) + if (ticks == -1) { return NULL; + } return PyLong_FromLongLong(ticks); } @@ -377,8 +383,9 @@ static PyObject * time_wait(PyObject *self, PyObject *arg) { Sint64 ticks, start; - if (!PyLong_Check(arg)) + if (!PyLong_Check(arg)) { return RAISE(PyExc_TypeError, "wait requires one integer argument"); + } #if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_WasInit(SDL_INIT_TIMER)) { @@ -389,8 +396,9 @@ time_wait(PyObject *self, PyObject *arg) #endif ticks = PyLong_AsLongLong(arg); - if (ticks < 0) + if (ticks < 0) { ticks = 0; + } start = PG_GetTicks(); Py_BEGIN_ALLOW_THREADS; @@ -419,8 +427,9 @@ time_set_timer(PyObject *self, PyObject *args, PyObject *kwargs) #endif if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|i", kwids, &obj, &ticks, - &loops)) + &loops)) { return NULL; + } if (PyLong_Check(obj)) { ev_type = (int)PyLong_AsLong(obj); @@ -443,8 +452,9 @@ time_set_timer(PyObject *self, PyObject *args, PyObject *kwargs) } #ifndef __EMSCRIPTEN__ - if (!pg_timer_mutex) + if (!pg_timer_mutex) { return RAISE(pgExc_SDLError, "pygame is not initialized"); + } #endif /* emscripten */ /* release GIL because python GIL and pg_timer_mutex should not @@ -527,8 +537,9 @@ clock_tick_base(pgClockObject *self, PyObject *arg, int use_accurate_delay) float framerate = 0.0f; Uint64 nowtime; - if (!PyArg_ParseTuple(arg, "|f", &framerate)) + if (!PyArg_ParseTuple(arg, "|f", &framerate)) { return NULL; + } if (framerate) { Sint64 delay, endtime = (Sint64)((1.0f / framerate) * 1000.0f); @@ -544,28 +555,32 @@ clock_tick_base(pgClockObject *self, PyObject *arg, int use_accurate_delay) } #endif - if (use_accurate_delay) + if (use_accurate_delay) { delay = accurate_delay(delay); + } else { // this uses sdls delay, which can be inaccurate. - if (delay < 0) + if (delay < 0) { delay = 0; + } Py_BEGIN_ALLOW_THREADS; SDL_Delay((Uint32)delay); Py_END_ALLOW_THREADS; } - if (delay == -1) + if (delay == -1) { return NULL; + } } nowtime = PG_GetTicks(); self->timepassed = nowtime - self->last_tick; self->fps_count += 1; self->last_tick = nowtime; - if (!framerate) + if (!framerate) { self->rawpassed = self->timepassed; + } if (!self->fps_tick) { self->fps_count = 0; diff --git a/src_c/transform.c b/src_c/transform.c index ab69290b2d..82b1294eba 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -98,16 +98,18 @@ _PgSurface_SrcAlpha(SDL_Surface *surf) if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) { return -1; } - if (mode == SDL_BLENDMODE_BLEND) + if (mode == SDL_BLENDMODE_BLEND) { return 1; + } } else { Uint8 color = SDL_ALPHA_OPAQUE; if (SDL_GetSurfaceAlphaMod(surf, &color) != 0) { return -1; } - if (color != SDL_ALPHA_OPAQUE) + if (color != SDL_ALPHA_OPAQUE) { return 1; + } } return 0; } @@ -121,13 +123,15 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) Uint8 alpha; int isalpha; - if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) + if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) { return (SDL_Surface *)(RAISE( PyExc_ValueError, "unsupported Surface bit depth for transform")); + } newsurf = PG_CreateSurface(width, height, PG_SURF_FORMATENUM(surf)); - if (!newsurf) + if (!newsurf) { return (SDL_Surface *)(RAISE(pgExc_SDLError, SDL_GetError())); + } /* Copy palette, colorkey, etc info */ if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { @@ -219,8 +223,9 @@ rotate90(SDL_Surface *src, int angle) int srcstepx, srcstepy, dststepx, dststepy; int loopx, loopy; - if (numturns < 0) + if (numturns < 0) { numturns = 4 + numturns; + } if (!(numturns % 2)) { dstwidth = src->w; dstheight = src->h; @@ -231,8 +236,9 @@ rotate90(SDL_Surface *src, int angle) } dst = newsurf_fromsurf(src, dstwidth, dstheight); - if (!dst) + if (!dst) { return NULL; + } Py_BEGIN_ALLOW_THREADS; SDL_LockSurface(dst); @@ -353,12 +359,14 @@ rotate(SDL_Surface *src, SDL_Surface *dst, Uint32 bgcolor, double sangle, dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { - if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) + if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) { *dstpos++ = bgcolor; - else + } + else { *dstpos++ = *(Uint8 *)(srcpix + ((dy >> 16) * srcpitch) + (dx >> 16)); + } dx += icos; dy += isin; } @@ -371,12 +379,14 @@ rotate(SDL_Surface *src, SDL_Surface *dst, Uint32 bgcolor, double sangle, dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { - if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) + if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) { *dstpos++ = bgcolor; - else + } + else { *dstpos++ = *(Uint16 *)(srcpix + ((dy >> 16) * srcpitch) + ((long long)dx >> 16 << 1)); + } dx += icos; dy += isin; } @@ -389,12 +399,14 @@ rotate(SDL_Surface *src, SDL_Surface *dst, Uint32 bgcolor, double sangle, dx = (ax + (isin * (cy - y))) + xd; dy = (ay - (icos * (cy - y))) + yd; for (x = 0; x < dst->w; x++) { - if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) + if (dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval) { *dstpos++ = bgcolor; - else + } + else { *dstpos++ = *(Uint32 *)(srcpix + ((dy >> 16) * srcpitch) + ((long long)dx >> 16 << 2)); + } dx += icos; dy += isin; } @@ -436,15 +448,17 @@ scale_to(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int width, SDL_Surface *modsurf = NULL; int stretch_result_num = 0; - if (width < 0 || height < 0) + if (width < 0 || height < 0) { return RAISE(PyExc_ValueError, "Cannot scale to negative size"); + } src = pgSurface_AsSurface(srcobj); if (!dstobj) { modsurf = retsurf = newsurf_fromsurf(src, width, height); - if (!retsurf) + if (!retsurf) { return NULL; + } } else { modsurf = retsurf = pgSurface_AsSurface(dstobj); @@ -519,14 +533,16 @@ surf_scale(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O|O!", keywords, &pgSurface_Type, &surfobj, &size, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) - if (!pg_TwoIntsFromObj(size, &width, &height)) + if (!pg_TwoIntsFromObj(size, &width, &height)) { return RAISE(PyExc_TypeError, "size must be two numbers"); + } newsurf = scale_to(surfobj, surfobj2, width, height); if (!newsurf) { @@ -537,8 +553,9 @@ surf_scale(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return (PyObject *)surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } static PyObject * @@ -553,8 +570,9 @@ surf_scale_by(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O|O!", keywords, &pgSurface_Type, &surfobj, &factorobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } if (!_get_factor(factorobj, &scalex, &scaley)) { return NULL; @@ -573,8 +591,9 @@ surf_scale_by(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return (PyObject *)surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } static PyObject * @@ -587,8 +606,9 @@ surf_scale2x(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!", keywords, &pgSurface_Type, &surfobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) @@ -601,20 +621,24 @@ surf_scale2x(PyObject *self, PyObject *args, PyObject *kwargs) newsurf = newsurf_fromsurf(surf, width, height); - if (!newsurf) + if (!newsurf) { return NULL; + } } - else + else { newsurf = pgSurface_AsSurface(surfobj2); + } /* check to see if the size is twice as big. */ - if (newsurf->w != (surf->w * 2) || newsurf->h != (surf->h * 2)) + if (newsurf->w != (surf->w * 2) || newsurf->h != (surf->h * 2)) { return RAISE(PyExc_ValueError, "Destination surface not 2x bigger."); + } /* check to see if the format of the surface is the same. */ - if (PG_SURF_BytesPerPixel(surf) != PG_SURF_BytesPerPixel(newsurf)) + if (PG_SURF_BytesPerPixel(surf) != PG_SURF_BytesPerPixel(newsurf)) { return RAISE(PyExc_ValueError, "Source and destination surfaces need the same format."); + } SDL_LockSurface(newsurf); SDL_LockSurface(surf); @@ -630,8 +654,9 @@ surf_scale2x(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } static PyObject * @@ -648,8 +673,9 @@ surf_rotate(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"surface", "angle", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!f", keywords, - &pgSurface_Type, &surfobj, &angle)) + &pgSurface_Type, &surfobj, &angle)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) @@ -658,9 +684,10 @@ surf_rotate(PyObject *self, PyObject *args, PyObject *kwargs) return (PyObject *)surfobj; } - if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) + if (PG_SURF_BytesPerPixel(surf) == 0 || PG_SURF_BytesPerPixel(surf) > 4) { return RAISE(PyExc_ValueError, "unsupported Surface bit depth for transform"); + } if (!(fmod((double)angle, (double)90.0f))) { pgSurface_Lock(surfobj); @@ -669,8 +696,9 @@ surf_rotate(PyObject *self, PyObject *args, PyObject *kwargs) newsurf = rotate90(surf, (int)angle); pgSurface_Unlock(surfobj); - if (!newsurf) + if (!newsurf) { return NULL; + } return (PyObject *)pgSurface_New(newsurf); } @@ -690,8 +718,9 @@ surf_rotate(PyObject *self, PyObject *args, PyObject *kwargs) fabs(-sx - cy))); newsurf = newsurf_fromsurf(surf, nxmax, nymax); - if (!newsurf) + if (!newsurf) { return NULL; + } /* get the background color */ if (!SDL_HasColorKey(surf)) { @@ -754,14 +783,16 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!ii", keywords, &pgSurface_Type, &surfobj, &xaxis, - &yaxis)) + &yaxis)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) newsurf = newsurf_fromsurf(surf, surf->w, surf->h); - if (!newsurf) + if (!newsurf) { return NULL; + } srcpitch = surf->pitch; dstpitch = newsurf->pitch; @@ -776,15 +807,17 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) if (!xaxis) { if (!yaxis) { - for (loopy = 0; loopy < surf->h; ++loopy) + for (loopy = 0; loopy < surf->h; ++loopy) { memcpy(dstpix + loopy * dstpitch, srcpix + loopy * srcpitch, surf->w * PG_SURF_BytesPerPixel(surf)); + } } else { - for (loopy = 0; loopy < surf->h; ++loopy) + for (loopy = 0; loopy < surf->h; ++loopy) { memcpy(dstpix + loopy * dstpitch, srcpix + (surf->h - 1 - loopy) * srcpitch, surf->w * PG_SURF_BytesPerPixel(surf)); + } } } else /*if (xaxis)*/ @@ -798,8 +831,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) ((Uint8 *)(srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 2: @@ -809,8 +843,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) ((Uint16 *)(srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 4: @@ -820,8 +855,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) ((Uint32 *)(srcpix + (surf->h - 1 - loopy) * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 3: @@ -847,8 +883,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) Uint8 *dst = (Uint8 *)(dstpix + loopy * dstpitch); Uint8 *src = ((Uint8 *)(srcpix + loopy * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 2: @@ -856,8 +893,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) Uint16 *dst = (Uint16 *)(dstpix + loopy * dstpitch); Uint16 *src = ((Uint16 *)(srcpix + loopy * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 4: @@ -865,8 +903,9 @@ surf_flip(PyObject *self, PyObject *args, PyObject *kwargs) Uint32 *dst = (Uint32 *)(dstpix + loopy * dstpitch); Uint32 *src = ((Uint32 *)(srcpix + loopy * srcpitch)) + surf->w - 1; - for (loopx = 0; loopx < surf->w; ++loopx) + for (loopx = 0; loopx < surf->w; ++loopx) { *dst++ = *src--; + } } break; case 3: @@ -901,8 +940,9 @@ surf_rotozoom(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!ff", keywords, &pgSurface_Type, &surfobj, &angle, - &scale)) + &scale)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) @@ -930,10 +970,12 @@ surf_rotozoom(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - if (surf32 == surf) + if (surf32 == surf) { pgSurface_Unlock(surfobj); - else + } + else { SDL_FreeSurface(surf32); + } return (PyObject *)pgSurface_New(newsurf); } @@ -946,10 +988,12 @@ chop(SDL_Surface *src, int x, int y, int width, int height) int srcstepx, srcstepy, dststepx, dststepy; int loopx, loopy; - if ((x + width) > src->w) + if ((x + width) > src->w) { width = MIN(MAX(src->w - x, 0), src->w); - if ((y + height) > src->h) + } + if ((y + height) > src->h) { height = MIN(MAX(src->h - y, 0), src->h); + } if (x < 0) { width -= (-x); x = 0; @@ -963,8 +1007,9 @@ chop(SDL_Surface *src, int x, int y, int width, int height) dstheight = src->h - height; dst = newsurf_fromsurf(src, dstwidth, dstheight); - if (!dst) + if (!dst) { return NULL; + } Py_BEGIN_ALLOW_THREADS; SDL_LockSurface(dst); @@ -1017,11 +1062,13 @@ surf_chop(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"surface", "rect", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", keywords, - &pgSurface_Type, &surfobj, &rectobj)) + &pgSurface_Type, &surfobj, &rectobj)) { return NULL; + } - if (!(rect = pgRect_FromObject(rectobj, &temp))) + if (!(rect = pgRect_FromObject(rectobj, &temp))) { return RAISE(PyExc_TypeError, "Rect argument is invalid"); + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) @@ -1107,8 +1154,9 @@ filter_shrink_Y_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, /* allocate and clear a memory area for storing the accumulator line */ templine = (Uint16 *)malloc(dstpitch * 2); - if (templine == NULL) + if (templine == NULL) { return; + } memset(templine, 0, dstpitch * 2); for (y = 0; y < srcheight; y++) { @@ -1180,16 +1228,19 @@ filter_expand_X_ONLYC(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, /* Allocate memory for factors */ xidx0 = malloc(dstwidth * 4); - if (xidx0 == NULL) + if (xidx0 == NULL) { return; + } xmult0 = (int *)malloc(dstwidth * factorwidth); xmult1 = (int *)malloc(dstwidth * factorwidth); if (xmult0 == NULL || xmult1 == NULL) { free(xidx0); - if (xmult0) + if (xmult0) { free(xmult0); - if (xmult1) + } + if (xmult1) { free(xmult1); + } return; } @@ -1365,8 +1416,9 @@ scalesmooth(SDL_Surface *src, SDL_Surface *dst, struct _module_state *st) if (bpp == 3) { int newpitch = srcwidth * 4; Uint8 *newsrc = (Uint8 *)malloc((size_t)newpitch * srcheight); - if (!newsrc) + if (!newsrc) { return; + } convert_24_32(srcpix, srcpitch, newsrc, newpitch, srcwidth, srcheight); srcpix = newsrc; srcpitch = newpitch; @@ -1398,40 +1450,48 @@ scalesmooth(SDL_Surface *src, SDL_Surface *dst, struct _module_state *st) /* Start the filter by doing X-scaling */ if (dstwidth < srcwidth) /* shrink */ { - if (srcheight != dstheight) + if (srcheight != dstheight) { st->filter_shrink_X(srcpix, temppix, srcheight, srcpitch, temppitch, srcwidth, dstwidth); - else + } + else { st->filter_shrink_X(srcpix, dstpix, srcheight, srcpitch, dstpitch, srcwidth, dstwidth); + } } else if (dstwidth > srcwidth) /* expand */ { - if (srcheight != dstheight) + if (srcheight != dstheight) { st->filter_expand_X(srcpix, temppix, srcheight, srcpitch, temppitch, srcwidth, dstwidth); - else + } + else { st->filter_expand_X(srcpix, dstpix, srcheight, srcpitch, dstpitch, srcwidth, dstwidth); + } } /* Now do the Y scale */ if (dstheight < srcheight) /* shrink */ { - if (srcwidth != dstwidth) + if (srcwidth != dstwidth) { st->filter_shrink_Y(temppix, dstpix, tempwidth, temppitch, dstpitch, srcheight, dstheight); - else + } + else { st->filter_shrink_Y(srcpix, dstpix, srcwidth, srcpitch, dstpitch, srcheight, dstheight); + } } else if (dstheight > srcheight) /* expand */ { - if (srcwidth != dstwidth) + if (srcwidth != dstwidth) { st->filter_expand_Y(temppix, dstpix, tempwidth, temppitch, dstpitch, srcheight, dstheight); - else + } + else { st->filter_expand_Y(srcpix, dstpix, srcwidth, srcpitch, dstpitch, srcheight, dstheight); + } } /* Convert back to 24-bit if necessary */ @@ -1444,8 +1504,9 @@ scalesmooth(SDL_Surface *src, SDL_Surface *dst, struct _module_state *st) srcpix = NULL; } /* free temporary buffer if necessary */ - if (temppix != NULL) + if (temppix != NULL) { free(temppix); + } } static SDL_Surface * @@ -1455,35 +1516,41 @@ smoothscale_to(PyObject *self, pgSurfaceObject *srcobj, SDL_Surface *src = NULL; SDL_Surface *retsurf = NULL; int bpp; - if (width < 0 || height < 0) + if (width < 0 || height < 0) { return (SDL_Surface *)(RAISE(PyExc_ValueError, "Cannot scale to negative size")); + } src = pgSurface_AsSurface(srcobj); bpp = PG_SURF_BytesPerPixel(src); - if (bpp < 3 || bpp > 4) + if (bpp < 3 || bpp > 4) { return (SDL_Surface *)(RAISE( PyExc_ValueError, "Only 24-bit or 32-bit surfaces can be smoothly scaled")); + } if (!dstobj) { retsurf = newsurf_fromsurf(src, width, height); - if (!retsurf) + if (!retsurf) { return NULL; + } } - else + else { retsurf = pgSurface_AsSurface(dstobj); + } - if (retsurf->w != width || retsurf->h != height) + if (retsurf->w != width || retsurf->h != height) { return (SDL_Surface *)(RAISE( PyExc_ValueError, "Destination surface not the given width or height.")); + } - if (((width * bpp + 3) >> 2) > retsurf->pitch) + if (((width * bpp + 3) >> 2) > retsurf->pitch) { return (SDL_Surface *)(RAISE( PyExc_ValueError, "SDL Error: destination surface pitch not 4-byte aligned.")); + } if (width && height) { SDL_LockSurface(retsurf); @@ -1526,14 +1593,16 @@ surf_scalesmooth(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O|O!", keywords, &pgSurface_Type, &surfobj, &size, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) - if (!pg_TwoIntsFromObj(size, &width, &height)) + if (!pg_TwoIntsFromObj(size, &width, &height)) { return RAISE(PyExc_TypeError, "size must be two numbers"); + } newsurf = smoothscale_to(self, surfobj, surfobj2, width, height); if (!newsurf) { @@ -1544,8 +1613,9 @@ surf_scalesmooth(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return (PyObject *)surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } static PyObject * @@ -1560,8 +1630,9 @@ surf_scalesmooth_by(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O|O!", keywords, &pgSurface_Type, &surfobj, &factorobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } if (!_get_factor(factorobj, &scale, &scaley)) { return NULL; @@ -1580,8 +1651,9 @@ surf_scalesmooth_by(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return (PyObject *)surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } static PyObject * @@ -1603,8 +1675,9 @@ surf_set_smoothscale_backend(PyObject *self, PyObject *args, PyObject *kwargs) __analysis_assume(type = "inited"); #endif - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", keywords, &type)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", keywords, &type)) { return NULL; + } if (strcmp(type, "GENERIC") == 0) { st->filter_type = "GENERIC"; @@ -1795,8 +1868,9 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, for (y = 0; y < surf->h; y++) { pixels = (Uint8 *)surf->pixels + y * surf->pitch; - if (search_surf) + if (search_surf) { pixels2 = (Uint8 *)search_surf->pixels + y * search_surf->pitch; + } for (x = 0; x < surf->w; x++) { pixels = _get_color_move_pixels(PG_SURF_BytesPerPixel(surf), @@ -1830,8 +1904,9 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, ((set_behavior == 2) ? the_color : color_set_color); } - if (within_threshold) + if (within_threshold) { similar++; + } if (set_behavior && ((within_threshold && inverse_set) || (!within_threshold && !inverse_set))) { _set_at_pixels(x, y, destpixels, dest_surf->format, @@ -1860,8 +1935,9 @@ _color_from_obj(PyObject *color_obj, SDL_Surface *surf, Uint8 rgba_default[4], } } else { - if (!rgba_default) + if (!rgba_default) { return -1; + } PG_PixelFormat *surf_format; SDL_Palette *surf_palette; @@ -1950,8 +2026,9 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) &set_color_obj, /* O python object. */ &set_behavior, /* i plain python int. */ &search_surf_obj, /* O python object. */ - &inverse_set)) /* i plain python int. */ + &inverse_set)) { /* i plain python int. */ return NULL; + } if (set_behavior == 0 && !(set_color_obj == NULL || set_color_obj == Py_None)) { @@ -1978,8 +2055,9 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) return RAISE(PyExc_TypeError, "invalid surf argument"); } - if (search_surf_obj && pgSurface_Check(search_surf_obj)) + if (search_surf_obj && pgSurface_Check(search_surf_obj)) { search_surf = pgSurface_AsSurface(search_surf_obj); + } if (search_surf && search_color_obj != Py_None) { return RAISE(PyExc_TypeError, @@ -1992,17 +2070,21 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) } if (search_color_obj != Py_None) { - if (_color_from_obj(search_color_obj, surf, NULL, &color_search_color)) + if (_color_from_obj(search_color_obj, surf, NULL, + &color_search_color)) { return RAISE(PyExc_TypeError, "invalid search_color argument"); + } } if (_color_from_obj(threshold_obj, surf, rgba_threshold_default, - &color_threshold)) + &color_threshold)) { return RAISE(PyExc_TypeError, "invalid threshold argument"); + } if (set_color_obj != Py_None) { if (_color_from_obj(set_color_obj, surf, rgba_set_color_default, - &color_set_color)) + &color_set_color)) { return RAISE(PyExc_TypeError, "invalid set_color argument"); + } } if (dest_surf && (surf->h != dest_surf->h || surf->w != dest_surf->w)) { @@ -2015,11 +2097,13 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) "surf and search_surf not the same size"); } - if (dest_surf) + if (dest_surf) { pgSurface_Lock((pgSurfaceObject *)dest_surf_obj); + } pgSurface_Lock(surf_obj); - if (search_surf) + if (search_surf) { pgSurface_Lock((pgSurfaceObject *)search_surf_obj); + } Py_BEGIN_ALLOW_THREADS; num_threshold_pixels = @@ -2027,11 +2111,13 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) color_set_color, set_behavior, search_surf, inverse_set); Py_END_ALLOW_THREADS; - if (dest_surf) + if (dest_surf) { pgSurface_Unlock((pgSurfaceObject *)dest_surf_obj); + } pgSurface_Unlock(surf_obj); - if (search_surf) + if (search_surf) { pgSurface_Unlock((pgSurfaceObject *)search_surf_obj); + } return PyLong_FromLong(num_threshold_pixels); } @@ -2171,8 +2257,9 @@ grayscale(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) if (!dstobj) { newsurf = newsurf_fromsurf(src, srcobj->surf->w, srcobj->surf->h); - if (!newsurf) + if (!newsurf) { return NULL; + } } else { newsurf = pgSurface_AsSurface(dstobj); @@ -2237,8 +2324,9 @@ surf_grayscale(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!", keywords, &pgSurface_Type, &surfobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } newsurf = grayscale(surfobj, surfobj2); @@ -2265,8 +2353,9 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, if (!dstobj) { newsurf = newsurf_fromsurf(src, srcobj->surf->w, srcobj->surf->h); - if (!newsurf) + if (!newsurf) { return NULL; + } } else { newsurf = pgSurface_AsSurface(dstobj); @@ -2293,8 +2382,9 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, /* If the source surface has no alpha channel, we can't overlay with alpha * blending. */ - if (!SDL_ISPIXELFORMAT_ALPHA(fmt->format)) + if (!SDL_ISPIXELFORMAT_ALPHA(fmt->format)) { return newsurf; + } /* If we are keeping the src alpha, then we need to remove the alpha from * the color so it's easier to add the base pixel alpha back in */ @@ -2341,8 +2431,9 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, while (height--) { LOOP_UNROLLED4( { - if (*srcp) + if (*srcp) { *dstp = color; + } srcp += 4; dstp++; }, @@ -2372,8 +2463,9 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, while (height--) { LOOP_UNROLLED4( { - if (*srcp) + if (*srcp) { *dstp = color; + } srcp += 4; dstp++; }, @@ -2418,11 +2510,13 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, PG_GetRGBA((Uint32)*src_row, fmt, src_palette, &r, &g, &b, &a); if (a) { - if (keep_alpha) + if (keep_alpha) { *dst_row = (Uint16)PG_MapRGBA( newsurf_format, newsurf_palette, Cr, Cg, Cb, a); - else + } + else { *dst_row = color16; + } } src_row++; @@ -2433,10 +2527,12 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, } } - if (src_lock) + if (src_lock) { SDL_UnlockSurface(src); - if (dst_lock) + } + if (dst_lock) { SDL_UnlockSurface(newsurf); + } return newsurf; } @@ -2456,10 +2552,11 @@ surf_solid_overlay(PyObject *self, PyObject *args, PyObject *kwargs) static char *keywords[] = {"surface", "color", "dest_surface", "keep_alpha", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O|O!i", keywords, - &pgSurface_Type, &surfobj, &colorobj, - &pgSurface_Type, &surfobj2, &keep_alpha)) + if (!PyArg_ParseTupleAndKeywords( + args, kwargs, "O!O|O!i", keywords, &pgSurface_Type, &surfobj, + &colorobj, &pgSurface_Type, &surfobj2, &keep_alpha)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); @@ -2525,16 +2622,21 @@ RGB_to_HSL(Uint8 r, Uint8 g, Uint8 b, float *h, float *s, float *l) static PG_FORCEINLINE float hue_to_rgb(float p, float q, float t) { - if (t < 0) + if (t < 0) { t += 1; - if (t > 1) + } + if (t > 1) { t -= 1; - if (t < 1 / 6.0f) + } + if (t < 1 / 6.0f) { return p + (q - p) * 6 * t; - if (t < 1 / 2.0f) + } + if (t < 1 / 2.0f) { return q; - if (t < 2 / 3.0f) + } + if (t < 2 / 3.0f) { return p + (q - p) * (2 / 3.0f - t) * 6; + } return p; } @@ -2606,10 +2708,12 @@ modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, if (h) { s_h += h; - if (s_h > 1) + if (s_h > 1) { s_h -= 1; - else if (s_h < 0) + } + else if (s_h < 0) { s_h += 1; + } } if (s) { s_s = s_s * (1 + s); @@ -2624,8 +2728,9 @@ modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, dstp8[Ridx] = r; dstp8[Gidx] = g; dstp8[Bidx] = b; - if (fmt->Amask) + if (fmt->Amask) { dstp8[Aidx] = srcp8[Aidx]; + } srcp8 += PG_FORMAT_BytesPerPixel(fmt); dstp8 += PG_FORMAT_BytesPerPixel(fmt); @@ -2645,10 +2750,12 @@ modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, if (h) { s_h += h; - if (s_h > 1) + if (s_h > 1) { s_h -= 1; - else if (s_h < 0) + } + else if (s_h < 0) { s_h += 1; + } } if (s) { s_s = s_s * (1 + s); @@ -2692,8 +2799,9 @@ surf_hsl(PyObject *self, PyObject *args, PyObject *kwargs) if (s < -1 || s > 1) { PyObject *value = PyFloat_FromDouble((double)s); - if (!value) + if (!value) { return NULL; + } PyErr_Format(PyExc_ValueError, "saturation value must be between -1 and 1, got %R", @@ -2720,8 +2828,9 @@ surf_hsl(PyObject *self, PyObject *args, PyObject *kwargs) if (!surfobj2) { dst = newsurf_fromsurf(src, src->w, src->h); - if (!dst) + if (!dst) { return NULL; + } } else { dst = pgSurface_AsSurface(surfobj2); @@ -2963,8 +3072,9 @@ surf_laplacian(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!", keywords, &pgSurface_Type, &surfobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); SURF_INIT_CHECK(surf) @@ -2977,21 +3087,25 @@ surf_laplacian(PyObject *self, PyObject *args, PyObject *kwargs) newsurf = newsurf_fromsurf(surf, width, height); - if (!newsurf) + if (!newsurf) { return NULL; + } } - else + else { newsurf = pgSurface_AsSurface(surfobj2); + } /* check to see if the size is the correct size. */ - if (newsurf->w != (surf->w) || newsurf->h != (surf->h)) + if (newsurf->w != (surf->w) || newsurf->h != (surf->h)) { return RAISE(PyExc_ValueError, "Destination surface not the same size."); + } /* check to see if the format of the surface is the same. */ - if (PG_SURF_BytesPerPixel(surf) != PG_SURF_BytesPerPixel(newsurf)) + if (PG_SURF_BytesPerPixel(surf) != PG_SURF_BytesPerPixel(newsurf)) { return RAISE(PyExc_ValueError, "Source and destination surfaces need the same format."); + } PG_PixelFormat *surf_format = PG_GetSurfaceFormat(surf); PG_PixelFormat *newsurf_format = PG_GetSurfaceFormat(newsurf); @@ -3013,8 +3127,9 @@ surf_laplacian(PyObject *self, PyObject *args, PyObject *kwargs) Py_INCREF(surfobj2); return surfobj2; } - else + else { return (PyObject *)pgSurface_New(newsurf); + } } int @@ -3217,18 +3332,21 @@ surf_average_surfaces(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O!i", keywords, &list, &pgSurface_Type, &surfobj2, - &palette_colors)) + &palette_colors)) { return NULL; + } - if (!PySequence_Check(list)) + if (!PySequence_Check(list)) { return RAISE(PyExc_TypeError, "Argument must be a sequence of surface objects."); + } size = PySequence_Length(list); /*warning, size could be -1 on error?*/ - if (size < 1) + if (size < 1) { return RAISE(PyExc_TypeError, "Needs to be given at least one surface."); + } /* Allocate an array of surface pointers. */ @@ -3285,8 +3403,9 @@ surf_average_surfaces(PyObject *self, PyObject *args, PyObject *kwargs) break; } } - else + else { newsurf = pgSurface_AsSurface(surfobj2); + } /* check to see if the size is the correct size. */ if (newsurf->w != (surf->w) || newsurf->h != (surf->h)) { @@ -3395,10 +3514,12 @@ average_color(SDL_Surface *surf, PG_PixelFormat *format, int x, int y, rtot = gtot = btot = atot = 0; /* make sure the area specified is within the Surface */ - if ((x + width) > surf->w) + if ((x + width) > surf->w) { width = surf->w - x; - if ((y + height) > surf->h) + } + if ((y + height) > surf->h) { height = surf->h - y; + } if (x < 0) { width -= (-x); x = 0; @@ -3589,8 +3710,9 @@ surf_average_color(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|Op", keywords, &pgSurface_Type, &surfobj, &rectobj, - &consider_alpha)) + &consider_alpha)) { return NULL; + } surf = pgSurface_AsSurface(surfobj); pgSurface_Lock(surfobj); @@ -3602,8 +3724,9 @@ surf_average_color(PyObject *self, PyObject *args, PyObject *kwargs) h = surf->h; } else { - if (!(rect = pgRect_FromObject(rectobj, &temp))) + if (!(rect = pgRect_FromObject(rectobj, &temp))) { return RAISE(PyExc_TypeError, "Rect argument is invalid"); + } x = rect->x; y = rect->y; w = rect->w; @@ -3824,8 +3947,9 @@ blur(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int radius, if (!dstobj) { retsurf = newsurf_fromsurf(src, src->w, src->h); - if (!retsurf) + if (!retsurf) { return NULL; + } } else { retsurf = pgSurface_AsSurface(dstobj); @@ -3905,8 +4029,9 @@ surf_box_blur(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords( args, kwargs, "O!i|pO!", kwlist, &pgSurface_Type, &src_surf_obj, - &radius, &repeat_edge_pixels, &pgSurface_Type, &dst_surf_obj)) + &radius, &repeat_edge_pixels, &pgSurface_Type, &dst_surf_obj)) { return NULL; + } new_surf = blur(src_surf_obj, dst_surf_obj, radius, repeat_edge_pixels, 'b'); @@ -3937,8 +4062,9 @@ surf_gaussian_blur(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords( args, kwargs, "O!i|pO!", kwlist, &pgSurface_Type, &src_surf_obj, - &radius, &repeat_edge_pixels, &pgSurface_Type, &dst_surf_obj)) + &radius, &repeat_edge_pixels, &pgSurface_Type, &dst_surf_obj)) { return NULL; + } new_surf = blur(src_surf_obj, dst_surf_obj, radius, repeat_edge_pixels, 'g'); @@ -3984,8 +4110,9 @@ invert(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) if (!dstobj) { newsurf = newsurf_fromsurf(src, srcobj->surf->w, srcobj->surf->h); - if (!newsurf) + if (!newsurf) { return NULL; + } } else { newsurf = pgSurface_AsSurface(dstobj); @@ -4050,8 +4177,9 @@ surf_invert(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!", keywords, &pgSurface_Type, &surfobj, - &pgSurface_Type, &surfobj2)) + &pgSurface_Type, &surfobj2)) { return NULL; + } newsurf = invert(surfobj, surfobj2); diff --git a/src_c/window.c b/src_c/window.c index 83bc01818c..8e0b1bde50 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -47,17 +47,20 @@ pg_display_resource(char *filename) PyObject *name = NULL; pkgdatamodule = PyImport_ImportModule(pkgdatamodule_name); - if (!pkgdatamodule) + if (!pkgdatamodule) { goto display_resource_end; + } imagemodule = PyImport_ImportModule(imagemodule_name); - if (!imagemodule) + if (!imagemodule) { goto display_resource_end; + } fresult = PyObject_CallMethod(pkgdatamodule, resourcefunc_name, "s", filename); - if (!fresult) + if (!fresult) { goto display_resource_end; + } name = PyObject_GetAttrString(fresult, "name"); if (name != NULL) { @@ -74,8 +77,9 @@ pg_display_resource(char *filename) result = PyObject_CallMethod(imagemodule, load_basicfunc_name, "O", fresult); - if (!result) + if (!result) { goto display_resource_end; + } display_resource_end: Py_XDECREF(pkgdatamodule); @@ -184,8 +188,9 @@ window_get_surface(pgWindowObject *self, PyObject *_null) if (self->surf == NULL) { self->surf = pgSurface_New2(_surf, SDL_FALSE); - if (!self->surf) + if (!self->surf) { return NULL; + } } self->surf->surf = _surf; @@ -253,19 +258,23 @@ _resize_event_watch(void *userdata, SDL_Event *event) pgWindowObject *event_window_pg; SDL_Window *event_window; #if SDL_VERSION_ATLEAST(3, 0, 0) - if ((event->type != SDL_WINDOWEVENT_SIZE_CHANGED)) + if ((event->type != SDL_WINDOWEVENT_SIZE_CHANGED)) { return 0; + } #else - if ((event->type != SDL_WINDOWEVENT)) + if ((event->type != SDL_WINDOWEVENT)) { return 0; - if (event->window.event != SDL_WINDOWEVENT_SIZE_CHANGED) + } + if (event->window.event != SDL_WINDOWEVENT_SIZE_CHANGED) { return 0; + } #endif event_window = SDL_GetWindowFromID(event->window.windowID); event_window_pg = (pgWindowObject *)pg_get_pg_window(event_window); - if (!event_window_pg) + if (!event_window_pg) { return 0; + } if (event_window_pg->_is_borrowed) { // have been handled by event watch in display.c @@ -281,8 +290,9 @@ _resize_event_watch(void *userdata, SDL_Event *event) } } - if (!event_window_pg->surf) + if (!event_window_pg->surf) { return 0; + } event_window_pg->surf->surf = SDL_GetWindowSurface(event_window); return 0; @@ -480,8 +490,9 @@ static int window_set_grab_mouse(pgWindowObject *self, PyObject *arg, void *v) { int enable = PyObject_IsTrue(arg); - if (enable == -1) + if (enable == -1) { return -1; + } #if SDL_VERSION_ATLEAST(2, 0, 16) SDL_SetWindowMouseGrab(self->_win, enable); @@ -519,8 +530,9 @@ window_set_grab_keyboard(pgWindowObject *self, PyObject *arg, void *v) { #if SDL_VERSION_ATLEAST(2, 0, 16) int enable = PyObject_IsTrue(arg); - if (enable == -1) + if (enable == -1) { return -1; + } SDL_SetWindowKeyboardGrab(self->_win, enable); #else @@ -586,8 +598,9 @@ static int window_set_resizable(pgWindowObject *self, PyObject *arg, void *v) { int enable = PyObject_IsTrue(arg); - if (enable == -1) + if (enable == -1) { return -1; + } SDL_SetWindowResizable(self->_win, enable); @@ -605,8 +618,9 @@ static int window_set_borderless(pgWindowObject *self, PyObject *arg, void *v) { int enable = PyObject_IsTrue(arg); - if (enable == -1) + if (enable == -1) { return -1; + } SDL_SetWindowBordered(self->_win, !enable); @@ -625,8 +639,9 @@ window_set_always_on_top(pgWindowObject *self, PyObject *arg, void *v) { #if SDL_VERSION_ATLEAST(2, 0, 16) int enable = PyObject_IsTrue(arg); - if (enable == -1) + if (enable == -1) { return -1; + } SDL_SetWindowAlwaysOnTop(self->_win, enable); #else @@ -689,8 +704,9 @@ window_get_mouse_rect(pgWindowObject *self, void *v) { #if SDL_VERSION_ATLEAST(2, 0, 18) const SDL_Rect *mouse_rect_p = SDL_GetWindowMouseRect(self->_win); - if (mouse_rect_p == NULL) + if (mouse_rect_p == NULL) { Py_RETURN_NONE; + } return pgRect_New((SDL_Rect *)mouse_rect_p); #else if (PyErr_WarnEx(PyExc_Warning, @@ -985,12 +1001,14 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) // ensure display is init at this point, display init automatically calls // the window init in this module - if (!pg_mod_autoinit(IMPPREFIX "display")) + if (!pg_mod_autoinit(IMPPREFIX "display")) { return -1; + } _kw = PyDict_New(); - if (!_kw) + if (!_kw) { return -1; + } #if SDL_VERSION_ATLEAST(3, 0, 0) int fullscreen_non_desktop = 0; @@ -1003,8 +1021,9 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) } _key_str = PyUnicode_AsUTF8(_key); - if (!_key_str) + if (!_key_str) { return -1; + } if (!strcmp(_key_str, "title") || !strcmp(_key_str, "size") || !strcmp(_key_str, "position")) { @@ -1014,8 +1033,9 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) // handle **flags else { _value_bool = PyObject_IsTrue(_value); - if (_value_bool == -1) + if (_value_bool == -1) { return -1; + } if (!strcmp(_key_str, "opengl")) { if (_value_bool) { @@ -1030,37 +1050,45 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) #if SDL_VERSION_ATLEAST(3, 0, 0) fullscreen_non_desktop = 1; #endif - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_FULLSCREEN; + } } else if (!strcmp(_key_str, "fullscreen_desktop")) { #if SDL_VERSION_ATLEAST(3, 0, 0) - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_FULLSCREEN; + } #else - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; + } #endif } else if (!strcmp(_key_str, "hidden")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_HIDDEN; + } } else if (!strcmp(_key_str, "borderless")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_BORDERLESS; + } } else if (!strcmp(_key_str, "resizable")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_RESIZABLE; + } } else if (!strcmp(_key_str, "minimized")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_MINIMIZED; + } } else if (!strcmp(_key_str, "maximized")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_MAXIMIZED; + } } else if (!strcmp(_key_str, "mouse_grabbed")) { if (_value_bool) @@ -1115,16 +1143,19 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) } } else if (!strcmp(_key_str, "mouse_capture")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_MOUSE_CAPTURE; + } } else if (!strcmp(_key_str, "always_on_top")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_ALWAYS_ON_TOP; + } } else if (!strcmp(_key_str, "vulkan")) { - if (_value_bool) + if (_value_bool) { flags |= SDL_WINDOW_VULKAN; + } } else if (!strcmp(_key_str, "utility")) { if (_value_bool) { @@ -1249,8 +1280,9 @@ window_from_display_module(PyTypeObject *cls, PyObject *_null) // ensure display is init at this point, display init automatically calls // the window init in this module - if (!pg_mod_autoinit(IMPPREFIX "display")) + if (!pg_mod_autoinit(IMPPREFIX "display")) { return NULL; + } SDL_Window *window = pg_GetDefaultWindow(); if (!window) { From 004f4f1ef1248b9410418eacb161765384027ec4 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 1 Mar 2025 11:04:11 +0530 Subject: [PATCH 092/441] Fix unicode property when keyup blocked --- src_c/event.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src_c/event.c b/src_c/event.c index 272babdcbf..79db3f51e3 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -131,6 +131,11 @@ static char released_mouse_buttons[5] = {0}; } #endif /* not on emscripten */ +static Uint32 +_pg_pgevent_proxify(Uint32 type); +static Uint32 +_pg_pgevent_deproxify(Uint32 type); + #if SDL_VERSION_ATLEAST(3, 0, 0) static Uint32 _pg_repeat_callback(void *param, SDL_TimerID timerID, Uint32 interval) @@ -283,11 +288,28 @@ _pg_strip_utf8(const char *str, char *ret) } } +/* Go over our cache, deleting entries with the same scancode */ +static void +_pg_del_event_unicode(SDL_Event *event) +{ + for (int i = 0; i < MAX_SCAN_UNICODE; i++) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (scanunicode[i].key == event->key.scancode) +#else + if (scanunicode[i].key == event->key.keysym.scancode) +#endif + { + /* Mark as free real estate for other events to occupy */ + scanunicode[i].key = 0; + } + } +} + static int _pg_put_event_unicode(SDL_Event *event, const char *uni) { - int i; - for (i = 0; i < MAX_SCAN_UNICODE; i++) { + _pg_del_event_unicode(event); + for (int i = 0; i < MAX_SCAN_UNICODE; i++) { if (!scanunicode[i].key) { #if SDL_VERSION_ATLEAST(3, 0, 0) scanunicode[i].key = event->key.scancode; @@ -304,17 +326,14 @@ _pg_put_event_unicode(SDL_Event *event, const char *uni) static PyObject * _pg_get_event_unicode(SDL_Event *event) { - /* We only deal with one byte here, but still declare an array to silence - * compiler warnings. The other 3 bytes are unused */ - char c[4]; - int i; - for (i = 0; i < MAX_SCAN_UNICODE; i++) { + for (int i = 0; i < MAX_SCAN_UNICODE; i++) { #if SDL_VERSION_ATLEAST(3, 0, 0) if (scanunicode[i].key == event->key.scancode) { #else if (scanunicode[i].key == event->key.keysym.scancode) { #endif - if (event->type == SDL_KEYUP) { + if (event->type == SDL_KEYUP || + PG_EventEnabled(_pg_pgevent_proxify(SDL_KEYUP)) == SDL_FALSE) { /* mark the position as free real estate for other * events to occupy. */ scanunicode[i].key = 0; @@ -323,12 +342,10 @@ _pg_get_event_unicode(SDL_Event *event) } } /* fallback to function that determines unicode from the event. - * We try to get the unicode attribute, and store it in memory*/ - *c = _pg_unicode_from_event(event); - if (_pg_put_event_unicode(event, c)) { - return _pg_get_event_unicode(event); - } - return PyUnicode_FromString(""); + * We don't need to store this in our cache because this is entirely + * determined from the event fields, and therefore needs no other info. */ + char fallback[] = {_pg_unicode_from_event(event), '\0'}; + return PyUnicode_FromString(fallback); } #define _PG_HANDLE_PROXIFY(name) \ @@ -602,6 +619,10 @@ pg_event_filter(void *_, SDL_Event *event) else if (event->type == SDL_KEYUP) { PG_LOCK_EVFILTER_MUTEX + /* Actual keyup is blocked, so clear unneeded cache if it exists */ + if (PG_EventEnabled(_pg_pgevent_proxify(SDL_KEYUP)) == SDL_FALSE) { + _pg_del_event_unicode(event); + } #if SDL_VERSION_ATLEAST(3, 0, 0) released_keys[event->key.scancode] = 1; if (_pg_repeat_timer && From 2b13c1f5e17d60ba1aa80536d5d63298125af4e0 Mon Sep 17 00:00:00 2001 From: Ankith Date: Wed, 26 Feb 2025 11:53:39 +0530 Subject: [PATCH 093/441] Get transform compiling on SDL3 --- src_c/_pygame.h | 2 +- src_c/meson.build | 3 - src_c/simd_transform.h | 28 +++++++-- src_c/simd_transform_avx2.c | 17 +++-- src_c/simd_transform_sse2.c | 19 +++--- src_c/transform.c | 120 +++++++++++++++++++++++++----------- 6 files changed, 125 insertions(+), 64 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 3bba7ed079..de230f2909 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -84,7 +84,7 @@ #define PG_SurfaceHasRLE SDL_SurfaceHasRLE #define PG_SoftStretchNearest(src, srcrect, dst, dstrect) \ - SDL_SoftStretch(src, srcrect, dst, dstrect, SDL_SCALEMODE_NEAREST) + SDL_StretchSurface(src, srcrect, dst, dstrect, SDL_SCALEMODE_NEAREST) /* Emulating SDL2 SDL_LockMutex API. In SDL3, it returns void. */ static inline int diff --git a/src_c/meson.build b/src_c/meson.build index fde0cf8fcc..0c1479a812 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -179,8 +179,6 @@ image = py.extension_module( subdir: pg, ) -# TODO: support SDL3 -if sdl_api != 3 simd_transform_avx2 = static_library( 'simd_transform_avx2', 'simd_transform_avx2.c', @@ -221,7 +219,6 @@ transform = py.extension_module( install: true, subdir: pg, ) -endif mask = py.extension_module( 'mask', diff --git a/src_c/simd_transform.h b/src_c/simd_transform.h index 45b85f651f..30f0379568 100644 --- a/src_c/simd_transform.h +++ b/src_c/simd_transform.h @@ -1,6 +1,24 @@ #define NO_PYGAME_C_API #include "_surface.h" +/* TODO: This compat code should probably go in some place like simd_shared.h + * That header file however is inconsistently used at the moment and not + * included wherever it should be. + * this block will be needed by simd_blitters and simd_fill */ + +#if PG_SDL3 +// SDL3 no longer includes intrinsics by default, we need to do it explicitly +#include + +/* If SDL_AVX2_INTRINSICS is defined by SDL3, we need to set macros that our + * code checks for avx2 build time support */ +#ifdef SDL_AVX2_INTRINSICS +#ifndef HAVE_IMMINTRIN_H +#define HAVE_IMMINTRIN_H 1 +#endif /* HAVE_IMMINTRIN_H*/ +#endif /* SDL_AVX2_INTRINSICS*/ +#endif /* PG_SDL3 */ + /** * MACRO borrowed from SSE2NEON - useful for making the shuffling family of * intrinsics easier to understand by indicating clearly what will go where. @@ -26,7 +44,8 @@ #if defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) void -grayscale_sse2(SDL_Surface *src, SDL_Surface *newsurf); +grayscale_sse2(SDL_Surface *src, PG_PixelFormat *src_fmt, + SDL_Surface *newsurf); // smoothscale filters void filter_shrink_X_SSE2(Uint8 *srcpix, Uint8 *dstpix, int height, int srcpitch, @@ -41,12 +60,13 @@ void filter_expand_Y_SSE2(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, int dstpitch, int srcheight, int dstheight); void -invert_sse2(SDL_Surface *src, SDL_Surface *newsurf); +invert_sse2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf); #endif /* (defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON)) */ // AVX2 functions void -grayscale_avx2(SDL_Surface *src, SDL_Surface *newsurf); +grayscale_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, + SDL_Surface *newsurf); void -invert_avx2(SDL_Surface *src, SDL_Surface *newsurf); +invert_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf); diff --git a/src_c/simd_transform_avx2.c b/src_c/simd_transform_avx2.c index 18c27ac355..b4582fe4a8 100644 --- a/src_c/simd_transform_avx2.c +++ b/src_c/simd_transform_avx2.c @@ -46,7 +46,7 @@ pg_avx2_at_runtime_but_uncompiled() #if defined(__AVX2__) && defined(HAVE_IMMINTRIN_H) && \ !defined(SDL_DISABLE_IMMINTRIN_H) void -grayscale_avx2(SDL_Surface *src, SDL_Surface *newsurf) +grayscale_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { /* See the SSE2 code for a simpler overview of this algorithm * Current AVX2 process @@ -85,12 +85,11 @@ grayscale_avx2(SDL_Surface *src, SDL_Surface *newsurf) Uint32 *srcp = (Uint32 *)src->pixels; Uint32 *dstp = (Uint32 *)newsurf->pixels; - Uint32 amask = src->format->Amask; + Uint32 amask = src_fmt->Amask; Uint32 rgbmask = ~amask; - int rgb_weights = - ((0x4C << src->format->Rshift) | (0x96 << src->format->Gshift) | - (0x1D << src->format->Bshift)); + int rgb_weights = ((0x4C << src_fmt->Rshift) | (0x96 << src_fmt->Gshift) | + (0x1D << src_fmt->Bshift)); __m256i *srcp256 = (__m256i *)src->pixels; __m256i *dstp256 = (__m256i *)newsurf->pixels; @@ -216,7 +215,7 @@ grayscale_avx2(SDL_Surface *src, SDL_Surface *newsurf) } void -invert_avx2(SDL_Surface *src, SDL_Surface *newsurf) +invert_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { int s_row_skip = (src->pitch - src->w * 4) / 4; @@ -237,7 +236,7 @@ invert_avx2(SDL_Surface *src, SDL_Surface *newsurf) Uint32 *srcp = (Uint32 *)src->pixels; Uint32 *dstp = (Uint32 *)newsurf->pixels; - Uint32 amask = src->format->Amask; + Uint32 amask = src_fmt->Amask; Uint32 rgbmask = ~amask; __m256i *srcp256 = (__m256i *)src->pixels; @@ -300,12 +299,12 @@ invert_avx2(SDL_Surface *src, SDL_Surface *newsurf) } #else void -grayscale_avx2(SDL_Surface *src, SDL_Surface *newsurf) +grayscale_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { BAD_AVX2_FUNCTION_CALL; } void -invert_avx2(SDL_Surface *src, SDL_Surface *newsurf) +invert_avx2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { BAD_AVX2_FUNCTION_CALL; } diff --git a/src_c/simd_transform_sse2.c b/src_c/simd_transform_sse2.c index 54176db107..5aebb26d1b 100644 --- a/src_c/simd_transform_sse2.c +++ b/src_c/simd_transform_sse2.c @@ -424,7 +424,7 @@ filter_expand_Y_SSE2(Uint8 *srcpix, Uint8 *dstpix, int width, int srcpitch, } void -grayscale_sse2(SDL_Surface *src, SDL_Surface *newsurf) +grayscale_sse2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { /* For the SSE2 SIMD version of grayscale we do one pixel at a time * Thus we can calculate the number of loops (and pixels) by multiplying @@ -460,16 +460,15 @@ grayscale_sse2(SDL_Surface *src, SDL_Surface *newsurf) Uint32 *srcp = (Uint32 *)src->pixels; Uint32 *dstp = (Uint32 *)newsurf->pixels; - Uint64 amask64 = ((Uint64)src->format->Amask) | src->format->Amask; + Uint64 amask64 = ((Uint64)src_fmt->Amask) | src_fmt->Amask; Uint64 rgbmask64 = ~amask64; Uint64 rgb_weights = - ((Uint64)((0x4C << src->format->Rshift) | - (0x96 << src->format->Gshift) | - (0x1D << src->format->Bshift)) + ((Uint64)((0x4C << src_fmt->Rshift) | (0x96 << src_fmt->Gshift) | + (0x1D << src_fmt->Bshift)) << 32) | - ((0x4C << src->format->Rshift) | (0x96 << src->format->Gshift) | - (0x1D << src->format->Bshift)); + ((0x4C << src_fmt->Rshift) | (0x96 << src_fmt->Gshift) | + (0x1D << src_fmt->Bshift)); Uint64 *srcp64 = (Uint64 *)src->pixels; Uint64 *dstp64 = (Uint64 *)newsurf->pixels; @@ -613,7 +612,7 @@ grayscale_sse2(SDL_Surface *src, SDL_Surface *newsurf) } void -invert_sse2(SDL_Surface *src, SDL_Surface *newsurf) +invert_sse2(SDL_Surface *src, PG_PixelFormat *src_fmt, SDL_Surface *newsurf) { int s_row_skip = (src->pitch - src->w * 4) / 4; @@ -638,8 +637,8 @@ invert_sse2(SDL_Surface *src, SDL_Surface *newsurf) __m128i *srcp128 = (__m128i *)src->pixels; __m128i *dstp128 = (__m128i *)newsurf->pixels; - mm_rgb_invert_mask = _mm_set1_epi32(~src->format->Amask); - mm_alpha_mask = _mm_set1_epi32(src->format->Amask); + mm_rgb_invert_mask = _mm_set1_epi32(~src_fmt->Amask); + mm_alpha_mask = _mm_set1_epi32(src_fmt->Amask); while (num_batches--) { perfect_4_pixels_batch_counter = perfect_4_pixels; diff --git a/src_c/transform.c b/src_c/transform.c index 82b1294eba..30a9e73022 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -95,7 +95,12 @@ _PgSurface_SrcAlpha(SDL_Surface *surf) { if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) { SDL_BlendMode mode; - if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (!SDL_GetSurfaceBlendMode(surf, &mode)) +#else + if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) +#endif + { return -1; } if (mode == SDL_BLENDMODE_BLEND) { @@ -1835,14 +1840,15 @@ _set_at_pixels(int x, int y, Uint8 *pixels, PG_PixelFormat *format, } static int -get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, - Uint32 color_search_color, Uint32 color_threshold, - Uint32 color_set_color, int set_behavior, - SDL_Surface *search_surf, int inverse_set) +get_threshold(SDL_Surface *dest_surf, PG_PixelFormat *dest_fmt, + SDL_Surface *surf, PG_PixelFormat *surf_fmt, + SDL_Palette *surf_palette, Uint32 color_search_color, + Uint32 color_threshold, Uint32 color_set_color, int set_behavior, + SDL_Surface *search_surf, PG_PixelFormat *search_surf_fmt, + SDL_Palette *search_surf_palette, int inverse_set) { int x, y, similar; Uint8 *pixels, *destpixels = NULL, *pixels2 = NULL; - SDL_PixelFormat *format; Uint32 the_color, the_color2, dest_set_color; Uint8 search_color_r, search_color_g, search_color_b; Uint8 surf_r, surf_g, surf_b; @@ -1852,7 +1858,6 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, int within_threshold; similar = 0; - format = surf->format; if (set_behavior) { destpixels = (Uint8 *)dest_surf->pixels; @@ -1861,10 +1866,10 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, pixels2 = (Uint8 *)search_surf->pixels; } - SDL_GetRGB(color_search_color, format, &search_color_r, &search_color_g, - &search_color_b); - SDL_GetRGB(color_threshold, format, &threshold_r, &threshold_g, - &threshold_b); + PG_GetRGB(color_search_color, surf_fmt, surf_palette, &search_color_r, + &search_color_g, &search_color_b); + PG_GetRGB(color_threshold, surf_fmt, surf_palette, &threshold_r, + &threshold_g, &threshold_b); for (y = 0; y < surf->h; y++) { pixels = (Uint8 *)surf->pixels + y * surf->pitch; @@ -1875,14 +1880,15 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, for (x = 0; x < surf->w; x++) { pixels = _get_color_move_pixels(PG_SURF_BytesPerPixel(surf), pixels, &the_color); - SDL_GetRGB(the_color, surf->format, &surf_r, &surf_g, &surf_b); + PG_GetRGB(the_color, surf_fmt, surf_palette, &surf_r, &surf_g, + &surf_b); if (search_surf) { /* Get search_surf.color */ pixels2 = _get_color_move_pixels( PG_SURF_BytesPerPixel(search_surf), pixels2, &the_color2); - SDL_GetRGB(the_color2, search_surf->format, &search_surf_r, - &search_surf_g, &search_surf_b); + PG_GetRGB(the_color2, search_surf_fmt, search_surf_palette, + &search_surf_r, &search_surf_g, &search_surf_b); /* search_surf(the_color2) is within threshold of * surf(the_color) */ @@ -1909,8 +1915,8 @@ get_threshold(SDL_Surface *dest_surf, SDL_Surface *surf, } if (set_behavior && ((within_threshold && inverse_set) || (!within_threshold && !inverse_set))) { - _set_at_pixels(x, y, destpixels, dest_surf->format, - dest_surf->pitch, dest_set_color); + _set_at_pixels(x, y, destpixels, dest_fmt, dest_surf->pitch, + dest_set_color); } } } @@ -2097,6 +2103,29 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) "surf and search_surf not the same size"); } + PG_PixelFormat *dest_fmt = NULL; + if (dest_surf) { + dest_fmt = PG_GetSurfaceFormat(dest_surf); + if (dest_fmt == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + } + + PG_PixelFormat *surf_format; + SDL_Palette *surf_palette; + if (!PG_GetSurfaceDetails(surf, &surf_format, &surf_palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + PG_PixelFormat *search_surf_format = NULL; + SDL_Palette *search_surf_palette = NULL; + if (search_surf) { + if (!PG_GetSurfaceDetails(search_surf, &search_surf_format, + &search_surf_palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + } + if (dest_surf) { pgSurface_Lock((pgSurfaceObject *)dest_surf_obj); } @@ -2106,9 +2135,10 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds) } Py_BEGIN_ALLOW_THREADS; - num_threshold_pixels = - get_threshold(dest_surf, surf, color_search_color, color_threshold, - color_set_color, set_behavior, search_surf, inverse_set); + num_threshold_pixels = get_threshold( + dest_surf, dest_fmt, surf, surf_format, surf_palette, + color_search_color, color_threshold, color_set_color, set_behavior, + search_surf, search_surf_format, search_surf_palette, inverse_set); Py_END_ALLOW_THREADS; if (dest_surf) { @@ -2292,11 +2322,11 @@ grayscale(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) src_format->Bmask == newsurf_format->Bmask && (src->pitch % 4 == 0) && (newsurf->pitch == (newsurf->w * 4))) { if (pg_has_avx2()) { - grayscale_avx2(src, newsurf); + grayscale_avx2(src, src_format, newsurf); } #if defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else if (pg_HasSSE_NEON()) { - grayscale_sse2(src, newsurf); + grayscale_sse2(src, src_format, newsurf); } #endif // defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else { @@ -2395,10 +2425,20 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, int src_lock = SDL_MUSTLOCK(src); int dst_lock = src != newsurf && SDL_MUSTLOCK(newsurf); - if (src_lock && SDL_LockSurface(src) < 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (src_lock && !SDL_LockSurface(src)) +#else + if (src_lock && SDL_LockSurface(src) < 0) +#endif + { return NULL; } - if (dst_lock && SDL_LockSurface(newsurf) < 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (dst_lock && !SDL_LockSurface(newsurf)) +#else + if (dst_lock && SDL_LockSurface(newsurf) < 0) +#endif + { if (src_lock) { SDL_UnlockSurface(src); } @@ -3156,7 +3196,8 @@ average_surfaces(SDL_Surface **surfaces, size_t num_surfaces, float div_inv; - SDL_PixelFormat *format, *destformat; + PG_PixelFormat *format, *destformat; + SDL_Palette *destpalette; Uint8 *pixels, *destpixels; Uint8 *pix; Uint8 *byte_buf; @@ -3173,14 +3214,16 @@ average_surfaces(SDL_Surface **surfaces, size_t num_surfaces, width = surfaces[0]->w; destpixels = (Uint8 *)destsurf->pixels; - destformat = destsurf->format; + if (!PG_GetSurfaceDetails(destsurf, &destformat, &destpalette)) { + return -1; + } /* allocate an array to accumulate them all. If we're using 1 byte per pixel, then only need to average on that much. */ - if ((PG_FORMAT_BytesPerPixel(destformat) == 1) && (destformat->palette) && + if ((PG_FORMAT_BytesPerPixel(destformat) == 1) && destpalette && (!palette_colors)) { num_elements = 1; } @@ -3201,23 +3244,26 @@ average_surfaces(SDL_Surface **surfaces, size_t num_surfaces, surf = surfaces[surf_idx]; pixels = (Uint8 *)surf->pixels; - format = surf->format; + format = PG_GetSurfaceFormat(surf); + if (!format) { + return -1; + } rmask = format->Rmask; gmask = format->Gmask; bmask = format->Bmask; rshift = format->Rshift; gshift = format->Gshift; bshift = format->Bshift; - rloss = format->Rloss; - gloss = format->Gloss; - bloss = format->Bloss; + rloss = PG_FORMAT_R_LOSS(format); + gloss = PG_FORMAT_G_LOSS(format); + bloss = PG_FORMAT_B_LOSS(format); the_idx = accumulate; /* If palette surface, we use a different code path... */ if ((PG_FORMAT_BytesPerPixel(format) == 1 && PG_FORMAT_BytesPerPixel(destformat) == 1) && - (format->palette) && (destformat->palette) && (!palette_colors)) { + PG_GetSurfacePalette(surf) && (destpalette) && (!palette_colors)) { /* This is useful if the surface is actually grayscale colors, and not palette colors. @@ -3274,10 +3320,10 @@ average_surfaces(SDL_Surface **surfaces, size_t num_surfaces, else if (num_elements == 3) { for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { - the_color = - SDL_MapRGB(destformat, (Uint8)(*(the_idx)*div_inv + .5f), - (Uint8)(*(the_idx + 1) * div_inv + .5f), - (Uint8)(*(the_idx + 2) * div_inv + .5f)); + the_color = PG_MapRGB(destformat, destpalette, + (Uint8)(*(the_idx)*div_inv + .5f), + (Uint8)(*(the_idx + 1) * div_inv + .5f), + (Uint8)(*(the_idx + 2) * div_inv + .5f)); /* TODO: should it take into consideration the output shifts/masks/losses? Or does SDL_MapRGB do that correctly? @@ -4145,11 +4191,11 @@ invert(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj) src_format->Bmask == newsurf_format->Bmask && (src->pitch % 4 == 0) && (newsurf->pitch == (newsurf->w * 4))) { if (pg_has_avx2()) { - invert_avx2(src, newsurf); + invert_avx2(src, src_format, newsurf); } #if defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else if (pg_HasSSE_NEON()) { - invert_sse2(src, newsurf); + invert_sse2(src, src_format, newsurf); } #endif // defined(__SSE2__) || defined(PG_ENABLE_ARM_NEON) else { From ddd68ec316f5dc4b6fef8937d5612d1a79feb70f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:35:18 +0000 Subject: [PATCH 094/441] Bump actions/cache from 4.2.1 to 4.2.2 Bumps [actions/cache](https://github.com/actions/cache) from 4.2.1 to 4.2.2. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4.2.1...v4.2.2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 6 +++--- .github/workflows/build-ubuntu-debug-python.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 81161fbc1c..bd8e17ea41 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -51,7 +51,7 @@ jobs: - name: Test for Mac Deps cache hit id: macdep-cache - uses: actions/cache@v4.2.1 + uses: actions/cache@v4.2.2 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} # The hash of all files in buildconfig manylinux-build and macdependencies is @@ -118,14 +118,14 @@ jobs: - uses: actions/checkout@v4.2.2 - name: pip cache - uses: actions/cache@v4.2.1 + uses: actions/cache@v4.2.2 with: path: ~/Library/Caches/pip # This cache path is only right on mac key: pip-cache-${{ matrix.macarch }}-${{ matrix.os }} - name: Fetch Mac deps id: macdep-cache - uses: actions/cache@v4.2.1 + uses: actions/cache@v4.2.2 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} key: macdep-${{ hashFiles('buildconfig/manylinux-build/**') }}-${{ hashFiles('buildconfig/macdependencies/*.sh') }}-${{ matrix.macarch }} diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index d7bb26a8b5..49e309d55e 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -84,7 +84,7 @@ jobs: - name: Cache debug python build id: cache-python - uses: actions/cache@v4.2.1 + uses: actions/cache@v4.2.2 with: key: ${{ matrix.python }} path: ~/.pyenv/versions/${{ matrix.python }}-debug/** From f526565b28e9611a0b0f01511d3e065dcde6a64f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:35:22 +0000 Subject: [PATCH 095/441] Bump docker/metadata-action from 5.6.1 to 5.7.0 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5.6.1 to 5.7.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/369eb591f429131d6889c46b94e711f089e6ca96...902fa8ec7d6ecbf8d84d538b9b233a880e428804) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index c077db7750..904bd63f7f 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -68,7 +68,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 with: images: ghcr.io/${{ github.repository }}_${{ matrix.arch }} tags: type=raw,value=${{ hashFiles('buildconfig/manylinux-build/**') }} From d2862c79670235f01207381742d0ae89a1131847 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:35:26 +0000 Subject: [PATCH 096/441] Bump docker/build-push-action from 6.14.0 to 6.15.0 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.14.0 to 6.15.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/0adf9959216b96bec444f325f1e493d4aa344497...471d1dc4e07e5cdedd4c2171150001c434f0b7a4) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index c077db7750..f57bb9c762 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -75,7 +75,7 @@ jobs: - name: Build and push Docker image if: steps.inspect.outcome == 'failure' - uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 + uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 with: context: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base file: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base/Dockerfile-${{ matrix.arch }} From 43e0094a923a006b6178036b754a3306ed02359a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:35:28 +0000 Subject: [PATCH 097/441] Bump pypa/cibuildwheel from 2.22.0 to 2.23.0 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 2.22.0 to 2.23.0. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v2.22.0...v2.23.0) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 81161fbc1c..e1c932f847 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -137,7 +137,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.22.0 + uses: pypa/cibuildwheel@v2.23.0 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index c077db7750..73ef5f6194 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -93,7 +93,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v2.22.0 + uses: pypa/cibuildwheel@v2.23.0 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 6d33abd640..567fe4c886 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -62,7 +62,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.22.0 + uses: pypa/cibuildwheel@v2.23.0 - uses: actions/upload-artifact@v4 with: From c63ea2ec3d87235e7c94742706706ed0bbb69d4f Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Mon, 3 Mar 2025 09:11:14 +0200 Subject: [PATCH 098/441] Bump SDL2 to 2.32.2, SDL3 to 3.2.6, SDL3_ttf to 3.2.0 (#3365) * bump sdl2 to 2.32.2 * bump SDL3 to 3.2.6 * bump SDL3_ttf to 3.2.0 --- buildconfig/download_win_prebuilt.py | 24 +++++++++---------- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 6fc5800faf..edad5d3292 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,12 +78,12 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.0/SDL2-devel-2.32.0-VC.zip', - 'e4b39b4b81ca1d3beef1935113c7820e8d3bd307', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.2/SDL2-devel-2.32.2-VC.zip', + '08737e7e813443e47b663be4d91f8a4d8de6916b', ], [ - 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.4/SDL3-devel-3.2.4-VC.zip', - '3576077236c7a66bf98d4b3d180aa4743ad5ce2e' + 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.6/SDL3-devel-3.2.6-VC.zip', + 'a36424427129f9ae133e59cfe070fc0b418d7fe0' ], [ 'https://github.com/pygame-community/SDL_image/releases/download/2.8.4-pgce/SDL2_image-devel-2.8.4-VCpgce.zip', @@ -98,8 +98,8 @@ def get_urls(x86=True, x64=True): '2d18b9a4fc2ec0eee80de2a946b088d4e6efd0ee' ], [ - 'https://github.com/libsdl-org/SDL_ttf/releases/download/preview-3.1.0/SDL3_ttf-devel-3.1.0-VC.zip', - '34bb4a03c6f0f6c9de3658bac98adc7029830578' + 'https://github.com/libsdl-org/SDL_ttf/releases/download/release-3.2.0/SDL3_ttf-devel-3.2.0-VC.zip', + '2883df767c9b8c910c10108242542ef36054a267' ], [ 'https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.1/SDL2_mixer-devel-2.8.1-VC.zip', @@ -258,34 +258,34 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL3_ttf-devel-3.1.0-VC/SDL3_ttf-3.1.0' + 'SDL3_ttf-devel-3.2.0-VC/SDL3_ttf-3.2.0' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3_ttf-3.1.0' + 'SDL3_ttf-3.2.0' ) ) copy( os.path.join( temp_dir, - 'SDL2-devel-2.32.0-VC/SDL2-2.32.0' + 'SDL2-devel-2.32.2-VC/SDL2-2.32.2' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.32.0' + 'SDL2-2.32.2' ) ) copy( os.path.join( temp_dir, - 'SDL3-devel-3.2.4-VC/SDL3-3.2.4' + 'SDL3-devel-3.2.6-VC/SDL3-3.2.6' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3-3.2.4' + 'SDL3-3.2.6' ) ) diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index d16a36bf15..34103c6349 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.32.0" +SDL2_VER="2.32.2" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.4" IMG2="SDL2_image-$IMG2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index 4e066cea67..110d13d866 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -a91b8105125f06118e8bfce2a5553fe053f7158dd02f06a36cfc535f09c401eb7da11072e576c6bf6e41fa2e02b08483b9cc4e11c658578b762e1b6c326a45bb SDL2-2.32.0.tar.gz +9a608974a69b97fd5589bf8feed4742498f8f07731bcd5b99dd518089acda8b9b4216197b6adf7ca79ef1a9fe47c542033eefe94763e66229b1d9ba5207da5c5 SDL2-2.32.2.tar.gz a4b7436442be43b96dc7b90c9badd011da1622e283ae068b82367fcb72b7dd7a0357aec5550fe44103a77da75b8c570d5204fff11a805373f2194f92b8f71343 SDL2_image-2.8.4.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index a3495574c0..e6b9a3cf12 100644 --- a/meson.build +++ b/meson.build @@ -109,10 +109,10 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.4' : '2.32.0' + sdl_ver = (sdl_api == 3) ? '3.2.6' : '2.32.2' sdl_image_ver = (sdl_api == 3) ? '3.2.0' : '2.8.4' sdl_mixer_ver = '2.8.1' - sdl_ttf_ver = (sdl_api == 3) ? '3.1.0' : '2.24.0' + sdl_ttf_ver = (sdl_api == 3) ? '3.2.0' : '2.24.0' dlls = [] From 82040ff3a93d2d2e10a550ea2bd5c5898bf386a8 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 3 Mar 2025 14:14:28 +0530 Subject: [PATCH 099/441] Bump base image version to be consistent with cibw --- buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-i686 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 index 3cfb17d12e..a1bf727ac2 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_aarch64:2024.11.16-1 +FROM quay.io/pypa/manylinux2014_aarch64:2025.02.23-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 index 2dc2995f51..83f2d3b413 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_i686:2024.11.16-1 +FROM quay.io/pypa/manylinux2014_i686:2025.02.23-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 index 5c46fa2681..251769a445 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_x86_64:2024.11.16-1 +FROM quay.io/pypa/manylinux2014_x86_64:2025.02.23-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" From c2be0c1a8a690ef007b346a7ed4410661c786fdb Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 3 Mar 2025 18:09:28 +0530 Subject: [PATCH 100/441] Add `image.load_animation` --- buildconfig/stubs/pygame/image.pyi | 1 + docs/reST/ref/image.rst | 22 ++++++++ examples/data/animated_sample.gif | Bin 0 -> 40316 bytes src_c/doc/image_doc.h | 1 + src_c/image.c | 20 ++++++++ src_c/imageext.c | 80 +++++++++++++++++++++++++++++ test/image_test.py | 31 +++++++++++ 7 files changed, 155 insertions(+) create mode 100644 examples/data/animated_sample.gif diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index bbce383799..3ec2809714 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -15,6 +15,7 @@ _from_bytes_format = Literal["P", "RGB", "RGBX", "RGBA", "ARGB", "BGRA", "ABGR"] def load(file: FileLike, namehint: str = "") -> Surface: ... def load_sized_svg(file: FileLike, size: Point) -> Surface: ... +def load_animation(file: FileLike, namehint: str = "") -> list[tuple[Surface, int]]: ... def save(surface: Surface, file: FileLike, namehint: str = "") -> None: ... def get_sdl_image_version(linked: bool = True) -> Optional[tuple[int, int, int]]: ... def get_extended() -> bool: ... diff --git a/docs/reST/ref/image.rst b/docs/reST/ref/image.rst index e851ccdf0e..e060c83f9f 100644 --- a/docs/reST/ref/image.rst +++ b/docs/reST/ref/image.rst @@ -135,6 +135,28 @@ following formats. .. ## pygame.image.load_sized_svg ## +.. function:: load_animation + + | :sl:`load an animation (GIF/WEBP) from a file (or file-like object)` + | :sg:`load_sized_svg(file, namehint="") -> list[tuple[Surface, int]]` + + Load an animation (GIF/WEBP) from a file source. You can pass either a + filename, a Python file-like object, or a pathlib.Path. If you pass a raw + file-like object, you may also want to pass the original filename as the + namehint argument so that the file extension can be used to infer the file + format. + + This returns a list of tuples (corresponding to every frame of the animation), + where each tuple is a (surface, delay) pair for that frame. + + This function requires SDL_image 2.6.0 or above. If pygame was compiled with + an older version, ``pygame.error`` will be raised when this function is + called. + + .. versionadded:: 2.5.4 + + .. ## pygame.image.load_sized_svg ## + .. function:: save | :sl:`save an image to file (or file-like object)` diff --git a/examples/data/animated_sample.gif b/examples/data/animated_sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..d41b6a1579eeeee5dda70b40d02c4b0f2a56971f GIT binary patch literal 40316 zcmY(q2T)T{*YAB&34{`Q=poe5B=o8Y(m@PC>1qhQSLtf#T|<$MhTb*wB4_|XL{X3; zMHEy}!GaxZd_3=S?|kN@5C~USR}>0?LZKq94}XY3p;6u4-P7aaXcUS{ zrQ&cHG#Z6Qqpk7ywzjsMoScM&1ZzAlhfKtvQHS4cZEayNXbcA9>Pp6AFhn8|hek(6 zM&fZ8eSQ7u>1iSk)7{;M!{Nrq#{mE!;&FHkI)Q9WCX=bIuIR(h0aPkcKOrH~m8k!5 zYb(W?cxWXWg;Zg#2b(KX4MEyu>>xJ=g zG9F)9S$Symp_4hThhE|jW8tc=-`&>cs*gFG%=$m}50mjYvMYJGyA6*LNVO(XsR2c<)?^~ll}tvV&_zX+b^i%o3e}aG z6G=^pq;^;41h^6p-A=I94T!}Uez zV^D`Vkz#FqxY_`K&?oAX4{wbpVla3r5&e8&dc3W!($(4(kE%ReL4EXLn2T}}>WXrv zrx%Ea0k=NPIus6rJB$hykDeaxPI1*ApB|@L;}^yc)2#b2l&)0Q?zZj(YYa8u&;&eH zU*FoAJbY+YWzoX)!pE(TCErMz)`zy>sIKJk@#({yBI*+( zBLgBM6Ap9iznAm@($4IZ!*L?XOhZi_0y-R({&z&t6Q`lBj>ix~{DVEB{6j-9<{q9= zp%HNyRZL7wjGD*cxX*t_)I39j0qK1xlm|EfRQ_|*|2$a$;s6jvh+8rlBPj@eCHF~Y z^;iZ<#=6q7qh>q@tr_ravZMCi70mH$ajVX{`-O@QE$;U_>mQV;drnnabu~;^=tXWn zyWiFL_&OnlL&CbdX|~p~Q0dH6ck^5$sn)v6x~FBK)wwHRZK|jB=}pR5wuDV@+j5uR zT+5jUz3r=gVXvmDZ2E4j-HQFXz4oB*=8HQt2vX9vpSdxX$*+9&VSmS~dvqC_YqkTO zn-5Ag1D`(}=z8;*aXd%z#9;Tkxh99!v(tk;J5QOO53ZfK)%#(!KXT{!^sT;6FIXu^ zDZ8Qm&#xv6mCrpI8uXu~%&GHsJq2a1xREO0=(mxE z_G#Kk7mtp;CaRE$p(9k77%*7KSv@HOnMEP;Vl&l8kUU0Avpj7_^%1CqGZT~p8Sft# z(s+{jDqmal9Sst|R0Q*?427j4EL8RZh_fVPvzSw*d6Sot-6V~~1+i${V(#?K;-Jpu z%>wSIeK1laglWRT_I8F)kr?r=0pe<~3r@$;!$v>~;@jTWb0sOXVovcHAnTa5q6s@* zZ@zzW&S`wRrv-7w&CTkrM`g#E74 z4)e-HKjwz)`*>M6+KUeA;<2O=VO68-euw`VsIgwzCRgQTwHaqnPdgPgI`EK6tGl}R zrCAlUI&mu)0=FYU5z>U6*6xSo){i%@_u`a?cBgKsa)PtfCpcuZ-tQtF8B~P8{`^Dk zHsnjvKZBqGLA$+Ie<&mi+tC9ept89$AI7+BREXWeUzNf*B`%2{=fXNw(>Rn&)sr9d z#3X>Gc=swJ?()e>XjTSIxOEN16su1*|G4iAX;$K#)|iqNnC_{rYj~ys|MPE~z;qK` z55FgQ$@aWSZ+RozmOs(ttcp_}?o|3RXZs@{f$=tbJg?84n>BBDDk`BrC$p$WV4JPWk- zD2tg~op|XQaV+W8nZ&!ix`{~~vZfE)o@j*PfSoS|yRjx>DjZ53D^s_KxoVghBHL64 zYZo?s?03ZYv_{UK-;-BRKR)x_Z2k2u%a;Wj

    5^m|ZWQAcYo^_=hNnc@tJxo4Qfv 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 mHUkcDvvNHk{je?0ZxG+ Surface\nload(file, namehint="") -> Surface\nload new image from a file (or file-like object)" #define DOC_IMAGE_LOADSIZEDSVG "load_sized_svg(file, size) -> Surface\nload an SVG image from a file (or file-like object) with the given size" +#define DOC_IMAGE_LOADANIMATION "load_sized_svg(file, namehint="") -> list[tuple[Surface, int]]\nload an animation (GIF/WEBP) from a file (or file-like object)" #define DOC_IMAGE_SAVE "save(Surface, file) -> None\nsave(Surface, file, namehint="") -> None\nsave an image to file (or file-like object)" #define DOC_IMAGE_GETSDLIMAGEVERSION "get_sdl_image_version(linked=True) -> None\nget_sdl_image_version(linked=True) -> (major, minor, patch)\nget version number of the SDL_Image library being used" #define DOC_IMAGE_GETEXTENDED "get_extended() -> bool\ntest if extended image formats can be loaded" diff --git a/src_c/image.c b/src_c/image.c index f9176a00ba..96269b7140 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -49,6 +49,7 @@ static PyObject *extloadobj = NULL; static PyObject *extsaveobj = NULL; static PyObject *extverobj = NULL; static PyObject *ext_load_sized_svg = NULL; +static PyObject *ext_load_animation = NULL; static inline void pad(char **data, int padding) @@ -1885,6 +1886,17 @@ image_load_sized_svg(PyObject *self, PyObject *args, PyObject *kwargs) "Support for sized svg image loading was not compiled in."); } +static PyObject * +image_load_animation(PyObject *self, PyObject *args, PyObject *kwargs) +{ + if (ext_load_animation) { + return PyObject_Call(ext_load_animation, args, kwargs); + } + + return RAISE(PyExc_NotImplementedError, + "Support for sized svg image loading was not compiled in."); +} + static PyMethodDef _image_methods[] = { {"load_basic", (PyCFunction)image_load_basic, METH_O, DOC_IMAGE_LOADBASIC}, {"load_extended", (PyCFunction)image_load_extended, @@ -1893,6 +1905,8 @@ static PyMethodDef _image_methods[] = { DOC_IMAGE_LOAD}, {"load_sized_svg", (PyCFunction)image_load_sized_svg, METH_VARARGS | METH_KEYWORDS, DOC_IMAGE_LOADSIZEDSVG}, + {"load_animation", (PyCFunction)image_load_animation, + METH_VARARGS | METH_KEYWORDS, DOC_IMAGE_LOADANIMATION}, {"save_extended", (PyCFunction)image_save_extended, METH_VARARGS | METH_KEYWORDS, DOC_IMAGE_SAVEEXTENDED}, @@ -1973,6 +1987,11 @@ MODINIT_DEFINE(image) if (!ext_load_sized_svg) { goto error; } + ext_load_animation = + PyObject_GetAttrString(extmodule, "_load_animation"); + if (!ext_load_animation) { + goto error; + } Py_DECREF(extmodule); } else { @@ -1986,6 +2005,7 @@ MODINIT_DEFINE(image) Py_XDECREF(extsaveobj); Py_XDECREF(extverobj); Py_XDECREF(ext_load_sized_svg); + Py_XDECREF(ext_load_animation); Py_DECREF(extmodule); Py_DECREF(module); return NULL; diff --git a/src_c/imageext.c b/src_c/imageext.c index 78d0aed7e4..2d5bbe1e44 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -206,6 +206,84 @@ imageext_load_sized_svg(PyObject *self, PyObject *arg, PyObject *kwargs) #endif /* ~SDL_IMAGE_VERSION_ATLEAST(2, 6, 0) */ } +static PyObject * +imageext_load_animation(PyObject *self, PyObject *arg, PyObject *kwargs) +{ +#if SDL_IMAGE_VERSION_ATLEAST(2, 6, 0) + PyObject *obj, *ret = NULL; + char *name = NULL, *ext = NULL, *type = NULL; + IMG_Animation *surfs = NULL; + SDL_RWops *rw = NULL; + static char *kwds[] = {"file", "namehint", NULL}; + + if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O|s", kwds, &obj, &name)) { + return NULL; + } + + rw = pgRWops_FromObject(obj, &ext); + if (rw == NULL) { /* stop on NULL, error already set */ + return NULL; + } + + if (name) { /* override extension with namehint if given */ + type = (name[0] != '\0') ? iext_find_extension(name) : NULL; + } + else { /* Otherwise type should be whatever ext is, even if ext is NULL */ + type = ext; + } + + Py_BEGIN_ALLOW_THREADS; +#if SDL_VERSION_ATLEAST(3, 0, 0) + surfs = IMG_LoadAnimationTyped_IO(rw, 1, type); +#else + surfs = IMG_LoadAnimationTyped_RW(rw, 1, type); +#endif + Py_END_ALLOW_THREADS; + + if (ext) { + free(ext); + } + + if (surfs == NULL) { + return RAISE(pgExc_SDLError, IMG_GetError()); + } + + ret = PyList_New(surfs->count); + if (!ret) { + goto error; + } + + for (int i = 0; i < surfs->count; i++) { + PyObject *frame = (PyObject *)pgSurface_New(surfs->frames[i]); + if (!frame) { + /* IMG_FreeAnimation takes care of freeing of member SDL surfaces + */ + goto error; + } + /* The python surface object now "owns" the sdl surface, so set it + * to null in the animation to prevent double free */ + surfs->frames[i] = NULL; + + PyObject *listentry = Py_BuildValue("(Oi)", frame, surfs->delays[i]); + Py_DECREF(frame); + if (!listentry) { + goto error; + } + PyList_SET_ITEM(ret, i, listentry); + } + IMG_FreeAnimation(surfs); + return ret; +error: + Py_XDECREF(ret); + IMG_FreeAnimation(surfs); + return NULL; +#else /* ~SDL_IMAGE_VERSION_ATLEAST(2, 6, 0) */ + return RAISE( + pgExc_SDLError, + "pygame must be compiled with SDL_image 2.6.0+ to use this function"); +#endif /* ~SDL_IMAGE_VERSION_ATLEAST(2, 6, 0) */ +} + static PyObject * image_save_ext(PyObject *self, PyObject *arg, PyObject *kwarg) { @@ -352,6 +430,8 @@ static PyMethodDef _imageext_methods[] = { "Note: Should not be used directly."}, {"_load_sized_svg", (PyCFunction)imageext_load_sized_svg, METH_VARARGS | METH_KEYWORDS, "Note: Should not be used directly."}, + {"_load_animation", (PyCFunction)imageext_load_animation, + METH_VARARGS | METH_KEYWORDS, "Note: Should not be used directly."}, {NULL, NULL, 0, NULL}}; /*DOC*/ static char _imageext_doc[] = diff --git a/test/image_test.py b/test/image_test.py index eaeef65075..f504ffb38a 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -1360,6 +1360,37 @@ def test_load_sized_svg_erroring(self): value_error_size, ) + @unittest.skipIf( + pygame.image.get_sdl_image_version() < (2, 6, 0), + "load_sized_svg requires SDL_image 2.6.0+", + ) + def test_load_animation(self): + # test loading from a file + SAMPLE_FRAMES = 10 + SAMPLE_DELAY = 150 + SAMPLE_SIZE = (312, 312) + gif_path = pathlib.Path(example_path("data/animated_sample.gif")) + for inp in ( + (str(gif_path),), # string path, no namehint + (gif_path,), # pathlib.Path path, no namehint + (io.BytesIO(gif_path.read_bytes()),), # file-like object, no namehint + ( + io.BytesIO(gif_path.read_bytes()), + gif_path.name, + ), # file-like object, with namehint + ): + with self.subTest(f"Test load_animation", inp=inp): + s = pygame.image.load_animation(*inp) + self.assertIsInstance(s, list) + self.assertEqual(len(s), SAMPLE_FRAMES) + for val in s: + self.assertIsInstance(val, tuple) + frame, delay = val + self.assertIsInstance(frame, pygame.Surface) + self.assertEqual(frame.size, SAMPLE_SIZE) + self.assertIsInstance(delay, int) + self.assertEqual(delay, SAMPLE_DELAY) + def test_load_pathlib(self): """works loading using a Path argument.""" path = pathlib.Path(example_path("data/asprite.bmp")) From 93fa8e0b4b279fd445fb77fb5202be16897fc2bc Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 3 Mar 2025 19:34:17 +0000 Subject: [PATCH 101/441] Fix load_animation func name in docs --- docs/reST/ref/image.rst | 4 ++-- src_c/doc/image_doc.h | 2 +- src_c/image.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reST/ref/image.rst b/docs/reST/ref/image.rst index e060c83f9f..68cec4639a 100644 --- a/docs/reST/ref/image.rst +++ b/docs/reST/ref/image.rst @@ -138,7 +138,7 @@ following formats. .. function:: load_animation | :sl:`load an animation (GIF/WEBP) from a file (or file-like object)` - | :sg:`load_sized_svg(file, namehint="") -> list[tuple[Surface, int]]` + | :sg:`load_animation(file, namehint="") -> list[tuple[Surface, int]]` Load an animation (GIF/WEBP) from a file source. You can pass either a filename, a Python file-like object, or a pathlib.Path. If you pass a raw @@ -155,7 +155,7 @@ following formats. .. versionadded:: 2.5.4 - .. ## pygame.image.load_sized_svg ## + .. ## pygame.image.load_animation ## .. function:: save diff --git a/src_c/doc/image_doc.h b/src_c/doc/image_doc.h index 11fd1bdba4..899f5d7c58 100644 --- a/src_c/doc/image_doc.h +++ b/src_c/doc/image_doc.h @@ -2,7 +2,7 @@ #define DOC_IMAGE "pygame module for image transfer" #define DOC_IMAGE_LOAD "load(file) -> Surface\nload(file, namehint="") -> Surface\nload new image from a file (or file-like object)" #define DOC_IMAGE_LOADSIZEDSVG "load_sized_svg(file, size) -> Surface\nload an SVG image from a file (or file-like object) with the given size" -#define DOC_IMAGE_LOADANIMATION "load_sized_svg(file, namehint="") -> list[tuple[Surface, int]]\nload an animation (GIF/WEBP) from a file (or file-like object)" +#define DOC_IMAGE_LOADANIMATION "load_animation(file, namehint="") -> list[tuple[Surface, int]]\nload an animation (GIF/WEBP) from a file (or file-like object)" #define DOC_IMAGE_SAVE "save(Surface, file) -> None\nsave(Surface, file, namehint="") -> None\nsave an image to file (or file-like object)" #define DOC_IMAGE_GETSDLIMAGEVERSION "get_sdl_image_version(linked=True) -> None\nget_sdl_image_version(linked=True) -> (major, minor, patch)\nget version number of the SDL_Image library being used" #define DOC_IMAGE_GETEXTENDED "get_extended() -> bool\ntest if extended image formats can be loaded" diff --git a/src_c/image.c b/src_c/image.c index 96269b7140..e4f9cf70f9 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -1894,7 +1894,7 @@ image_load_animation(PyObject *self, PyObject *args, PyObject *kwargs) } return RAISE(PyExc_NotImplementedError, - "Support for sized svg image loading was not compiled in."); + "Support for animation loading was not compiled in."); } static PyMethodDef _image_methods[] = { From 07a37e9d54150280a5db90665a63f84944ad869a Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 6 Mar 2025 12:23:03 +0530 Subject: [PATCH 102/441] Use strlen in empty string check, fix test comment --- src_c/imageext.c | 2 +- test/image_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/imageext.c b/src_c/imageext.c index 2d5bbe1e44..5e39e62d02 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -226,7 +226,7 @@ imageext_load_animation(PyObject *self, PyObject *arg, PyObject *kwargs) } if (name) { /* override extension with namehint if given */ - type = (name[0] != '\0') ? iext_find_extension(name) : NULL; + type = (strlen(name) != 0) ? iext_find_extension(name) : NULL; } else { /* Otherwise type should be whatever ext is, even if ext is NULL */ type = ext; diff --git a/test/image_test.py b/test/image_test.py index f504ffb38a..3d0f8f21e5 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -1362,7 +1362,7 @@ def test_load_sized_svg_erroring(self): @unittest.skipIf( pygame.image.get_sdl_image_version() < (2, 6, 0), - "load_sized_svg requires SDL_image 2.6.0+", + "load_animation requires SDL_image 2.6.0+", ) def test_load_animation(self): # test loading from a file From 943a7aeb024067359d1fd1b7defcca29089de137 Mon Sep 17 00:00:00 2001 From: damusss Date: Thu, 6 Mar 2025 16:32:32 +0100 Subject: [PATCH 103/441] Convert most tutorial assets to WEBP --- docs/reST/ref/bufferproxy.rst | 4 +-- .../tutorials/assets/AdvancedInputOutput1.gif | Bin 5649 -> 0 bytes .../assets/AdvancedInputOutput1.webp | Bin 0 -> 2690 bytes .../tutorials/assets/AdvancedInputOutput2.gif | Bin 72233 -> 0 bytes .../assets/AdvancedInputOutput2.webp | Bin 0 -> 64812 bytes .../tutorials/assets/AdvancedInputOutput3.gif | Bin 6294 -> 0 bytes .../assets/AdvancedInputOutput3.webp | Bin 0 -> 2354 bytes .../tutorials/assets/AdvancedInputOutput4.gif | Bin 29185 -> 0 bytes .../assets/AdvancedInputOutput4.webp | Bin 0 -> 27158 bytes .../tutorials/assets/AdvancedOutputAlpha1.gif | Bin 14915 -> 0 bytes .../assets/AdvancedOutputAlpha1.webp | Bin 0 -> 5690 bytes .../tutorials/assets/AdvancedOutputAlpha2.gif | Bin 71819 -> 0 bytes .../assets/AdvancedOutputAlpha2.webp | Bin 0 -> 65024 bytes .../tutorials/assets/AdvancedOutputAlpha3.gif | Bin 30380 -> 0 bytes .../assets/AdvancedOutputAlpha3.webp | Bin 0 -> 25066 bytes .../assets/AdvancedOutputProcess1.gif | Bin 15951 -> 0 bytes .../assets/AdvancedOutputProcess1.webp | Bin 0 -> 6824 bytes .../assets/AdvancedOutputProcess2.gif | Bin 1868 -> 0 bytes .../assets/AdvancedOutputProcess2.webp | Bin 0 -> 622 bytes .../assets/AdvancedOutputProcess3.gif | Bin 1912 -> 0 bytes .../assets/AdvancedOutputProcess3.webp | Bin 0 -> 626 bytes .../assets/AdvancedOutputProcess4.gif | Bin 14500 -> 0 bytes .../assets/AdvancedOutputProcess4.webp | Bin 0 -> 6140 bytes .../assets/AdvancedOutputProcess5.gif | Bin 16896 -> 0 bytes .../assets/AdvancedOutputProcess5.webp | Bin 0 -> 15766 bytes .../assets/AdvancedOutputProcess6.gif | Bin 34058 -> 0 bytes .../assets/AdvancedOutputProcess6.webp | Bin 0 -> 31288 bytes .../assets/Bagic-INPUT-resultscreen.png | Bin 5973 -> 0 bytes .../assets/Bagic-INPUT-resultscreen.webp | Bin 0 -> 3724 bytes .../assets/Bagic-INPUT-sourcecode.png | Bin 77061 -> 0 bytes .../assets/Bagic-INPUT-sourcecode.webp | Bin 0 -> 32280 bytes .../assets/Bagic-PROCESS-resultscreen.png | Bin 5348 -> 0 bytes .../assets/Bagic-PROCESS-resultscreen.webp | Bin 0 -> 3194 bytes .../assets/Bagic-PROCESS-sourcecode.png | Bin 66070 -> 0 bytes .../assets/Bagic-PROCESS-sourcecode.webp | Bin 0 -> 27278 bytes .../assets/Bagic-ouput-result-screen.png | Bin 4819 -> 0 bytes .../assets/Bagic-ouput-result-screen.webp | Bin 0 -> 2908 bytes .../assets/Basic-ouput-sourcecode.png | Bin 57466 -> 0 bytes .../assets/Basic-ouput-sourcecode.webp | Bin 0 -> 25636 bytes docs/reST/tutorials/assets/chimpshot.gif | Bin 46010 -> 0 bytes docs/reST/tutorials/assets/chimpshot.webp | Bin 0 -> 28298 bytes docs/reST/tutorials/assets/intro_ball.gif | Bin 5015 -> 0 bytes docs/reST/tutorials/assets/intro_ball.webp | Bin 0 -> 3588 bytes .../assets/introduction-Battleship.png | Bin 165586 -> 0 bytes .../assets/introduction-Battleship.webp | Bin 0 -> 110422 bytes .../assets/introduction-PuyoPuyo.png | Bin 31388 -> 0 bytes .../assets/introduction-PuyoPuyo.webp | Bin 0 -> 18040 bytes .../tutorials/assets/introduction-TPS.png | Bin 136031 -> 0 bytes .../tutorials/assets/introduction-TPS.webp | Bin 0 -> 95120 bytes .../premultiplied_alpha_composition.png | Bin 10491 -> 0 bytes .../premultiplied_alpha_composition.webp | Bin 0 -> 4524 bytes .../assets/straight_alpha_composition.png | Bin 10119 -> 0 bytes .../assets/straight_alpha_composition.webp | Bin 0 -> 4270 bytes docs/reST/tutorials/assets/surfarray.png | Bin 50836 -> 0 bytes docs/reST/tutorials/assets/surfarray.webp | Bin 0 -> 38938 bytes .../tutorials/assets/surfarray_allblack.png | Bin 125 -> 0 bytes .../tutorials/assets/surfarray_allblack.webp | Bin 0 -> 42 bytes .../tutorials/assets/surfarray_flipped.png | Bin 50835 -> 0 bytes .../tutorials/assets/surfarray_flipped.webp | Bin 0 -> 38804 bytes .../tutorials/assets/surfarray_redimg.png | Bin 23443 -> 0 bytes .../tutorials/assets/surfarray_redimg.webp | Bin 0 -> 15926 bytes .../tutorials/assets/surfarray_rgbarray.png | Bin 50897 -> 0 bytes .../tutorials/assets/surfarray_rgbarray.webp | Bin 0 -> 38938 bytes .../tutorials/assets/surfarray_scaledown.png | Bin 15109 -> 0 bytes .../tutorials/assets/surfarray_scaledown.webp | Bin 0 -> 12840 bytes .../tutorials/assets/surfarray_scaleup.png | Bin 67759 -> 0 bytes .../tutorials/assets/surfarray_scaleup.webp | Bin 0 -> 47414 bytes .../tutorials/assets/surfarray_soften.png | Bin 47540 -> 0 bytes .../tutorials/assets/surfarray_soften.webp | Bin 0 -> 34530 bytes .../tutorials/assets/surfarray_striped.png | Bin 392 -> 0 bytes .../tutorials/assets/surfarray_striped.webp | Bin 0 -> 52 bytes .../reST/tutorials/assets/surfarray_xfade.png | Bin 41834 -> 0 bytes .../tutorials/assets/surfarray_xfade.webp | Bin 0 -> 30274 bytes docs/reST/tutorials/assets/tom_basic.png | Bin 5139 -> 0 bytes docs/reST/tutorials/assets/tom_basic.webp | Bin 0 -> 4522 bytes .../tutorials/assets/tom_event-flowchart.png | Bin 5528 -> 0 bytes .../tutorials/assets/tom_event-flowchart.webp | Bin 0 -> 2670 bytes docs/reST/tutorials/assets/tom_formulae.png | Bin 6763 -> 0 bytes docs/reST/tutorials/assets/tom_formulae.webp | Bin 0 -> 2626 bytes docs/reST/tutorials/assets/tom_radians.png | Bin 17409 -> 0 bytes docs/reST/tutorials/assets/tom_radians.webp | Bin 0 -> 9758 bytes .../en/Red_or_Black/1.Prolog/introduction.rst | 12 ++++----- .../Basic TEMPLATE and OUTPUT.rst | 8 +++--- .../3.Move_text/Basic PROCESS.rst | 8 +++--- .../4.Control_text/Basic INPUT.rst | 8 +++--- .../Advanced OUTPUT with Advanced PROCESS.rst | 24 +++++++++--------- .../Advanced INPUT with Advanced OUTPUT.rst | 16 ++++++------ .../Advanced OUTPUT and plus alpha.rst | 12 ++++----- docs/reST/tutorials/en/chimp-explanation.rst | 2 +- docs/reST/tutorials/en/intro-to-pygame.rst | 4 +-- docs/reST/tutorials/en/intro-to-surfarray.rst | 20 +++++++-------- .../reST/tutorials/en/premultiplied-alpha.rst | 4 +-- docs/reST/tutorials/en/tom-games2.rst | 2 +- docs/reST/tutorials/en/tom-games4.rst | 4 +-- docs/reST/tutorials/en/tom-games5.rst | 2 +- .../tutorials/es/ChimpanceLineaporLinea.rst | 2 +- .../\354\206\214\352\260\234.rst" | 12 ++++----- ...\352\263\274 \354\266\234\353\240\245.rst" | 8 +++--- ...\354\264\210 \354\262\230\353\246\254.rst" | 8 +++--- ...\354\264\210 \354\236\205\353\240\245.rst" | 8 +++--- ...\355\231\224 \354\262\230\353\246\254.rst" | 24 +++++++++--------- ...\355\231\224 \354\266\234\353\240\245.rst" | 16 ++++++------ ...\354\241\260\352\270\210 \353\215\224.rst" | 12 ++++----- 103 files changed, 110 insertions(+), 110 deletions(-) delete mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput1.gif create mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput1.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput2.gif create mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput2.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput3.gif create mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput3.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput4.gif create mode 100644 docs/reST/tutorials/assets/AdvancedInputOutput4.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha1.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha1.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha2.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha2.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha3.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputAlpha3.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess1.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess1.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess2.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess2.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess3.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess3.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess4.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess4.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess5.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess5.webp delete mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess6.gif create mode 100644 docs/reST/tutorials/assets/AdvancedOutputProcess6.webp delete mode 100644 docs/reST/tutorials/assets/Bagic-INPUT-resultscreen.png create mode 100644 docs/reST/tutorials/assets/Bagic-INPUT-resultscreen.webp delete mode 100644 docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.png create mode 100644 docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.webp delete mode 100644 docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.png create mode 100644 docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.webp delete mode 100644 docs/reST/tutorials/assets/Bagic-PROCESS-sourcecode.png create mode 100644 docs/reST/tutorials/assets/Bagic-PROCESS-sourcecode.webp delete mode 100644 docs/reST/tutorials/assets/Bagic-ouput-result-screen.png create mode 100644 docs/reST/tutorials/assets/Bagic-ouput-result-screen.webp delete mode 100644 docs/reST/tutorials/assets/Basic-ouput-sourcecode.png create mode 100644 docs/reST/tutorials/assets/Basic-ouput-sourcecode.webp delete mode 100644 docs/reST/tutorials/assets/chimpshot.gif create mode 100644 docs/reST/tutorials/assets/chimpshot.webp delete mode 100644 docs/reST/tutorials/assets/intro_ball.gif create mode 100644 docs/reST/tutorials/assets/intro_ball.webp delete mode 100644 docs/reST/tutorials/assets/introduction-Battleship.png create mode 100644 docs/reST/tutorials/assets/introduction-Battleship.webp delete mode 100644 docs/reST/tutorials/assets/introduction-PuyoPuyo.png create mode 100644 docs/reST/tutorials/assets/introduction-PuyoPuyo.webp delete mode 100644 docs/reST/tutorials/assets/introduction-TPS.png create mode 100644 docs/reST/tutorials/assets/introduction-TPS.webp delete mode 100644 docs/reST/tutorials/assets/premultiplied_alpha_composition.png create mode 100644 docs/reST/tutorials/assets/premultiplied_alpha_composition.webp delete mode 100644 docs/reST/tutorials/assets/straight_alpha_composition.png create mode 100644 docs/reST/tutorials/assets/straight_alpha_composition.webp delete mode 100644 docs/reST/tutorials/assets/surfarray.png create mode 100644 docs/reST/tutorials/assets/surfarray.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_allblack.png create mode 100644 docs/reST/tutorials/assets/surfarray_allblack.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_flipped.png create mode 100644 docs/reST/tutorials/assets/surfarray_flipped.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_redimg.png create mode 100644 docs/reST/tutorials/assets/surfarray_redimg.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_rgbarray.png create mode 100644 docs/reST/tutorials/assets/surfarray_rgbarray.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_scaledown.png create mode 100644 docs/reST/tutorials/assets/surfarray_scaledown.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_scaleup.png create mode 100644 docs/reST/tutorials/assets/surfarray_scaleup.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_soften.png create mode 100644 docs/reST/tutorials/assets/surfarray_soften.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_striped.png create mode 100644 docs/reST/tutorials/assets/surfarray_striped.webp delete mode 100644 docs/reST/tutorials/assets/surfarray_xfade.png create mode 100644 docs/reST/tutorials/assets/surfarray_xfade.webp delete mode 100644 docs/reST/tutorials/assets/tom_basic.png create mode 100644 docs/reST/tutorials/assets/tom_basic.webp delete mode 100644 docs/reST/tutorials/assets/tom_event-flowchart.png create mode 100644 docs/reST/tutorials/assets/tom_event-flowchart.webp delete mode 100644 docs/reST/tutorials/assets/tom_formulae.png create mode 100644 docs/reST/tutorials/assets/tom_formulae.webp delete mode 100644 docs/reST/tutorials/assets/tom_radians.png create mode 100644 docs/reST/tutorials/assets/tom_radians.webp diff --git a/docs/reST/ref/bufferproxy.rst b/docs/reST/ref/bufferproxy.rst index 79f574a97c..04c3732659 100644 --- a/docs/reST/ref/bufferproxy.rst +++ b/docs/reST/ref/bufferproxy.rst @@ -57,8 +57,8 @@ ``"before"`` : callable : (optional) Callback invoked when the :class:`BufferProxy` instance exports the buffer. The callback is given one argument, the - ``"parent"`` object if given, otherwise ``None``. - The callback is useful for setting a lock on the parent. + ``"parent"`` object if given, otherwise ``None``. + The callback is useful for setting a lock on the parent. ``"after"`` : callable : (optional) Callback invoked when an exported buffer is released. diff --git a/docs/reST/tutorials/assets/AdvancedInputOutput1.gif b/docs/reST/tutorials/assets/AdvancedInputOutput1.gif deleted file mode 100644 index 8c7f7ea6cf081eb9207c551c460ad0472e9e364e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5649 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≀A%v#M z320od*XzEs>&hT~w59*ct;PEyjZMEIWw06$*%LC^!>Ll1jRBbbg1(GgB76%-T}+5rIDb$x{09Mxbk+bm~( z+l<&r++Drx+CJ-k!fo5ftJq#lyKD`;rV4xn2Dnae&a?^L-W_|>jRdl7-Lp*Ei>=*s z4Rk$#(0r{cxC`F*)pD%I z397|7oXuTq-}=1MO9#h(YtUb8d`4cx9BQguU3euprMm3heT=p1o!zRuoPxLAlNzBU zP06kI+TSd3=$WB{d*!zy<4$R{$*h1G=Sa;Q=4DRKu_xw<&9zXP*99ZuTVA+F&SY6e z=@?ex?}FSB5aqwT$xod)6xySp+$zRA%H~$eQGLoKypW{K%6Kl#sut1a3Ocq-z8OB| zzzw0?i_y)EevPcib_ePyzDa<`!z@b75hu!78k?Mse_j4Gu>Q`o4(NG1=j{#8?0ck` zKDg`cyq$8V>C5Wmc1IJ&4r$>$&{>>sC!KcSt>tCb)9c*O1dYx=UEw^wr15^Y+^*~G z?YJhI-QxZ{rB3JALZKA2=E1$^S%bk>OzMALsMDnFgRaMmUQGyBMqpm)Y}?xQetZ4i zn`h3;ziY1G?#8z+nTral9O3vq!HQ|U)#fN>8cIXZY=47 zkMO-~yiJhGdo2TtA7^*Z5QH7C1f1}GZ}T{PX&-Uq7-x`|nfxwhunIpZn6Y`@BCqzW@6MD#k diff --git a/docs/reST/tutorials/assets/AdvancedInputOutput1.webp b/docs/reST/tutorials/assets/AdvancedInputOutput1.webp new file mode 100644 index 0000000000000000000000000000000000000000..9b210667f489ac6ce557b5bfe7a485a1d94eb564 GIT binary patch literal 2690 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 diff --git a/docs/reST/tutorials/assets/AdvancedInputOutput2.webp b/docs/reST/tutorials/assets/AdvancedInputOutput2.webp new file mode 100644 index 0000000000000000000000000000000000000000..01279e5881061e4624d38c4342e83235cacf8a28 GIT binary patch literal 64812 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedInputOutput4.gif b/docs/reST/tutorials/assets/AdvancedInputOutput4.gif deleted file mode 100644 index 415644e6c9426fa5b85fb69efd8648f4562a8386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29185 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 T<*#vDDp%=<)UhX)Bp?7gdQ&ba diff --git a/docs/reST/tutorials/assets/AdvancedInputOutput4.webp b/docs/reST/tutorials/assets/AdvancedInputOutput4.webp new file mode 100644 index 0000000000000000000000000000000000000000..e8ac857332b0c1144842051a5bb28f8926bc85a4 GIT binary patch literal 27158 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha1.gif b/docs/reST/tutorials/assets/AdvancedOutputAlpha1.gif deleted file mode 100644 index c0d4124402af51e9b92cd6610aa4721c2ded03e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14915 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 B)1UwV diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha1.webp b/docs/reST/tutorials/assets/AdvancedOutputAlpha1.webp new file mode 100644 index 0000000000000000000000000000000000000000..e32a382ffab7f13f6b80e1a06693f7e16bf3b708 GIT binary patch literal 5690 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 Q+Egi=nf#ZG4FNd+1s{|}0{{R3 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha2.gif b/docs/reST/tutorials/assets/AdvancedOutputAlpha2.gif deleted file mode 100644 index 00b443da76c86ea122ea517823f4199bf98455a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71819 zcmWh!1yCGI5XCv%<#30?f(K1-*TWCD;1+^Ia6jDLox?S_ySoMmE&&oe1b+V3+pX!I z-tL|^Q?pw$HF65Ffuy2fkI15OJ`<=?cv};{{ad;0sy+ZyY21W0Dy-SIJlPXhtkrA zQn0!NOM$4-Y_E+ETDEuTDHsfacJDwegrOGpE8u_rQy><&0B$h!=m=Lhbf$Y4 zQVIjw!&-KBz@=9!w4j#I9Z2a6*lh-Kbae$jf?Po$M=;pG0_

    qbuMM1OSBy|Eryu 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 ds45aAV<E5O|ITcsI`Cq06Skx5+DEo diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha2.webp b/docs/reST/tutorials/assets/AdvancedOutputAlpha2.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9046bf7d8f2dc133bcfe17243aa3eda10166ea7 GIT binary patch literal 65024 zcmV(tKP-l@2LJdU4qf69g<)Hw_f2WG*Y6e^3lo*#=n29*SQl}Z2I1(iIpJAB&<_J}H zrBa}~#ZScWlNk^YhzqGr7#iUt*vo2G7`k&{Z%O$;7zjES+VNJPz_C8%^U^!EwK>{_ z0)kT@w2dT4YKK4T>6tzK6Nrcjn1Al$Vf@9h&O<+2vxW$z`_r1UvLwQi9&~&??&+eJ zBBUdTBCjFH(e{0m)C_{$d;4tf$e+mPUxnWK* z=>>Bjhe*~-6vf?6Z;}v161aC;vC|WH9hfwg^n{S+^76ku^UUbk;brzAb#~fD^q&@O zt94ro_3U1#@I|tu$U=`KpT4DSlO#!!oSDJC0}azAn|;o40iaQK3aawxNm;Ze~Hm@Z!vX3~KjsJ@1zc&DE^G335YtKIJs&rBffFMN4sqUWH=a+9uk}OG* zZ0rAj+l7eLqw>=AC@l&q6%n2QFp?xmlB7B$+|*6Y0T2jG%%XP0@yh-4VHh8tcd0Rv z`Gb$rk2V+2T|9h#_2S@_6{`A&Tc>{$lqs9ZGLD^ht-8G6AlA9P$>Cy z1UKT({NIwp@@LPSKIMLO?)^n) z;2-p*X#d1;1pRyqM|x`z9eXEdz8&>gzo#eCD_5ffCq|^;gY9{Tsm(1~R+RT`j-!;az+N^FdQ@1`%J13Th zy99EQpel+;b1IY8XwTwPQEG+{IseOPd+|;LVYO^n?_qy?5Z(K4?v;gpKKuxp)okKY zls)xW?(U|CuyUxp^f+&HtB0cM*TcMBGxM{|jN{BOfyVD%G!smi=_q$ho9Euiy|fus z-Q%o+Fl$-e*!6+R2kFYUg(lh~GuLRAK3@3ny|d>pewhmBG=+g$8wkcM2dt1HSE>XTM=IzSMj9o$A-^miM*lxBcCn z*sB*;I^4oi1Nk$4jY$@a(b-#57X`Y<8p&g8`Qzt69sBxmRz|k~fi^b#H79|sp2^?6 zU?!qt%+#-k8n(TYGkQ&o0%>6Kdj=fLbHC-kdK~sDh7fkkQD%j!{RdzD&|PbM`2Kr# zwUlM$RA4>@Ep7VkrP=2%=3acWGSh59@x6D`1B*Q)fp3Ph$G3V6UV43aY$YAPw;B!x zCf?s!lLBYVa|^=*dn#P~`y%T<42`zwfsff!|6H_7qgjU5r8ZSXP3K?dKmC<2b^7eb zx+0dt8UCVuU|_1{eY~BVD<7&>G;FaCln=4C)CyhUe0g7~5-~%y&eGw2Z>rfoX2)!l zn-3AF9v)V}h}k$(HbbWN8_PLhfyv5;fZiVjjv{~f+?njX%xX9Of1XOQegDJ4AAT#n zGdP@@`=Tk#AADn>Z~h<*|N2jV$o^;c55iEt=Km1nruG&*48^w1SE(jdqCZ0P|aw8Rz>aNb?r^A|gw z(~UNGm2+Q)RYo25FpyPatO6>~70;nr?xNGtBwK@o`b;=a+`pS1nE+k`$wKrC*vmv{^Sycq4Dv7h>lrVKXZ|<#uK<8pGQGkVlq;17-QcsSg23NA~mxaAP79{oYSQF zmn$A`zXw07Yk)>T3ua$;6{g;om|jd=!6QH*ul86k&YYRjCH7sM0ENF~FH$nP1a`AC z(3I-T@#?<>@xWuSZ}Ql^aHDX*jtXkyQmY`X_pR306_Y?v*CHq69Bb>dXk)z=@K3)) z>HR?I20`8pDjWp28qWh{(gLgES`GOZAf8QAZeV)_kKvy(Xx!lxh;@lxxc9&>(}lt@ zyJ>D*3refefYgw}FR&ZUB_T$&DZ+e%#T`m-aD*&~^wJEd5!!#j;n5Z*=As_g?LImk zkYZG?a8-aWhWTnRi%g0zMh!Mp*eZq2AW(MEW}__zc^BQ(f!!mk)1}!dyo-xVkNuY$ zo-$t3)X7=!u)?~Uqc=?X$}im)n6J8{`3rRFAi~^@Ub_xz(7FZ&)`!_ELjBs!9Oq|= z5}Ve|HbAMM7g@mjOAL<>I^5F?#&EH>fpHfuV0(}tl8McX>{cBHHC|Cnz$G0wb_1(m zSC*oc-T(rKkF(7v@Y(!~DiF=1p5Q$clTuV}^%bqZr0_tzt<48uy>C4}%3Hw57751v z0EC#Kgj>1Wh46x9{Q@jBe5i?d>snyhi%-*~cB@!!_R?6m#x_h4#LKL2-j@+Pvf6{q zUp9EORq1-_t(*jq@|BUimDu{oPJd?$|fagBr1&nn~1xN<-b2 z_=aCb_=K&7+K2oVcw_FrMDPq<@10s`FZm4y7KGD{SCmOH&0s0z|vtoU>2LLAgHlO>VSVh380k2*h&LoUTAO5y<=6w zLyQ947<~Rx!1Iycjh5^^PDG=hHaWHZb0zz@ck~d z0UuxY5t#0$H^NKx5q|+v7F=@2t;~1@l3wg-u}Nxd?)?Gp4>g`X1t{EHUN7exp6Aed z?PTL#K(&ad5Qr044Ym@Hy#PWG@-V35b`Wc}g!&?;^xpc!G~-SOSghju#KPgr&`%AX zR0#q;fUc5K>jB&FBe00?jZ_S5f~YS37mP>oIS6Yt4pn&mg7hRV?n4ZE(0XuEKf4dX zCUmyWB9dO^F|EYzsXIb9_+eN@Kw5=#egAOR@CpQeg9dREDi(UK@d8xc+>6lIi$v5= z7NSf0YfNEOHF);-RZsuR#UqP%mn-l^WTz$|JWn%ZjKd)aa*`m1h{qaRaLR=Q@PsEq zJp6T``);`KVmP99zQ2#hPOJ`vidaX8W=t@ceRp_Rxa&-bzf1zVID|kuepUwrp}B$# z1p9Px2!MdA_x>Bj^Mbd!Fm&6N$6N7@Ra5p8UN5%n4V!=Q#KU$ol@ud(~ULs#IUMFfAB84F#3A)7_-oeT0Q?$j6K zh!z9Tt$mhW zlTCkEfL3aNCF=A(xV3cc0-eLVgxtil`VSPIsw}{uu3h$VRBt&dnWBYyq235InqiZg zxd88_L*r%Kg2$>5Nb(7by@#m!UKzJR^H?PdI?YPgsf-WBcHWw zW1|s9w4gviJk?M`Hyv-~#q@#-_~ZKx;1n=OalPFlB4AnSyim$@Eim0LiF#;8~SSNMae*F=`vnInP&{afw zK7=P?xB=j588auJjUa~&Ln4H57L8e#Ay0#>3%OBkwMb%|}?KC9zu#)YPqZ9* z3J;eTD`9c4*%mCWD|;azk)~hi`bpx9q)hyRr#Bx6heCIQWJ+EdyBDuX{J=1X5F{h6 zEp$+Q{ZYW9fVru9!yr&W4yZuTU2Q;6M}fEs3BkNYkkA)=ZYE^dFK&WPFIz3xlQ`tJ zVCQ-n(4#xc^0;RsLcw*{Sr?lQ7OtKhx;Bzhz?NuGCLM|sqm0QIXB1}@xp7g9f+Swmn=bd1dv`o)A+mmfX? z7@3bAYToe!F=Hk6k&urj61=SNS2i-kp9>>ydoTAua3~T7@V5o#&U@$-()~F;z8pVm>|D}I9yorM9)H)InulfWQ_vF!`D|wy>BB14W~jf+y|~Daw589@{Y9>(4Zvgy`8Q zD578&)eOsTqZ5#w04ZnJ71^kII=62^b>%gNT`!Ns#8oKU#@pU@6~;p>>v_1>?F(yR zggDPrVl#`NI`MAMaPSe-?t>A=IsSk`3jknxIwxsd!r%$uVBHhjY5{Q1b7U3Zsk?O` zKnWB9?*P%9{RV(Pr+5S>B?3dUFZ@(dODwJBx5E^>nX!?~-BnQ}`o|RsP!cM>7eUnM zC@0o>uvTunI2=R9OKu`b-APIG4r)g|dx;`&O0>!uE}E?yD0r(g`z zLIsdstI(X=Y>-4R6bEqrOyXH8D!&qau$_}aTv!8cb3l9$7z*s-!b2UXeu1qa01)u4 zt`#yLGXpNT2_-K>oe6k#fpNl@1hmF7TiYw;ZIt;zRkN#k0T`bLJ8n&ipq|3QT3q;4 zGt1K6ylo@;5oZGubPy7s9|SE9;ec>)c+%*UvH`u}j6ZvLcx5rehsiAy`v7Q2@nM*| z7Y!6lqI(_5=q3)b*MS^x#$MTMhF91*hoMaupd}hS3#OqN`f4 zIUr)NiSQ}TRK6OJpt^1t-1ji3*IqnQEY9S4z@McReIg?)V*0{dweBPz7NPvl!h`y4 z8}=v<7t6>Rqo}kkfB;dMO{*CI6rkJ~@P>Y)5c~qlYT-v=Hw9U+^)F!iiJ2~eppsRxvT7b@21 zX{gY|2i=Ju+CncTfQGYur9e6wCG7txc&7G3U+}aR2mVOce%Ll@3hJ z0N!kjJQyFlRc8QqLI8v6qPe`)eg22uzQbQ|)cxylf70ZU&~{)om(md}j~1&02Otf- zBG(Fqu4|vrO8h-{0N6oWwb^idJNe@gIqO!`3V*A-3ZW@P#LI$+508u@3Bu>(yoh?P zN8t9?$8%Zk!Ce8$$-2osjk4LCEZ7K!O{Vz52gdZ#;Z_a(_JnLF+C&E)BEN%qX>Ig` ztzc#93lTHFU;)56B?VjVtd!7DU=Qh`_Eh8ZNS&x`?Z&B8appnAmY|}AipAmeQyTCG zuTZ?j?H=p)DClA#gaVZ-M!V3X`ZZCwiYiSNKrk8vb-ami`8(rjockdRVXI)1c&DcD zs8%|5Qw6WVy$MmZ2|Ih+b^w1N3k#ilLx;mfzq)CH$SS<-2p~9Um|_zyYz*#k>t4{Q zdo~XW_4;*dF9bA0HuO(ZBg`E-?xMS_we)+CE1g5EUifg?-VIFk4$rMCkOes~t>jS~ zc{p7Fla`iL;uce`cp>h2a~*FP?_N%)3yjQ#QB$E(-w>55km@sge=1 z>LfJB>tMt-!C*B=zid(6HNiL;6o_i8Q3selpLm=!C0vR~=uwDOGfucWN>qj+ zW`T6C5U;0w8$jy@3RJ1yis}Ukh>lE&@fDbwn3^)=wMicC)Dp;uwFIGFJOyP;Z3`V% z7*2W87hEaYXvp@b2B!f%ujf_93eVesBYy-d?%N>&u`tpGLd#-?jD6?5fUvC_X#}^e zOE^uBgyAB=S2H#Z93J=mYiV>r9pC%cioLPLoFN@Va+iHH8ohA$opc@`>RQZ@&M~`B zr6ECpcYTIp-NUUJ?AnhHl}Ie6>8pKDpjkMx4J+P*FRJX|ZpBdpr7H<-AX2eRI;Q*P zmau+7_QoaRU}pZzum!zlhm{o+q|o~V@LF25-~fL}@GI4obNH-1y#K*C zQL?$*3aFWx&_MZABAQ?#s~pzm0WQd{V3oA|hB97cQ}F!6*|G@>$`<~ZWVmV$o)o8^ znn=|5L6d+xUl;k4kFStpY;D%1(deUu0bZjVB7p%~w|l7n4JjC!ZJ}`+#h-9}8gLVx zRx%K70ZJ@Ynbqe;atT)~+9paQ86j<3pC>rz#Zc|UvL<2ls&pwxKuT-Q;59 zzz;r7^J&2x&VsRBI3zdgvSp&`1Tka2_RC2ckE%JB6nxi2)ZSi?Ra^*S((h39AY0WS0fm;IL!iO1}R3~ zz?R64SGtfDacbkfJ1D-8VX8iJmZj5ESxYSutbXxl*swf>XP!JsmiMYfC+8a_89@K8 zIJd)AQ+7$bchNG$nQQ@6tlOsOtn@-S-) zZ1v98kHWsyvs<%h@%P0_;yNg@=Bc!35WsRp@rWs307?C%Om z3miiw*f_E~!LJ;`Rv}*S8fkSAL=$h_vmqat>~)sTDS?gpQqu5QUR6mLUt$t8#<6<> zdl$kzT+T`Va?BDhcMGvM(X;yJPa;D=S-rbVkjnODx-=UBA?|h_q-lB-)yiRyA~FzG zGz+%MUE&6H0OB7A&O3tUX$!u+s?Z*S*2{&;+lpXArZ%bxbY3k5R_c$bB?3J;=eT*1 z3h1k}>9yXi5J~rB?G7po_dY&2NZWYN=93~+2J&TSOU^ekOK3G)O^U3>4w(esfoqsQ zZ}1lTe-oElR*xrWMC8g4v&te|b!{x4q)+e$8%jiZBjBaoM4(ReaEEvDt-5!yJc-v$TIyB4Q3r=awJS$O{FVc|pU#bligIBZ+VYv39<7E)k zaK*v8!}nl3f<p`)qsp@69<4Qrj%y*?< z)7R5qE#1OY92(>RZ9heD=L>Uh$Ej4{coG$R$?O1gQyjS}Vx6X|f&-1XRsc*|o!}jL zij=+9fs)be>V=TY!@Gk`fbiM?`6YX0C+Scb3MlG3P)2F~u5soX>YbxOE5EMZ-NG-` zV5nOniAH5X45HpkEL{6s2H-fXe>`gp!LFhiHG?UYK%Dg%tO_G=vQ{<=JA*0wjyZ#2 z1O_^%^uz>q-*4U)7|VPq1pR@5GS$`c0A08`5g271$^*Q79)7v$JIHro2n0gu!e&zP zP5ZQqVT3c1w%ZJ|F)mLkm2IToA3x*`Bp|F*Pm*T%g!^BhUVxThW1LjVBL{&2VE+zq zVohmenNU*rC|FQ5sL0iAJD5=rhJ@RNzNl0kCnXPaBf+3vBGem_x1Vm&!XF$^bgv-W z({xzy1FY%=VX`83$uMsmo<;HdU0VHD7Ojo*YU{u@PVwn@9WBL#B9fVVSfjl?tqh1-vNjt7wyg z=Z29rEprYQ#AzsoCUeqDHTeacMQLpPf&|$xL3Ded8C4{}5j#e;d}x@6Dq<63m0$E0 z>N;^&y$kY~znhhF{}O8OnN$D~5))${;*FpWOIrM033qk?hu=4mI65>mPRm2F-IfJF z-5Mk?9e^usL&v+J;?~kyypw=JAQ3v)P17pi46{{Cfj{yHxn()*I)yY*Wj`CD_1ddL z2+e-EYP<#-K_?3Cu-)qQ4Yaduu|KUa`#Zqd$WMXX4X5U85ya%&V6liF0U^a8Vl5s4 z*B<%|F5W!l0HNZb6)0%RYHvc{4yV9lxr`)P0c4G7-3Pr6q*H;h=(i;6$u_yD*CzyZ zx{u2K{o~2Ys8F_xIWtqRR+~K=T0iFR(1%#epO6xI;88cCk~TTv9krP;A~{H|Is{K z;&U>SM6m>2fXobq1k!{{nNOb1!I&~1w2)1k+j$;6m~a?M^jHGw!S9rSt}= z6r_N>uqGQ)=Om}S15V1?NRSAH&;gj*2Z@MjKxwFF z5lWW}F>U~ujbL5ETF}jIO4A6Jg09c@1gqrW?(LRmCmpF0Otu67@eV=)k6;Nc`mTKQ z@#C+5{g?Xe`+5BSQ(<^lYrA7)MdDZmNrA8On2=zq3X&_H{tuhY*VMf_$P>j7K#Ne| z?HZ)QU@?Fph#oz>98G96(+8!bgw|UX^Kt z^j0H&Ncb17M^pwvHS#VDp)B($fICELBUqF!*=>$isQQSM(~ckmiX9{lpf_53Uz$ml z(py8eecf#=`l^7cV`g_lt|OZQyOHYZQ;M{NEO8Qz=VjmgGjVV0`h4jJie^1Ibkxm; z*jZ4lSEu;VR7{*evv1hoS>o#P%YqpnB_I&W^70smaH>V0WDu?wPNnHKW=RTa(Sv3v zAcQ9F_&(2gVC3EH@=)cGC$%U1vE)e_C@;WPIOZ<(?$}b{u zVtC~cd5?CY8VbKkNBS*^t+Kjp(5~SuB!FDu=OC=*Wq)EAXPKx)OD&A@RxA}&!i8!W zC4={Jk5(D+&wiG3_I`LBJnyyjebBF3Z9f%DNX z5Ui%`(_pR03xNq?7hqgBNjfA=!L0gHD9+hva(KZr^VPy6a2^weg~}I~d+1t&0zZ>I zStQ|T4n!mzQ3F;epY3*Uz!Vr$bc=0mD9r&e#UH-ws%Q7_pD(np2QRLR)!Xw{h3K2K zx4VQwvm!xyNK}>+(F1hSsNHPp4Xs6-&r7{z3+4x2cH#$;<&9sPwH!syCk9lE-aX(ri_ z;l(6VR0%PE5H~n!dLFU`l5p}@lCU#aBPeU_1xX8uZ zm1wxeqSVv5u`dos;P~zZ%Gu7UAl3kL>AS&>x=H*bEmyb&eUS<j2(Te;tr-YC_gFRlyAj(O_v1(Ih+tQ+m zjsp-w**^RX(_w>0ZS4%5kV#xIwl7n!sjT8AOsvQuDU(D$8U(5DDdY5JwA zI=$^oRZC51IGO*IlI58_3}>6Js$`{NYV?NB(P1c%9?my{!$yh%O*6m!Zrul4@~-DH zi0X88wo;G4+6W#`7_b|GHb9j?kP{RWUy!C#qxeD!_ImcghDJ##*<{m(z*{T@m0t{T zW@4!@+2U8rwGl637KuJIxtmJ(Ji+5h`exfOm(}ut;VWnWCb?TPv*_Yv`1b3j~p>W1uDEs;!>SA%y)E z&ONcl6!O~ujR=%J1Au^orz3GPOsH!CJlQAr{m7XEVG$r=KNBjFv$ z*+^C!*#%3jyIVSRs-zWz8Q&K~K;UuVl z-r<}$?7SJ|(kFxF6bKMpNsC?>epiCf+yx`c2|rX=)nNylSOOL9T2&$T>KLTX%I*O2 z@sHHFjLNFWsJU()3-iEus?})r#-z!5vMH71zTAiecsCzOw1<#kZ$RqBV)gZI18Ud@ z!cPmV86GeW_13UUcM{GKuWl6e5XlXTEAC(GD$ncpgpfX`D-Af9nLN5=#Gi=YcB1wI!P5O*7KqQEL& zNc|;rhMC4RC}(`8Esu`H_VV*;f}D=_RR@Q1VPLrm#8xc8kyN09Feq=)Bxx#CxH*rY zlVyWy1`&>FX%Wt|R3ojoM7_hx?EWc=EKeat6~<)cKh@(QLKYGj7B}fowgw5Y6PD*G zSd!1BpoNORCxlKNs}KN*h@qJ9Wa{U&o(zxFkEZ8+;N?E`L3jk{qO<2J{ujMt`a^2V+b4wnwiKG`oN5Q@o^vO-FdL*@Ah(kIPWQ*Uks46;B#PRgM$ zjkg$g5DW<&Qn%ZQM`OTB60zNvOOhLcXc-vo5?Uk{WFzNRP=U-vUUP0xn8KqWw}Y~E zc6g}UCh`~Tr29`m$Ii+_Cvt&yO@9_?3l}cvFe}?(ekL(TBf)gB;0HO{C>q+OSA_Mx zM6qv7K+jrf!hsp6(5*eWXU?72-Bf-?oz{oJDrjjCQC1L*w~30WG|A1$9@ZHe(i=v2 zkTpe~?yp)Wmk29ZFxDb~b2%9nkm9_!f3^jIv|y|tPt#tl37C#boZhOi5M9Y7#-Na-3gukuzrhLX4)sg81vqF9dc7o6z!KIL za}!h>gSt^75|JK)!y#n3JVq6$Sy3RGKq3*j!Y>;idQJNoFG5%K5e)rVq?LBnff_rX zPmYU)xOc->aw90Sa}+89TJ0;5LtTu@zXlbb$lKWVgOjhsNSd{uQM3innU=*4Y%1Qu zos59Ccx;Go9B%nI(}fQN$b>qP1lYbo)6kHO0R+lOC$|!PSJ-dbBBvgbROjs63)rrVes)=)dP7_$$U`0i1 z1K#7!nGRqWApG<9G9`(-$MP;X?Ai!Qnr=H--&qw&t}#DcqISem33*VNiXub-$5tlb z-S{CJHJE2w5$D_PmBv6Av7wd(V}od0Z2ibU@XbzrN&b9%ugOWBba(1iX@d&aWUx4H z6;P@uWd{n`A?w5XMC3&x6jE!UW!1G)O+MPbZFa8?Dw!OC!LJJpty zRlTUp5)wh$sOAVm@JARg0CF|Ad=HXvPRRiX;k5Da$oBLo@iZ=DQBgrd(Gg`hZTsT_ zfp!$Ep`Y0-YH$Srg{H6kf_L@J)q3ydK$((yIzRMaF5q; z%(=vmk*+&ki^XFYOD=;WQZptzl`kkA+CspDmATDTPWChRs#H*5EPl*F5K`~Jv1Cm1 zH^K4o-h)Fgaz@Y!Xpo60q-}x#dl_Yt7WH1qK2|pv^E_GED-?*+47=&K?==V?+qfd* z3nw}N>I)swxM^3dv3|kAHPebpqOOi`P1+fNPDqXGeOx&A_bS*&iK?6-Bl|G0kVqR8 z4i(RcRyY;oG_7OC2F=T1KS)a9Ut9X+O2R>cn z+QM~%;0uBiBWP>v8CV7VdxaHCb@;u%|2T-HFwwPO@q{4VtM1ZnY|*`hDSLv8Ic;wG zh7rG$)_@fwD<&tD_)vlB@g1H^B>OdGG0ojPFmVZBNSPnwLbD%1sMZ{h-GBGRtEsS= z&(**wppj~XFp>pPxPjMMM*)M)=m&!|Dv7kQcBnqmjI}@@(*?vI)G`$LMKlVIw*&^b zT0EjmYgj2{!m&PiStgV{8UA~d_HHp?(+UXo7{Z_gWDUPp7`d~<>t$iI+2)PAbAE!5)HRQ_4(l;FBLy|-W?s9=XbA(svEUc9H%4fUvg)iG zF@s5pUCKXmDwggOe=f5P5-{1H(H07#)$F@~GWw7L0k4#>$d;5KiD_uwj8jmGl)?_B zcDhrvg1@b|}2YfnLa3IZm$FgfiGVtVe=_K%Zf z9E^6Sq@^bcQ)n3?Vj+M9Llwy+RJ^JHi^~H|8=8kJ&}0@A8Vc5S2+J-QFG;fCY_usK zprv5HpsVq)+|0KTdu?+q+Qb>^c>+hWo+#|P92={(KHMc|EEjQKpD1}X^WK4?2~f!X zU3`KQ6Nezk?7PJS5x9VsA1e@(Ekk9tCEyYJ5uMecglI(O&-OlWPcF`Y=i)q@DHZU| zPoip!vV{rB%@5HKs8UqplbK))Ex4L$3Y`>yV;Dr$3>*EQsfIGGmKu>${JAd_)m)o7 zMjU12PDX?DKv(*xdMFumV28Ae?=tzf7*}&ud?^8C^l{wZM$KGwMMlaoG*-NO6Hrw& z0C#eO`Ah$Ypw>v@X?>+L4E(w}AJMhO3Cv?M#fUDaZ=#gXg-VUV!Y5w@$CaPb;`>m^ zW_5c}!{5H+d)m;Z%YQDje8A6uD?ATdP{Rq^eHkj4VF9o_>}C=ZF~trfZ^UyOb}u2_ zKBimR6GA4@E^y3Lp+9~gvN=gR*&)o<)Vd16pf44aU|To@Cl#*?GNA%GOJ8jRz<_&% z6BZ^!fs1<3olIybI)!+STg0` z->XAyQF&Gcg$UX|%1JPEmp$+l2%8@c_l@fY1Ak7Yzu>E0#@eA0!1$a~sz5x43WaBZ zrJgZR-j4H;y&J|Y0oqTP##j>Pi*9V=Og#j+$E-L;!lg7@{X2|zgo=sdb2Rns)W%UKbr zEd;TCXs*ezDkKEv)tLyhRfbR?5agh&lnJY=XmYnC;q8&6Wgn3mD5P#M)ipVFk{lNc z4)#ZAToyjOtVUI(^Qu2v00xraw6|MuHFZNfb{@&nsXlAT%BXH3vjK1~0~nyO4NpZb zb91yt&LQHH1K91PpY#rDhX;I=Mo1@a#@D5-h4r!u>7#Ea9Ml`7Lh1RyZpsREfikQI zPC0l*>Ts+?DMHzh$be8Khdx?fC_U{afQ(z(H-5&QGYg?Tz#S?mp_wMZ151Z)(-uga zyZl_OYha_{&s-DOp)`bw!Y_GDNy>3-w=j7@3AwPe3H$9Q^^fMd&%<|Fl?T8B$_J9z zfpBu!ED*5u&?qM%T|dffXjTP4L^e!KU_oGOpv{$JpteIP6ERQ-XmQ=uuHJ2)&>(zt`5)Y8a^FBb8g z#cvx>t3}1UUmwcp^cUO>t4SK%@S}ZjNVAYFj50kdBW2lrlK|LDcroJhswRR4xHMgGQ|?t~F_(05|ONQF*JhP1Sj2ir-hOSsj)ziD)*C?BTFdzTEHq(81zjm3j0G@5hNkrn% z!^?qa$1@eWs=zCTf|jBqzqV+cWJ7vG2v=_*MuZrv9Nl!Y-pHr}rpag^8G?Qcg&GOL zD0L=1KcG~Gw>C)RZeS^F;xa%~S9X`-`yJ4=TbFR_YRv}3aKFQ@g5;Y~&ta!QaEa)} zrH2q!XQfUv#*$AsGAhN{X}Abn+DH@6jY`Id8KEew7itkic&cGQ>4MX<30{h2GHS&R zUM7BVi2eSdNZr+@`~^Jd5MY4GSuy9}Dt&U+?l9D?sNsT2dUQ+Ut6B+=lLY!lx~GYq zgh<0_QKD6gY6$hO!1DL1%qOkG#YYR4D_8hLb(=+Ev7u-SpAwOZ0K#RX#%Ur3QV`~4 zn@PpW!vKGzA^L-*MM)hNe(ClL`kWdDaZ7#adxMLaGc%Yqa|$W6C?yH2vW! zmPl!zaKa3O#R$7Y7jU0iNd%T9{FQ9jzSk#zu zDQO93hX-#KYn8ILZ}j>;PM-yjD(R#^#e^sb`u1$iaZkM$G9hFjubP|(+**=d8Dc0o z^*m}$0eh!I5LQABQc$t{E{{{PXGzLv*~)-T=5`F&*2)oAPnJt7!xs+wv}xcnQ6<*g z7^=2@`$?TM>hB-0c&TRkYP#kGCOf1sp5cya`UXjil*?CvmCLOQG(q2`ceN%Z!#sv%k)Y^@$3P2KbpKuhk{=M+k< zVn7O*%e5u!P^BoyP!*^uvLDH3o;G}~(05KUG(0j8XIk1cKan4;&s?LuKOYC@g5G-cpkgPHKktWCGWU4pT*EMGL!MuuOfzbIQskM02{N zNz$9N0<1l}rPWSYp_6bI%v^H_yb|6?W|YAM!PBa)AEh%@iXcZ2g9O)@C@d$*8)$6O#ce%(gj-5#4x6p`hz!o7Tont z)GdpI0gx}og?czGed|_+o!@`3Ge5qtlqDc?y=tJS4n$+cIlCk^#ss@D264Wyn5(Om z3r7nrTCc%9VO>NKs5X=+i+a7RPN{n~=(oIF>m6m;pb^8!%7xsh zFPcVa7;i7Tuf8{E;kIpw+3O85Ew73Q zCKBOO2;*Gd$RbD_(UI;hZ!OD?U1&6GSCQzq4HS|tX%_n!A0|PyI)sjM6=rf1Szi_e zV5lbCV5OD?tqw$Swq8dU1vMZ~I(*PPDY3;zJ5_6ztdJB874~hHETss=-bVTG!zQ-o zCZ-lNwS;-{3uy<%T7*BBIWS281o^PrY2LD1r%B7@ei0peo@rGgLvzt^Xln*!V`wYE z=-9vvZqh0j$#-Mu-%05ZNs6QGJ#^j~6vh#AL!z)Y%Ten>io0+_#|O%!BPQcbv`aus zL{9JyL=Bq)8s27HO=_+q+sacRB%mNbdR;ZJ^(M#DY11Wmny^7=hYKa5LKAtW!9Ie> zteXl!lgPgy*EYg-m8;V@SFv&UdC*nS&qT26_f1?3Cvl`K0HxJ{q_?KU#eFHro%ADS zcO4us2ABjZIf59l%|P^JmtLo*Ghs5YYVDHc`1|vdZqrlP%kAQ zuaL))>HRLEeL(J}DufOQ8OOS*V3k9mh!smi5Q3Mf-hzRs4Qs&0_AJk!K8)j~Orz9x z37{zDz2>6u$#V?(yXcQt*O6p{O#&*Z)G^qD$fhar6cl~>QuC42BzShRZX#TC=x;y& z3lo%WhF&%}x1_;?ARMU#w1*e9W0X?xbqO*IVQIE%-u4s)pe}K=7GME6q9^+NY|Cbo z$N_uCiHL+VgjM>6xz_SEu*n~nONb90z!xMKWJQ)+_9jh%NI6hA4wXLBiYtGG2Ac3mDtnRzO2B;^vx78JK%4U&*ERa4hep@la z4xI*GKGI}mKIErhHSv=cyF-ZaaqKmpOJ8wOzu@-@16X}oe70-q5H?oJi7U*EQl%=; zo2aWu?U=dl1k-u zuG5KXHA0ESV41A(bLc#*7e*9DAfl2(0?ZFDdZES-xcbxRQV>WiO99_RQe>AL$O_j@ zM*vzN9?C(@R3HM*(+0`PWH(@QT~*+R@D3Y{gF@13sr-DL%WsXHdGZgd);JQ!T}(1T z$Mk_H83vT}cOzb5CbH;g%wFDPDn;sXVCrU0v&>6Ja6Q=>vq8Zp9&p8OO*wLc->kGV z7Um(4&S+J=AmYbT?gsMuLJBhM?nIl$|zdn028T7NU^4YS)7* za(!P~G{UMC7ODdDCG{G1(BI>RG9LCdUREiq*1l~^PdLzOzoQyWixpF$1#}GE6?S)S zSMU|ft3a~~TmXnSsTBHo3v*ip?O9Wq0%9VRjI27fjUX9zYdEl^ucH5@*v?m3DhC&a z0(fZF83~$1wF0g&Qvr2yI4|EGv4E1K#7y*tN@#rgx@M(;aY4_rvgVeAm`OU22>qi| zi^NPbzSdOT0{T$HY;61KazibVr9+vtZ?O34P(W!I{Kxy(tvi}vrQZ{R?PKs<21!*7 zMJ_cM0V7+i(E2NN{K(ZncS_iiV0otqzI}s#NNt%kra%`!m0Xrm0ZoM2ke=6U$q{as z5XWXwE(Gzewh6Vsu4x3|imO~eAnR4^qh@lQKf5e3F!26{V>vHJ*N2~6#%!9*M0)3s zB7&eR`s_GvCZMHSC=aaW^qxqGuOxj~k}sSn>;QK}*}0Z2@(a2A06K*Tp7x{p@BQ}A z`uS(qg)hz%~K(4<|@DoVrCwzi8CdVn)ZU~G% zf=f$da!HN}i&|l|Vq(=d0CswEI0VKTnq0&${wa_@swN0UN1KV_NS?D52FTMSw3R;C zv&LF%4VWAhDVfwW0%BnB^g`%mvXh|M99u`BBFRpfhd(WKf|KGauyb^!rHb4Ihjftn z5wzEheg@8SM4m8&=7Rwq;*Ru#xJBe1tVZ?~%2#-~a%oOYU(lhyQ}T!KA%RjcYWSYU zU-10nLi!Pub{_K?*P^KvV70j5Btq9Kg4SUuL(noO&k$B=d_^bU(GLVRBOycxSJdD5 z$3M=lQGr0+-MA0us4r4%?) z+{Y^WabXU`Q4YS}K_}4HN(|zY6)X%L0j~k0Ln7yqDiTB-ScQN!9|WmQI#&gm%m!zj6B3(yKu0EO5CWC!eL*!WR-lhS9KmW( zMd*X~LR~xegSfpOtx&-e~ zzJ<9bh`XAj)Q#%(u`|6x>EC`=GneArzaE}b!Z@(EhA)m`ebjxm5|pb$p0?QCqwS=Z)LYU-o~0Aw3Z6%&;!nYhnAz(-18bqW2!EF3HtuK9)r z8NS8s5tVKLsg&6~RN%gzbyRX4%0X333y3?PnNk5&%N^k`H|!0v0w~zIoRfY@Epfw~ ze^b*Y0|Y6;sRsZ(C<0`=Dwd##fR)l34h!{&;u3HYMp~w(mrnfsadhBfRrrpwuIrjF zNhpyt%`C9!xC#>yN8`)wtF;)4BY=S3N=~ueV*WOR5CtJSTNPwel92>2J`+7hkZGU5 zn;{Kj?KnoIBSZx+Ip=y7PVaUL-j;@-Z9tm6!*3%I1%YA8W=357O9ZSA8)3819k@1X zVUnSdRyWlry+SAW5XIF4i>s+!iyH}xMUdhV3{DWDVW800Q!-DF zm!a&GV6)v6O5b%g$tnD~%ny>V&F)MD0YwJf#YSyimgRwEcnK58TrH3g9~U1BZ8ZJ zWsR#(CTo{hyB)S2;Y@T%1a2h0;N>AhA?xqz00`uN`{~vKasS=9a6jG-lx!KMdXaxA4FWs1m&mES;sF2pXbR)CYa^_R-GtO}XB7}bu1R>Dl{}GuX z2w40~@Av-zKRqv8-~R)%05{N=q`_t0`3!R2aU%iXuYf@S0wZW56u@Um4(y4q0IX7f zrwG0H0dpmcK$o*%Mj?bkDbEIvtT24n@)!nHI5CAWuuaT2@wXPN`M43VFOjd?-1m99 zu87HcN>@vrn=c};k*Xb6gg|ikFbWf@qIzK_VcK%t+G6eYVb8GpNq=b$%AC?%Q48iF z#wIh}esz7v3ZKkYQdxjT{AUrym;O0_59I#apI2$g;Kifi04o+VF66YIaKxE_)yHu{ z__2bIAQpWTuH_e-EWC?CO88C5|Kd0jF`B(Flp4-7 zfg>E$^XcLykhSV;KBFLXZ6kdXym9EsQn_!DH9SU5e)?OK*0bScjsp}OdW__Qo7@-8 zc=7UWTZ+u&I~f`9*?=%4ztg#_e3!jAJ!T2K;A*gtak`h{9M7W%`8P2QH|pMeUnAhN z-wbuc%i_Q(nnMzW*2|qIEgTJsdgOz;kr)^o5`$Ei(3+=+69AZ%G=SZ3rUxFX8Xznm zx7EX=9Z>e=DQpffIwD0aZKh4?YD8@MVsOjEt0qXw8ArNHyPK}8{}~R^aCtX#)-=2b zui!~`6~3&-9@*T_1E4s}FdD*6KUsa`hGYyVcY$e#<2dsrfVe|i*;RgOxc4}kzH}is zS!224c8R?7!Sya&^D&|w$n8wmAW|Q{j23zQ8o{i=>oQfwvAN?f-l1*kd;jEYY{4E3 z{CBDF?|I6ZH*DxQ?Kq6NiEDX2^gqa5Zuw5|ZMt`G-O}M^Fhb>lq`;_7hq6(*&|d@~ zuTn1u!#i(VRQiv!mqccJI`HdGFI$PXT6)t*A*Vyd7x%n^(@Q({2KDP!DFTD-5Z=u} z%SsHXAh!+4gdNy(IgJ^cJYdf6A8YomC~NnLq>kD8I6Q={Y_2o>)C+0DjVW_8JJ{(h znb^A$eh-$n1a8Pp<;Nd}O9;A&ISz}N-@r|1N}U&csyIcIb2_9?deJUhdy@d1w^6-r z;;v>epg^tX!aLx>*u26p!qGq>rjgmzzr*+T9&f++XHEefJV%g>MgUv*b}nnroi>{z z9B=x}AwcI4{R$@l)$G;#AtkD>%r2m|%0>wK=)$ zgRg9q7M4NGZdKiQ<8qmek{42*mV}_vVpv8}ROG2iSZAEZ6GBXV)4? z2mSsyAW3eEe_sb^cSDo2u_Xm0v3yn}G_3?0p3%c-W8}zOhOsj_e916-wCM&SIQVko-UO~?IVi`rJ616Wweq!KpeGlEXtbpp zoWyX9PKwyUQP?7_*ozCioU^ z7d8x;DkEx3h>Wz!ww`vG{VLnh#ViE`51)0#-lR4{o6Ew!HVh~!>r^^byoD{yUSxTkU;Gx;(^vdk(h)Ir=?;!N2`=wWf(#llYLat6^uU6#6Xg=63)d^?VV}LAr==IyroTi*Z`0(8!Eqn2% zXdb048#wT2OQBm>q-}v#N4D{jL{lw>G!T*jks9A}U$4}31Yl588{mThf-(UR(xg$w zunI1jif+)_3K;PW8D0Py_sAjypI%0L!zqk8^&zcBx*?}qpcQbtn|MG|d$tb_{><#? z&}eJ@w;cd3q-A6jWPh*RHJUQ?%Tz@e?cP2@N|hv{)mP%WvBqWz^j@F(aR5*06fP8C z`ZgVig|q7!sM2X9oHhU z=!MI!n9t>#offTJ50`+P8PP4^lUDx|JAoRr8`X^dd?QVp99r)rYh(cC6M{g3kYq?| zA070%>|{^SH6n~telSc^VxhVycK6ZL7d+T22B=ERAi^nUiYBG2)2Q$R?b+1m4Boyb zQegEaHoc=mpqI8AGB2^ytOilvX`mCS;Oc)l!pm0c!P(b0!xK1aTmKSHFG7SI&-F)5 z>`dpHajIG+0vlfK5N9cNZGdt;37A*I>&cAHHVp`lMz4BH=OF>&(UP}1;6{Ak5lyxb z?ceQM{PnaBM$o z$k5u&QIi+qI}aXqw}zsvnK%S5U#FK3`q3@y3zNv@{h2b0%Ujh8m3Ps=|^ zP=LOFU?r%O1Ro<^zE1dYFHIt7>iXacp40#?BSa@|ss&1YfK`0P4&95C;2IGAX%N7F zUE!)a$q(E@uiF%^b%<)a6HLZrKe{kS& z!8F6Nk2q`B0dQOmn0&$BW8wK*8z_J#%H>v$KO1rM9Oe6dSM2pB!~&zEFxWI~-7X9( zYhqhXRvb_uAN!om>$^RnWA!z57@^{JlEW>56%#Y{Bv50JD%Rw)>7NJ2`oSTLLBhZ} zq}*<}!38!%k5Kh)qF?n@WH{jWnqnn_b|JNF$KCzm2`9rmt<2N>K$o2P{Vq|mg$sk1 za6Z>%pFui}oJhyPm&QF`FFwYW4}Bg0FsStry3laYDP8;U00e6Q03i8M2^s)w@)Rn) zcYtn$C8sMY7TtpiA__yF_`bK3)TLb)?wQT zBm$oO+t2BHXjk2{sd0l>ST4a`yfc9K?1f>b)$qDM;1pmR+>t*^BM<;T3Pd<)=Br#G zqt;qbqj6D!-V~V2^IsqqZNC&UVVN=tm9$cj%VGfzxlOnQ1Etk!iN!J)Za+9@(O2h7 zAu5Lt)D-yZKX}S0MFd7a+GljcH;r-aG^*_O!FzqM)yVxL2xiOX-1sRH8G#opy zz;TicQOYLnmq$&A?JGVbUg_wL;hI&<*xHHg;AqSrC?KxtyD|%L8RE2pRv1Ez4o4&X z!ct$jas)%$;`YU*?QUzGWVD}QhCBui`L0OCZ@1TqOQKEoFBochr;?X(tB%okgUS%Kyq*< zbmh6g9%bU;36gvuC&;96&$I2AX`t(L1kR;hjx}>Z=4u)(EAYv|7%!c-1%!VeSV^#$ zsb-TM2W4*rZ-?t?vw|;Oo;;fzU7?{a&k00OFGPTN{;5Xc}IhZ&Z))Vjc3XL1w$~-T10z5}7_D^bIX}NMjl(dA{ zMl%QvO1B7_lA!?b&PlJh8n(=)y0+g&)2f};Ii&HmzvLGnXu0m4kBKL@i*^4_VQ7@0 z=k^fTvJZURA-hI^*GS!_zfwch?^p*&A6KAO^ZQ+z1E;ty`k9DnVH#Bc*yel#kGeL= zhsN&!pGTHt?miNS5F4v~pnk2PHi9I8w1HMCY6@(8rFe^rF7Vr`0B}b`v*2A$lI6pj zWaJ0{j9z^>-WK-sesFqu*EtbDw+1bFdIPlEa{e^N?INC|U_klEZRFAM;bHTTd$g}<|Ql}eD zSm%@lV$y+q(Sg9S8fRKe={R77rQ5*}=#`l%OJAjG9*ZS8@h>0oJ4{yTk|ZF)3e;G- zUT}eyP@P4F6gmR1c;IM<+?b4~eb&+;-_kVej9qdID{Fk+7@XoQ37izIo!?+aT7=di z(Q2^yXFn0OXix3l@Za4qJX{?P1bd*Zw$=@xDOlKb1+(uu%A9V-v)(8Cl4y~X{Fs2X zhZGv=-F@;2t$3?HYi93f08md_~Ir`cQ`+l?z zSG2N{rJO>HW7(qoet|92kRaSSWCT_}^WRSt$}aRKrx;37bB)4Q^Qzp-HqZV27U>Ua zXy_-1jvul9fF$69A>b4&l__U*jRNx;y~5>}@&vLOpXb5@S|B~4P8Qa8{!JuVD< z!NmN6bq+yxLcspRpc*}MLWY_497fA;se10Q9Mli4MmC+-n9 z+cELiwPj6J$h`6+A!;h-hL7?KlHefxB_Yam7Y%$i!40;gmczwDb(I!=Kb3kNjz>_} zn20vxwqy2iNYYoDniFhQ& z$+;DY+%Np@&8;KN8x&&mhXFL5J@^_rR$F@3C=mjif%XQ<<_?Jf^#88{$3j-($`Cbi zGVDk=M(U5;>~mjr}^@L2XW76FghAQiU?RpHej84 z>BzY5Wq+ZzN9H4N4*tRw5W4no^$x+SM3-kLZ9@u+*J2HEKt>tVTMPXWzTWFJn+9O{ zzQ#NM=lh;GYgjQ5N2a1>^HaBW*$0dQ5}hs*dz2l}J+I$DVtAvUbK?smP@MvEylW&% zZ=$}6q1E*>EOz|}C<@fzX9Q;~_JM@!6}Y`vAu;#w1>r%T0b%If#@vUU83 z6@s}S{q+Gc5q#_+B8*eAV7U5pLxt~fMBM}XO5fRr_kwNMC4M^ZwIqM->qO5x;&Q9v zG=T}Xr3D(Nd=VJT9PSqtz@fQSYz6nXpEB^|&z$;n8=;rqYE)4el4|jN93~qM?OXH7 z4rGS<#G+q`1A`wnxcXjy_*GF7Q-Z`ThCdGP@pipc+pV$kBJ)B<&hwY{S%hQ{V&@TOWB53v7B2iuv3tV~NsX)jIy>H11NAp=U{c6U zh7a7m*zJMe#Pv{^rsP!@>avqS2XEW>jV?Inj{ zdQ{R|>JANn`GC-1foRAu0-kowBan^w3^9xIW|q8Hbky62y(yjkCZ>FcMuX9F0cd)b4x|xRn=UgO4cehkB&Sj~yrUS8 ze*io00U@2yioje|)F3nf=!BkWQndp7KInHSu=Y>It+LRKAw)w!$6L(;K%;RG)OcA& zIT|qsfNn)Jp=h~mfAK1r-GvY8&~i5j_yE8T(K!I84+INPVBFg6EZG4v8P@*c3g~DtwVs$?+VI7noVu(8)*B>jR|H(E>~B+vN8kX+ZXZW zJV5Lh-`7afhUeXXi7!+zkLHMVowRFs2x6J@Hqho|0ZQwE)nV@&Cv0B zJr4wsH_MYP8T{9`7p{$vgp-)as%msyuoRvVaJl&Vs`hnNx`3P|)5&prAnVR^|leds88 zjv%HdFQQ5ihF0x4Pj@6-1fnlQTAD}h?>|1dK%*I}Mcq8VA5GpBOCs$%hP5>=%dVa+;Tt_SX!Oc%mf{4NsVxwL@X zvpP8(+ZI~l4!FptFA7^2RAa3dPiSE5ILeY!1^&116_gxm)$bqontq;C5RM?e$w+NS zxMAZhSlvOMbo=_4;4Xk=@Z1(G)E-E7rNkadl+%F*Vp&h0Ay-`)-(GnUoR&C*Yq{39 zNmi;dAroD*v0|iRUWNa91uRFdjALlp)(1D@WklS1WNQVqvrBUajgDc5eCur@QDXpa zeqAsESh0WMPYS-=I0!V@v8X|!pq z+L+pz@LF%DEM0n}yTt_m+jjwNFhq~7#@~Tc$B%aKixVbNFnE;Ch9ca(g;`s(jQZKj zPk%w8JBb0QiYxM5AVRkkN8h?%=!>0fUL%T7#jGlM@wS=huuD{_u7fAhz!@^?I7OLl zHd%5)!-zNfk9J($HdUZDVHq6;q#suXy*^U!8YrX?zW0w;5pKPghaIN|0w`?O*@KdU zOfh(9a^XY+q<6%A@WS-=yDfv(s#}V2@kEh;Ns?+es$DVZ;b+JU9(!1jQT@gxP?oD=377e4@M1F6`FHaej8?EmFWefO2VU;(ev7JKFdu#>2ai zq2pVL&;0JZTL_!rpw^jTc>F`PrUUE*XDf$PS(GNbDDlC{11$z1J@-x@g&I)pv@}Ok z`lW&!I}&|B82dS=R5T}E{(EBM_;F-CNod{Bf_<2bMF#p^5%BZG5}2pIif%H9?$&uy z^A#ZAca%6MsFq87=I86eXk1I{-HcxKUH`Uuy$4|77gA5y z(TF{e`}l7Nv}>M44+dL7QWJdcaf!Ud{yg3=UPqPS?K@?y}~c>)%#En zE1sMgOaW(1Pc}ZS@BnX3Q3dHjEeb%n)yp$V5$-Usn7*OH=tSUr@o!ZQ%P8h@nGPasAyIe)J6b|ce3q} zlY)%_GaWT+w%wJll7E=ijCJAlE5-_kes`5`xkrLRPKIX%@eL_Eo(Cv?BV);3+?!lE>ju#%&@w z%{@fgdo;@LwNVEnpUD88DLBIkiySdHz7Fo{u>QUaH9+J;K_Gpybm|*oe1Rj)xvwm z?DxljfgRqi| z1&cPO|3)a0=m%4nxVAV~!W3i@sC}R$@zfA?+)ESuuE&w5RpEx)9$+ZimXmd6f&_KU z?T3vp!D4U^hg4Z`(0@5+vx23{SGAaz8iE~ zVukLTxHe6g1ReS+>Y@B!lcmDg2u}^moKcbb;r$>X0rRAQ7o<=qEQj%p49viWSJo!5 zR*mV1#?aYFaQkq}*t?TS@_-s#w1DRz?K>Gqb|VO~$3&dPkW^dk3#>k;BorK1>AwX_ z-m5TodliDoNL*0f6f~futq~Jy`B)OMEnqdsctmBikBF}-c|lWLaa2~Kx#YhPa_?Rh zG}OE4L&ZT>*uCrQi^wpytiZycW%(BxdN;LjPN2ej z(ZP*+=p@XylAl3QoSbrLIMHY&;lv%vHr9Sk-X{vEiYEf^MXv`>16f5nI3UYci?2Fv zQwKN*Fb^h91^u15R}Kp!n|EW%af<78VR%-*#tva! zFjJ9Ji2vE;tz)Ejp1vqBPKnvFJMN{u=y5Zx3ezkBnjU6980XN)uTBD;aQpTKD{Z+6 zXkQpn(KEDgGhA)GVjeDRsbNcz98oNG2HNF$N-+4oh32b*jMAp^|9V*x2to|c1| z193DtC^cCG7e9cGH{bzaz(pVdWKvR-;6gB|y&BeIoJ0eS{O#cDN)pDX%2y9+*|RB~ zbR1D>t6(AnfHm-Lw2O5!V6piMImZ<7TkKGq6bN*--#Qi8j|$JFzU_oE0{E%FWtxt? zF5}N^y0f<%0MKn>Hn~GB@gbJVf_{2~#9-rgui)+7AJijcilSlU!HWWF7$6&Ux*aMK zZnttZlO1e#!g0Na!q6+9vUkx0Je&4vtI7v!gjv%q#`hTTN`raRqhXh;w0t?+>vPJ} z>@fdZZ$XO(J)q zk;RY#@H=(ClM&^5j@D^{?P`?3Ani z@7)VM?8r#3ADVVa7Ro1aDImsho+ia@7&=>I0`Bl3S|ZtfVZb9C;mi%hJSBy*wWH--d_s>wa)5>h8 zRyYtb{GrrsxC9#(@3}X<5+Ey6WoS~8HH_{gJvwWn^uwh_K!fK!n{&O_t5oOT*MYnK zI|!-bAN2J8-fC5}I7ZoAioDvt9nJ!>q2h--N%vG8wmGWFM0bl&hCs}?5*5JaaS#fG zx*;@z5eQg@6Y5OErGkHURe$axI(y{%Xwl|4cb*WG+xfgi-e*X?LnraS5m0llS4)Ea zTQ=*hYhonE=&>zv7O4IzJ_G11o6n}K1WNC)^;S<;M`7raTuvo zNzU^lFO_`UNIF?6b3P^iGo(OZi zM_A&xkg+=5@bJXwqskUcgkc|uP|L6wPKGZc@}L<_WMpthFMbvXVS7;yQbMN@`MDPV ze21^AW8<9Y|2CymZ2-gfVQhZs54XLs@pB#{lsRFBwoRba-)d3zKWbCX_UL5sgGFGlcKUO{*OW^%TTWtw@cwmWB(L@P>-)zes26Fs1$ODlqG$x8K&w<8mWG<} zQ)_Y{!M)oq3L14oLp1@6&k0iEPwvO^D2cE3w~r_6aHXA>Wuz?pRLESlxK$O3r?}}I z7ugs9v0=b{0sbv=>kuIK+U0M!C4^QlA3MvVt^3@>>f>=hylS(cTKexdT$D~DAiv+$ zF0eq|WP76a{_o>0Zsb zuf`Q-pJ}GQ>m1N@MRZ+`_G-zBp>Nmho!^oMpEWvB-(Z2Cl6c9#%F+j4X`wHY?+pQ6 z=sXuN7LfpI9OIQcSQ+8Bp=~SeqH+~Lmeo({#rOntnkX6r_ox-9{z#Wr;KqPRS`&tD zvK`Q?YaQs2TDT29D{hOOPkvE_TUYOEoV4@%`)qbY-Hq}e&cFzlzyYzJf{$KFE2ZF$t26jN{bBrd){RJh5e;A*PT@0&Q{c8uTqr=$GO zU;?b{qO{I1j)R}WjVXd87Gdhie@l7cb2E-KwZy5YA)IM|mbIdQ8usG%)8#rXmv-Ty z2N=_7U8|o{6yg$GkUn~66wwU5wBqJm8=KjhywWe&6rD%rr3X!$IB-a9yS0}n?{D9G z|ESOUpW(Cp{PW$%zDoqzUIW+F=uqs()mu@_)z+~RVD0Idnto7-=q)DXnUDj{K)Or@ zV#^@;J%{N;5hZE7CkpfZZQXfb*>c5kt+i!GmCBq%t>hNCJ?S8F%cVFF`zO~FP?MPN&EChZR z$Q%RCbG*@xIk405W9KXs8u!)B()o7MGl>Ewyk|HD!goPQT+tAqAgA{IN&u zpMnw048#y)!#R!KPab|n*^>ofy!xMiHTx4Fzn?3^uTG-Ug>7Bzyu%NAa}L4dVavFH za;YtLKw7gVrV=2m2`Pvvk>=BBlbsLxDKN)dI|;3&Dp1uO!K!SL(^qtO9@SQd8ov{= zw2|F1kPxn5_6F5WHequzn2P~k?HjZT$b$=)?G=&TNv7rH_d*c<0iy4B1z&lM`hnQQ z2AmuxprHn5MSW@Z?gInUM+#VKhCBeqqfYnsD%~a5Xmg<^&^yXC0o0hETp~j_;cNC% zEPAK;l3CJcGQFG&;H-PV+I@3b30@NC2ahl&&OPEVd7z3CwD8_H zbZS~MtQ8L(x86n32W^=UeFN;G-Q1TDhEYohHaMFMM~&K>@z~OmgyCqb3Dqk|WJ07O zhPQ$Mxcw4CM}LmhoNDJjRr z0K)Di=)<{U(ygz6_Icp2DMO7Qp&KL?c5^xvLmI4ic{Ngyb&?f>7g>KEWc&M!RQF&w zEZ{37ZQOFiEL|I%mavNp@;w;K3|q$7{BKj$xSiKH5ao*fK@w3AFq;$9c+aMb46*R? z4#Px#^;<;1_iJ#77QUgl?8D#Aj7_GM+NaW%A9i|2l z0%iSO=jb|YocZtAqegBv4BJQmrW3a#Hf`8OQRht;EB&sHQzqya7(w?-q?h}=+?=T+ z#o&*@{p;U(Qwt%Aa7+bDzq?g9R8iJATQ9r?sDRiE)9j!C0RWR*J@P(a2hb2m@PzHb zO~=OV1YHf3coC4W+{E#>pBxi82G(r);=j+l4%pGC=xuk|JsddEZoDo~VY8>fV~2m~ z5h)C|gb3Ijgx>|H7hAB}we_ona*TkS0#RTP&WhXRX}=9Bx|x{nvdi?0Mw`f#GVhyT zIiwF`4lvR@Ct4UyFR}NU*g`+k_F34-%V#x2gymky!uJ+%&#|-azZ_~0ZnQwYw*cqd z}J<+apmtdawnfeda;zd0Phv7WLvyE z62~2gS6pDgZzQjg(H=i+P^-iL-B55q#laMjD=~59Zhgy_o0&>cK&zxsXMz`?AZ5D% zRP6%Dx7EZ*;@hrL=LU7z{8J(M;diZ$^4-1V=a9>+dfEAti<)n>X>SZrHZwtASZ2YA zoOFjZZ<&E!8#0R*#T&eH1Rec0^r)C2v)e#wmaRpd2Z)ThyI13H+y^=$QiQ&LFf_wX zPyWR?(OX+JOE9@v%4Q62Gj?YoUMUuvJ@mv4xE9CUFghvaeft_&@-N|Y|5Tn)cJ!8oHs`@1HUNzBg-xC{`O6&Uva}?`I>P8{ZX9+4141*!e5VCu~x2q{#fa8&#=AZTA6*Th+jb)Q#>mR? z6?nRS4Yq^!6TypnUBa`^Qz&xUExa@v5OfUa21kCs3;yUzqppAVG6L{d64(&0M92sY z7vPZqrP2-^;do|0GC=x64JgD2dmxRphH2kj&BipCLW}5k%7Xx8Vm(DykH7Ym3e8%OB97RME5R`CT+R&_jP#MI^Kr#_d!Qd z*+daZy!U>>n~}Wr`XDbAp;xYgf*E8u&mKqCE5|#Ut;EfR%okW)&I-r4J-$$p@Zp zh#MM=Q|1{g{I6C)$0nA*n&jl^=Ftixi5PhEXEkjSywP}GigCwZr&AL*+fc5GG)+mw zxDJppznJ7kj*R1+$@|waFUjG#d@~Pm2N2Y3Mv0LCf+H486qNSOup3Z$Rz5EIi};9e8EvnkCUCCzCt$H%z*L(H+f6 z#l7m8mE3E*wWS%)T~g=?p|g8KG_XS{uveI46h`(gVT}-?J0!HT3IXbrWZ+_1Q(pJg zeP=A^bXa!WP~{&0ypNW$GQongxO5`_ZC=>y!dZa@f)b1yUsk8(y~4X{&hzl4tHFU% z16Z1Xj4J(%UW-+QN1x%IbQl)&_2L$iNpVU9-b(;(ecZ(uM@0&WsUCILKih`zKm5J? z|GS|toMW8Yc>mqQ@KMznqQ7v;!@sGAKVe0`7k~+g5Y=p{tUN879zz)pTqF;pW&?0e z&f)H{SwNE{015d_Y(mQe_BcQ~5e4jYG~ffJ@8vnuy^Z_V`TonRBJ=mRGBJ>69**jb z$K@0{T!U&t+cyzy&qJ{RLocwc5CI4U06M)}qK<;y=;)9NdYj(I&42%=E4Dw|hQ$5H ze-mC2%8L|55g#N+$p|~L7cgQXK2yT3Rx}10&C_9jl;8_-H?7)S7in(!QT}WjjJsrz zaT0o&Q1h;lj+l7=nz9W|iS_VMTdQ$}7J${-1fv>=>ejhpFDv5C2Nbv+6d2{*1@p8) zyW@I!7W&%X*&+GqC#%819mYCx7nU$*DM5w5OXCh@G{}MV&K3#F@(4e~a67m8i!kqD z03h1uwoMiT$uHMu zcj%_|Y9A6VmOfx`>1Vgt_{(gpy`&!Y5nEJV(WyllOKEB-GYDVlw{Oq|h_N`O_@2#R zZt|vjK$n$7h6XO~47BVC6HG;FFtFkQHkZ=arHi(dUFoCq4JiV^|Kq=436!#Mx8KB;ZL~$4j-F&d-Hr0)rzKdA^uuG=~zT+K#i5{nb z_&@yVBwLkloHbc*c}H=V4`XOHtQ)$uW5eLhzb@0Z73lA+ZU43Q@n~k3P`%el5%u}ah1o9J};s9vIR+?4TtC&7=U2O zNG-qdXZwa-iI4oWFwiw{YkDgWuwuGpyYh9v{S4Cy8Ls*ts=*_EL}7JY-FN4Z5&A5d zdWCs6P6|5S5uVk;Lus(W6gd_Nb7p5L`GGUBdA>Y@|cet091^JvkMSf*-n7sXIx7uzlp9n(IRbP=)>uP62kY(t2Z+g%Xr!Qd8Aft~LfUpb@O~Faj&34N@YOS#+ zO`861gPxSb%l-=CU49|GM z#5Sps?rRM0Ob2!N8??k@cKmmGEkkQ!00AFyHkvp{vInUUbK2xLTEAYpxlruoH;KH1 zJXjHiv%|QD&o0ArFhmJ01;i@6^UjN1_saHRDZ|<|Z9@|jrc_LZgE+lJ2P%a!W}gti zBPPX7Jj_8DOjEMf>dsq?tN**95X0LH>hCUM+TlPEV&=9Q)Ay4PolqjF z(W$HBsGAD|{KVcwfF|R;q4Z~}6RXc7v@7(% zS!tOTS-}Vy%4fl|@Wg4SefUiDdhOs5@4RKO(>oBfM!3jmj90#|aU@+Pe`j{~_VQ8W zDjbJ>^(<7286|g20j}vpeix^#jUX` z`dA_S<>ErO#PxR%rKPsgg5ewCUJKbn$m+g{RJnkO-`tFZkC5n(rk3dgqd@+sLBb8` z#`_vYYDgb`zYE-n3p>oyEZQib47_V-CWu6~rw5s0tgT*y$3uWb5Z+921i;qCeZ#vs zdPh_H@BZ<;Yy?-xE_8uBQeLh=fnC%7!{BIOBD1@JV}J?0RN)x*6OKMURUmxi_@EHA zci8Jb2VqeSz@*V&{KqBv!G-rVA~?lh=_Ct67tY zTcNyDz?$3oA@K52*<|%3-G^Ps!$}PqUald85QGGTE4fqt?Hirc0p)7F$NT0<5|f2{ z32+i`!`;{8Bo~5k6Fcq^2N7Z{7WO70(E;1ZWM8=qq}(5hG9W_^~|C-w?x%mVC4&VN{&`<1fEY4^!)-nQ144({ zOPN=;*x+?q+nwu?u{;+{ls<$#fyYKA|T8J;!65ihF^ ztX_KOmpsIr)RaktVTD<~CWO-EGAkhNE};OCz*&L@0sPmj{HJW{j9pmumriwX-4hq+ zFGR)+LnLEDB^U1`p3QqaSSq}1wd5m5Uqtw^^kFIR#o+X&>el+rhj9l=Z41KwKInIR zX$J6_JS@V8;N}lV1+j}@trlZ0St-@hG3IGfEd1e10Ofa5oVCQH&V2GYrW#BEA1|9hnjZPmFH zeE)y|H%fbg&F^2+}y`!(qTnvTY5+!X5I?tpHDOkoulkYov{0NpwTv4dO` z#4LgjiOd=wwx;-@io2C|?w}l;7e~pC_;O)*X}F0!`RaTf!&sh59U~n~U8@5Tb@&^! zyxfKWb?Rjw>223Hy)y3^TMbe=^S>RgGx7!C@xC@m-8TKabkP(!i(nSEd zedkQWwkALngl(`O%8PRiAE3BEhJZs&#}S{gdivK7u*1UTN3!zTf1yOc6+nb!>HFX8~T@DJle8tsSKj5FG<3 zZ%a=9G{pgzJv1Nb7;R%TVpEe~v^<0vbBS9C-*n+ycC^E9(6{m;!X~bG$ggz8&vI1` z)b{Az$HtST`LWpOg<|>90%$G(5Z+j^o3Iz+5&sRTUK(?V!KX-2C~L5Kxi1Ju;sjU$ zLnv6Ks}Ss$Z!UBnpJ#c~AIGO1dXPj&;J^Mal)3FS+Oubl!YW~2)|NhApG;)dvb+v2 zYPzgnpbx#W;W$B>%$xJS09Zh$zwP(rT?&#!L$g4m89wd~9@2XM0`R)~A3YjAGOhq*thWK&UP2JS_Xm5O8}doFl zL3a-ec4DniR)m*o?`3W4J&cT*%V0eG&i1725s?icD>7{vc}l}0#^s_5Gc63YAaexH zc6%mF+2;2TJO~26(nI$9K40no`QuY-^y0r^j-jsYyu7Scs3%u0)zERwD&K2V$Ta)i?-zU(5Cu$R z0v7fymr|8vs>h@olUsL($}N~}_%onVJasf~z{|>u zi(rWs@=#N%^M7@KA@;$dvJ~vwH&`g_b64vLfUF(y^Z)))EB^cMoi59;hu$!Q07BLn;{t@ zwDG*ndOLq=3_T2+agvD+&U)gnT#0VH_jJ5zcorHs&J*kJbpkKq^sCJHrhm0PMBH2}q|= z-8lhwZihuKmKeJn14(G)FGtn9m2QUw^DXZVFDewg(t8Dg*t^^_Ifnu>U}w%L4N>rX zqLCFA52$PS(Q=KH1o!GciGY3&hh>9!c#A*1@lnm<*iaW4d*gRC?d?VnFN<;AN_zkG zfA}}@P5bcTgwjNpw{_GN&An9y-$fy6=(wG-rUa;FlVxfGU;`P~vB)6T%Yf`tH{KAlsorFO6h3_^QCmQoSPC zzTq#H0}R);;+nBuTH4b;Xz_KFa^68Z8%3BwmbPBiYT?%;1T+*$aDXJhyv9#iihkcN5N=*ONR`nkq7J^KKsaGlbO8wU4IA0FA@(Hdl<8O>X{m}@ z&^DW4~AS{>cYZv?OBnaBD z9+_M>9$uwe*=s%&h~8iM{UFQ(>G^an|k7f$@S-2#od`EOZx&P-Wm) z@?Wi^9al%a?J;fwfPTq{UHv8-6$74QYsCcVbUZVR`Rzy1ZQ8X_v@c)wT?krDnW3L8 zMXQflg%`PBiQFe_9f#!U5mba)P@pewV+9>T(h@=o1>a8+KCp@Jzy1&Z#+9k1(T9bI zTUAFzt}telJ}Y9&4tHqfhpUW*I|f>2$PEDzDTN#`&VA}d;(*3ML*T*i#`r)l$u%rN;HP{qkanMoo%g!;Gv9{=7 zO)bV=RJ6 z!vw%7OYyPSW-rf*UM6?=4Ibo}kl52Pa0z2@UR@~A4&fi(Qz|ib?k#MTr$9ZM4yFiN;~O|>z46E{S6#=vCSvA z

    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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha3.gif b/docs/reST/tutorials/assets/AdvancedOutputAlpha3.gif deleted file mode 100644 index be1204dd7be8f00bc2edc1191b0dfd8c8f052fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30380 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

    iNs9DUHr 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 bD?OImD?@v+@!PUIN~hUVj@?3tfB*nHvxn=p diff --git a/docs/reST/tutorials/assets/AdvancedOutputAlpha3.webp b/docs/reST/tutorials/assets/AdvancedOutputAlpha3.webp new file mode 100644 index 0000000000000000000000000000000000000000..3b5d8d98c9db8055b8e6fe1b570e56fa31694395 GIT binary patch literal 25066 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 RQx;vfMRkqb@Xec%2LO)yhV=jd literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess1.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess1.gif deleted file mode 100644 index 20edf21631c4ae1e449bbd7db592d99a741b022c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15951 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 LEPuaJ0|Ea7yBK)) literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess2.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess2.gif deleted file mode 100644 index 5445c0e216586c26262dad3be592eac79cad5835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1868 zcmWkv3s4kS7Hx))jgX{ES>(B{3y~EXCOG+stV>d4G%&tUyKKi5cPiy#u=q7GRE=ef zEfv&O+_i(SPQXnj%ST4}btG!zCz9~7VNmFhn2?ybl*Q*Uz`z@jF#cfn(RJ$7>D#w% z-+ONL>y&ND34h$3;-m8^pr{CM(4XJf{??Y))82R~&fx3gLqd=IsHIE4L`!MKUayx( z2#pNjCC&&T134??c!A>;4!4pBhZSH`0EPg!0+MDEI9n^nv;u|)jKZmqQx#xQfC_AR53((~wm{W*%uQVrZT-BCCu5YXl6Ec%EaBMk6yu zW|=1ytPq(sWR~a%CL+Q}a|DcNgQATW?W~9~uwzA(6%hkb7BvDMXc!O{c~N75CIiAE zE81xhYrw84qNIo#5G7F~fI!m#VG)WN4KxW57HOKZ(VWH3*){{4g~K$5EkpoJ18nCk zn}Nl`sWhirhyW@LRKX_6c3Ht#u|dVoD_9n6S{lnvQxQg%BVbt0%5uEQ+04LZ z@tSKwU{dh^utzUEh7H)`pvQu%!34o~Y4={gU_ZBM=RnF| z0#^JI#U{n3J&6g@&(!%}q{{pnOr993q%h9+a(nNMYnEgAQ7;uXHvfqIaiN9$!{4)pB8knW43(*xnrLlK=ot)Jv2W)R#_Af!E8KWyp*G`4S*EX{gWggeKEGkthpnSD`;;3AjH5DiK{>t!x}f#8 zQsXasGymQZnExDz52Q-_H&K1HX&t5Ou2Ki??-Ys5v zP4{!;zRx{@)!F05yI+UBHIkS!d|EfO`}Y4He|*xn?Z|ZQc|+u@an^$QkuTqT6cj{R z2Nic;Wub1iC*|&`dy$U4k?tRaZG|4g{o)Oa4@WBATYTg^e_`>l>k3|c;_lwyeLDB! zd)|eIV;8)OPd%9Yq=KucWu`WrVYR!6POZ|daD!(XG`*O4UNLX)Gz$Qog zvj^Qr!-K2o6jR5FPuya3Y-;uLbVo<%b@wrYR2`gc>RkP^`*=cc^|S9gI@dmS7bgYR bFvX^u&##_2vD}nev!cSWHO=3T`qTdb!+oUo diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess2.webp b/docs/reST/tutorials/assets/AdvancedOutputProcess2.webp new file mode 100644 index 0000000000000000000000000000000000000000..6a5c4c30d6ec6480e9d9aeb9c36830da91f73e00 GIT binary patch literal 622 zcmV-!0+IbvNk&Fy0ssJ4MM6+kP&iCk0ssInMnOOTPvW$;C84=;a3GN@2M3N8s4ab^ zgN)pi5IHVwFs-dE$hG}6E4F_Gs{0@7zkx(YfF{#g+eTdN*R1eHkr}OG4bckX8?B(3 z|G@wMYi!4)JJw=sbUHbMNZ3ho4-|C>g9J6as1GQL`oa!kMy&%PK~dDePla2n!mV~2 zVmDhvVikqHK9V!&B&Pl0P*F@g@SL=&b(zqr7Fj{4sPp#z9gj-$XrAbb1z-hUAX*{f>5$Wi_q*xqYn@wLT$|_1pD**TMtT2x|9k&? z|9k&?|9k&?|9k)cyV{sx#z-=*#-#CpSh7~CrE$?X8JiaSvX0`mm9lo6rN+h7vZ9ep znkb1gmC~AIJI2At#*#8Csbp18jTBqC*esSznn?O&mGotqlj+1#@mP}TR?Re#NsCS< z&ZKs+ua-(Dotm}A$rRf%Y0_s>$yl2iIayOwa;$+xxn48K```QD```QD```QD```QD I`~S~m0O$Te7XSbN literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess3.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess3.gif deleted file mode 100644 index 0da81f174b9a76f91f93af58022782f91ca51f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1912 zcmWla4^R}>8Nio=z#dS$qZD0atWLJT2?!Sm(D(A6s5P{raXu-KBhj5?mv zsCfZ3TmPPD&1ny0MUZXPuwbYc5j;36S+yppjenRbk30UoJLFH))a$#Q-+c4iZ@zi^ zz3=VLE?b_T_4bApLE%A_6cy)>SnbfwF49-%peQ zW-G5R;q?N~Sa?AMObNp%Ja+JUz+=GLlmJAqgVi&<&BEIpJmX+VjS~=9vl4)a)5_|t zECX0QQdI;WBie)@i)bP?#L!3-Q6EM;Kz$ryIb;&_ETac{WR;O9=mCRN8ksOM$pTry z3Xn-fCXtR~;^OoWiZrjMc}BL;&;}q^kj(m)jfiI9dCfr`_|#WB#SLP>^_C|fva0g8knmLV2cNoFx-1A^JWC^#0A z49AkmII&`(6-k9yBrUL#$YM2cjFQSqq$#o|lA&3N=6F5FGugb^#M_*_&B|krz}l<< z0xLRs@`gA$0&BJgAmT(0S&>Af=PVXZAuVC71oo~f7C~{!$RQvH84f^?NfIN6s5nJn z5z+KxfHA-VdMp45gTT-@K;}lG#Gw)nO`8y@=LAGza zo$%PCkR0H~y*Z_MT9EB7Y5bwB@~LiT%i^%E{P&wyzmZlcP{r$lqnNqjYpGJ*)Z2ep zP|%T+Put!qiQ4j8DkjJn8R6~f`Wcn-Z2vs@lf&9s?j$%(Q z7b$T{dpDtMJC&Mu@R$CNzdmp`NYhyIHAP!J1ILT2 zICNrTO&R)Y>DfkfvZB?4zO3x#25q18l?|TSjv5C~@0{`s{%u!iqT3Fm%iXnmbxrO% zF=NPm=1_j3r{21{+#{XX)Z{s9+dAZFuvaAxovW`YA8I^zwrQxTxpiph{Dp2Nak#mq zuY6d(jGBi3er0NC-S9s;LX$==T#pt;F1mE*M=ted43B(uJ3nc(<-66wsB(YP`O(&g zTZc#6`m2)0EJpSgVsbPGT3QP8Ogv_q+ zUZWG1HhViGGe^8#%(7(P^{6!!KIfdx&A#r~Z6m&(`PIqeuK42><2M#IG>`u)xou?p zW@=CJ^WOA(709E}0&Ae(PXv*rJKsOJ{GHxMN6=C;n~B9G$pZux!!fcdOQH znf$(Rvpm^Xv~6_qUUBuJsrws`JIb|hPL#BsnhY^(wDZy*eDsjAR(2lI+4_SX3Dqwm zv>(=@PytOyR`B3>!wkCLrT`@hSSAarOj>MSn!8^<|V%0 zzdp4id?J1Mt$ylIe%WTe?KK$dW*&E4*Jb(#RHG#y{_lTMB4M(kf^VJ1@}(!udbdV ztMIDMW1&gs;|huE4aE!gYuQh2Z06UnIbpqX-PdCq;}0~xdC=^=*P`#S;k7sGPOV^K zpM87B@?RVe2&%0l9U=8>@+SOl4(NRxX3KPeA#1|UlbxPIY{1FN2i+9mD`TYZwr zE|F1Qg7ISGln#N1^QZ9q<41?}Wqv=FOur&ERk*8U+LbWP`pFWPmhNm_Y%Doba`wK8 z*{NDB1}a+>W49$FO>??&=DLQl_Zq<^TUG8hoy)j%ww8BtN#64%W=V66no3q~SIm^1 z8M*HAPVwi3Ldqw8>X>_bZgx!FvVW$etJdK?Mo%uC@pZ~y?dxQ;IlDzwbIOAEv9C-I K{zr$5D;NO(=`!g6 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess4.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess4.gif deleted file mode 100644 index 18506faefbd9d70fe7b8d9290d126c061bc3f6a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14500 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 OF7)woEENF$(f|PHDA(Bl literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess5.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess5.gif deleted file mode 100644 index def0e06b4914cde53242de081c7fa85aa67b3989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16896 zcmWhz1yCE^8bw>I6iShx#T)Dgid%u=S{#DALvgnf+>5(A!GpVNaEIW*trVx_@pjJK zIp6MQ=kDFvnLAfnR*H|`7>?|X`~wMz`UP7_QeEwv*mp@zHg;5GO~<4g|%B#sEaWhJavDIlu)1P}~UzcfzB=rmu0uomo&hIUp$O;sR8B0WZGD z0>0LdhQlCm7@#;BZ~=jVAg>Gnz5u|0c*Pgd@CyJK0)W9TUWI_bgIO4$EZ7AId;tev zWMM=DFrwknFi= z!L|TfJcKQtEdod_j)!52hX;$kfC0hLKo~3<2EzbHW55tFDB=PNL_mOu3n0Q4hycEZ z0l^R;^c5FCs4Wl*1cF|1fq{TvATAJ)XdvPhFd#zib(H|Ya{tc~u*p)aBHc_;cRn#wW&ry`|9K|OZ z*5KfGv{IsUIC{LG z^%!#uzRRS6=|(mgu4|@u#m%V0SbWDYMxr zk#e!-9wb_vpegrF^D<+3R2=qgq&pU*P00{Kt^z5Hk4Bi1n0V}>biYIkFc~H3dPpd( zPYDVvskBjg0#Wesb#0M*8pMz>aEw=}ZIIYAej%qdhrEFt{UoPMIP4o0rQWOCPBr@F zW`eY1KcFij`Kf6MA27gyBw}NS$0*kH%)4nhn{Z2zLiRC8)cQNFS+=O$tqYpvFOr#1 zjC+%?07t5VC$n|m1O?uG@@+awDAY(t^AModqA!`?(M?pIE*Z3zY{5kf)WwhKi8G7) zZX*7M_D^D3#otdBU~3e6qXCpFv`eE5L zE_+d^e+<*7S~+7<9M%^x_kGl|t84#q`)HlRZhD`!gDXX22;J!zn+#Lwr`x2q4K+)QQ$rMGxuGZ^=4jO%l>9T z+Y)lKsOOP=Gi&6-dOMAT^Sx=sA{WAgWLJ20yZmFA^={pD$^LG`^8muTZhq$(Ny-jh`)P*NUWhEmbFYKE05X)8?hvr}MTurKgKl)T#E%uD6cQm&3$y&%eibm7lLizfE=g zfk`|5{j;PM_xEqM{ig6Q*^eaqJR9N~hxb$F{0O^y%6~8G$w!Dg z6E3bmgKsbMjh@CSLew{(z^z4s_Sc2GWC!^nU$Z2uLu{1c9~u%J5-HADCue=GLXsJ6 zDW04JH+%3d8S$`$fNEU?S7QO5?eaH~^DD3)+8$LUpUhYIbi6km-A6)zj1!QqbgnO z3CRreqLvVCGD{;q$^1`5hQq+G4gLe$a=uka!wj8g>H0|y?_16eL1xd z)zO)BKEKRs5i$pcwS1@NaZSLGJowU&Iin@unu#-bC<%NV2y<62B-B6TMqll{a#PEi znJrKTAIa-y$fYkPm3TH-4wW#1;1_BS3WtAVB`&Ju0v+xKPcSCrfh zX7g$%O4VLo_%+JguFL5~+E)N|h4Vkz4D_O;SUs9twNNAn`$`c# zv&l>In*z-kD`9M##X19meEo$Jt*8iCM-H?SEDTh~mRIWf;8q8>1DX-Y&*Z$}so0|x z)gv+qL|G=RR4xWG=07g=f`}S*30Z73B9|997i+2{?M39VbsL&^pqAMXdvkdZFXbXs zZ`}x4y*M5wr`a4wcw%m9yE^^|tpRqjx~ed3WNF@IPKKNxS4XMB**uz8vdcUYDz#b8 zp;?%$jL5YbdR$!Gt*dS<4silHdm_zMH-q+`<38{;rj+)}jT*meL3N~yxt`pZebeD~ z^%qCnYNS)eaHkM{wfN)I)CzmM054nku0vW+{Mn`J*XXS?i?l8ji}UX)6DF9CME#$- zY=fV8z!D6L0$0+@{1x0uPPreOhghTo^o-+5_y;L@zGOl>5F<_ZIj-*P;iW9Y zY%YtP5pLH%uf~lS-rlzZyJ!n?$xXK+wTIlY8~zd5FMm<{H5Key6?-EzuFt6)=FjGU zY#^sI6xrGa|65a}BCM@(k-A{)22BD`*!EOs^g|YH^C>o_P_Dg)EOcv9g#{%)zJaGt z$TD0+^heuT94xLRYu+{#Q=Gv;WOEVGj^1_eEDfHt2jy}ujziny{S`bjY@~QRr7KTZ zDl$px_NVsyr5-KBS*8J76y<{h<4ZZy^C4M)dd~QL)(k&4YWEhGS5|q*@mI9 zme#zS!?NhDC+hyDqVns>AMf_3Xa1@fp6Ctb_}d4N<#@H*X066sRO}q!x=uUl$0Xu1 z?!N!M9~jj%(;3SrKbmo`ua4Bf9}08{CrGZ(^B$2{YjBGtvrvuW>)K;LH`us z&sUh$e^ha|W@@BxODaCz^4z~CS^@XZ@IOH-`YS1!NkwR%s=*t&mJ|K(3k}7Ky)(ss z=Tn=TlW~9l%JX?O@OE4-5~)25xuVd!pU^p1TH+lboGw$WW|~ccN&+N_tihU2I)wgN z9(J%WKR~#5{R@MyGqE{AswYX92k0gUUE9=N%U3ViCR^HnPSfA`&f9s>m9FeNN>~t0 zn#!)UiBW2R8L=WQgZDSjpd=4f^je)WbGttlRvxLw`HTUpivcU4I_y?nrUwCq(m~tY z!6`f%$mjtUMZr-Y^^cl=dMujIy|puV8<=bvIJ0j}93EW65SFdwa~>ANujTA;@B?uZ ztXd`*{?<()H4wcn&_~AQ!qT^d*NU0W#q+a;`JO+4jML91J>{hk5e$z{3&CjG0qt+K z+swjIjU5W5yzN^;b1(v}!wuJlB9Y5NN_awELIbu4z)Mm=0aiiMi(!MBKiZdl%IAW& z8+>D$ErVXH%nRR!SB?ZTlxWzN>4B~MGX@O1wSMA!_Cy~FDb(=GKU6-_RJZ$rcI;tV zs;ygV<%4_Zv)CNea1f{v7VLQFv8fFXOO09^4&(V8VTa+=$S9Y=ZTIFNz+F4|>5W&} zh;&<;W!ADE`bwC(Oh|*Lm&T%x1jf(%mbkOq*g^@1EVtMNjOaR<1exYw@w5=~aNmx5 zj|RdJrU&pRJ~vXGpvccEpLK%&!;Cc3kU~!XLCfcoP#VXi6S2M=adIEL8Wtgj87Fz* zGN5g**Q_G*pzE(4;-W37v6mqKHf(Y^a;h{2vo&b8ELN-K*B1DvnNFzEk`wSKaupGh zWfcQ{8BY1{O+3$#cTTaKFH!1esQ_C3z-{-K=aCf8#U!@Ya1zOg7t5#&-Xt#!7aQ3a zQ&|PHA84`8>3AP#@amDId;GC9-4$EhTmfl+Nn+>2wHzLtSuipn%ke>BvF}L|s{ux6 z{J%o@MbUbY+FCO^Ml;dAC$~z=pONTj>0~XHC5|iynadg&mi?ePNTvt;D!2AJxd}o$E@a7u^r2T538Zhz%;4QTr3PLL(Eid-ux*3pIcU0 z)#+~kg{N_PB@zRYKj?^;tXODb7D~wFpzpb&_qbD8=ip=byAgW~r%RDxrie!r1+N5F z@Fk*?X1S{SBa^28IsmiU6cxPOMGr|7hNY!$=@?^|=9?YFm>(6cV5BKO7-KwSb9HJ7Sj?_3|n`x#pu7Bjv25t`8}ehNQ7SmKJ-($MVH2tYm$~ig^ml3&l*zBrf-U zNc{7*6wO$V3d8U5{s-9%II&I#Tv)Ft5~JNBxi3`$XvIFxCv0t2u2kiztXv?i`rKX&lPHlYPYVNtz>nf!vYw4mH9wb| zTYU;!ttx5dGg@9sTEfE{kNA^Omg5N znC1-(*bPMy9W6esaDi+pP=```j)8aSjrUIvna*N?n&PL{p5`jakJTa(A;<0IJsH8) zf_dk%6~0e(RkFD@WN}0(Zi%Bmrk|QMu+@`Y+icr&`m{6UZ!2}9WROVPZJ#<=`PxsJ z>ZdVtFDp7JS^OkPHT%X}jQP8p#yv#6yO`P<&WJm64q}DJTh|3^Bp&*>(rXA$`YYuW zZx?D@x%(}c!_<#DBHDiGS2n6wwpT?BT&>o!M)qTMMEVGH=4JM@`IOnyc6^d8rJv|Z ze=Ki*tj~Elu5Lc*AuBSB@GP;x=@YOmO_s0DCksm@)&4LsD9h3xviESfD_jY0j5cFk-G9W5Qhg%i;4IAC$IY}&T+P3^8oa=s4}`8+rU z(5TL7ob+?AG#dVvh3JX5ZIxS1Aj_u;-{aCiyMS^G57eHrlEdCf<|-?J$}${SGhb;} z=CFZGe&TA++h@bj^r-PGi@XKP*ICtWO< zLv@%B?Ik!}{GiTXFE}lGpW{WV8WWy6Eo9r=qjJ`;n+~EnI{yqC$#jU{3>tbRX`D`P zvlJxr3-V>pVfQ#!0Xe@+N^piyPG|ckrZkI2sRf%z?E2n9B2GXPp9Do(S28sr znWm?(HTl6?pE@N)(7O#-?{aQP)&xOkb?C`Nx=dx>>Zs(gA>QKqhd`vi)9+n{m)x@7 zqn!;T5HF+=hJRdLG^QB5W$gZB-!CFKXoiu6GnsT)2`T^b-IA|ZEHhyxDhApX-N)jv ziQ|ieZQWiqUz{}`Ba~ylG1r~7;+1MWOE)AC>C&%PR;AFrHL;pTmd_Er%B#>`>)H2G z8Qq{W8%I7F@Zu*sUNwCeozpv6C~`J3{%!`4J&VIK{BJb>QE0OHx!<0Ay6G;Kr?GD~ zyCI9By^LAbih0g!ZQvVA)SIeR{)vL>$7=eF)ds}G?>9&k!o~Fah1mje*Zi<_1vs0~ za=&8z688Mhr+}Xtjgc}U-EL}k zV)NTs{nvln1Cz}#pS_89oBOL9{eMS=u{|Apq6^weI_$dWn|ig|xARZe*#AK}vLi

    o~_3+Ic-&D=N<$7KCwqk=e zX!}8K5HVkaepWIUlRfIN-*Mb;rqtCEHS&#Ru1De6y=}Mba2Dk}PbJzLUfE1Z+D#$Y zmcy343EzS|ZyClc!~M-|mFAFf$LJ{F$N$>>Xor-A9dGWNKijNC|2_C}eo)!5EdXDN z8OmDQ(p~Xc-|b8rztD$yln3hgU2Re}Ego!6Rd-D0!1>_aL$L0Ty1S1e<97IxjmW;-(84b%-icNw0U#aAbyT-28_KGZqP{Y{tB^{qGvw>lP$-s7 z=hW6At7f5?3sj^G0en21%@Q;&IUOaio+R06o zwAg}od1Fs)Ow8Mxbm><*Q`(a>TDF_t{elVdJDd#GsjW4ER{t~YQ`p8*B+Fzq8%0-R zZ1mNk(V6ej8812WY(ARmI;n8SZM*()){Jf#0Ka#$%3ZKLVN+&go9Bp+DHF9$~U6~5X1-`cep6`{hoJ$^c>*Q z#`dEV&}`+r<6HhDNvK6G+JFc2b?iDbIdvF#KO=Z9`DTCa#YyxI?-Z{MNg6F)rluaX zw)5&^tE+Z5*f^nrNJS0IW_$U4|>Ccbj}?|3{_g^wu|C-q@)! zzDGcEVET*tH*V#A-ZMR}h5PVg_2#`KvM40QU{-EE^lJr9PBUd;LT#6awMF^n9O%)c z6WN4|nrU&&pLN$coO*2}?a7(~6bWI?S$V^%gc+PS`xS%u>~#w--b%|)pzk~ndD?tmZWZwwTAv+rb<_+r!7GydD~)XriJ zC6PWm-ytyX#9|NJL*hKq7*TRz@-P}>dqcz*9mdtR3_Knr3-b`d+Y-5ThqC%%B%p%KMV%3gVXzvv-a*On#fo3X>-`LR6`7*mdyZt!Nd{fhR zcI75hx07c&2+vwd3#9r@ZNEW>>{m_ChuVAkU=&d7x~5 zXu4TLDXHA=65h*ZXOcWN5r1gb549#STML;_?ZJtJ=yHC^9iX%jNDjLE58riVf9$sX zV81GqT0ysG{%1aJsHD$tIjoDUrk>kC%pjNzQ5hP7;f2BxERsmoKyt{pJ5v>OAG}#` z$Tiq+d|@BqT>zgrXc&{|# zxy&qViVzN6{8%ulUGCrevH@nM_;@w7McBC~hnQ-VEQ%d1y=*uizt>E#PGlj4d>Wq+ zDSjkU!!}LKh(wGIPMBAcDYoHf=mPgt5|J7Gqfr`D!sp_!G~~jrzyWz!(0HI5TGk`w zC^J14{8%-cS5Zcq0qRx`)gaugVpcaV(eq>% zKPw?RiWloqcg?!IiQtL<7=Me!^33GloO}kdwhdNf|Ixf(KUn07;D3DCR?R(4%4^|# zTbn}fXnalmZsUj=6wIaNC+!KLQO(vDw}kjI$OdH(B#NBo z(tJIhOQL`l6zUlx8xPNmM?%fh%t{tWQzt5+oDk>r;yR(RDaaebtW*H@=OtqL6bphB zb#qIVa&8r(-yahti>xm2D(AYLu)TrfpB1lkmIn(I0|H%VgcQ@3-F4V2Q>$_;WPO$= zOI%V5aW?Ulc_*QqiIwLaEQZD-1Srd~0rS30!Y)`^og9mimTESOa&41P26d=Qbc%sx z*owk&T|+%L$)`U*uuL&xT|C5-n>?j^;(hC zR8OBD4N<@D`f3+W7fB;R^ZhAI=L2tBIdmzC+eUdqDj7B4RLkhvrWGkpK0I>aD01It z1HQ04aMfu+&LQwEt->Q*USx^(Vof{syjGEv(%K`_TjOwO+D$L{QoxN@Ex1pujmGr{ z7g@9tmlm_WnyXWoIgT3F!%lF|Hf=J=nJ_f9HqT->hPmMZi? zzfIvtuDRp`NsOQx?l-2~e1B-B*gC`lp;q#hn*%FzeJW4;W?me}C4<(F1La2#($bK7 zQ%z@3?Kyucy^>8s^P4GirSyC$$%_0=#SIqK<)y7IolIu=-7xXC(aTZQXnTsdX*dq|V!WamEj z>RP{^EytMoy9>~x=P&`}s7+Zg367f-b0hh?(U3_frGaObkVO+DJ~WiSp3-_}f$~C(Gd@1^TUL@xKHG(KAk3I&c9YG3 z%_V#CBavC%yNN&OrSnrG7R`RXnZiGnD5gymOBO?vn0m0=4@v@@)fuTgF$L3WBZo`E zzrMSbxOJu14ib>%RaAdtNmP{S{~#4sbDGVYbx2R;MNf6^R!E$g!|2Q9e2%l&&ifux zt>1wd&id0%40;r7@~aYiFWn`eyEs1eu%}~twRYopOVgd%u}{h!5)cc&YZk#)>)exX z5qn~Tm_Q{78Wl3wLU*wfr~%Ev!V%(}lUQHJ`)g3ZUq=MLmA+OwaWfK4Niv9pNKqbBru3T|dZ5Q0=}zS_X=b*lOfE!zv}#Rr?QU2aMFZ3@3(=qop61xx-m#BTYCQ zkJ}@~K9E1L!co6&;Y;WWNnn`?1NAsb)i|)_2hcxu_;L-7`P4*AjFe!1n^qO4d2FLZ z`;UJ@GEq)uy1j50G+bXPv-ebY;w)oK-a+=vUd=AOA}1FRRj;Wl(=k5EXeY}c!Djip zS^TuFwXpMGRNT~;{VmoA)i1$amsSa~LHEz!Ha<9=1W z_452V@q^D8ET?K?mb2dqo<~K&y)W<7QR$|UxLX90X32l}Fbu4>{8E=y?hs}BQmMEy zLO9S8L`UCdU9Dd<0RfN4OAwIFBOwPWB8&dq7enC|#o)e2kH#63MwPSk9S<9bEocP( zl^6Xe6zj(?F4R!{-*e+f1<7xJ#yp*2jrZt$-%;g7L%D0w(!wW#?n8L-0u9;24KLr) ziT*T$oLai!ozKwh!8atB6&78=Yngg~9D2orO4qcd_b`|0S5C(E%s3ioV zA}@y{i=qU?E4;&-4Q5v}3sk14fP9~5JKU2%s867MV?U_n)@%RpR4G3pILWOi&T`Xg zNzncYI?a9gmTwsc$#YVg6@xE++7BsEMl#$`8`aFSE-ku009%9b1GK+Gb;+fmc0fTM zEl|FH5od%;!i|mIye~&#*ojMSBwB$E4+&lPJ0?YhT=sXfc=h1#r~#g+S*~g@^-0B| z(KXajYsJa&RiUKtS>SVzsXu?db-oY2oXd{{?Uh$_k2HhvMAf%}n_N8^M&y@sC zQgaIRuA_flUg+}r`(0gQOB2M#I)iT}dFW=4t%CI?Rpbbf{)?FjE7r->59S`3 z0pASp(TgT>(OF=(CJL@BH_ZLa>yGsuOnA!fK$X&=m+~Q_G}zFQ`-H)!pJeE%jfA0! z`4=4rs?$N&ok!SylnIfrA9y1%^ifc0%~bGNq9c~J<;IyyBoS0nA@v=IVsthe{5=@^ zCW0nDY=sWv-H4Lc4|P`Oxf6NSA;k%=U_nWVWsgc->vs_iAFDbx#L|70QuHO`Af$Yk zZ_P+lk=V7?gdzvIG33K1(l_J-s@gTzwau})`LpHXslWYWmW)~d5KAYV;yO+p)tOGG z^2pW0nDC+y9j|Suj_R5{Uo5|pb|SRPx@`ZvZpk{N$xU0KO7axHrlX>*vagMfy1~0X zamD=|l>$>f(BKPacJ$2%ym<8fbSb^Pzpq~IA!$Pad$Y`En1Dr>TVC8?U^tmnWPPEx zO;5BhYG_Df@I_a8O=GBNO@Byx^~dZeAew8s2)^y7?6oe~r?RNiX)vnT?%OGCzEN4f z$Mq1in87YxE-_z`Iq+FRh3tIV=2@DvP4ca~CYAxuC%d`TY_;SDJ@9?iBkEG$lk`U- z_+RLVSF03kV8Ta;cZg+DV4}yZ zz-mMW=8kL_#^>2XBx7eEu?AobAVYWM5FePxOj?i zmmUvDD8j;QhyTsC@sQs9JmU8EPSB0khMBHtqi(4@r;|p%y3&s9;xFR#?V}Ls<_(kN z0&_xg@m$Zng?Du)1S!A(M!nM6Fm?0 zOTL9jjh2VBD)|s>N%k=kf!tD1= z_9w;+vJ$PRt2NITzI24pSl!mpLfYYiHoESIe7CXa4t_D4S6zKEk6m7{*=#iAlhh?_^B11>4vO}}%9HhY3k#TPkcCZLsO$t{^qhX7%VMn3epZbm$84~}L^NAwH?i^cqrICIL8wid#Uw@3 zdW*JcQnJ2Ov`HyzL^y(k>)&@G`sMus!Tl~~!gtaJ?h6AV4jnvSQakm8-03;$%udX8 z9E(6K=Y8aQ#yJc+JJDl!&)*DTdvkVbRCay4^!fCN+?$FqMkfUS#s+!G+_;AHKs)SF7mtbKLV3&C|GYyZ(tE$L6LG+CV?;1YWI#Jgn2B=sK#U4em^) z)KH1XJ(~FviSwZ&Rw{>8(Cnl7+TnWCo@ii%w(C_$S76RXWrwqKlIiN1Q_!UT4gB1H z=!DDQs_dNhn#^?_V+3uQJ5PM~XNfC9)5zvbzLR3%KgPjE+}3=H9(E^DjX!X&ln4oB zrE{0{=zlM^i$uogHP-t7Oq9DSrMU)>-Jor&Va9lq8b_9;5~irb*awIriWVV% z#3=o&WRZPv(&-|a?ANc=hb; z!mAz#2Hp@=T|U{4IHmS#2|LY+ED)YweDBu%+-xVKb<}KO`9axHxV%-TV-wZT+$X>? z>v>10#xSva6m`hntn~U`>AXhhRQFDOmkWDR*nMPiJYJ-$-FNFNl_N)}aXgX3*yChp z@kJNUBR#Q4Lb$Hw{E6AV9=Y%N%eZyw+ea-&PvD|qorol>v?#aK6^4lJgMUPDShc^h zN6%uZu2I!ZjiuYWO&3+lBP;ZUc%Cg$>B;J(`!vR0g{PZ$!566x^0JN&M8s}W(RV{= ztDdm2#a&C@H)l-t{i1KaUpCzqI$Gf4+C?|HOfJgdrt&0yIg7aH6k~g&)4KR_clXSM zn;3G?5oS7?=>Bc0GhlK;ocCA;rf=1?m;Rs2uk}6I-}sF+Th$IfIONy1Y5nBZ4=PqO$di zIV=&|Y-@Z83Hg^3MZimJ1Tm-SURX_ zTaw5qj0E4e@ZHqSZY1AsxK#l7w)F7-NyB{z3Z%C^3B3;u)Z6L~$aPn^F=+gU`CaoO zFZH#yf?54a^S=8BX@a5;2zhth3!DZDjs6HXQzy{gdL+i9q@)?!ue>9n1$P3|&Eiz* z?{{LZ6VwCoxkxoc6OWR^XuT8h!;4b@CHrd$6o^~8WLpNz8rW_SiK60l0#Q4vsYWgK8F!`x9vD#dh3+= z;U~0i#tF8O962h9kXAZDDKS4sO4`V*dl!vnSZ4EQ+*_v)>W^4KMAGFB4M~sFD+&th zLDXdpL$W)S5R1riFA@WwiItf^%TdepYy?H-pGkmq&^T-5r{M29-n5YJpHchP9k)%0 zqNogOpv7@pWJ%i5Ki-n&-^X6(Wu1|c+hSQL?4LVi%2$EW?m26RwFPonklc<)2DTo= zze=+n4D6Gu>?NfW(-FLJ92ey~>ZG2=8CQ2n*P0f;HME~(|L(He zfik+Z!?n=N0!2lTk=Q)9Fwo+aQH=T&PC6_rbxx}^56X|=?}D>F51U`aaLqBeTewk9r zV_l6-_+6I1LE>xYpM_16I<1AY< z4z((!dXP~LyT87m+`9zs3^mqVyo-0~%1`eXvFMIjnDk)0UO#1*63PX~n14A*UA1GV z%oS!n)V?I^LBfjf{+ECk*z^syV@BM5W<2em?oGAl{_Ur{CZ4txb_@DjP@IE~f4po2z zSdz;GDR;S{HH1Tl<c|QEh(A0Lwipq%ekV zo}(-34K-!F{Y9ZWd`wOc9Q}KXk)|K!42eG)KcI=tipfFoe8rf0*l}CG5=bdV%E~9x z?3Xo3X2c{aRPEEBjfl#@>_O3HS<6ixHO8yXfiH`s5!4#MKnalqJDVb7^oEv3L2nE- zd$gU$BwmrC-Vg3}6NPNVGPQvVaT!V+Tgp;pauya<(!6@cR~0LD_M|mt9RtQ6wRpZJ zDc1Rmc4)A_wV)p}XG_9rl;d0~Zy}$ZOCF(N1mst_r*fiMCFt|Ov*ExNH<4V&#)v;zM2^CMOMbJ81frDY5vYu`gezoaBi-$xAiYfDpMm95H=`RM^p*Hm1mD3%6z$H$O-mt z+T18Za;!ohh3rGbOkc`=5f-8OxRg?B3B-Uncajyh7OQ2sT%Od zR+{?bGEK>R+)dK{Z@RVNi(d6CUT%aEZ-x#_WTVBPtF4SBwosgbt9dV3`0L@Qp=0r8 zvBDyz?-yfwLFWr?|0O#}5*}9h&s3LR38ly>W-8t={b;6l%_buD89(r6t+B**6eC#E zCOamGAYW(l>poJhWi@SIoN^8L{r=5|q*rL2(tjSHLJ}2_4a(VWU zMV>eJMoFy?4Q@QjP@;6^pk23ZZ_W0Cy*?;n>>9r{0O1o{&|j5X9=JrOw>7^tS+N1O z|J%Pyzdu3;&2`m%K*K{-fP{O+ny^6`Jqr0%sC#l=$raA}aEi|Oeb%{%Wu)oFD(i>} zut!@ZLyF>?_B>_CXBq0415{M+fvONlR><0;<@^BM?oJye20^oW(tP2f7w=5tQ*@Qj9DE3_bs6(h;e|A#U@_g^MEGAp%9`2MoRw|=hgYHAs7%I7IfUOsxyOuA2G-Ryyvec?gN zHw`1_8tJ7dK<@V1ps{qbU$Z+EV}4(Q-rSJWVE+jVdkqoS;oARTW$P;KGeT|N76h;# zzs;wBsmGp=^)A~wd4vRgG%V@D^j9=|aX$gWoxXaoebW>14YM<^H`R@PC>C_OFueFZ z_;Pnnv6x`s)_>co$t>)ZusOf4a^tvoz+z*f>W_B5MLlks%rNazrR8D?7Z9c6^j-QogpslJ_5E(?{%6*k7_+9XRsP_w}H- zXpQ9~Yn@4JwPa(88)|Grs+B8-xfgqP84EWa4Tu!w<1}>sQ(K2}Cu6 zgd5xvq+LdbdW2q16coo>>#Vt-<#XJ|9cBf!+;6CRZl$%D9~93EZGLZ*~b(~Zz=MSHzcz+ogT7?QH=lGP~oO%KNu|o zOaSM=Y%8yv(QuhiA?g@HBc~N(Vg@azDN~X_w9n?D+9S&mra@Q{4@I=xzG1g0|8Ft!=mukC+oB>6o4x*VP=ZP8h-04yb~i8LfO$H zG8O8|hI5-pepuPqFUZL^6Z2o!k=yX2-lCE+_*8GCDx$RzwDli~x$*)-8kTh)8Yi_O z6Uo=Ur3IB0ur)(wdhuOSzJ>9g;-jYKZHYZfzGi(1voP)iQ2N6lz^NX=xVZlBVuMb@W=G=<#SepUeM*{Tylm_WDg*IM4({Z9F-8y{{Z4P*Z((f^Jeg~Z?8lgi zY-~}h;wN%pv!3#}zwb)Fsag{JWw6FV15xVyu-;Vw(VMGka32?|vQe9G<|(x$p)~0- zwrXOPY^nT8Ii5kQo!LUIF0za*acs-LWmCS>Boyc@aPa z3hlmIw0zna1AQ=Nt~el7p&6f~?Vq$dDPAWQ`^C)gh7#9!blcP}1I?RMBQTOmtAKD{ zuYkPH)LALVSBl0nhy268JV}Papj$OzSi1HbIw5~LZ&vzIC@J%CVVncw$&uw$@*!45 zRvf8O1-iB%Q5hnCG${w}3)k5gq>os&e%n@(!N5?l4HAb@|00bprnIo^)9V8shFA;) zBFq*xfaDcNDsE;`zfAN~3N``zIZV{Q_1A|WDPUYCE3Cxuyxl~}1A*9mr9Q(@xxGId z`)hdC`K+K)Zs2G4_1^Ss^S`v^73da1rG#?fbW;1l4yD0TMZ-rqLe9X27yL5)5W4tV zV?2vZbCk;LpECIftFs7wraqudhF);nZhie;&Ibk;&H|@5IlMHVYx_3Xjo9ojE^x1tt$|X$vWKPlnxArMFuuLP38B#}qN`Ov7w za;nDQKUqkaLKkfcVowYs><(1ya^=huU>i*~+lBR(_0G(^e!G)wGan6fS9~jK$M$Uc ztnTc0BGH*_GETl5ls95h=Yh;>m2A=-j$O|ze^pE5v+bOYuKu}F1k{y>$ zRdiV_c`@7VlskW*tAWQhzBw&_WU2UDmI}gO2qo|GFAcEy{Mc#V^1^ly06T3h0Kyjr z^>GH!ndT|aQ;|Z83+ic9*eu;L7!8gYRDPMw_Z8cq>~c!c^P-gP3R&{~RP*#_)D%}+ zsb=Lbs4Sl~Ikh+~qj3mfD(85tEYvO&;$X3>;7WV0BBx6NM9&n4XDVh>6-7|L;>t0g9jo=9f2Hwtc?kx@ zAPDm_QF;}OjV!48qr16=2qcQVOYNB`DMtjKvktwN`&LBoQ z&w>qF>4+!XV($NiSLGg6Z!1;)2RT6<%Ugz>7#Xl~fEZGy`p&6hYCE}MRS?#r<1(>W zHY$coZW9SKYO7EzocCLBKmzjWAix^a^W5}Gx#a|B@`n_0r*?hibVDJ14><* z2m?}ey?l@XCoxB%CJosTmGDu;b1_NEhvk^rD=C^Ugl){0^>oCQrF6k5g%!@XJWMks zE{8U?5m1C!lY_NCyR>VW5!1z;H;2~0&y1*-13Ts9g;$&&b=Mjvh@X~RrI2_yM7Fm4 zvFRjL{C67RAE(7r4ntd~zRbU3S-Y+btJRtO%{ny(vw>Xokq!{vCysh*r^f}|!0lXF z<^8R`-+Ue?wZG3kU7SBe)=Af%M-s6s2IM)CzF(K4{S|U`U~Px*aYkZ$Vi0?1&dFR7 z3COo`8KlpF6)=5kbBzPd&YR@^ePrj31yVCIit%!XzYw}?jFniOQ_c=GNWF0V$#C3t zh6*tP(jsmCxi#cfHz>*1(nzyT#;(Kw9PcCQ#mJmyWj70G$fj=#fNjOJo6v*#E!O>+FgWFQ4ROME+Rfqyw_#(7a%h& zJfsYOo`{*yw(pS)o3U8yt@iD~hjbMQxIg+pGFvY!Q@?cLB2JB~35g}{3%Ix?>j&Uh zT9eKaK6Gd1H%QksSS!#Jzw%be`K?vzn#WH29khVmV%FI^|(u7T}4J zj{Ic7@k$`@;_^gEC`CqIUw^9iw5K(*S~zD#^|0ZwV=ClH0&%*{g#b}cB^cI zr%`Z3@v~Yp3R^Se9Xyh`xjn|Mmo)wtfdPL0nmV+u{kL#MU%zH8nWnT{3oM04@j#>A z>5dJDPqYWmchX6M#LGA?M0 zANE^LcuAY?q_eM3&!hAzqX7@Wb?n0SA){1G+xpaPs^hj2?A{ zzINeu?yPs?jO(eR_hgq_dX%;$Z${>|kM&9~Ge-})Vf}OYzNAkjI=NFacdBuBOZguI zHy|zdYV$hc=6ZZnXIlEDZYOm5+9wj~Ypt96i&O78Z@W$Z(nBM3N{%hEYxqf@x4B04 z_=wBz)@o0G`zDvVNj9P|cQ9_I=$NxqqxP&#xoc}HS)_DZBGZoSy@TsTTQ&y&T+5$) zm$v+Hf9&muYsud?)gH1Q^Q#y_IT@kTh4&dtBVCoQbs=Va#2;#5j=H@xu#NhivS;_7 z#;8)yu%G)iMf5Jx_qkmBEmI@B#j7Qak}G{4E~pl|1Anx?3$0m?wx2gW00aa8J3l5? AQ~&?~ diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess5.webp b/docs/reST/tutorials/assets/AdvancedOutputProcess5.webp new file mode 100644 index 0000000000000000000000000000000000000000..dff9b625e431269afccc6982e6e51fbc834c5d13 GIT binary patch literal 15766 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 UOZ1Xsd$A{K=07M+)v^8q0N3cT9{>OV literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess6.gif b/docs/reST/tutorials/assets/AdvancedOutputProcess6.gif deleted file mode 100644 index 127cc1e86fec44a3881d139649673fd09088e6b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34058 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 Spbhvijd2=$R%K2F1OPjPZ&Jem diff --git a/docs/reST/tutorials/assets/AdvancedOutputProcess6.webp b/docs/reST/tutorials/assets/AdvancedOutputProcess6.webp new file mode 100644 index 0000000000000000000000000000000000000000..da4bb214bdf3a778eab288a4e0fd1b4c6930676c GIT binary patch literal 31288 zcmV(vKvaTGv^M6WO-IV+NB8^bU1wk0UhD18LDG(ZNuF(9jVIT0aR&&ncocKBF&KhjuL!pJox3j1! z_R4F)s+0_krMi2SIO(5eIt&Oao;GGDq~J>GaLK7WWYZ8L;g#LDKi=;zr6_FMwvqln zyTdV%10rGqD63-%sxvA+BhL@@%K-=;G~(E z!)XR**cm(N&}wFe|NjT+zNcI9TGi!2NiU-RvS8b)+vX}m0}=AMmjg(Mm;32kf+S0l zB*}W(`~9yRvdV1#z@PU2KO&S6S#qJPs~%aDBKq%(wr$&P8`%nHvIsB$w%$h{kF^0& ziuf%4{ycvBbY^~fK8=iWc53gl^ZTCN8WCmwV`u95vvSw@kwbpRqmn#CSr7dCV(Qby zXOB7;8NfeJH+i`xqE>^p*UR1jInH0W_~KH0X6c5L!*eOUjmsYwPR%%ZJr|Ori|;-v za%@^tXQ`n}O73SO=(%|5a`L}i_cEK(k-1+#70aKz%!Fifx;VuZ6U$E;sefl=dhbM# zd+Q%BKEIsf`5Og@cU;KNcbpu0^y|r+#oF(CietB(IzA+)y^GUF7k`~9j-}kxV^?=yn~siD$rTPw-BU(?UVwY=ww`@_ytJAZ3MCj$N{%X1>B#Kz=d?>W zN1b@u?3uYb={#RQrq{`CUt795)kvNBUtJB5s>#+>xYDCQ4SwtLrF{1N&bL818BLBq zZk;`U&gQS~yiBGM=7{M(eU9Hp%wzrGP+Yua1bMV`@s<(TsNgaWn?7Fj7=HhH2ZD#~ z_pbpX(T2B1g7ElU`{1u6pct@32>{gh0Au=(jQ}6OcUX?56XJxR6S1-9TR_3a{{fl_ z2?s%RAmFdbSN(Ngyp^{-A_u@4{s-j$L^aPxOo(kp#8F6-M2Y$XDC7|v{0A^NCSgR6 zs>0C&gqy#ER7Ze`jr#+JcRWeJ0wPH`e19<{WE51Wk~kOuG2)KNso?=N><@SrENhQY zVD1haNpy{-dw|en@G3>~*dyWq$~ET?=>Gooq~`MkK`jT8zmJmlPa^{uKZ%4v;p0Vu z6A&8k2TTARsT5d}svA8nZv{&ufi^3?ng)Q)Fx(J>IiYpRmP*xB&V#+YhjldF@b=^=?_D>1%kT zB0k#Iz$vO{Dn|)E0#Lv9ExJF6OAG+qL~+;@@V|>YKzA7V|{~a_^@KefXb!_^9$9DW=c+5lU>TII3Z|50XMQLbkFA zfX@ui%>5+cH`MgT`fz*5(Oya&Nx?sZD400}Z^U4fp9~t@i zUkG^q+a>V|vqvdlG({X=mNwTnvw)>E?NKV};%tiu?$LJvWbF$HCx!Onwo&33D%&gN zHjjW51NJd*LEdFZz8XZ4^)@l$Boh^?W||)k*0iXrv@UqI zAjL`1PK~%!bArqIcOR6$hIjs99FJ_ToH>RyM;!Y$XGPrDIUyui7P(-LW+gWRz|a0c z4i&uhp3kdIjkwm5EJCdxFi384IHJC%POlkg*K6ya1W-Sccr(zUcNopNL3wnUQx#Ne2@oYUq+Q zh&3-9UfQI%8$i#HI4C&LKKuYaAIDrGcO3%qLO>G!+0X|Q={n~|B>!{c_{Jp^zrOFo z^G&pUKoUo=jc$VyWQN8*_8ZJY6gm52M^9lDh{$?|{q{dBj{Q}Rc?{%)@Mz$MEbM%T z`Hc5&2KD)bprEP-dtflIe^gf|#lwNyTDkfk6~_>rqU>7%OBQ*1!~{#vFQ$NMVx!~Z z_I*&U%#Z1cUtZWq_l2G^{r{109MtIvLYBEtRX_gB^b<&xB#DIQpUhi-^5Y;Z?>LE{ zq_KS8z93d*z+l)DuMFhp{SSvj0+6-Ut-AKDo8XignQpcCd6*-E2nY#YjbF%0Z5_`& zz`zACmV9fo<3AV<)~N&3jrPruv93X9B2RO{=-y88KnnXavt-cz0Ac=MmIRDBu=f8% z`~&+R35Qm5suP>hk`{m(3@TbZpSd_5?##&WorLAjts!8C$F_~1AiU3Mufi9kjRMCl zazdUyCGQ%CPiGGb(;o?!umqy}yfuXL)le1R>~p5-%U1Wn5boF;s)6}x5ID3nY-lf( zVt&1Ra5?HimbDXsP4u;H-(bJFFxHsbSoyfWDf-fwP2oeLtvTR`+T~Z-9H>!T65UnE zYm3`wRm$VzLn)dVJ{}5%5bQv|#9LG8d>;*0_TLL+IeC z&}Kd45*fj;h^w$!Je1%wklX|Xckus&P4h+ZW5OkOQB z8Ej9pG9mo0`K)!9I`X#8oCEmX`SzZIzRxGY1+<3bi6s5E$3f?VVeQe@{m%-Gt@hQg zlrR>L&^%AjMI9-oG~vLO2+{(tSBF zz3~M@J`;?L2V~UtJ00Ess*Nn_qRJVr)?Rrkk=zn{K7IwdbY#=4JT%t6S@_}```H%E z)Bd~Tun%2{SX87NLwMjTxi=HgoC9+ISfcwQK^D39;Oc57f>)uP%1=;nR5Z9UY2t>6 z6^vXRlyh^~SgQZMar9;bVgT&bSY=^__bVmCnjGVRsb-mMQT*yV@m!12v&Eav2$8&4 zWrlU~gmG_ui|g>|qY0AaMX(qssYzaf`FFvk9h7cAH6uxrmPOBbiHghn-ETOHw3 z<3^#ap$ji^NpxTN`0L5^8PYMbF(El?}Cfv1sO}ls>Fb8 z@xq=JZ@s1y1L^di2;&O#4Vq_M2si?q!M`eoWDib(I+z&7{511C$fz1}Xw$>C{}#B2 zHoxxvq=wWT2duvD2jv7tln@xnwJ1u%YKZB`AS^}}GYctSMVoz6Brv&1Nf~&6Cw}|NG|>wnZf@5Lt~OBtt=miJiHq z{iSgpAg$uZD6o9aGV2}A$kYP-%8F*Z!JmM@0QpV4uBGnURLd}KBj8xexEe->w=6)q z%~~vvoEHo{&J(pUL@l85TouVvC#RDYh%AO7w?qHIz?$3CpTH2MZ>!ly#gOMLqmgABmz>&2x|% z|6*+j`Ui7B_mQFDv?Od81HqQ{4sT|MSur@sjJu8@YbkmQQWdwd}DxSRaYm-zQK!Ln2+Dhb-O#9*0c=e2K1F z)k^9SW96rI`rjm1=c36qb5g<&+tFS(R=9xbWv0AD#zxCZj{MIjV`W$>v1;@4;^3B* z@^;J{w)`g2SyF6-;Rl&g+Y;rdSyFmE;=*rmt+uR6j7`*a&_4dN9GT&{z?C z-xR^zXG;UoG6Cw>`1a`a;-()75;H7_6JgnGS91s#D;2CcTquN5mIYv8k+Nk~v)WBf zN-cE*l|&l}=bx-3%bI{8gRDT?KQxboGz@Joh|^lHa_s9CEKoq4y4Um7`G7yzii#e! zhKoE4Dy?Ng3?Tz9=BdUqYYw)#9fR_JSZ>}qd@>|x#sM2G0=tiZhuPlID=!=8aUI?q z$oOat&^4wi3#09a_NpaZa|5jqMJdzzU?AVlRp)g?Y!qH&z`wisCuMh1)AhrSH}vvS z)En_@g3Z}AjOxUClR>o5n8BssS!oylW{y|?m)L(TO zGqDBdohq=VMCvY;jsh6N>SuWsTDJQt@7Hx0L-57N(WvyEI;1ZgTd8qs1lLfem8$g)xK=_f0gIyyz%3-k zD4jmUQ;-V&XYeHNpwdMC=-35S5$Ti@J(2@VJ=>$forq{K9{62JuDl;4mHmGUf>dm( zS^xF9eEbpU;uZNdEbaI^in5dqF=ZZ}4V>&rkLgHAYD}#DxhAkQ^2C)bn>c5BrB^!O ze8CyK!m#q<%>Z2zEZXQrQ=n7}SDJH1e+cTS$iF-n$Ky5}OVF&<%KU@|HmJRD`pII* zlfM+bX+4xsK1K$3P@0XQZr&9WV`EmclC)Gk! zt*)D??Qj(Xk^4!U`9qI)PJ3d0Bhy8*6B)k&xzQ9=Y?b736_v5x{x!Kg{aG_Om#pd; zE5VytC{R_EqVs6LxP~GM6YuPuNaf3q``;vZ2GG@nFcj(1gLsgCIZA#Sr1$w53+R5~7lv4xwog5HMFk(hH(}BVVYQ}SJ546Ar;4SXM!}IW)4RVn1R>lwH zR7w#{k}r1D=4fG1SpwJqGZN`vkBfyN!%(*G^xA-gg2jln>@%mV?`;%ey3sij?aLWI zv(4ASIDIcia~tVy($ECyh~;9FhS5><8CIVL%Vxmw+Av_bad7lm^b-m9>c0?|Cn_uA z4S-6EjqPt#B*pkorPar(xU3tR32q_{+kg-|aHj}<8N=p#HKosgbyW{jth37!G4u;t zCiO9qRnPArnjou|@SlYsb7DOC`me*KN46UMbgg`@$3Dz=SXiB!*6aSuiPNK(WV2A) z$Si6;dDb2qhfN!iJh{bdqYBB46kB@)&=9Kp4erqQFph*@@l!SCJG2MUdVi28oo9Ev z|E9a|zXVr~ylLkGW-__zVsb&3FY+Ktkf-cf-{29++Lr|;S9s3-k#~3tx9H0VWDt1L z0r^afIWr6MCMUx`C6dQMYX_0W%O9Adl8eC;XpBenH@nL{m%{^}p5^I4W zXjZW@Z~&#~+v$K-NXK|kUZ$>6Jxj;IewEsPhkFa})n)TV)E@wm5-iQh2tr0b6yN#z zcEP~MN!$&nDaKt0NlX5Vb2V!-UmIcJ74}50(^-|6r=Z<@{-Xe~->8dRZ5Ap;jO5*$f5jE;xH84W?49=tgi6@C9JbEy*r zqmR+Qf$RXcHhTw3$rFHh(w!b(VMSStxO-} zn;&;UFRj-t8K2Pkek13!&(!OuApcdlEa@@4!$-Z0a^79i;T+cC_GCiJaW*nmOX$IL zQw$TUN`ItE)20_8c0C~#iW0+L2?ab6ggO+6x&ThT>NdNv_(YgL&D(21OW1E=1>1zSK!35^%i6yH6okJI62!5#pn!Z{RP>H*c@Z&SFnF52J z$wH~;p*L)@ob7ml=M6Qeu3I+$hrccNvg4KAnSmnFg&Qz!>>il+UxG_|ILkTMxI?m7 zhe3n&e_k%^?4`mh1ybyBMrf)O93>IVZ;VGwmrmsQHrARle%Ak~t+rCXD8+}l(~z4D zL0)DNRTOvJG3|NK3+E1$m@pk*w8>HPUxF*756%!Kqhq*B7+AD_fN}t^!mC?c+!Th8 z|2Mh}f+S>mehoZz{SjxYW%!Pb z9B*BnApcdkYBop>yi(zanPC33ixSK^SXMC@a@7|qR9-%j1VrwC0h5wol9z3*xh10Y z#uSdp{yWu{&9eMT=BN~1DA#4c!W4`J@l!iM_hddj|8`WO_26j9a$OrPu261XVuWr^ z#v6lli2BhF#;NmB1w9B1IRvB)Uc+#9VQxDVh*;}^J!#q2PGAel0~TuAOl-#3rR`bB zdgUuEcNSz_d?^g!`N|poURQSm!xEz5K)N1S|lW?E?QY#Yam*Q zjlwN&S(KrQ4<&68JgqiQ5uYcS{HxY&ga22SlE!!;^vAqU4b7YI-H`4Lun%Awd0RD* zB{bvw@sF`8Lyw@#0LybMfu5htL+yu*Yaq+;rq#73PQyNclk{cE3Q;U@1x@BZSDx@( zqM#79dWq4-?&t$iIo)AHqyB?JPhL?8*-3Hb`z^H?9z5I8YgiM^n+X>8#IW#AT%o+d z1&Hj_xx^kOE?Jo~*{XFyk(~}Un2CoJA3~@>Re&0+zk$>Plv{7Hl362Zeof_L#%lAFg!K+c0sVoGXry zMn!|-BYq{M=Gz7abYw9zTTNE^=?+CH%O+$Z!HtU+OQl*5Vbtqd63Q4zE%PvlNZDW^ zt1sD13V#m``LIQ<$nBjcQgG>!xydf2E2?coon#Fc*WoJ_+3?G<&STQ-r6&dBTo~%P zUQ*b+(%L-XqcAklE1L-zUWzo#lzcs3&v$_a*Gfv^13{xDJkZTvaB;NhiqC)WqA%ku zFp<5*$}C5jzwkaXbafFA6<4JIi;1zkgdcaNLUmYvCC#3?W4?ZQ!5HK>hv*~54;lqF zJN^Zp6%%IQyy*Iy=0v39zhkS{TP3@-{tZ%@VG@15vsZ6Pb`U;qsLDq8rW$Nk)ih&- zjAg8T6ME-y4MM+cDvE6yi4vT(xBaw-&YfgKb+2B}6Ix{$u1QZUbEeuU|AbmwSpuS? zDvM{ubky|#Aayif@)5a*Q_T`yBYt;$O0<%${i9%}-pY*&8Ebhhben)7;OZaMdD#B` zHH;wef&8fxYGolAN*bQs!oISaWLS5=7Y)%WP@>o9cQ=g)$|Gn~foGV8hny)|c*TZU zW)kHeXrLzb58$xCQLQAF?JWFFP%*~Fo1CK6FK6*$6HhXB7+0^=l{*%eOE24gZI*dG z{l9;u7dcC_V@R35W)%<4$DL-9O?8=@imA!f&qHOvO~EvSMXFQ%0G8=bE8|g+e)$du zU=h&CyDkm09CM7KVlQg-%n)1|AzpWA5Dz+UrM^3h%UYVYvy@hKgyW!CH!b=H9rmJx zP?>%LEn0TUb)UzKgDfZp2|K4hwYS5%ScQ)aBeswK=Cjn%a2pCD$hq0e@jcodDP&2WhF+U1C(a^6T)^JA_+#)dd-dQ$Ii9N`u6LVf)!&p`F7#sgtgUI2=)_x<(W(tCs!y z1lcK*2Q%FZ-fSA1Bk-cBNGxG;XtingRyp`l75y}LX0-uOM!Y2tnCc^$Mc+ACW(v%< zlL4;KGNFP^{n+Nn$wx-}vg`>uT$3PqsLd1$iiII>$brqh+o{Qu?SRXu(U6z85}YSI z$bl$LGg%P9f!7Bk6cnO;o&@?$tSpP)ffuzY6 zj0+xVlo9zrz?xp`yd1~Wr6PuGkHWP*49mHgaQLH%5rD=KGxBl@q^j^jlRlEgaHwW!9v*v$rMF&M^;|sK3QH3CKE^W})4t zEr>M&w8!-0|Ir<&vCFnpoq{9#{bGfKdO$^KlEUcZAyZ6P*NOgV+Fo{PMW~9%h~A22 zs%2<5Uv{uB1xnTANle^H)YT9S4t@=YtUoqL%;Js(D7lu{m%*7pY6xr0n5iNNd}T;J zf%=s*5Ke%@lPxH?k71GRJmi%-{vp7Sd5u(pgY_-rd#ISSsd8-H21(d=*e`dS+a=Db zgo76MdX3;B<}0EG;9(JL-X+%J`O{wKmiDRF1k%cZP)00EW671IGY(Vh*B}G=VH}6} zN@=ouRtBkD&1?}={X5atzC~z?$44@sI3Iu~`?TLw*xl^W3q=6`4tqBUzhV}9nO1&Y zb~%d(>izwTQ!53~_Y0bXOsyaFU)3F`t-6{owjgOX%KYli=%gW9NfCCIk{eZ*AaqKH zR6HD$l%nUez_wC+6@=ZDYPq?_tSmBeuU8)DaUt8_<{-$a@)fy zt9#BF@BA%;0=$#R)Mj5?J1mhRPIF+L=$D@>E~wzj0LBreA`Uu6ui8>mSodX?UmlKw z;QdWpWR;!k6%@?H`x_lK*`@#=Tk=e6{5hSk{%vx{-dLR{Z)P#JH7%qNegYkXFr z6rr)Y)Z(o)3&R;`Glg+t(xGd)5%B5de#l!J5kvR5nB~HIP{&qDOyu%x4F!=rX>Q3S ziDXk-dyrz^ZZiw+i)Pe@O=G}l1XiB!`TDSw-OXU> zs=u_%JVS{L(un6=)4bCw%h6W!Oq-Olm~Cm5FKmU*i!LO(`kw^wQCdcq#QRe9EhtjX zI>gO|Ym(fQA^CqeDE-PivJDHaE`YNqDki5$)@OOlu2@nj33Z?p3O@el2L5Bz*^z)M zK*w}GyTj24$LpGr%VScy1D#=>NVga&9TT#T>YI;yuaA%IFL3 zALlk3)_emc;_#1O^@Zkt#J*v!0PRX9G+je}MITdX`f&=RxZ>5B^z4hmSizfPgFKqT zn^i(h$>2WD$XAl`hCEa7qq;P{W3s-6!G^u&`f(5FP1(&ImOAg$Hajgw{bMZAi%>qe zL3AkjQ#rF`D8J#M0_lM8^|96I0yoVXzuZu&tM4$UrHb)4EBFkd&Sj~`#m?e;1k7`8 zTJbZqgMYdDlVlRa!>1kB`vouOe7I%#=t23Pz%_t;OF2yqF(z5!W{3j%De}Uduky3Ju$! zlDZUVuLFUuJ|sPOubGO8j1w)-hH@~0^+l!8%Q`>;DsK7Kl0mEl`i zVaB2o@F)a-SV49;goq8Qu`+k8iN45!Tfc%9mAwK6R|dy|g*G_8I55nbAIWi1f072l z86-|yLsE2`sg!)w-yhr!Rz-7nstzO_C{Q%ZOt8EzlNI# z35D@GP#ZiJ0d#9x%&ib8*GGkP#ba-AqzBtRoI;Qnv6-gg6cs9IfWCN(*_n^(l1A27 zF*d!!*d5agR+S&W5Mk+214ZW+B~i2r3uY8Hz-*Jk+eg&YwUj5;uT?=!VaUtEq{(uL zu+4p*s9hXy7==4J#tIsaWJ6fU;FE!}p7Ge0S!|rE1102i{0_VoMs3 zZSU=SJuYhszhD9CXUpfRgt zf-8>0IEn1IRbGp1D!QR_=t5$K9_CwMfVL8P_QSZoY!MhxW006Q+oAHgGS{WFlp$&N z8wT!V8tifyB4>WC6yyNjG{_9aU(uv`?HCuNQg^w0Q%M@QDV=Uk@NBT$YSQuY>F7oH zSUniS1Lox+1bkBkZC#{$D(uqcURiqF5E=)4rAjNDG@7#%XKfZL*jdQHP(PI?0j|@( z9srl5wSoL;s0i`Gf2&lZjMAxVYQ&=~fM%fn0w8)s63*zpf=_E@->fGYk6qI9jEKqe zD=HsVgxJWcVq{844Qnmezx9s|h^7Mf@DJRxj`>Dyk$FlURNRtj($@DQoOzQVx{7jJ zacnRpn1DE#rKp0nm??KT;o>bBdl9%2p{vnPE7Cbx36-H!{Jfh-7py_d!jO;fZId8t zH=!dI)Q?diy|X0s#me`FdC2w83s)s`2)4K)o{MXNH2&$nSAVCXP3b4B1C&Uztnp$`m0%Ez5V2MNLWCnfz%Q-^Qf12_@ z)*U8+8ZSmM<9I8A{zg6LexK%*2UNP-<`tRPl98cW%**lxo`df48Z63t_A;;CRDw}x zf#y-i2GqLqcWPjl0A8^Pz=dDxRNbqcJ|N!mT_No<7@L7PAu-EEo(~%@K-K5Khx?fW znY6~X54X>*qE;Xb=iy2GhqF^!R)fM_cA2(Uds4mTA)ys|Zs5d5j78ARD5xL9*3e;g zS!^rcAnryH(_T?xANxp`aItC4&ctba!{?^jDIv)-e9P6JHTD&M5U}!QrG1kcm*tVt z&$-qBl47&-kH5Bb>=_INplid6z!q`Vz(Q~fnu@;hygivc1C5BV)R?j0k)O67n(_{B zKK1J0+CB#4`_l|N2kuUH+B7gmqYyAF!!6u`4>>m}OZ%jBiS19ggrFg-h2Z<~j(I>B z$AlFPamBC8$jMO|6}mb{Ja1c;W1rG+NX_6Bb+bK^)5Jy$(!Ch8pDw7yaUgwgeA zPs0wq_cb8Ffq8PQLe-G9#a#6+ibzk8UqR^(8*8bYwxX>lV32SJqrbMG9r}+^fSiv1 z9jdYtu7ls8$x!VqEk$l2sr0Rz?1M@9r~-aS&VUqLnNB~*D=x_Tqdbtm!g%(TB1iF-on#Ko)U{HYngX*U47Q%Yvy{Rfi z+7?V=Bv@r7!}NRA`by74NI=2h%_j%2FX7>l zk()S4scV@wH5)A;ETPjoP7++ofT8s;4Ar6Af6z4B?;yXdQ#;&Q4xu$!F@(?;Hh&XD z>(P}8(*JSb1YsTyR=+fVjq9duA<74jwjbM%H?#L+c|m5k#-J7(Phd-nR;(|#n+9jj z>y^rxx}#U9cWyT;NlfW0+OQCN2gm{Ktz^n;0`JMYLJ1+$OtPS9&Uk=8r}%GOp$7u? zp@@pfqjo-AgL5IWH!PH{sPOLQpK8iRLho87i!47t@~GuSUulaqr<kR*=Er_6=0 z)ZqQW*OT&B8!S|AlJ_-AXzUJCD*QiKnt ztR)LaV#wTw`1c<$b#g}vgScl2G&)kxxhtzrUR9jt=SsokHm#qc0y3d4vTkQ2?IA^u zjTP*bIyol`noRkYDy;;eHbB0-y4jW4QS_+qfqxJuF)$|Z>68=u=Ua2IqR^PZX`-u< zC7&?rIz`RoX?{wTunOz6{Fc)I3&B4zxglv)!{ zq~2UnvjNUI1L;{oq9(ojq=w;WO^^?sFBA1(%E|oLp(eEZWByD*lfDiQmiesHk>YvU(HHsi;+(RD`q|9_C5bGJ6dHXSq(HInwXi1 zGgdaq4w+f-46w2(Gk$Xmq#A}HE!^SYZRH?UMGzv+>G40>)wU$FnuSn96UvHv)_Dvy8~vt385z z3tQ`65D}q_NslfZ8h(Aqpay2r>y;0a1WVi^gZqk~HM~yJn5eWSqZWFeJg6n)l5k&c zvZCB9&B1++%7^5}gU5H-65mj2NtlNisfMC?|h)*{+JRQfPc#iaWSjE8%r5?L@b=1>ogQME|J=kY;!M z{=pDk2URR9U6uCd96GlDoKs(C&@S#wJX_IP^Zq&MGK&aWL}TS;yck|u+eMvHhlBEv`9;|>R!B+&a5xFiUQ~o z0Eq%wplXDiLA4}3mQ=WiAyZJE?wrw`VMlyYIW>k#wCoC_*myED)qWqe-hjry+7Zm6 zupSlsPkdi9!~Ara1$js_pXP$<)*l!<^xAp>!8U}w*=BOw7=Nh$!!KSA8+PS!LrVvl zv%`7#EdjycdZk`m=u&4cdKS_@Q%kXy1_&CEIi?|!TR3pfB~M#} zJFXN^hdY02yrDb%ELM4)GZ!pe zYzAUXy|z$(u)x=NRvgFFpo*1N*vza6oaV%>N)yYzx`nbB$t-j~feDAkv8>^*`%^gM zHRMxy5~X_-;DmWIyZx&}A^hr&y7mnK<*-obiZjHWSv-SlL2evtF~(OAs`Za8_w z8f?}UchfxI5tQoAsS=Gq+mIj$rk22-c6P4{q??O?CuS+IH zAx2Ewas-x_yx&-qAd;^60_6I# zd&A7N$3C_Ss02tlu2dqK$mJq&^DqRcnb|q8TROQF_{)hV*+^@QXR7JLcKnL_4m$7H z8e%h(eWMWc!iL*`sn78nlA+qlwFmOLI_;r&AcG?x{%95fHJN&fCZYc1kutTxkXpCa zDlN7Uds%3UX~F?ex^4UUB2`AH6Gp)(+GG`~rC491O>6MXElph5x2D#dFr1|L`m=8S z3e_m?S9FRNt0TwjiX-v*g$qr42VxrjakYy5gTZ49&$BsMZlDjE$5J*=aAbb9;4vvr zb{Blk(aX38;pY{B4Y1OTEJN-bS*Rq_Ijozb=F1ujD>ysC3_$m$Cv0LJP=LKF2sRwO zt=BEsEXPnWbtvEBbj%-h$}$IuB%+imY;1%RpD%7#jUw$+NGk>G%{Iv8WE&|X0arYj zI$fmucM$oH-{F~79M;_Idr)%|MV?aWYPo2=$r_~8lR&=T@1V-Z(wfD})`M-tx9V2! zg+VpcPH2iezSt>+q(`ezLYI<@=1W0~#Bhx=EM#&pyVBBCGE?}~?sg-^-N=jScCAKn zX~W(A8suv=I@Tnnpa?NDy_HAwa|k{H)FZQMvm$z|^l?U)^H7r7>F@RI+AK+e`7;ZL zIu^w0^#9YJxA2#2Fnr$cqU)}IEa~L*%Tnx&xC_vdhxKJ;QrP$yo~7hVNmQ7xXAes*@8RiKk?>*t*es&cd+m2w z@g1oG9EIj*t1-18cop`+%lepn7zsyvdC^L6k@zD25tMxpR*uH;2$43HBRjx`SNS`% zPOXhsDoD?{ig$Ph{YuAz=x(dui)INmNe;4Q1%#z9_-t*+0NEsHC?D^T~V zsV+*8kMu3S()gc`&o)8XpJ@%Nu7l%pn$SM@-nE(>e$OWh$t>^yABrT18kuO;|6|9X1}w z!_#twgl+*5V#2mrkFfLuS#?hFNFvA*M1`s@)!w?HW;q`NVzzc5t_WQzB*t;tJ#2h0 z0X3hzK>4I;NVi_{3~Mn2dWUd-c(E$2*0k3eV>q_7A8Y`?%+I*T-F4jQEvUl!W4FC6 z`rU^P!WEzVcUyyXsS;|FwH(D!Nkp}XR)H||f*cgF;8bek|%M;}uqGXVWWw{xiW^J@=(X4AU+ zN#Ox}Mn^!QVe?6fX`V_Gb3?nA_)e@*)2T(|n-pHpF||L$FjnMVZSf@2K`45Bs$s6R zpLsf9i>C$6AbG!+_2d}kVfB0dFI|sVaW)mqeMKlMA;Ozxx)Id{FK&zYM6Eiy`1Guo zSgbF4>2##c_P47K!0QvTR~ZN|a(>X0@DTz#HFd$svm9}X=eMOFofc36m8HtZQlBy- zCi+ggkC^!6)%>mYFQ%ir>GFuLtN>02Bj-U}@#gABm*RnPCk4y{ZY$f1SFK!J27zvYxCJq;sMNGweTLWPY^yieqhQ|rPdkUspiD-ioTzrYm z!cJ$~j~pA`mtJ^&U7#l`HD~XUqtD+lNlF@>=(&=UTHXN6xnVxk4L>AE z&!qySQ(L3~j98ObuFdf^e2=jHWiFTj?W*grEmsS@6*(*gFoo;zp+UJJrdiP|o`Yn^ z8)2P6%h_PH7w`7RlT$6AUl!67xa6kH8VGLpZ0vzAhh=dy9~iex?zTR1h?BlOP$F|X zI*!H>R{d57lweYjYx4fna;nGU!8~IY!wCcwnh5U#x`{Av^)zLgxZh-rCq#gsJ{3kA zD%4#cf8g>zLK%!j2VmfyckhB-v^;xF$ce4%y#sF#W}RhO3H7vb*XdIZ?fiV%#T}|v zsf9Z(DG|v%S}^Qd51!3dcFLN?9ex-`l8uy0^!Lg$AB>`-n=}=y@}GMmi_8XTgwUqV zKnwo`j)990mq0_WiIPC(Z(+x*rJTN~6IR*S%gt;gVD$3cIc%20KInM4JGiMIC3imt4|AIf;k zIq%SpjB14=Q=wSLoFolXFoor*3w!M1knuvPFl3z;2;X!sZrah1VH&F815ee~;lP39 z&x?y_ngN%(ON}=R>C+bpUS&*oMJDW#XDp&0|0}Ectt$fX>6|jocC2GTnZ!G^d=73VlS)jk|xIo)~FR#XQ%c>0l+%NrPD-4^^#iUyjkB`GK@y1}SAJ{*?o&y6UAS zL)Pgr-Ec_OrszOW0f(1IzQUTaKWRdf0}YibKo(C}VT)>vXyscb+ROL|Jzd^yC1)81+4qvgUwu^dE zkNkBoMOs>Fhlgwxtp-ZFtqe+Qq!hJ17$+MJK&3Vw_(5e>P0_1VNE^NPAEh`n{?;a`0dX3H&3k{0c(H!JM}2l2_l#=D1Ap zxO{!D6+#}(q?F}I%#5>V%e0) zxpbM^7yu3FSz5VJ(>ZOT`sYQRAsb_)%E#pxO1DB&+BI)Zn8Ii9A!2XP(4x1dT1-R@ zONg6hrdsKJol`=|@kj-b!q?P?tQo8}K=iTC#QqaEqzF{AqlZF5A+2se(B9JP6cQ*& zQ#LW-qAkcMZo24Ii&t`Et+xW872yj$(~+@Ojt-?8WIxp-y8MaPTX`YR6ZTLMe7!_W zIn+Xq8T?e2WfOa2(1`ET2&~}=NlF&RW&7AOe3rSwCi~yptl~u@zH*wPi>tr|4OW*F z02Y{yY}MEMa(IsrF%hrz-e7eH+~FBlE}Znqn6}d`oJA<>r=|s<8X?nSE#c>I~D;ceN?htK??hOYDYOyKgd zCyd9`HhFWh-khV-T~ge&TFC+H z2ftwLGzPug8VD|0hgVhxHO*fco*k}QG2K=SnyQ8zhwT&xD+67wME#3eWFH6g^}eqB z@wH2#Q8B(+Gq(5M!T*)Z&4Fa@_NwEWI*meTBm~BU*&eiy^B#s?DeK8|N~R4}#hJ~Z z+Ox+Ck-bx)$u)U*dUoXs4wb)%>u>^(SzbFx#k;jqG6Jw(dwvlN4JBHf|0Y4h;#sM= z)z@imqd7TKj5)lN!Ww596k%VMlXQB+e5g?W#%#sB`VOQHeaX?XF@=#!s$rrRM1ijGk~s%t6CKlGl7O6NUb&7+dPe-VSru{Vc@_ zK*j|>Z*lRIuBw9dVbjaRA~ITf?LQjyn=Z)1tv*WM{Gl7cypNEkOHzn*l0$9nv-BA5 z@EHvHK**+=jau<0gT;1)06%4WIhp)E8Ke$1D^jx_ZmHl9dW>7EWIkW?W()*K=p_lc z{eWdIhodd3>BYFU&>lQRJ@J+2+Mz)!BC<}txE^qb9WAAEiet#J2XpAuYVhWtTLS$_ z&`kAw3YeAVtZN5`y@Q6&Nxi5H-5YB3jyI>z9T(+NZzX3TV~~FfshLio9ld^;w5sG! z1K+HZ2za^thZ?oW`XV@iT4)xFdo>ugC6F||h=u+NO-gTy)G`gORXR>gux>-GBXEhg zl8?}cCt?B*k}E%nMRJk0HEsFUP3jyaGQNyjF5@-T?J%1B6FFsl@1h)J}*ldF{-56Gb9NLfvkGzyw5DLsjM3R?ndRjJG%${kFSy%!Z3GV@i3#M?JBIT!pB6Ia z6m)Q@;oj`|{Bp8t4`d%%n5__3VGgl1Gh>6oa(cNtn_H>cL4zIk>}eoB5{_n#T0#Em zd06VFCrdw)!Rzv7h>xKl0BE{{0ml2VX^5r#q(_>)dFL=>@u7pK?~=u+ zI|-70$gwIVZ0)OKXP!0aM#p)ba)%GP9_l=p`5wQq%egt^&m)nw=F|ONN_M*MFavlI zm~VJ*lnskFe*>?*sIi=k=PNz$gYXX065maJW{UWH2EE~$6DiB|?4`TFR@#Z?4B6f)cl0?%1a%%S;LnjG)% z=>o_(Cc>w%cjinXhpWT5aihXcSvi4RdG7j16%9(`Wm(wimK8})lYxL>vscjA$=b~@ znk65&3McM?y(MRgtF(W`e+|iv0P4R3W`J|JoS!b%)tSBPB{mb2Ue0)~)(Pf;M|Av0#V^RPxe?=+u8ze*K<$?37-JggVJ*lx5i&wCiLpLQY-Z!AT z$vS*V%eZFsD$(S8!}tmw26=~Tv)m3 zhG7l{0wf*X3GHcjZYK-tfa!HvBjYTclE=Q6O|Nu(D!W<=scpFCFPPKI)H-}7gwt#C z;$5;I8;FH8K{J?FB*^$A;3xT|9j|vO`sg<$$X2hhDi4-Zf3LL50gWFeSEgY1oWBILgy9_EdGb>{*Jq5^&N+ZfE5#vU+ zjJ{TONnpK$qV__QQSeXByTlQ9DA|x4W2yJuFrSQuJYfCgLQQtRw~Y2P=r}m5dyQd9 zj2iU7AFRtkfW5PC=wQj|87fj<@q4uH9cI%}I3`l!CpGfEnPZ zb;7YVHq##hpk&~dWc&_0(tenP_<+}J!60Z_0B?`x`d6Y{@QaUK84hhYE6R1^6qiJB z`{&*vPs4aMg->v2iIRa?!Mn>mOLB7mXpR~0maw@Q;5Li$g`}afZv-5tG`FXW@xlt ztI}1lzB!OC_7HPHY<#lnZm!ge(ped8biSbTsmEG@72I?R)~zMN^FBvU2z79HTNp8J zROgE1+!w7pO^;iNlQoIjXr}x;7kjfdqr9awn=hHpH17;RtzT-t-^VOQurF; z{FPDnZis@3XN`7}t8+-FtuBWecH>@`HOSLgt(^yj=hDS$09x{wsH|D7n%dEQwNG!V zK`+A>?)Qfw%7~Ck`RIc`xYC8*1Y*_UVRdGa8}SfpBu&q1Cr@A5*2_h#y*RZ*ltCYo z|MK1x22 zUaLK+4onBg5f4xq$j+Lt8h&M=vfo2LSInvhB4)1ug*(|{QBOxLCQw1s6%4)Jmr6XNdF z;Hg@ou$`<`8XOk@o9HWrrKKXxEA-|`7ol=4-~to z*Q!4$2e2l=@MUJ91a=M#@=oTKH#-dbQX!4a)f=CI1}lW_{IDq+ zw8Zt`;SdQiJ6Jbb%C!%hx{4~Tiyk1I^SmDGjD{78UdqSCsHjw^eN;2DoV?r0~OxS#!NZa8fI9wW* zYPEjDU?Hp&YCbMPX%Q8)#ZY$%L%ziimoDNX#rQqaca%B7jDF4zo2FaJx?)J&1u7c( z8qO31UIHcCpguM`#53{NoDc{Njaev*%YbSWA2a5%F)WHbxx9;0S;U)%z3gw%thUtS z@=dLJZM3lwN{(MF>6JbYM%tt!uw1Z zQ>?4<=@Y3n)qM_beo)yK8@7}0!#&uFvW~9ZuJb=4Q*nyP;%0q^-M+&+_ZOrq>R0sB zqXGDGnvCXo85Td}@cWm;$v>KcSoVb72S{y_0(c|`N4{f?Gg04hq!|}2iGB`BT^z+K zjwyc|p&zuuhT&;5BHYl-B6@5GiN9jOE1>8F(&)bq*;c9Y>G_J_8j%Qti@hS}Gqko| z6L2h>`6JEMp^I38A1RFIdx#-`__UxvzQJjsl5sQ@ylDY`O-9YV8CbHXm)XBez{%*5 zbnLJr1t1rX;p{tfWwC4df|jtQczP8;081RC*ODPFAa)f3sqtH=5E}=#thE8uq4ieG zggl)SNXB-!(xbWs8N6P|QXOUW;5ONZe?p}I4Y?{ntjhjO@D3EC`9wrqi|M@ONc?c- z3}Cikg?SQ0<@dJf;0jN;g02wmq^1XJ?nkB9mSXk)R;6b;Ig z<0G8OmQJ#LQ2^M#th(o6X|G)MS-J$C9-X7^bUG4{)c}<2TJ}=YGKURw7R9s!HDZ3z zTlb(&*DC(ivtmY=W{Ee-ZOD{nNWIc%1AA(piZ;yPzG@h4tUSDF1Py?Qh;#4?gZXfsT`Oyk7RAWA26MSJHC9o68VNDUX+)noE zy>Y96n_h2L&x83C(1PbgsTc*q3khN*{IKQ9%~?IgfAhtWY^qLw($HTV9F=4pIDztC z7Arl;YLVq8!gNEvcAOj~dIwd#=6ab)IW^$0u!^bQ=m{Y+ZZRY)b`2!(S=+QnD%GqF zEATkDt8ucB(mYr*| z-t3G;mwmxvv{&ccAOm!Bic9|oR(f<-MNA!>LYAMGrrm688p~R;LX!b=E4~P61qhNJ zGrbu4+Q2u1SQGi25`O0q z7Ag)$uK971zC`<4pJc+vtJz#hb*W5;EnJyjih*hM42U(Gx;I@YecDmBXpto^7?FU1 zve2qC_#3*0h{F0wUpaZOqq*$7Gu*m(Ca=%2;ZeZ+{sh?ig9qso1}`7$ zynJBHbfeb&+G)ojzsnP{RdI+SUS4 z7XIc3We*aG?FHKgrzaKw?r$1p9lkbBeEEMFL+x)6N8_-%uqt}kpE=FDFBm>7+hjbzH;sX^355JgY| z##Lp|YexQ({eCk1U)j zZ7FU+aZp3CbhDw5hpug`*K@Jb4b@EIT+~zszRXB)m?H~gj6*5sze9j#VfiDy(M##V zLR#v#0+n74551t3Il}413VCMBmZ3{~? zz2h2-uk<h$J&Q+o-;SMjsRcLM!Grk7CEK|6sbsxHO$w zwB@I7Ry}c!Kmhb`cUK=8URFsCe1ZjM_sBh?=37Xqp7%U>34Y?72lLY+n0!drxc) zLV#rFa($}Zq+6Lgt1+vPhGZ+=(6MVDr$%oc6+@n_WY(f=yrbc?b&uV3j)-*T>O=&I z@ZniOHJb^2@fIEMaVCr3q$)Rz7`E>oDV0G`;*8y zxNM$@aD9c_b_%_I*%J^g)DTVoaUH=C226?OFah)qH)vEjhmBYO=fln$YHz9ti{M4l z)D&B}o=A*28`~JIdaWNC<&CrTxNC+>B&RutSvL41Hv>1NAbEye?j?#$IV#nR;WUo` zp=U>$9dD_{Ei-OZQz;11FYAwmcC8K}t*n~qG}vknYOQ55dlGd<3#TRz=|d@`h5-a~ zP<8-)#VC74YABMNyiJF{CL^46_3Hg{J3|Zir%8{LQcx=RDk^eYc)$uL!zUCTeDNg* zD_$ji$@RT0ufy##$KB1e|hd+eAHFyZVF zWt;{#(kY;8$pyi>A7*96yhIt)eznzy4gP#5TI{ee9L)2tt1<>XOk@^T!Y>0{YQ(LV z-QrI z#H6WFT4GUJaa_Apqq)EyA42Iiqx`rt4sHBUh9X;OczzIS^J<}vzw^BTdJh;;r1fq^ zI)!8jpc$5T9Atl|N6drQU}lMcKXVF5`Bt_2GM<=Xk!&Zgm9J8W4KF^UBFEkI7NA)S z&dnWoo0YkUctSUH%ChK{5#`JuSYVAZ&OsZHc+P#k()F30**2)xla~>RI9diCik8oW zX_7bBM_Qwq`Dsgwk35q}ja7_sgl9!<5Y(3KrM1hvO#^sdu&X0x&oasm4b0rUu({nS zeVK@N417Xw%C5TAj9?ce<{UN{>?l+bHZdUHmeFuGmmW}MAAqh*pM{-D?MA*_M{Ezn^cGy|1!wQJ)y~YtyOpKrx*R-oEn;N z1*w6XL{j~r_YkS5==9vM!%dW4U_x#DIlZdYmM#tCJh>S@TG}06Xg}Y!*@L;M* zy&VIQPpJ%{#(Q?_FqS3Xh)FAbqZY-L^ss{ zUMg7#(PpRJBuci_y*_M?9-61_(N2Y$D7kI*z#F>WG!Kq#GUui=sj5#5Dk*oIQu2a! zJ_WkpuD_S}{$pZzV{jtbfCpPEe3#_mITUr=0c9nvD}Ax3#2>^#vhX#@c#8NsrXka5 zsR8pQ?>@+RE=zp%aC4lo1nY=K(xHQ=p`Cto>VVo?`T`g!?Q z5GwV}>uCwG=R}ym9I{LnCgp4_3B)>?7{Ap_RA5t^7-zo|=gz9I=DN2US@j*%m>Lhm>;q zm_mDQe!q8TT3&ds|66-4{d-q>FBxD{hmI#%Jli1xmalyWl;P~9J}+Tu3Ul<)kG_pSUI3y`B3qh!#AKDVQ^9+Al|F0Hf#jn zI1h3kliC9hM17OFrq9-Tt@=;r*mm;~Q?;B=q@WU!5TgkIF;g=3Qg+!*-O|83v8Td4 zK0|?x8#>Q-`1P>|wO^n8F5#*n3l6S**$I#lY-X&wvT7Oqj>hzPaLm{0;whO^h2^*D zO|gUS$65@@D;sg>j1DmS^Llt7#6{JW$==6ws+dm{D(;U#GaS~y*0gnepag*xw%0k9 z;j$#dj;RTn_91%NTi;Bz=vv_%C)I(16@l!okRnql?3hdp_-Nf|Qo1}1)0jm(cbEX$ zL(HF%DbBQ(OL9Vi+X zPuir({S|l9-XSq}UwM>YF^6)*kgr2-qoC;WMYu2Pf4^+QL!Zt0M z@`+=|A1F#HfJxz0npz+>3;)__nj&;R)_Ia!o6v-4krw_{^CjV`RCH#qi0yo@rx#{v z4U)lPGjszglwSs7v`JLE-2O};Kic59htFhR)KLioa-|^+Od2v&gyP7HYZ~?{Mbv9{ zS*&Fc%!_Z7Bw#!dSr2sUD_^!Q?@At*H-=1+#I0KMHA83u!GaagVM3^NTZ1UWH!x?_ zFul?!_%*gi8{BX*D-lFd_A+iiFnek8ybi+JmuQUb*PlGDsS8#1zYKH}M&3E~fn6;Y zKd-iv3ZobxgUlQ3GyNu}=yJoZpwzE}!6`bkG%Ux+p`={#PO>4h;D8}(xoKR ztQe-tva-`}Cz4aP1r& z3gqVE)`Q6D6}q*%J=$MOy8pRIA)KTMS!pJNuJPk1rniA$77hA1!$C`f4V1IbHg&Hn1vQ z1eki=Yge~tI&GB)9ARdzk9`&uM#nW>DV760t@Ha=4+71&W#FaBj}Dj$*gSm_{O&39 zZ}#mb8o99)Vb-v|CppUmXBvsJ(>=lfbTNc{5o5`#q9%Xl0SoA-Lke}g<**ok4-p4% z)M>4_Brquf2>ZQMOrrccMj-Fcn3TvtLV20N91}I|$pLbc`AaD)3vkg;8x^=>m3RI- z3<0kPc(Wa)2#Cpr#ydvT%@rSI$CFBT`wr#~!>A(fmA|kdGF;1PK1`+PRZr*^ycejP zic}y*+2MdJ8z;7~IaO*@SDYm$BZF%hDjlli|Zf*a&3!25m(aXo33u zQ@JNng-XBEg)0ouC6HgrDjIhQD?jFU+i5~pzyG7LNcpr-m;_+WD~vcn*!RpNN(Y9> zbQRV}3eoNXc_&@#|F@IT<6w5s!B)FF$3QK#(+SJ=_pr@Z=&F;p=Cav(b?-u48+zCn zc8|*+hw#eE)a5$AE|j^deK$2rJzJx8sfFsBH6q%R)+E+69-6LL(~U3U5dCHsKb3S zy>q-GFa?_Af{n9*SBU#duaY<28|F1Few>=^?E3&?4APt|3~L=8NlRCnZ$WJ=H*G?} zs$4p0PU%UMCtZk4-=H3%2b{%BQtLLo%Qp9pn}<@!1LE+?mEJbiEo2J(FBt@zy*Eu5 zzH`ImEEFrEhp)DMIIMQr;0-%0*)aS&3>cYaVuk=fjoRXot5lB;#^1gqK;WA&EBmN5 zK^+p|g^LVVpIqS|{VHByl6bvd)r!SGwf7!aNipff)uyT5?cz!VK+TtyRol)aUQNvF z6AvJO6-tDV|G}6`!&$7&uGi5!5)6Nui%w#|{K1o?Gj6_xs8)yv|Cy@j43Cew6zvmh zSe;(j6em+)MWhasw<0Hv`a_h38J~AL`1FY200a1g$8UQZY-P(f$7sm;XcfNzl?UJm zj6R9Vz<5_{LHU}grF%o&>L1bT0MJ)0YEG(8ItK8n?nv~p7oa-zchjxHBkzZ5u5yKp zoiYyF@4zEM0Llm^lAvXi4=UvWYgs*EMQ!}K)cpV_j2a$8M>k`oCqF}x##Ij4`G}B1 z_>ngFj_valZ+!A)tsgxCP`v^){ZgRir^{bdcz5$5_6{9DH>QhsJ3RMlQA;lTI#f~9 zq8o6S9Ba?R1>4Fqt6D2AXs#NT@4@|jAN27i9|{U~mgk%NeO*I3kY=YoTO$p{gTdl? z(q}$U(C?rfA5m6$rrBEg@acs+U?+B;34!`E284!1zV+YZX+EDs#CNACIo_|*Zij~0m(IDtN0u$JCY_R8 zt6H045gw1#K4xlNk%<-7%yy_r+%mRU&4!d>Qs6`C!=y9>@LV^=JMG-i9gts zLr7rwGz5fvhw89%q3qOj$i5j$8@1Q1`@vV1BWt*4$2b%j1?J5oA@{O&RYTsG4B8OT zO-hiOx6NPg(Z)zwPnB%kDxr^VOZ0G0NIkt&B3wQ-C#6*@Z{kPq!E6aW3|}wWb~Yn? zPh*j4^qz{Rs_$TlJ3OS|sktF`=(><&2j(zXbfdN+VWrT+wJM@0am^X>HZy!%9JL7+ zR;PwERvSItAj<>sT>at-q$OKw@`Lz>$>OgFl6r}&i6m^p&mq1QhfM#X!pyiwLaUBc zqt@hYipYH>&G}YZ$eVSC>JH;$2)n2s8i23rkz<|mS<=8t3P@r)->xjq~2BmdUl2QBK=sRPWR(GMn_vg+|;ix2x40dbE7 zM@-g|TitF8xCM0Ob>h;%?qK0E>13U7q6upe(U6eA)@TX8iS5g#nW`!M&ZRd*nBVfG zg_TE{6@%RNzW6t#`5d&~g?RKR^w+j$FP%-~PXH8eJ*ds@2I`kfKlwzageq${eN#Dn zkw#Fr%Ptebp@tAO4ALnV1H`q;T>=k4`pN{m-|6&<`vHy=L6yuh`2HLC#Su716C3Ln z1vVrfu+V(a^;altt&z_Dk5Svg9W9BzRqO8gEP0%8XQJlS47e2~*y_cR{Nm=y%LD%P z{D7f^TXJn8`M*by1g`8@?I)yHEGXs~<4e2f zZ#${KK~y{b11uA-@+;1_0C&}Mg{dx3GXn)eGn&N@lD56JMOyQu-;F0Z{LkLOerB$~b+f zG2N(Uw9qH72g$DFmpmj)kV<8S?aB!113~1QR%F?=c(A2AhNl8kTXv?)W9PF)aFjTV zSzpsR&CE)b19Fa&k6D7n?)<_Kkm<83uUI_Tu{IE0#e+HE-WtnQR%ANaK8#>a&5ORP zDAmHbbMLr(-+B*f0`d5)AIH|vgk`laXt%Z_x`VPo+!yV5iJo+Ll4km#{;1bl%&&Qf zjf@%VrZ#Uw!ZXJuEl8wQ8x9u5xZpYz%+3;xK?6muIN z9pJKy^>r5}Iv-IFzR7`MI&`C8$~b!r_FCfOzC&wX*fd#D?KBA+cjje9($adgV8}IhKt^@$#HH^z-50=f>Ws;J(+=I>pb! zVnvV{^35uy$YHn3ZMhIJoT^LHPj9!Bm6hF)V4RuneNzXbu_E;oHzj z%ba|b8y+oM#IHY5yhDWLBu!1wX7^|5lEr5F8lp4G%lC}MN}m2z8ppq~>1K7m_+uB`oghzw*@P5!W!zUSVMN@< zMBJ&|W$YCG?F#*$^ePy$`VN}{q1qv`_vv)&Bk1!Zw0rPc$k6~_?5JgQ-=SWA|36=0 z-uH1LVd&d!{5;6ikyCGoY1)M;d04_t*Nyuw3ZxdLgfu+}Ed-IPkz(TIfIfeV7gK%_l^%Pli>!|dA1Us zkY1_o&>Z-;9~O>sZ0u05uIjoAejep3C2d%gWJ46Luf?G2daqFB__Ftabg*i*IA-Pp zmmVY(4_x6i8gGdKrpiJub=^~7>gnJ?N|aKNU2YUo-puDvPTlL4MKw$PpC+ZaAFBr@ z;3lxU)puM&19b8dCLMnmzeCi6Eal0mPNaKqHWOR0))q7@(h)lMdy@>nueB*m%Rt@m zlAN-+H=T)z=|eM+Fl$PsA8CyKh`^vnTU$5C4<|j6th~{-kEgcgQz?-_UgmtCT&8(BO-+k-GRx4R&Z55k47KF&<;&2%FVhI%3D?KKA1>N z$*-u#WHNhY)NFsH>Yyw>nj6$3G(Bx``b+ z=C)s{%D^%%c-W;p9nM*1fj{P;z&WhY{8zk7w}ML}1-%XncF$W)>a;({RXTL!YUQq3 zbYCn(?yzM8a7tga%_96jnViPaYFl;OAg&u2?t`H0OZ=mklM`qhIx7J5$K#ZajzeY9 zQJftaoyj**1FhMIb3!>N=}X_E{1W3|unF@2+j@8rRbjv8cfFmHdD*!+_|rx-HI6_Y z22y09N_1!nA(R1NVf{!*V0|*{Dh!Nk0XtaWsN?YiiAh**7}Rl|Y1z78cw<8-I+(d# z)d-k53 zs~vw3O$r6 zM8qY%PbKNOCNGSX++;!JV>i*qUbnB+Yix*Hwg zC?AAe@{*gUsA_^(0syv~f}k573&mb{w>ebxy~Abuc}f3ZT&G@Km5G>D<}4D&2Uql9 z7NJ~(Zc;BYay@JZeiM~`^Qi#hgiXvbJY#ODe4-xA9v-IT-?aSc5FKQg@E7!YJ zaLag#x4E7tH|RqvC&R(FH6d+bYmW-94fV|DZxRB=ThYu}clW6Z#UGTM zRq4QdSF|;`s6k%H4K8@hxXK5G(n0%C&t!!}VK-f!Dp_UEQQg$rS9>g|yyTI7>rI)| z0h#JPvTVHI9+a#MzB!lVve2Yogs;;JV=}&~nXQ=eS_c7KA5fvs<^|yNpu5xav8n~092z@PA5rxR66(h+Un7uaI z1WvXfPjeb`?ds&bl0**}y%4R(o*-Nubds6MK1EVY){5vm6x7W5~C47sufwvQNOa3X#+4AXhBb3+NqSN{MZ zi5HKx^n!_|?593*;qogEWmg@boeL%O!mG|mtHftl%$6e$EP za+uP?Ja20eJY~~?gq3vE5-6Wx$4I4Uo+z2_3c8Y?Y=Rk>Kpf^PIEua)o(fXkP*xds z;+=~Ug$21r(idAbjRSGl(_8v0(YQWcx5KC3igm1rm0Hj7@QobOFFv&^Qe$mSLd?1?>Ivy`t9ohgO3D_K;B|Xms-sH>n;eGkz#paL2HIk_Y52NVYSt@`iF5oo;6{Ir6f5lD?xS^Y6#n=Xn9$=Zk9Y4 zr#JK=<&{3lXXGW+<5McV9nv8+ce?Zl-Uq~2bW{tV0|^!mf^*=;c!WzPK~dl5h|!%( zlS)^=VN$@a2Fn_ClL_zDQ}8Vt3u{Sp*!kqlZL4?zvJ@yU+YGG?*3G8ndkL(Da$gF~ zAj-t;FU_mYf#fi^Xk7CN$n8VWDl=22t=6S71>6fgkld$=mkNcA-5aXVKbgd%CV;#d zcR*Ml5o_nNymtk_9yOO7e~4XO*2)Gtf(JK#LZ)of4~CEBq; zr@X8#rL^0;*J&DZ;Qdezg*Ho;RbIhPRdyg1mkIrzulka1ALaw8%x7t?(85(0QYuB7 zBM@rCeAyfl=y`7rlJ}R9hfu(+(TD75qgtdkg|5_pGaL~d&JeHP9(3cNuwflc1W4jD z9}6ftlQJ&Eflu^nnA!#|5(8;Ip1WdT2mb<7q@W`j_;LovSH%0VlshEx z^@ng_rkiv(RNBu8{sga#P%&V|L8g%38){Cl9m1{IL4cdTuG%kZb}&z%SaCsRDogUA z2`o~WKDbDVFTrtaqCmsnV@Ssb_GOXA4mKG|?_V6Q+|i#(0``F|hN#Rr)!|W;v{oE< z<$Lma{8SHdL1=pVe=p*bYtUGh0hPCW0aDE!p8U3o7ReJO=8riw?ERHCC`)kEWe0m! zgyqdTRlqKV1{RzQEV-M!5tA|%+Vl-(SgG1vcRCzyxVTJ@d|m&(PTt2J7GzcpTRu?h zGC&5-{&z`6hiFxF3eE`~7U0t{v5;)pOM7%m!12G%yFU%qvY`nOM(MO<{F)M0u+dTU zg=XGral#r(p%({zbX7C(Lya9Fn2~|-H;hGPSga^Lok)4OkMRUC_XiMjX7eiPYKcx? zgIeSj>6h-lucVr*34K%9DN`?N$)3%8fn|$mFIF4wMY$Co=xenIy6jb}fpp5!CwVQ^ z{7YY~uNtbeD@CFC)K}@@su)_i;fJ7fP`TnA4wAHCxD$rwWVD+3S5}HewtJ~ZbCk(E z`*-*!GhJEjzleu;&t5MS4LSB^vvd_tYo%2$n-$Jw&4fvAgHUZ9eLAC5p`p;Q@!sC{ z@2^4n7FuO_C%~X@Pz8erjI5;Vdn%B&ieZ~Z&i?K1Used(JJ`+za{liL|COq+`p_T^ z`<@_ejRN|2?2VkrY1FndUx zkJ`g+@?z=oNCB2C=!7_amKMdSmi0ZT?PT0*c6|Eh*MH#sI5Yj9n0?=lvE2JOWqa3|ya>mlBx{@VW`U1IMSoai$>o9qHFri_dyQ$S&Oijoh z$|W2xRcmTQBd!PhAqJxOV>S2 z-U6AMxAWHWrV9F4fhbBjewAWIqCEr8U*vfto=K$LTiM@3uzQ&rg9X%Zr6c&t1Cu; zw?*i}X7m$0d0G{Oi8p;bn%$B*%p$XIxX~eJDr-HlNrX0S5QsNoS!zx@j;hna25>)K z1b`J@N|QbRE3GX#?phgFPiC+5urrr94>+4Xg+0g?^3*8K8%qocIYBvf1#)a*pJL^{km8wcus`4)zK8AX6lk(Wd03EEjozLE2FEh=$!rfnP&UrrP;`uyhzOu3~<>nCKICkt9x7i(|2gi;b zxA|*4XHNX}{Lu9L8xRsTGt#$>nj%kwW8N<^ySC-bM%2V2K6|5I|C$Z?$Z_W98|%oz zr(BMbFJGGS9XItp^NWwY?6tkMY~@cu*@F4or#@f`Pdk}&ibcRaYf`z7DkPV|Jh{bH zaY$+^Ap2G<Dh#BRMP(>}rh?GKqbc88OMm`&`S{Ed3L$Ll5(nGe_4OKiPZHR;zu2!;gMMsm z)etj@ji1)EYh^{`(_SYEadL<{mg*fJld^G}`X(uRKX#np)Zo0VrUu>LK1meQgdU(&@GeX_JBVJjRyPqt@h(3fx89g`hc--{opt$1hq(rV&F>F-yOe9FQUMOJZ+l+eIV-&@8&nZ%)Zab~^Fs{!Z z&+*0DpKQvh0P2aL%FUp?Yhh}}yke@9mT^L#__N2M$@ZrGQz(mP5N?(sYv)uK;22?Ze{^VQh-$SS zxTvkE*-&3U9e!B<_4&txju(|cq2oPklbUL&s=iz8_cP;~oOFlRT_Y#Tjw_q;u;23K`vG=N@Zp7Phu^wXv%bi+ zZ1Pv~=NLJeU_$JbYHQ3e!m@h?DF2(%vv5Irb1dUNf^4@Aw6v|J-|n4Uc&2Azik$e> z@Oe?#-+n8_tv(`6D{NuEHLpVC9A@>yx8=^OC7*VXT?p+8C$U%2*bI=uBQ|bXo%48fzl09c3LTV6jGBA!pso`AWSI0-XaL^VdtcG6^tqJsWwn!bC#UBhtP3=W z`XrB_zJHfht?2HO##jEC2=A}`M%+tCPHzMTseiWlojUT!&8$zM&P|fWPoYwIIXGk+ zKf&Sg>l0s_ntou#_W_E{K7HA`jbL0)52)EA*2U#WOd=e5C@nMc2hmM;Vz{`-$6;Rr zn4VpBrVq931ExOa;2`H(4 z_dtc|$j+;+&fD7@QFU)*HK|>$2)iLltB>Dr*l}Enw9BFSs%)0suY&?ZJDio*mXbEXagVz?U@YaUzp>JQn7Si}$i*6jgkF}7 zKkL_p#SICk5zfiPf9CFvrGGkluq%V?miBUrIqKrQ&`2fZ(P5&i!-~73{h+wM#z&n2 zfRGz;2T}>3@NeNwj2!hZ=P?UUk?4le*!y4%fV@>QT_70CR=1t4s#tUomw4xv9To<& zG&ld%m*Z1AIXQWlk3#~Hu7tY4wsxtQCJcRdr8atJ>Ep!2zZG1`D4;(#0npsL?LV>E zlyB|}cIAH+(-ix$ld~Cc8iD}PnaMe0TN=@73Yy9d7VVjb*F(piegmvegBnaQip{i& z`&q8QhnDCsD|5~vr*#C(E@m{9m#*~GDhksL%V7>@Kb7)8{w*ieE#rWE2QOg zbtf~e@d8qu^ULJ?ROiRiz-)!+HB`rU9bhm#JxwHlIe(XZaBfZ^i)a0AxE!I}o80le zcm2Z)^NdPRL&%s@6%)m&JU(x+&K3R-#h;uaRF-`PGefF${= zo-JFit=$YgJyjS>kEK%)2t+0F+1=yKluWYl_jr;zCBY%$OFw_ z?l!pIHBTD)Tz5|TB!|a~Vk?YZPG4!VIvC#g#P8IoZ+;wYhlJ#vjp2Cze$oRipe3r% z-|xp)V!ppcd7}JB2H~xx`9pAu@>)8)P@dQ`IlmIr^YiD8n#DDL7F)uk*Mnp`w+fZe z3G#lMfx4w4_)$W8PwZ`^0%2SM0G=Uju0`u!RUPo5?ow1I!-l_w-4J(8dj4fy$2pXB z;w(d-iI<7y>i0=#J@bC(?c0@_$@p%SnkYxPOgYb+=W_w!YQ%jggK(J@c07NnZAWN< zMK|PQoZcGwVRY_mjN~f^y|+f_UlNm~S)$IBB0!!upka+N-aLq{A9(SSsex&W{EG_x z7j*-EM>5m$3Lj49-OELOvkuCuD-RFMJpoQnh@uYdZx6LB#qS7CGm4tA$ zwJ|jHwzGBIgxue@(=rsGXF`<>L@)JGs<*B8;chTj%Tv4qX!_Ci_$|@)cD{Z}`4y4Z zt#4o6*r+`iQ4uVnnSDNxEWeSvGxz>=$4y~xQIv41qh5v)tCGUa^Pw?4K>fT1ac`g^ zfFlijKm(Up)K7bRK`za#DGZFI8;p>_PDqc*Vh7E$a_ois*7x#ZGRq!MS!E?R;O3=8 z6r8IGc|l|JY)>3DEVrQcf_@urUT&Z*p; zkR~1qXp@0goq{DL*Th^~Z*CYY{RLMQ5SUkrZUr@YsWz6^&P;J<$sMgSZvxNa*>NV9 z=dHgJUM;&C|1>4pM2_Cfw7fdfNAVZy?tQ$~oT3glvSmRvE#RoAb=_U&dB=P(HKF1Y zSYo6vU?rVBa$zz$YF_L!^x?MfhvwI&QXv&fEb4-+yDG8q&*jM!7aW-=hCbV_XVfkB z^IA!8EF++0zT|$9M)T0xwXWFq#&5g|wlJ-0;>{2x` z!i@o)2gYX@$1ca^?v#HPdD)utUJCfSrSo7Fr`^V@XD^V#Cz zj5k)tnXf_yx=L=3YCJh{LpN2vrZT~zktJ&jNSqw8Vx57+R!G!_G%+#x^c#(V zL(rucVOoU}7d<=On~sW@BY|>|0HXl!vK33Q3aVDbY`T9OO?fEq&0M1F@>%A!B^?;4 zpVT0}An4J1&gIJsbLFkxmLXbM_^E|id~(>gH3?)Whd*sDrw-y01r`+%9bPWzDmLTX zg?NP5=slAJp?_zrkeUUT6Lwz~XENlQ4GA-i9wl97F*nZ+^x-W*+eNOmQJ`@|Bc?Xa z6?U&loy`qxlF!+Ng*~_+%u3hWF<#gnz1SG@q@|fWvRurDlJnl`vT?X60_QTxQRGuQ z87svn+Cup&flNTXr|+K?TGV2v+w@vX4X=`Sbw1SQ3xtKtj$U|-iQ1^)Cun;N=V-Xu zSyHsM+^0k_W1#ViIS`V3BZp$2v*IX_n%rjwJMCu-qL%R#&*@{n)cfEKpK6uL#?u0H zm*X|KR1ls}q22W1w=mbzM^o3str)jV6pcqDlr}G5;_cTW@22b3LsInMMV{ZqdAbxk zz`Uf+=h zg|mf$hCJ9^V;sRb8;L)yFzHtGBdovjTp$JwD^K|}uy&fY#cRE$F}9zedK&(uRRvib zc4HRG6fK4rlWpw#K)sWHfD?rTm)*uxLYA-Y^aqeM*se`oHDo6>`(ai z{5bAHI4P^3>-ma`vg8Sb--=v%u*Iluvv3k`a?wndFkia7?(U+=9D^@W^xs0k&I0bH5e(<116ZUVo3+RjC)cPHnha~3(owCy-g_Uep9+u z_nv5(^p|$-U0uc)>5|XnDemWNAB7YnbV9@+z>)yCZQ}zIU6O(-mf9`f5 zQ~mV9Cep)Z!1+2`9^Qs@SJBhdG!~W}j1Luux@93Vr~O8)YQ4AE?nUp7*9GF;1FE%(Eb$mxgitv1B4ia1Fa|b2$QutLmVNcZn z)y67UF2xjqPqk+iw_S}H6BzNCAGzrKs?Lq%AK=%~6W%%ecFSS}x+$v+ajx!f@Ex-D z8neX+@Pb~UWk{9aO19tla@v`o$ta)vS^c9y1Bs?i@m;s#ER~b?tA}pnKj4VA6sr!~ z*4K^ziQ1)5-TnLU!~yNq<3%pdU6XP-hqHJE?+wRm`m?o^-)>Gg3lx;fJ2VrQEjLh( z^49-T1KayHtuBy-Tj36mFm0l1997Rn1;#2Lt;cFD;RLp=ZsofasCPN$(`aK*&o>K6 zGQ=^DvcTvqlNg;-GwN&Il{M;=smq2U`ns5(=_a1v!n zLO`KKdKMj4v3o(Q({LP+kZcK^!!Pg3M6QapO<#vVC2SnsM0}&}xYZ2O-wHF#;rR(_ zPofiH<`qSjl(N1Gf1YnMdlDr}|A6k4-;03)#;8V1X<%H;`#m+fyCLJU8tP5ls>B4r zWgsnOuR>hRwlaCmbAJc&R>!a0^~|)3*z{)uI~*|#xMgE#wAYRwrdiyr!&;Q4*A}9K zd{zS(p_foZ`*7$?G2}w95~*txOIy;8Owb$tRNk35HB0|Y>Wr?iBT6*6ZY~>+UBb>I zT??|G;kVhVM>#K`o&pUs3ayaj41QEF#-?n;+R%(DU+>CsF=3m061~C8w2hYyeT0DH zs1~hXmbZH@#f+E`ZDk5v!%8@5vIS0%veW4h>kUW9%J=5uY|)`8%d2?ZcnI)5th#|F zhAiSGRM_1vk6_Hs&crMNeJek5LB912GN}-j^gD-r zYjvmb9?He-pdM=yQZ`2h6q(#obq8@Zsg^N-qO`D55xoFbDZ>2^Hj&_;!?M{&7I&FlR@K6G%)F5 ze}slh3jI5imzANA;j*I?EELHwW5IPITL6ynVWlo7sz2a?EBLym7uSqDfDw5wU;P~n zl6#!1RypH6~5~1wBa;!-9^51v)F*9QeqiO^9=l=n*b0hHp diff --git a/docs/reST/tutorials/assets/Bagic-INPUT-resultscreen.webp b/docs/reST/tutorials/assets/Bagic-INPUT-resultscreen.webp new file mode 100644 index 0000000000000000000000000000000000000000..dc13d3a3194ccbc10f38e79bf417aab507430e9b GIT binary patch literal 3724 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.png b/docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.png deleted file mode 100644 index d378854b8d846d1fef37c6683727c89ae5b18568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77061 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 LzIvsqZP@<;XxWLH diff --git a/docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.webp b/docs/reST/tutorials/assets/Bagic-INPUT-sourcecode.webp new file mode 100644 index 0000000000000000000000000000000000000000..3b9923b76cfd850dce965323cf7b9991f3512455 GIT binary patch literal 32280 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.png b/docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.png deleted file mode 100644 index f4e8322c53064150bc84581fcecd3e45209b088d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5348 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 U?a-O}^Sxxy)iTtqdFmAXA2R diff --git a/docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.webp b/docs/reST/tutorials/assets/Bagic-PROCESS-resultscreen.webp new file mode 100644 index 0000000000000000000000000000000000000000..a147cd82d994cf2e5665b9a2bcea4a298b16b680 GIT binary patch literal 3194 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

    H*+xN@j%OdN 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 JDAzw0{vV$onPLC{ diff --git a/docs/reST/tutorials/assets/Bagic-PROCESS-sourcecode.webp b/docs/reST/tutorials/assets/Bagic-PROCESS-sourcecode.webp new file mode 100644 index 0000000000000000000000000000000000000000..c4bec96d38e7d2c1070bb5f889b75e6d857b3116 GIT binary patch literal 27278 zcmX_{18^lx*tXA!Z5tcgHg{uZV{Gh=ZF@JiZQIGlKCx|^U)~?zT~pOFPfbsC_tZ?^ zeRa3;cS*?*O8`JaLR3**kz3aN>zpaNHyxk`-``}@Km77}N?F+qPi6$>Hi`7jf?JKJ za7$QAeMiT@pi|joickJ=GWr{>CnK;BvPEF^lu}7xyq;C)s+RM&GEnuP!;unp>c>oL z{1_A{!|ppw;?!TS96v!Gl{b>x&8PMexvH!FkI(kvkIy&H>hB+&j~kw^_Zz3(U+Lwi z-RqUSu)3GQR`jX53B#ITmFSIa7fHqJI3>MKQB`t){eC@*O7n z7%Gh{eOPe#alcd2SDXhj{s2QEw4q*;sLRM9Embqcz(_;`4<21skDruDwj-okQ@Y=R zUKR@;eJmbZAuNHdmPA?Fn1?Kw{ns(wtY%CHb1examJ^~rrE-``#*k6`P{2ihC_C03 zyE1=jcyPmRI3&-klpenb9*wLNy;+|HeL?R)-(F2z2)TEEpVMA&I7Vb}ctWhEbbZEG zoxUni>$MlYKTMM)4;Nqz59mGkH=?@QWMk#RwVLS>aN*4(%5e;n8P)pF!DzK9{mkE_ zq*efk(bc-q>l~+BnDU|Er~CRjrRx%7^Ofs=4`X}l)fb^Dbbil|ZhdZQS4=*QIF6D@ zUbO{V<3tzdGVaXG1^2d;`l6^Ao>l-~skQdLlZuI}2oIeLp`xmlYPW7&|kaOgYMs+PD){C_3rz6Tj-5&1lMF z5;f}c`=p{Y;G)8*c%{}Iyz~$%Z_?6+ipyX%)8>?BchbGg+^C+_>af&!^`W57X4Mg% zrLBSxzdhplXCUp+Jc}09*Rx!>)D#JmzBkq@f3*qKzr%!DCBAhfOxe`L$%8*600Z3b zxc{%<8*D^KGfg)2p!ZLftO-_m%heyst4*slC!Y{+TE4ybctYUah!0nGJ$6W5#y;>R zsF?ND!&3XJ;N6^;!qJnf*D_b7Gc$I>Ypwb)y(xCVwvt|0Wysgr1fAa22b1q>FoFV` z80%3NxjSQ5@YfT-r<4wKEe`s!p`giL2}l~Pg2eL*C?8BtAKH+U1HxzLqqS%3!uFl_ z>%{4a!+r7_zlX$U9P=lww_iu6TwCgglilC4(Fa4fBJAws+2pn{kbfc%W`{%4oUp>|% zOv5F08n*zdU;LH8O>ci+h_ZRK8{$ghIhuxv3EN9+bZkoabERbdYJ{2zS;@2t@6txFI^S&s!^AW#fV3cOss8jFAIzrBrH1ozQ+Biq~Ge;)-92ab1i@IexA7J8T{R^ zZjHB*PsF5I0Vdi7NSqDeZTKaNPd~?~JK<;7J0;bG*M*~t;!7w<(vxEm_%!1O%w%)) zpBm@%?jR&4G${FJH*v6J2M_VFcBd3{Ati+PeFrxX=0SG8pDqwX2nld41kAA5BQz@d zyWivzdkO9q4x0>IqdWGgxYWAiL)>a-MfBnALNa*&{v2J>24C}P+{+ad7bo!%dz;%b zRHumb&Q4GFdJz;P?%_qLs`gy+dcqGWBuIJSBN-tkDk@skRS>IwiO}OA<4!I7Muz4} zWG#ib6gy!DyY;35X!@6K(iBSB*tl{FQiQm5cmgQ_#6E2mR^}m_u&Zj!;hMlMYxl!A5kuc3ntkolIII@V{^g4jdx~qM6>?cER4j{QW@l$=Ra#b4 zH+jK9^gL}+BojhR3X#(CepHlLrLk#;nL~rXxP3HTxGT(0DzC<;1C14*v7Fz@gV1ew zNlIc}&)WTcvF%{oZJ1wuIsB^s5n(ohP3vh`$V@MAxWtjI>LQC>x(J#mxq+&t4PKm| zAxdZ$X{H7g86)qR`WdDdE6bt{0M!=s_=s2eDAMzigRh50Mc5sfLTK}y71ELYGl9L; z<+I!De#6A@Bzsf`eGED8Ou~xOr}dAwVgN;zK?Rw1eOQUlTNhHzxPkyGS2`r;dG^g8%O`+fcA}iTVk~X~CP6NdARvG^BAd8}JUv1#(%{jF zZbOJ_g0#X8<|<*w%?>^&%jAwp8q$k1OYLPPs3dAoLA5u;OEq9)M#xF; z>yF2jXZSlQhu?n!m5(`)q4Ent2X&bA95jPJz-5#i90FhFFZPNtrv(iSO$@D^1Od&( z4z`(A91xiALk?)O0pPGRa6i$bY*KS`Q$urpt^pe5kIB6??d|O$M|Fq|G;n*;u(k5WwCrra<$uQ5X<0HkNA0!xmL-q)&1Fjx=2grj>>v6gNEIIf?*66s( z$XXv!0_&IIBx&N&=ndG@qhT1#+0#+A0Q3exnqF&8@&qj4R}RQR3EG;p3F>Imdek^9 zKha=*P#@f@-f6Lf+17w3$$6P+A_q>Jnj-iPKRj}Wdoax7VteG1N2iCa>S8|Y)}k3P zN1j*62N_qAnNHgM99h$`EyhU2Rhwd-f}7_yp?LE=s!rQJ7r(joykTiuO>E{LWyk#_ zd71lh&UU(<8|?y$g?9X97cR`yBc`66LR(#?DM zN_ksFEeDwd)FC$b*pK2eQkEM{Y18(VGM#L6Udy_HAg~Q+N%Qg{_M&Bg5cy`9gJ8og z3RAHZ$n?82S+2GF*zoyIj%erxaoDdVe$;cqeza4X4Lh6q2-gCNlU8h;!+}-`)fjCt z5{CM0BF)Zo<$t&(a`i=MR+ckzZQxp@p>CaZc!&pV+0Q9s6qm73qb78BA{SARB~2-$ zAY2M&2wN2k**3=$m28jMa|-vdLd!bJ_c^xQeU~tuTGo+hK26lm7aE~Mj zkv)21LRRo*rAwAj`@d;w6Ahj*<@5tVeM4zCx{8ce`QR+{OU8-@suv@E4xpk)yld1r z8IEcnNWYfWLyq8gYnb%16iOI)(BLV|&k`d+8qUI{4CPzNZ|H%m0Cf3W&rWKo3nkW8 zyLR!Zb~9D!Xj&bJu~DaRcb6Lsv@EGVNxSm8tk*A8gX)+uKbpa|G31b#+<;Alwkuvu zKTa;ehjxkrx_(3$|%Mtk$g?yrmdzz{j6g1y$?kMqrSaJ%=Kg&r&y^jQGRGd zoJ9XQ`6Ex9z7BnlzGOftyOA5N zxvwy!{V~f(#5MyvW9L4WY!m7~(w?)$bM|7F zFdg|h`l)89sD1_2PsWkNNE{rA&14Gq!mhM`Z)I5A#mmq@vuSA3Aj>l6WNcizbG5-{ zHkt8UYF=ipS#%=X79nUCx&i0NWx;kp7SMVc&f#|TzNu5TSDgRG%?-5rtI9*H&O)VQ zhb-`Vn=2QCOW`?_q0FBjA)mW!^7<|y+R7?dQ-P@E>zGtx9|gkKPa!=)(n&Sh5hw*| z{L+>cPWdP2;IAxDH}&Ri43^65d^`fILnlbX13Y?ISW>0B2lfN}If@Kx3$P{gG zzBiJLmW<^sd?B0l7PUk8eEdD7V~{pJA4~fd@52ADD*oI1NQ)b}{arjUSFcFv)@R`M zyw%yiqD2tzY_UeQp7FM#E9B)^24|~O^aR()!*lIFFG0i4S-Uo~RuRxWX=zQ|l-dg_B6_UHvPo9v~57!yb zwG_f}nP3e0$CrEPI}-r}E&^C={*dm`{6k5W7p@-ZIU!NiIOjMojQySI5;0;5Oumj{ z$l#_b5Pd~Qu`V2|F#v$D6lkl9lblJxE?Mc!Lfd+E;-bE#SPcs`7r-Zu;+xd z=bZ6m0JIE49AOA_Ey*h~9n&Ek+1KyV-XAWq@&vJzUG@2B z>rppfXWRwu~qV$-u>T0J&>jeQ{Metxfr`E})^xhV%3^wRt8S>qsNm!WmKc zR!4vwm2*Bsfb)%D1PKXAFyOZ-K0w>l-o6Dl6ggyTlp&{!N%1ow=&jvbR1hpeCfCow z{;J`Z!28)%8^_2kgdy=yOWYP*%v41=mvut)zl(vEE8M3#_B$$(-{xgxW25Ezrz?sP zW?5-5-qbbELf9>hO(5lak6YzrWn~eRsk#Q{ChIY+OTGYH!6T|zFZoMR;wnXip4nm>QK zQwO)2!TYBnOWDGfSFEL{?&fTtKb7zkEB}11XH&6+OQr0pgg#l2&coM(5w9g$m@(zT z@0EXkP%e0fwXdBq(d6~>1dF-_^KrU4gaEdj3(pO@17d%29IKbFG`>Qr6x$CY#R*dm z?(;~;!@xAnnkxQ-DM@SooOLxxA@7cmiv;u>IZ5;6a1~EgV;v%stAX zxOB3A_Z#h5ezY7RZ!j&)sd!li4#eGa2|yxxBRu~qm?sJRIrrUt2S2xk%UcDn#;Hl} zZ_7%CdHtaa{(S^Ix^%6Hpx?8OiS$nYRYfAHT$ET}U!RxafgVKI2s}KzIZ(yd2!7 z2qX9r1|HrE!r611cyLIT$kc@us4*Jx7UJc#Heei{G1>iNKc3XZy`0XaOJ+;6w^JMO zMg-$`#R*bXZPUd7E3BS_CslZ+-E6XF$cNf)Iv}Zg>)|sacqJ z^`|!eH*85&n^bQf%%Ba3foTpM7erOy(%{;zOa?zSkAQcwe-mNl^Q*#gok?REL*$|m zY51Vn=XDsEOtO#zU~k}N;n7lh!%qujy!`-;N--RBSaGQ~+xhxLni*S zIDtR$V^619_u`bZSuQk5x?f9@GnspKZn28@;;%;quS5jXCFP+)z$-2n!{N?%9==Y2aM8wD+sZYKEv?k%p{b9H0VrP;#ZZ1j*Is`K z&hZM1tVB$JrT|J)pSRhjOW>x(>O8pv6sC2=56L~7VhpQ z(3R`4dF%rY>*#7*?Cwhl0Djg%#`$D>q1h81U1-BE*ZZBNatsMnX0G93Xx|bD@PeMd z2X|tE!T$P+pEqMwMFg8ye`C$pG@AMAIlZ&o1yk4Kw zS-F5%CLCfWUmp~+qPWwyVNfEq+ejQUb_ouT+Rn!%x77G@`H$UsaFxQpfv;Lo=QTDc zz}}EfCQZSGQ7<@Nt~H76Go6%r{F&gKNr-vD4PDe1uSUB zOmT6&MXbw6>@-h#(PX_xGtV2$Dn+ZMa1)^mYo}HWygQ^2W2zZ^d?0SQ=R41_;%Bge z+w7VLxc=01d7BwM&c+!Q4)f&BK!Yk~x91+ze%KA(q+fYs`;hJG(l@ufGkYec{!!RV zY0iwRzad6D>6PtQ9`hUq_@Xf1*(ibeN|wtGb^02^igb zR@WrVQ-qBWSPX*NosHn4NmSGk2xD?cIVb=tViVXeSHL9uLgHuWz~nEXTS?S0WAR%- z(v`h<)ed5Y*{V^zbwI+w45qO8Fc2qZVR$;O)L}b42M)|nt^~JHYr?oz8dEMF6D)JM<>V73Oq;9XiJpPf)Y3|Zr8F`0Wi+yC$yNT3 zQjY!;1sBL~;mIww=%2yUlT3E+Z6V*vPDYV?P7e;z7%?Z2a41+ z1yF$|2LF7IrW@MNuy+^V5Bs5&5u!wY=oY%KzrR17njjQVi40h?l;-Wpob&6(@>p2S zwobYG5S8wr`Y_CyzDjq7M5!rOG!cAL0+g5Hb}@@Q4_II0-HBb#&9%E;X8Y+Q7UgDm z>8d2g8jbz)H;|YTK$hJ|-vSTv;l#)7X}JW`5W>vRpKWp29TMwifY8R&PeKlj0FMB8 zt2SX)cde-7{7SBv>=G&NY_IEEr@-j0!=jl}@WYxR1uy|GiX8(h2z=r8$q=JGt?D}8 z#%BvFH>;C~e#I~KmP;QMrgM%(1-w@(H-CV6uX_+L!e2aK3f^D?04b*ZXd^fVcWinTcQ<69R)odW*IXA3%4CzoL=l+4wK^pvxqUfAEYEgKK8L&saY`uU}L z08WxAHjK&GUDU5e!|jxB-o#f+LnLAWG`%Pp0V-&zwzjq+Xj@iuSUuhT>8ng*&Ti_{ zo#4~8`1WQTJ=MKq{N+n1h#4bJj<yI2lAvdVIejkEVE9L zst%!8WVbTD3kBs0pDrtIRIM3>3flj0hhugcl-EDrfzo;AePQ zeAt4;{7Hzy)VP*qV;F%B)6ab$MsnY^%@Ew75y zG50=Qdd9D!p`s7Aw3ZIx>X&SgOLYZY%7M=HoM)Egk2#nW(Q=nuX=c|Jq;r=H-B&S$3K4EuHZ4j*vsDE9 z61#jFql4X7X2Q@3oYaf~wXxt(T`o3$c{60J#jZT7am&b_udjA!juBD{E`mIzZ#^taVR2=yPyhmJu z79u~ak15QXq*Z?7ludt(CrQ z^nw6mv+%!U5Aa8<2N9~a%5JEM_jVi@QFqOF7YXyNv3l6b%R!f-b-?!D6{knxht3$* zleR4urp{q(CHF#qBL{eJiR1nHybNR8_r{}cGu|4jC}xehJl0;sr(BU1J8MUSN3V1r z9o0;5(@D9RA-ghvzh@;$i4T=b*?(>2Bg=d_RJ_i1rcfclY}XxOlI6V%C;ToXgZ*$$ zws1)`oaV1_&E8|Kye)vyv)lBs8^>u>?z$5gjE$Cpkw4ReVKH<`)tcK!hTq)oBQWXI ztpUcDGITc{(gK}wq*9QTnlmpcs2#*ymTJ`J+8X75OIAHMrX(Uq(Au)3aLd0}v++4y z0W!#VosOor&7gCXLRpS}Ceh>=ha&w0P@WY@u7$Ojsh|hbTM8 z@9HakiB{86Wk1U>`3Kz!euQPG4X8}5eC1B1p|bQuRRgoV;|^3kQ5MDmmDigLXXM6ZJYNtk&X-sdbrb0 zjkgO`#<0scP5R);04iSM=Fxufx*c6cuu+{V@4cyN33HM{((|I(3M#V=M#|zisHA+}c z1`HSppNvnd-q;Ke89;f6!0N@=wzLD?XVrYU*6LUs_N)Y#cWLhNgs0f1NBpQ0B!o%3 zA_QB`2#t|^3T88j#1yP?0KA*OYiXt&E7NUvadxxw#ARMEuXK9Ksy9DknbaaG(-hz%tXi#82M*ID!*)k3sy7fZtGCTl>AUNmhe2wd}DY zc2shUe$A)EZ)S7}r@F-9!NEb&xf*|biKRzsM1eIQ+iv~e)j}{50Y$Ui ztn{nQN<7+T)q|`%UQ*c8@fUgM(i^^Fq-(4=bRQ9Uz^~s3Jx&hawv?nmZ~Ca1Vp^+- zFbXj4{Fq_-dA+J76V(;NH4UPC?0Som<{0f(OK6eM15Z`!(8B{#BF*XM0-FkhOA{`8 z!-K*(58wUJ7sVAOR3EXOh{wGX4~(6Yo#hV=B+{RTIZ?wb{mG6E{8eFy`}0#F0CLkL zx+aQ5R6q&3P-1QO1^KlJiRT80HFR;li;~xIM=Q=b;U|JW0w%)ss!Faj1c9XRhWGO?vkBb(OTK!8^ z%|mMY&UM<*1!fDiq*P=>*B-gM#H59JhbE8wP8_k11Lt({&NxuK2Gh&*y{`-ecf-bX z*X?i&UKlc>!NUrueP_wv6Phm&w}`ZK zMP?W+yR~70&HR8?78`|@^=2D|*1lQ_-IB}w8E*x54CgRiQRsy=JF}Ibf}hI$8PuKJ z#$h;c?yq6i1h&+jGE9+ZZw3dy0L9DK9y?~=!R>K(G^23QY>~E(PLlZy1n8y#wp&l` z%>PL?6KOk81KOMR7UwJ!JXhwr?6Uu?@zCSZx4BERaKqVt{c)lPV)(qCuC}EJC4=)T z9t&sgMmZ!{Zu2pWA5U`r=G*@nQCd@&^QY}4k9hLujj&rnik#*5n6ckMB|}Pc7tS$% zZ#tg^g_R#_B)_X~vB4T9#v0^BgxCt7ZvG_B_rVI0w)u86m^YS&}Bw446XR4buF=#da86N+s2 zGhU$4<4wRBQFQ6eWBv#2X3ZPr&f+d1(AL>hkvwI`U{zOfnij%j`MY0~6g*s&Oq)LD zn@$5X(i8Y0BT(-Vw_bauh}1%*q(~z?j0I7Lr9s*_K8(Zk6)GWDXoTg_MONw#B zfA3JMB{>C;HLb`zJTdJT?fTVxq%42|SvQ_{p|JLL1^XMFXZ zMewJ%Lu8xIzG)dBL$8bF3K4GU%Roc#V9MZ^Fh>+pHmAakNl6IdhUEJYN2wmomt96^ zRptwD>|5i(7M53)av1~Td@2qy1ZYv=Ef6Z-bpTB9SqnBPTKKpqd#??Oyx;ylzoyNEU6xzOq(YBE zuKC})T({$iz8HpzKwWEmu+!d>Pkxx?-Do16`e5PLUj{Zt-(mi%kJYHsIo5{`;cWfA z|HBvl$+>B1)n`-R!=7wOAx?4D7_?ipZI@y^Y*RL)Eg~Y~-jnDoB7(T%CwLk#lm(JW z&-oH=Y~S2iU_d|>7FajiLzD0Rr(DgcncpJIr7Xt|J5CFs%wJAQd){kxWi<$of`u!VrBokjSqM(b93bWKmSGA-1y zOq*>~bF93Pwv7_GXRp^;JG^q=dUN;|Da!}Ti~}Merc5~+k!5TfIJ0zvpf=S{BvK>~ zdjQTgv#t{HO4ICxFnG`_n~v$(GBi#~cCb!x*JTqc9h5OYp({ zuXr=H=8Q->-U@VzSny2^$stf4(Hg<8^At`Eqie%}zvrX8Pdkl354*Ye<^)upj2feP zp^)LyTHW2{_sq8 z=PXRlA$p!xn%@JFIbTjUYIIUEhBFc_&WT%srDl6i0n~4#sx#PM^5|L9y{V!-M_|$F z`DzCIC z8VC4kttzhHW~rkKU=m{TgJE=qHQ8#Pd6KUpDC;~1Ht6F-@(#o6R)+R!`$a44G$Yhn zO}qRyQYf3tE!k(-+8FBziq>-9Xkhwcm3YN3!@&x^ITu)dAm|3e)NUf~Hv8?qxKS-yW@1rIpnJCry(AUhgY7j(HGb;PK-)^IfBQrB)*z<<)6% znNMQok2X_kypFB6=i9^P=s&{sL6$mVQ@`5lGNmgj@mqyYHdj>0%luSWRDJ;#h9TGqz%zKz);5jn%<+44_(md|MzOTzpy zs@=0?$jNb6Wu2${aELE&PtWc7V4eTi$My8GT(3dc`+U};ZRT2P!J^GQL*iJ09c?Bo zLY)1hhOvs`^$a3O@)tolScG2g$7RIUmjG-%@R@$LS$>bk<67VedTRi29WiIijG9&v zN-vBUqT!0Nc7Qe~>&t*DeSS=>{rPY_`Dq8$EB4`++Jk>`G|EBRZ{HyKg~9!2tJm@5 ze@hU0Lm-k?a(3XJ2oRy7qOt@%D^cfPn!_O}K{&SN8mV~_s*YnXu%aN+-r6mpAf1bq zY&+P=Nxl1d+RaNPX4h1UP(At?fNfzX*#;tyx=Uc|PVa7q5?}DjulHS_I9W0OWR3!L z#>ehAuWj#xJcKE>oNMzTyBI<OgOL%lB**QFbhW8ozG_+{7d^ zA9L#BkbwEtTg;iz6fA1pt~SFrY{p8m>(>85QUQOGr!XolrN(xWV;u-uTTEZm+iF)0P%a5#`s2jh7hFUpv2TQu}bzM ze*4MNZzD*69JoQ;_&jma2)tJ;LyBisB0Ltoec+Np*j8wt%Qu(afcB|UO|GqrB}jPI z*U~s9Dp)BOS+om{$ABVSeFXo7XjruKV0~b4=w5~kTk&UezvwuDT$n>ZX5(!a(Kofb zq9F`lZ1bOw`_Vm0Lh3pKU^*!%EmdH$sh%9s6Y$V&+3-p%y&5e>3Dq^3nPnOigdH`m z)b#9&81-*?5=^NEM&HJH@R0Z%tvTUax(A7oLU$B@-2!0rURj}W(v&Of7cU( z9fUu0YQTLl>;c1>EsY3(6|-v7gxQ$WZb$Q*CI$uuzktZ#n$Do18756;5D#uONOUSDysUQAKFn~KvXmoS$~N@^FM!${Z{H-1G?I_iv@RK*J^k) z17DA^tw$LN%_VzdM;oMU0 z{!M@Wp6)U{DLWvEo7-`p$v&ye<( zw{BtwhgO4>KV0g5hq`w>u1o{#!_x))4g?H{(%cGx*niaq_`)wswxGe~ttH>f9zy6; zW>>I?!RsU92zO>IhZ@d^IMgE5mqX}yIqx<7eLCe`y`dPoSw^7f-JebJv+U1o<|JRA zz`&J<{SK!eI|GmS%+h;HH0D8+M~|%~(``7s#L^E)g5g={(5^#%MP{o~J<`riN+G~4 zE_u~%i;9IS>`!&~>dzXiYwTv@=D)i;2Npj#Xw&{Bo}5SZ9T8$GSLToXym@G33rZX`^PO$*sWF3O_6*hwNfN5WxsIbWYBT5H0d+}Ku`u0a zpwnq~e4MvQX^DKmztBWsiR4nAuycqv#MxIt1(v3LBlCZN7Gj!08hDlT3L~d$+;Esgiig;X`_%>jdAjf3G+C ziOW3Fztj}wr$=2Jd?e9E9rLTTt!)y$rbP$8yupr;HX#(UywU3e`f%Dd0M_}|U-#cU z0I|yR#w7vfpCua61jJ3de2xujGCo{dY0LW0qtZb6O)3fsit?ARzJ^j#&NOyRaidPY zE9Fuw9a~3y-55)Bz*ZL#;dvGvL4M$DzOavVqR1}|n|jSp8@(1|5`+0uf3Rw(`iDGaBE*&$+ekf$`#&fxuEV$_l+p+oVPD~M$%S5OwO`IUYf%$e)@eLm9D8|WX=8>kRq(wH;H2YwEP z9HYTPVS6;+8_0KhC<5OzyokW-nhh5g5fQO6F}_q%QZC2bU2SjYygCJv5?6+^|Vv?v^^1iJiHT*uH=k9Z6TLB-HRe2z?@LR116o z))`T>ABmc=8zG2D*DkPf0<%4}OA^JKO{=y%9gYyI3v>8$yC-M&Z{#lGFZ+&7f??Y@ zFt^1jHJDwd6_RSm$yFC1lR}uUt3J%}x(bt_JoCU@&71*8vL$(_O6$a6p%Tq#WVdI0#^D2ltk~6b@0)u zX@8G#sAH3Xoo|nYg)-cWb@yUTok_mhNT$V>xnGzyBP7zl(wi7ch{jW&)ED!0PKJRQ zy9U^$!HLuWM)Gsj<8nrCc>fHsK&OLFXRv=Q?5Z{|OmkO{T17Am-a=9)c)3ZgV=I~k|8X*tc&As>;CRH>X*aq*pnxnK%Hq2_+e zs|AtQz86~Yd~B8OK-k-A06Jj zHk(o5Rg(f+{S!A?AK|5RO1K;i3K?F)6EZD$s_`HEU@5vvd6!=U6f@9lA@cHqB!ez* znTsGe8{j9$w^pTx*+NA5A98HnLi|aLHa`v%G~x zX$U17M|?Ogi-K_WOu}i4;KIB^H$r`NyRBLxZ8m9A0QKIqQ=N1~ST1ZZomjFi0CVfs z9O2eX6bO$IF~RSY2y>Qth&st-)aX#vqU%@6^w`%TV?0DNFSYB`+|ntj8bG}tBz=zz zO^uU7OdUr|?|;D1jz}3HrVpb5H>Rz&>Om^scD>CPz=R14aIm~HPp;|zQAS?M2!AUA zQIe=nJoF`?Q7Ly>)3<1T33_#Ypb$=tZSTc;yQ?n(9N&p;K`i%GN^DJS5eFZ{SF4WQ z^48(fAsc!RAA_zX2bNl3Qp)}rl7Car0yb_5Z+3E%P5O%7)+4yVR~Nu|i2dUxTqlG-iqhvg{B+UPjvRZLr3Lrkytwol!&zU; zf2W#k3`Sjo9IeDpZ87W?8KFvK*tUV!A|pIQN{Bl&94cs4e&zPmC>m7^|_U7*LC%v%;hQ+G7*LETj*6hpHF79u^XZ?1++XPrpjE1ihLUgL?0ti@IDJ2g&xE{eE6H-rtBcNFxPI zf=Owjo$%bKk5qWuyv=#+s;NHv1-4PU(k!fJNLkjL?Iu)jGher9*EbJ~U-WAPdsW0T zhL+9b9(2}>(Ri(H-|{z;7(=lQkGx1`T#dgwx0!{A7>#qv+?PpN*S%MgU+)v1kjhI^ zhN_&J^Q>gnDcWdJ$!EAp_MbCFVbzSNpybiG4?)?y=ru7> zpdzaLHUkvxvf*33cfL`IQOwq;2e?S&5O9d16xm*$YEK^qO8|tx{H{0Zx)|KJn({L6 zi^>%2Dk&rA)9k%P(*>i?WwPNf6u{hmz~~DG#oFvIYMZ+r%uqlgo>P`2)42($u|&E8 zpig0aS)545wc)Qe#2ZO$W6h(=&hUAE_*Uw5df%LDPn?|s)bFsn}(8*B00&2@x(pRDTUI&)UE*&_HQwbhoGUsQNl4z8mM3BHU^Iyw;c+H z;9Evv7Pt=N$^c(HDd=ki?lr!rIq$;J%D6lMkh`r9G+mZEs()h_2}-SN`Po zI?G9}6)EoXnC_=c{*PcGhYdf{8^FW)&=Lzk6KYJaQE<0V*&h`5 zmZ%|C{)xXyHtZ^pfA0k^`FNS)4g>~JF|fC`g`C)bp5uH&C_L#i!oc{^ZrFg+u>uKW z8e4;(D~F(Wn-78Pz8WlHoV8>{?YSmjFv&n<%8YM_O~N)bjlSP&SbsaD(e~;R3;1pm#QtfErip`jb@RW3OAcJ#%|F3I~mkFfs^!?3EyNY3#io5%B z+x4?=GjM+&A3OhW-wIJ+YTfYI#vIsxbF)I)u~T6nr>95dr{(VMPDkzWCaVNcju2|+C-L{-a z&K8Cwo7?-PsPFRbm?7Ypsi92Wqs#uqsZJV72YfGjuJ{Zp=_h_8%P*Z-*5J;hliUD6KmzI-@(ta#5#HXN&`>h$)Ra$Q?iJ_fwUEUVk}PNM7!Eq{U^conUVR>!5OzAG6z> z(x59qYoymzW1?se9nYA3x;;kfb=xr*1wj08bevzHp~UmmYA*MH-E*r8FxwN5(=12J z02;(_ycN)WqB`>+yJ1-m;C)(A`u66+S)#0JlQLci|w@hrExE&sPTMAMma4 zZ2^pk>FDEg8JO$ildb6NSUa?nskP<@ASC>x$qHR2(40fN-7+HqD9_$rXvG`mp+%bEhnt>aZq zn58PdtKd0LKd)ePiQcvs_NKrsCBBU%J-hC zA#Wj9M?WJGJ{KAvk|5|hOVv^>9B%;05yy3)v`p*?47yK51!qMiuBtZfR&^&qAwxGR z4lPJ0L;4kqqCVB9g0`vGq_61RR1X{;i)T+yI%h5#ZUGLbYMT0RJ`mFsMqZ4p>@WzB z=_t*i&v9)=G9$RlP0(}eMbHIOdOw7esLc%+dk39H zZdq~-z<(mTK}y+m7E)@$^IR(V4ewEXFuxJ9mZHi1cZr9GhsS{)0GC^!Ds8=ohsTmx zFtnSX!4wY<50BcBoFD7q;W4e9ibMXQwJshW9v;gF(dVZ}n|p0NJUl#(O@+l_S~T_* zUQl!8n5tqE*~dx&GS&+ko>BoL9zxruP0*>yZ9hsm4dkXcmWj5G*91(Mh5D$C)NF=e z&pCCw-(#p>^{Kl2<*f?CO7+U>yR7w=5EahRXuei9;Ebxyp+LJR6+Vp-#+{1;p1h!g zPsnA&+HEOEqgI!agcH;pS=>jlL< z81lxa%I>sD1kxsFsQUE@(BgR0d3nzX`a7*emlkPL4&yZX#T1*p2Yp|ikv6I`zLpmt zkE9ZP^a|IDZT6yOxMJumaPD?w-l`mhi(=n_nm|$0OPcOJr>MQ?xgh|Pd#QLz;K5)& zMbb=FxpxI03q{^`9q9COUBwfLifM(PkI)PO$4h`OOg&UPe08+g*XYdl4rU!#HeD0B z-aNT__5H3hS$rMjx)@YXP0>QGn)Db-IiME0dO3wf^+sj6+<71zvPK^fSe9rii_4DP4OZ>5??Dg~E%Xv2DU`(2MV`9P!= z1k>AS<=x7D_p%$xdS|MQB{>=-I?4&}gX%4+B*LSUwc_+t`;@VLPE5|`n31%vRM>_- zH=tA^42+2xrbs>?7!&gx;20BgM{y@6raNF=kr5NKS53c|n5PHFY!LV_($UIWC=(qN z$;W3c>k|_*Pc+mB7}M6Bi0LnZ=VD^ch^Dr+PnqA#FZOa~?A65k`xMD_i=PeR~Ac z&XBl*JFiTCZEm4L13)~s!1655@Mjop?a7#(e|dh=!;ZqC}WirQ9S+vfuu z=le!DQhIkN5YQDmy;KLFeqKJD4J#!NPsm@d0yvzHcvXA-9Cl`M5+h!_ zu+t1ZmwPLUO(@4)252!EsJPqD{*_-03;kKvh98R@D0~p5W#qa({SpAoOJT%Tl%dzn z$;rm8=UtyLCMTPBWRmeJ;NDhU+af#i!f1KxWjXJ}GxGsnOH?&KN^y6NLvpfZ;8J_o zG(lJ>MFU~>26Da=0Olzb(F)~=_lKb6n}dUcgC9)s{s9OM4h~*_os0yaNLLXW!nC<} zOOXHQ$;<|g51Y62Qbe>@q>BcxQDivfHPEIl)&49EjEH;rF#zK)aYp^c714t`aC51+X)uJ#XF3hO}h|I~c z0Pe?TO8b@O$tCBgKAKKpr?2eAey9i4PfNMos=huKS7Rcjl+}n-BXuVaROv*Dt0}2b zPf}0EcaE+RvHGN^r-xM&ef-p%J1^>gP-NEBXfwJzlb)VFZd!W!Or2Pz9q~y|cX3Hi z_tA;breQ;@p6E2iTH_INwaR2Ny*|cP4dgCRv#>(cB33leDw_IKkxncolWAO$$z;^Y z=|DS@Z!)>LnN0aQspTg!&hg056AQQ3cx>E)(q(BiQ01d0qP^(SGLeghow?{dJrW%+ zakeACy?f|5EL0R9ee{&RtZ%CRNhDH&6v?`m1=lQN+OKF*j*`CD}b)92TDq+ zU{Fa(i5ZY5N=iHhG=IE$XZv0`;M(Z6>&k}RRw$eYQgm_J#YGn6rLnHAlXfOU%J)f> zt7~&?4Vt*RE{>5hX0fYllLj_&{-r^#t~2YYnE4*lU0wH|DpWVWsbZ?@^L1SN0d;o^ zikrDkzU8{Q%fXi|fH`=Pruf%fU0oMea;95zFz@U`hHLsHS7%-H_(2)t|Aeb+z2gaH zz>+jeQ{mjRuC7kCEavF}7PvCNi=KV&y2eT1MF`&u)PAF>EdXIYtXoMK!uSd;yWpR^X;F9f;=z=#(L0i5;&bcl=V0I=VQjAk~- z7^tG-5D7T#P!|@efN2t?hQlM+-IY!+SUMaBB5tB-pbZEa4%S2SDvxysxL<@$mkl6! z8cZ2+a}$tQ�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 a+{~dmDRUKCFWrDWw;C{T|89>P93udFu~*&z literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/Bagic-ouput-result-screen.png b/docs/reST/tutorials/assets/Bagic-ouput-result-screen.png deleted file mode 100644 index d8628e112eb7a40c8c77247f961ff2e75cce9ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4819 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 S;K6BF1<=vbdt9n%9rj;B*Vpg> diff --git a/docs/reST/tutorials/assets/Bagic-ouput-result-screen.webp b/docs/reST/tutorials/assets/Bagic-ouput-result-screen.webp new file mode 100644 index 0000000000000000000000000000000000000000..b55ffca4a69c707ca1d96dba4324417c3ff42ee4 GIT binary patch literal 2908 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


    gr`dl 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 diff --git a/docs/reST/tutorials/assets/Basic-ouput-sourcecode.webp b/docs/reST/tutorials/assets/Basic-ouput-sourcecode.webp new file mode 100644 index 0000000000000000000000000000000000000000..5bb415a0aa6ebd1d7c63a8a1ad999b3713bd3be4 GIT binary patch literal 25636 zcmV)aK&rn|Nk&E-WB>qHMM6+kP&iBwWB>p!jzLNQRR@E%jU*-I&w8KPnL7XxF#)We zGtn2o0B-?IQ=R??rvGb6Ouxmf^2;Q5Ws4Vk@wTP(M*W5y9Ir@fR3Nv<;Wl))$4EHd`yGI4r( z_#oct|JTcP^SApS;4m|YnVFUu&Z5pT<2lQqTl~J~cXn5h-2P4~Hg#cUW->FgyD&4G zHwwqRqfQ&%>Q0!sa~Y;8>NK-e#?{r#hB@gNJ7#8PW(JLE!%XH4lkq5QhA=a8o66X! z3Zp9b;iO|`=0v4)yRbRTrZ6*WuG!w|?u?l?Eb~@(vI;X*cU0ba1v@5HVXl}fW=>4i z&V-qn!OXARI;g&8~MPBXM903g^#j$P}ec4O6EY@BV| z_chxrlQO7n+qP|+)CB-k(rP}~eXFnI*X{09x9M8kW-SB(u^U_3ma^kufZG2F;Cuc5 zd&QESKS6(jvg^I~-h1!;y{E7D?p%MnTRo<)dYrE7zTV$E=6cgt0N{F&~)44R(U4vc1Y`R0qzeK(=GC2ahe)>NFW9oP`tm80xCLj{B^s!QD`}QVKV<;L<5*h%1A^|@^EDCwriZxk8 z^0+v)99^4jq@IX)aU;h`K_S@YIjY)HLgFI4t<~hQ^JJ}XOq(b?MYGYepVq5j+0N>* z1hwbr#-^I{35jUXCdgzAfu^GXv!S&Q6KFa#V9;U6`GiL^C0C58RW)o035HuUQrU=B z3q{Q!-pKH?7&y5!4C$1sV;gU4rMv{MAVy3mm1xjf^pf0%$LEvqc<{134Zurr1Kf+M z&%`tE0^nEmsez~C$Y~eXncjJAXgIgWbmy9bYDSCtaVXPKP<7C&#G3g-6?{o4J zybLeRU8w#@OvF7Bd?-E~%WCzxkAr;A#>b!n?g<}-XM`8y1Jj%ToJf2&RORdyhT*EE z>In`XD>WQ3pCz@gM7H&#u-3*w83#AP5>LU~bmr!&@G-%hEeMp17T|;MLRddIT9+R6 z`vtf&aXc!qv2PvEkIaNiIVV2??}^yh_s0_;AJ2#C!}8d`^Kg=gCj$NT#C{6Qs-_pw zU%lx{*AgOb*e>{54jP1}e%}hmz;Z7wNj@aN2c&|tGhZJ4d?vOhKQ(WG@X)6Pj%N#G zEM@{4`Se;e19t=6qw{I_=&Txg;nS19CuMn!O69ZcW_0XIS9gV_6BdVGHzEpkBVua} zN6f15aTdC*5lc&rXhj#NPJr2{VMua7>0R1*GpOK;ilTtP3dfj|tEI!}?M3>x#WP{J z4*^V?NEh>@}~ z^aR1rVpu`!FC)iny*P-3teX3gf*9bYQE+mLHz(?SpF9G#JE8~LpAPugJU=kp&w%Yi z;PR=M34CToc@&7WnW};L_k$SEPONPd2t28Sz%|?5Frd83N`92cY#Bg}g&IsDB;=Zs z%S!tm$y!l|?43|O6@cYq;+u2?hmAQThv04@ZDU_k>TjS@2!_CAw%I`2pW;ABb%)h z`sv0&q`imGrszEBVDBHJVzrm1zp&D`d8#PzTD!Qjm9w4`$xrpgif&VqQK8*hh$4Z? zOZ>Dkm#)XbR1R=};GEjGsVqQOs$KaFR!&Y6dMc3HIOrW!4pSu0+bHd&*L8L5?iE~C z?av`z?dOigO7@7g==YwaaJNOHr#;N=1 z0iWk4GqW2?x?L2qcXw-nx5}5#U1`dFUOo&ucv2pPhVjsVw}JLxQ|R~;A^k5=@x`Gb3Gt!D zkBv?~^{&v+N5iZOnF}osw0{cjOlW(FknU`8Xp^TLb5q)junV6!>qJJsY6mxBiKlk+ z?c2`v!*V-#_Vg(5>S!7yyO4&^Ra!EZoMMg_aH-14d!^7QQ5Z!Teh~v<04}P?4l7 zAA}Evhp!s-`=p{uf-TLbm7kVM3hR8J=gE-o6Hp0P?oRChEPWO-ufa%|P|3*(bXk&E z&P)UfW-~bloYuT?G5eqOIg8_rQU#xJL4mSY$&i_^HIPtiXRnO0#y*h*}wrW9BAR2KSA)ZQW^!PhquDftdNZ=?Yn}8c2Jwh ztz%o2(FT;h5K@gz^%k)dvi|~GZe4Fv{VxsjMHInc#Ao1fK-QzhcKS9UaytsEkyBD$ zg79eyci~B@^02BrJkD5$WB0a}t8)kyT!V$rgHf%0Xu+?%VDSPNMjr(?RJ!PqD7;G# zrEv6yJ3Z1?zE1<1`{jNVj-p{mYIsXLCF>CYX+1m&XXC@|2=i5Y?Et-l$_>`RBlaK&$u3*`n$cQ|G<|WMRaOJ4oUPE5<5@9m|6l};!wfHo7qQu5B4tk z3y%E~1V`QzW|HF}c}pv(15`P;^?pQ}(YzBZCbl2rgX4Mw=<=2zEm)>=4T1*X+=b<@ z0627^p$DFjTLIIHLPEKQk}x^ucIZ$}>c^N`I^ZX{w6d}XFB^#`nejb8+DF5&d)SFs z;%Q4fC8#7sULaPOKtH6>LgS5gfRjt>sQ~Of`0^68oD{bp)KIwd zcAgvy#fVneqTu|yXJ6r*1}IIy`UwF(1V+n8rEsnOa6ZRssWaCU7FGi;5i!X+qknph z3Swk)VDG`(dvJm$`o@1z1uzQ&*=<36Fz(0=n|}1e8%_dc0i>r(hykuY0n*dSBCAMn zaL(AP#+VxQWPsEi6%ch$!rW^`t3#5|A@yniB%O?;1L*AqSnUPS^nx990M=eRa%L4l z7U}6^RTLp7_X)889pDpUfEyq^UBJ)fq(}`#LWKy%Q(G>u?{yFd2mJsNXx%DH0PHtV zhHU2GDQx*!UQR|Zf*mW{?yIlgi-7bmQ?J{<|T?cBr zT`i`w%joQOJ4klBo#&!>)d3>-(+Psj(?S)+GG{dFX#ZmY$`w;mE(PxtlgV^O`K~dU zOw%H6CevpEl6II(lSG|1nXZa>ESlytRK7<{raDf%8%(BBCC`AnTm|={s&aK^qmo+L zPRnN2aK%8pi%?*OjCb|A>Fq0l@&?k}qchh4CZ>?n?Ko@?;ySbdQwfOs)Ro}ZPS-Vn z&%gk(_JBBfmQDGM>daDUjf!hQiDttU0s)>v=w#+x)=m0$;C%vo430b}?lL}$@~k{D z;Mqj1TBbBjj?P8kHbUHF(nkeYZq$jml%bX8n-a{ryC%Ou)szVl3aT&mF^Sh$U@f4r zDc*G8i2!Ll(k_QwOm5KPQ zLS+cIx)nVYP`FU!FQWB;gp*{I7Zqu^cs)f$^8o7&BAQ%1N;IjtKo<`*o(PY+GsGBC za3+a2)qKR8q>LJ*qeWm*0nE8Ta=C>6-4U|x%FD~kyEh^qoCIVok3l!#?}EHM?_|w) zl9w0nA_P{qR=6!EFZGx%X)bSNyIKGUj&Ei(HZSk4Xx-iyd3gaPfK7~xTvDUw22U;C z>_%m3$P#ZLva;B7X#6}BMZo-&*zWg6*YTt886iar=VbRfaX$2%P@=h7s_YY zwi0z|-|rkE~^t6*&>0LCqPL$VA31|OjaZv z_;(?DObP8fx1~YrUQk1cw?<}g4940sPeAS#xVjh7it42Eq?lIeJ<5AT5WYfsG#v{n zuTpjkiAP8}x6?ETZh2ra$!vNQCe_-j$Lj;8MHEz*XTx_AQ(s@NF^}%5Ul~*{MAX+5 zNrcZqXjFZD{WJ{$^_xE#_N9ROt9M5UYgSG@Fs8nK8x=#&^(*s6uaNrkGptT2#d^VE z#!!Os&xgwZz24v!G2(w193Q(F5bIS;RdH>w<@$ka~_+CkMgHIP5hg;%elc-!16t<`y9u9hKBNEstZI@smrOI!ynh10B5t zhMtxc1Lse-v}`eq+}hI8Vi8fc7dnaQHn(hr)jkh->PvHIO4kD9c{CSI#JJ=;OmvtY zZB2IC@{s!CP+D4rwCtXimZlRj1nji5pAwmgOlw?*ZCUczMI-BZfJM8%sy~g0iMtaH z6LSpaPXi{y-VlJTp~$)O5r9K`bOHryu#|5_%197Pp8tTMB<;inPw;7X+TjY3?!y_S z=W!`bN`|te(#@$th7nn8cE{Vk2fx)|CM|i#vz9(#a`S%abdkaZF9@9RrGXG5VqP`rHI znGhjy!2nJH0TbX85YV0NFa!az4Q!u8EEf&(SU`64;|-405`XWy6nvm3=6=VuI_ zEvk^w2op}w*D?aA;Ktn^rJg?Ny(BLDowXwnL1QdDgDKg$NX0n>c$_wn% zRJ^e^8$%<@D;_GA7en0&f?SsUup*Z8LE78cautk<%m+ zten$--EAjjVMIkoIBYu1#R0%8rliE}&RjcMQj)D=aRR+cNYSJOz+?xjO2pn?tik@2 zz=(TqHkFtO4PvW`KRk0=0X9kV;6dlOvlsR8pg&dMG~3Mo^U1q?~x* zF`>p3AmMNja9`vz?>>9>?ActAwMi3vh3GBoR`M(q-9j)51Fif(2(P3o}YV zan21Qy4krKV0vomDS_~*smBGj&!f+B7;29LFTlxtdf?h+2q~PJn)1V*Hx*z&IzE+e z1?~F);M!C=sC%lB<7>LC<^ipIFlP@Z1cl^m+mV7}ziB#(y`<~`gh z3jj+XDAV6Dm7Z{J5?OP=n3!{_AF^09;@6dpiHl&BiM3U2ZqDC*jO5thr7tD$WCsaRnL=f>y2xL%H?BT(B29l5ao0ze_a@x3Bj z#nv(yZ0zgG(y4Qvk1M~y%0)|`6P$~|xst^|uPfjePs0w={nxTTHkjB@{`Z+orbPwz zUWF}ZMC>M+qme=@C&crFCgQ2|_ee6;D1o_VnWMqre++V(;o=oQax>Kf z$#pu=v?#^Masdg-QULd5@8lt}Xc->S>0sm9qhJ7Opl@vk(CLs<(y@+p62RFI%qwNc znH1ZWA^>u$2vr%48X)bI8QD{(blgbikdWvFjgL7N-zx*=OFgn8_NRtF_Y zI9i#-9*CmWhgM0afPZhfK%2lJ`cbqqjjlR={e zD(oUl$wuH*as|wXj3+C_e3D0i`D71aT01$4>DI#^9hJ_SC*fxw`! znKr5gG5%dW{}U@?Zzzm6|*wGUgqI>M$~g+N!N*!D8K)rCVT(s+%$k@(@Y-O_Ct!)u=d5pCn} zz5yEBfZF$th}h?F8?WzTveli zA2>cdycymLVZ&>?amqlvYs0IL?K5sxw>qOJbIWpUV%EuLmRcz9%e9!kt^1M z)!^Nh^=wQ$k6p%1#A^Qz^v7wXalF@#pl9RjPwmpKF4(`Pq`|MdXq|L=!B&YUM$f)z zI7Hx^UJ0Y;Uw`p}?X%pemu!=IaltPgJjMeajfwk${MB9X)O!O7? z<=@r$_h0kG6PFSMnYEk6te+W%Vf^){3Qqz00gCJp+feFAfj!$S8Bpz&co;4|0!M-% z&UI@TJ2)KB1HBnSy`@T&57t1$69YXi&^2)#OAt^kl)e)Z4+oY)a+5(|+8vxm%Zg$C zB+OMF;xTi>G7I)~7<9(%-{p*Q*0C=^e-Kq#eC+h1$DhU}ERtFJF zvhk}QqU&$*;N1s&fOltpUeCyq4-4+qLS@fKZ<%;9S@39x_XAsvFGSfcGpLL#Zzp9+M4twbA7Cu_=OQ=1vgp>wEjj z>{jjo8&V&Xx75IG~JJ%HeVZ_-<2B*_YQ!yimKvCtE+wH%e5T`a1Xua zD|*HUX;~TU;aWw^7IHJ7(B#c8;1Cxh`Yz+xgSpJ5@$HwPQ%xK7tXgPdB}Y{wzjx2F&|%yeW=S0*E1 zpmx`w(=gdzMA&~pP-yb{r!3QG%VMUVy`TY>i6=?Z*ezo1!zs;I#oBcCgm)((7Y|Rv zspAl|M#9jdA1oiZ19L-dt#J0_4P52`^)+)69-D!11FIi~RaReJ1Fl7I)B~=^X-6Ei z?}Y3}0K5)C-f=j(Wf0Ky!*mFA7N5$8+&xgcSb6;vh}w5&-HY#%!X5BR2m~{nGCCH0(}AU7cyc^pu$)TY#ZcG! zt0b`@vSD#?{PO{v^nhn$Z887Vt#C92CdL;#c5*swv9t(q83Oh!E=J@ixi5=J10fYHMTR6ZWf055|QkUTsv9+{bomXWLg1s-O=$3qFA z@i5p2W@ct)vg!4h2lO7FA9`&i9uvrV%mZpAfQJWQ1ho?I?9mH-iB|(&V~FUhT`uyy_bOul6(jc!?1nW|_+s(}_@>xOdQ##gprdG%iKUX9`b`?kc z2A}tO@`5*OKzrXv0AL?M@s@pHG|DKdR2m)EjaV&-iA!pSbEIlXO!}-i15#TnkoJWU zk$^y*L#V+Js0VoAc9Bojg0eR?Ho8 z)$FI`mFdMa?HA;ZNsFpDr9m;5x$7qx>8fB~))u1%WV>a4-^$1Hwt&CAA^W@~n7>$Zq zjWS9jV7_qFs1vj63|7z?4KhY$O*R;Y`1dnTB#tpE8x?@X8ZoVE}zilBceQi%~e&IR|a^W%A2eP+DxjeY65pe zsgBd>t4cKzzNl(SqjHO{YSb>Y`?1)xX_LQD`?$*FPiQdEq`9V24R7Z0xeiqo-7Q;Y zRPhx{Q>qoKNOYg7>GxB@aTn+fP$ezVSF9?G6WgycxzXAHq=pM^wW(UooNrO(C~;W4 zZ3Ar0+jM+EyDAyStPti?3tuPduEl4}_eQ|Za^s7|!QbiCa- z>bj`e>I#QqNO;Et!YOZX>an<+Nf>8)9hfSFB1cC@M>h(of}o~*IsoEou2sR&9?ve= zSUOLO|UQY=tDbRBeYih~;mobd{2`$t@)}hWO$c)kp9La~a(NlBK zxdLugh-x30urg-p2+gE-Uqa~9g8iZAH{SpZxlo@db7?bB^{$8+?Xh6#TU`u1;RV0Zxt>zqem~QZ3ZydfR1Q^X|YCReA%#7jrmc^!cJP}U` zKxfXLO@Nl>4B*IX_oVi`ddb_NCpGl7*}e@5dxhjbIRP6ciT9&sEbjzNm+N{{Q^Uei zvM{l|{asR?n)l6{ zfZq?cb%_~UDBszfF$IJnX2CD~i*}fo8sLf`xH40^Tz-S^Tyq<$$Hr2yGxg{s1dZEdGvrO@p!D^RiAMoIJB-9>R`9dBCA$@U;N+^~3f_*c$5Ne6{QCQ}Y5eoo6Bm&`V;I zSzS}7Pb3*&OF`K_*moW-h5($%K{WPr%EDy2Yi@fHew}94P_^FG&J}24$i5&LL=(N zM>lgjd-m>4jqol57Mqctl=z79w}t_F{2|UeVs5YW(6xy2O*-)J0exsh#FkJq(Jg8~ z-vWlLo`|^;-LcdN?b4P}p)C{U)8LHSAv(s|o)mD}of8Zm-3bk-OV!h?;$+=!nNE5O#qQvfB6 zjRiRBSqX(b8>d;9=FN?dK}2Xa>vSWsS8&)A7F~Y9{wv`VHA{ zqPk7%e*=@vqCjs21iq5VWHKF6KwWSXpsqC4Dpa5oJNqz`$z*C)Kocl%`4I5$yutVS z{AYc>4dAE!cO2rmPHX@0OTAv6buZ6zoK*j#R}}gZKbg!+zFq%mhkDun->(aN^G~yr zz1Mc;X?AnZx?gw|u@`$hynOh}{JLLO=IyU-?k-?BzhnpDzpcI?FwE4WWOdv$u7TMa zc{JW}{NNA#Alqqf?uLM5|9qJ2b`(5U4^F;zyWOr+ph9&MU{Tq13Yk{LLN?j$cDtm& zwYwt|y>AtG>h;9S{(fHXAXg7;-XzML6srpw<72iab77WLSPL3ouTVk1bqFNC3FtI1&NTPS=^5*wB*>{E-+n)iuU$GLa`*R@& zGayPMa$|h4E;QiWOe}*3^HV6i@R&e&9}Z~ry$R?|Lh%-**uXU$&@D@5!v%mp`c?jt z@19Koy>gS{#J}Jfr-iM?VXMCM>#K;+NxJ)X7n5qX(*ib?1}s@q|3jBpC~ffvn#4Nw z;vj(H6JfM`c|KXdtqHdSrZm_#AZBux^dGEu5Yv8mPzc!B8H}tMcW2ddeK^osB2;Em zRZFMd2EOc$NN;OO5 z31D(5x<$38m6AnOmo#x#qGCGSHCAs`s#2uqw%1bC!hou@nY5Jvm8(%2e&ein71`eC z>FL=_f1zp=`)1nns!FVH|g8p|U?Ccs3?JW?hGc zZeH^;ia%0hx<+;>L&qDpx7cc{^X))ImfJqlwXTox?Vu&y)0r6 zv|qe@mtt5?iH*i_`Nx!l?hY=0U@y8Fy!>AKk3T*ppszxIV7Ai|rT${g-+o)Db1@8q zYyR6D)`kwp-tJb75 zx(S=rE^={ve0)4l$Ti7oZJli>mgsfgnp$EV_yIm2;}(hr3jWIIq=MZ&yPggFY79bJ z50%wU)kSN8_ekJd;#slYophAfk)RbBeJ_lUk00usvse$GqtMlAv0-0mwd&vwsO4yS z=ao&`)!@OF>dRTY-}&l_2VcKuQ}WGq*<(C?TD|}OpStdk+-ky@#~lu}(K-J}S%G^t z#5bkW?Z~gY2>K-hgIr1jU39}-?w@gW&&axmjQmRbr(5^7btimYJpBpl3e_v>i|A5m z@$kL178-1wetqM!6_GKExP6cY8U2fM(CelZHrLHaqRr!BPQdC)9Dqp-Uv{ss_#+9* zYht1g%&qD&24gM3vmKQ(ESiCf2uz;5aG~n}TnIf3JQf?k>3RSHRe;Su9pIn1IhK&nN;@qG25$a05Hw=9&lxV;6mtiXLb$iy?l zTxo+YotV8<%K1P$o%0p{=&L}rAm)MIG|CJx+6RDYuG`|#ht6HR+H=kBy}AC`1J|#g z#us?DW`;Jq`+D;%e+IykpW>oJXFHwFKm(gf1DH!Tz)P!_6_Q+^Wasf&e;(Nba(H)Y zGT!6z7z5Rm$$p9+DX{_R8}V!>_GQ@Ex;ll>g_iyMH~4}2R;|c$@nMlkYXJ%kwOxwE z6c!d1Hi_(p>Qpj^SEqDEt`MwJ$IR@{dicniOw)T||Ni}lkS|sPHOuoI4iF@B?J6{v z5|$}fM}-^*1;ia_Gnj!6ZtkKF@fqQ*?z@afFM)H}%g&gS>txYb7f zUs)eJ=NGnA*#QQ8N=Ic~^#7aPd6h3((eW{q|!z-&6Cxwdz zP)Q9dgQStdqGm-7ZvwkN#&Wm2kOqg($zcOba>UBVvmzJo4opmmT?~;qk)zODa$t;}R~oZ3gTHwf4fo?( zf)sA5a7S7UIcs>R4#1}@{~Lh&+59Yk+w=REJP|f@2 zY`a>!Iq_wIJ@*1AIRG52sXaGiEr^A#V=#9t8%XemtBEq2$KXP3XflgS7*9j@Tx~B{ zPZo$7zxW2k?SoAn^0s}ti~WY=gfEB=Io?TjDHu6_7VzfE${-KxT;%5~nVENc4h}gF z^j|6Y*I%DxMo#w=@$M-(72J?rYF;X=@nlxOO`Ad zf`({iO<2<2tAqRk;F#{~oPimrmSkB?Y7uk&z~^AsS>rq7P;Ko-3Ck9vn17+4;g#S@ za&N6_Do}Nq6*w4-oyNd8vggn2nFY{R1KO@V{Y3i#nNDzaPsNMjA_IH()PhGaxah%S zkBfsuOzzp^gZ0eeV=&U5IZ<^_V06z|$<8B$@uqIfwP{>yXemx7UNVI zJTKN=2!-p0<%iGrBs!N0{C)uaTXzATqC}47fEZlZQ-pMG&z?Q?x)-N)H{#FUbjL}2 zBfmF1d&~d!2`2n;+&F}r?p0;Db{X&-04P8ow3C?BO_1&wcQaUW-KOU+yzC;=|$jHdZR6u85 zXK^PKnj3@T>c_vnaO}>^t1SyWPe6ZF(^*HX4J3g>^u)CJ{OlM0SNiF+D0HujiV{yY z?hSFE-*Ex|%sF4Q76yz$WkLATF7295CdG~F9F--kS)RsFO(f#iz!*(|0EpbjJV|ya zeeT%9a&zqpq#ttx^SKLKa-$UqJp#4Gxw*NyS_Q_2)>+UVMUvxzX_&nH&M%%<#FD&K z;H$Q+>6O+kaV~~^I!JA{x|pBHW6^PY3oZ0tDVoYGfJILOH~<#dMGG}d3qj8(F^NB! zN{YMH?x=VyHpnxi)sxjcu*&#WeDEjYyq%i!m8$oxIuKO&qHubmBY+!NLE(UB0^E+{ zfaiPG*|rb`%mHIS{unqH`4x$b4+L%U} zMLD^^x?=YMFqkgGX#v(g^r?~Z?|>tdk}AXk!HRCR(|dOQNC+k_*_A!(Y*? zfpd^u4xF#68{tGUP+8&pHd+4&5SiE8+iS%hP7kG z-5?F!)XU1XcVJyP>P5*)efjrYq4)zFbG(o2*IU+*@k)<;`sPZTrX;n(QBMW9VS7$4 z&6=!mbxu?T2lspX;A5qFTdVBV*VJG~LeMj9G(mT#ZWLX4T@XllbsJQQEYw9@Y{oyb zuFiw4b;I*;zOHTr79NwjyP*Tp2gGLeL+7I;5v+Qb|Zyf402-&Zvu&}W3g3#M#!||(~!#UM(YFH@la({4* zQ(9^;iQDZSN$HssJ*cp-Fe@#myR+&VbEi8ylcd#S9i4iy1H+x2b~oq#ds8z%|GI6R zc~{CJI+xx9qy4V^{SloUc{A+nERpZ9>i+w0ZfkmsysZ%WDHkniLc#rGyhzW$t=iZ+9WWu-&)MS?(WX$3fJuZm`dyAvz^D@7CQNY z_IJ9xY5a)a(b=h7p6U0?nee;ZpIPI?D{klvx(oz4iq@reE z6lgyJZdU=a+d+Lhp*H|KB%YR3%D161>{pL zh&CDrFurc4QReU5zwc~*|82sVA#WC`pvZKMPgHW$qqnzJU;4J^`i6`P5I9616MK40 zNF~E<8*=8Gd`$w=mjP^jzhP8+51~DR$$`80F0@giRAMS_UHgq zcKJ>N?Vj}P1g177CkI?iT}V!z$wLJP+ZE_dpsi9^m$CNMMm*bzRbR~F4j>ftnoUjP zZovCQ0v?MEV(J=iZ*T8NArt#Apd!`f^RWdXZ(CE7_Yv?}4-h{FZkuHW13+mbv>Qwk zE^~7A1NXn4rl#T&pAM)x8!!zQ&vo6_)Z{%#L$P8v4g?HR10Up#JG`-TF^oL3Xp0VR zE_jR=#T{rCDtk9OE!6&Bos0azqa2Lrlz+#bDl%O%KB6y_#5l$vS9&uR?zLK+GU2vBt}e{9vd4QD^Q@MZoEvyy&udY^bTdk z0OLo*vgbg3yV#&&2Y`|S{3OT*U>t2Dw7rS^oCQWiSl2V^j9ZG z>GRN#&+V(sCIteP129s4KJ#*s_2}cnlM|umVr!;BNWojFdQ3PC+f&WJaxsiWWOk-5 zRg`x!S#M@&TR(ffWCBC8Go335@P}I^Jo7V+K;kq|dJ5Q^m3aem3C)GjRq2I3XtAJmBwWG3%*ay{$>fM%gEkpJ2O6!(57sEasBz(ZkfAgE> zH4PDW=GmBFoouM1dRe);KTt19?E65G@r!RTeTOXf7yRbQ?FaA%3zD;`UmgoW^%Q{b zQQEfw4?D5B9~o#mz2{x{CBh60_2_r;=;mm zN$~@MN>Hc9)7dS9xjif$Hafwigmf(|8HmgTD(3BJ1tW${#(7Q zK-AjcR0M@@4(QrHPUk%WOkVw%h79Q=F({9>wX#;=;X}|901rF4Dlb|mGUDJS_*nJv zHy_NTIwu^AnF1xZ%dxrupbiMT0FrB1eWDI&twC&8HZMR_G*_MrfbOt;B@h=DmJ5>- zXAbfC*f$|Z-XnS>(Q>%_hA52D0SL^O_pqZNEF)ZNO5{d4b6_hs{o2cELT$<)(95_l zT}pY9e$rD82Yp^blw#&aQ-=@huCPOI26;N>;r z<+bWC%gP%=ftS~emzT#)%BNn>LU@T6Sgo8Wkf{aHgfY%EMewvVIoX>eff&==cc)RX zap55wH!2ml;wGb+I(TDv0XA-Yhg{j1ra*F*gQe=$&9)+$-ck+V*JO|*e)iKai%kGT zA>GPp0VFHV%BO?W0DUP62TjV%uC3h|fLIj152+4jV%?5jlL;C?*4!6-5dhiM!w#QZiiuxEPtA0<>8n;S`hs&q4H9tSO`doX^b_z?e%& zjKmWYQV9%(Ogc<(^5{}Xu*V4CmjEUSI2_VIuM1#F&dq=IkTYUiLxRp%a3o{{n72Qu zYonM?a!km1j3FT&pdJVbhOO&AC?OimzDj|DlVZltncHg8da)U(p-6d602+~7ffTU$ zZg;;{yz;n!v2;RUHSfZoVKprqHLJoePBYMBqsoTAf{yuo=L7o6)XZKXOTD*Pe_MlE1OY zJjFgIUk#o65EvXb*e&k^Xml&@ha)S9uLt(^$4=M{QL_+>oL3rws(Q0MJ8Ji4(7Qp* zHo$BXN^6nB%(F3+v&85d@oXp79y3XcMkwfyiH)^&f&DfmuxSG@^!vpoeKAleLHG74 zj4fQhYM6^He2a7n4aUU8#8is3t@=`TDm#b1T%owPOkr$nJD}MJlV=yO;UTfHrgLYnBIvvzvqMO4l4H{GnvG#8NvsL^1EUCSxB#R_ZyPc5`{1xSP0o-VrrLEERh-#i|%fL-YjU6+80 z$}C_)MCytZ*yAQvP@j2zrIQyrbYR$n$oVUs(Q0(%lp?I+L7tQWxQWx&s73*wm=1ro>5tk`@kn*qPW z%YW+g`|wwM_!6b2bamvkb(OXx90rzt*xsH3~rUN`(`?}^fQh@+PoK> z+FNU4)II^N5m{!s=UR^%*Vm0zhiIiR{EI>ut zNV|866&Ae4S79PLrCQ=t$`QaL<)9oDDcyiEB}EMrxhZ2Xy?&rtf~O+I0_udNlp_uk zaRTTE+LI$nz9Buux9wb{vYM@uo!;;f+hVy_2F z5AdT>Z3*?y*VdC?b2&a6bV<a5h7@`_yV1S*Qdw?6#6Q!@{@@v(`7cf-D#&AKDw zHSxP8zww&ly^>H`YE9}@v$Ccpv{lVJV!XyXl4I|fEi-CeOh8S00?OY$wPsSt?A_Pb z*H%Vs0d=3}`8lOLpKQQpm>gXC$)@n2i99N{s1g6FCFXUXP;3PTN%f zwwzyT$95(OPTUQhKzbGU4dc;19gqnZj{#*X><*DQZ2^0W1WD2R4dCu46y*nQei2*Y zLKT0m63=)j?}XirFtP>B!*z&C1s)zA9=#%c&w)%@|CnnD1bLq#Y8sfbD3II}1o{@k zc=9Qk-IpP)MGiC1#!!({Wrae!wTb%I7wvgxh&6Y)5$1uw!fV@Xw-rOlbrb-bHULAf zX`6bGM63aHudlMHUT>aOo9e&p6j~es_~<;qW_!RfY*3vF@ni6Wd@-AC{Tiz+i0jUe zjg5^piUU{_0dDF$`BwVyj$IO9?RXSC+cJO;j%46EHLg3-w~9 z7^L~?-z(|(B@1QS(IcVu%Vdm<#ba7!rXyG;7W^aNN(}yut22)a#KgeJNi7`O#dRpb z?tX@}@`|QYnBO&JFyRD8&%);E!^dF1KkFfT4x-M(!BmOmDpqZBD5^Z^1MxdCk7s(H zlF?-p;B^+X=fw`~0nlb9``Lo5lN-n!hKjxtu?iX`ZYe^S_r=~7SUnID20%!IfC9fp zhRqx)21v^XcAH|4tIP82(CSG+RIE>PJJ4{HIxR4tAG_rgnz`7;!y$0i8Kgb2w%t%4 ztGWpLU~CsG`JS|st%|*@MdR*ZY;p!|O>D~;YwKfUW6PM>7kddPSuZyGE{Khdbq0vY zgmba+y-?eV_$Ft{N&uV^fLS)Pwz}0EChb`LlR!dBX8onE8SsKKlOxUfMCrADJs%18hj zHS8Qx%Q5o?QZU9yz5rQ zFx-ukCmCl}$_h^rOY9gh3cn}nT{j{j8E4&ym^QHh{bkEbke&S;8h;r%c7n-Qcqf-f zR#F2(17`y!8#TKr>lHe6BjTR6iYN-as>UTGr8lJwMMYJ4XgFd~MA90R@VrKX5*UnSe!P9JX#$N)ij-93fS%?BJD+y6e55Md0 z-rcDoz1TFMup94qwW%lyWWgd=2vp~|-}e~O%fD(wEA9NJ&}k@g7e1>BnD1c3 zOf*QZD1tw)7Bf_f8F6%NG!4jj*(h*+w=8c;6~yQt{gH!Pd%v~$fJ_ae+}v)xb*FHz z|Ir^Q?R(<{%@;fKw5cKp9lfc!n^}eu3 zg}aa>M zlYsZ1f}pJI9!l4IaV8YHL1_G%WmFa*p{P0V&Y6H4R$R6*mATWg{&W-xSsulWw44`lq ztZ>5mkr`k%$^?330eD+0miYSSUNGKBr^nejxirx-EZxs2U8|{hfJ;n3mmq-_LDN>% zC7^m?l7|(ivGPIQJs!R=IfzUg5q@p4s#j*4qSp}503fv~JUJs1aDMhrWMK)gm42AMA z^SH?KGk+q+2{Ezk)Hx-#?fPQo0wMQ906Y^_jwLJsK$;gY34CDmAbkox6NpMS5xo^a zzWZ`L8nMO`&Fvx+>B^qp=@NB!osvSktz^&=FL}SaTT<6^vH%>}d-=&30qiwNLv|S5 zkaW_>CnqV&3JXbnfvjGQNIGf|I+66|I2{0(w=1Mx4`{Yy)p?9g%_OB70RJ%v^nINlV{U@jR3l^!{S^!e>vqkku#l-dF(T?TVRzk^{s$EiFD|qt8>3 zV}#=ip!RsU&nlPdE1E-{WL(5XXNevuq92gm0L>a>OTH_6FyVYC>ntN-0JEXVg}^B_ zr4_(~{by4i*16-*tiNh^?-m$M6oQi@$fy*%4xnORf&12!nhe1A`GKrTz^(#pm9zeR zkAnjDd>J;bDq@bA!R%J*dC3H!GT(`~ibUY4>03iEDFOIbhVt_EXit~t<;?_IlA!*W zSVpcx#o7Vqard>B3Kh^%AY!lqh4FcLtrMV|J1Am)NwavFEeXb>Oc%8=ls5NqTQnB~ zF)QBc{#c;;tmDMGgQ{tI#|G{b6>Iv8MJeYL^al z^h(v`lqHL5^T9OUbaz#=F{E9jE4LDoNN=GZ%Hu)R)uB!s4p+xy*|GTmZpW*)x$3*U zs?YY!C)i-%9GtlyCZf8n+y}g; z5#K5+w*tP^?*_sD^l#+mUG72LIN#ZO137BoYHI2k*pM0nTrmP1N^J#}Q(f&CufTLC z%wLgtLV9KFkpgbWMw$UGY`23O$z`|!8})D`6JR7Y5*kuhj7Zr%I=QTd1n@cAg#M!6 z`(~bSU}2Aeo6htl*0rI_fSlHtn8@6mb__SM$JX6V@74L6Ei>NUPL3qoNyxrU;F?_L zHmDW2>Kz~Ny}>c97JJ8gd%HMH=XnQma<7o5$pkxY)d}dg37oIcE@K{Z$wum&vUS_o z*h;43s5vX7JT35038>sF6PTev!KJZ$*Rg&@^7ZS&>^b(D8^H9WwUV*cZitlr2gzN6XFl6Y9p6&;SW8)SEys?ct)HuA7nNkB#TbwX|g*H|0)* zt3k)%m2-f<|B9=UD=V9U?3G3}#@TZ#K_a_0tgM`orwu52*blH0h+3rsWn2A;>2HME5| z9|F(nm6Z`XS5_*(V`Zfop#GTHkY1AKm{WY^1(3u8rd?YujYjP%dP}6VEazSIwn9~9 zTAwN1$moXU(E&RTZCb9jAL^>!+iKmqtNLtSZ^i2dEe{59L zs7*lc>s}mAKNeA!0NHawDXrCqF86w-u9CH&JNTMcrWM%x+jqAt=UffYBF$_QFgqt! z*B`SdI@6mvZQc8TVswt&zT{+4D_D8z9u-XFXx`rlffWLvHK;V7ik>H~$Q!OPV)NNcXg$v2^v;mc_-=Gl5A^e@tXIRHrJkVNzzjj4$rNol)u* z!)&7@^w6or#ZnL07!MG;s?b$T%sei=rQ8`8p}@Ds;^JaFkna!pBmtdok&KMD${3Bi zfwkKf7dskoUR->D7Z7t;%sR&@jQ{p36z_Q+wJeCPt|qHfA#iX@2H>O?S`YLpO@L8T zB40Ng^j2ha6CjN)$btV*ln+7&0KEo_YoiOG(mRZsbo6SxQmCL5n0Q&pZgia&xzYvO z_X=ecfUY9sA~ZyRd2wFExRd9OmdT2FjzmQeJ`=d-VAQNgS8gNZ7$Z~utd<`vDal** zI#J?ZV?gBtIH#9Pdj~FTC^_ZrVNt=rB=~HCp#vo)jn$yMUEnsEb5$j3h~8(V#71A| zGqQ%YDFop70!*GO3HFXI@IE80Y?YYmuK;>CiKTDmHoW!{-ck)<^T8OJU9vmR-kn2u zyblReC01@Vfb{25a~9Y=Q_`Foywj_sWU5EUWDMe72%b$OIvc=gLomTTz2mfw+e)Nn zop+;)*?U2>yB(DAzP>v#=lIsx!MPV;z}MXf$9zv(sBngqYAA4qLmPa32LW@4K$na* z&o==$>V{^3a}x!VD7{a~6zv2ief!dw907Bdosp?Vpm~Sb!QFImD308GWCwb|km{SK zHfNb3Hxb=#-z$U|K;1>{G(em0)G65M>)S9nKYy}BjwDYR{FoKW!u$?sK3XmwS87xS zHA{HjR%hWRQ)(?kc-U6Px~(4+6P~c;2MRd)qfW?a>(bjm0T2pmtz(eP5;vuih}q6M z)}g3m=0+-UKel5K?62UzFKVi{V%T~!=6YwIV7PCM($z4nZDifmhWTo(q*y$AjTVS6 z1GjG?fv4K$VJFsNhU zR*5|naPXs|p7rsw7|qz2THLEAf&Jd+DDVn+iPY;a{5rorF(1ENm8!_6M_v?q%K#v4J39Db396CQg z9eOL!YoN@}2&;O(WUy>5_EU;A`+4Zql=wX-U_SU@zX_<^kE|x&35br8W0_}}+x^me z&?am(7HioXYVEq2a7|Wp7d~NQ#*55*O=IwDu z+}(52k^n#N=c3L%{*}|hquj$%c%Sr*kGoeHd)(KKiQOG{_stBX1F3P_*4)cA^u@Y| z#qcCN_?_c^Uqs5T$KCriG$ZcrVcpD!{Tc4HFf=QGcLRVVhr3roXds(8+tI+XW3k)( z2bH1mGAA_+Ov$AafdI3?2r!jHq3AlJK^rvM7wwQ?ak~f5_>_!C!%Fq)d&N%7Ip{DT zPX#doT!@dAN-V%wp{W1i(Ayz3&cfQMMLp{KCv@py_{{o=NM{P$JE8S)5z49sx8uFO z5@+&fkHS(D8UAoPT-lDOHOYwmVV08y2y+5ofX3Y-o-*?GSnQDKkvvhd<5WL8VjMpz zPU@N=J%7Kj)~|x+`U{Fyh-Td@Cru^2@_gD_+C-TC2T)D;p34I zjSqQQQDz;m11EQuUG296VFgr8`TnRQNnEUA(Y9mC_g!*D$n}+`rhb5<9G)a6Zue{W zPT5KcbHb>CZCzse^+4bJ152lTUw;IvN~XqNq(PCOJU=53mw3wD&jYMP-AlhIil!jL zd|R3&&?qr^Y(qNNamF&Qmwb{O?9%>5&M>fE!u3RsCjs|CH}a*^LM~b6*G~DWFILgv zTV|Qp>x4pUEf$TP3HR)AE?%Cu^co1uRLIait;>D=z|$3$K%*p5)GCk`6%DNJ7He~1 zH<;-uDyyb!Eqep9TA;2O(n%+mIs}@IMmR#&KLSPNq_7No-#prgKn#8RB)t7#PjH|w z>`#OPTDi(g5a46}h7UOyk<)|i_^e5sS}X_qoXPujO8OGu0UlH8$}D_CtHIe5thq3{ z2`;%oRz?viL*TicwM>jQNDmRnRf6G8n2KL#zAgd#qv3;fhYWqqGM8omCPKwRg;>lZ zN0Qfw{sL~XupP>-2n-vFy0+#Y1-xwJsywWMI6UM3py*>{5M9@i5eH0O1ATc%(nb>2 z;9NRfDr}Ue3LgjdFaipQgeqdMFtfVE8Qqd-T3CBI|MYr~qlww_XhYlrV% zpsWel-_cP8Xgh#N-;NqRP5oFq;7nA92QZw8VH7A0Oo-}O+zINCj&z_q70?|p$jH6y zRCqS}-*$hON$Uz^V zPde#+L`z|oXg&6;J(W5n|GC!kLpqGn3G^zl8?a)JE&$Le0ivS;Br8C3v>lW>BrC8Q zZ3dJ&q_(-%)Qvjy(Io&)4eH zt+opKfQN@i7(hm?H!uc_f*ZC6BpB{aezz472e*0(2={EDB!pr25Jk>_yG(vdi3ZMyQCyDp_D!BB%t>SNr^*e<*D^@Z28Gt+rIHQ z(0U0>N`RzZfD*GDu3iZw_Af+rB|3i24yC2(ElZL~GfOIn{jmUjoHF!AkYps#>jm^m z(AMlVN+RaUM!gP6M#8Q)06M*PT^wA2w7IG(VCHiIDgoaFnXq87Adn-RWpC*|nl`(# zd%Y5mts=>cspT!gJMOju9`i4UWo5X+UCW5SS0DsHCi6x#Fy(*+y3b#2FhOgXWnN@Uc1JHwT_W7Y{?wIUX>G(;~F` zBj@feFq9vJM_}tuHG(B9a4s4t|BO&}OiWD7rMQ@wn3xMf13@z04kP!ZgR>mK8;;1h zQV@tVd(aaBdjE@z*x`VH2V9`okDAZTW?MkOR568Sg2UkQMtLG{~@tCc}KI3Ra+C+jrYKj9vPb7Hm|;DQTQ7_rO9+c?UO(M0qESjSUv)k?J1*}i8xpq^!2 zYCtb^Gu#Mrj0blixpv;N=f6!RS|ECh6;_if&w`^dIQxImgdh`MRHaz#n`InB6R+0vOq+meH^I zi2X%B_P6`}{L@I(zvM0MYlRi$fE?wv8R?Xj8uV)Hg*;x5-{4thxf_MB>E@ULuH zuY5cQ&hBD3oXMbb3*b>_ z)K@0f+op4f)mNN(b)G08~~1m~_D5!$LD|VkcZ87Z1v#Y~~vR zi;WAE&jVb#I}G-$ws4^eo|-=MC!(u<^VD>JO!31;>qq?&vH=~<4pQkX$><(~HW8CY zX0oEc=RAP2mLenst}9md&LHKFZ-edesV4W72+%Jk3*;9A8%5RwNzK;*)X8x>fTYsP z_#{apPd$rQ!fHBxY4s`|4rIAVoaC?Hd#xrA`eXGJ%$E!M`Q2f@LIuep-ZOe+S3B~*T}?=A^z_@y?@vME3wDrf#o)H z`qFU4Nz=A_aC{X_Zk8Ja2b^hcJ;BRTbv)DKU^3a#NI%Dp`vdHJ0e~yVwgjsGb z6BJ<`=K&{g8GC>yKvcgxr=^A>i$m+(A**?P@PV!6Q;jeGPXTsclt96-Oj#7NvzOJX z*7BG4Z|i5Rnl9P~{3umh0(vAhX`ypu-@Y?!3=K)`SS6J(j;4;+}gPA85IXfGjmQt4%vY=w$U{2?$yc0r! zcf-YL^qP6YIWhwRp>Gs zRd8re^IaK>=Dg70RI=aLzXFG=YSIArWFUMWILwRfShfnT>X!YKgg+BGERDM#hqef8 zW-6NUdl2?~zrqb$9LjfV<=^ISA~&HTI9G41qat;f=gin{d3cq ztxpM%ClMIBHFzM=yx}mxse#Zp4TPTz?ge}Ky^*QQMfAl|`oTb70R)A77W@l2$K3G> z;)opL!otoV*|!Y<6JcS40QC}>=fWznEC6M*@Y(SJq}i}RU@+8-RMd!gyc>meTLfV7 zY#`Yo-`ivYgpS~>X+MrRGb~%2nWN1y0@Ha`f?7o8khAoOTa8|o6`oEQlTP_mj zL7D3SryNQ2s>4X<&Z%)3T9xO&^`yV>mRj&DCnHTP zg`YnGBmO((sPJE|KL%zCVD|S{k`{Qve^rh_|7f()fZj(y8UZ}a6S@8efeC+?yc7cc zPXN{L2Ddmc`1@<2(_1OSrb)5SG3Kuy*SMZjRk;-aQB4o|9%wR7d#rBwax-f774wFQ z6XKdANZ;;XJXHMp>Nf8o?`-v#ZXXYL1Y*vN54CU82?eGOHNI*kEcJnMW@uQwa~rA8N0aJnqO)-Yf1bnHx&ou9l9!HBu+BUmhCD zGjp&Q!L~fHKkm!$&B+2>a@zK8K(9lz*W-o{H={Nd!$^j@E)%Alwt(S%q8R|D0w1ov zoNb>9Q^LOULQ#Hj`2qy*gQ5tSenJwDLxZQn}E?AUe@Fb1>XMqrG?HzY>>dH|_E5vV{?Um6V z8lX^Tj<>0Pw$)f7{44t2BQ~4uRl|k0jKGFtLR_+~lu>^SGW&!G?64j9nsKUQVLx&; z$4cOSYDy2TDIBxeUcVM%S0UnSw%P8V#ZHk~S24abp43n>Oh>XkncvL-ICpy|+^o7g zps^v9pN%Tf6i=`EzlOFr*`S`XsALvf%m%w!5=v@@Nf9%Kox??&(!ptqQ11AI!Kwn+ z$ng=89l*(gLcl#URtt@TlM4oebGp#Vtid4JnQ*rV)VPQ^B>eXHJANr4%Um81p2{0; zzR>-8?apzpA2*|l*28iRxNNBhLw@YX=JaZxg@kv=>H&skD>`bDG4@2mgcBS+1RWP( zX$>}RfQ7_`eX#8~uwJ4p%0RCrX`LJ{&fR4qt4D4H89`qJ_gcm_jdPAFl)>hBqWf~X_UxH z02)0KAOUDJP`{wpAS(e_HBiw$oQhU>%KsZ2kY`* P2QIrAb&LF0?#i%@B~JGM literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/chimpshot.gif b/docs/reST/tutorials/assets/chimpshot.gif deleted file mode 100644 index c27191d1cf58b123e313c47fb0f6640aaf8de0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46010 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 r=&H?2kMwu@(Rz?)A=&s3^P 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/intro_ball.gif b/docs/reST/tutorials/assets/intro_ball.gif deleted file mode 100644 index bbc4a95fe883abaa4ad009669fc2d0f8c367aaf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5015 zcmeHK_g52Guud-^5b0GzkrrL)2w3P+TsKCkf(C*jMT#IT=%zseLtPBz>Y&c@6SR`gM#WJ~6BoGOBG69Fj<9YLBQmJ?oY?+cH61lNO zvQ3RhV9Jq3iWMTUR3MYH#hYB2B$6pN{iX7Cx!|WX>8Hs1ry%I32=`OQT$d78c(`=| zZbg)|!V6jvWvqyqN=}em#8$9_q+*VY?JX0~q&%XG86;)8Z6=m-k_0>so6Q!p31ViX zjExi1+&FBSi0CF@X9#FP99j}D!;Q^k(`Ynyk~b%5lM|UVB9X~v6O)((Hx4l}DI-4+H{o!D`wtb^_ah$;Ayp*% zr?2JMzkqVDShA99SAG8uFmbAp^sh}rwYA3%r^&BJ^L>t(JO9A02OxEvtd{o5Z$Y;h zIK@dM5)c^zf9rqmUA=W`!4NVPdm$s^xe%$pfwv~={lzp7XKbIQp1g8$`7b-^4n8P8vzA7f4Tm zUGm2*FAz!-B4APZ&qhPd4vjBS%!Q#ARS{h-R@K+izeo_8!nEb)lV4#{Jxa>r9FG{8 z@Uq4KFsh@qO)-Oq@4P1TMr>43^7sIVdf_n`r!hhs$@fAh)x$Z4?d59IZpuV0Cw+3~ z-66v_e~3yuysi%n9RpPaeCbf~j4a%fJF*_m;Hl#iShD(Ln=0n!Nn3-$TFy|Mcim#N z^gS|jqQCaafzN-YHXN{=<8HB8X88;tdQqVId$B68!G?=*AeCt|(XN{|Q3mm?SuO4< z{oA#hN5)|0oD|ir6rtbs*nHrk-=|wp%cA?I(XWKY+mSY{qq?eo>K5>`4!1P-)RXlI z%#VH#?T$umyP!v%z+c_y`Mg{vRn)$P*lL&f-p5xAz8&`IMu7}YF`7T?@BS^0f*g$1 zajwT4%j5GeeKtzi==xDwB9f@_?Pz1}JGZ(_`#2`~&l332{s!9OT|0313$fYrmDf?6 zp}gSPk5|SD=hnc5Wrv_zhm1@6#^bq1V1|h$z<%FUk9`lHVs7HI5QE2OhhsKY=iDS0 z^*YxeOP2?4Yx1w8Fj z*g0&`B)g58^!Uy1UkfEmy7r`G_;=sbl9|-OC$?b`??cWLhE7RESnkpHAb`0 zUoDB9dWJsIPIcxVxuh1@qI$*?SLxi?N^7RLU*X)k8c_mkZ*qo7Hz-(;gA%{9UG@W~?T%2EWXGm$|aD)m9mC zuhi1C=?9w^u!f|QdeY&0x%K1zRa68wxcPeVb88cKuefbmEiP=bN{c6SyRIg4jY&Ni zWW%qMW`bC7;tI((mXhnvTgY6ohz% z-lz|cyIRq3VBXs4US8-wb=B$_%V&+3)99`X!2S<@@6W+O;H}(+em~axOhF>ez<;V) z^!UAddHbW;;t<$D&zIPHvvZ#sUDb0XRN6-_e0^yBmSzvti{eQ!T*!uY%vV72#|@f)%RtY~-(`$JS_M``W@3`jHC zW5Muh#rSVMf|AJ{CvsIDOI_Ym%X;rF8h;x`|5^h)k&ULA(fZQdIPW(uA9S6Y9=KPw zOZ_Q3`a3w@yJuK^1B?cwpVgd;}R4FJ3@|GI@$1}&yERoxPk}Tlf39PPMq#dmU zXZ;u6ol^Ix8FqdGNQ| z+|fiOhLP3#4Mn$uc(tWbZJ7OciK1R<1OHvRAF9M@>b3QTO&y5ovb!$ZGK>F;grIjD zJuj-+gWz~9nc-KtL)!7O`>ySKpF5SfBukzg4ovYVdm_z0oYftD{jHC6>~qJym6}dr z7}fnjfkP&{4<{0_G6G9%?LdwfB0uD59-r^@U+dU@k>Ph}5PsOCTc`EwZx1zRNk}^&io~k?0_+v|Q`?1zalc)4Y zMosf%Yls)#uHeo;I`Aro`hixBU4v(fiaiKTPe>cEe21@gjjMZ8&E?nWH=8cb6aye$ zmY;J5ZHIAU5AF>2d~fLmRb0DfO>33phj6m&ZKzA$&?vmEH>Jl z44VknZi5%U*qwzmL`nr{kIji9Mxm4eE zztA4IcIZXF9Ma#X5wF{6XETF6u;2|fa6ycNR?ubZ`HzgFefAfQ0(VXAG=%3zk3kM& zPmMgLw}z6GRtO5C@bc}=7J#vNQ5a1IHhyHpkR78PoVJhcmB21m^N_lsXF94V!PWWH zzKg(rNs-vV>W4ZP9W+bt7qg}fn74Lp$6_aA&lb1RJCDKBNbvlHQ@=BEDF2m6!i&Ko zi<&M5EuCpz4xH%IPXpPp%`O}j6-4_UxJN5_VjVNLsT9T|$_oz#1P*y`4|dSs96HN2 zrLoV@UN|dNY>_zbJiVgmR4;ODv1srNjlnI0Z)Iu(>;}1+eU4#el6R=FKy157 zp9#puM(qnN=f@+Odp633$7p-;nCaNk=o{K-gUe+Mi<7JS5TD3YHl#*~tRICp_La2j zA&8$-4BRUEZi8lUCjV)gc;vE1>_K@gcCXIa#aA6K$b{cnJmFTAczPz8fvP~-SM)*- znv*Li>7euWy66slH6g$>&AtoaQj5T8*~AR!7gI^)4&!Beu=bDb0Sr@JqsygHEr7qw za=Ue%EcKwV;}H#h<;^u!w1^sB4tUS4;>?7~uo=K^l(T0-kr!dlBp7$LvQ{gLQoNp^ zSgyT%(|6lt;H7@kSLLN9o=nA5Wktu{V<;#G9rj0U$;GitcXR{4hl48~Z5uE!;o8?- z>etUU06pJ8*uLl2u>+y#(ckJT*^E2v0&IN}vNH9hDb&;aabTS|P|wAzlwV{QuM6F< z2(CfaG*81P$NjM#5Jrd5Iiz9F)}|{4x@|N2svkB)>N{1VanBQ?0y;`2vdSA0f?vO? zdiN1Dl~5@z;>M7He*rmK`fQ7%5FZPi^l|9-SIKs@&4!VTl&N2#W_7ScZfk_zUw- z<8bp8vplWKrj~jml~pxh6ErgCYSS;X^a+1N9t?5H&@JAuVIUnC1Js$CX*>S_pe@aY*=(JD;=mv;qe)9xD7NN(Cb!Rv_c1_)|@{EM$!=l-S8Um1ZV+R1fSE_DEYBeeK|FR`)LPShPc z7!;Flhxk3MF$J#GGeLVwHN@HqlfN1|uY#r%TLxd)y0W0(kNTc)uRhPdvD0UQPw2LG`+_kmWd*jch88*(|FwN6?W2zr9 z>&;p?U_B=|2ZiUe;CGggzZ}<=-J$iE>q7&D;yisT?Cy*!9;<#n7$qlmm7g#8oU z7-ASjMGxu;%*^FmBr>~jMQ0uzh{az^gTk{U38W9A<79B42eaxKAft$@>S@xRXTKAG zq$c?auEJ7AVZ?>wd7-^+Kw?i_Z}?V0yvNl9j4J{IZ1RMC|J1G48I{d~ztM>}IH#L4 zO0#z6njfiTerZ!**tTWDuI`)rA4mIaFpcNA$o|eMQ}4(_i~+}uBdie*-KnjX{Aup^ zpM%1Y!4qF$^=T0tT{8$7OehR10}QGFET(gLvo{(bP~@jNmjcYt&D*eSv`RYm#KV#y zu>I-mHN<{*t(KyOQKH8mM#$I&sKxF6Z+|0G@BxcEB*^9=f`5ASFz|IBAZ+Wk`C!-h z4|__@y*-16Jpj#3IpMDW{Jvw0O>#NPd>l#PwdW!P4I~|U$ z?9Biv9+-^Q7ppV>dX^;eeF-~4LOM!s`FuzD_JDC%XtFmZdkUb#s#dG(-(fr?r~b-G zL!RY&g(e4Nutv3-hr`k2IeX)_FFRfkq#Ifu91M(>%!Kf%NPnw4x@0hp1dhZ)gGrF> zEYNm45b^Gv{eKH%(a5uVA;;3(3zEms_Q=qMLx=E?02a)}4rI=PZoTGmc>%^|!IDq` zl(>M#YdR0&zyTykB@0%ShK&0#(Y9ru`v(pF3y3J+Bz*xg&P0OBk+mN*XvXk6dnc!& LCL@ed0FVCxQs}HF diff --git a/docs/reST/tutorials/assets/intro_ball.webp b/docs/reST/tutorials/assets/intro_ball.webp new file mode 100644 index 0000000000000000000000000000000000000000..6c4eca9943fb9e10f9144d0adeb22476164f488a GIT binary patch literal 3588 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 K2HO6gK?DGCpyAp8 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/introduction-Battleship.png b/docs/reST/tutorials/assets/introduction-Battleship.png deleted file mode 100644 index 35674f695fbd737e103597110ff4e9fcd82b5361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165586 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
    )D*os9 z9~@0_N3iVaVsXW_Ge9+CI$c3*CWd^XY}8UEnD`sSS9DHvX9UyV5mMVFuHQZ{p&@g4+07eEmG^u<5 z1}w&7**rN$pdX9JR8f9gsaC6S5U>;rAz2=$Sh;+s;=%Ddrcy831!$U3bqj5^Vqi`P zl3axdtlT3+%thFSZ7rKqsfy5MbVH2LccYb75O#XWL36xI&Rj88LQCn6jh)ZmuqQU$ zzdT{|HET*u(tmXC?jPT^DeX-B{p*f7=78BlW!qu?cfadBvbDQ*f%(@jncFO}b3C{` z{>rWGtrOkzj%mI1d8K$+KX@p+;mN#WhJST(_23e2eeEFq#IJTgv@JY#zshG%FXdu; z&$jft_eb3@J@3fMOUvQszIR{mS5Jm5*Z8ZGnyX4+uy%KnkN;x#lRNt-A5gvMKNB96nJ-3K-*nA~bLhQQT$5D2BoexOG&4am2h9X!L`;od>0l?~A5}_EBg4 zTo^Nb)k3p3ea+1Oba<*%oj>^zzRk>3wa^^u&*G?#y7Xnnz7LrB`eP?|=1_jMt$yD` zMbipda0zIC#HCtzvB3(Rprf)DE3W zqh=m)(M`LigOuY5sj@1**QhsXC01zHhTR;py`UeKYNs3$eK3IDF}p^=KNla2Nhf-wBMC9ujnBpgy1oCA=uck<}=-oZo3M^70m6MY`s z7F~8{w_mvDuBo1RNU6;32M@(JZOm$Bdf|zcgXWY_rw#K@-#Go)?)2!z-X~6Jmg5fe zFS}zxDyVlKH+=fRrSu^`|H~(Tbl0}gy8n$gtU6}@;aR`W-d_I2JHxFV*KI8vztw8`US$9z7|gTKgmJKZOz`7D9B`!1tQs!W>W^QyeXD&5>%YVVlsqVy89b zKtma|IK(`QjR6wEW~i%hvV<0_&8e5=SUTS?RIeqCP*-5KjuVwv%GI$b@gh;UT5XUJ zVe#Iew@Bq|U-4PC>l6g#Rvf2Mt79r<*;$eF`dyfD!I9goRjMAk@PzUjncQ^AK;h{s zKWi5K01YE~<90Wkn4FdakxhcgI16oJo;CRh4!m#j9Pz)`l{%;5`}60Hb$i`jKTZoP zN+GaKj23t(vdbL5a`c;TI&@BR_KAi(!5{nAC-zQvK6=^#?|boqW!C5Ce(~fte*5f5 z!~5R(Yfe09_DNzlF0Op2cyf2LvYA})yjq!_z{9)JZ%byETIU?%zIe3L=6v#uWo7c#J2&+%{oU?3x7Al} z1}Ia^i3T!})6UWS#%34B*E<-|omG=o+u54Mn!{Yk5QG*9}Qbu=!OmHYq_Y7 zkFjh8Q+_BKWNCn%3bqHZd0|wQ?ZC$1$JO>H$3pTx9)-3mv>HU3P1hC-nz3&o0_Sqv zFn^KlF$@^H?Ka%Zjas$FH?rW}Vp>TQ88)E)8R=V%I)12wY+3GGJ~1^pJ>9kdzw_lF zqB!pN`?#~}n+O~axxfZKTM~W;y$EOkLqE*KhiZpIhr<%pk6PCJ+{@>V)=DT4Z-%>Kl5)-{?qN-WncW(TMj$6gkRRSiT=4)-n(%;KJ%!B zmz;A*nSSd7yRsiW0;wgA77dP(6G`G=Eds0pz60e==wHF5R8kvrhLS|JPauOeL5u*l zLnMS#9?Vy@0IP8pYVr&c)ZOqY( zhz7)`L70{hlty*=Vy;6WS z0xyMlV!G3llg}+mbjw}J00+(tYBExzR_YNLt?Mzeg(NvI@SBkQ0dy0)r>l=zVY+LV z)-F1AXrx5dd^2L}hQ00J6Q@hwy1dN#{KBuEzWk=mHP8IVx2-+t;Mot3rh@GAw{&(# z&hwUf=dW?g@UrfFX8N!H_oneq^8ObtdiTkt6iz??>#aY96RL6f8xC5#boR_8iLIBf z&o@pQtH+GDA8nP{Ic|QkbLlM;rsMtPx}les)84)KhOJlMKRKsa`Qn*Nj#x7L_QLk5 z@NGYMZ1Y5R#^Gb1{fkn0>qEPfftj;HQzc`g_Z^ZZ6J`XmRI$DZz#uG#=w$#tEGjAiPpZ*I);kb(6y1~ek>Dr` z+%YYrazNZ+390HtXGc&Z>;qP;QVGr=zfj3)<0z+7?RbyK~B2wAw};-$do zFp(>W>jQ0;r~qKBWJ@sBwom)YnmKc-KcLYN=1EWp=JS%H+I)e0bOm*RWRz(JlR?CP z)3bdNVDbv4Q7)V1_-MIi5^I6ng5#e9DQgoOD0W0J$7oj|X(ogVU>4@%%S)0FAcQ3C zb-Qx0E0t=d0I~>0hnxt}D9GFipvFc4Ey7fB5Cyx%ITP+Q#1~LXAU{z|Kz3cWbR_u) z@D-%nYJKgJ+FzaA9Ilq=YCSRW@oS!*>?I$4>9W5(Wl5R!dFf5tzkkQxhHroMwaboQ zUcz@E%rCyRx2Js8Sx<_iXNc?uOlyLH@3Fqi;E`RNnff8+Tp%;N)=CyyVqO z4_`FTb}A&dh z0t7dMZMv)nNo6!nDXt$-dnA{G8EV$&&lzo2D-!r61&Y!lH7#1G0z>A5_@>i*Q_)M3 zEa#>bhFKrl_J%WH%t2X(YThwn_&7+}O5~6Oc z>0lqRK$}QewC9Pr>Jz`&J>55y55$?jMbx*&(R@luk|dBGHXPg5bPg#k5@>)t34muG zrXU~2%@rP+CF#Hg0iP?eve6iUs-GGV+NLDv65|a3Zr!0_Fn0?`&U7U~md~lz8?1@w-9z2w8hai_dF=kvSfhOWwq){l8wE=aSom5UU*`yj5hWi8@r$W z)wc0&^!`)kpa1+)`pVzFbMl|>ogS)tpE+&Lk&8>I@Ll;}y0dQ_KG%Bf!FHLv^?~j2 z*KY6bm*cgD>v=<$@=l8Z++$LWk>Bd``Egxo&MD?c5Ru?U%0aNkyA#h zCDalg-Ie|H;j}O1nWa=T2#3nb=mio^BO;w8kMp7^iak+?re9u z-EKtuV*wB5Y`EbsTQGOk@@4Z!MrAe14q$kGk{9iMPMIl4P)TM)Y9BZj9++xolo;p` zg0KRZxkT8EBWxvYL;u?>l>U#>Hj!PVKwN;~b*#i%$H;nfC! zdHmnqwYSsfk0QaRM7BYDKt&!P*Y^Ed9YwpuZm^fqL}FJTAc7bq8Tp{$p_aTqY_1)r zQmX+8g^Uu2H{^gpC>zK81&iyoCb_e6&_S=)l?|{~Z48eLRU1`_!qe03iSY@!aRX@w zOEKEe?^17VY@e==@s{h=D`0}dD-0YbU(Pg+BwfY0EJtoz1VKQ+9f{f0lws?D@G5K@ zpq{Ze;Yj*QOm#@na&jN>;WJ}7OB>jOmTsd_Z#C<_4{Da|K`Tei_aEn%(Q3JCQ~#2i zCwhr_{&9_Sk17>?zQ2C@XOHye4Ann+LSyy(*+-vtlwW>durn|YpX0o7m0L!q?hm`t zE7!*pz2bF;yRTkVN(bwT-%nrnWHhJle&UqoL32uAu)^#!H|%+QPj>Xu>c>wRF4J$l zZDaq^TPEB6_TCe$-g}@ETfdG@|OQr%z41zMrVqmM(v{g=&okLSuhy~lG6O$4i zr#PtxEkCEKmc(61fz+zn(fOz+uAwt4yUUiB^ zBaQtR%w0Th?xF?rM~8;noz62m#uqPLilR0#!b}osVBsM`$c*KRJ2z|u8Gy$Q; zFk^7)0x5ar@ak0`-B{D|e5ghn$aVusMpg5V#6d6#Yn3|u{n)Ea2grjWq^gS?r+Lml zZS9b974#%rCUVf2-Bl3*CF4XxASWZ=R>^(PTl+ybL~KnYKbMd!37l*>h^@U|QpEBz zQXM#U;NF^>z@i1k5(^w@mLxCR(aaLc6apn?)>n1*87k58)aOkpXpt4878%d2(mpK4JgLyN<4wiLEz0zUL!X zKhp0;E#GT3Ypv0yhuMbfS`{lZWm$o#Cs9%d&d~0Fol?Siw=85yG?7|i`jmp}jQph_ zBA{UEMtM))XX_BOT#2VK>P$%%;{mLmOj81BQ6|$9aKO5y^b$3UY{@arX4Rk5YRw&L z%^Mx^keMcp)=;MxMupu8vtBHr-14#V%?uxqF=2)7O$v*WL~>DC_PqcOB}tY@_>?F- zB$;)s=DQUiegR$vq^5^J)WA1^)HIDMsQD&bq65hA2T>BzoPl8|HP89p)=5y4B6?~A zJ0=@Qvx&)471ADZ@;3A*X!t7E3+Pl8xwdVT(uVTBAyEYwMv_VTs{n}#dC(P*tiZOe z)|_TjB4h&%Y*Gy6s&;#_OGO5iBvc2)qA3D6<3(P>wkB@^#VnV-5jiDr;>{w?pl3n) zXUctoU5)}O7|QB3NOQ#0(qI54<_?{2HLxX)0tX#~Kb}BzT(WiuyUegKK?kIK2JRxm zG4k+gttwmIuRe@cxbo7{7bjBclNDg_N%=4@KUp^KkQ7ten)5LRQQ%-ny+0uduwO|lk_du zJh*eTW`6zk2d`Z^`?r$C_Jv#8kM1;%Smb={3!&Hgdi(@j2g zN5>>9lPp^TMM5Sv*ya-E!lX|DB#Ap=(4)_EI+JZHsTCt1%Y=p;#A{r?(Q3Au4TJ>> zXdtXrJ;m6L4L2mDxrn?*5TyNn)C1g8hhVAs;xGSUI?Ox@r$SL8ii0SSoKBM8s$Y>% zC~>;VxxZx_^toanW6uD9B@$mTgQrtrJV^VnDb=b~`QQd*LeO)KfXKp7$pktyr~S7_ zc@BwRW=IJy`HhZ^ zk?hOfRCOIdFxXPa>HRDDJZFxkUv+$B`5N&piY*y2U1ul=MbMp6{V`9o=&b;XEt%$| zmuFcJ%83LS1Xwq%81NUwXFT1lN3;s<<)X!N{D*9ahyB$Bcb7!;STzuC4 z$1R`zTXm!S+YiQDJNc?P)*B8hrQiDSuH?H9q*Fn9_Mz@y98xZCy>ZXg_wA^f(KlXy z&=LF1z5s8B>1Tem^`ULqk;|%|JZ)YXr^TB#bpHOgd&0E%@F{c7KC)C#;0wRrc-7rI z#_I0ZUU%@(%Vz&pTgJPuzVxOiclFLbcK>g@_1H#b_D|+7@7sLAcYZhAbk2C;F`J*; zdiz})_FH~P(4H8n8EcO{`rb#L*eij<^kt!7@uV>|_A(54CEOv$@g3S*_4}c`8>BEO zwty-eqZlxc_DOb`q$g2cA0sCDSxlYTl%zTo2=I!h2f~Mv2vXmIIs|-crP&;kh1uz} zyFo`vYTxolhlhuTTJ%zNQTbM@j!{U8mll4QkgUrYcfa40;E>V3nN#$F@^%smQgjU< z!eB^*s?{r1pmyDSAW@aFU13yQ%L6P5T5F>tqxE`S!WVoSC8>`J^Tl7eU#cWY5IOC~ zutz?6x-%))0eDr(H>)b^T2v*It<__aJ|*3Z!<4x-%wTJvomS*L313KLztRvUnPL)$ z^70TBH2t?N$eqZaB-w=$E!+(NwgQPFPB5i{4lGolI+7R4Z9zX7#9lNiDmA}WAu|ge zGenx&RMNDRDY1Up`t62R7j>F39Mx z)HN3Z2Bu1sVrQdt9Hc>V=DIIL7Z=kKrE z^n*LLHr)J*x2!pK`RvDH&+YBJ^z;Az#P;@UPdweDbBDVh9`c3b=;wFhQ!woM$ zd6`$LjVuZrGu?mrvW?Geo9G6GT{Sf7Q3Q@$RZCU*CF?6Vy`WqXx{4;fP2~?*q#4AL z)FgVJTnVjVOmHr3OX3gANh=k_Hc<;nh3)gSAS0ANB%j%Ut!PCOJ_#2+$ws3fOG7i4 z65g!?@>(%$0@I1Tg#~~liQp~)PYF~O^m1}VK}r4;rEHuQP+L{caPqk1XkkhX(HzxM z0NOX!T|vS`qb5mCX#3p(S{+L?@(Bq+EfN$V`z3ufDYq~_<)!MXW0nA zavR8|<5dzj(est9%)_seSvQ-_dadSYV;)N0&>p2`EdX^;6-!kgiGx11Fd%fJIB3lJ z@VZj7toyb_|8RFd%&j-9sl1|GY`x~O=*G=?!*}1g);f4>_J<^C=3oDE%i}xyC#-0F z;?zZD^aLK;ll|iZv8=*ZAL70Ch*Fu|mu}o~%>z@z730fimEsOaG5eE;cK_nGM@D?> ztLL3KQlI@bzjJf+?e+2`TW>kiduchxnu~t^$dxxfJ?vXQx?tV9gJ!P8;L>SO$^9+ev6ha~usUV_e z#=b(HL5d7O_M|68e~~5_%zy$_bt_0UYKQ zr#ro_ktg6E`KXZb4k;y8Y*h=PLKjm@YC{(eI*=gaN}Wp0%0j7_7NBEZtyYr=o6~zV z;qWa*zXF!k5EXXN(ydmY8cua~eC0HD!gy^4;BRv3gosRiYG?`{{mEO$+Yy8jylSIX ztJfuMr97@#c;JhAk_5{kN|q_dr<5&R8q~{Dz$4@rRO+Q;P_v01f`u@xmaI`km(~b9fp`EvgCsB61={qGD~I+- z!E-~*rA)d5@UfYz7O09Fuy>#mzfvR6=?4@4MgxL|o^L}@hT2&K2wUuw7r09Xv4? zTQPe*fxVsRwU@7d@Y$);*3AFrc}EPFa0q{3Tkyr-?cUXn&p&ST&Bv6|82r{fz1udY zV|Dif&+`u~fo~n}MsL3Sw!5F+eah;^-+kxv%f!~3pP2sAjXS6M(SkjzNyVjNJ3EaE+?cchs-H)l8Z_LtpLTIl>*k0q~svcMD$y9RlC%-iy5P*7-k%uC=OuO zbJlmHjEEpCZ4)Q&>St2v*eXEl0-qNVJ&=&t?<7gYXa>dJR&xl!7!0t1u(5Ey(eecql|WsIt;*E$0n{1@vSOREjTsX$qXxGR**)Yc zgN~-c(GVIhGK(V0IdQdecaY^$0)cH=i`yNZwKTK#Z&~NAGD=7c8uvUGT>krR;dtk+ zt)6jUsk-tTx9$%-;(_nCj+c*7Iz6${5MI(6Q`^JZVjk9WdXU3&9fPwzebi2Z)}mt|w? z7p{M9x}SXPB}-p>OsUxVS64rL<;@$%YTiFzaNN3;v%hy+Ci-W8_4Y@%wa+?s$ra}x zU1pZ`i~F8?=XdXv(v))GHW8_s6=sN5wExNo>@+k3Rq_=@;I$=y89sP79!y0GDcTLH z;tfPcO*Y&V^(ZTw9RJi*`yUExu|Hsta*8kkzZ#}mYNunWPXqr?Z9LbYP&lUUP*=${ zB59nZvH>NjnTG-b#B@^iK@tfsArwtDLx&=a@7HTp32mO^LjR92GOD5^lq7|6f3wj* zGDyWkPWWk;g&};77siSC_Mf$X+m{40j#CPsn?Nt5Av08) z8UhfZkz9Sw*a*e^^Dqv3y)cP0K*M~5dy7)os1V>K1Ez4lA9g$aeiYDhN)e_2XH?~_ zs#TXvH97hk(r~CFV&ia}oXrPbOcW$?N9Cvj>ZrnW4>nmIm9((w$<3d!qA@6pV5+jd z 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%0Ad>h04^5M@J(ag)@L1Sfoytm)kTpR5jw%7aP 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

    nJnuc z&`3rtx7>4ceaELa1p%jWiZXi8{DF~zbQCz-CCl+^hKr0P)Q5QvlRlqHCN)*&y$23x zvd>Xcv{9;;=F8je-AQTpX1O3M`Z`a!kXN5}Afe7b_La z8A9Acxo*NuS($Hnf%S)lD7a{aS|SOZhMCT0v$s17U9-AByELDF0Q$4lTK)3$Rj_o# zlyF^mG~PYiw_Lh-@!4me?dj<;P4l6L9x9be03)-rv;F=3hNmR5eYX+6y8+(8_2%bh z&YnKHFgtA+O$;3Z-sQSR*KOXgc}F6i&MS^v#XBMwy0+i-%cqWXFP8pfVC_fF9zLGw z>Ni@y|L~j6y#Jl4vlr{{cr^RsVfoCZh4($7%+4#b3+umoPBk;r`7U&f%vR&u&sC33 z4*av9kk$eSVy(LKPtVXpFUgO;oo?NR?*JT}Jnnz(tMtIV(t!t2_=YlXaW4Ggmx-QY z@AxT}N~6s(HxqvSThuj!$KERU4`Hc*Z93n3E*QV4Jo;vNWK>w)-ubhQFFdVWIz5#1 z7T)>JN5B5rf>E(k%6UUN;cW3)njzjH*ufKW!BOQRyOOYE#r`asyi8@9$G0gWacSHq z04(sIP>*b)(_y#d>k`u#O{scc+6=rSlf5rr*y#GQC|ckmzf5EedVIy;3A%`}T(;2- zFljjyx<3-qRiO$kO*8||$!PlIxry$Pb%o-{;)Pinhw*8Y+Z=_uM5P4Zwc$23A~-k6 zF+B)iR+@9k>A<(CNgXTjWdys1OpF9|<#j`J%NkrkBGJ*nH(D*rG0WxIT6NKNE!_4= z&^3KD-;>sR*2tmamgZeM#PT&aV6JVOhV8jntVjUR(eyXCKJ9QZEwgaC)IcwRl6)qs zX=>B3;r2o$z1V0Oris=ZCbM|Lbr3-c=ycrl;L`4ZdOZbL2-qs#EzRd20NyQ@D<{rh z1egnjh`R6VigaN2-4hd+j~qDycvr1fGnou@GOUVl-8F00l$$B3ChAXqUCyM_Z+iTHq?viu<4)|uJWa%I?7VF3 zU$Ia7up7G(>qaASshO2TBN7k=!V*9?fVNd#)#a2Tx31qAu`Ucpn zx^?d{c`|?b``qu_N&obR#Hkwp=8rVDj%7?ckBYziE0RRwkN%J^ub?UtknvyqJp1UL z{e$oEv*#GWMDYC1hu(ksi|o<5YbE~o{>3Xl`rm5apr`4(sXcHnYr12|3}pbH7#3Wf zG1X6YQh{((Z^#lQ11sHI*ccZbOzA%p??0n&vKfsx^xQF0;66<&WaQ(6g?AoY%5tsr zCdvvB#j}brSWN;&GE*_b#NZ->-#F4$fG8aW+UqgR!z9+s>Kqwm0Lf*s+wr6kbr>Oz zQrOU9#5Uxzc^ID8;MS%v9;BhjhaygjL?Kc;^;ic;)mpAuGAAy3do#W^$A*lPE? zUSe?OTDpy;YE-st6tv?8E&q-JDu}eyqmm! z>v#t$@uisd`_aVIb$~XVT^vwKc3ws|6@8pWE zw6DML#}DuQ@uQ9ZdwTJ|x%2D)@#MuHba(%U|L`BydtT$0Z*~6tzvVl7^q}4Q#!Jqv zJNZoO!jJxn|KML{XU@rhSw=qksQ4-1-Pgpk*HMrXhG&0=|MG9y>}>SnE7-mk7S7?0 z|DWI0YL5M#=LNR2rZn`@H|`AY7R~R^ljUWE6kZgsy-MHtwf5cb7EfJ7c2(rsosX=a z|17@oLh`~Z*qs?Y?T7xK{wL~G+<*12i0R@e9q!Se{gftg_T4`qGxK;}I#Sblr;VwO(u^SGvfnAF%$ zI%dc?NG3~JGui4vHlpU5usuouakwC^E39$oc2Rk`b+gFA;b6~;laU{W*w;~MC6ML0x?^#`J75{tu3dYAcfSLENBV=&gNN&B zmQEB?fXiJtcLqRXQcFu@SVI*BdY*T8ZO^FA6ez}t^<=|d_vL36Pkj;IEqn&=XcUFN zdhI9sd)pVUT)%q#MddPLlzq7URKg}%vyNx?DdH!%={=fh4{@e5yzjE$B?ETk&!uJl1n;#$k+dqMQzy9;r zS3bU@efOWGi_16`u!5*3{Ek+u zSl_%}*bZJq5@qjicz4t0cc#Vkv;b=h7WUh3viClq-}!ca;-o4tV(Y8PPk*Anc!NBB z9ToY&APYvLAN@J8D%J1*pg>I_!iIhA)z=X3zV$6pts_H&=kwmX`Q0`Ct=}heb1JQY z?QHpf@ngWdxaJPO`>p9e|5?Qg3T~LXRrbHZ!IA-KAtupAl{Q9IXtGSqD3dhGm%z$6 z_{t3Fe_wmunNF+)H#hZRP;?{GoYzsFBt}SyVKP-kM#%u7 z0D8Dd?b$r^QC@(de@rK3BwVHc2-&ZimQ};@464?pAf?+-(#8}xr58mTISqN1r*W7$ zA_B0ZK<+G|J@=GVcSs^5OR5@%l_7Qk(@WP-;VI149_+4VjEf{7Nztg8OHC_Di--HM z?}a84b2H7t?`MI>OjoyRK(~V+OELp&WVj7jE}UkRySiP`;c~MfQ@5ZjZf*;6E(>U6w-_Ng!0PcVD&Li%$z9Qbi zaWJDR%N)1jIPUnYtlw+@?63aZ_lD2E^m{8O&uW~TvbV|PyN`u;60aJ)Yd5A2b{p-^ zuCBN88%w79hX()0G4zox@cIy1$xjP(cU$rVzqICoa-OSAmj-%O@vWcX9#dt31@ zUNdjJn4LK*W#S0)N6!22v#FMM{z4%$kU0?CS8r-nTmRbS+(Zt{@>JaIc(>EWw<>w9 zR>@rwdf)x$Ge7)UW#nh* z9W$^ZtkgzVyyz%jMDnhJP8u>!2C>uwRg5rC^K4r5zHhuUvzW4$5m{EJn79pwcg82P8^@%qY_3RE=8x(gD?3yu=2pl6C0u5%)go>-^@8WVhK{VVwlvon>OiIA zSv9U!Mmi@;J2*}Y5f#B|9vy;li4EjQ=2%4I`gS_!C1&F5!$GCtIL}^eagLcj@auG<;P$wES(uvgW`2!SsrIZr=p)_2SKFn?g`#~ z_Vv5KJ1JO`>6}MNf>C(cHASTys}HEiY$(@a=aAH}mJN7LwBHqOjim00?97(v1v#d??S!A8izC>*U6b%ynd?rZ7A&_^ZE( zH#Wsoqx&zvJ^!PhJ3}uPg<;rSGsrl9P~G@su*L@LG3kJD*5M>C4@L>#rYX9AY`i@) zpXRO}SDXlpIFrOCyS2Y^bMqob094|kDuXXG1Bq-7t4KSBDRDkAI@TvpYFJ=9BsqzA zElv|n#K37C4PCYclZGdk@(9uh&189N&P&)DO=mMv-frm#a`d!G=M9qyR_;E zT~-F_y51R80G^MiPfIyrTu3p#f7vXpxWP zu4ZYrq1hU+S^PRPEn>K%-EGUYsa_rI`+`=mnh?V&G1Fa5H&CUt&1|fVKAC*4dA?&M+xM$E9%? zWyv@>o3gUGZMm0mS(FDSQzar&{0{L^(3ID+JOeJ4(~MZ$DC8Frf+*9Ge94$hf$sg1 zm&u?nAfT>g&n(}mYFqa<_`^e|?uM{&xekw0(QX4x%N&C=D`45z4vXgntH3mp1vA=_ zUbb=z(kxg(OXBkw1I+0)WfgZ@;~`xY%yD0pncxT3=s3dGbU*AWmbkAirI_ z1G6o<_5NEQ-+bFJt?Ms*ePQY3ag!RhYTW>I(c;nL`R^#H^shaq9Rl7Bh$I@txFSsH z)lG8iOZk&Ln>u$w``Qabsf`AosF_^6`7U|pvZtGcY#(XcMs4#Esn-wfN|B~;7{|7< zTbo+d$xk+u2v@sdax*lCA7zynNDyIF8Rc4~+p)Jd9-ld#p@x-k>#lS6K8xbvmCKQbO?eT+M#Ey`k$Cz_i1NAk3|&rwSN|?p z+ejO=;0J#&|D&Jj{m`%+=`Eks21sEqRrp258c;G`Q4R%y43SCLn2lx$@y+h;QXJ-# zSt7hhH!3b#u0&_Lg@gHUTK_Zc!oA&P$;C3vEQ8sZV`~&e4*9s>qjFTp)I4f%9kv7M zeM2W)QWTU6Rt3w#ihB_dJAg%mGX}PyE)|3oJ5{hG;xv|GN=o;XRUPjSpMB3D{-a&7 zzJtP2dp+X1K(M*zi&kBQXtFr1^~DX~;wsr3{dH)-N^(yzCA>S@?!^zSnv=rrKk}7i zRGwu?l={6tv|wqV;9VRXdzTSimAW!>{Zh+ z-g)PpdcFSs`|mF;q44VT^z^H*zWSYSe|xVRQL71aZjx{O%9r5X{FmUJAWJW_6wnNV_(qmu|r z+-IITO`pBq3llI)z>ID+YxJ%6i^~@VSw=D}|F-Lu`rba^-L7Co9Ko7#nhkM#M{}KI zzLIzzY#F*^nxZxOICHM2-e7<$R@16+;OuP2Phac9X8>j39mgWK?$D>s^Z>OGI*C2i zG#)$zLoi%g$O9j~=gv&IYwIjd1{coz?LHtCv+Zh@6%QX}7oG}zpGmvXb)DdsZw71Y zaibRh(f4P6_)~in>!y879{~}DD&;;*<0!~P3sbi9kRDv2EPhi*o}#DmpKL!k7Y=h| zYI#kJTszkdrNM_r>8}^<|D$D|5PSqgfji=OTUuE9BrQ6Qw#Q?}JJu2Tea1-aa^3Wp>rBW8Z@;@P~)p zIL@p}B@d%oy%Kss=df#5T&GflBXV62dj0vP1Dn=xm~ZTRX+9~`lRgb3*Ls}hu+PG6 z+U^W&=ZwaTHG^QlsnGQzRz1YWUQZaACwTX%*Y74DC_N92|d{Z zcL~d`KktRTP?AB#$h9xezhjL);N9WAHW(-wkRuUVgt}Y`0I1YeDK#s^%!M=b`n8T1 zup$MXHZ?QD-+U*#bh#UaA`Q{Pot|nP9I{$%D=qTaN18S}Pws4Jwj0k>;$auoxL&m# zZGQA&WM9jMoi>(Q=_W7)dv`avbiLbe(;}lfuh;7I!@KOl*>)6*1a-rm`8jKCT@);s zpGmv{TxfN1zPi4};&^cO%n;5C&{V0_z`k1B$j_bk20b*&;Tr0-@bBLAA3Tg3_4tqf zaOQ_Uc80O08$yc9X+SE3$_b_km{di%GG!`osXvc&ObQdg1CSI<%kxYJ<5A>s1}0?I zD%!Kw9_{F8pa+w{H%bYvu2NAMkEGcA&K*OL5 zyaN^=oCvmqobUj)k|NQtldMQp7+C@mT$HZKOg-s;#6YJYr3V5y@iWWo-??}ThGo#r z_IJ`zOh*YB`Nd9;2C-(F)T&}7>rgzGusNhxXbxi#h#O5<7;3|t9e>b#)3 z<+S3ctpm;pC-OU{PBTuGU^E%$)jZ*MpR=BS>->(8q33OEZ7X?qB7GW;>zrO$0rOGy z*e24)rvM0MFI>Rw)g8^Af}QragLjk+y4~0R_Q!|&JLfN5y?Eu>-voB$$Frbj7ux4F z-1sEk(R%ml^Za0s^#-cdY*A|27P8VGQzEFWp0mJ4Gc2xG>MIM`LL*2+Zn%PD7L^S~ z;_`_giyRT43Y%dh`-9M^2DT+ootWyTnLpf)G&`G_F0cYw*L0J|M)W9hF4j`Cf`Q&~ zYq-r1?u#=|#R#oArk%m|{&0gW&Zh>KjShrnTjbFrSb)XCe38Z23*E7etsT^RI(agT zFqwkth8Fty-acJf0cfx>Zwx(f!G|A3d;3|v9{rm?p8xZoxPyRUQxa8dg+$Bb1}tw6 z>{BUFuZplVnR~`HCZC)t$Q2fRlF%TDmEkRA*YOy7F(d*gE$&Wmn>noz=9q@5s!i4S zOJPx9bETm6IPXJ|yd&p?%0^c5=;QZFnG$Rnl&1^Chts~rGT!)*-@(;y+kPz*fL8EGLLgHv8L2%GH|*Kg2mSp+_|DAyEL>_Z^iwcufxPDFV#9S9=?t>%wttioh;r4y z>`cd<(YOPLGc?$dU^c>@H3TyjfD$$jX7U6zKE=@njCl8i-+lV^55PM$ToWMx@|kM< zW4|7WWqejF;P?gHy8Gzwg?Hr3@NR44;p@NnEBN8XuYYT1cK(a?0;ou9Myh>Yf1yvr zD;RaXtJm%Rz=;YBmJJWEq*G+BPEcnzkJ2PSs=zeUX%(82phG-O{5DM5lsg9JjmC^= zSXR<+63?<~QCg7E!7xehM~){98IDBP6^z?Kq>pl&QCrhmoVl{><}MI|c1ZDW-v0DH07bYzr+FP*9mpc3zc>0lQ%2Bo%s0?Ud+(SVa*Oc_5Wm9F61- z4XRqev0y6)Yz<#}L7$pg{+qWsEJ|5wYQiF83~Wrx1XO2H5+mLbTBfi`&!sXLmEfP! zi$_0`6u49obk&9k-EC;Tg~cc! z{YXowQNYm+VwnnrQXd|myO~W7>pvr(&)!+wi@7|6t^e ze79C_&CC{omwFy*tLb`;qjvJfK@cW6lR*`RTofg%gCsTWh9G$u^r}vSbBoBD!Y~}h z(NHQMVpa7xcBZ@zI6{lF701+`;N8(*cd=LqkdsmHfx$(Px)TN`Wdzx#KlX%P8M^a2cKCvsTBoE=7PL0qOabmoE?hAwKVgYoTTdq%#W>J^O+ zG!{y`8nFd%M^lYW^D^0jN_k~gYAY46jsoEXw3(*;BHfjx5yn^ycb4#)G)ZYi>@|Qc z2r{^KnJg{M|L30@@H9YbDHE2gS*a?JT){aM9OrX8&cd}6JaM@?(S-M+`aj)gzV8As6M zEKuhz$Aq>F2FlR5jN4*9ChiA9yD+u(`^)c@^iRREHAeKv?_n9(3N;FB?2E~^aa z^^{D}aYb&aSTz%va4pLd!?p2#SPqBEv4e%ql0Z* zUNSLF6c*<((F&r~9UBj#*$zu$zn=-})E8ix@ggRP2LrkvIrkQlN z0kyTL=HPSy9;ykG1O>_H=Jx#0eg%e{;WlJ-s>-}6ZAO{hn*gccj0?$3C%J5@p@({n zn@`d*G&;T_HQKOBi#*Y(2&Es;(gAvOgibKwxvBcJjU_Bqs6vSmC@!v!QILs3CJ__U z;aK&VQ z59tRvwWb68IYI1kxf@lLWVBT4B-@8~4~H8wXHJd|yLDTvELlLpywr@jOM&Kxq44{; zA7@DxM=82yxCOHyjnG;Kd;{)gn64^BNwU!3w$2LRyae+c@IOFo6pfLy%W-<- zmi+)I<8UzS`fzY0=9xgx5m}r8ynDj$j$U7kcktKU-Ce*h`0L{0B7C6R@2@`E!Pz6t zzc@}T&aPd)@Z%r<_}bO0hlhuIdwVdXv$M0OPoHiy8t=aQuIkPMZ~;FUh5@r;VPRo= zdm9EH{)G=ajuT{h4g2+w67TvF?^b>@-q~NG=Uy^LRQ?aXnB0-a$2)K2wc{ddwcux1 zjt$2!4K2xvAOX&s!CoAvXq2urjHX4pK_PT^s?n^}=S)uBqCW_UF?*%enDw{b&f9mU zYW3M#wI7Q&Hv8?EotbHY#kbjy#$63*6lVwhEY88;vf$!Oo^l4%TIg6%Dch}5QPK4j zLy!d^1-$P^ewt-s(s&ukrj(e@Qc=$rmN9D0>T%qb{`LmI|NPbtVn5 zv9vyq!D!El%#-BBF$`(^3e#`_hQ>|0jx_Zq0r3ffMMticG}^N)pWgs&eE(t-_i=fVtY0iMagi8@(S<_0*w>2sbg=DMHxZu94s1y zOT*sH*hE}*Hj@%nFbI;thY7$~0fv&DW)WbTWjp83U#Znva8l{SAV~(W8AUMVBf!5w z9F3;x0H5>;-W^SmFT*>)ulx7!!+Kv{US3*SI_z{lxVKiQ>~_pG$(q&5i`Sod?bTOT zR#t!v4h92&IiQ4qchl3;p63AwuCK5Az7ME}dQArhr%s)McTSu*0RWyrVZTTMlyGfz z)vnJkpL-@R#BU4l!oWY+--gdj&CHEkOaI2#Drzo_Kk;na!k+^5D9icr-^Mnjn3rQ8ka1E9!sh(w1SB%Dz=1y~W+SvF% zi=7`^CRo#2hG7p^lhw$oIky6_Vw{3E5htgm5Q-=jErjkDPj9`?7h;bX+vXcZYH8{sry`?~aR0NRO zBxzA5_wiHH!|$E{*r8Z%A4K@s5Q7zL6thug4!yz$z!7%pJWsTm3K?V94JK3nq^q>7 ztPmv5qrQLG?(JzbsadpA)t#wXp!`w$Aj$KfF#HrABOHW#?KYqklj)h5m`LFnf)ONJ zGNBL_%sH@RO(7yt45C<<0TwNZ1~36uPM(>Wol`M!lN*ShSr(;h*dsT<`&y^EyT}g`->*CRLZjlimHk1qc{uC`0YFT};0rFdIPo)0 zH{E7)#M5w5zBNkOVR8X`Gm%K&umsS<|SbX#~$-BN>&_2C`r+3E&wQSpS!%L6IlbO5^%7 zH%!Y`1DUI4W-|YnV16yas z;y<08UqYgj#J>sh9t-c_&bocC(;gaJb4_irY0uZJG|Be*eh>pI(FEh6-k6>{J>9I? zdABBprf&9nhjHXF-7#y+NfLw^kMx=Du%AW!x-NWTMzY$wR+$202EY*vn{A)ME}dr) zHn$W6_jFCq2?H3?%2qfk&kch`DqxuxWj{0-+Z{LVmYK9;M;GmfMiT`kbI+iuZW^RA4S3h$dF9}z-MzOgifJxUmSHC#-BPYQR@R9r#kb>L!je*z zjR%k3JZ4WG?_V?i9py!{NQRiv@st#qg=|Gj1u;$6&`lMS6-RtdkvckV08till%B;h zaG)H2%1ekLZZCS8ffmM?aI$Pz<~{^;_Z6}Ok9G)_d2vM`~e2!19&$D-T-V-`>` zH7@#O5uc7w-F4|$xQZe6AB9Zt4?4QpNDz+Nz1@-DPvVhdYqn!_M?yCp**}DG&CC;2 zSw;mvU}a#x3z*k=)3GS(PbE@$l;?T8-|H9Df`^_&eYm04?9#b&SDD5YjV>k*16eRf zF@O%cUXgeY^K|qC?hQ z`0Q^5??{@Zy>18gYPV9wCZC20S0=r^p96W1$?s?p=dks|bYyZLrAAfA`v+WOx@FX6 zD$OY?IjH7sLo+I;zDdkR*x!l|?~49|mTN3e&-C-g8=JxIz)RB*&`me2c7*Lk&z*VN z_eWL3aP#3|D7J^A(xHxQ4ko;57&a>nH#Sb`prv=JY)wig(4*EMK8cCf3wD)UthG%q zb$K3Yyq=pgf@QpNlABdn^_o>hutnM9jfkb~2LnTk=iWXA%<#RBSo}=u8tG>i`*0NG^$LE^}PQZ4>3SqGc*-M*sU4KCF^a z6d|(4DH{fb7m}#paiIgs5nlg+TT0K(yUT#>6$g{_0u?lea&`SaqR1~n5s7b?9w6;v`EmWk!A%3 zyOPK^b?P=+%gg5~l?Fhjjy;TZB>|}BfvoUg7ao2jr{k;J!X}{2;oM!Q0$^tYgwtC&uCoaVP zaLN#;=H~Ao4p-ZUSZanKO;W*ZtAd@F$IYz9`_ClPRZNQW%PM|a_9Z=rIrzW5k+tVl z8Fq=WbKVjp)SW5rOk*N3;GJF93~Yp8Xqid+eEmP_U=0;C$aBZ8VNJrgZ>o|aArkA4 zMFfs))UgPds(?5`UFGT;ck(I?LG=~1+|y8CIHdq`Yaw{?oM?FO8ke^@kzPSQEBpQk z6aG|)ILCdAYhzbhNh*~p9Z_dPhbH@@DDcNZP*?ANdvo_eRd z+Zi1u07ShWa74?hryK1%}A6Tbk^O$+VmpIptC(C<_Mn(kJ%pvDcU49iSMjcOt9n=jP_3IPMQd8rKJ- zVH5-7E=*m&aQ4*dg9rQj`!JZx%gYZRK7?<5=R4o2R4RZsfBn~g4L`j6^2^}XEww~Kc~(tH)fFByPtVyyBrEbnpi@2YmCVcIe&LL;y;nXVaC zR-oYtZ`o$Cc>1*H>};;C=2TyN<_{>*;+?lwYKC91_qIo!0G5KSr6bq0dWkk1?p-=@ zwr2A6-A9D!)3wHQ)itUMced8I4|goxfc2B0^GsK9gRvwp8>f7z+BF3|M??evksv50 zn&?Dfkccw2)^DbwMp={c3idhxG_fjh2C$Za+!-v@0TY~>urOh>L+*OhyB% zmQEfvo+Out%VC`Z-bFx-@}%_YO+=AZCC1o~s3OY@^LliIMNCXlDk4Hhyn|P8wy}P` z*{+xc#SjV!auVfQZzzHgtXjZ3J#(%IV;+uW8+tBP5HM;X^)S@VqDiq9fpJ@$)};{* zIG(G37JdN!OS1T&yVD!&V>ma{qX0{!XXj7Dt`i0x41#G|j$5r%>k`alHy*==e-w*! zY{#lJMG;ePo25M%7!6r4@D8)!R*c<%k_Zl)@hBJJ@WB)R-SOAs#4GOIy9cnfva)je z^yyBo|KJg7pD2}16%`$c;ST?03shfdi2X*{t|}t;>C-1 z?%aV>C;=!qV6|F>&#RNxrdGH+E%iRX1n=OyVU$KW|3uTy-~3XX6j!wLbqH8fX~Z-W zY(y#im~-6(d(PD!1Me)#z?evcmFBdF2KWV|#<9>dGPI(`)7iQD=?kYuZSQdXK1}z; z>6UA|54y$8o&F$9T&D*13$VXgNAr?=Yky~PW^uaS)I>JZ01IYjl##pZcY@(T&9w)S z2(lb5RK+M2z9wPOu9m40BQNs`}$A*5? zv^CVm!Z%1|hPu<5)8tz}A`kv|Za9`Ic#xu)VYULiJG; zr5rIni8L*wD**pkYDSfP+T?r!ibo10-A*Gz89Q=fsEGz&}+`4rO2GjTbUatqBp_(zm z(+9`{1iXFw_K6cGcDA<{PF~b2vqyOM8|o`?Aw&@zt?W#4>@VtWe#2d261}Rok(p8j zmEt|p-yvXA)^%QWoiEc1V9WpuKIV~-l?Eu#mKMxJrCC#*$`HP z!kPhU2X8nH&2pJ(YQ3BK>i<$PaifqqYvNdiL-`9Mz?d)-O(iFdU2+JE0Hc;}!+6J8 z43MN0NplQcX#o-U55Ww@m%0P^5jMJW3Y6wiWt%m{T%SLaHW9kv>Lgzy36 zYnqW2*f1!S5u36LI1yuVi6euaHI17(cB_>Qy;93C(Ik~6S(z;L57IbB#)d|NqXiD@ z(jo-*6~t`hOC17dQ8Sw;?<`wnl%}~f?hA~J3!uk9+yL@)DN+sm(ZC>=t_*%@jL;lU zSLQHE$rEa8IcLi8hV_gB_?}&#KleNlVbt4BqJRU1L^D5UVOx(6GaP*m(>Y?b)SmMb z%tZ>iTUq1*kP0b@1z)LG9lN!}tZMsUBM6@0-LdujWq5~rcHJ(()9mal=A-QGzwzt$ zGb!JTPcScLrBiLN!$%+P2Ha_Q zLHp#X!~Olr-0aJvVLR;aHY|O27&fPt{9$`A*hMEd=2?ZOr|R|ALTWVE_S;FCsdfrS z?HXulqS7++puCBr_OGSa45cFwU@@2m zCXoZ25^P&tc;oCXR46?yWgbeJ{%4oJa_IUI`l~DcZ@i}hK+F)4_4Xh<>hXtesjTe;D&ZWp2SQD@sErUOO zX3i=?K@Hok{(7z5Np%E&Ji&-c)P3$YLroLt`yVGYY@jTCrLu z<19byclX*Iq@!cbR*oQ@XrxaX3Q92}p~47k>@OP^Iw%1bmHvQ4hHs6kS#A+yK{KWq zrtjNSx0wm#4pyASt*VC2vTDnjR(*kQyNqUxc)v zmD64#f@09cBn~SxV}WSt=nQQ&0ukX>&1ws_1lSfZMMcW}<%P<%h6@wwF5t4j zgibOTu{^R=Ir-Thfj7nl;KPoMr2n0~6BEa`V6QO-Ff2Z9Mtj@tw~34XGyhCkXpGi6_1u40*# zQy=*02amc_OP5zpJk#l{-}&g5ERW8ex@Z{I#}96qrn@+QVr5~;@*Wk5*B1_V=T?@V z8hHJ^!_C894<&9TXvrc{?Rb%beBrL1k99W37e0;>sQZ#S%ks~fEIkmLqlOn*gf}#E zfpSMPYzBk{>{eY04V%E&3X?^e>6rbu_}(w*n5Hp;DIjT{Gwf}O#vlv?7J@4MyRq&t za9%7FgU`T$!0Oix*bZROWmYid5|5fwQx~p0Hyru5K6oPty}3r?^0~8_rr%#*ANKlK z5R#$fK`JHhT6Wbo>_iG-k#WH=++f|d0BV8OxmKm(R5N7Uk&GUw&X6*+A)ix@-Fb^i z{h6`@6xoEIMscWd3zgZ+8L826HEbax`bCil1>HzFxoiTUp^3~*a*Vm54vi*57G-dz zOafNADXkWL`b0zyA8u~8{V2;BGi|5h03kCnz1hzyp)kB*Z+~~&_lC0-ypC|6{8?S^esf1A@+%Ji*4n$mAjjOEBNQnU#zn5ZOi~|psU4&;faHW$4ZJWm7=dk;7phPJ?rtxr^#YeLhw4)ruW5#h(HuZM9gH<* z@J!8@9Gs|EWIaG5+BG%Duo^hp57+mG&bW3DH87G_CB zHvwAwBxRaqnCNGfeR*apc9GGWC^&0Y_m4mPiMHZJ?YLyq{)? z3Z$k|_6qnKN9p593(0Zit%MP5Zkr{_y$GlZ3}30gU|vB*1HMVdtVbZE>5g*G_Y@;h6+NTyuCJJt^} z?8bwhR?RSVm~^8cfwdOIGD%q~^o$dQ@X^0?<;=y!+RfW{9`!S~UVDOfpIFad8Sgyb z@AL-n(1#vON!W#fL-8x;&)&TG!TS0-jO3+DmjL4c5cl@>Zr;2JV-7U!l~-PYHvy91 zK>&~)4wCBBa*lcdzY*^MydFJz1V-zpE?|VfGGeC_(73MSSj$n z;(ebw2wWc6vjCT0#P9l}qSH-u%oNe{EIY4?d&iA`6^S<`fyv1o+ z;Oh8rdoYZPH0;-%%HrbrN^S1p=Dp6~;OyMoEn^s-~lV*xk0fA?Xjpx!I-N z{Y|jKz~od(b~=;Pf~h#FCKEWos*dq9n5<``CRdgOaa0Cu1)Q6j-0<4}nqGnEtE`e4N8Lo;|G8JDG?Xh*DWehF~y}xxmC1kzv$97--l6$pth;5k02j z)$*H6R`pHd#c=kyYV`bxZo3yYSQG`pVd7XTmtnwxD-hir?rbJItF{3~Y-O0+qnP;p z!;v3mLNhedv^6kP+kO_qXLZdqG*hEG{HGcwF)hlF`gw_}YNyN7^&98sH@3DnyS`Ct z=qAk7CwMnr&tDDiFwMBvzqh`rS`HVohQZSLjjLDQd+)u~)m7kk%DDyy?{qqVRtpOY z4<9}}bLPxoFn~7?4-Wx-7EWHA;2rj#?MuA-WIhVu6d;f4_4B2YC&wlBKKuTsK8%F4 zUWbdp(8F)SJFF)gWQW~kX67WU>u!5(ZvN16=-$rM+}w* zl_}IgGo6f>8*QXTt>&E5IML}JZalhe(%`ANmTpx^b*0*v$0i!X_h(G{Xq4Y>=QE2J ziY(dLdz2MuhyvUgGRBOF6tJ+7<49`@B^z*?SL)0de^!ZSsB+FKmJ7I)WC?6U0Gd*R zji-bhM010rhT?3z!u2ZCT~rd4NnYG^z$^!fSC7{0U~@FMlZ3l6t%OZ9g$;y!9jjak zQashaLX3O&sPYfEHXvhwKYhP{@!};gyzkt-og}akIdk(1v$Hb`b0^_~8;xoddkC@37O=ctuVlU@xJL%`5USPb^8m;#_du2FROu@y2qW(pd(WlmS;ua)DBM4CU=4 z7?v$F=_EmisvKaYpjAdx#`Vabigt~)1{5~p@v{Wr1`O>8!IYYsVcsZis~$Vdags_&YP=VqoQA&GpBjd@r&Ka|dTlQSF8&@fyB9(v|Sab{MZ`0tLt zzB=9=v^($JzL#RLj_NN^G%M~)FFgC+yYDJQ1DL~#F8P9U0p6{xt-<*BdOa|80s8=D z=1*KW9-sYOyi*Q10J~2`8@~DrCX4D1`Pm%iPuR0z>~#9VahgtLYS7;n#SWuU;2V|N zspizF3>EhVox=xQRtV>*cXheG*f2+NI@MYTi)xT-PV@B6{>Jv^hX#qx%+#1YlbOw0 zeU4<|biO-BhYn9#Q?q}5b7wm=s+C%|dx$0&rGsEp91B0IQDJ2hYdJb{ZA+QQQYq5} zY%sCNzsPbg^5xTFrfxX4(~tPwPF1j~rZ;rGLiHNsXgYzt#4T7c+$;vQ-n&II-Qc!N z29(nCDq5gA#7RU$tv_VAnE#8l#l=woVO-X)A|Yj`o^d@KA*KAvkv?*n9!N{U7ZhYp z0!yl@qPHPOd&We$eI2WLF!@{4b?kUsro%`cx?B%0Oz-{Vz5STkKyQ2P&QtTw#U^7S z-}bV^ZpHm>GVG)|!59r-ncJK?d&6j)?De|s{hi@(ki}szJhVj6bo5k+y+HzOE-l7> z^06Ha<6n1-*_v6mbU1ksrKwdBPw?*8>nq|N%(dP9!#95YK5Qp!te7&>Y`pZsbKOqo z!Gi~I%+se&Z*6UX>AJME1U9Mf`^vP0f8ouAh55l?=*8OceB;l>yZ?X2=eRvP^2Bh& z!91xpmJGx3h6kPYDy%4AaIBa5k{s;b zt+05Z)i5e^g;AxNS=Gf9j~3?6)JzhE)0j5b0z(TY~Of+>TJT81-Fb z!Z*q6TBX&R_6FTry)hgHQ&Wpz?=H+Ob-QiLs&G?(>sNmXgWPPkMk9~%D#5IjI8Hnc zhr&$h4EUX6*s$3Vm@0Ndr6rciq7qr8gNrLqnreor2v)B0j>jSebeyJm)apXz0Zvq{ zu;sWQV;|fR<&$qxUIj+-fcVNQTEd9c~bGlBmH0ln*ftSWIq>^#hSvco3W;MNnI(B<&ek!7r0N{E3 zHVm($Yc*Q~659#j?1*~m_Q&yYT6fInPS2A(-s$v6rNvDXEPy9?H-6M#)qfX8QMcEZ zO$+c>n1jG7n$5=8%_1hc?Gq#PQ$NEJxp{j-bIN$dKVG~Gygcw=P8YzFs9fSjkt!H6 zWJHFFRQkAKM~$S3#L&fDogR9lB=Lc5)T)(vzfNgr7u#@hzXYu;ESnanU-|*ylsjOBc4nvVObhC9osgHzBh#D z1{@8WS8yHkC&E#JNgG5p$B@7u6bo2;+O3-(TsU`iW_o#J zYwgja`#LvHpT2ba_UmZP>@$L2^Fpf{oxK|eK zXXlS zIc`-89H&~Dxlo^4Y4^4r8ef~ET5zc6QKK^Ti+j88Z5;^BYPfYccbLS=?{>UAmddOj zZLEzhup)|EGJBR`yaKBy4W_wnO)(hR5Jv#L1d7xi4RZCU1Q=f=jEyieGvQLr=G@X) ztkcM(z9@X#(!uPNK6rH7<%nH58%H5gu`Z2gYE3v$Z`74aOB97giKy7FfucrK3d^M& z6V_Ok7w4Wj+nSzkcf)#ZdVOQHR&AX$(8nVOltL-B3HKyh1wm8y@QxRZcrqTgS$pzDZvU^)Z!O zC?*O9GR0?-m_BhJP}y=wjCDidofKo=F{dcSibO9>k~{@Cb`3)vJSm8wYuCZ1@ekkM ziWinoR4XtIlA(XQ)y!_))UzBYYOWEwJX60mZ`5ee83t?J;vg|{&Gdb21kPoaohjm) zt@GAXh1E*ZyxZOj{6QM@L>jm{iv9a((GT(@FS9V8TAIChVt#jj%V#ERxOx5r@5ME&LUR+HsuYgwB^Qc%Mx2@1#D;KYF}t`@07ows+x1 zj+)w-cV=02$7!I?8_lScNYg2ay)5-~CYwBSy<+j2g#^TIEJv*3RA*O~&+qQt6>)#j z@RsX*$|zPh_kX(D_i_f{Pd7_DHcNg^T2+LFozmchXo zHvK3FVr=N+*e;NcVUpzS0AE)?E3UgHEPOsFe z5!j_k^!(ZB7W3Ep`FbzugFS%dX%Sp!qd9FFC?eIGJ;6*jiL-v^!1G~(fnkmEdaOum z7RIu?L=591&ctk^apmNKH)@Bl6YEd#?&$T^;}tN64|{!>btBl3QgmRLI=^)G^xE25 zzu%vpo`%6xIdNEiySG=VQ~*G3-n{wBE3c?R2;lhp{irc}>XY%=rBf@5pNn^s^yc5z zi^g35R63OrI!ru8CdL8ubk3{Q3YZ>d zWx;f6@ReG%9)$gFd&ln|Tt744H0j^n-WaCLF-*rav0I?*Fg!EG2r~ZSsjfq7<;BW6MtVyGf!b2>^0UZo*MjYAxDQrRyAFPQAsH(I}WQ% z-)&9alq#s0Se--`78j&U3sjXSlPIj}Qbbh(V+raK7nSo)J$rH#&nWMGa&TIT*~^6F z1h9_Fq-;RI2%Ah4s7Jx|+39?~QS2TJR=3*B&{s~b2-HpM4Z6LV*=ftRcenRi)2(6O z+uqrK=FFna@=k=NFpN`wFc^*eA}`?C&Cf3^EG@&`20;K2t3_QPm!l|8F!?xyO)E-r zm}jud!M5xtA}4Gaz_Un*>(D27cYHnnmhw?B!$~$E1+wOv#R8;Fa_#84@Xv$DM# zD+|dm+m12b_lKhh_?I>o0%Zd0tF*G1Ue?=UlZ|L-O6D^{B3aZd7Y;j$A_L16>a?sA zAfyBfLXPY{BFmdHg8gnZ0{_WA(@HgG94)1#T#5>v(vn9Zh!e50v|{SbMsxA7yY=wV zZNO>*BM^?HJ_2Hys!PLBjy z8H;5iHAyl%CVhvY#|dRg}}sQ&WsDi$XJpds6E52 z1%pUYnq;sOupA!dY|{k`ztin+?RS%0=ByZ4qB}D;-I{7XxVr`i84P_(BPZ%sHwJQz zHM*$!UF7h{V9j`=uu-v2EH7JbbR?(Qy}f=J6( z732f!0Svix>C)!r=JL|gg9od%nUzXw>5KF4)C(RK%z-!Gd{cGF_=>kLWM$M#FTHf? z)Tz(E!Q*(BhFTornki%vI<6S%XF1O@E*(Ue0amTfR;zQv;a(IC$YdFzr3Zw`2>q^Y zyEC)P-S(C@>YX}$#j$G}8y|Y3&dT&$)2+t9o6@K#L$T%h(l8eU@eY+dV9iHhHl;G? zsQNZA6<-8?*QhoDirfAW&C{}$7XQ_#EcBzQmzeapr(qJ0bXkK5Afhv^;Z)(z!zip) zT9#2&8p$Zn3E!2>hGD%w*N7%XIx+4EFb(VjRnfCF7n#y&5m@h80!1M$TUvI4RTd)F zcr7i=*D4EfDh6I}ZR2CZa$qUu@gVj_nqDbe=1Nt9Ao6VvtJgrOl{D#veojQqa4ge+ zivnbc^1`-ihGC5phE+n2X2hNr4Yed{c%2juC42OSg63|cFr0!LIRKwoL5&1db}3SWOq0wmU>}+rDkH-BN9}Dl^dh0E~JJllNA8gwyxP*TJ z(;f%!NRl<k8mNae~=xaLrMgCVA@Udc|@$CtPQ4rCF<2 z2cvW}QneE*&krqS*@d=j`c+7gVIsqVxomP+rsmQzP^I9HF{QmZR-Y%ruz0oRq#@ne zex%C;u|{iQdS<58aBuzkwbJP)%~RAaPJzXSHCVe?G%to>FiIjr(_GWiB%GtV6w@8M zD*Jhtu?RC9R1O}HB!Fw-vhBBQvWr)k5t7PFi#48Brt|tN1u{#<-7x4;jG_$MN)wkH zB_Wp>SK7?TTnnW?C=*1nJsiO(M6ui$JlxqICbTs(bMnNpL9=i)7>@k?uIC4VthUvi zisOy^#o3l!1c!be7aT>{;jgl04(0$%yK8gCO3T>m1>I4U$jaGFdJ3?<81*j*V!zIl zLW@W(*Xjl3fUdBc!fv#@GW-9r_vXKHUFo&hndhPAy7T2sk)qU6x20}KZ6~(#0vPWB zL4X7X{CobWAb?>bKRQA1oWOptANu*ZN2^;RMGcfV-?`>G^E~AH_C8g-l+@i~t78iR ztJ&1$y>+YV414YMO>1eITD-)&)#LXvKO2N0oyo_4*R>=`nx@eXJLcR-!DEqp2mly3gZ=p>+Q}JvaM+->|B_5(BJ;
    GK%9u;x6#*klSlsXS+BBg2Mg>HrmX61cF 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 diff --git a/docs/reST/tutorials/assets/introduction-TPS.webp b/docs/reST/tutorials/assets/introduction-TPS.webp new file mode 100644 index 0000000000000000000000000000000000000000..a93eb473df006f4c842ae2755afd85ec769cb084 GIT binary patch literal 95120 zcmWhyWmMEn7ys|lAuNJ`N-Q1H-K~H$sDRQaA>GZcG}0mQ5Gzt5(k0T}9V^`+9Sbb5 zz`nloWoEwIx#yla_x?g({l$wY4-jDZTuJwhu7qabzcYV28-_G(7YEAV^u11S8g&Eesl(j&a)Q^kjf z3w^>NB=;|pL>>r~>5~d29>O;tqM+X@4uW zm#xtf9QAov$Hce^vtlz@s_%Qr@xAWap7!fkrG@!lCH^8U6dzh5MBv|*c;yz}hz(DC z!jAwfIT!qUQi_@g`s)>Tdijm;MXoR!5nyicp%1hl&2K?rlH9bZ-A-Ox9TutX+iU(; zOGOL(BHFKtS4<{qA_@u)#M6sre=$v!5i^#oc1^_`6&}c`*z7DwlL)&hEpm$uTgTUJT%7h&WBhV&)L)BPJJxbn=?fF>_)%XGmwx}@ zPU>n66|Gv68S`kKA};wM*b9i@;o3fP)%L|pi~a(Fz72;Pb{-NCeYNB#{wfpKstC9x zr7trx@^kVoh=~T+dO}#E)K0S6J|H)+=H7E#GCJaHVNhmr<})a{v(Qz2VVPsVqMAS9 zH%JGS{By4cd$Ex>!+OF<8N+EzE1@;9wWh9%B0lykxDUbmMIH{ z;kAniA<>Dec{(|AZjyu7*Bv&c`PEh9)yA2yu5Jx8ou51eqMD)Mh4T`sC85#(_O+E) zYvm7EfyI#UN7)hp`s9Fd=aMZI6ynN~(m|-J#_GBXfOB672c|w7Fz6h?&Je=c9Ol%v zTLOe=LHPJm#`w|Q!whXQAc}8@_BlSnl~6b@J%F22u>(=2i5(aorgQHXuU8eD&8Ht% z1jT{1UCY0u3M%9{UOqFVPp)u}KI#mI(n{KPWC}-fX=u*5=gXw1AABN3mmWN=PEDCM zZBl{k6<|MC7*2G2EqMFuj6@MyV42=neP8XpAnYMp(`SF%Z}jHPoyyCmY1ngbb`@rj z!WB!ww)kkb+Xp}BOegQjC@-+S+_ z4Pi^BTe;9_XvS4xG*7#BkmndFi0?($((#)1v2pFu;{8qGah#A9frQj$VM^vRhUn!x4{XmiL?NmOQ<+{P@Nu^KA#QcUOVIXWnjgi37NX zA-Tdd6edLYmw#D+*e_&4-(L^yJOB3hqP)$yrCT1Vu-M!he0-+mfAz-CtugouL+edJ z^M9E^TA?aq7BF54=D)jh`5nsQ0Xxl!gly9iNOMAD#}mO_>V}@J?H?__x%dXxo?rSi z|J{;1Keu{Mh|>if2moeU>SjK*`HLs1ebj#z1gV3hQ$>gzGSavG_N_lSHmr!*-vVS= zSXhLkyW3rzR=V=vmb#a3eo7KNch$HiU?#tDpko*0T=K1=W2PTT7>?c3*GvdYB^8cV zZ0>%^jE5J@qNx~pP-?OuAjqbXtgK$h&82}e1ttG5!=s)@b(Wj(EJoSNl49h8e{>v` zJ`jtXS_uXYpe_#<%4kY>1|Cu?$1_EGJ}~BHu^xS1q-&(d$z_mBx@8ynA~e!nvf-xc zJPMsuE!UUI1}z{xtBg?c>t@+vHc|Qe=6iT&1Xb3b!LOv!cDca&V5m@IaUOwsfnY3d zf#g+!>LMic7p203uLhI&Vf0Uy;vUhhwgss|a3wyYR=Fvdag`;%FdyG>A6~rSW@1Uz znmdS&cjl=JavF;dHMx3Oln+aKAT^2qU!@;b-H#k##rs`4ZJOG^w)~mj{`g0W1aeD%GptIwtIw(bd0w)&6}nKUL6H4nqlcsG`~r{4uX5{bT4u&ap*N=s-*L%x`Dg zviho=g;CV?@+9N*g?dm{X<5nG+Q+qt#hJxlRL_DmBYT@avpuV#BI!yV-zy>W4aR_U zics29)53=)(iQtfjWfeq20jbZhKSPA!eIgNpC3u8?6k~l{>;AeGp09Oe^qN`FJV88 z_LONjCAHX~`O?t5#YX#m^*_=VAy79E1Q+yzIPPSzObK5B1Q6rlg3ynM6#<~9O!dSu z`D+1dl8XMr=x%&aYxz_Ge&05yJ$V=sl>sDvQ`39M744H$p!QjQ){lbirPV!c zLbo~u`i(#U_vVpmg1IUK*G|&ve7*WYt^LBeJXkGO*f-0O?(6fE0^U(7Cv=k!a%Ws~ zArjyu29_??F1nV)p4b1?fW)P2T3(j<`0(1Z2W3+I%{(|b@|X8Vrp@|cwI^c{%}vX7 zvQ4)}-yWR3S7(VQUr~p3x*d%k9I2J6E{`_zPcUZ<5C5sD=b!$Y@YcenuPGkQ{J`aW z2duX6epa~Y^62L4_G$+jln7P#o|UEx@NRS%VptH&LE^pL{Jn2_?EcryMhj897W4?v z%4WY@c1qq3C!csyzu(i(-BMZNfgzF~I3v)8z0;5a_(WYre@kYoo64B37hL z0eDX~FZ?9ICMcaX7>~Ht$ws2umUTh6=G&pb7qXPU-ziQ313kysCp5LaUTiB>jc~{^B`Y%C3eLc6pb`;+Z zBtm$1_Bjc&U%gJ)XOJC!Kdd=j` zJ^$rnabfa)oN$Rj5AG*n#XXFlP?wf9Si)(+dA{Ch_pVj{<#P{*7B4dEc*)+) zYA+|cXO7a$kNxh!ss+rp`x!&CB9R!{rI9a%smB^W>$b`0-q%gcdOK#B(D(V7A!j-sZ~w&e$v#dAPr>;eh;mKoh=uuP_#Fu&a~$~TJams+>fXNe)r8wPWl^cu=d27b z$}*RHZ=|Uh!JJ516+KNX3Vie%LTCS7utvnn=Fe~d|IxRCC|92vb6;|Q$Avde3+`|C zt&cp8f@tMI9cwS%E2e!GV$qN*Qe_ALm1{N*54)}%$f_b))sw9k>aCBGj2#Yx_^wy8 zJuDy@;O$s3e>?fnYYcY9W7O;m1p{Tf@xrB7GOHvSgTan0vQ$^Qbq^0~a(vCvex#!~ zFQ~E975h5#@tVygHt3kS<}Gc2&U`)ZLcRLnZ+bK)h+;SMb-40azyO5qwUk zwG^E#Fz)4p{vLH4aO8phmxaSZ{nF;-_WX{b1Et&ZlU3#?pWilPkIZV28GuHEQ;QQz z4hBTU_2p-^NsdQ+S9bAT0*3K?&z`*0V{}4Y^Jg}mw-M#+Tkj>yd6Do|wwvwZ3?v>+n^#K4BK2@rHVrx^xg)4yj&)*6CB7~o^KQ?9MW=pe7gy_O>IY^zHu_ljRZ3|#E(?9YP$4UAN)x2!k?Fz)ZWBW&JajlAZ$y|yHM z3ag5xK|1`7RXq;y-*c??JNKi%hN=xA2X}2?vBrpz1&z|WcMUpu6%Me!FWiZYu7BIg zFhuPR?o7#Eibt!rS~ljcnljkVZg}U9rCr#UJ50Aom2df%_&-ZZM-_8d%(?Mi`{%#2 zvh^}~%wK`7BQZ0=vnZb4Kit}SGkQB;;n5dKBQuwPDN?-*O2@1Yb7i6Zxtn}TM2q)I zh8#zmMJf!lM8l7_P!~31JV5>*{;xGp5x!z-w3I=hH{5(ykt&W;tFx z;RhFPCoyAGMGcA1>*1E3l0m1I{XboX#*B;w~@kN z>-c^33Zc+ioAEl9pkvXx<3FDM%KJ&m5d)K>S=&+`1363KqidNp+g^+|TfO=_^*f7S z@P=&TcMf1jhiJ4kU(lhIeamqxYH2LU{jhU=Jd<_#q~8a2vZ~eK9Z3)%>z*~W#CC8Brh!4KLR7ID!9fz7qCon&>Le7m>q32fws`&DwU< z9yC3G=Kl&3+h%k@wxsQM{qc3({<4sjvZB4PH1F}SYoT$!N#1Sa&)!qU>}-$ib0-hR zw>z8pE;SsBstnD7be((a<>J`NVTXFNP#B}8F#q&j)`(vssY0LE8)WB(3-T}>nZr?G zjNBk^#rB7aAKm00uUy(P-ud5e?xWX#`^ccDdjci<0`IBh*BMWAuHFH#(S_C^UO5@E z&9T;7Uh}&}er&H{nP>3dYp=$Uu4f!NA4}pL?y@h6bSiT$Fz%f!E?si&ZDkD?r%wFl z@8oZpe9x=M?`!~Hj<7ws>ZmO0?WMrC*8pmd0mpT#+dD7|1H;N61;Scy4o{ts$fx{B z@#7%J93RcG);2`og>du2?w^)F=9O+OZNA z?<+GkW3fd!lZx!N0OWIB>fpR0cl-vJwa?#^o7+iuX>NSiB$}izE(;sCMI`d>+ZX%A zsyp!WY;(VjcfrDQoAfKUMLQP;$l#vhAm8A{d*9$5ZN3%H0auLc=bbcCB}J z&cXX7K8TH;NYvC<^2*cglDRIO(dHH%SaZx+z~$#1jg*6@=5H8$Fig@rJeL(TzIW-@ zT~9e+tMRBIpBCvA&$E$3YyReqTt;-0%dchf;eF|Jw5j~^=~{YCg?TG?LV)t!a)XA;ncMOD$9w&UO4TixVLfq)i^IDd8id5%XLlPj0B~KsSZF}_?e&VMxdfo)?t)tn z5AR0<1NU7T54~-6;9mwjP)V>mx0_q7bPx~%nJxU)vR?B5X7j^vY%KDq#&52n&8%2n zmo1cJOfKja-P#r`+j`T58eQ8z#Kg?vU>TcSQjm%dW+eiccQp?v^dO8%+HrD3Sa?m+du{72vZ$`aM!-*2VdT`HU3-s?Znlm(Q$6+?S(0)#s_OZaNtw!nC zv0RdhyIcS3zNS_ml-F`vjkk7)Ap?VERJ;w^YqUl0|3%%2VuH`kuH5}@2G5ej5n~PI zehZ^_e$97Paa)|+e07&s;d<5p6NN|#)~4p7Z|@z>@PTJ#mbpdq3(5Wd=GQiMw{*@{ z5XEeh-~liF&f!*<>|eu_XRnqy5>TrtjKA)Gp>MAChFX2Ib=u^jo@6=mdz-7FQ76oF zW+omNhdJ4{KD0+cmKS}Uhm37FhBSHwtM}r|{#O?l57PUPrgDrK9w&1vSNHy#OLuW& zD>=UCmb&Y+p5B|Y^Fz%3Q8OFMfhdMQ(Q>HFmmDZ zPc}c3y6lu=^8}%Edj}3`b^P=+4xOdZcV?|JX^1xGW1sVzYKLRL^Ic@c+|8u9`sGhk z`N8J=v`X4muJHcPK-?@x_pc@gA5&Q#%skuBnn6Y_6mK*xF?3%D7lu_t%A*T#TWZe)(g3!_J*-+sNL{ zOhMP#P50}<>#By)T#%vMSyJxy0mcPc-0FJpE4}#8cYS#y=5q9oBa$Cu(AwG<>r-(e zEZb(iuX=c^n4|yhx45tqpjG8Ni#|kNWHQ>eMfy|TKzV7r)#V+x8@j?#^w|trLQS4! zus^}KF>@}Y4Oo9UWDlSt)dKUi|6*S39`oLOKdVkUL1yLYvV(n+{<=kptZw=WjSA!18T(NSMV<`M}@MKYql_SZJMQg z*8Hgmm2df>>bUvo9`}Coo}Ny}cRO=FbL-h7riStI86&OZeb)y^r`I4#*CT(qZk^@a zH{<2UBdN2(rqU8WTFG7(uc^`E0|C7ID8e`V?zcU%jT|Xj8nIu(1;lp0Dx@6 z5sz>HV0szAl5caCXUbi&i?`iY-sfS1@TYYAE^^j{eTU^9oLtNMt$C5>gcv#uAGzY0 z$MU}}WO!`)Yc1wG-0JkvV*@){NWy^vB z=27^-0YkR@Ziit?_KtXNy~EYuQZv)~$hwp_yBOWKh6Jl`U5PahD`STxcd{62bB9)o$qu^q4(xS zv-sLY8aXe03;K4ZE!&r^jSABvjnC0>DWE ztcDRI8(fb%OL(>NSS(1tSK|qzNW~vFZ#Kq+jd!lbeb17*L4a@aPSeHNnLBIZ;dWCb zir043x+T`kN2G5^!@f1rS^%}#TphVF`8!yayfoc8Xl_s^|Me&1PnAdwq_zw7!Nta0 z0wS_4xY@FW(84z``0@+V+H=0_jxl{d=1;tMv3o7%#Th(O^t}hI|~e=IipA|aTC21)mg28KNYzve)Y5< zpyv`t)yG3_+&LlJUHFts-G|lus!qbJt75Fi{c`IU2wvvU)_^iRxrvb~zeqPXVR(L| z)6if5+aujS_=WPcI6X2+$emg1&v|!<5161V@B1*~X3aNO%d_GQeH(^Z<9ACB#H4#K zu724D1g%H<*r5Ey1fv&p49P1Pku=W;N~Hlfqe+&_a&G!>uOEBEVYzAc@-0`zGM52! zm%jgImIEUqfw$+V##ZbiGT{gAyO|)2+xpqR)-=!YOe*nw`F$07P3N=iTP-0Rz;}$_ z{XXIH4+hid!f@>-=ZAiM77vpD!yxZr6znTIvGfR?FnHA!<7bNlw1?WX!Wx}DHx8RH zyRI+i$1d*IUejHM{nORaa^{FOzJ}mtxv@F_%gf@!G&INatn?~v?W4{^zKVwp8{t}m z?xp19Lzqp*KUunjUt#y2M^}eluWXP$>6)0Kn)A0yO-&1C@+P_L;qA#^0qn6}~a56DCItd1Q#$t5v=GpbM)sJOCb*6Vb5e?Ye3#Wjc*cKN!uF z?;ZNI@#n@Kg9$Ec@_GOuT>^cEkX5ZtGY_cWNj*K@NzV*wZ1E31_Lcj?yMChKDbjHAepf*4Njakt_ z*X)}kHqqFNj^OIs)5dGb>wDHVO!UnZ?2Gw|4=no{i;QzwfnBH`Ut;&rt#S8%IK~c} z?-$MFtG6yEPOcLe{Qh|vX3HonhUQxS4&8!~54h7F1&lCv$8G+w*83)xaPxaqO+rOQ z&|ofckmqs3Uok+ z5Y*_p^IZld$bYYQ9Bhp#Hva9gwWNMO#_w{;LR3+Lxk_j?%+ADKPkmu@w*`KoPTeXT z+PpDi2iWr(iQAL?$p)9xOG(+F;0A1<8MdV*X?nPKUsNbTQv zgsVw+2w=tk(|QQdS_uZN%-~W1w>W5eZ3Q*U3Q+(Y03-_( z$j<1_cqv)~grvFwfK*&Cya57ivQq)L?zM@`6@0l_u2CBT09;W*8E{=I=m_Hk^hmFK zJP9Fit272mTm{nS_mCY|z;ZYdPW%KMW(xk;P0E?5TuC~Rp=fDrohwtixP?oHdtyx2 zO%D)B^9ZfVjtXcH4TX7m`-TePyr_lX#;^e_AU+|=TnLD4j8?JLH9i&q5rUzczPMC` z6s^`_WQfG%cEic2Ecz=}`EPxHh4fxpy)L0{XD#X@y|;)yjSWxIfXdK~MV*@I4TBVb z(P6)TU^XL>sa9y)k0@l`GLqt}KW{N4)(WxmRW+=$YWR3Zu&tL_LMW_lcqoym^m^A* zZ*dcy97*V~nX$o#4VUlK_^x^7f=X>u4qF2ay}F{n#v?65qNwG<`c7Xfe(034oh!i# zQPkWDPzFm9$-xrYb4YE76ovkg7u%`-WKBfHm^MrwlCj{JSws+82mlsQ&?n)~E9nFz zR0!J>#|xvC`fcRXr2L}3f~cW@#aB)+fGe;L0)0Myg2OqvY~Oa@e0o#Y8dyQ22NDp_ zy(R>&4p!?`&nX^4AdnMQb!j_XOU+M1oG-Q&VjLiraoQK+U%8OPY}2!A2toEp_JU5vEwKhy zTD8v`I<7dDIWVRD_*^2Gn0sJ- zf{O%}gZM)kHv^v6cQZ_FNr+R~^7RSZcJSw*UN76MvCM0#HH;l8W0G5j^&q+Q7v2{R z8nKzX)Gz6ja(TTaN5Y=tdfJ)lH>6iZkO~TR9|$L~FUVcr)nHJ24KH@)-~8>CSqihV z9gMbe)6ebU+SK(_`(;bhd&+=6;zOz%HZZ32?zRJ#d3P#r({=|dbus^MBcLudL@?k8 zm^+$+$=|MCxzq8T*-Ga;iLxx;n% zWDjTg7R_7-;~-CX#3!sE3S+E>n7b+Ac%AS@tb8b z?ZI1#(petqekoYad}6Fs~yzppp^%OYkR{=Fh{jbkt5p&x&G?u z70n(?^HPQkpdn1=Jx2Uu;q5(E4x4aHGy9F27id?a5N*;ZgS9XmaaN!@g|U^AtxiYS z%le}S_8GhTDZb)}}CcYY?hn|Aj5$3T1_tHo3vD<(Jp})$^ei zNtU6xqxo>p?+>uoOkAmKT0b*XB9bDu%)5lXuv14jCs_RG9KunM_J4f7%DZqaQH_pmoumo;RL*~kT7#rTITuSA2IKIf&y`I*|WomY}Y zVb&C_4#00vA?j>LwGXjPPI(-N{d*!km?au`v~>Rtiy)6NmBE#|ly{Q5kGiYGd_Z3` zlnLiQCIST5z+Vk>(R{(t(ycH|%-#d}QRLXtlEi~<~zp|rAt8% zcFa@{OGn;!c1sly0f)Jk@FIQJ3~ovUApjpPdik@Dz$48dS|V{LJ7c%L2dqbAurPkR z$)?Vxk$)Y6RqU)-oJ;v*ILPU3k%kbMD}R%KS&)1ft!Q8PUU*q-rcO(fTUaNL`c&Yh z4p$XjBj(_F#S6BgBqcC2S}{|_O~$qj+aqG>!(Ww0PvK*zV$PC z${VTJ_NjG=v!iSqqzANb;b#BX&HVD#^6mm1#}j1)2cU((r2jtOm|%|7;jh`Y{G<6r zj9yf2@_(`yKKw#B(a8VsxT_UKiyx0?8s7}`vP9Tbhow-2TeypcIxZ=^#=-w5MhH-H zSZbKNQQ{rK&7VQW+4C7P#Y)mN)zv7d7%Z|ryo|wa6Kg-Sj;2_9A-5FlbnU0Ep-xIT zmzG>Pz+X?Z{|(f|Uu+0_$mn46@Zr3p$5TA~pB|qijEFG9y~F7X)D^Ern`Z`cyb7sL zg>tK&5N>jXF7?C@HKFj3dbB*NuG+`Gd5?!D5@=b8~NlcI1zovJtM7 zj~?&3UuB`F!4LgQDe&sj@05SuIx~#Gz23k6j9=Ff?l>^NC|0ueO4*`nj&Mbty}Wfr zTt~i6hc5>4HcG3Z&70-mkRl`WqCwuu+`p~7?JiHW<^=^XqEt7{ecc1ILxv(?2eN`S z#cgNDcS}R&cLs{nRB8|yI>et-C^tyxOoSU(44Pv?`bJU+=Ovdv>Z4Wb7dj^eT)Xym z$wam#tD>Kj-#`Qf+E0lsyc~@{&OfMn2z#SCzD_uz2~pBz5~$A5VJfXzgU3PWeL$L+&*O)~c*mIvWn( z{Bau&Qw$~Jm)z2xCk<{&7L1rY0|BgEU?W0J6}V7jh=LUrAOh&${3nP9aWfj^%pi;c z5l88PLqTAi-v8d#xBIx@;l_(2Z^V}j*$IRU{jWA-fr8(nGuI1k=C?`bhCO{IcN156 zOmKh*tW^3p+vk$WC1lD-PocPtP6kU}*iz4~^!Ch$S0dMd0R)ifaRQKhIFR3MBoynI zN()^bCj|rJv46^ga906>2lPL-RPiA(P__4h(5K47v=1t8X=FbQc_C*zph608JwO23 z=rQnR{*|NzF!8jO$g)^I>q>y;B?~B{22Ylx_oE8e?tyV3@twS3ltqh8QiW;srm-=v7M-9IE-*bGW-)g1CPsO?(5vtLwTvLuOJY|-2KfA z5vl=uHzj|sf|ocs_DvV(;ecDJkif~aO5^rp#^QCweD*qFT97Uwl*jp&{{F8M z<)tkgE8d|X`D5}kRHSGg9}I9F0=mQs-%YAl^Bz7Uy!tH*0H47V+c;$Zye0+cSc)PA zh;D`=P@G|_0geX(o-Kp_Vdqi!$nsk}EDQwT>#KnN0bh75_(}`UwqP?`Gg0~-n5<1` zq*jJ5Dst^Xat|IJ())+-z7*K*Qy2vv)iM< z&_SYh;{mx*`7z=>9?nOE@p{w*gua@-n(fwBzkkJMauI6N9ngQtDs9PeWpkhZDD|LJ z`({9If`VDXOAt=n$&qZFqba4h;}kqe$}4trHj`8gf}3Tq#7;+m!Q(^;AR z%Ambnrn=zf;ZE92dXP~1=(7>@h>YY8dAwQbkL0Hl^RG8sa&-D`eXHICTZ&A;K*cn|leSbe^PCOTqXfYQ%|tlm zqdy2e^G8k$)7~`RH5ci(XN^Ae9A@~Ezf$;{_tEA?(C^5XTRqM`$@}g)Gd>kg5xXI@ zfU7(g{BJ`c6!-~v2@;pTDa)`iBgK%6fmd7@rpc)vf-$wSOKn`A+Bed)i6JtdtVo`{D1Rc-cD!`cISY<#p+7W*Je4k5|1KB7Pwh zE>Pxl(D!5!h$>hVSnZp5#GM{M*t_0=PzcbLe_KH3an!sjRICI7lEHX+KWBc16cGve zQ(n}{A#VCZhsl}10en>OY>+0|A<5TR64!5VFmX5>!h!!m!s&>KWRq$;cN3%lfa zgbIZ4##sPjQDpLPujbdHAw*Z9AQ%7t_oLFeUowz>R_}D2A5Vm0gxyYDt->h)CaB0; zT)G00jUc+?2V2ch00a-7u@=+&H1zVbgsI6x?mV|o5IVN=JJfhQXKK&mGU#Wr-f-f0 zuuX1=oxT+@A#n!?pojthC>XjLwap6ttFJ<<-yRA1LT?V>CZK zPS_2WiX}9wvWx>Mz0f35;$Z;y8(Dt>t3aX8H}arlLad!Qjx57deJljKNgV%}CtLx5 zD0IT57(zlIKomd-iBf<+XMx8CeY}G6=|BR>1a}?*0<0pLmhC~fBec4>oNydCVHkuk zQAMu(ELBVr7a#_maJlBP+6})gfiYV754~FdC)tAtap|O(3uBdC1E0SnQgjWZw>+YI z-02qvl2o$rA$bt(WG(-W6XI=jDj))ZCW^9C5oIb?Ud8?uCK!)3+7MEeEa{*a&yP~T z?c-MdaXy~SLI8#P;&NVI`#9=t@K?rmRX)eF)a;c*WsvXzI8gYOSXQ$ViN=el=b$L| z_DM^6CxgcuDY_yuqi}wf~g`{9O@m7++G0fleQ@y5D={pu5vH;s)+8B*>2H^;T*&c z)B6P3K_l)fg`On0=buo8vh%-*KMD4_qFuuwig|((mnD#IAnMRQDrTUEL6mQ@SGO4V z`U#Mjs^vZTB(&$#l1mKZ3zanl>W1UFEf@Ro2LO*&z$!v6h?=u{P$qzuI1xX~5moFK zDC=9+EH2^uoII+u736;mL<#qnW6 zr7}stUW!uO?8ZUPtiMIGZy^)jEPf7WaK2#(s*9@_P&)3n~ao#q(aVaE6ej=ArqmiRFT zIK3v@6rXu*)Fnpjy&K2a+yN3-_@nxPD5ypteHa`ZQ=5{QlvI`3`bh=%O9eUF8D=E# zc}{T#3aBc4(xNJMt+hAE(@x<1p(5ft%m@#ZCE{Yk-_!+G1=+qT5-9M1fp%4v_sv75 zZ>~Uo3cWbY?Q&^i#Sj}H3?y7ICQ3c`fd+5DBNq~*yg|7ttV00-+w`k}@Iya@Gan18 z=E~ti0V@a<@jtOaX7r&IRE|1soR&7 zpRl_tDa}M^4Rl*TNDW@%cE4&n%XKa{fw@Ukl9X(+w+r@K!@G1lvRsYMT&unu^W;>G zvYG_}bKgcJXHN*DjW+N`t!ed`|4C4ruDC|}GTW!uQn-Nc6)kB5(YtVT1DdA2@d$Rj z8i#&lqNtApp<`fr&ODgdTKGBR+X;n|KP?}q)#elF025$QHJl8kefyJ%(*w-Fpl}+7 zKuH<85FpzyVDX)M0$A7k;RY{mW(UQJb zil+*-CJW8miO+o?yYswym!lJ)!zbvst0b`3^I!VzaPeM__q~~9%`8s$FI-A%PQAFh zMKgh-0=&2?Y!uKJaAcgh}<{E1uCT0T3#*KLO+p2%q+6L3X zVh`pOy*kbpcTsM)Sbj_@0sha92Nz)O(E`d-8};DU`4LJ7wm@t&1c2m3#Oj;9kLgyi z63Ix8AT-Doba+I;v_VbGUkxG-n>kac5@-s_K{S6jI{>k81sbZujYBaHMM+gaxIi|m z!-lI7=ZBitIb3)Q!n}1vVGs^lh`PW(n}zh~0~oHzIn0ZC=rSPBba9*9BFmn4KSSb?6`LfGzQNR8H+5Us+CZf1pcnecVoWE_!R9El=M zC7!f+xLOm9DpBm|&v4=1t?C02g-Svd5Fr58OQcuotwaUP#`g$QoV;3Bushq&Eh2TE40>7pIuVv3r&Ti%t5e~lLYO_A>; zaDRr(pRQ}KBKoPk?7fHb#9lAsXDcV!+b%PM=APr=0-!&rvxaT`j4-oDK01RoqInLw zxj#8BLTDTR0C>>3X|*}6NrmvICQ7ul-k{Jp&>zAl4`KuahHXrylxd$i;Nsu_9_^ho z06g>}OzD{j0KB4rD(C|Op%A<7FinRaIE9SgAAuDV4$3QtPx@)b$W>#XCjq(7sK&WL z8C*b!AOsp4{%f2WE)=aORx5^|C=?#1k`Ya#YvGZ+IkiibnQYx1CM6faG*CcQ>1IJE zs?UCv6b%Iub03sYiasV|vL-fidLW(02Y?g9yZyWmH!A$({0ytbU&JknQ=Q|g);IJ& zYMvfh$X31$a_#%#S=;?5kSuh<(~$huLg=>bZJoqZnJUC7uWZnat(=V?tcnDgMgsf^ zedft-wi~lZVt8oRSg}~>o#e{sJ^k{Jyy}J0K-O6rO5OD4SyB*KK*jmyK_y@^{ezNP zyyFDelLOOj6{ZK6HAhO*X1jK36=<69g-Sz36K~dGnTNg-g#5o;UCVtKS+Wy!r{pr3 z{xNZUxmC*=f`TIsuj`G>d1c|9!{MW<5wAlAVb{ic^_?f!NC`Q{fvoJc5$E-{#QMK;S~g z{im)`&BwS`I!`l_AAL94$!M3*#)YS?ET14G-#wHtiP~67Z`yBAk))g8)H%SDGJf$* znJ!(BJX*4gXQ`o>(d8x7hQypN2vzg@WtPXR>GC{P(3z#u4np_~&}xj|>dYE<~FDe%#Os zMMQCx+Zbp+u5}%EUe7}}tKmF<9#{q_Wc+yh>dOFp-@lH?u+1Pa=b+4GlVUHkNL!xf zoiTF&?rT8dZ*+!%nty=EY0h290MMry}Ne-lju_E9*1aQWY&?`J#tXQ<1bP zK8g=nUM4zN8yl!nh8h$zH{a^ETZ%g~;E)xnL}y2@z8{%ppuCI&SNA94sK?gbB%c#fsL~3)2!b4v7r?Tj&J;=5~~giN=b=N@=$PvHNOBH@ZDRy8Pm-;||=EBbX^Sr@F9qkB}vuZZNc zJHM5^=O1(#8ul<6XG?^)4#*}D#OM^VrDpg<^jm?JgZ1=@ zc3<}QAEdkA=p+8y-s4V92Flcl*aW_ZN0vo`-AeOIhU0(l=A`sWB_T227mO^{tQ>tj=ZoSn?$8~sk9%Nn5RxMqI=&S#!VVkIruJy}aQd9S4 zpTEg0?c*E7#a9`o|Cz9{LA&Hz&2w`-&D6m#5v>hS7v zK|{KRq(>ijSm+f>`Dz<_NcwgNR%|%P;!w61*3hATlpb9W(<4+rHue`)B@ZTKQE4i1 z&p-K!fA{L#jm61Zo_Mi-=5lvVdR~+x^!C-M>FyWXN3V?Ys0-vYpIMwvpMybP-!6WM zU{Gr}cIg)IQ3(4{Sp_o2%W^!NHK{1FJQN^(bS#I%U-Ti+Z=_i2{Z6p(sS*wSBBiM( z5txDq^ipVc=~f$olrD4AF>^FYDQaKKAFH#ND9d?GB1(AD_&@@Gd|4*yT}m6h#|bKn zSl0*p{kCKKDz1XVrEqy{CW_>l^h$GDkr9#GW_+)rh7>8Fkn)WaN8ypx3DajmrGNY` zo=#FOTe|s+5Il%sX(&WyETcFw(kgE1Ha5}2M1kam0Se*1feXC&XqjR zR4=1cBZ1-3)vQ`T+z0bd>68c=n)H@_V$LSAANryQevSd7k6rq zfUEN;7;!{G)%b8mlUM)YD0o2;cL3~xV~68HZEZyCPbbxNx6^9i(DYC~JHL0+UQeBdq#dGdpf%eqA7+&;1RJ$I3JPE}n&@zl^12jw^as-d19 z-`DIb-gQc~Q&Ph=`vn$DhnzB=d7`ZFUhe+^UqGP0X-)Fy{Qe2-#J|yeyptqWRV}2m z+C_G^_MVx@I8dyD4V<;GVLI(=#ln2{W%u7Qs_ZYC4{Pt;`C+uUWA_gJgD!$di~*pNWw>O6@=Ktwt~AO=y?5n2i| zD*&n>U1bzkx=gE+uYKx++caP}z#h?{HHXgLwxSYYL<+DI!Zp$Xf&zw8HscXh0x^#R zgc>YIo-nbvd8YWzky-S{QZXP9%2tz7MFK6Z5_UK{D|Z5cM5`nQHJNFxg~z5l zbJkt+6#;~V`*U;?s7M;SfA}u#biroS@q;}QPNare7N|0!#Xir&GeD8H9KulE>EQUv z=N)obyEV(!T;0s&4x2t}Yqz`+^2!=*s^vFNPcF)fnIvqLyWW_ps6&7{V5H^n()Bm| z@;~bzOPz6~Xz&}#GKxFgUBBlWGP5&*j>5E$NHA?S)YeKsqw!+vn|C7oZZfC3i*B%F zUY4cM{XJh1&bG=`K!$`oF*pG5M<_WpcCP+FF5Xcg&lDk#GhI+n$^grhaTq3y0kT_f zd_M{+#3baIP~#Ok6j-JT00TT0(14fO3Q#oQkirrVd8FwU!u{CO@yUJIEd62u3(H2$_;{_{?~zNOF6 z$Ru)wk49yma%}Bd6)6g?0E&WE;Yz9S;LSO^)ew5E^>#bFy?g9+Kk1ITjrYE`ah)}v z61{ehNzPeC!;@K6I1*i4*QtTYq>)NGfCSp&pG*FO{%>(3Og0v+v2|5Zy2E`xzia!$ zi*~1Yie|yBFDWSis5ZBMX+`8FNM%K=Xa{ZxEzXyiDe18f$>E~b@FP#DWADsNp3FL* z8XHs~Q8)2Y&n!$yIR(f_NJ*eu5WYhyEE}f~A4AGUYKeFj6NeajXKK|KTa_(D83zs|2AD@| zJbv3oSNGtSAECOGhIGMA4@V_HBDj{whI0wkRhz4?=e1pDW~aN&-ZGzIYn#p6Y%ksJ z=k>nP_lcTohph9uv*!oRik3c|#id8bz^urQbo2-_@@QOEIZmgX&J_~>)K!neo_+SJ zlITCmzx?)?`Oi)rd@Y((NpA&$Baw*%y2MB{Xe%THp~Nyy>hruPnx+z~^1hYdI^ z#88?P<6ziX9pYGK!Vrr?kslE!3hC^Au@Zv-0Du7)3nfZ3gA>eR9{8AEP z7_3aeLIrpr@&+x#O`&eqFaXFvdSG!x7l+pm&9K#%I3QP41JYSZ!E2|UUKoxXoB#<1 zrV0wwU}dGWKDPg??RfTgUD!>&fw^2|z%bw<4=4FGZ;tozk%tY@C7<7}_Zk+%oi?2` zOa)R7smNN0(CoOWl9HHCJFOwPoH)?hjDnzQzJC1@ENUbLt`az9l=3rSyd0M=duB8X zQADe|cA~=Fg^!RBEd@|X2V_?zlv3y~-OXKCP3PV2J-d}m73xLvHhWCCN0Bq=O_SWXd}ebheMw;X|?XL^p%xDmC$4< z$|WDEh!%BEda-i!&Aj|usM=xLe0H=+o4-A|p_B)3V2SLbLqC0{kH zA&|DQvAJAK%boc+w4Sk?&wu9KGzq;+N4SMd?#5w|{{8l?E#72@49AE~+Pv|PxVe|! zZo7*%85XQV2?Fv=$PF6eVtbqefLb?e@nsY+Tt|c^L*tX+BP5h0*{DE|b`)BR)-cHc zjIA1mGR7FGP-tMp$H*QSz#Mo1FfafZS`<3(`Pu%A@0@M372+GWKszH%NRDR2cCX;oMb!cBxS7vTrsH>`_n~iFt5VyR>HgNC&VLbU?&bR#YuQ%>(t}ok000agK=8-`4(0)%K%yBCqW^_~wr$QZW*h(vu#96I4BDJt zUIK$e2rUl;C@mvK00hSR^QPanrkSw~+_8@y$spE_LUWHo*KV71qDJq!D78 zz}gYd%d4OB)&5Qc0z6Wns-j1aCrHrBe}~1#$zJFuAz^-yhS4-o2g%M+zr4SFF*I2? z<~!`_A5`g=PA#y$H32<+-S65?c$XKP@Cw)Ru7eeg?f~^lThXfOVuROfO@DaHWpXmH zQ4WJb2A>9mN7qhO(5{iPEVXM&nxwj=o%0v3-|xW{K$`PVk?K^4X)u96{yKC+iYTkK z)^mN|UUH_Hyi`u_=7WoI(cO~gy1cMRHL{}Mkj4Jz{pP=a1&@-d$?PV*4wfpjk&?51 zw{B{2nju+@V^eB0gF~Td0k>v<`AQTn#kVrO0}+G;UgcK|xKLXu7TiUHec$U^gh08D z843acK&atDEDlbgpb&t;p%KVl0zeg@&1Us&ffmfhyx4UmpckQ|q>2U7U}#V&7zA5j zzMHptO+(ov%#0m7g~o>ZC@RfQD}WHRhqx;k?}K{1HYM(K*G|Et{!+Cze)q?8F@p>& zKC;5vh*KKv&B}+nrXkX+K&VrY3J<2C#Rnbv_GJ^COvO%`Ui{cF<176@;~T%0SGr!e z21Tk87`Z_*K;`IE==s7%5D`y&&xz8hPBsEO=3r~lwMI`c3uBM>6c()$L-V+8&BzGg zFoV(UYc*q0M2xK8^^S`3ph`}qMwNp@78$qi+D<+4`eEPH!BH=^TJlbKQisECy!5pC zE=%Z$RuofO_AUR$U=nJ!&Vw7Y7y~83E1LVJsYWP1(hJ|z6xkHTtJzm41 z9WkxB@~mS^tXag^0&j`m+eAUoEaa{!SzqvFLGFJ@2FE7P6P&bDu<@ z*djQF8C4Tt6e=`srwCa3vBP5H5Bi~ghzp@WN+O^Uhdp>uT}tXIqbfDD5THXdP-7a0 z$WZFFo$Ro}6swVKhtKg92Gu4^N?sL+U5UPs{N|^OX*L{rq(?F43+9cG;h-ZIz1Vg( zpXxTqczc_LUcWj{-k8~yq#Mf|nr>=Xi;lkAD@MV=86Z{%C;wZEHj~}<{Hl-7Y91Sr zeyD>qIvOgvjSERI2G%epTc03J0Jjb!0f4C8WuF-YAqR;-o$gbgfPm8pIE9>vI7eZ~ zQ)Zc^rGw`3Gup&W40Tm%=&(+S3JLeAPNKwx7_!+x``RGT`&zFyY3 z??umd7MXvDUl?s0c>=kK}tQMI-OM~AsKI%Wf@#8-krxdMe?UcssP z;WM6cj+=lfLV%DeqR}qbo`3=?>J(=11+Y*8hyaN_%Q+{kF;5di*?StQL2X07$^x1q z8HTTTfj?e+H^G!g{;NMeua;4nSq|fE^Og0%v~JfMuqCk!k0@Drw@X{t-UV$_pY%H& zu{zU&LJRb?uzUC^AN?ZXvA+`>Cmt<%6a$ogR5Gf;rp}lA-u+rTKR?Oq-qY*wTHP(6 zjYL7J2n%VcHafgiq{I}cva*HL;EJf$9+^5srrX9|>?~J1ji;&8c_M(E{ZOBw9fvn(RcN)UYkWl|1-|^wp0ieW!?o zkk%8&cf90E?5l2-{dq0A>s3DeRQ>idt*fiOc{hFRzJ`68o6ocNx-#FrYCk2MYpv&e z7=4n`6xN3V!N46{5n$AuAK&XZL zL+GO2fu3XH?faX@_^-W=`?Go6zdqV{V$uiGwbq-WNKwUe^qYIVt4t(%Gltv_(jg0Q z2${BFvG@2JEO*6ASfuyFRx?!qlnjKqOi)RcWj4Z~$FISf1snwg1f5U{Dn>@BZnqV= zIxTSbR zIdbC##SXT#F!lD7Np#zmUeANt=ilUSKZjWs%Y{z+bezEVjGKL$~?Cyn{tn>Z#RnC|F>FR z>6V}CYEa0c;y53!nExFw)VG&gcf-Yh{>O)Ro}_Zxs9Q-5>N6rmE>c88NJD>ZT}(k_ zcTg;HgMb_s#fatfhZIvT{{GvGg8y4PF0i1Pxf7%eKn+}~X1Mf@pn^o2{5+p`{`$t> z{r%?qw5DCPu3+ARG7Udf8N;VakT>aYfudvb$SbASk}h}hF;Tk3^snEq#3wqle}6cC z+x;LY0WvTGfRL0Jkdnba;#~tiKfBI5%ZH{)RT|}nV6F@tQ5b4@#v2xWGio;%eYAsiX{uYD1zLAUx5?wj^+n} z|Frw^`7%G*`CBWS#3nU@im2C7)0<=Ve!kSHFK@sxRv zjMmv#)c+5}opj|^_W!dl#(^euVIXh*SK;b|+SNEMZt4%mwi~V=MUOvvu>Rnh_3h}e z_MnId$nHe{clBnSI8}~z)_aMpMzaBg04`Y=0mvpD55+uy0AUuo7%~MQn5}_ixA36+ z0SLhW(7DSyLR1zBCH;F}-VfW~pLsu}8$a9L;mRBatD|?tsX-8|DDri``-PV=aYBZa z!S1+DfR+|y^?Z~2uDbeV@-LoOR6;QBsiT7c=4gfsIOTcekIPk^-FhU@L6UistVxIV{m!vZzc5vRMS$IyxYOE1}rjs*jG|@p4uH5uIu1dn# z-qd_Zj>|gQkydm*S0XY|{d?SU@*mB&XD^;s|M-874f>uN{rF11U7dI0kT&^?^0&mN z)`?O=oa$ZVujzEcCt^|&c)-*|j=a$(MLW6Zax{ss0RMmUxV03@!B@Ag{?nd-3*T|qRTE~aOH2KsVSNB<#FD|0ms(3b(5Rv!zN(gDxst%K)2p9;CVh3ejKApK zRI?Fc7R(q$23wx*%mCFLMfw)y6TvTHZ2Hg8|FeD739QR27ss4to9>*XLET3EDbWM} z``Ewyj7$CR{%0IPpob+dPy7E@_W$**SNOwsOP^iz@i4g+U=ClsTc@_x}MDrKN0_Yc?F{?Cd2ZTVRk z4JfOW5k)x#B`yFmoKb8mib)bHpku?1Y<``7J==UtgKLy{hk5+*qFe$>tRchE9zd>4 z8GR-d0aZ}@P`zOkp{nA#urr{{=mH2;BM`OKNNM8YRT)>)eVyip*uG{NwrOKksI1oJ z;7drZ8cS$nfhRv1>J$r!InRC=PH30B#Npv|IDS3;xbT5a#?uR`z2&P^jWH}lw2M;D z*H1;rAiH+aZfaEn61mN@?wS=>d%Dm4c@T5S0}B<>0>A}YDMBDBg+P)hRskEb(nPT2 zZFYH|c||@iAI6*X!Jm0fgV65S%LwT%TVW|N)orSQhX};PE%R&o`yR)lh$wXDwGA?0 z?dAj$85Aj^?Zm~$pH|=YU(zBqqXG(r_)Gooerx?RZ>`cOpam$wFL7*84IYRA&|Qcr zx_4o=u&|aYD1kr?CG?^EhE(Rin28RY`b+(CUvQrKwHOyr#ypAaKAl@E%+NN*Id0fY z+;i-Dl9VO3>G6acOtwCqkpSRn!fBqKAO5BSILay4^<5-peg^;`006EUYx81NsYuQG zTz01_f?$UB1l>)gV`>Ql$tAD>j{sD&lC;-AUImmGw$eLd)QS3QKGIK~FWNW1rUeU~ z{2ovG<0|83n%VVi1ZDD_RmRf@X$Tj^M@T6vM4$rGSspW4@4||J7^NklR9R*PM=23q zRH<6d1%Wn5SB!9l(y{=_I?x&6Qo8Rbx}z(LRbr`7G=9;}8D141GcU<&bLoc|8_NcaA3FGJgk z+YQ_C@7(o2vmXKoC{%<0RY%G5nhz6Pduj#2rT2)|VAX#_w=h;!k!7rKpWT6H`fmiI z3pSi4We#!qCC6#@?#t53+dz-rGh%2q{(~h1cs$@HbyBcW;7piXutWg`;6XJsIXCno z+Nl;rKsx3QU7|%8cu3&tXXsY?ecc-GQ*0tj_TZDTk5mKDA;pR;N!_tZf3**-KX*R$ zb6W|BidJbM699+;5CS5os6s~xC8&--s0RZj)Hh^d$!e}*^Cf54X9d^m50Fr=Ny)LavBQSjgd)l?<(~Y99YSE ziqOmNow;{ywJh6JfRdO30!)OUrYC~rSQc2t%dPk~QvNBU5}wWx1_TFP#>h+fd=1A) z83GUiEwGwze$rD4gEmy5bqW9wV$`wbv{$60GunSS-;UVh(@6)xFvVcD<1t{49XyIa zQkjJepBD>T?bcqDdak|uycF2Lf!_>&)s;^U7-?15+s8 zQ_zmu4qL*iz-?B;5vm?3OF!3F#ma@KmdOT|3_ygE3rdKVg$`qy1LOt`KX25;m-<@H zpOWsq`$7_(2Ww1FO!Zc4f3GIVM4iw>xA!4%iZxFDSQtPB=rLS*rD7aFa3 zox}A5buJP`?zkjA@iE%9wWu$ElxVjVP&O4vrBmK(w2iS&_Fa<3<4t( zoyqgg*B|xj#GUQUJMz#$%rvbI+E44lMjd-uYoLt|RO6b69v+uE+UQP|*fzkS@D8tn z4{3p`sb8y%C1WL0toR(hhKsCRNEFv}l_%6YlGa*^2`t70w?2}NDk0z3#83Np-*`Xl zI?Tdi5bT#PjxH!uFk1GYf4uka+gJLIKblZdRhh&tz={Sa@vg+y-oOX1UT-HKSfB9u!2L;kzjFdX zARafKX0-JieB4-#g%l8gu>mMS1_+8efB*vEyqO?79F(f2J1*4M(sCMU&hX6Oj;^tt zr5+!2T*QFTL<~eKx^&p$o`n`I+NncScMJ8gBT83}(%5GnEu3|usI;};-bYMrzlQ1Q zyF9ki-Q+9K``Qqth~mVF6nq%Q>j!>n_4-<`In8%Q>z$D~X%<3*Tr*;Yoa$Nrpg5kp zOG|Tu=v0tQcW1}(o2}eg=H^(#I%3UMse!8u000CoZXVC~2T#{No$k=;!#wiE!? zwk_z_`ms2mT8J=6xRAEWs9ast4!q70Np%}AwOX0`v|BHwEk7_&r~bprgVA7YfXaGJ zq!iX>nnmZb5U;-V6f|4SfOAUIcm_UZ z&YkffnVMvP22H=Nb@9gzxp4w>3; zhKK@^BC!G*ICo$7o#-|l27PDuj#n-9gfZ*!_i;y??|{LujFPs2$d2Z{`sR2=Rx;MX zfg&KN0ISl#8D^M57DXMGas{Op>7yFpfe4(8AI>#A6301KU+cIL$;U@0qbfZ0fTXbc zDA?w@3L@LawB_pUZM>nTZ(Ygcwr4k5kmFvIYo*zys9gm&G@s7(;W?lG`}i=A%}`NM z%CZ-~xYT@p`7^!#?j_Ze_jY-W>C`u7m^6HnGP?QdUDF%Ji=D09Wq~Q@@zFTQj06M( zAcO)=f15TlJ6 zvFLKd6%Ujv;0Z7V3D6VDs&Xr4h0CQzy}}t-E^&q~KYG8YlU;&VY&*jqpWxYUym zzGWY8*(yanYGA6t;(~&j`5AYN3s_Ngizi;|DX8YNf{^&}Zut8USHvi5iXs!IO203k zsa9;Opo8qOgNbc&t!(DXVM@ca<$ImdwgMCHI<}fTIOEO+SAoVgzH4p}$n z>^BZ|h8~wE;d;b4=J=u?5Y+&ci6>spVyxv1ILU+4Sz$U?+b;GF*W4K@rFY@fS#BLZ z<%vP165%?$ienBl>==DK_9r~?10IJYN4u&Ck`huSKE*&GQQ&|o9#)Zm9#Drv)B>44 zE5>S-Ze5v#LbVi?0U3*@JOwc$7mFH|PM_IzpS8*5Gra=zv@d^S@$S9e7g%6X9KrSU z+K;cE{@P_eZtLL+)8Q@Rp3$BI(ii@4i!SU@QmJaqwY+0)eGWg0tyz})SUQ87(akJ_ z6L*6b0BX$P7?a1sw!tO*d#o9m;>9;?hLh`5#096NYZ^PoI?idVjoCQU!=B3h53~Qx ziBnXlI)4w z-fQ1`xPa#`>*w;UPm@`fiv}%&kE#;u`C;h#s&fuuQ5?O|8-{Mgkt0>ateIw`ulJ!z z;D?>lZR_j$^CfL6Lae$0m5W@vyt!Z3UzV?Ot>-q|MTQmgWOG8lyu01p?SPhe#jp`veZSPvR+S>4BA z-i`LJZ~N*4g?o2^0RTw7>~1%o{5xH37T(3yM`rQXAgm3DY)Q~#1uvq~UeE2%AE*1r z`{(cJ{$<0W%Kp~UoQI)jiDZDQQe5Szlcx&sIm0(e#7odVQ73=i$z7;{vnGTh^kUC5 z4IqME-KqeZdM2{rb_U+N7W)O@M3_oa|<|_r!~9 zC%eOrg!#Sx_Pa&)FaYFBRcqd+oze3RNXb7(!%O-cxf8vNLSO;3(3hV6%9^`z>EJT3dt*C=fDT9@&y~vXpqijv-j;Rk z$@}0Nn;|3#Yxa9)g8(T++i8g6H2~0jncK^-Q20h)XDW5k1&s3sQ?Hnp5}cZPT8&z z<>=SH{0_2=5tv5;JoWhRS^uG}Kfhb{Sy!rQC8{DuVT!;2-CQKX_DB|2`26mbE1+2H zax(F-og706YjFfs1ho% zdG`BNccwACCbpKViPn9yx9XVLJA9wjc+AdL2EdqD(IE(1$EuiWZ|`;{V1a=uYqeef z@P1w;3(X%?;-ol5%M~4Qb@@TrnT`NxUw6h-7QvlM(^KNMP&)S0+ohJX`Mc(y_aEOF ziVzS>uuWx_LKl@`@yHN7d~i9t5J9l0I;fZbJLk)1^32}vKK4<)=5P{@q)^8WwcC(K zhjclVLqJKE%4K#qlLPSwX1(4((+2~Zp*xCw0fS`YbJf;HxYb+(!o^+4q1O)%6LWHfBw#ks+% z2O-3fZMCaDQ=tsd3K(i+#a{&awRCmZK1ExMVGW4MH zlYeU+ySm*Pgq(CK*G#2bjX23vSXWLp3W%O@;2@2Tqs1C7h|3LrE zpJcuRf5(WoG+fEXTd+U;`n&HPLa+wpC2Mm1;eS=j@+Kkbs0u0r07_BNC~DUMQW21(I9A_#-*t;EUR~W`*DgAE zb(s=3%(RyKxBbt5-1$4yzd)V_Erb=X``ssm|NK0IpupJhEOaV@q-QU+sCv6>TB;y` z`6|1QD$6Tn$O}&+BZNAzaKw2^6|m2JdMvS}EkyK)1Z_^6lk&{rONo0TPr{hld`*bFb_A9f1N(7?}mSsV`5$Pyi%wfl9%Y0RaL- z#ln-GfP|1hwg~PI-(jktvFFaE-q(TV!0ZUDddAej+a`fYOFhgS|1mVQoEj~yQ7(`VC zfo{dsOZzj*PrdU`*?W0*_gs7HB^^fhG;uFlfNOKAkfl*V03kvVqZo#fp~Y$gZNz|N z$nB=;=t}G6#JUVPaXZ`$5x;T?v z+zdK?R?Q$&60=kY3!%tT$OJ6qmLzFA!&~mL%a@PXqiOW9%wh8Qw$s9k(T-U?%!*No z8f3Jd;%blq008IinpQMONSYa~p~+Yv9=k4R(Pc!WfFKZ{7fsF51wM$Ke=2Uu za$ooFRVFa4{FZj!ExESDTf2y#UWK)HdaqX#XOw6kAR^M!gQ`BLGxY2EGx$X@CfdXC zJ&o*AGp(v&70#V2SRK9c;jraeqF!fyY}i6&Fg4q_jh; z`hINEKp+S(0C{5Dijw!G;}|6KO zz2|SGd(!I8>A3Ri72XH4@RQg1@B!}FVNl!JjmsX!>b%aM*7|A*2??P{F-Yp|Dp=%M z_R2-0p}K&9kbdx7fRa6VL$*D=XMgKa6TA7E28WSI7J)zo04gi5a!4*Nk}7tXnTI}Z za2t^8*gz@Z1t?(^RD+rY1;Ng6S7}lAGOQr|z5OdidgjR2t|b?}jH2tpn#1z>a97 z1DeLi>SMVh=DlEtRrl^;zw&SU`=0$a!vccrxz0g#D-E7`D`z5@h6;Smd< z8vXL)-G&!NN{zV-+a)2-8s-dy06+l%gQ+GM00aVnfLR6`4#2d<4J%RE*##Xf9LYox zGdXblf&htzs$3sX<9>@inqk9B>m%@ByA9iEe`sAP<6u1)oXq{#@63n0qC47sr;eY6 zyNo8$9UVQj4KF&|<>HwfKNs=Z|9s8w3k84*NQzj7(MVe>of^%~BzStiv+Da({?fKi z_x<2i0q)4)N(@yd8j=?k!71017YV3VwIM;byZb%h0*o%xHOet>1CWS8jc83se6h*q~x`2RL zG7+^nwcf&7Y~lCM`u^GP&AvTs%^X=~4m-R@B@&n# zCDt)e0RSndD-3{;5eVb zp65(ihF@p&^&t;h!vj zNEjd#6eU2U&?PIPa46yEz2)t__om%`I`7U7`Txjf$8Yi{Lhsr=CE$Q9NJ>s{83D?y zps5U~ldO|A2TLk8K%x>t=>j4_A+7cs5>An~rm{_dSQc$WO+OnM=nADZur{dMnKgrw zz+f3#U0op_+tSl9cxN6|A7y$fJoM^9F9tF}aWqMnN(&hlIfN8|QKyrhu{Zl}SY2Fw zij~SEXU%tIJx$ZhK?59na4|5|ft8skP==y`k_|hl8BKd|H7!|Vi%&f#1e2oQN*U)! z=g}k#B;6fyCQ=vAe7jrr1#>K+@JT8B_jNT*)qi((AHgJLulO^wBQ!9uj;B{QI?#*? zM_N-g$p{Lhe_H4@-Zgd~cs@D5dXsByulAUocTYDT{e#ja^tfMKKmOufeIXNqSW5S{ z+P-V~;Fa81IkXz3Ke5kmlzF1|1|C10Yv#J^a}gsM%|HMn3ri@+{ao)WLNTRAC9TqE z+q50Zq8RRA&v~{ihRb-#c@krT%+LfP%C?GUqgLaC5BAI&gUR&=S+u7%+WbrU?Q@Qq~RvOzG*$cvGuxRH#QTc9tD19W< zkOxN9p5b-&eUD%NvDQzDt~Lk#me*;#BSgvz>ldRNmG3n-KJV)@Uch6_}ySifE-MQa>pZ)$c z%I9=`D95_gIV5Cj|13-sJxUCR0j3m(dH(5itJDM*VlZfuP@TgS zqb=0v$0A`{u~INFWkx`iyU z%fX#hpUAzi-C2+GgARYr`B7&taPyS;F>n4!u0k3l1H#<^QLQPq5PNa)-~fq5v4DsQ ztS(N%QS7-3-{NHm?u+8puC7^=@m&{RHX<6h7w>=?0_8Ipj%o(w-g@h zJzl*>zw_N{`^4Z`Q=iG^`1JX6KfdZ5ip&xSSe3gy=~fr%(&baTtmVSnbgq?F-w;h@ zUZ?fwk*UFJpfT$Q6!*=&}sqkoqyPrebj`djuNt{Nnr?yNwrC>B*F?S9Zf7uga8PW zE*U_rtreKsmB&(>vnWi}N@)mORO7H%2&@rP2D6cd5Gi7al8~qf5HKK(SGuO=IeXq` zClL_yrtGPWl4Wz=s=WNJ=eVs@2SX@L3#13i9IQjC(WQp5W}4nRA8X!^ed{r(wU;H; z@#$`}+Q-#ybobM>y#d_Pkqe5SXzj#hDWAjY?(6wx%g-hGFxVg3Kkk3}2lqdW^4{t0 zVtda+T+g}Q9*!@_0*%jgZqGKMgG+msUiCk4dSLa-#*RimWP6f*)u-Yd5-h!>mjIkH zbJff%EOC`Gml*J2=5ZP@24th8%QINW=4CKw+r15(Vsn^4Xi`Y20tcRCSH6Lp(Y791ZqW(=l9I>*PzVr3i$R#M6^U0$a?y({ zm-1}1H5WArwL~0x#kH(77FEI+1F0!w>K*6gj@P}W1aJupr9F=r+tHfK(PmT}N_})< zG-loR5jXE^cxUq` zRd;Lmr@DQ-dyl&NgB^NHYP+=(MBCaxgjO@5)fO?~eBIsp_aHC27iF5wV4Pp6jv( zd?Dfhlv+v0Be4U9QP{H@X>4Yj>uMz?<>Lme7;H8?cjOI%hVlEpx>Wh`o16k1MiRi^Z!eBf3qXmMPldXY$mzoEZC2&ziVCB@>9L@kGuR}(PVRp*~0gQ zy12HDDP~XeazhYKS2R?i2vj64TCLrqWS8ZK3Vp|3r=Er6C@B!CD4y@z zyWBo~-ofd&*(_D{spGZR7VPJ}KQ9IVp@|||KDDDeu4i(~B_}E6-QmL8hpN_ke_s98 zt2H)03_vudT4w~h-CoTwwVEi3z*)CBz23d{Ip5>yjcb>k)yB}UiHcy(S_c42hRkYJ(u67$V@=!j80HX&liyGC^tC8Vf*aATXcY(hPgUThD>R_2pxinZ_&g z@z?+93yo!*ICoytT)nkk4KNQ@{*D@d*M9idZkF;c~wAeO(Wo@9&#FCr{kSHuai(*vUuY`|{F-%dDM$R-BKv zc{TxO=HsJ&*jY~Yo98@kW6K-uciGm6>GY5RjjTuOztS-|Uu^m^fY02(1F6ai9C^Ct zJG04Js)%YS)A3+`ejh!)(>Dw^OGQsVYfb5mZ|6HdAGYDc1)vF7u3oxZy%q&M0C28C=637uddIiBDVeHmnJSUQs5oDw z|7-*yS-s_5VhAK zIhYL@_IN~37j>>gZ#Qqe+VsOALW`Sj(1ldFjCNLEpkU&Qgw1iU;p_Bpw0Qj~{ zi_@MVBF0f`nY6MsziT!KQoY!;j15^lSKT{QCvEP{YhU&7{4e$J+XL0?_f%ZpCjZx~ zPybv#+gJb0UrT>2nhYdblw#671Z-1m$aEBCKK~smhEMC$Z$9<2zg7%yo;~&>pD%WP zYk&C`G5GCine5AB^wYzB^~Yu2sEuXcbdhF=T<^tuO&eI{2nJa@9fUH$_Jzfo>h}tK#qOe$b*Y%94 z$@#(Z?YX*OO6@qEi(U<{?Ob=h`0{16EFcBOc8HoGDvhDF$}u^^Ds5Kq>CtMdsW6N^ z6aoMyFbrfpQ67_c>o<%XG~!hg2uh!I<9E<{rI%ya?UsbscpsY!26XgxPq(A?m=T3$ z$x5ZFN*8^P2Bavs2@3Y+3r*AjKnAV}q_bEF6VhqjVH8R&?NwFJn7RAsBTr7gHHs%n z+kNZ%pUO8A6TwkyWt3_p=`tqcLJ=(cn618cX%8WuYvf!xZUC^zT188_=OUOh$EK5I zJh^-ldjosBS{^80vhF_5cN8_(kLTmJao(e4!*46Th#lD(uAgZeqkVVN=d+*7UW`yfJIdhB))oVWFn7dJw(s`O)i3Y)P_RQ2cNT{n?WhSMEr!{Ou;7ZO#t3I4Tvg0zZzQ&@ z(J@IC0s3X=A*)`gfo77r9_;_+)%077lhcEw&j0`b-w|5Uy*La208cbmsM55E?Qpug znD5WyP1Qfv{&2FeelXnhXmO{pdwZ$*IkksY>(qX{=4TORb(QAUSzQUv`|1pIdzA;m z3>##wj~r3Z5)PjnnG_u))I|ybV>XaM6ap2XG$qx>MFn*XpbbXQ#7%3=`_{RHpO=i_ z+|TYspSs6ZySdidjpMfOVRh|u?GwWNd|fqtf%aq8JB@I-vD0w9Pj&Q(yL<&i%Ru3? zE~Z!Sc&VE|+wTqewy?HQMhx9yE5?=t(B?6)D(3(KAOc-H6^yu|0SwGGUR;@9oS#lu z5qP|xa%s4$TtEc~0G(h2b(g^_<}Ol}vzmqggFt-0C?f*eGs4m4&*SxhxGin0r@By( zc$ISVfF{*ey$7<*GE&c+Dq$v5JG@PdLIuP+>_`C;qay=_k(d-+&>=*kMX34*9QdFs zu&~u&RoCU3F89l&PeT9zzE5aLb~4ofzY`3I50@v}G@k9o0y(bz)T=7z2P5@z?(lnD zA8H(m<#fv9DR$52?XR6ruiTwNYc0hJzOkMrK!FVagM+Ci z7$5*35C@3qZ5dP(f%#Y{VoQuXh(6s>1`;lw7&twCX%p6nJ~a76_4+g z96~YxEFqOQE|8^p*7!-sv)CTP>v9Uq7uo5_A0M*iegvnc#}z=ESU+5AV8j3j zO$O(7uGjtaeeugmjb(0izg{z(syok~e(pu~@iZe7-gs7bH$N|r0bn2)y|?b!XLrZj z#nh{-zA@GbKogpfV}LRmQdC+-ABADUSsbFK!(>Shy-A>X#%8<{?)R_$x0dn?O&v`p zQafGty1(7;3KP!LN`NQ@b)k=)sVNS=_0v%xZ%WNmCxv zWtJ}Myhe?oDNQA(U+$Hd1QKRJEzj!cj)eBRyZl~OQw@FNQhA}5bw4k!8y@p$x3E)p zS{>!a1ZtWiZ&$u9bGt{5!6R{*h01%bQoW@df1iJ3vQKe^_ALkMr+3U;V~K`r;J7y~cOj=8})w)=L8e z=VwQwVPb1rwtwS=>hbsm_4eL=Wy@>I>yg#I@q0b`PtLyoda9qUy_YXLy8xhRZ|*M- zC_(b+zAihp=C!S~$_1Nk-Z$T`;og4#yk_3hDItYl&bjF|$aG0@8id8txSQTt^V7X- zh&H9WimcL(lH>jEr+4*h-+#S*Tfn{VwhpwzX8SZ21)+|1;HrpY1X0|fgnIDahg0wf zZKY?mV+BqUd*9jZnQ2YG&V0B>*)ct&!6h{0zKx%V8#{UTa98RES>_gXBS#3Rb6Q>& za_D-FU2%n$6rkimRTl)qp50&j8T}6KEZZ*6&mZy34 zY?OckV+zSp$waw3{(o8ikEFkR=r3HOe{rDzXy$&~F9XnW?)st-!Xn$Tr{kJK*{=8I z+j;Q(`E7Nr&p$plxPA%m?6v8F^x&7P#oN59E-a$OSY}oB*)uiw@yP9cpV+Uy>>C3e zdLUqknjt7iTL-vHv&cFzb#m+yM43#1(VVqOTuwx@u1gY6@^$Kaw>rl;O`(Fo+2x1b zM_=74f2W6c!;5crmVe*XhpfEN(x?CcG@A!d>Gm_gCl3Q$Fa>~545vI-ZT!cF{o7KK z76iUO?1#^+xJF@S%5VV%`ZGU$uCtebBxaP%I}i40>^Ihf^&H>s?d$!Cwsp13zP`UU z6_;++Bo)5Hb{@K~cCV{d*G~Ox<+gjqyR>LN^?@V!`Qp^eiZ25vNm7~6ebyY@w)OhT z{rMN~&o{XXHU7|9+Yp9~=m_b;Slg|cPi z_kRz6^_6qT{P&r=^Ey}iyX5i05{po(UpzcDB(Z=Y>gw{!*U;*{*my{{xUKaypHOre zX0N{a#>{+o@ydE0-Ah!GBdgopy87!!cPU-D`)BpO_Pe#-p=C^C91#Gwb>zc5zRx%1 zz;R^WI<~d$ueZu${;>aSQCNd!L|^Z{5J3c#H2Qb|0RSSv#khp$JAM?LI*#6&gPOP4 zhn^Zt<_tM1%(zAHk+*%j)1Enwp3cWzwba(3P-yu?gcXUJrTa-?O^auG&6wKW zt;;MFGlK~#JjyMcU3|OM{bYOi)z0|yPtX70YWI^Qj=}C%o%tg|sQPU}+70#q3xH1^ zG6p=Z<6RecyJvsuAI4w*XE}f1ZJGNv=#iT}CUx5`^H( zXUA8*YfW0z0L@mq>pNx$v&d)4b=;G6a$NW%jj)-TOF)kCR|oH3*PK0RX2Y6hIV&06^e) z8NN8gekGmkqJ- zxgYO(pZMH-M2fW-80%?WG%MQhJ;^DYEYaDF-773@OZWVicI#}bLLTyy}_0vRK~t_`c`U(`tvzG0C$FYXLwd z!R14DoSaYD%s#Q>*-zckJ^Jn2hBfFf+Unl)db_^Ayi7YHYHMGB*S>X+!8bNz0MMXD zjsdQ13_dBh2_quPcqlrA1({AE5C;$tfDlk{fRLlTIiDeVZM!8`W(JSxY-OE-qWJ}E z6R8upGtWJz4^en0X7>42{RML}EJ9!e^Do9E_qI;%^YMMxUhb32AgBON-6`I@vSPBw z-F@ZgBfn{~{;(bZ0I>5}woz>bdHgEM1eOXlC42K5m%R;HZ(*6w0ST^(kD}sQZ#!FA~D!Mh=2HB>TmqM`l>qW4gM{8+PY2N0K@%5MeH-L`+*aP zy|EU_99weS+rBe%(U5&sTBVAJfBEzIYGE#gwW`%!cbN=e&im}_tO4dTmvgK8`SQJd zEmFE$KXhEPhbxEe?3wN0%*XyU5oADf#{&R1Uir32Z-24jQSH6HW3?;+p(tiz9&!qg z8HU`WwCu?gf@PZt6&ffe5;?`h^V6Q!M0!*w;z%b??6SD@BwNl(C804(JLo};ofcPE z=FrzZb2lsvkkyuJDaCpF%;!vs*#ZFM&w8CVqmQ~^(Oh?bX5Z-rg+Rj2;esy6P?Dkd>PEF%ybz1AdA!ckufyif>UFn!*{{bz ze7=fLSM9l5RywzxL#5s<^kNB>Gm|F}k?R-sfBu8y&!ewZ}yk+LPK5w&CuWEVU{-Fv$M)j`sZo8&yg<#IRp&QW5t%*y0 zKJ)JJ^n@_QPwtl5)^@v(3@hFHH0-B53dU3dv;c!|Ej#y?j-Zj9Ct)MRq-os}lqMqN zORn<}P4USprh32{OEf8QU)9n=KZ?fDcE#7(%Tt6b;&X)7oo5oqAk_nts1*60*6vg@ ze$4i%ueafq;C01{U~faGj=(KV-g9$MXM3t#-rEm<_{y6d&B%m)wvr7mCK>&I+$ z{io8?t$2DY|IN$q482w3yk6FHrwl!w0~qowbeSkJjaTcG9>%a747TFC87}Rz27XB! zoj>?XrGIMd)y8u_y&L)SK3?zmhmC`!y7Wfxi9g{9TOb*C5C9PXFkqbRpU?aSRM6}6 z7jJi+{>3dv6v<{r8w&-XP-B9czvKEcVCw4o)XnEt`_CTze_uP_*FPk4ooDS`->R*u z3t6hVujMYMfPggtXqveJN4|SMKQSkjt(n7dy!Bq)TygPb2jA~!=L@&)fUeo;!p^8w zwZ1v3T63|%pwzoD5hB_PY(W&7kbNw5Qpz+y7_mvjggVa`Ci>Arv%6mlYf0sBygD^7(-R7H>X4(MPfrQ9vRNMW6+;0s&C9-0e1VY3^mxU432omQr*4=$HFe z@*VH%b*cpsBqTuBA9-hfdANE1Px0xq@!d-L9&!`hZFHK~kLqTZ6Htdcjt?R^34GNh z+_U+}S{h=rHh3xQvow=pB<*zbV-HUz&8faK#+#Gn-O>I}My18GpI_|qqdT0&k$1Cd z4t;6&h+C_74_M|@0E#FZ;8_2+U82M>^H*QH5fM{tR&36+sv!t~Aeel=wN3?ly_;U# z<^7%h(@|NMd$=lK*&?jmvn;w@hYq!Jt_Dj$SknrKnz;dQsh(Sc1^_Y*ejYyO>x{xu zXq~)O_?XPpE#VszUT*~k#b&4%Mi7%Em1r&z@hUNj9I+y&8naJ{EgYfB9IJ)HxF|un zc#vx{&XD5>U*`L#etPaanS0BmE=El?mM6$G^01zl2q968s9krdnS45V_j3IrMSD$F zRNp=Cqn?{{M!W2Eul;?6ovMoCiP7Tvpz%76R3=3ypf+T8xD4o^ygv0Q7C>hX9RJME z@)IBApIcvfpY}t{`*?XdGD1Iinv*2s#P7HH4P}>eJuoby5+YUW2>LcUQA>2!x8EBd zueaAzpQi6it-Skj!qZ*7jppsi`&_GZ!@pFg(k<#U4BUAt#}=m!orXXUMqPw&P{>u$TDLItjs zApi&OZ7fvqdEPkrPz6h1oRt-Gkov|zKu4vG#{mT3B>(f7toO=x)vKs+YN^%pyU}`s7sO2?mMLj$Ud`{_>oggqYkI zvs)_E?zaKvq#bvw#TpTnFO>Yr!FC>A!|7C^pa8onK9YUobGR@(9|H(h2xslqOQ%@z zWSu=;zj^I|Ti_55FjIL_(>2+&l;*f4K_nPe7men{k_k>$MjDoWQROqzOKqZGSAE}b zb=_x89&}rGUZNKhv;Xigahn{~A5$qUH(leqTCaR`R#tLly7@YoZ`*0BL;ZOM`-7(s zhiIktvErcG;(-K`CMf+Y+;CyVRY2#<6pu%|TulU66x3h7W>S0sp?!Gc0JT0p`Fwol z2089ht!iiT%w>lTpJ~V4S{LUPHlryssvCzabtk4x7a|b865LsQ2tdPH7bf#~hHs33 z06wKC9D*PK0SE**fCG@@0T56C0s;VpP=Lw2@=uw}vk!i{pXXj3`Dpvm&{Q3UNn{2l z1{NxZtDNWN>F|bawlinG+U`E#p7x$@Hvr~@IgQ|?UwRzS>P>8X2rcM2E2q4@ifg+Et6Zcg!4BDHC*ulO)U_$I&7?!MO>`t0iMyt>EWkc_ zg&Iaol%#~5TdI3b*N!Jc-?HOspBOspdr?JpH0peW4#^+Xf%PbiggYByIu8(W)LbiWC?xJH)zsh?BE~jtL`K2FKly>0#Ja~zgU@=J{eGa zTKoW5%8uE2hvl|)Wuo}BYpa$XJ|}AIC>)hk_X^k4hwa+?tS-0XA{r2gAb$e+WUsp3 zp=ob!ttc{W>>HCZ5|T}tK*PI45y zYe0&22!@S19yYzQE_hc*A!0$IHW3$VfOV@m9d5HdTyA?FLyu+?!Cl}ds@{dua;MQ* zbGqNA42vCK86rA%hfkH1!t#!DFlG>uj#vAx9!jAAKuc-r_OLsdt|ExDT0x8uk@#>? zX^@pAW#!I8-Ce)5U&h+7Kl}TC58qbV-(G0@B;M9$T%}8%J6uN) z1mTwed*8>1s%j})(~UGZX2e0%yD8DPuGx8 z99&vnGI{LU-K;vXV?EFGeP``|U02q%x6?GW7}JpH+3Ne@UBOPj))!jwJ#rlUyfq&h z16nGh+Re!7W&pJ2LaTM(=W3gyae3`hz=T$?5wOiVKvz_bgzWQ9h zYGXWndu8uF7S3W<|1-B74m;{KQevA~`pmP&9yvlZ8T%6Q#yYcyeIv=!ny$$y=geu| zP#!^H94;lw$Sl@;l;^QYpWb3R>ZBQ#MX46n(yi;-{;Vxp{iNNR_gOA}k>$ zw$96c^|AMBrrQu2shYAab=_xK-t((P*+1Lg)tztMhSFO6Y>r_J3Q?wgrdCcpv;g*} zxd1Fz3Ru2_&~NHt5(!D;LsHl4OdfT0*Q+*}0q}{dKJMBN$ML>Jj~Xi;#`>g-8;h2I z#;Q`J%rmOoqm096$ivS@pP$mpJNL|wAL6`TCuzTNuM@NP?`!@V`7lNB2u6!GqJSxE z?L*GZ+vVGx1C?pSH{G1f(`W*hR9ji@?LJ4Intkl}Aq;j#sXAc5Akn(}*lEle+UvMw zHgmk=sR)LQ&`Uc$&ui~;u&`1}vnFquv@cjYaPGtTbRY~BW;!EN;V#O)Q3JCdjy7Aiz_$!KP!2#!5d{J`O;qbq+TC&(^A_S}eVa@qlcZ2BU6gtrUd>glw{$2ZC(%i5(SqUT z%~~&KnoQE6i2zp~MAfL&6@v&gHy|IHFUwG^DTGGq*YYKb4|dnT@^anTjj8Kz9EO#r z!4X>U4I3B)iQZY=@dxe<5fC*o7vfFBr1YRa_Py2j@L5^?y!YqXm-m);&h#dJzW#U~ z0CVC+qm{2r&DG*dsZ+0j$H2$fMA&19(+Vg=rBFf4Vkt!LYprA5`TF4Z+E=|Yd}{z9 zK>3J=0Wv@*C{O~_AvHi*#;|wc(gA_S@Ar1+ygti6yvt)hIVWA9qSf~bryH}{Gsf%8HgIP_G_C69jYmG`d z$mfQUgxab=wOzT&09#!F!-oqe$3*4+=?YpWlr+z}|03aDyZ>0`!YaC^{$t&x2moLM zVFlC6$`*3O#F|##Cq5U?3Oh$mW{&rqzPF#vsB2d#huc;)EGHmN0oF9>T(`b;oIqqr zC=Q)CNrG6H*0>W8ez6MSeQr~aL2b5!F1oNfX9NHM(21gO!iJ*3u>`ry= zDqWeCcN-tIQ9${UnVGW7eJk_a-t)&P+q5-n#g6w&W%_PDiY*<=dv7`88@~X~Ey)=@ z#T)%dA`1XjRV2_+X8+XH+%v?VrLDZK*X!dqzZY4orupbB-3{knw`NPzo6WU8Ze@bg zvcV|kgd*#yI*iHM@f^CeMh^h8rz;t(sG@dsDl0cvW}~jlT~fBQrsnd-rt8CppLPmY zoB5+R9`#!e{^Pd)$Hh4B{9WHZ_OcNgl+<3)2-D1JrfWRD%yMfV-oZN0Ub{HftnWMY z+B-HZK4s}S`(yiZFDk=uNs5C46htE<0%RoGXj?=#nP!YuSbagdIFJnr06x(SgVh;^ z7|V=`b7qPok3h1?CZxCGf%MVp_8~DjCM+TdZ~y=>IPcRrkS;PdEfs;#XV~!>-QItX zSB2@@Y3J?o9`hP9Q4=9RPz0WAz7aN-Y+1{&vGVT3WpzbrX#oI%5lRj3+i$n4ows{y zso9FXt*PtgfMMQn+!oQIW54LDNIk6vIZx7`co70YpaG74`Tq1i)xPi9KdU(A&d-Y$ zkp;FotEM8;ZTGjHyx+=A<8V7ow>j^Zl#c36yCikm^z9RT!{Niv|(N+W9(I_Re8sk4$^EAt5AY zg_KLy><}=Uki&#HnWwJt#VlvgRZ+-b$zkEj?<4?zLJM*Ln z5Sk0x`jDtGoZ{Qhnv_6bC_O*u&8q-tZ68pkPrnZUf@suMnz8ETR^xTS73-M^0jlMu zba%@w)La9siWHy?rR|!m+ELkR*-(y-3YpEac_`GbjN+2!vi{?K?1Or0Pydk_sgnjr z{10pO=3Dm{_xi;-`H_A5{qpdaJ@1MwU7*5HDVgs8Voh6HThjYXwUz+ytEb)edEOiR zsBm3v_V*`cTt^ndET>Y(d^59EiIc5uUA=r|fAs-f0Fff2G7Dy6t@Cc~8LdAVcMCp2 z&DE!S<8JYU2YL|qazdRi0E}2=juq_mzp@MFWYEt*RUKv-u)qhDIr5aF5Sc>^J^=y% z1Y1NQBU0WvcMAZ30OL%_p6D>?#52<1qZVXa(i z%5^v=R3bAkoU!<{awd%GHR6&ub-Gf1PxqF`C z+y@i15XI3#w&|t=Y77JS$dO7|=+1Yu&$nD(8o^LeiR#nsv;YOosN(ChXWZ9|vqM<8 zD(;Ti`s1j@7AOGhxF^paefaTt?p|qE;T`!ej5XsE_wqhty$^}GJ#KDFo8JhzaYf|TU@oXXOxqqRFXojBPF$k1xjwSdbN}PZoQxMAA9^E&VQQe;Iu^m02NV!!{_5319A4e zUlCrC%<RF3}CSct8SbOTb|`umdup4wHrcJ zBaY+40YCkG_~#cYT%4vO=I6u3kY4>jKIo%bu-P=HoCsRVfgO-jU@#Pl4q z!lh?(QgVcVLxXBnCgD14YYHuF*V+CMaw9~q=w_-Wl&3y(Vlrk1eBa)iw2U_Nn2voI zJFyZov_$oV+kv@Hg>Rx%whdG`61tB(sM-^-sW6>Z;c-s_Z7Qyo%KM%hUNGrk&Vh7*>G zym4Zi8j2Zfi3ErfjoPIlx~!z+LwX> zwoQE{wLDpa=i?`p-NytH7)tiFF`z!!zj*T|vG?`*@64zf%a7?P78aqlDp#>L3FfYwW00jg< z9OWkqfI&de$mAg}K9+t+=vx{b-1vsed@#LByrl0qT;msRogmAro4ewDc(IiNsMwWdGs zuIDnvqCf@!P{ZBm&&?eJa{PAlQ{LWe&4&R7fRh_w@Hutkjg@iAH9Pd_a6kL}{Y!?P zp--4SZ|n2=)ANt^_xJV3mCoKL{-x0p0-8XUS22w!000sUYo(x@H%moJ3_?K=z)UGb z6q!|uHfZ3q-XH(Ciywo3lp(xbDYDtL9EU4$G7EK#q6E=OD-{Dj`bwmElkRRo4e5xr zannF;-q0t*&Ro}~SCbXKbI)fQn)cIVkEq2m4O$t1VY@lwERQz(B>;f7R?EJg-cQR4 z1zK#y1Ra70wkP{3!#F|4yo7vIlhq=V-9(BBhb{o<@kPCyymJVfY@~ymKrs2Nfj`t=t|xm ze@^7Sy3bLkJ36X2nYs4*boo!wU(P>ePXB^g9>8hsV9niHs8F;yPy|34ooGDJFvQ=6 zB@|xMno}|6%bx%Orb*gmR%f268{l+!8}|%Z5Z^BPY{Kb$F?`@-o`owh*Se-bU6XFraglXV(&=23cZga!gzYaUP&rhD`&TDwd+4~MK03a*fMA{LcAp$@QK-26G z@W#7xzT0mFfGxbZ06eo47;@FM&r!dhk$4yr_yR&vGwD8;8&_9_7Ke=65zm$5EWiXy z0S(C}R;d1@8|B;VSueYUY>b}YC~ZA^t4xSE1u@9fRd&ClRqRr!gVTcPWP|&2g=O4U&Dv`iG0)cC)!9v8% z?LKn>>jf5vp2L0m&F_D#?YqBjd^^k2E22$deX`8lL*p#@>a`Jj?V2w?^2GYteLL>E zRkb%X)HM;{Le5)VfgnWfhik2g+U7#m+-tyNmpk9a1Ay?_4+a2SPUUeBmtDK>Kg6M! zF@mHxc;55&ws*VF+UM2hHCyH4vS2H$%flx_)@jlpN38A7m*6f(T3*-kIW2bC>HqMn z+HCF*wF+7Xh!Un`l8x(V5Zmy6`WBhUR|aBg9B3cUal$_62i~1Q2XvO|w$a+uNQv?I zEqUMN^Mic&`g9(cNVQ{g&0N&8WfUum)b68jzGP2wZMv?yqZ#E?PRm}bg9TKyHV$!6 z9S)0BAYfLG1SaCchoA`oXlp1VgrN1nbK6TSUlE-;b}F_sbWN82CL;s3LRq2@o0EIz z452R7(8O4StFSIVn}4PQadt#9Cjv#9P0#y$1qf^AYAtJ5g}2`wceh_(-wK4*+x-CJ}-$!I2$D5;bJaZ$wP;seI`i_Gm3k>p+v3tO zFyl~L=tAk`se;Y6qT`ZOX*;)Trbs}@qpKg!=9d#x_}ToE<4t2;*zVbAPq(5^DHmLwDV)&1v|Zd((AZKS~<}D3x~mQU_{i z(Y9B&@52c|f#U}}#<#Ejbp43kRG~GOy%WZds-GN>1P|-MFapskz#tTdi3t?C?E5ZG z*SXwtgR%q#W@(@>^u{h2a3rYhNwy$2#%;U+bt95Wj9PJr(I!9u1CAbMNlZoAd=p$fE_8?U?hehNsz4@yOpVP)?f zB7kDW+VTN=bdw)+v7yxa0a}x#_-x(BEnFeWb z_BrsDuAw%0>H|vkQ>IVP+8S6WHSSGG>E`SeQ8WP0G0*n6ACBbhb$I>cC6zTQPtp<4 zUo4;8t=-Rn*v6LIQHymL5=<4LERC4vV4p|mbC0*L;=Mj|+W1!)`ZjO2racN3K&r+$ zRt-#@-TVD?xBGBcUSCuFEFlE+-F$W5Qr!hK?Eo)cTmVme(Ged$i810&dSw)1wO{~d z>i7_TKCtC=w@AG39Xxz2afv(v@Kb)SEdlVVyvDr1fPf-@-ZSot&<7lH|8Rp-=5-hZ z95aLqX;UpQ7yuXp$yHZDuLRwxD8Ryq;EhfsA2Z$8mzVK882|xL#oF5TZr%p~pofv< z;k!Bal|lqjN_5%PX%>(;jkC$7i0!g4v>50WR#4^yyUlV1bw4+E5&+RO7+=QpM?L6hIQqny$?Og%fNFcIaAM+s4uXpTu>t(LfCmo*t z2_NqcKieCRU#xAe;^{Q`yw$82K?X&Pkmzx?3gc(R)9d%m&&!nk0bVm#-ma~_e9@u- z4G`yLO?&a^($7z7bvJkP^H!bJPx^dZQ&(m@ec4*k7tRWE+87|b_`$%B__8*FqkOWh zM0UkJI)FtRoDv!TZ~$wOP{74DoM8_i@(6^0YOGOWkeEUMRft1`2tu4F3on}B?P9=j z*+M>vmhseZ!Ps%vFo~=GwJBSOE}<6s^P(ELcHp>&$x@?w2AQB#zulE=RdueY106-NXM$=>e!8y*1 z>dz*h&U)~r)R8^h+_KmG&dZDMFjsE#c8CZ=hQJ(^p|w_pGF#hf`_>-cR%_0_-@Vo2 zi@DkZHwb`ezpwskyc)-IIHXUyusHkN{8>8kmh$!cnOqCii^U1Dc({P!0`Qryrme+6 zvz@m_6Y1<3CJ|PRESz-w5c8g<4~76-u!I5-0D%F|3^3VHKyU~GClCM>0+T4G6aX;C zsV7F4YXY-uo(N21-myXQ-^Sl$tmQ&fQ6Zv8G#{Xsy?l#WlK}>*A^??Az@_!e7zjU{ zt?TXLGb;*?w9-W>?XpUWP>2<%(W;HJ(txPvPWLp|Z0(>l>yfDA7v0(pt>(+qskJpc z2AutlWGb#fKxpVtmccv(wDXlV%K7SYi&TjGe&@6=t39nS=!nm9xr_DURNSe9+jeyK`Gel~-gg|{ajTvCG58@27chK))?5t; zjK8SROW?3EK|t`aQ1kiZ`}jucxDVhkOTZBsKq!(jRXDxdR9}6)*57CGxow_OWc{1y z_43Qjg{_~?J&f;sX&?XqB?SboFQ5#RJ!xs|A3^V{m~-k-kI0fjEfx)Ve?K%BgL?^lNKzvEacI z1D;}OaDn8u@pa^)NQ&3o{4{6i(E%8UV!%TdIeNDjWorA@KiE)3006Lr>ED z{%C>P=9yc*2?+$NRukSgKHvV~&LN8zR^CqBn67kJXIF;=B|~WbIn9o3W+-VLVb#;D zstuY@H#(`emMZX6iEl0}KF_S{+V=GA^a4w+-;r z0$~-;Vis29121i!-F0ui^Q8rC;tET$86q#2^}43j@NAyS3j}01BUYbIS&6DJcR(v} zT+k(AOcZl5B8om;ZbvKtQtP|@dhWJ5S5(hc*@4F|0{~PRTjLP{;u_Zbq`U2IeexYZ ztGsDpp}@mmBgcd$9(Egk<%EqG@-Hld4+wdUU()6@ngSj@@A@6{OJ9xN$Iik45Q22A z7#J)L24;rbAer7Yr|ndZpnP7QS7nr&3c$j`Ns=T|9L0fZSfypOn{+qR5U_F8Q=EiW_X@jl+LN1#a=oDowJbhWBrm(^Jg^1?{C2=j#Oz&T}~8V#m5ye zoZ3oBYcE>HuAKc25BArKXKV_tQsYX7kf5Afb8{>|wY3;K>c(6UF}A+7;XW%FnL7Xs z6cI<@#f3nCfUrDFGPCMtvYlTyQs+7AnupZIYfAmjSrdsIz^f|VaTiZ5v=E~9srZ_| zj;HenRj`8Mhc9H72^D~;z8MDw9JSZPF0+qE$WzMX*(Bs5OWdo(I;jlndp=4B12b7y zgNDI;o41Va)q7puULT)&za-3}Z@wWA00NTEk>wMg+ej^P1A<7rjTBRV#&h$R34A+v zd|1_&WZu>%&aS{_jt-F@cc&jkXx%Ck-pMIfiF z`@+z*JwI~4?)TOTP10OrZ0)&3O7{tncdqSLohnV1LWlvtvQIdecNLI@!>dt zFUJ93l}=HX!nIzsU?8*%i&Be|+xC0RR|@f|O8@3WP)eKm;f9DM#j+SB*sxP7sQC5>R`W=eNDwz0Y1h zp%`{tre(UzcckK?2vgPV`?6dIP1^<}K?HU@?R2XEWUz{xbXJ8{8g`WMe%s^T4^XA5 zPUS9_-YMU%iqgVhCj_7t%fD!lfB`n!6Wid5d8zYowM>)C$t)EuwJl%Y`mWXRph&H+*VI9H8{lXEDz&OMYwb#hb-Gx*)_Lv zw6rrFx2u%%vL~Yk?eutHKr%IVEi?@_mCJuSHxw`r+Bv@wY$p_07>^Rp!+(SJrGSWQ|a4i!~4wBxIe* z%V1CL=pxj zb!$}?+hGGfD^*1DbWLi1Y61MlcdnfXg?gav<@)T=zSEUotyN#R&U0Q~TV;9XnTIuV zH+K!Pnyh}-gpiMJ(^Y9!fB=2@F~2T17S_R7L+PW6vy$S72aXQyei<7Y1yS$ZI0Q7djg6LXH1cojOVZUox zj5n1^HA=84dnH>yVN=lpf~ZPOoz@1%TQgUQ6VBV7o1at4Fr-N>OQ~CK-W%JjN1boS zYqp^RfUG%_oZscJt>oq&Hk|{n>2j-D#CDeiqSdB~=NsH)rJD2o*^SyWPDN?0{O2+WqsqE4~EZcmTTMlUY~g?uUhS`{(xS(fA&Cgnb+-@)0L1~Z0B}55$GCYSXBxH6AP{?gmI={ zmXj_WRsqHC#yE_CV3k1N={dExwfnHIJvZtuQ{!0|8)Fg2W!SKhuF|^M`f=Euv#obW zP4CN$x7W@-#;``wxY+s#%ueH%<>@DpUOpi%9$Wwb5Cj+EJykkA=ABnjt~B8x1S5~l zd%jZc1wbA&$_#P1D9}z-^j``GVs%harg>bWRVR*)k!h)6JKA&nBa! zgg~h+MJC$!?U%dhWo_Z2HL-B(u^)FtUN-BZl|S&Zxo62P?|h{&_Cx8-!kZ=t#AM)JnuwO+UBqzQt`l$D}5 zjG+ZI5peMVvW?S_k6jiZa<8XH7YFDNhT+aI8-VhMamm$O8c{$s`o_!dqn7bWcF=P> zh)bawEox}&^vMRG+@waU5s_zsgk;`pSpA~*QF@{Xoc~ftRv8e-#p)N$8~_BGY_jrU zfCFBJ`nyKk;f?kA3gGEGPmkoBY%^sIw7vEI(cRB>F7qK7Yq#8G>q{5jlo6VRrA^4L zAN!$~ym8lSuZ{fJe*xI9H&t)GHH`5XT2Mr@NcVig_)hwFWW1T`vwMysR2ZB4cwIXXN(YgmffO&@_o$I|!ghykh?sq-Xgd{RV1pi{S^ z5(D?J0rXitfRekujzNR=DyFkGUx(BtULH^P4}WT~%QrruL7Ik63^GKnf~+j9pMB4t zez^$ZQM`%Jl57P*XZ`?_+uD@tVw3Hx%(YErANa05R49V$)KZ{SE(WwUdknzZjv4o+MM_v`Wp{cnlllyMl#lp6~ z#Kv~VqH&BPjxFohEVM$C)i$>l0g+%EFvW&OCh_-3_a#^N;lIJ5g=f-90(V{iURD&m0|=Xz)=a$kUO6e-fUg0H5uRf&JB#+{4LL?-L@q!F+PjR9dI?~6?Du@;DEYhggg=l73LQ07AkmJ-A{ni02&fSV7i167xErnR zZd=u9fydTbt2Orkr$AW0ZTp2*9D#=^aOk#USJ_w^8G`m&DPkuU@yKX#OZTwFD#o27 z@4JULecNlWT#MLIu&PK)HdIwx?tvoxr6f}s>f5nP(g>ibGYUJS5Tl~WTXZy912k={ zMfkbV6bC!9Gvw}eExzNJkFP(R=PIv)SVWov0KgjO{>V@238umSjY221%*)ZD1pokw z17uJzH;3^IAta%Hk4OKSuGLRLtRC=y3aF= zDmn{IySz~UB421ve}k&tSl~`xb&bU$|2X|V`_HyN!p?xQxb$XviOV4n;2==G4b{&~wdqzqm%hJKe-{dW zAPm7Wup~f$394dpz=t7_Zm2AO%Nq6|(e#Ia4{%Y?x@7pVNvla%e_E3RRS{$V+NL6hWJkVmg=I85u z)1ANd`f7$ST~1o2soIdTYg3CsmgO_|iBDmH2m}C%6Ld$z#A1Yu@2+q7^$y#$b;{bD zKG5D0DV2@`01+TT{r&yNpFSht)LPG;0l)zBpmSkY24Ii`Ez)c`KqM2R#Ym&yP*4Du z0&c_vVrO(`FIya2g$Dui)cA-O$t!#6XEkQ}RV8g~jc%e-mS(S>5Be2TimN8DW5KDB z;Ob7rO${its&ZDwhoNx*u2NPrSq6yE!`W}!m5Jl`L)zimH|_V~|Jdi=ukl(Z0vi>Y zLp7ryDq4XG`Rqg5Vvn5B2g?aNuH%J^YcDPalj3lvHpvW3i#S|$@uqeYp4WFU7OCEs zFL+E@GwSS}Lx9FOtJI3yK@}90MX?HEf}{wv6j25i5xxVo zDkt(^Hl+YqA>_2txG--%!ZHDY4<9go(Rp^pv3dMBd4*zBF)Y33-QKw6hqdR?y;j-x z$;tmY?w{NIE=B<2??MEoAu6@hdOF6%U*C>!92np3)Ctw6`-j~+f{ltkb77yhIrwI( z)&gZzEQ6K_1sqvOZSFATkMIn2Wm8_O^CUu2Moch3n1coBxjLL4mB$K#;3Hj?L=Ek+$u+~0X|q@>qg z*Fq{nQo?HHghp3`gq$y&wbVl}Tns>n005w0d7pKkc!Lcs4p}dqSqAtHKwP?a4w$QW zZ2))~>K+9tJKOqIcul0a+Q+5MaF`A$%IaXPqOw?k0!5_?R13uf<&Z!vOh6WikMIc* z#D)qaqRY_mog4BwwUQt)P#l1jWgZ_MKXCJ2C<_1E>SH_kdY>;{`MY%f zB{Kq}04xE5vKmsQnL1IX4ln7|u5``!fKh2DW?_c__`GxPaF5eWz8&>j9t_Eyt$e#S z5FmvpF7l@kJS-4m)Qx?pN|i_gO@PxH%_%T={;vqCL1=P+kZLL9WMl^G>l zr#d(o0Du4k0EpWxZ+16x`qk)PMLz4Je(jRHWkxmy08wELJ@p1QcW zT3);wpb{{rGvgpjRM2;4nZj7n+nKBT&LL}~p}%DK;qMp$t^1URKg8OFr|jyB?`qWF z)W+7jK_gC%hSP)S5g0CvJ1PJG_yVtcJYC#sdCs3d>wWgRPae-TAPktD=ylg&_&Hzq z#X7Fh(54_fZT5A!bz^6_*pr7%j+$+3IRjLQqeW2;Pasf>C}-A0Y!8ZI!rWY|cd~Y` zIyp6J0kyu)E!R5I03k}B>=Rpej$^9nq*wZ6XENdRUY!8|wlrdGV0_!PYhxvfN_LWV z^ynZWWkkgYU&Cw@G*Gj$&klL=)fa*SFvjTu{dA`R=sToM{o|h(z8O{&46rc?7*AHp zJQXsbOO6@}WL=ahNOxLsFMyr)u}?AC*1gRqiu9(?OO&d24R~zlotk4npeS3n&bG$e znB?eRW3&17Z~^6M!~)8~C|I-d#?ghR^9% zh$pENcOU^U!WL2@-O5jy@=N@o_ISXY20x$Cp^2l3O3oI#sA-|h4zl$cLBYkb>vZ~)2cZRw zK*7b0bel7V1{Uk~AOHIOX7q+qAU2V4d-wK=j#^F$xa;OFE}(8r3YyI2JB(PQ z2?OxxhBK3sfOtyFl(VudUB-`#}(sLK;6Ubn%`qY${r|J#FjKkt9?Y#CkDr>wV_wUW68m06=AzMvGf$LW5wLzxTEj*=C*v zn#pSK^Vp(jsr(1G&uYSi$B_D9>>`e3i)APV80O4&BtX^JnfXHLB?G4 zLc_uUz~!1i_}~FX#H*oq_NsfBz4Xmv0Rwk&0YHSQrhWB0%U36L5}Hhi*;n)}<)X7} z0B)?JLpoQvM(1ji4V`l~Wh1F@DsM<@TeIfqIix+h$7}D(zx?$3fB(kU{plC1coG;R2H3e#j^ETd(xab-`%gK|}7 zh8+TmZo;hEOt#!27zAhk{pCizztJE1`|&-#Vb{C6x7FG~8#^*8P9WjI`T<+wi9VrO z_ul;Lk8{CLwS5p!Cy>4&OCdf%W8*^k0IIDEwxA%Opg>MyDp~ngW%VPxqfbhXV z03PFmrk~yXp0hN4hRHCDhu7UO0DwctHfOgN*Z0u(KvPE&o*g6jwo5nkU@fSCI8n6f z3ZOVd3NR02#`66fk{_`c4s-^rn$vU$#j z!YqJB1+?F3rGNFrv4;I)yXKprms%9?#?pUe$RG|A$Nbzw^Cs)0?aWoX+1elZ6App% z_n!a2`QRizRi1yxV!6OY9{|E$C>b%}4mdLE1_ur#E4y;kaf)sHaoFDnU-DDZopu+1 z%mn~_2BL5SJ7pBM(h)|gkR99h9%GWNPOysi8W3QC7$E?_#SggZ>$P2FV2gJBj3Ea9 z*X9-{0AT>w>t=Z3!pmM)oZO4|ndc?@r{Y%E0WIOw11lGRrc2lMjwe!h=j=(I<>UYN z&lXo>L4w9RM;5is>O72GN(dr+u&5zgDO4*dci3 zC5#Om5Uz+YBZLX#+~j!gHX_brVF3tJP~sjQjr2(2B#+$?+Pz+_1BmFZaNEvZc7f%K zR*&$ThJ%KHiFTG7F+lRBv%(*R2rmH&K+0<*$Y8z&7oXoKh#0^C7(f9S1_c0sU;qM# zB9MUr5R`#wVPP18X_P`VwJ5{{g){;Hz+fzl1!D}-3;_nf0bywo1M>xl?$*EFp%bH2 z32+H8HUL0?!L*hGfG{DvQH%>P0O1B>1c1R9VE{4<(i8$EMqo@;suKW!OUMua7$JZx z1%v~5@TTlC&?(+zyGrS@ec$57;2n70fqp82Ed4k zwj}`22m>^MApkG{;AlZxfm0d~7=rT_fM@^!FbEtp0J99laf2b4QO9huyecN4hesVB zo*)zi;Ur8$II-)0_#XfOCxb#G28mGsb__t<@BVKI`2Q?>ec;m~o!*Xj@90Wo<;U@W zb*|B7Lex0$gP}qWG6aPI2$HLao)O7VC{Akm&;JRCCHjP?+f2Q-RWY@*jhU(XreMh& zM%)1a@sI0Qg2$o&A^`H62)YjvmN>)UTK(Y0Ek}m`!uhlmHSRDZpBsxQZ_TC5(?^+G z;OHg@p0Z|Q$OMlgnT~|H0mT;o48vQzLWO&bnMac_qRAEtA2P>28B1I-`X}&M44%{B zm;!QC`Ax(=>GJ{=_TRhvlUcSyoE07vF&I*+>_ocN-T3zEQ(Cmj0RUiSpmKrPGXjnb z0!viwSy5;?fWwmEAdU*}ut2~n0UIpRrU5XFAqD37I0itN$ATF64Ob}ofHFk!n+HY{ z8hGry_wlDx0&ru?ah45woFQUd>U(~%Q-GuVNY& zAXIssJM0tF;3->_xlIE@oe6U|QpN~PW~hvU#{$5S!k9WBLLk41fB+$xE)EEgocU?- zGDILkAs|!?%>e)gb0qU}w)c3Z%r*IBFQMgP4#%gy`zDZp{%I$m>I_?xtYQN=Z#|7@l>ko>@C?|~Z9o8?mJR)9KZa20>bz4kT^V*s z3>(~HjvanLj~bs-VG42_w)&n7xuzyH1VS-&1u+pwnk+G9C}mFo^)hOKfE|>50|2I{ z2Vg`yMKunA3jhU#qE=iU8AJCg zcR6gwjCydMrq4FQHcu!L*n$GUv5f&u3T#0ogn^e~GRByr17UNs3VYPfqe8xJ|Le8+ z5f}hI@;9^jx{jIY)Qhz$Mx6y_aj#y z&!?4o9_}33;_bnsd|6-dzBenS1N9tN_G>qsQKP-J`-5h~*-7{6et9D|hO#^;dkyYV z$3Yyq2Zb!L%tM|s$B2RqAm?E#U$L_KUiQeqNK$+fThhK%SE;) z+6oW=00@0Kyn8$I_Oj|=Zm`-MS#MMvjgqxq*sEmTVW`>%<(2qQWmR23zqLDFRSa?y zAP@RU-bhk!t>f#hU|dix%9MqLEAK2#;^HW5pqs_k7)LCxQ|TCt0|1O)e#!`B5dZ)< zLkIyd7$y~Ev^6Z7uPB&yc}1)QD6V`3ipa+`0eRT;KuAm0?G^x51ON!3P{biUT=X44 zf#716R<>inZ`BMVyEef^e0aLQ1btAV^2>#}Npql>ih1AV3ft006-Oj_vaM7zP7C zm=$Fh44O7JHdo>$0FN4i2Z&1e6LyfGgWsND@>p*fUi=Ux01zz_06WugK|{$12aQ9?llyxK{C20#rEA_4#?xryNhDgX+A z>Q7K`WAPvq{KO)a8=!y~_&ljm5dfe76aW&#@XHE-4cz?ieL(>5e?x!}!!Nf0 zhMyZi0Sq8!03ce%e3)R~Y70$O01#9GKnjhDs#1-HfK~&m zNJ6=z4#3d~hf(DcBR~NVQ2>^==ADluu`Rx!chG2t#X?y0OXwh_D^U3&%X;lzvE%?ebT7``TgJWZ}0rA0H6X6tDkIW%?Yh`OQ&y7 z4}$3JT)6H_KJP$bK}$5g+nM=AopPoMO)c9PvLVH>Mmz0YcOUKHcl+LSebsrz=YVhV z_MbwNO|ITbK4?N45jr8z0;t3c)n%{e(G$O{d>t&p5det*U9GOFGBR@^YeG)T7_=a8 z3S8<^agZ+;@&_-cU;GYgwnuyQUiV&Jn8YA4_>CzWAdwCthH|4ar~xY0u#gVEO=2eE zBi%dP@%fSU%H4FAH{Q(NW6&MKj2jnwL+ zLrA4^w~UX9#YKwkj5RE_vlLR8_Q-!}h($eLNS#Wc%niX|}

    D5m%knn$L2_t+D|$$+S=&^>ENH2QGoi$(QEF>|w(gsx@WaG} zIp$!W*C|F0D$_Nc2&$Rkn$CF+8Zn{OLU{G30ygAcg!BFRna=rP&+GD%l=ZCFeYdw` zgSOBTUp$ht+4&lxwOPZuWD}YQ%qUC~wLYY=t6kQ~Gps&U0c|}$x2L1deUEaV+>g^# z^4Q(3WLNt8#F;jG>(082gI;T%cU;CtYf>)UGzR!$4~tme11V zqGiW)*U}AFWjxp47-(&3p79pR z7#sj>vf=FX&(N&NRwlFOJ>dKQi@*DS^xwVy&5nP^1&dL3&e6AB%XoTKN8jVV+o!53 zY_+~>Us@IiLlx~>b1z=2eaz!+v>3@WgbGsnNHb}+4eZ(=g%FDp#|Af8A6 z_Qk(_8719|(fh*5hrB;Gud%zyhOkKOGg_yz1|=AhB-^ykyYsl$qaEzZXuCC|mh@^8 zt0-8Tw5_q7z*qOUE-mlYmP^sxXI$FSikd|P(`1tb^<4G1mc4v>)9ePunI1i~05W{Qvvs@B82Ux9jtP)w^~9f6}RO zvuh@yt%X7a0s^(bD6Wj}LnX`FWCbE6mM|i;`qnAy(>xI@gPA>;T35ULHL6 z*Vy?}(RK#6=j80{(b#X^hs*TAK5N!AlbOtXZudbY$M<{eyY_zA|L4cg|Bp;=YapQ- zJ>75o^S7_xc>C3xYqor`zrFPQ+?y?Dqm7ALtckTtoo$!(^5?ptKoPRD`6exW=Q{CwDQ^Qc9)I(H%DTXSM9LTYE9IR`=H8oc)WdsIVkL z03Z%P6d=Lk;EJgdia-DXzyUyDW|g<@@A~dHJXPgwmIc^5U-k4bEdwwJE-H$2J;(36 zUZeRe>vk@-OYE@T`~Ls^zrX+W|4W%aL2J6p&8xOgYcH8ooCL*&k_=)NakJtvAQpRH=q)z(b~Bhiq)+ zL>ZVe)M)VFYQ3NN{H$B<=kqP!e&Wl%AH6S`_w}>u-s4mnX(6M#XiYeajiy0|e!5Q> zqYQ9x?PvYAySHrK?@oG$Px_>b^F8qqa_3|1me!}p-T8L<9`4xLpccocB2BSk1z66M z5db8lsQgatlN7_-pfj|H+5{I{C%xd;g#Jf5NZ-!9S6q=|Zj;SW_p_O`meBJ>zqZkKLKbeX$%-uHI5P}3QX&A}4o zvW+G6taH7w8mZOm6N6VKC?kF2TYmP z7!dv60hR)d(3?>ey#s;>{`$B5ZB{^kYn`PqyO=xwX2(7#=lSY{0-b=qSNVotLI}7 z);A{WT4Mn%n*xZ!c|Q3Zwfek$e!jl#dhecGeSDv)hzk+~K}KyYRJw-RS_Wc?B$z+| z04V~s%3vV0G0>2(h#-Opt&IQxPj8fca-I8KdEI+m)~zNn4FX#vbN#=hnSn+ZEC+cH@PYh70>{TFwL=yRpaC5AH1}YgPjK< zqJgBYzGv9Cgu_S20$Ex5@8iZDuFMv^U>tqU5wpYL;m1$HorPh~m)XF~`Nmq^ryn|- z>*TuD6PMhvvdN>F4<~JYKY#HDJ~4G4Kcdeig{=okR)O5ays_wWO4;_R(|FZu*j=?MwhTsS4&IY z^%vYA;C_aev#p;H9vjNTC*OMCRcSV%T#GFfC40NVYnsZkc&KGsA$)L@BxjFCAO>rW9{h&`5BS zXX?2Ea75=)mjNL+Ay!;%@ykp>F>iAOax4J_Ajd)*0cwRb7UB>!312G{{_Dni$EQ3-U*aFF|5ScoyR=?*P62AqB!5(E#W<>1vQizQHlb=E$wC57LZL(}x*T8p zeF}5ew}%`}CJy-_jAbgt`#tS|^t#*JXUa9tTao>*n zHwu5I5rTp$M3e#oN$XIdAPy#v{U6ay;%`fg#yf-WXnf|t8$;hR^bO!s7v2**2PW_x z`1kX#zy9Ml3sYbKuyFrA`CpHHK}%E=BXhLSxZy+r!LlB<^4gl022TxGEgPe zIe5RkpG^|jkoJ^sSInErGS4P;w6yg9A+2M!d`!iW;A&Lxql|fQKwUE-;X{N;zf<{ZQS}kS}$8;R7 zUXdF~gjO0rX#fZn!cvG3gGHRM1ywptm_zR*B_2H%XJ$z@uSh?9$qM|Ua4T4YufhM3 z|ML8gF832Jci9qCB7r|n@^9sdDPR<+1(RJ;L<3O_xyV0$x#lJ+004jh0s@DOmK^Zh zsLyb$E3?Wa=Sqq&L#}61ar}00`{73aR75Z0R=o39$*`*%VSQZsScr1IOY`=QXEQF3 ze*jh&`35pvxS%5CsjK@AM4-pe_tf8_qwm%q{P}O$drvo4?Q?tUSmP0b*`#wn^i7%A z0tzN2snGh$hUHn~teX)&9uw9@k4)Vtn5}rmDj-ipN`pb%P&=h4E63wXEgt3@tWbgo zM`JLkcYhnBVUK?r#%#sikVT6CqUfv4rUW$xzwYDnce%)@V;jBvw1d#XgdDLk9cAyf z?-9N`%&UY?ZhY|KfRHqvIogptgMy=Mos;hK;Ou?9=#cFf zlK$P({Pwu`nsw*Djz{0t>)*Uy|MB`i%>U=|BZ@&8h$yEP7)$|FC@wG(awx$Gnfq#& zSUV)3)R%htHuX-sdoxKNh!$+85!f>xb@<2R4_p4Zz`Kf;_dzHc@9u}T&&q8+PpX8= z8w>!v1vQ=mmZMM@=l6HDWVYWs`7(%yul}qX=c51O#`f(cgbV^f{qqpvlJe|Nzdw3? zF4kSsqJT1{Om-Yxe7-HC%?2%^q}h3gWye*9I=k@w-h*6ZpZokwFDc3X;_5tM$UU0G z6j^1CJ*`pc6)MfWz3>`F@rVH>2Gl4*jv%J%CzYnl-ne~bvQIyYWNo=4j5k*PzXf78 zQ<|ltOe8<~h}Cc=q5{=%4dy#q#f83E< z4T6Euh!M=D70HxQ?`$7tes9DFRR*PX3YoRhLxQ5wXteF#Z?P9ve#PB?k@DnI|1W!= zXuiq9f*)PbLQBX&{x*O0`o|gZJMn~a@WRh+t{wf$!<{@2zRz2{p8fBSkN?M?mAIA8 zFaNfE`|6Kt<&W;)@sIfHf9?DEhs$D>Qtdhgl*vx4%oUDTX>ks_hF{qoXKu1i?u=Vp z8+=Jdne3@+M7vFI9>9?Th%GBjHfR+S@!=*cD)K;2M`c9;k`#Z@mSL&ntogS8`eR2v ztx0Nj=ydS^acND>X75Q3k~p*NDpKFcuXXJzJx|N?i{kh<{t=@yEOpRZr18H0^S}J< zU;JP4kMZC9w|}S~``hpQp!NSJCw-r7ahN=-u{90tN(8S5kaNns~E%JP9kbY!^w3M*f%>&9nIBix&_MC&&L!S zLwtYmyz}*M|G(e)=YQ{>D|zkbSbm@hl0Z{Ml9f?~D{JG8{>7)wP-ml~+H|MHSz3p; zu=n?S|37L~YPxoJ^GTb<=E={5)cZdgP*fxtbrB*^EoSnJLH=M%{Ddph;^q#YTHh%d zyG=8lg3ivZK7_PmpTAyPWBobQfmr}37+ln8e3FdYD}O8Kv0rz)HveDZLakas0r<@} z{_5t=@YJLCo`jTO7o~qNNj~K_29eon?|_SYZ;d5vl2f!P>=G0V!pHwI|KKm(_rEek z1<9@=8!_ZNEB%Ar{AzWclwK>N06O{S$w~&ePU)Gh7716#5ktZk>r;&GrLgp4lIvAZ z++zKlyIKAW&LWcIFWmmp=+pMy-|PQdPPgW+{Z5)7}Li-?>zBQ3k2ZN5Ck9~L@YU1f3*Dx)R@@cJ|MmQ*@6&t0A%HOeBpIun zVXQ8Ra$1Z4z-B5Sc|#OMfQXSrfDiO~xXVTz#4~IF1)!y{hyoMfC2yjKomg$q=Gv&8twvj zd?PyMG-^!~QrV3ao|1b%*v#J$KX&=#>Us0pJhyYRZv-0dqJWX-b z1&)KcE^xnC$}!yZS=ktQG+U9CY*atOk5VEK0Go&?LTzKK4eA!xe%7UV$Y3E(JyNZ+ zv$yTs6vf#K^|{b62-+D5(8$KMzPd_?L-thKAP%uKfdVKZN(2GI1t3rQ#zI*;( z{P|TX>c1Lt_rpK$cXxHO&+Lb_@6JG;?FeJOc2SSdF zSkd&aM8r$$SSMo03`5qb9TZIu1aMDXw0QFKE8kjT88lYB(v=&n`zQtgVl>EM&CR2A zC$Xqf0Zscp^Vs(_yY}aD#wavvwiK3RVn%8SnG7Jf$)|0SH^OT~A}a05$C{Otls?1& zvT3C29Iod7_i{_g+%umAejeE-||<@qy450ho@ z@-Jq8{Eguaynn$X6d4Bl)&Kd5yM}(-^PlcBy+8Qko{zW)>u7nbQ%jL)7(oKDt(G@m zpI?1_{ck_q;MFy~+3uKb>Fz@rPg(}opO5G)>eKnIMp0bns9BE|POEeSfMM5E>fEetoH>59OkMgUZ zF&p!0@+0Q03QPe30E*H`0qlMqVAFJwU%B7T+uUt?xG$r=tLD3-L@W0drgjJ*U? z4ooe6*EE4hMJ!EPHw#fc-r0@1Hky2Md}%5g!{ZWRN5xcqYGg8be1AXBLvTCmdVOu# zYvt6mBmxaDF5`O-=U1q4@9?IU8t#dl!`^PngP=kS5TFE56qL{^pl*{O-=v9$vq_0F z)g)L2F@{FVF;Y~NLIVIm1~#c$(8VBF&}e>04H-jkvSDF!R9+la3d}OkGUq9v7*Zi3 zX25ko3UZ9$`P%p@Io->znL;KMc7EygD2>XB%;bim5C8~;t{ra={UPuF#TBk&0Z?N@ zD+m%`qZ|EbBmf}LDjHBVK>>kC>$X|u;w~s5w!)y;ooyhT+P&T8m18(;P%{_o0=Ref zx_{%_oySJlyA`y$#bZOmHYPHA*IRn~F-QOb+LvD38-4~Am;;AE#$)uno*9%E=chS~ zHK_MyVra#(r7Q`1`)b{*V~%uwD=IRge;eEP%#IOL&OE*WgsPE6U{k6D+&}8P0l;YVA;`ZD2ETD^#AiwVca$L7N@|GhT63IR8A!4{J5&$ zbRY9$y;DsEKueX#M!xZS`mbxXv0z{7X{|3j-jbe#4g1J6Ws(eH3QAB206>*cP+CQZ zCT%Kd>p)bs zSjPG*?6E0uT7xUE?y)Opm}-Tj=6`_x-6+S$7i2Wqcxlo zQ0$EKF&`i8JfL=qo4Ie_i`Pd))>{Pxqz%&>loqI7|2xjVSn@;Je9MMOYkuSF)sz1| z-`=_HcLf6Iq7?)Jh>{8ji+%s6;7iw_JfLUfUw@%Glu=uV)$gABXSXmNcCV7@`%iky zi{C$)@e;K~uLMS#@=kjzM*Fv+nt*}E7M;g%Up+ZUp5d}aA04T5mh=5j!fKss_FYP8lSh1O0oNX{m%YYg;UvJw=gBWD6us#5! ze7Il$0D|BM0f2bq0RWJj2!bbV81U@`qA;r=hyn|W3Q!7>C@b$-oGSiQFxtSAqcx zG&3C#55Qzoi<)eXkN-Qrd@x6}ju39rlBAG+!tGCl3)+Z)g2Dy>0Rn|M`~Wu`peB=F z@)yjxwwR4pQV!F8if6B*W_IV=@4mdKG|Q{qug=067cpnThoJ z3Y!4L1QKS~T-9(5ZU>-YAd71>d3(=w08R@6kRnq>00bofMS*C=2mr8_NUKB|qLd`7 zElEN2>J#gR2ml7CY+wbzFk8foSo*kP`nkKOu&rG&S`iNI$EEX+ zqPN7(Y!wOsDnKYoKL>rP@C_v{EU`c<`Zc^!71 z<4#V6c5FVF_NGSPzg8dZ`CBylIqm+?`buyp-A1+#pU=GAc833YF#dQ>{o>UTbbh6&1g zrT1RYtyi;sF#vQ~5xlEu8?Ntm@r7?kN@`X`yWo9?WtVXtWM>88GQH%Pf&p!R?{M`R9etnkylKek^w*UVxeWE6;i9QowwYko5 z#P0KOy(9(zQK70@L{z7d0uib}nrO+EBB`KR0g7ZP#&)4DpcFe~euX?6=De*HBM~rQ3v;xtCqd@UCut&J@5PG8ymDZ2ZeODKXC_lw9Ij5cAn&8noQZF zjmI`~*bRXlqb**=xj3D1DFqvQH9O~$<2f@a6yBZHhlUTdPu7Qj?yLT<>G`Lqf5rFU z58Z#N+upZ4F+RX6eC_@EU%&l+&yV->UOOYpqkK zIg9}cXhY5H_wt@=mDnWbxVL`$)96lbGk@Uvee`J+`)~_1d)}R zNsU?-K&$`?1G#y8&7Zx}YyLHV|G&BaDmBtEYNpfaaS$wcUAaznlHK%v4c|H~O^EGF zH6z;b+}siD!s!JIZD;hg%pn|${~AkCrc95!6c|vZOaKO)tc5MSFte<;;SjRewI@8= z&DBNpd7X%w?5j@isCu#e721;;{wU9W*El%!+WiK%Be%Gg4m+QgBaz@^F~qq7U?eq( zX;kvk-2d(4d*9}<&sTdUB$x8~XML*0;9v-pFfm;cJ;wUe6cO8?5Utz*EQ-v*1%^|T zkxnqIEE5UU1liPJK}05EDtxcgn@)Q^d%OL*6IdyLSra@D+~H5(8|zywG3q$G*5i|p zCQWt|M9Awoep#l1O=T)@^CJ}t(*Xu(!jTb=bF!r(T%|J~u12sn#s-8CAR<5jEkFW7 zPMvt>9FOZJ@fH9!98_4Z`j z78+){R%fBaEIkql6s>r0Yv&5{JjM~wq-rrqA(#`fw2@E8e)q1-Y37JUo!6?}wl!*1 zN96?6^!nE?|IepUEr57d3Ar6QR4qV&5b}@<(&|VQYGPY0XIlO>Dz(SY`|_iycWD*J zeH6uP)0#ife(HP9uRu>X(q(>Xt>Z50)K_e<#4_D571JiMOJXwY!^5=MZC+3Fc316W z7gm)5YJIp1u)M;cC$Tf#bgo?Jm4CUu{?i}-kN@HS|4;v2zWkH_#oPb=zj*ukbNu;_ zw*UBPSK7;T#iEXijLqm`*|c^9RHbkKLZAJI(oPPGm9Kn3uD*dHHzcBf1ZxClK`~Ho zV{@xF?nvKBaPGiUuWr{1L`BSoEQc~sz5swuW(uv*TCqG1o@1MfGHZB$Ou4o#g-QBT`vh^-b)=y`HRz4a?HR{qfRd=Yx zZfeL{Y_>}yr}dcUO(I?NMmq!9zjp6b0mpLw+>8_x^&&u+OaO=_QpmVIHfjaLNrzq* zA;PNwi{`U>MFALKfF!U93p4$n!xcTn`*L}u-JCfV_r}YU0I$GCY%I&5yY|T+Kga*$ z?91-Iv(A18`!BP7pKm{^7_5VWzTe6*pC0?~TtN-btdX#o*mixn>{zW(!}!>I*J3%N z+%$81N&qv14LCK~&uC@hF=AJzfk=b<*qNr_S( zK9^{G#!nz%Vg>*U84#Knq-|nvw}L1*8^50V&SU=oXF!<0Y$8HCJ=ju-D-h5?D~A-Q z3n4@`^;2lutshV}J`_vQ4LIX5$vFWMFs0F`M5GXCEEb0S+oStG<%QN)o3=sA_^f>R z{ZDmoYXH{8jnxQnUE;-J6sy{#kkVYXb!*`W@x5P)FOh58# ztS_>zk;G>^3v;ebh zEBW;Kzkh%5Fa5(Wcf6A7MIXFFU%I`XQfUto#}{%Sw=~yGd>c451_)U$w_3TQNtFhK2#tIq1dZ&GZ{E_n9leN>l&^2 zCx!|ZEmm>@DLirt)odLqXyr=nzVcHqVb*ACs{wMD-%+YzJk+`bUMyD&MIGY@bk0=Y0#=g` zW4+L!VFB!+oJbP{u;2;-NvxpJwU&4|0MICiAOI`?asmJ>niZ4)kj8{toW^dFhB~Q} z0Rv19y!pKRKfmYy{OR2My4YB~&fh?(qR5d!22&po5Q7i}K`zT+)6c-Req`;7dSGNT zJ+Tmzk{G%sIEa7@FiiJyUI4TrB-Pas#IZDv>2;V)3Pnl0G`&2NVV zDgZaiS|v%Qg_0GdMaeRb>_gXv)BTA=dLUTXVz<2Ho^~r<7D~^gPvS%!0|%IZK?5j7 zV8N;{|2NsIvQ1-!voAYKUA0Uaz& z9f3;40VJH00kPNw5HXGsAi0(jbvBJB)a+WU!h-tC06juO2v{Zv!t24b+i(Heym_mSw1c22&K_%4{2_ExjgP zi?fl${nEGqtW71T1&KO!^dA z<#1>ObdOb_oy3xqh2vNO3p&0EP$mx2uIPZO1m|xLHFb~D#JoRemnjV0;FcIjn_8Ic z$?m%RtbeP&^-r&PLy^Ge{ce5dmklm$uC_s9pgjG@*x&hYo|}iD%_Y%Z9ZObVNmg#* zJh?00rs7pnb4yDPf%-+N< zZACXF>p}rjw(u5sKuxe}Edru}_OFl6Uhfwlr)Jg^5n%;TLvw1JMj&N%6o%?^^Q=0v z)n&3#i_`JKdhAe%5eN;)8m6@L`{LPFr45N(ocVjWCZW~m`ghRGCN3o$4(a{zHx00_O*rzfl~|9FjxB!HkqrdrUO(zLNY zOrf>Do3c@IJKeqhw!iqFAuE)kx#ZT9u+TbswPuc9|J^#Xm{8K$BxzQ-7E_s~Cu?L; z+O0;{&!vylq-IYCxKR3266HSUIwxHQkohiA1W5C>`+xY)|55(w!%Z2d5eaf^b&BpU zGqbJ3Vr^#mzDv*1Uj(h}h>1#(h}2g1``6p|tiG=y%v9+)15K#Ms$9cd8}k|5tMo8n z<)C@?c#v7I)iO>V5^Dnh04AVWIkdI$lI#s7e3iVI-zk@y*m8c8Q2>BIF^gpy)4@R* z4Iqv^1;Pw9ZlI_!;&W^_Hf=y4ZDm6D`S5|!#iQJ$58$Rl+gq5GF(Gl6zyt~ckkTqN zS^>}^t0a&@kQ54``F!uMy!7f`ujltAI@TLZ{LVd&33|0sCH{scjyqs;*6=3%su_{Z~u=fSGH z>-fUe7$5+E2qJhq7ch77Aj=xfyi!J>=l*{*4aS7 zQtC-x&taeV1^;dSwpg9%&P^di2xBb%`fNMvb5y*&H1T3 z=+-MOwK(RmfyCSSIqSK3%e&dxCpLfa|84)VwmtvrfBXmk=YRZ%|N7tmzTclJlk#i6 z%jTMW5vsLGl>qS2N&+xqJKM`A-dJj#y|FkT0H8r9Wb0>NiuTOa1O0QPGOg0iY<&Fa zci*4uuU|8u!cd=;5g-f@skqCT&NTU`o0i5M*R+n#ta+oAw?Z#xMD|w2T>H$`FSmZ4 zNB_~A{sVLX03ah7Hhre<$=gQQ60~re6;g8N&)e=nDL@Hj&NzS|2!H?p009670U!V% zfarnQOv3d1%zqzES9CzK11AFrxI?oNRj!d=?0-IiY3CCg`P$}f%IcqPY&zTuO1;pv4a4Th**b~(?9&r{|C=OAJMPgTi8}%OvAI;e4>;XsC0Md z<382e2Pw8bt&i*L*w)AMbfYwsdAQ5Qky|swtD|1;@;?y{bGoTjWCcC zPF`aF$sI)Yk@*5jO>NzB$$q+23??!_pv1E4@qrF+eSB{HD@9l!0ONbx8`xZashgkL zvllhJeoy;#{Ke+&8l2*L5sd=qm>t};!w63t1oY;9{lh*lC0nA|A)wf=a*CKF6 zO&`c?%&@{p79tR`7z9>gq1D#(pU+<3)VfG8i94}`^iK}+q5m*q6Y9=uzEAg8`tUcJ zwtV>G`}=2^MS;!*fEYjk@tD+CV{^5W)H!1D_h%Wbv)1TP5ora zqwbqkQUiOz&h*%}G6<#?(F5DCGv{>IZalh&Py`e;xUL1_oam8I#|Ok3U%_;D;`dzn z$Jy8OBoC*=1)dOcnTQ9hQs9k<9-PWWfdF7w3QH&xFhiB}z^Msrtobs3_}^B#YZ^h) zsMb57qL3&|&2F<4C~fn=G!g1#EMl~A*F`F=8ZKr^TD7ebrQB(KEQKi=5J)?pB`&0$ zHP}KjAk9eo!de_A52Jyo$WHnZtcC#qKq1rgVP=2MDgvQNOy{^Q(Mmsgd*^a>%^8j2Xe1bcSh{CXK363M=e+X<+VFdMWK z2)vefF-k*)pm?U4&0ZNAm$Cy6NXE|DPc;ogy#VQ(eCn-k@|}fCet-S>|9|Cv&7{bT zLaC~u5Wv}%)h;)|87m)tvDb8HB--pmS~i^((=x-k>bX_#O1o6g7P6X^>S1BrqfRHc z&XhvCp@vAT!rf;djXfWT3c(bxElcg+B69(0W4UkYvE)7&7$vr!g%x|$w<;`DLWn2 z(nGA8Ws*l{WGj`&a!W=HL&zp%v#R;BbD@#>@I2?|8e|3?&FH7Eso8mZV+|I&A_NeT zhP9{Pb@2FNCWcLLoomq z=UW3i7Y` zMSq>EUebH%U;i49jI7isYDC$gZmO|7s=CxTa%$Q+`AVD0q~W-gz1IVZPRFHn$0->d z({q+!&zf1Tjc5uWi#8dj1t`2*SF97Ox1Fq-uh9Ld#ulL2)Mv{&+YGa_yp8h#f@8!4 zU>Se0<=|K=y#~Te$mmlg;S3E%?D3TN3imgjtq-sHbzWq2>Pft+E*8Y8Ao6y`n`?Ov zd1lsW6`M|ajE$Ae`x=}P5jw8%=mF=rpVM?6pbon{t=qad199!q<1c#~UtFFa-VX2T z7HZyEdzRaZ^I`xHJPq(1F>D;?)6`@bRztVT~TRa4#FcJ*HT zcUlp|n%ARb{r)6Ve-aw>hZYJ-R3=!BxVSiae%#1kHXN3nr0V3Vx~3oc z`=T??tX&$v8S2AviZXGDE3N55M=DvYHcVgP4@buC^-o*J{>VK8|;o%q4v$K4IoR} z0ZGs}UJru-pcpbOhH7tnzg=E>fr%+cK8(&jnFhm5hF~?JCRR>5L_mTss$|dg=idoyYo8{$I6A#?6dt^mKDR=HVK0p}{m-BrGSl-B(3* zYBvb`#Dcnewu@p1G`o0IJ`!vSTP0%{H>$JPm{AB23t};>lmbx{#(FYYJu!9wU{t%i zBp#CT8)N#6@^;f*`d+dv@wB{|*bomUEGE!TSGMc!E>@fxqBda%nU?8kw z$e@(VZ>KvhO_3~mPfsT_H5(|F>18#DNtBa7#W7*C?NgZ+<}^gI5|c9hIkm0;1rnma zcQ`{)ZZYO5nuLG}M+= zQ{6|mfD-0hNY;;VCKxSRxw-$4+%0;}p*(-}myuPL0yPGL(H%N8XHvQiJ?cW$xJ4%kGj=Gk#TMM6X^`qq|H&y>S`KFXg z>OgHM)kb2YC|hXEq<{fQrlcW&{?7UC4{!hff2O^(x0*kfqs|W_zs&Qsld;p2D_DOn znJ`5p@#!*5S^;2|Y1b=nK`Jmrz=XXh0U7`$3~0p~!l-XRU?}&pO~J;(xC*PSG*obq z%}$rvymETcw!`ht_m*P4DDN1yv886~G&XAA6!?4!LQQr7j@oizQ|za+e*bVufuukH zkh9Kudbd!vkpRao4>PB5j<;Vvwjbxy$9vPeY@5fuYf)yceKuH>88#(aQV-H>Xb*`t zqpfzF^=LURW9y+1OJ|wI?LY(+XjM*Z0_G(FfLIJplQ9xJ@=e$!LeVFnibfcqD2ZfA zNkIqzKq%!ZBmgEObBPdau49axfP!A#b8No7!g_rA;+uPes6@i8{klC_KlQM={Aqq! zm+J>hD)6dKKwC&+Ck#M@Eo}SH}PKx$Hni%}U^KEgK{)tMphF zgViG$#miDaH?;&)K(sdVI|PXarJ45g3=us zLGG$Ur_=XYo;~L3)*%KN@|L(tOyx>R53nLYMJJucH5-fgwiR?_2CNVega~KEu+a*4 z$qOf*7Ux8pA;4#rWcoYa8r~(#jeod#lpR8r_=+}vm?9a!pvdPP&uy(54Qmj*r(Bt3 z1`~V-mKix7AZwfRWk*oX5%i{X#UThf!+Cv>&lumI+qr13tNyoT-2KzrmGl^1`sV%j z-aWisVY})n)LP)G(vP}#vae2dZJgGM)z_fiRAgq%%Flj$b|_?#EY`Be8<&<55ZW4J zby9Td_}cI9@2~pnhwfKD&KnO|Gv3pe{e$VOXofG!PxV*zZxIEQ&Q=4(blG6_Xa(q% zNhoAkX<-2hO(k>{K@_2ag0zL1m_BxIS_3o_sb!tV3;O{=M1#s|X_jSF>dc{OyDS!L zDpJN8ZGJUAnW@XxQh9RGIYXn5kN5KRIebmHYfOQDpPJ1PomNX6_%-f zFS{HS%6t&ANyaHO$=dxmTms4N{MT$A+D+}@(_l!1u+5N&+xHqO%_|4DfJ5bk+pDks zkWzqH{5L&f_Q<+=FYg}PocTM-JrY3eYL^Z3Cbj2d8JCyjq>G)TAM3^A^H(1HYUr1T z>w4ql-L%cE?XN$2C&$}9eS|EXh%iYRZMtM#EDWN$srp`{*;?>~hsyeu*VK;MtR=O1 z$!eHAn0|OFC>yJksqGMA@DDEBAE|2=KSK76z4^&HCU{DoTl*Y8R{Mgf;q#VM@m>vD zmP_Ypm|HRKIt3wIxr?qilI%Hy*Wzlth*(&-;koMKKr~T3v``YsU(U2ms07r3>Hn?wD%w zZarisO>^3*c$K&6l3%OH@VU|iq_D!6Deg|v=CntF*LK$J^E0`=-`5r|cEz!NV2z)c zD%I8`66UB7Nra&n(SM2 zVoZe@F->##D$QZj%@QgrqcVI)%J)%^5hX~bYEY@n@yq4CI4Wz`nZu!>Rsdp&8cK^0 z4fc-CgeFH5(s}syWaVw%Qd8{q7NM%On@vzAR21;R`DNNdAK(3W=0^-iDn#R*xhBmU z)`I!yGe<%m;256SB?ej94f!5-n4!#Rnq=%!<~)YGmEuU5`TbiyHJVY=vBO{417iVP zFaW^-AP@k901#sb$i|MI28)EW0EoDBNj>Ze-AkG(Mjr+f9piQCcf*|4@z+hs47_1IW?$fQ&^>vmp$p-60{P^nNX^z>n%4wHxG{3d(><+1vD8zuaui<~oplu8qsZ zYBrWxl^=;4YOugX?f4GT&99P^k0B83^w(LR>+AfuS<>C5PBk#Mn&ss_ zCs)kknB%(DjfX0{P_(g=v0VcbHq$+X)J>cu-7>pMth#;c^(>)-jy3|QU#TZ3(^EsfN~9=3z{;Tw z1*B<5O*2wej@O^5nRCD7v%lTh6~lZWRfvKVkKKzS2B>_~)OZ^}uHpda5eN`a016BU z41kcsMr^XDFzUGm3{Vh7n5t5xjlO9GinFsEU{y(vQ&>efN$RQKZoiU$_1*6)Ch3 zh(u-NVXXpId9Nj@kfE4CIsvZC{`2Sl{)iH1_8O&GBG*1=5}tw>%eYJt5kN9!!fWF zb)+7+`fqgU;?$~;T2irRd3v8^$EHt=tV&@iQxy_GlmgmtLu`U3v>KrX3K~svezF~E zXC+z6QmjERAXHR9r5`tsA5Fjc;rQcF(#HFE>wjOXFFsX!>1OGDks+vGh)7I>8j~%d z1tvwI$YR7Gk*>N|z4%TnW9lov==2GmR`)Axz?>8m02J)(8G-=_#*zUvVl0fHAOt{! z;s6mqdPGJ60Kjxypy^V>Fr|)RN{B-s4xgAF1OOnA7)PN&U_EL!m0%HY%!ZZXO|~n6 zG0zJBB+8%+EkloWaN4^i2%LKn`%%=-_nbbFRYl7918B}i1$EaPslqPy*H9_r= z|MJ~mKD4d9gcLG?0eqXj%LWHT0jwjYLzwCDXTJCKg`JJm>_NPGfIC(5TpkblxBw6c zNXzaK^JCb2biPk}7H_=$$Txi3Y%xl~ zj`U#!+o!+P{nP#)TaTGe@N4_3SAH^oos;hNRhg(NJ5$}8T??5hta>|OMNAu;Re=Tt z02+u9q)lM85EVtN%kzNFCm#(Uy6U21Ql{yt7!g9>eEjC!`F~&h_Wb(Hj*IB{( zILGi=)^8+&r3v4MJP@_sqUkjQ9ty{L>$>XJx62@C;ft{i$`&;i{|UNw=T<-1c+2v=(I=aOsv>X{s|*CYQIZ zcxzXcUHjSW+6zDdQP=yQ^3|OBsXSyc z83d%6h7uEPkyOjpRYq;JHBlPTjG`tKD{(mWodY=uYzgLXO1GmlQf5}ZIX&Vj1ul~( z*!`xp`9(2lvcnYNCf~06It4eDa z-kpy$bZGaVGtg@A=3qVDGxHi}Cp6hAXyEM0txLWRw zEMKhj3pM+KoN~e^rKxor?uOa88rkdx*Vd^Zijfd@=!9*OjX|kMxZ0G-dQ{sO;>_yi zj`R3+*%b!Lyb&_(-w2Cj=0Bqu5;C3u8b@9+==2-EVhR8NU}TdyBx0V!lsF@W0ss^o z_iNQNKmuX8!YFU#W&ZEFfBl&M{bK&c%bO}R+puCq`fIM7CaO~f#am7Fh%sC+5yrNQ z+OyHkv{0A9!y11HXN=yg@#8N?7CTujS3 ziwLT8j3@J#|Ioe{ronKESy)M}w@4>~C3k(j%X4{EG2Z~8#UK?VgGKoS%_GygEVm@e z1S%2q>DgaLxO}&%Y|k;#I*8sQYg;{B+A=QGoO4i%T`HD@xzM~QFiMa-Xb=EU24T9Z zwr}4%J{>!+p1iXQ%3_hqPPCepA&8+UEtcpGlsbNM{7Tzz^XdFGpYOB1W~gFN3c{rf zPhU=XzJG7^61(T8{&W>CBd{4hDkE0*jYh(vGIa9|odN8Kro)(`+KhDy&ldec9 z$F61+VzXh`Dn09in^;Ifrr9=|*rs!kjGD|FU^BwVp0GKJ--hesqfU)B9^J53s|x*u zh!6@KQBx+hI7by|)j~7+ol+;fULGL)o#e}je{sRv6X;}8XV!)au(w>k!f5Db?g>3@ zfuK+;d84(eK~rj7wbE#6*>V=Y44>S-@IklPnJ*4q)Z&k0i^<8PP$6D$G8X3PhpbWI zJSW=piWms+I*LQ~(cr9T;P=oPzNl`BGDgBzC(|RL)>@^#wP2*g|STJPHF&xS! zH!E66vO7{x0fs=slK(&JUH^SGXIqy>G3u$w7~+ z939kYrFAVww@W0VR#r$179HE@XNwgD%}~I+6>}NCn2`bw*IZ8Xh#Ws)on&PcU(r{R zx2!J|II5t*g#~JUXVI~wR*}7aLr4blA^~$u)+U3tu%q+VpX6(LJ_$Mti@1t zt-0KygGvyO0kY)fR^{4w)zhuz=d8Jb^2(5`%mH;Y=*zmwnUVXmvefpftAm$*Lqx#s zizheuak^9c4edQUoz@Z~(qq&CGV3Y6Mm1m4eWOx~t3Kyb&A_0yPN8*O?U~M+v}NbU5?30lO3l}MzuV!*`-NQ|F=N+0#xJ5bSb;gf>FGYl z_m7uv{N(FP@?tNmtfi-kRh>LlE#P@8VJ2EzY6Yz7bgxwb$XZ4WlFE=_LIi;dWZ6uV znYTSA<@DKaWyQT+ZB^PG+`OFbXGaRqsTFWcc&qEEKd;P}rrX~-!_Cuel}H>|bz~pg zT4qhJkZ)eW)L|{w1*xOfLNA*MmGVhbA}M63HrMUjykmlbxf{uyWPmb(#c?PAZ~%aa zgW!OHZ>Nyuepk`;VKj5PFG`gviE0bcLbR%v#tH{0zR zb(7bJ&m60#RvhhTt5Bd&?bH;l5&)EAav02^TirO;m1kSO_TBf>`-GNIW$<#S14&_g zF^4~}KnF7NTK)4E{~T&>!fWO$Phvul(xMI{1`5bco4E)uKeQ_AD)x!9`YA5H(b$UD zU)_1Sy4&{&)==vtGQ`L+o5;CnSuuNff414X_q~39jpshU9+s7dMxx*`x>3)k?$!%= zwL+AwvA_yS#>qljP!n4mtHxI#lkHqYeGFD(~|CUYlEmXKi*34xUlVT+U|c?d`x&p{Btx0TYb z&zIWi#xY>jYavJzL~HgehPGB&ianW}orQ{EuDWcy8F}{lxwx-%`%2|==d4X~ z464!^OOrsWKDvqP0=G!FvSp_BZLtQuHs+15xqW=F2xPTHRi93jEgWeK|E}lnglReb zeqbuk8*#;HS%euTY6W0uVhThUpVV_C!*JyNeRe&1(XqTw`+zu+S`6wd)-%=~5pvbk z)EsImyvIreVdZB3gz3RMTfibDF|v}Ks{CBFDEqnRHVb?0Cjcw9+pY6JMZP2wy(Y3NZ2J)`;BX{-fr@J+Vy*S>*p;orwmz*l`@yr zuzr@e*3F&W!@IndRS6q`PPm}1T+W0=N2cOcTG;@EO?0bTGB%a7Z~YRRoi(VMQS3V) zrJz6oL@HCtvz||Le(roLb=id|%IQ$fn%?KF=6Xch$>o^(pmoV`XU}lYWO3NO-=F@! zf3UnR5mt(TOwxd;6*_r1v&NO!+Rma9&_F-|KurumU~FQ61Q0EyA+2lmuK#@bXQwj+ zr5ID$EGX7w;?sY|{Id^t2#iH> zow#{c+)?jIHMW?gSi_NCA$!!N14@^PkX)a{r%{JI%R6;lZ4tYYjB&LSsM+>W=1G`4 zAe8MUGD4aWzQ*}^&U2NI=zvKUNx}bahcyC$qdW6_B(oCEQ0FKh{K1Mb*D1Gbq55gWG7n(oFjteQjD$deb(0){(`Lhf6ey%bO);_)jGJke z)@u&4;t56FAS$;?NLXLxwVo@r-fV7H6RKOa89-cYNhMX+Zc?JkluZb&1{fjN=qjy{ zm5?ojh3>oc!f#{5(@p0`)k4L zrtY;Isf~^It?pZ`yc{$nhMGZ(ntn^$tJxDLtci$4CP)PWSfsu@yE`-Qbg_;Ol`zoo zvdB{5#X7l)4o%n>nMPNuglg^F2|5@W#E9A|onhwK<_>)OX^vuA{ETEtUgDj`8GS8hi`k+6^qq?s=haO$a|^KbR3mNB8`t@W+0#A!lJUSC)~@q zkB`cGQ3+5H0uyXWrHF*SQzOyXOPaJHG8chxYNBgP9ckfBFI{BM)mGorIh$>gO?Ea< zbR8yCncx#M#AEeQr2(Ol_((;Jg_{5y%FloB{c|U3I*+8-Kq-k-Ay)JWyp0TzC#pb= zPUYt`vs0u1L39z17%=MET)~Do)FwqlO^^T?;9L^6%brbpSlGmE9Yg-5}R*o1IBVsdm#n>Nbx2$LpB8;ll znWL!73>)ZX3R8JoU@olmM2!L3?8mA4V%F!wQ|g0yji2>(mCxnML5qMOL22D;M?zAS zqEKz)>s@zUWIP~>Aw!}n<5aX2&`3rg!xZHS547Xo+I_J8na+PM7qx?dkjd6hFknq% zlPt-G21*fYuShO``sramHc%Pegt(+r8G&vnAsgxmw;saO<<7Ed8F6xe0x+bu5d^z; zAJ=5P=JFZ}u)rc9R0-UO$+DayMHqKeb_xnizI~g%{$bohm^U#l>Nvz;08Bt0%`$+j z01CJP_$;Xaa~!~bbB?oQ!j}vI$An_11GPkFC;L~M4*#ZpTykXv2RNyc#-a+c6gC5E zhpJ?`*HF`akT9(++_(xODr&Y@+HXfGMMF^}4^V zykd4pE=?OI%4xX6+ICf$3Sw8EO1ffgO&D+&y)Xqzgiv-RKdIPmot!#p0hc1yD8*H7 z+7RtzYmu&_ce`vnZLXg8y=M7=kLbJsN$A5`jjjlU00ICZ9N-jz100{>`-{`5Hvfn< zjsXxih9~ z1@zi2K%r<_uiJG?=y~Ze>-N4oTr>=5W&%*BqFMwcWmfcx$7as%eC(IcC*#k58Gihn z(Rg%<fwCb%cl2*tWwX(G5ry}@Hy{CV~+S-)XEUSs%Ay4kVqb4KqV)Bsx+_YmNmKC zB9Ap_BArX^KNvxcx{N5HvZ*G^d!df-@*{(5l+2w9HL^Gu${^!srggJRktQQr0s!|H z1VA0YqyS6IGZ1i06#PJ*PE@SMn>xwO=9}Yj;&DFvmcv)9kYrpd)#mz2#o~IeKbzIz ztNf*F$iyO!Lsn{Wkb#T{P-70t;?|u$vh_+A%Ua4rM~n5OZSpluVo;jT#Hr29ul|P_ zzrSO3{prg`*WbbT>9g#5zVFxXUp8_k8sJq~I7M#WyTop|Zi^hglpVO9vpq&>&0-{; zR%4=AwpNfxCfzIBF0S{z`K6bj6^i@1h+a~A?*B0#4}3i3HDuWPWD-iaKsycL%E7^v zMXGf2=u`es*Zu6zdwS(-X)n{w|yidCQ3$?5m zuZlvZRSbg?8LW4V(uV3BtcT*Cgl3AT-YqVA?=mTc8B!}jtgr$b95X(zK7KABg zCs}SYiix-|RJ>!;#;pdOsjr&UW6UA0lE=X`Da2ZGTQzW|`S|b65C6uz!Mrt8ydEz} zi8>njJr}?4D+V;Ug|M+#TKD(<{hb~AA`^oHzKIGPn^t;zw}aC4NyMpRYQFA0;yGTQ zUl&^>)t2%eFf#L+|~lJjzt1Ac`f7DB|t5y_siw zd9U|QTDFiUo+q69zP>d$wb`|qoFAVKpj1Gi`>bf)61Cm44`HhA7AV+)w#~ z<<+KQRl!6_L_?+p8A};CAm|wT1<6mhZ~Zsw-+b0@{AT^>_^Utf|H4usdzK2B#z4~r zl@UZxj7Gj*-rv30pO5*0CIkC$Rv}c{LfK1F$&rrCsxC-|b&Y)i%^@Z`h+*6?L~`@$ z*0p9?h^Sz&Gia;ZSTY5v_HonfhDPkfw2_WjbygjiPiEn~0ioxFCH(q%5QXQ}~Jk@Pq zT}&IddE=x_?me8@oBCiT@5=VYOu7hVOcRwbj!+AoidS~)cyILZHgH`LzTzwI$3J=e zgUNk)neu$3j;YzIvcLpWK{%av{q;S5S>5rmK6Sh3bRDnbyzbk4Lv$m|l0#t>e;x!t zS*w993nF)T7)cgt1dnWGR%)MIRk|jA&K{5=1`1#>F|6s87tn(QhUDe_i}sIazxKSq z?4b_0U1-&nq}sZzbsv?QKqX*owM|`eop5m4GijlFvAg2m;x_eYnz9Z;S>m#D+zZ!t z@&1RjF6Oi&{eAZ5(ISsmRNWRZ?MAiI%+4D_|1NVJ#8G}O(QLED3PW;PxRL+M`;Rs` zhtGkd8aPuSi*L&Tb=FEmN>yBRYd#eiI`bt?t&}ubJ`sv14P52^spr~c_2~kK##`LSH9*33`MLU|ckL+)L$PYh@PttI%T5H{pTP;w*ELRwHWm{DVI2lpO`(B`ojcT%U zy~5SR#@#B}T8|kzp^8nJCJ-b;_c)WT)1K(s%)&IZrp!_^MW6-q77?>A_BAo!WZ>dyvEAdr^u#qF4(z8u(WxR~*Hd-@YpeZ$Gl*?Lg+sCSN z$YmN?JA6f}tmBki8lz7V>$Y4LP2S(CGx{-Nm1~K|t6r>u!`I5y7bk7LOc_X2TL~dB zkryYinG|?gHnX@En#C?-)H6a;Q@t+HoG!O5rTe*H8NRDDOYx(=gWyUUw#lRL}1EeXqVLput45L3PNQk25(( zt@QO`SGm%^UA=T))Ma>AXb~ zEd_HZnzRvY6SXqw#MNqlIP?!6i$q(-q@m}`3JFBf0;8%!byjgJ-*jIAk=j5lwE`gw zlfj;<)e_*+<#$lqeozX&4zOjYY+p&gz3N*M@u6>Z;V8vxH25 zs05yv)+rDAZd*mTfAEdHo+HOhqVBfaS+i;&l{(VOx=Ic8^ff026JC$eNUP`;NC8!0at2?sY%ASpCeg}5-l=t`sgYhV zOREX$;&R(=eX@8?qc08%D*_$s-Q3+?XecX1I4pbp$c)B$13Zcmh(rxgkpYA_aH@rX zL($m*Oc>P{aV?UJ0!M-vqY6+G3xEbCAq}gQy<#~{iU$>2SA<$KQ9iK5raW+JZ$(Lz zEv?#vq!clh%_dG|t)KBsv#F#md7nNgh?XN%R4pRXHq?a%tWI8K+l!#qIDodKOUyOguge2H;Z@tR4R512AruAzNFiy1CownCxp88xoA@EsBoNN){)%3`$GzQp zd)Ukw-$rH*{i>6<@vo{A`G~8ctCr!-9&Xy3qYY3RilgE}lN9n0-y6tEifDu8Nr$aV z6b${e1JxQODNCEKIbzPu3Fsn8V%jjww=||Ccn%+f&Yg5pB6@4O#DX-=+U!zho)GYu zP!J%@fqNLJ6@%4Fq6l13q%bg%0@$cPszh#geC{0|cBU#~9i!*&h*e8oM4AW`NNlj# zdeThNlyk@eE5;10P}PRMVNaLYOE1|W6_iphXaQ}(sA%6t-ZJ0hv|*#sMl2a9t+O^& z$6-BJ(4RWEsIqZb%NEDgyI;2VM~Lz+)4Dp4i!As0^{vgY5df>ebc;|}yATjZ49Ke) zx{W;ccYW0EQaK|%9X@U;b<+_BggS(BtfNn7-<{mLoNceIf7$$7o}Z-<4FBGuCVUNE z3jx*rq#Nw26*jy!zK(8$f=*IO0jRHyV*;5zjZU}HG8&3PPVVz$6MCjS$^X@s2Xr^ic=t#LXwjeG_o1p@KFNUZ z^Nd|8%g>{*XT37Qo-6w1n4CAVjAM%#qYJsn(K%ezl8tAzSB1qJcR;IUS`ojks1cpwiPBF30u&(N5ufO}9 z-}td)GFhl}xV>QvpJ7hW_v)ejBFPcn6ZhJ^{$=?(8ukx1Oi_vlXpw(sP2VQGJHb_N z0#*FBciFeQ&5K#$%oDtjw3Rc?45^9w{?-NA>iZ9F9J^O_-j2tsySjDm=`cM65GsDQ zMjp0nk=@&5qEtbT_VvIe*-Cd~n4zu_t!-ADm{1Lw0b|;-^ac-B-Jh>JXolp=&vOU3 zyTK>x@XnDbdJO{%8S8*fNvrYNy({;4!4Tw|GZU&Hd2j;8QfL4GDIy$fLWCA#CS*b! zFPzo|bqF>~d3bzAe{C^Qw5cEkuK9y1cR~rEfT*G@06?HXK}G>!RTMxAI53Hfs9wS+ zPLtP_rZ`#w0Tz=16^xC!P(d0snao;BLbpCP?&l{wZ`Z!pt=RLBQT)`KXj9f57_=j_ zv#+FV9AE<#N+SRO=nVh>1O%uuB`H%*YU|V2?lpiIEJ*8o7dJ0CuH1GW|KNB2V)0Nq zOX?tp+W1FXyem@jpB@anZd}IHz3G0yy@yihRD8P0XeL?}UsL>z%{@ClNH4JCte?0= zc{t81O@J(df+8YN*|8kYqb1YHy}M%GkGiosQW?iG)(r_X35H~GQxrsTY3HmzI}GFM zUTLrFyR!S{=)AJhZDuHgFNFZ9kjgYjHO%yy?&Mx+n}yc?DRTZ8dNM;ON98=OLNrq% z3hWlL`FQEUT0~2Y<@lB)Lq5l$IU$XR78QUrriclOv;af`NEidJzT0qpPoMZBaqhFd zKX@ihw(Ol_-)4C3^`n!h6bL9%0FeX$K-2__r6}aP>nFc6?|nah|NZNK`|po=zRxU% zHkcRB(@)9*7YE0DH@4ce3l+=f{5M5HBLlE}5n~yShtBew~@W;jipnpZ+w?@76z< zKVAPvt`Tp_8n&0|kVU9ahTEnrbG@}l_iFFk-?e#ApKs54KDE@Ev=K6ZSS%ZQ)g@=0 z8tI#`jNu!f5Bs7o@^<^n_RHVpU9CBMt{^EZO*>cl(IlM^$jHK>)7uFUUnkgj_~r{8TCbqu?PJDh01j z)Q!oQByM7TGDx)Ah$KyHg#k4xgi%~C4JAJV62fsBQgiIO<(UnIrbE7F?d`Gg2aMyn zA3X8hD}V?90tB?0A#{5MKd#`&E6Mfz&A;>i{~Let`=hS6ItmO3Ao#+%Ec+kWBVSCC z-;4*>(?!K8WtVAx<4%i7PnkEToITp>!{C_;Zd{*qY{gbO9>ah+O=*#)i^U@vf#DY! z#aaxE_(Tg(=`iQm9cypaDu1E>rf>gfs_L%a%^&)fTYg8gVxUK{%dPEtxP=-umxBP7 z#L?}&5s%`eB%Gg5u_+Y*${t`!14KEi)>-FR-_Z#hN};%%igI7^L=S#+=a+uR;Bt>~ zvJKRhCnamG_OWENh9waV3klf3ZK!>u)#<1lCh`D}S$EpU6i)OiSgzY_B|~|6bLcC^ zdBc<~34=f|Z+tX!5P=AVfY4!z1n8>+7$swg%}?i7LOPEoSvQy>#$cX=A7DIhPfz5^ z3>4rUNsVFb>CE}ck__2Oaxov5@9z6Lw&rPfKCRUh$BNKEfCfMm6&BZQrk%CJ#ns`< z>$%Ug7@)EPqE$8*i^cZ6|b%bT9 zFa6!Op|pD0Bp485JY-U_`YaEvGQ)Ua0C+?I(Q*-+g78|l=x|FjY3sD+>K|(#3x-?) z1cWF|=*~EZdKm{H^SE?_783xJVdU~_S&3tHSHj|`d@3ukVaiuq3pTsR*<>nfr2;Lm zFi}+{7s+QQ$NSgjvsD&Wje0x%+6X^A#qVtRpeilJFl9w1iiUb6wcM~8Pqy#gyp?Eu zE!O5J2|=*!`aBAAC_Pd_^^UlJU$e)qZ8Jlc^Ar>TF&czc?W+VfjXl#oO==OfRS+;E zZ~goK6st5gyQouoAfpNjF;sON3PB`dDjEQwRhLIrvY8IjtbT3VRGs(LLai9usnV^V z+ZNlG?%pjsI+qj0n1(E__d(Ior5VEcu$Ne;sgZf|&__%2IP;o}zKzR`i~B2Ow;Bc; z!J!UqhBpbcKQGNzV`x`~(hd-n!!1vjWSVTXOWk-Ck1@uGI9e_`r$x(}t}-U!;Pg|s zpZj2{?2?salN?`8~AJ`0Y}lbGBJu(+}?KUuu*zp zHQK7<(&sj-J2xm}n`3H~sB;}|*#GF;dtG(?GY@hF;~nO}g>01QEW1FflEy0JGTgxo z0aumm#iskOl~QU$*BCPQKKC>Bu}QbBBvS{eS`vz~%57CE8|;9UkU(v(r6yyM$hfwR zI*K0!otZGA5LLTHsYwqWwWc*|e6FXb^|kl~F;o%hc+Fb1Mz4-jPY8EC29E_g^rBgPa08WaEk39yQ>IwYMz!ni0KlBSJJ3-#rlgp~fo##ogQ z84rT&6p@VDX3d9V#xDY!UY8fjQ3s9%mDg&O$>4N^QMi^Jjdw_lf3l`)pZ z`E{s)1OrQ`$Sl^iv^A9w;2yLlU}q(8mb|WyAN$9IIoUz-Mz`zWNr_GCBCA5yQ5n=j zhU|&u3UpZv!4@`4s|dieER-&EN=~;NJ$&pPJ5gK3*w}{0D2<_2a$sB$eoXeTVW0l* zZeLVC6t$qDhpq8d${1J9U%|XZ485eUgAF(;57)_YmYaOWgz|h%uUvE22IwTMIpb{W zOe|$wx}2+Clj97?senxhL>*Ki$$$A*pWplZ%lrGLD9lD;6+y(r(tcKyB_x5OLPdoJ z001BY+iIT0nVk%G;cBx~)gOc)#FV?3CjPmH&yM%wau_F(Ov@$={p8U)9ml&*hXeSc z@$O?qsp?o1KJ11Yj?u}B?Xq}y_pm?CS4Vz2T{{&{inn_jv){gdc;9uDqP9|FvoAx1 zdg{n}JMYfxcAs0HW8X{9x5wUdyF4__1>LHzy`MK7?!c~Zb1a}?K-$T2{+usUwezxk zLFoVhU;yC-GQ&X<8LUtza?D8nitLgI9zP3ISrnKRYo-DctThYCI&by4ecs)G_Axtb zC4neASTdJb#7gK0569lx&iO@ue2enoslPNEYSm5Swuwx0fLg0O(F4k)S=;Kdv;W}q z)%AJKo|CUiH(p_|H0I15;92f969jN8J%e2_%Hsxtk*qae%#^`lVL3cAx=*=h|I2;o zdRC;euXkk@`Rl$+qhJ$HTD2jRz(q+L5|m0iJ-_?&U%dbP#I@#{ZLc{}1qBVX8U+Q7 z8Wq{qBS%J(dMd(O<()eE<-Es+I^&_IKNP$=`t z5^Xm&sY+Pr%pFg8=Zak_KT=D zUVjI1)#*kWjbyRv$l31QUD*9Txo)paEt_-YYww5Ib~|UxWa*yds?B6s<)YD|RhMya zjYT2=pc%HCfpe=+;aeZF=RKS6`DQt3`DJ}9OSxlPoG`Tk@(1cYB0{YxA`R4W9TWfp zFgBGpb<}a*my4$1FsAIfXo0%5GpnoZJS)~Ix5Sn$Du2|c`Tn22{fD1D|7GBGbc13m z|Es|yHfWfEr~6wk8+~28k4JE~bv!FHw1u4LS^oJ0+lrNwFa83&V zl@*_Q{aj69lRF?Q=6hl~D9nNufQq7kxy=1IYPPVDXFe{--~Rjmk8`xn);=MJRsq#S zQ9+RcKwOtIoyh{ym1^b3{G`W&$}6_+l8_t}Lr<5V+4nicw_JahlY!H&Hbz8)06>6F zylhgFsxbQ+qH;$Y#ZLXHf}r*=CNlW~h-3ig44EVLd2n9UbyiEGdU4d6x?r?=)19|E zEAzVdXeHIW+E4j9uj}*m$+kVSdoLmFqQX&aVg0h-W}keve$B(Fiy_3u?eXFWh=>xF zn#WpC>~{^(oyREY<;hnFNj@ziZF$7-F=#}Rd5v-=x=Agdp;Q(^5eXP9j=M8wj_x-5 zGYX}l7L95vYT<&F1Zs?=)XH^gSqiP0>+a+Gb|0<$@7n*F<^Lr4-;z<%Fv5WtAP?4$ zFZ;8PyW@(lUETfcWD=`viHLH09LzOOEEbIs5ELPTg?LD{5(p?DPVBhJhHC$o$&jL^ z1As9zs7=!(ks>8cW3y)Kt?5QsRnvQ8e*DFMIMrUen_ss+R&1}L0wB^VMu~8l4p&Z! zwX^FE7vto^&Ddg!kij@t64ImXV^{Vre{=EmD*Kvso@Fg~D=C4fVslxScQ@#|ObLwH z!QFf6tA^WMubthO-n~2g7mKCdtp^J*qn1Ji=+qpoZ-GoQ$_pIOY>b5=g!DZ`n zzdDC2kM>*-sk3!WZ=zY~sfaa$bDL;?e$U_k@)X3l@WPquoV4*my*1n2c-#Kc9!fe3BqvM`RR*DoV5sOq6wUa!t!FyEibUrXKdBc z#fA|{27wx2U~Q?cTu>3~TCwK_7Ly9Yn2{103TRvb*VGi*8=3o&f6(@!I#r|FU~U8X zEpDyiflq;Y5K?@WVHBkVG^d2mqq}P@QgJFOvLQ63K87ONoR*C7f zI5t}@hlmet~BT-~F zYtTHHaIY$(XE?h?aj`>wXWw~q`6Roq{P67d={jqyHpx{2v!Lpi6$}~#j>|osmmf-cXI-xUZVHd-( zj>+I6N-hKIzB=QPOXoVq!~$xKZY7oJQa;hTB&tmn=ZDa}c0OSoxJw-Gd6;b`cz%}uEmKwEsqU{l4@=b?K)1Q6uov%=sHw(nI3G&*Ek-J@6sSr ztGq_mQFDzMjeuUrVo+$1L9doI+D#pA_g_a3s|Pj&ziG#YWvAFf00=uwt=`x3Q&*j{TA>+Hn=Z@z3^Vj~p_VZ;P696C* zi0TlE2qBpZ0Vh--Do}u#YAyA*-zuNIMO$U=#=2~btR0FO5N~xVC#|Zgn28xA?R3rR z!*&_Ick7nPp60yhXgxHeNC5~s`(zW_0u3bAS_LGAPBWv_Nh-h)-ohsGQ5#jXq73C0 zWjlFaku;c1vU9A5r}Mo-4Qg-dZ+ZXO=T>BukUY)f0&||@^=Iq{tc06!ygDV!etPGf zNR|k)lw||;s?cMqUTf6Cwb!)oKJRj!b*4cif_9oVw$pbd6ak_HNh)$&A{6SM=bKMN zCQ>@MTOT2J!GS?YvS(|qy)-iK1hIgyytTi5*gBC#g_5EiV9+PO?oLLrFq$9IoTb?mg8+@@P~KB;gh&qnSfs zYW3F7-+I}GMKOm*a0z8jqY2GXLWyBAh7DR?6r zZ%m}~_lM_5U@Ncxgd{yhU@A_f;Nep+qW(Gl4t30AvYeNLnRZ z)2a*3+M?C1mU1)O9qsV>;myZ;l}hyqQ;J8iuT(Z%HM&J3(#)X%QwxWeZyp;d%K^Ef zpby1CqN>S*>UI0hkQx4=J7%S5Kb>ztpYVX>O`pJ_O8d zN&889ewb&{&@Ict=T$eG%7|l%`KXRisoiHbYA&FFSL7??!JLmxN)?r%vv>? zdEWqaFVgM$^S^01Y2|ZZAQcx~0xwo8%ax56A8+suYq20)ezkSH4C-G5GH}5G137st6D`kHs(g4OOxtCutY$X%IKmTpt&e} zuqs>wq3FH?sfT)f$|BmJEnEY$9)5rDuYGl@BlqspkG!TKsmUTGyOV>F{iz;Zr&lJU z01zYR=NhIW=qFf>yjnWT!LBNjE!n> z2)btSr0BYTOJ~n7uKsPW{a}(3ltgief?Z%{T#}_$Zp!80X2+*%T~kfk47FzwotSD= z^r489T0o#2)fGS_3WUN?DB@2eM`>%+bRT!r%9rJeX=3cOSi@7=?o>);GavLfAsl|@AFsse1*Ha@4DY3KK%b%^R$;no=z9Op@K1qX)uBV2o8sW$T3hr z0cQb6b_lpYkeI+}$I`fv>#aD>2$ziKnWoK9IAU(1i zj>8$pYghqE0bvZFlmtejzu-%kCPS`@;sZ`1#4JTZsPby(go47cDpq-%R5Aev?6xVk zJ2~sgjp0m##+l)!#Z@h3sLb28WvRq^4HfL%cS41}3=*gG=$!zChH01c#riT>eYZOM}+H1AP#TuZh2%Z+S^yrpaN;ZN*6%cC_2nCP` z5HZnFNt8W`*U~iiL$Kb;vKA#$%D4){I%(Nmtzm=-SD4cA^#(K3 zWBgh3>=|bD`WPXTQCa=0@jVMpcF^oBWO{+Skz+B-bzN#+vbVL4v-Ia^U-R~H(`~)y z{V0Qa*Zs5KHaY8~eE$C5%{QbflbWNylMeCP!m}|?DPz=L? zLZN_|7U&H1@g*I2efQ}F0Al5cC_v!2ZdtpV4N32-C#UwA>NOWFu%rm1#kA$9FZ)A& z=7VkZ#7qcLs4DY#*;6a3E#b(ME(^k%EJEp&q_}LGY}7W?E5l(>nW;!324z5^Fc9=6 zx@zafaUrG3@X~JVTgNx<7AdlL$^slfu-#0sM$>lHJHm5jWnCGmu|O%YXlmZ7+wS&p ze70<=X`4iA_Gbul=Zolrwa_2-Pe(F^7ZwHpiXaiy#z;YjNjxdKYV_!eniHk$bPA~) zpYyWZQ=y)tGdr0{bS{IC09{dwu~!z&>|h$GjNi24f-9q;I)y15)f{OB1eKwfAWLhy zx>F&yOv~D}zejKPR%HZp=%rs9VuA+Md;g4GAD{0IEvsu-{qSX7(`~nDTc0ft-%dkW zuRf%3(NgI%H}9lLh2H+Hz40)bREiUkEVxy1P5@AGq%+mW@X_@{q9dXrYPX_dp_3mH zG^#9ZGI!=yZ=qHB%V#yy+8x@N+J(9GQ_NI$t+W#7>l)V+ z%A{Rh8`ml78!1Pf_RH%*v; zqNP=V#pQGpThLN?Xx7{L#9I};z$2*_)GKPJ zX>v?b$0uQx&FW2gAfxr#e0TqM`F6nA4$erexEU2*7dRAS{x5j@*}}K$dkZgW&BM(6 zg23h?FabW~o5rDkM=aC=RKBnxI1H!9hsEKeDzjYha%s|8nGE$nB#7ZmI}Y)1r+d%G z*?MuH(U3}!VV#vtffVK1RkNH0-9^2{R$4T3bGBS#GBM2uhPRYXMebz^EYW}#L(p8< zoDZs9yY+r%^YZ$$_sxeS@ow`WmGVqjBIU*L>zc_>mMP3M-SgqGUhc$_f(%j+!Vpx5 zfwf)UzCCzl?#%}_YB4IUR=&9*O|zjGT38UuPRCp0R!Kl&TE|#Tb82*LkRr5E1a?Pv zAL#nq^1Jq_GnCdlS@-IQWzqVpxn;zw5(|XFq$bFEHLG^qIr3_uUa4zUmZ)7yYMV-( zI&%hM^ke~qm_leh{;cc%Yj0QTsJlDAsiRi))?r$mOJAfO>Vg%eDvif+X-pQ2LkHrNwz&D;B+W~3cErqY) zjzpY_z?uAfo<2q1h%$7Iw>2=12pvW)4XP}uxVWXS9M#h2a;~1vj|Y;2WhtnnHm%+N z(EjC+s#xWf$}C656T%8Ylm-eZq~~YiO9=L9)PTr`U ztm;|d+bQJZ`3DhVfRqm18eGTW5e`ZyAeHeXky3CllB!{da2P|*CAs@feYJK%hZdC{ zAb4i_^f^r;f#F;VBq6@jvO0Qqk-oF$5EvZltIMcHh))E!=XxV>=po`XTSulwmyZ$ae( z0sv1> z%m44FI%^kV7NLQ_1O$?(Wh~9QXf3g53W8Nf{gHKYEj>DQe)_yRV(Q~H>wf*}cGJ1L z>)fWUdY%1t%_Ena$e}~lG9*MPR1_2pT4JoUu3kAnR+G(G;y(6^Z)qR*ToeR=$PnTI z2ncbi5TJ^*vDTxClO6>Cm`F{rliA$YXAzhn?h;ly#6kuoLT_3%CDV;t(Q(X*6^eou zMTRZP#Kwt9v5~3Ft_FjVw5v6Wr6UcGqhtU3dh(xAM|Q9hDbtAPO>fRT^sr)ar8j6nOH);-D5>gO zcMJy-s4Mj-wPJD0tLLdmC5P9q;+ax7T{p7W7U9@P(bPzMNQR&Vr&4et9U&4@2re}fZSBf)7T#7F z&Mj0rM1$@uNgTMKa0Zm|f^eSPFOUEIhaGcY_RW1|z4#706iYl@^fP`)SF-f@)p3rK zEOWPJnTsAyU9=f8wrl6@c6n~STTjDHcW342$MPH2y5QPSc5Yn%6?Vg|aZEHV**ucQ zOO_4yB;SA5{VKE7@!EQRoxVL|y|$iOx7K#g9{+B(tgc-A_+zT^jJsb;`8Jy+plMRP zP`-Q)W}8i#DKepr2wMOX6w>kV9)1hYD?F3KJI7taFQ(we_rZ<#;-n8OL`)npE*hgy zJNn4p$K9hz?@0$>j8&Tq#Yp1Blc}jC+O-%l+f3$1e0l5RQHY4ay(ancr4`aiY~l}k zisx(8kqsT($shKU_l!ttciTK$TIgA?5BMP!QZ$af(bsBC!V+0q{Mdnc29m~a>Hj@TjsJS_ISk8uo)i{Zk?U+ zuRn*gakjp^;=1*?k`O1#v8gYI?`Qp_xhA>2lH9wGub1a!ue;i3t8~t5dwuR)ec{jk z|4W}fKK%0^WS5~d+MFiv4_)4w{|F8d%^G&>ZUPp{zCr3_HjTZPs3#1TGyz~JMyzmN z)#o+d>`gszU?IR!f{+}{9+x0mAC_A|YK>yOJKHDbwBBK%elmR!Pu$kuXdO-FO1_qU zEZ;llt$T?uVzRLz5IS-Llne}V2e+hWx(~Ojo_Q6$lzL~^^e!IzMn{dDydD3BbCe{q z<4jB>1EhmNF-r2rqEYCA_DGm^02nu)!$Jb#l_57+P$8L}&llh#ndxVkFS18OdtjkT zlWIO$85}M5<`Q;!g$AE-pYM?e0N|))uI`&!^#u8mea>qLnjD9S=jvYHGcjvxx5C)=YjL-@~--$ z@i~0l*L|OQW&60L;A6Hdmf<1Tvdi6N_ZV}Ajtotta0}>@TV6AFb|eTSg8&Q`j7RRg zN*(X>!;O9l-%olGxnub;o+s;_=jD5OVsS0KkMXFe12?x2+0jd#q!hBF7LdgkwYUe+k%g{w z7#Z$}5H(I{G?q~L21v$Gj{7j$KsXx4J_N*40IR`e9d0g`!ZQ}oSWI^=h)43?J-0IK zee|Qx9`b-c!y+Swcq9-Az=X+ES21d)?Z2f-hYAx~jN{$a=1=>Crm!=6ho5X}EDV_R z@F7%Hbq~b?VgQkiCmG5Lv_fJ9!~v*mXlH{VD?|et6#xPN5SWT?*TgbVR+a>%g-X)AOpcrSPT{b1S>>=Y5+H-Dxi=6C;$LRkd1;tB5;BX1{{=y z00004zKH}?85kHaP{%}GHP!_n5@KX}xC;$%q|4Tdoq%1xzziy@W^uu+?`1v-XQ`8s zkrE>i8gb|>pR02l^*15p6M z7nMo`_Xhv~xUT?UDuVyh6ovos2VO8b$$Qo0c+KA^B({~b`R@-l09d~5k2e5-6lz#a zrvR}E;Ls4_Ai{mfgN91MXc&bC00+@nr3@6#EMO1<4qqZ6BSMj238YZ~2RKo|U;u(( zcm+2K24D~XFbJQIU;qFB!C(-;jr$3{fJ7lU01>_(!C;6myb?h{o=1d}6CA?VWCREU zAizB52u{u+;4ww;RUiRWAS)5TL6-~w1ONyj1R#V61OOlaG675ifC>19S}d0-&|!{y zbTRBgLJHI&0uT&>0YrchN&rwmjcf2&gNNWC++f&2M1~F=1Te;R^wB~K;5xb}00dwV zfI%<_1|WbbKpQ|XRG1*g7B*o320<_w1RxLr5CISY5CVigU8+oJ5I}%HfItM`0D?dS z0Ej?tVgLdtF-CzA)?fez!5|ob00syZhyw^h#yU&*5C8-MfB*m?f&hp>fIxtdF(RPD zA_5>l0f+#I00_4rfmiJ4xM2nShbOEMARvSQ@^Kv`htWa1Kp~+(A%p@# zXwD3PLh89{z}Kn(-(*XfCDs_TNP+ukK4Z)>yPRf*T|f^5cr@_Xj|6{>zr#PkuX%Cj zNB$lbv4fvH0hAAL|%s9 z3?P682hhQ7NQsO^LU!p>;}dRT&vByE@uBy-(6dcw(E2G7Mq8qpwk>D3+7<)hVy&iHNOW-mqniPIeDt|DWO=! zp-~uefH9hL%yN%M%%CW;$qXS^P)vBA8#LMBHYpVL9bQqJz@j4rP$tfPQz?7Ig0Wb3s+GCCXOW{wuxzw!?1^8mPfn@5XLB`wAf;aT>?BdSm72S9(NH= zvB-eOI0Vggz`M-zm<9THfQajK`Gh827HDvf0E?x-07VYP*8uY-p_y`uI);$DWB@`) zg&|`i>WnBM?9gJKkdMf)RG8yFvs77R!mlZFnG&BfBBhEY!x9nV00I#R5QH3tjEp8- zO5|y?%xyd>6xrYgZPr=fGEeE?Xz`36(B?LEb~wX2DNRb8W`n0pP@HE>n+9Y^#6Ee- zRMFH4`I3Y)++$1~pB;!|fnBELsj*C+57Er9PLmyG=|X%09ONvwDN*G#J#Mi`Ohyk) z6Gy@l_h`^!mJdnD)8i%~ACO@n6#|M(7!WX~iD88a9R>(MXb_^YtWv^2ECup7ga&?gAq6bg5BgpT`Jw23#WG zb84Oq&_%jQ9$V8uRq%;8UT4qRut}c?8noEJBe>cnD*P1ng2`L=i=S zArWl~kUCwa%#vqF3W*pqhhc{)5oIif4ozzG=ukoEGQ*gdDi(zzW&Bl0-T zF(9Hq8%>2arzs{DWekbr~%AS9!Lrb`FK90N*h zQ=mo0HXdbmDdN+igd$`_j(uvFHwys}TW+HQ6F?n-0D%$%ENnmkuCOTpU@(XbA%cPs zA_#y8fCzvBhzubGP61dlEG#hq2nw4(iBVz%5+g)_08DT|$^alh0E7qv0DuU9pfHGR zfIu`L0HPoQ001yDlo)Wq2m&QW1V)BJWLSX65+ejs1_*@60D>ZF1B8gg0C0s(0RV8C zg$MvZv7M_TivU7$oQ1&%006+q5CMQmt`h)!Rsckx!~h_q5g9V8HVcfB^s?81PL;FaQAn0}u>&J|b|yNutRj;N%f3004qP0KfnQ z1D=ln3;+PZ000mGFaQ7q0}y}#03aA}UtIuVWB>$M03aqT3<(SY0EXTRf@X-3VJ3d| z+kX*okOeRRz{DsNh5!J=0M-E*8o*-2C;(&t0Ej>!ATR&`0T2KLfB^s?004juLJkN7 zeEkAp0SrJe&lAXTV9+55764+0925Wn&&2@1`q9UK%SHhp5G(*-03tGgk;TSf3IFfs zLjZuuFft5~4In^`|16! zoHN^}XLh%yySlpSd8#^6O+^+1l@t{Q1_nc3PD%p?29_P@4&@J~vF&w8K8vOintNWPq1I#u^ zXN3PpHw~vr@sWGHC)U;2@mkK|yPXZQh#@>iozsa>E~tBhEQL-_ zPygPuT;uEFDO5I3PEMP!G*scvKc^%I>0s4&taUF3I(q7PuzIR~ae1jNm^TgiuE)B6 z?GqzIXHb=rq^?aMjvWfhd!vwg`WPT)QbSZTA3Y7}J-zi@G@W<0u9#IYFd)@^S{J;y zkVz8q;bCGbGiM>=nJNmkX_duXaDFVnARCu&bGmJ@T@w2VDw5Ddjp*aGMamTCIs(v9&^Id$VLu+j1(GiU^ z-mQlkCc(MJxY-(p!G<7$x@dc-;&BN}*^SSjwl2la*FBRw&p-wmoHSuww=`N>^p;_fst)vh@z%)HQ-J-MOUg57faY^`=XTD6iXcJ~t$ zgekE|vsGk)>G3~p^R?=S{U)k{jWe6&UheutSoOQJgPDKXgPSiCBU>e+-=fxO7OR?$ zg~iZ8PrR3hF#ksYURAg92M?q0w2rX`Tt8gQ()yX1bPp(({$E( zLOOj>rF^}2THEwY-e<~6rz54f$STF_q^zPWUNM^wISgC5?VFCtyo<+IYKzOt63)02 zSZmjd2XA00b>4yB?FGN|q@7du89IKcpvh;jr%c}bh8sPpBg^B@?-L+;8EH`n^qgc1#ru1NJpp}O zS2_=wZu%zsRa|Fi)2LyZK!Adlukm#1&)dLrd`s6xVz(-oN`uD4ny4I+rrGhs8Zcte z(u#saN0M{vN-Dp-1uPSx<-X?CLeuk;EAB>d$L??+zJD9r(OL!s56x@0Z0%O>v5{g} zj+e~)FxK7Qc9mQ8scXq6N_0i0d_hj%#-`*nb+xll*PX517sc_m!IbqmLG2w~ym%JM zft?+Rq1um7`J^;XNC$iFBg$4;O_fkA;q7?(Q@|)y%Vn|Q&!~A|*nfKZjSuOiCb6O@ zy4A;MFt}bJj-FM!i;7DvPRo38TKAyp`^1cbHMj}ACjlFXycW4v?Z8{l6Q<(Y*`H9V zfM2(SWAQnEWj{i!h_YF!mu`=&heU2~%1|&=uwJ~5-PI|`P5n%I9~BAfp0k_7wGO5; zOD2%&*lbM~7qO0~$`3L|$XGjA zJ6#k77)?5#vpqD`faOci*+-;lM*m?Xs^!rb6kk{j&Hh`O#xvY5`^uP}l0@b6zMF;6nVJe*N9d5Q|9UByO-NT zG<%C0S4K@&9W94@F^8#~LZ59M9n2>y>1Jm6Li!b~EFE$)Gt$$QC#{!ScFX&WTxTtc zm04jBR()KJ-xOu>)#hookt}+!er*F*v@lKR)YC=5{qf~M9)X|KMlb1rP9T(=!HuNuihxH%BG=)Ak(~ z7Y3w;B0Nn#UQT_(Dv;%Kdn}PhWX0(WdRO+26a-*JtcnBZpMwL|9cmUNzPK7HPKv|2ed zdfCc^X?Y&tKi_Ser#tb5vhi!2Ua6g4oh2=uBF}nWG)YEahQm9pJb0FQdY5{7w|I5; zIPCSz5Vvu)+bM<*{oY9;+2#IHR*c=b3UM#L+a;@UdcqKcUytSQgipT4H<@q;KOt=t zz3`_GY3?N^@fQrZl&Ji|dTOto#e28~j5A!LpF@;ma|;|O7uEOM272CFqOJOb1Vd!> zuHdOf|9F7F#EnZfPD`rsFxT%vOyVVA-IL}1#cOMRi{KzYbF$!yy4<&KUooZ$0$ zPsz0!ue*fL?xHV8q&a>MBwFhSb~Rf!h7Q|9B|lX?M4>&3-vVDQs(tUeZ^1+!OMPgB zE)8|K$v2-J&KVeYiL6J{@h%gjRPD=bF3~}mv*PT8lY;?5V>Z%^+A+aSMN7Eq+WhgN zZK%G{(cWRIXTO$&hU8f#YFz8A$6>peFu#Z$>nz*8GO#>d^sw&?)K4oR8bUpP8R-g1?!FaE9j=3u}1l&(Am3lU= z?T?%oynV9=6QPia#Io^vQ)tXv8n;HXQ`tA0IgZ2-aBR=Sp)%*@oTW4Kb6e5va17^+ z@bN}JdPB?LA4OkN2>w{@^v&mcU~h3k#FADhN?!F(<#wUZby!+tib5GU+n_6b=l9OS zRq(mo6Igtg?y!V{;j-!Ry?g63<9r@EttxQSIBCRvM>|9XcZCzoXM|Z`C zc8UZMSP}WTz~;bJQ2faS?BqWau-V)7R6t1uc8+6pU@may3QSr?iC{!QQIg4Oz|KwB zSeRS}TXuIh?Dfu`Y26poYwV)2G~P^L8(2g;itRF*KUn=Rwa`J-X_$eD$(rl zbZjnhR8)<&?JTh)EiGqO3~Zve&~i8GIO*I<#Xo*w_DOY|%$Gi}bF|-gq1{k12ST9t z?Xh*bj|$2>Yk5(%K+aR&D7;(2z1tf80olsCER{rD+%yq8%v4in_g^nzMu9UNR-F+QTAcBbKCaMm$^T6SKj$z%pCC zwL3X0mJ;s(eq(3*Z2@+MU*D!nOa~cH#iaA9@HvxGwrTA>m?xALx^)FSFW?mp+0CA< z#ApMJ0$yV7G&>-OhncMEIB~>vHF1&F&H1bblXi3I*lgDgH5R5)EC&0uHj;%0!X^k+ zgmYaR^bCDLlM|nHP@FdKDab?@$Cp`jui`=3yQ4T`3$N!G9mfkneMk3M4gv~Shfy*O zMOhp39*C$63VXj9w8?*23u^^PYaj&_Uiq4qtAp&cQtbDCE~hMx@Rh$xq0Di~`pv<# zS$0H*v2nnsP5vHNi`xn!6Q1l#Aag?>umxp&;4C*>= zeTozx_vTd9_aLKoW!4~Yy#-G$&4xxk|DaTZ1(@Q1`Y3nx^BhFh@CiC~nXZV3v}+65 zmJw4ND~KpPjEPQ}Qgy!xImW&KCO-@Si}`6H`m zp)aWF{V^zMjB;2{c?v05>R%)H|NZMfZ~E`o_1L_%?f$T-QLHG7++&8#Zfx}02Ja;- z%lnku<(UyZ^PagWc;}752#LL}%7zd6oHLhh3U!wKzD1RId3hq&j?HqcH2M7%VsHQ> z;-LV2+#RfeC2D}~p}wp0uqbmf4l{Cyc#E4egqXG9UE7vQaMuTzjvN1(;}uT}DosqA ztyD`T)*tg8$;FAYEeB0avTrZ>rVOqrUoR=S_463mi4|8lkjc057x3?G)}9vK9Ijzs zHKXOtf#`SxnToe<;2%9QutZetW_^tptunvERdHpTbDO~DmA&U3E#i<87G>Xod;3~U z#cFc&&Uhz}>+MkwkqwifqS5fZ`N#q8*HPd2gKTjB;ay6WH<=B)KaS$A1bRwB%RzMM zNERh37)akt)ne?_;qu!3`t2Do*3Jbl!>4$@8UG>@>=$k0m!?TLG zuLzK&oZh`R-~2|t&Kw7P+2#WOFe6zhGQRfJ#XXzR(0Ai5q8iI`kORwK-w2gJMOB|e?VXVjmeNPh?(4~)hRwyux^y-WAD){ZiCYamr=8%5-5nEfEi$VFX$utnVaWpCD=SoA! zTt+;nwFxP6kI4;cfF}WPQTlSl4P$s6Ls1?Ko%sVISF@(s;Ze3G57>Apd@y;}dn`Hn zwV^1*Gibhy^djVIcPqJS>Vs(wsFqXjNpHlw4UDHX9<2SUQG-`ymX(DjGG(Qgn}HQG z8ED47n$S4sgL$|!f4hkwPXI*&A0oT^>X0i^aC0rN)4Lz7z%TRW?IU}Usp0QPCGS>C z66NBEBXz>hVkXEBUEhe>B6Y@Stg+FFkfAc2_gRqKjHBv<%Z)Iv^5 zuhl2k!t*C(mmP+TLIvz_5HE=v!lm%-$)kXsggg%unbuA^kN~zAYk{{n;xmEr@5k7b z{&0p&WlWv7AF6&kGU%vc&UK#%#Rt>xfE8<`VmEhe^>D`x7W7Jc8vEtC} z3q?hBpd_vn58R%yxPrA_OZ9{Ax$Co)^mR=F&8ML8PbK$u!OwiZY+NTmR=j9{1-#H! zHWk2&To)3sTK6t{4yLz%>cyE?>$D>g-J`*W(>gT>XL1)52s6U>>Vci(2R5RCqv*TnZ!E z;^4*mp1;md0~NpO2EdDd(Nf2T7Y|kZXMr?^k4fz`J6 zKn7c?1zwyuzxRkm?A*pxUg%cbt@vXW@5|CNb;$vioedtk7oEXi1EoKB$%l4f*3CM5 zI&-VNeng(w83To`M%G%cd&xjy%QNstqQ7)ar31Y9XY-Az{v!3uSw}T(4w59@1kO!T zgW)x5*Mp>Y%xgst6;{M}{YhL9uJW!9w)Zre*E{yvtnYpD15On-HA~bx?eyC-;TS7j zduClP@E$he9h=*o=N$`9G6TEK#%TO6z#EN31)wYXofU=aF@`%MSx#%#UNZ{3CUS9X zME&ypQZF=cdsI*fB{ad4bK!$KFb8F{^i{n*H`!(n{wT`WxtKXKNsI@Zs>PsAzw8(( zabi>)U0E$tZqjUmDy~j4#ms&EK{r#?aW`wvEt>^NS4f~GOAD28R%}yojm?{Y&E(Za ze0ZE{Vi~ej`5*qtK_z_oMarIpZ$(hI}D)7e>7bqS+u)mc+Kw3+=>=Gk$KrO=U&&RWLo9= zVBv|E8^9IW+MLfzU+_Qy?>`FPF={@715YEtnUtD(I}yY6dH%ej<(G1F~CIIrwdg zb0%;mh-pUAM63l8cyzgIYSc~;ekdu7c|s5ezpC+f{Ouz=>g(h0XZTd2SI5q9pT$7G z^NdI84>xuI#yR6LqX^(-vJ6n!EG0wsBDE1diMCjWg*eJ zov1j|&S7_SJ3Llcr95|EQJV_>RKH8tdhitbdlC6n-!z%#STK?rFJePKx`ExZZgmSa zI!^fW0g5<>Y?BFFy-YA?@+J-hPW*4n1scI5?$b^afj3gqq$TZjK1(@WiCk6$bLP5m zod1Z`BOn6!$UjzIIXKlH5>ywDT7(BrGZ)6f8z^uNah*KCJ8zAfaC5?_UQ{;MeCK;_ z2W-Y~{8keNPeWW#GAbBnrs?moV5$%+`sxQ-+uKT**|ieEIJ}_`C3GwL3){bz?mlV*aUpA~arz*VHNbD_~}-`pB}_G-=ryN;y=NPeTHSSn=%uNjBsb4_X7 zyp0w3Vp6}M5Qe5#%IyqBhJr91OODqgw7%kR$H#gYF#@D2OeT_7ip$u-(yZ{ zMVP;MtQL4tAiY_06Oi>}rCGO&`kitzJd}3zj&i^=*|94)qb3FKta11akyHy}Fn}+P zbF{><*a#e7<;7DGdaP~T@QXWA0QZ)4qv-Z_Oi$dRx(MQqbSK3W`=bTGIO49|8Wte* zuK|r*P2{wM`dt;HXDH|tAR57Uy2E!Q5J6(K;wA+#?TrML8SKmy z5}e{L?Jxak&a{C%Uiy5{mRfR7X8D7`#C|1CehVLd>~q5*sHUV+edUF_72Xo9IBIm}4N|^qTxyS)qZs)lxlvP@l`h%yhNIW(_B16#plI z&l!1O4A(_+p2b1OGtx@Sza}k}1{rO(v7EKK$gTycJ4RJx+v@8eD9!#7L%-o~sZFajARTLkk;+)mMaC+pVARqoGhWM_Kte)$)2Vvb*&W!@cT(i{H$2v+) z65-?Cc)aWR*ZWAN<@}q^a~o>|I!+w0H6goosUW*Mo&$GsRW{9ml~__xLFg1Q56*u_+dQ1acMjfm%$z*4mEDiXQ+N`MEsow9ef2->$ctE9 z0r%;A&zgDkwW)X^2ba*~!{$??>mW8(DUWr;YMtr@H(v)C4YBL$gmk-LLiR)yW{H|{ zuXu0m+%4?r(D79rl@gHDB1i$rwI5zy<#ivj7MZ_nJ+T`EbFP=sE^6gDtMPUDOA&XW=9`dXd?IheC0bflaz(F7ab+zCZjQ~Fqc1-7#`hC~#~wwX9~ zsO>%3Fbz1jV5f!GzhW2qF>3x%uWYHfF!3r+n=oZsT<`>!4)@2D%F@96Ma@+xOSLiOdh!wxJ^FX9q|jc zMjUKLMBFqIEX!W(3keo_Fp?{|JEs?_`UEEs`44^;I0Za5k@4YM3`?mE#9t(6v`vhn z_Uu1DbPNtgi}mt7cYisQ0`#R9VXAzCFwSM$O^Cj$zON+kUK#qTU^lS$dpZYRE*}z% z-Hk=vm?;G__ftn8!%miI4#;z({aZ2*5Rh?Qsu`iddnCLsbW`Kdd53IvAZS-mslmGT z!z~{0Z&j{H7+t*Q32*oeEzZ6rHu2@!$t2SBE!Sa>3Xfr`I1^B0T65u@Z9kE)9^P+= zp8KM-n_L1Cy)$aIw&&Hd|aTzh6|%lHG$6@!RJzL zF~h^6VYeV3p@BGQj83#lq-vgYTAfEmn1Zt7c&tYj@UDnKE!#GrYn`m?+%4CXO;;VW zAtT~|wNO7dXA&NYM~<1Gij~b>{7R!36uilO%{cv$1_1mNJB**I>}T-hTn)X17hGgh zD&M!&|F99gf_rYd@W4^b2+HT0G-@N{od|EYL8{`VG9T->N@Gw)lQ|>?=)t7Ui-7G! z$f|H+OD{@`Vb@8+wt*+1XfWr@XJy08O6e9-(FijrG^DzXO|PD#&*WJljfX2b2s*=R zE||}6g?%Q~6k1EL953To-1HFAB^__h>Lihn&Xpb13@a@_BM$3H(ROzuH$K~fXSvx* z{Hwre){$nt>@~2$q{g)N7(#S&-gRN|05QGhkHS=Z@Z<5ZBXVTv6d=m2Z(O5iT|6n1wpNl9(P0Ui zOQ!T;TAaQh=NVqE+9M7-E_m(G_Q@*t<5t9ombLYN1BmisI*30Nv}V!_o%m02InNv=J0byWbSGB11<&wML>+UDr z|E^@`Td5KyO~OCGE4^;J9Ic01wxqPS*$Xtazhq;#EImu)2?N`z5KNs#Z^ZTcO~^I* zLHr{_dH#;0kOCxvdpioPM-97L&+bdrx@gQC7kc};01R`q!|Q!VI{QbLm`H@X#keW0 zx(u@)iv8OIWvp!^;0kgcnQ-GfS~e>?8?;OVlY-zrlF)x+yHQi^YeHW zFrT2-3G2wMj5H5(tix5MeQI7eDrK!y(0F6Hc+ixP?91)r%1#M2u?0V4hzHt%0{uBKgr zVXd~)W>ZzYax1zQm9Zgz+(w@R7YaBAw6WV$#@BU=Tk zAD-g3T(zCtpyNzWPKcDU@_L7$zTUCnbBb zG@7mrY$(43Jq<1$S2*T|M)BqMDcfDk0I^_~$?WKP`6f&L*D7;y7VQ_D! zqWAvA!Ko(`F?<3lqRVIa?1TZcq7UW?xMkGBfBU+sCyggP{7F@&(ZP3t2v!zTIE72-0`U^;_|GQA(n*_alDS>H^_u*DJ&6?2B=%q?+Q?{nKzeAoeH6j|jH~ z(e;yaSG<514_%c#TJa9f zbBUGQ9728lb6~35Mhj!X@h#g-0D&$ESSx_JTWJKGQ|aT;z}pM}!&!!%RGMlGtVXUG zD<7XAo&Cl#BMUUG89A<6Q8wk&8wkpG%$+B_mn8psiu*qZjj@q|uXZ1B(xCs(SpY^K z!Eujo*V6`1o*(f7A}YE*=dHm80Wb>YfAD!1k`*BRkWQO;9X*y7Dd4IO3M*& zNa-g)Mhn;Lo}R^SmJMo-9Ug+*?`}!l&t;~@ePjNCrtov?V_LR{&;fiQaLJc9$vCNX zk=rRc9>-Kv;3DFqsk2Y?b8BGs$RKJpapb%H;UJS=#9a)+odMP#jj~Ek%@r%^AnS1x zCA{@O0Rr=_A_X8vqtg;)6%$P_OZi`3D2xUi{#D?KcIx%BDUiV-jiO4eU`Lh=qTw(a zTYTxeSAVIQGwza4d4(7HNn)7>UL1P^a8cMBf-(TS_{OlO3a-2b)R&!bIha<5dib5i zY8$0T4X+wNkk(3i|NQx9!CGrOZgT_!OF;mlApfN~WSgOA3Pa6qMcQCSdoxA*Exp;uuM^3&xJd(S2I| z3NPHKMYy5_cuI+U1hfCaU~XiweJqc0BlFf&{xBW?I&9fK!Kra$l&H8rPNxEt3Q&`v zW*pfaM8I&&<%r3c4GZcmRKV~+#>tJz5MgS}7r$l;W+#(AkH0tZ7AzjyQ2lnS~-G_q>&P(cUD(Bac7cmZ-r*uU#ttf2PwIJ=A!B zkV$Mk%J{BA>@SRW&N?r#p*UhNKLn3Z7fHcCPODEeJd7kneKZl387kCYu?MdT!mT3a z`I3`UW`oO!gGIrha@9dUqLC3HdM4{gev-m{=+N*m74 zgzN{Nx+kv#s#$CWvU?`N%0fLURA+qOcXx^D|J}XWbq7#b(RC8y&wv*s2_>4YvMqfoTL*-$=6Cr4v|jv1C$jA zy25AZH&OiUD=#gLK-$8T>*JgtkAVo_L6z5@YL~WvtQgkGSs+CO%gm|&uYvBR$tP-dbKg8;e14% z+#N6Ac2b3pudzKa8ZhCq``al1dj_aV4r-}kk9mxt8fHFI19<}5@BUx2pF1T;(NkRI z#7@=AyIQ{H)d;+XN`ABt{j^#6y%Cc7Xkgu!=uQIUt#2wg4eDQDC)V9lroO+NrxCCL zIXP!+>?@&nk3)~o%Bj)0c>pznd=y6}5|$(SXU*g9!pGmuzpEVoU3>Uv+2rq{MQ^eb z#OTt6ET?wg^irvDgqRa8s}eCnE%)Kvcxw~;o;sb=bHvo z_ljaRBZAlB`?t>3tmoz9k%O@>XBOPOgeiGUYEm-@tFAs%BXg-LM-u|)tcn{Ozj9!a z*my*Gp#)>M^Rzekc@KV`hDdE)-j_OpK1@G*K}f{0EmD-BTV)lFJ$sjp9IA6uQ$1ZS zcxF~6pP~!zg02z)d3ZMVi&W#QKSjwgktWQI`wk9ljjG`>=NVlCaw4wa#UPQemCoW2 z0e~^$M;J=lN2eIH#{qBtBNRA>)#UjgP+L@lkUAnQS%47I9W)7&sIbq4YDE07{j0nZ zM33&0Ow%RPdwzKdeFCP^vC5Y<=Hn-7TH^ZhVymL`=D2qj0vv&Zk(XAHs+KSd{$BtO BecAv3 diff --git a/docs/reST/tutorials/assets/premultiplied_alpha_composition.webp b/docs/reST/tutorials/assets/premultiplied_alpha_composition.webp new file mode 100644 index 0000000000000000000000000000000000000000..e39db1a4b93d2a1f0a335dc1abb648f96c2c487f GIT binary patch literal 4524 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 K{`=g%diCn*kGKK= literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/straight_alpha_composition.png b/docs/reST/tutorials/assets/straight_alpha_composition.png deleted file mode 100644 index 35d416b185c72b8952a5c05463766357bae9c3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10119 zcmb7qWmFtZyDcOH2<{#rXb2MACAbB*;1=B7A;D#Ukf1>ZcLs;SEifUtySwWQ4tMf? z@AtjutaH~r>;9N$s%v#ubyaumXYXAdrK&88iAIKofPjE0FDIprfPlybFaJhGhDY-C z3Uhcxn2n^Qs=TBmwX>^}rH#D>0>YbwfCLe_9#w)c6^#P*w^*KE*T3cn>f#W(BxFhIw8WYK=S0Qm1UzY_9uywew39+0GRwWG3MfUtOYl_&S zv?P?I&w3sAwp8XuV%Z|>g2<|V+9cEOoH#ssULpCQPA1_ep1Pc5C;+*%xJv@y8B2gq zDj4r~O&ces#Fl2D#qP?IjYarv1LY}XrItr=Lc>x04c2AHEDS<|Gy7s*Y2i_{;RyC} zH3%702kKaUwk;~}06qC zTsNyYU3R1aH#K$ks$QsVTm5{6T}863VVQQ2!x1Ru*wb$!soA3}DWZAOmawikvM$mU zS4z5$+Upn6OOD30Pn>C=j(4tPP2_$J(tY`m8ai^|v+eUO!>zsXLgd6>bVXn%AhD)~ zGYMHcE1*`qjc5+=!>`Z~9PeBiJ5$rkluee5rwrA2cLQ1|@FD- zI>n=nF?C;ez&s-@D8G0y>$nUdmW?kd;%%|8W>P~q9N|&weZO)Bx z-9^`fBLX5q%;*?!(RbIX$P`~>h+`+(3{&L!9KC^U^l<+C29u7)1N}QTpR9^>UJYa8 z_|j5qH#aw`dcBIl_Cwde%h8^X71QEG5ejcai~E%JHX4}r#2giXPm1aqlP`Gads1xb zIUS}y#A#A)50vI1JwxOc%#3So6?VLV9l2Jc?Y+}`py(>K0tY;>>h1aYYB{z)82=g? zk}jIa=^q^2{BhuzUsWZ?_EG#N_p98_#Hi^`OF6aI=uWLfF}=Yul`|UZg0`nH?N|OY z{nVuEbs*!UsBg)&CY!~07|72B^Ty=%iq+a|e}8GypS$kk6R-*mpHGfyIuiy^Lf*324x92(_>DBb`h~3_ws2C)5 z7WR(IO(E6mk@KZ7^r`ALzTne!R_DAcqk?zk;743mo7&N$FLrS~aoT0l6ASn)cX_=4 z(jZoI#>HQ!YX#h{j2An*FIxg3`2s;Em%TxqA5S%4?LoB}nD9$4J`-RkxdR#mbN7@I z78(NNW*@ktVN#)%zp5mE#xVNQ!-AO*2x40)+>r0L!d75F0^rtngQL4S=F5xLVo<3W z1a<@w1@=8?>Sz@#0Wt+WpQZCTDu4qn`jkG9^Hrt?{cbtuZRiu7}954YxP=_TV_M)H4J$g-#w9ms7`fRg> z+v4l}egbcY8)kkM!v#OdU{@8(-`CZef|&uXuQA=n_F>`57N?OKoMij^{9cD2htt`= zTre1nZfSTf^TX>@@_I}5=I}=z<60b>SV7(n%it(@DHa0sDODMfsSGWnyP`#?`8eFJ z0$d9Zvd!}!v@9)^uR#<6l zf2X0i&BhLGzKD-x)VAJ53^|X3)vD`K(dxWoAlVbQaw8WCFK|ALrv>=_@MxR!frutC z;b)f$4sM zl&zwoI`MH@(hIyg#LK##dIyGulcTg-Gg&oSV-C6t5{}@M7EQ**t^euo*`-{aay@HX zG`Ozm>U@8nmm%&X`ySWn5VFmHtz)1r9bkxWT~6V_NSsqLQCREVUn>mV#5Wvo^IFjz zxc5on@VWn}+L>juS;7c}|K*SGZGQ1PiApyU9eu4=>MmHV513_@VTh+%upxgB9m|6s zP!Q2#Q!2irYQ3UN7QJHeTD+|Qm#m&~y9{q#r26)|XAnl<75Z!R#m5#TV#OqogN#OP z?qCj7kOmKm5T*?XgRqR;QxMXA_OamzP2~h}#pa~~SXhaTtlq2IM}JqUuAsgzaQJtF z_@p9ran0>X1QXeXNux!x{xkc{ymBL)~< zkQ)C83G%=d`+U$Y2&5l*dfE7{v&^a7a?fqVbN=xHC=xtC+_{Bbb=hQ9;x2eIv|a>0 zijx+;x(7PnJabvNA4eYmANN&0cOGzPyy*Kqg9ke)AWrVxch;uZr^|pe2Atm*QQkF1 zm<6pgxTzeHWKaCiRcJri+v=ILB{PhRnpgj7dU#HXw=)4ODa?j-I9Ggpq~Tk-_W-r~ zBBo<4cK4~UxLhr`p*~*1!n{4axLVz9M}8YMp?N8OzPVtFsc`At$hr$6(XTBnckj!s zkbQc{VdL8ICU6&yC5I2v!HZ>Ib9rKfE$YF4ZqaAbUw6qtpE*+*KIwnv9--ZLsGdc? znQrZ|L-$^+8c5}P%^^B_ADH4mtEljXi8Z#q$vhEuEM%u~7o;J8Kfwk~dGDbAdAT%E?JMceT zYyys4$-GJTCl8zoo1VS1qSC1hNPz@F(LrsGeU826<2M%I07TU&atA~vpTxb`q{_AO z;@xjDj!QKH43_;Qyk=74N0qEW^h8mJB}#-zUCyRhAYN?Eb=IF=1{Vs6oLQwNF#dJH zoyF?whoeSu>qH#n5CuuY=dULu2o@Tnv<(NZ%jKoIUo&VPTFrnmmy&PhqjdxW+^)x_ zD*zO_^ORu#mV(>evC!Je{5tOGi>Da;GXM+I+LG6F-*~w~QLSQW>IZ|;(zu^X4fcC@ z%X)W?EJeJ3G3&wZ~clJ_2HX|_ucRu|q|7owH zlW1m;>eKmrx}hLmB|1Dc{VMGch2)Q+G(AQO?xznP&Minu@kO(?FpjUnHlR1ZhJTyg z(sO}r*Jj4|#WtZj?^eH1J>-A)&UYPGCKXF2bSf8Z(-$V09WE@vW37+h7br+aN?dM` zJ%ZS>7AON zTj!pSDrN+&`S2gS+pb~m5T8q}nH;>?W{;2o$b5SA5;sz>oIndbgJo3mvDTU0 zRm;xMU}ZZgpnrQKRk*uzq_$vDhOJl}WKU5_rDIB{HvZ_6Sb+*!tys$c)lc|iyR`aU zP+`75%ao|K9k8__huBWv7JH!>rtj;l{inuUV#u=48kLEZF z;}~t@LFsyxXbqI>v^~2q!CuWX0Q$GLYSU>1?>w@htkP;bdlhyiR@NQ0X1u`HYwEX- z-=eGwf`ld!`9(!=D<yZ1>lr4N`pPq=+UEaD|opSO^9>)*1KN8u#>P)sO?4NxZ z%>Mq@QD#CmHL8RlbvHd~Flq|*e+e`Oa60^-5b69fnEJ19sSMWC%BsafGF{CsEtP_w zC0F_eHTbU<{y&=e)0VU6n3GcttfAio+p?UL6FK-#Yk&3mPj`Qn{@mUF(m}Tkr#(z? zF|Y+Alo|tR%@%Y2Y@uELSh`Y`+Z=Pdrq^3Z2Nwf4x4r$rAROW(-%^9LW-pl%7yCQ? z6ln@&Wpx*YFK0sP44I2#GcfGERJ=Gbzn$`M0yM>(ub+-Ev@Ra37b18bVFbv5iU68X z^2YfF% z8t0#wOIj9%)zql5IZZT@==-w+kvs#g$`{7N|R(LbZ z*w$G!cfg*)+DG^%agI&yXVTjbx9rEwhSunhFT9`%oE}Of?u?+(Vzd|dPwBKR$v7b2 zZ^^1y8Pf4cy1BdQ_+i8&Zwd9`vJr*Gs>OyS1$8d4Q4Di97^-(RTreCXu9T< z1;aNCTIo-6cE1Kw(-cd*pR{WLnVHx_%PBUt;OO7j$3HF4O(XIl3rcJ-`v=0fng~>F zVTp7L(JoqY7m|!s4^O5t#!s7oBAb(uv*Y-$eqCnm#eP%~IW))Z394MftT9!)`e#xj zYr#ze*JeG!bv30-@WBKlGdW-82}McWCl2X#r&ii`aUR-)Ny34e!~XeUUJMq(xdu4yX7MJj%yG8n+Pg_fHL30RjItco5a z9e79vdskzKed-Vu4!wBDq{em^8ku;{qZz*G)YVUL04tuDLYtkeydZWwsx5c&4DbA7 z9GsRSd$M73B+@+<*4*Kt3x;3TK4E667`X@#+2JC8C#>(`hp%28G!Al!RDoX!&z9tJ4|+#11dL^n)L?c*f=4>*GhopG$GyU6h9CyJF4qq`%flP?-`?G}~~nri?k)VT0rU5dP6%Z5NivGD)0)J zxRFBo8EOr2))WXyn|bfsZNruCN#U-H+3sb>`kS`2wgabL+siz)?CpuWex@J2k-AQ5 z+-s(umBs}6sV7=Hgw99z9Hb2#1WJBUYg{_txDMaCk2PQK%{;DXxUOB1idww_or3cr zEe}nJ2F^mZM>R0iGEdUp9hOeQx3T)##%6qz>H((?GDEu3rZ>Pbi#S?}#2J>CAt)Bh ztv>tMkNrvK(VNguA>=+HX`{yXFefaZO<5cydBPXsI8tDwzr&is3;60iy&iJ)L=yiR z$&6cM$1$Np#AD_``#1VQ-;DvzNJehxB@5fWjJO&OcGG7SC~=~v9m{><_&z9D#0X)m z9dHSQn7(>KiMD#gH0(ErKL%fWcncC_Vr9i6B*A`H9TWM*vyex?{`SLWu@JuAJYC(_ zy>M?&9+B!{c~5`N7ILjAcFXNNP5WEoMPIR@F}zXYURGJ0P(&gZ=|#J05{XZ{J(?#z zSsCjC-}UA%3&K9Al)HVS0?r=GNXPVNNRptFN%!VdcIGV6bE)AVOa7b^aJn?B*&HkW z2=C20Ai(N1zLL6%@IeM!Zu-yTzQVb#IH*{z`@Yk!-%MMl?R+*akH?8w^#n+`pgKnj zw&lJMYfUE!#dH825$BRiP49;qUltMmcA*yXmYU4Mk#;2y)rf{wAP3Ph#&H2teKRh6 zYVW>O6@He}?AqYd5Zptl)2vjswfR0MQ8)&a>~F2`et!1qy-GvsUWJFU)1jlm7aFoA zk|4Plaq`!*+A5kI!Tu`7N@s%nAY*xUiNx8Q-1Q}`CCFqKFvIa_Gv}iGucpp8DF`i&7n}Cmbec7c z=F;lw)xsZA!$X3)O@-fDiAYCQ#Eu%X7@1R1+Zn*!9T`Fj*q9Usjb1RjwR&&YvUsLU z??wDcb^?!+IL;a#{Ehh&NXomX&gw7wcNOh2K3PEPMB3;RuS5)T+z?23{a!hC2qV#< z;<>;xy2)5SPQIAzv~k=L-3B$P%_|olrHg76-!G=MGp20%0A|%x_AocD7jAQAXhoHM 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 diff --git a/docs/reST/tutorials/assets/straight_alpha_composition.webp b/docs/reST/tutorials/assets/straight_alpha_composition.webp new file mode 100644 index 0000000000000000000000000000000000000000..62f57ac6f9a2dd70b0410374286b96738711b50b GIT binary patch literal 4270 zcmV;f5K-?^Nk&Gd5C8yIMM6+kP&iDP5C8x#EkQB>71@6Ff0g5=|3)vF8B>NZ-<6q} zd5&jnFEcYUhB-#nS(TZYnQ61W%sIdB_x#S8iO+}I4VUEM`)q*xtZo|cJVr5+TO5sS5ZM$uok3z6_ zkOVs^(oPnW{V$=1&7A^3NxN;!kfawGS#8^_w)|mJhfxfEZT?7!Tm)022UA3?Ris09HwSN{aCTR=5$sz}(#2s{n{@ z05BOqJ&i*&`#Q;fK+2f-z+I+deDGw&@Hjwx@QYPDKKRMUS=jqv{zkMM=S2wx;D!WWT^@KqEed=;<= zUwJITSB{DBjeFC!IM>Yn`vp8_n%Ox8T_>xKnDMExfl20C&{wlyT zd^5fJ;6@F+q@KooBTR$Tz%KF0vj{yJev0E(2vICBZ@MX7SL`o*2yvtZI8}kLH-3eT zU!wU8tvCAb>LnK|nZ=^eJM$Bj7A(|(>RMYpc{o*{k@Kd58z0~td~22HW*}*Qrsms4 zx9bM?UuLVS#5ZOMUd@~yf6rr3rJF@MP+e2wD1eKju) z$9IH_1wC4fL|(64>63Tb^T`Kg;*}d=-%F{>Y7}q?tP3xvk?gvx(q{QH%Oy{C{y86~ zwbf}uc02cdRV_JRulWt;pp8&~#Fqllb$Jt9=-wBGOSS~LrG^sg5?jC>LzjKP3r<$; zgFLQ8Uabfz^yHnsXQA!?)AkFI;(aSQSN156Q@|l!TGI=e{PKk|ddREK&pxwUvca5Y zd9eFAi0=y(>!wXE8Xoh`-=tRYUjWaSvdaJxw>MPSV@tp}m|!t^AI&tB7)Y@VQK~>G zCCN`(!jsQWz=|YGxh2HcG6`SJ?Q#C+ZKuiiXJ@CTW~Vl@Q=XHrOAX@t;3MvB^?7zoa15AuTB-myp~u%yUx8=)s|kqD7*oFRPNoNX_2%)!Di^i!CR#aX)%M z=tVS^QrG)A^yBm$7u9v$<4B2jyx`92dcTx-hb>;$Q`{-KuCwbY;`fEoZ-}nj+{`-_ zm5kfnPuFc0j4(*5qCY?BChn!2L5sze*gQRvoyx?_`OaGL)#qLF*dIqdfw>cTq&V(4 zNk3_WsGr-dzu;t%J6n!>=uj53MS7>6IvkR_pulpT*O8C`mn_8?Wg19$q2j*gCxsT_ zb;g|Wu?OLydNAujLyu=U9MX@new=5~`1ATX91iI&!R@x?KrcAie$sYUPxuoqZ6BiR zdX5^Y1m{-nyALbFm%J;A&7_4FD9xReaSAPlD6Z_CuVbqlIA0#={GN<8_(=LdNt-Ib zCD>R}Iy}cQY-)MJD+nUQfnP>Q>! z&go0$gCq}h3-G>$vOchob7j`KYibw5Hwrj->3|p}7GczqL(v|`isl%k4}-Zw$o1(Cz-lGBfQktzY(T zCw+*dEfi8x?T|mnlM5w>!{$u|WRl-nN>5E?U$YN#y2TIN9!t8*BzL9bys@?2pT!=! zXP&G&=cDnuLsfjWH1(1TnyOZbI1h-qPvjNwfPEg0hsr0nip7s>#Mjr2n>pX{2=C`l zJc_y9HeJ_yIvftS0?JbjE2?t-fM=o#sVcdY*{pV@!>vN7vYRT&Q>;~VwuMks+UEPz zg#Xdp97vjHN%^}gq$r2rk9^DF3(d1?{2eQTaRYz|I{kP7fJnzkjo;VqxY@2w+_~ zbdk3eng7pgV-b~wp=d)@sik~|tjfMHJCTRrs5Z>KOsFy4QWcw-1{m5RuAykMw#=hs zG-n#q{3ey5DX9=}LYHeETD;;jWIhEFjYB#yA@sR*9gAQb*_yc;$~vMsiM&KSlOI6B z$_08uS>MF855W<29CPuf+&E-Z^XO93Qy-tAjZx9(>~?#RWEhOYP*v@L(9fL9U%W%(adx#nvAAVWHbw5<2cLi zQ#2Eg67fu_XpSX_mYNPT6ZJdUK2F=-sFNQbh@6!M`OgZXa)EwFoS`XABqRzAZ80I^ zh`p$)M`obD+eky<6uHz0g(z9}z%8UGr?-G`-hSE?jKlQQK^@ z-&jT?%lgOuvjQ1MiFmr2OK6Wvn4$0yMD2{!Cuti&)ISMDX%^F%Rytg0%RKj5s=jR* zNwjf2+ad%EzXnc^fknE`KW@ z824JOOOnv$TU%#b3p$qeN9)n%UghPE&Asz;II4x|oYdQIQnH02Py~XQVh~$G;;0wV zA*+VssEc|r*#iN=WkcBJb=(Zs-cqzu?PzHG1Xu zoj{?8DFVrWB_#QJ(ePcCjV97)f~aq9I)XwGQv{L&M#NDs@=u2f=R$GyY)h9$^X2_} zfI<;d1cKON5GWyW)QgCm(S4|JCCxR~Z&Lkn@Zq3P1d2et>@K7}1WHKq^&&wu6iG*o zV|q-PP*X0@N#!E#kfD;=j#(fH-#h^nieM3_Xfj^kwj>Et3<4!2`FfG7)9FdkCo|JzQF|UQH5#G7&Pi2!1< zE5Gj~0_{C;Y~I<4{BJ~ONaRMMP4HG6ND%e8pgREX(E%e8fie*s+t)5402xUXMcf|y z$4M!)6$f$59sumoL90n3P$q&5b@>d`S6-K|Mc}5suu^C%4$G%#b$Dl@{)VasfIT{B zHAw{8dm#7nW77>)?W{Bi7xUTgrgz@ln732+&9!F*ZN*_Vw5)=0WT7eRB>?v5;MJtn zyrA6&`76<@E%VsFcSFktN8fMDJd>(;VpM1CVu_#s#(D>v#xx?blI(W!E+;Na5wnT4 zgOznQ|KOiqR+b07aaNY80L%?5X$+1;|EOx0C;V|z%ldPnIMbMF9mr6LH!aGPbr5%0 zBf9h+THm$;l7HE!6>}BKJm=>Vl?k=o*`wg&K^PZ)jN&jT=d{{2#%jEN$aID}K0!>&cMlWQXv*?&&^#*7tC+i5G0+x$?|gZG zsc8Phbj**XauU|{b9V1G%ss~2$g-_xTW+n11W|u_3=t)EmpBSC(~n<1lbV?JC#A;^ zW<;+lZZ01fX>jDi9A*ljT=cKQ`Rw^;Z0IR z<_D7SaZ#CMXiC;U{byA@!oJMq3C59m%*$eO%Y<62XvBU|r0Zu^8f47diGEVYF(>WA z`$3!eI|}B{K(xS}L*_Zr+>OH__Cqw-_!!ht(dS0`O-iy7j88xvt(fa@-W4mwX?DBa zD?b(M_jY?aI7^keq7G>PVP|47*kaK!eMMzLP045$bpEhqB(1ue*6=pe<-{`;D;$DRMjJJLWuPuUdQYKW?~Um zEb^O_`*#T>;ifSaPSnyo_*5(eTQ8CW+JC@IEFx^GR+(^NM(SJHmk3^9N9)K<#bRt@ zk74UYazOhJn2AMbvB+y*mI!qIXc491KPxU?p3L0PqOAl`ABJLAUW1>tbvD1im$W}} zSk0@@8JQYwbMO3Em@D9brW|mMV+hR08fzD$lP~Y>E9yE@1m|F}7uJFEuQc@z%%y_Y zI0mr!SkBprToBEsTk2lp$TX(*NhTsV2Mbh**!fqQ3O41yYaHV%9bH7R4K16W5S0zJ zV`vrT3?9z70#zb*{*{(OS^?lSjsY+qOB~Tf(L{!>AZeTRd*LlWpi1<$DAH7gD`AEw z;=924SZnN`%v{Q&x{F#fcap#vSD;GNa}j;iNvo zkfUh+m9j7LDU_vDM-_+KVGvabD2XI}0J9uN(le4b_kd>8nQ-HIr zq{TDN{?_FIL|Hq;o%@)k$m;nz!2vD>b- zGWB8KYT$*=hl=isu3M+~&Xt)zletL82G&9dq%d@Uoc!6vjon}Q`=9@nf7!qCR8`e~ z{`J57Prvs6`Od4~_}C|(dG47TS0-bQ0Um7=>bg}W1^4@XLp+mAXxBaXiV>A{Z zuc|KT8{;5a*2St`r~NEwEk>D9wDrz~i>uSBcu@au|MmZ1#~bgz@#=5=?r;3|AO6n& z=70F_|M{=}v-e+r^EZC|zr1z#Ug@I|>wPdpJ~V^8mt{%Wlyy@%f}xm^l5kkzf<^;e&fCsW&#ZfAqyK+_?4eYSsQf|K0!NKmXT%^WXjJ zfAPQi`CobGtqc)d3|v_tIB0!>G0^@)>e;=JpIfw%naD8m#-Wj9WZ0HTD2x@ zUfD5e@2%JFy#Bqn@4bI#d0PIT|BwIsXI{8ondBb_tHxQ& zfF%wHqLlR~YHZ%`oh?_1%L8eex<^Nkt59=l$Y5(Sy^wAtn)>qhpT4m--85u+gWM*mh%~jI&*!87NR*&lR4XW_XhNNl=X9n9t@su-D?zxt0ZT-ty7>6?$w&M;p&K~yRw zutFqwPnMZgqQs^y;aF8{nhHTxkB?_(XJ>hy6R^9zwY|MPpP#PRYh#RILqU=>dGf^! zGl$m0FcB?Q%NXNqHtUZ^P1}++P2IM>CZoM9cg~>+XR{MxZJOrMqen$u8Dlm!#^cdo zbviS~n1qJIp&(dh!yE<7GM}FrV-~A9n1sf1mR!)g&@6=SsQ+o~ke!Js!uCtdeh=V?Dp)+cAGn&|cF+aQuVU-g@VQ+l%#TRhK5A&CT&M&)&Fr zVXxQgt58|i%XLMtAw}>++j_{jFdBkN>Hz=fC(%Kf_iZ9i2{hHX0uj9+orF zV3@3uL=I#Ltd@-9L{(#qAq30Du`$GnP3xlc-fv8&r}LBAw>uZM09h|qZQcI#Pk!l( zU;N_huYLcwe(yiC)yvl|?(J?53Ddfs)O8Qa3}#kDRe{Fs&5d53#^@)Tqbt`gUA=zk z;PCYE!xJLo>n1n&g`fRWYMu9Qiw=|!kU$@UB3@Xd`s(9J)LY%`jZR$*A~mQun{&v#1J&b*lI5w92_1-#M+0V zsLp1^VqV3-{oXi6olZAH)EJ{8)^)jBEhDt?rBa|E^|~^gA04lc&x-l7S*)wJ4MkCu z#Y%#gw)R!Qq=ukI+%Rpj(DcJuGMo3;C&T4@RL+N``9GutB3KI|D3;FL9wdWjpLN5j zhqLLhYCRcP=WLqPbzLmiv(r-_MG3~RwKjEbI2bvb5SiX!v|6s)DBg$ldNmjfqYvwH zWvuBB^6jmSt)0zlH=n+7|`0ee)!&p7j`#)>6d?D z>%#Q@gS(F(K1_@y(Wa_LgP~)SCN57im1vBEvQ3;1p$VR>saqcb7&TE@+r*9l0|wAb&~ZMCY4K-jx< znUm!8*WdlxU;g!*ue`Otv)@bepZd}ldxO;VEQqSInjM~GE;pPwmrh0_%g))1jmxuM z5FzHK^)S}QNK8HkV@=&QUZOZ{LY1dkhQxSRtm1Ost_x|@M5Q)*VkL?(6szUwVs=th ztFkF-YKpX8ZPvw8%~@|5GqfBUxklb6nOm&N^lYvnN(hFOSxMq# znE6m%y0$%-P8y-b(V|(FP8nXWUcT~EU;K&v%e%)%2g}(!Ptw#n2j+f1gtn@smrvWa zO`HQjhU>b{2K`l06;<7MPsYv`b1{@9iFn=|Z};-S!-tO}hxKv}q4|9A+FNg2+rQ#{ zvoRiM+&nrt13Mp>VjH76%RaV7Od}ycU7DBP7mHQ1ZYJq??N+JbU;S_XS(E5P=AWA<(E48J++; zo6Whgl=syI0ZqqyFFc?1ImujpeD=7k=Jy{RCP{Mj;)N{BE?>T!W?9}Fuse*c-<)jB zPEMEeMV2Mb*xA|In7!d>Qa3(G2pS@(O;Yu7k_|Xu(BLZWH z+4j=jvWnI*TNT5K=*#x!n$LV|+GS zjgC)_j!xRDUauA^F;6M)*-JZ@P0utE7PFewLRgwO?hRi4J0HLD)MeOsc=)(jEDf=U z1d+*j?3miR2B4|{M8qXY8)6%ToN1eet!Y94QC&CAxl8+3=O?Sv=1$Z4d9`rP5>Xp` z8-1jZI*OrY);zVPZ&H`Eu>}AkA40XBkGD75)!GB0YKwL2YnqOC%R#-reKD%o{;*!j z*`j{)wfByXPm9G0!1WtfFYNAI-oLOh8Zo0sq6`5lA3}^m#MZJRf(Sdb%M`Xou5b!?a! zO5$TQhKUeDAR^|(+GJgCCn8D7oS zF8XnnnCZs2*IO)RZPh2 z%hV-?*|Cx6TVH3rfiXr^t+f)tY@JI?N=4JQ5^a)}ZL=&?n?FrLg8Wm%NV zS(#_!`FwHX`U_XDJy$gR_A77w?GjH=bJxx>==`wz4h$P&;HO$&)vGw z&kS4VLsYU+R0PTlLooq?tz`;m8?D!2y{4j+)A^#PtFkOZXnm*!KJTT8>zl+8vCVBZ zOiX5yoX!$)8EisIFkpeIDjTv;?eHLo03xCoc(rVnX?@n#>VT$!C6_vvyK1%WTXXI5 zb%82jHqU1B!}mVC8)NMCde7W^YBHQoMx%POna|hF*oP2S%d@Izl2L!MF|tYGqlPxt zr8i(zy>MZV8EU1i8}Wfe6Pt8+keP^CqYx318e_nOCPJBQ0&uf#L*cJI{ZtH?FINu^ z9<`wj5_^Ne;o;%>$}({M@X`J4$<}mZv{)`lE!4-%EP_ln`Y`EWqaTS6502XghMWES zK*bbg>szgh5E|lWc6Tma-nsPF+aG@I*T3=FJ8v~>Af~_wNCEC*tBvi^e0}`QcfS3- zcRv3kFaD!{@bkUgf+<8vl7td&)SJvP2>`AAYF382T`gp}(38_e9UC7iVj+aQXM6qe z#^xmJr@dZg5-=mlxsir4lV=t&C`6(+oETzJ5fKYx&f{Da5CONI7R%DDij|d2D{Md^xZf))`8f?(XlP&xID{>5AHz80*-ihV#kTvSCo_95X{m*{D)f6`-wKH3DaY z_eEV)P1&P9i?N!rLm8Hhug{jJHP!hjwT=hMxCZSz?48N7l5T2?+($EbDgeedP`gmu<^Ui&ok?lr}*xPbQ;{ zUOyR+N0Y5lk{M%B)vM69Rk2T*!Da2|hqL1} zUs)HMplnRydV_vZRhEKOW<1I@V%Qt)O!pXMj9Dy>9v`3i_AO)F3(uKBZ?Jc9ON{zZ z#?W)g)Z~(+DX~499W57yrG#SmWB6->;M;A7(RJE+?;$(ItCJLJ2Mn6eR>Zta$N{FE?50>k4=9~+a4?$LSS^By+ z83btA#-^5XQTr#~4MGR0RkS zQ4&>v$WYbPRa2XkFJ9b#?y2WVdq?woE=@{b1!+9BR>_fN(>-`SJ3G^eC{ottdcE}C zhv1We8ye=+Wm#{rTr{O$&1zJKPQSwYM3!QJvuo(D2tVE%5_=RNqds6WDo%XL|F+0QYKi4 zf&gYH0ZK$o8y4&0s3_}xuO$kg#JP336oNBaq*Pa<7=t2aF3;0JKWju}xi~#Moxk$N z8&T!v^=pQCV>62~G%nZ@K^vQ9v)OV!TUVt=#Hc^KdhPPwmFc`Z3r%a)Ix;CI(UP@B zBA_sAlmId!k|bHvwxut~YM!|H@odBF)RivQ^GC;zA3VG*&Li`^ev+_(dSx|^nyRv( zv(v^oSC&QA%UwS=P6N?uS&3l~4WIsNQ+U-`fL<~z{CKm4P=eEE|vUcb4=DFVf~ z6kgl2hs&yvRU3+kD%7bpY2tS`N0aSIZ=CJyY&LCGtQPBHS+Ca1#cX+YeDL^T<`RN3 zn<|kLI>u9DBBLZARtgFLuuugIm;izbfS^)^wl%aUTTkRwhS{L;tQLtgsY#BHkFB*t zFqSNtEbDn`z4ukUIygC%*I#R6+t1QLzgN^n=?hq*XzM1<&Q>Q!XR$`HC_nMs$EKUZ zS#esoMN_r8?IkveQB&ufbCek4QV}VtT0{U+MVh83t0wCwxy^>@gxmDscAmekU4L#=)8+>z4xK2L|c$pOH5TWuiFOJ zIA^SkEKx7b3?o+FrPh$`rF~|QCEpY$^Tj(KygwfH^EB;9PM7q0!^wPE%uW_{;r&W? zwsxPsb#=NoI9e`32&u7-I7?CkGAt1Fp^Y(u*;y^n|+RO8pWxmm1WcCegKhS5s6VnVuY%yL=EEG5XiExD-~N;mG;#n zZqVxm+PHD!sj^xv*NeKS%Cblur6%9s-s%qqZCRC}nM@{C+YX0AKlgdRH|z~bXfa!? zm*sj|i-N^WG%2u2V~+v77EqTn1|isaC}t>f3sKbbNU9_@r$^ z>aw2eC%trYXzRLC)htcLwi}aanSK&HL#vWwlUihr=N= zD{B+H_a0H1QMEqdfHX*3|ZNzN*_MOVZ3G`CtfN!wiabD;|S%P}lz2 zwQJM8;i{g85SpqTxPD?yYE3WCMFK$x224?<@&Qr793_@@kxo($Y$!iHSr>J4TFjQk ziAlY6d0DJ_#z2%~kQfHNoCUpJzifT0QDS7u!ESc4Xe+7aja0gtueLX)x1PV1jhq|1 z+OM0Uf{z+V5`v+&X}VK48jVPmnOlijuRmX}phhGH6;;&^PdjTY35(Qml=oTb^z`)b zs4PP4jR()%e3ltmmfd~ue%Z{+a{c}Xw~1&n99+40>E!WgTeb!?7z~b2kDJE#`$G|s zSlId8IRoLQj@DQoW0nqGLaNg1 zS$A>tC|P&xBdJ2c%tGgZ#hp+HsH&!!8SHM-$Zq5*v*`~9L`2R+hWM6!Y^!>`T=n~X zjpDs$NZFJcLt<=jy)^69RS`nl2Gh3UdMUxI*41KJmg{DDws_{svrpf=I@#H{e|USn zDEn#85P?LrjgiwNsj3z#&ZSIbp+Tc@_G~_9$GN&uI?2t>{YQ5X&yJS$3Awi4%h-$Y zh#``CYuF?yltU0A>i2WDMh$!KTi+JzRw_y;tJ-F>KYjY<4Lj!Eb{5d6k5acrEm;cC zAZ>_EZZqGs%NSI3b9<|9n|dv5OZM$3+4}k`X%R3i_c95mR z!$)@( z-2xO@g~bq21Oc!h01D~83n{BhFr1`*n)L@+nr6ohWY1-h)aE!6>m0Fz)CfByFtme(p$!uK~v-PQPG3}?0gcVS72BfB`>tr-+ zMTDRRqEX4Iu)?etD_@3s;gitIO!Dl_>%(y#)7YT)b;Y9E24`#}C^ShDqXGd5L+gKNa!VLEPdI8yUimB`D!&!`gPLlXPH*@GD*z!D>sOg zp(5eG- zr*c`t8#Jn|RO@2NpHSQ}#ogOTNwK`K!# zvnAiwurNKR9D6QZ9xqRhXWEcT@+g%3!A=Mqi^ta5!7u}&!ds`qet&a3X`5Q3Jh*@G zJ^PApSEF8kYi~F&Pb}HqaAfoJcy>ZToa*+*#-NuU9v%TBVDr+YPbWN-i0AK1NRB*ok{=7{^h0$r;B;nmg{<6l#6tbR3WN~X_n?D z%dFY#544SB(>7?9CsottL+_h*aW*4GnkA|}!h=GRC#IKFJa1|tSSTxT_s&_xo(qNa zge67vzS3$vkMq#>+O|DAJ8OIm>zasSwUG5nW6XNJ(PS&{jSmm!@4S8Iop&GBD?lwY z1u|d=Sin5_70?KX0s%3^x}N*fc?C4L-~WTJ{KeOP?n|HlvCn<-*{3cec#R?gW-eE2 zPF?HkR@$;DH%HSOH=ae~j+)}Z;r*l8qjV_N3?(+XbD^o6VG*&;d1!!&268M)W$mK} zf(s2|BMynl+}76ibaQ0;+~3SADvGK#5e&z+vy}+|ilnMUob`L4wiCjewoPmzA|a}< za>DG4u|@^utiJ#LquufLq9|8oy{^h6i^_%>Y}B5zb?h9cnQ7XkstyMuAM2uwho@(Q z2lpm}zHh~5xo;{?-0AG>(Zhq2qtldomo8uU;LiOh037)8#`IZ2rV1hz6$TS|b`4`i ze0F;J?)`_~Sg+r!$_Ky+a7L&c@T>+txf4PJ}{t=0J1a>(k40US&PE=bZKmk&aK*<6O1)_inM2WG^ zTAOA)4jZs>gGHiA$?!~41ghMi+SwaxIdgK z94W`x*45mHrAP@`0xMtz%oWR{qt(CvpMU>rU;V}}{`^n>%uj!wIf(b1I3cV00f3^ab}3gxjNu3iZ~#SC4~e7!p^cHOaY1Ajq=7GU z8#eCUTdj+_tiy6$rM(iYieN2gxg%0*?QoPUT2K)6X_~g$1GRS^Ji2^g-=-OSoo2(+ zMbS2)DVxb?b2Te3UAgiXU;k?bfUG~fo~M_hH=s`TjR06$=2cO>`R=>FetPm9=rK?L z9`K;Ril6(bAN~Aif5fCIlBBKA>Sh^Y$;ML*&X_2Tb2%cI4LB{zHnd)poJqB5qEM8k z=g7yXP>&dcMB(UTslL`0@m!Br2!V(QL>4Mw17Z*$G5Vk(I^toPU)tNR>$a*Y9=O(r zst%cvQj&)c4?g_x_+$npKzhIs7^d0f3;Vaye9zjALH}ab-y+JPsR{#3EKw>&9b@5} zwQ5nU@132zcY69x2#+Eb@7+85H~;R}l<>1(`mt<~R*hGp);Eo>yTWwi>a&mU9v`2b zJ~()IJU_}tb~s8&gG!8m7yx9fZ6&f{VHjhAsIz%lg-}Lm)T*sl%_tpgZA|;4)Z2zK zs(l-)*t2OFI{?VUO2kCU1XZ<`MZ|(clnpa$AW;@!b=I*-hgpB1+2OsDyLXO{&(>G8Jz-?~a41NT$M2M~C2ZIb00MV$f=bTG>{T@iFqO2<~MyCz>m*~5E>XJ@PX4eP5i1Hq@ycWuBOB6 zbhcCgNT(Y&R0o!OBIv43q-eQm{o|&52Ur2&#TT#t=#PA|KX6yBT%2xBM#)BfR`*jw z*3_{s+O={NkSZa1h3jW|$|j(RF?#PCRMzrvJTSa&tGX;#RlAB-S_Pa5!Xd)9G1iDA zRa;hrQi8-7yB4d<`cK>qq_B+0opGH(S(caTvwj~oaiXS?!1k~H;!j_D^&XUgNemm~ z&6l2i=1ZHCA12)s>4%tyNFdXJ6r({^eP9D(hS2$gP#{Klf$FBQ+qYiWn(pnr^VV;L z^&6}D>_7b4Z(qG}{o5>*08mo1sc_x?C)Z#j2jyvQ9HI9A>>d_eB9E>bNB9 z+8ENr3X@AR;w;aT)$D9FFWO2daF)0$7cOjX4o$9_N3l_2^c>M?emx$HL%zyul_by+(6r-++^1{XI zq{I2?^7!=R;PfGqkh0-4cc8YYt#D|)_r5GD072tq%IV1UdcC5E^I2I}adx&E4W`Ta zVq<5rxiL(KM$^_?6%qErLZV8B5tYCIQwL>Kp&-CoB36x&tPulc(`akhIC3PK>rjGO zu8X2+U|3mgij6^kILNY``#lh zTCSRTb$Yry0xPj`BtF!w=jg>!+fTF3Wm(m$5JKm%8}<8vr9xcCXp%g5Ez24qhB`(s z+QgNtXiB}_K(!@>egpxTEJR_u5uNUVvMQ-+miCh9LsMIqW&Ppr{P7=t`y1bb_Msco z&Cg!H`VYqAPx*EnBqx)K1Z#{U5J3e*FoZ4_;0deG3<5<65f~aYN&u0Ku@A|%rk~o{ ze*Wb6QN;4Q-}}L*f9U!CAh~+!#;~_hEkjZI)8$DMOXkoYq)B2OE48h(VYOT}wJ(Yy z%`@i=kx5);tyPuPs+`Z3b=h(##>4U6&L&wAhhU+lQ;t^>ZnMZ>pAB)h5erp7nc) zajb2*3S^jcww#X!J)0P>6hzj(iH0f-aLy|?wTBpA`OwCC)x@f;sCL^)zYpN7iz+2i zLf2y%=#!{|0mw&P%vV0kU7q!Nwy44@uf6}rU;Zl8K{nms3om}`U#8|+l?k&;Z6X9B zLl#hks9+I+1f@W#>Ln5>v1&KfMWm_;(;!P!r4Fh@#Kzjm&h85*$KM5-5AWQ4e0(sC zgIk*~rrdA14dk0pyPVTJ>GiE4mW$~-UdT};euNI5h;^5$HUHZC-i&b5$W7{Ch z%x6CL$)EhYpG|WU1DLI9V?f>q5h)A*u`hmdG}<~koKegm7H}j6FvLc>B0vfO2@!K@ z`_2u#XA%6yum3)?7Huh!_9pu;JpabcO(inyLomh)B57nMV@P8F zgp5~2!%jd-1Z7oKm2QrTi9&?2HbzV~E&_dk+5jJ#r=R-N-uC6wqgB&XhsTeLY8ibs za_Pt#~=8+$vO*)S<$UB?(g z>tIEN*)ox36M`6<2{8bhki^znHi{_0THD4}NR_DxO`0e08iIEwB~FVfG*N=0XzQYG z%DT1@Bj2qzWvtQZ-3#7pMLteo9pEg zQJr;3f*4oZI~VRfIR1k_{XZQZog5x50S6=m3$;%yzkL(qw;r;kiJghjc|(w@yTxP&74s`Ryn zB1)@<5>j$Vl;Y0*&i>PvPV)sbg9(5@&)F*``%zWwzNCy!W1vQ%Itaobw!}71bzY z3=u>)amli&fCxk;hL}v^ph}4~iK{~_3m?kRuDmp{Exj=YK{HBs z_O>@SrtD}m9k37}o%0b-zMVY}YqF_@8nMqug)!AZobTT_IY{#SB(P(!t*iUR}^y0Ki;Y!X01XzRMJL*d(EV>sI1y5Q^xeYtb@WU;KIyf>R_^^*aw9 ztEN#INC1C)c>DX`eP=qM`yV{|OJ@z;*eykZJ$*zBpB*FL|oF@5m( zwFh^;F8ZLU=70I;-`?8T+TGdkUgu})AH4qV>1id}2X=uBFhE8;9S&Y38md0g$ev^@ zg;PwPdg_bbUw28V>Omq(1X(XneRFhj@~Xyz^?LD*Z+-jf^`8d|M`cD+)unHoGkGsz zX0O8FEX!=-qLK&@L1K(V9~r_Bqdp`_y1lt&a*nCyqg+>AH~;{Hlt@)AAm{1oNw@)s zF|^XA{r;=p_}=NVhUUQ58UXDt9y6v{KetpKLj3uVn zl}AkS-f%e1T^}kG!tv2^z2Jj~Z~WjpZ`}UyVcozvj7QnkE4x4Pg-pO2p>DqukfPip#vO4_wtAG97SHJWV zU-*?@{@Gs7fXS-}sNc^Q)k-6|EdRg$oB#2D{$$7C|urF6`|8!qYc?W;A>{1as?|pV}CI`n`AlZC!ugSL<(n>-&HI zmws;0&%gThSC3Ctz<|?h!{HC_Y`&Bw8>7LVb7Sjv+b|_`jt2fnjTKmHcQ0P}qH0Op z7|S9-1O%oFYWVo}?caItz5fdO@Pqds96vhR-ycWcHo+URY!cs=#6m<(l+?Mj-|r8G z^JQ7A>SEb8%R09M-$WDbq&J*yji(!v;bw2CMd&GPj2e^`0Fn8~gk_)PRY6zPfS`gH zo5mll=dXPKO~e#5GLsvVjaw3@5-jVJxqNgoqu8YK{{F$?_uqT(58C!k;1HODijM?H z0Dx=i_nW$Zax?)(;N5m2AMq``Wwwc-kmdQtWOHM* zA#*uCK79Y3*WP^VLA3@X1tx$AZLCk$$0v8+`rzJYKKt^EpLl*btC}+O^8S_W%@QrGone&MxO-~9Lg-~UjD4A=&Cr(2)6bn#>TbaP$I%Ie;od*6!Tb{o%r z|4;tvFTeKfRjI%xaP8?^zkK!bFG8Y9vjFp_|dCiqulCqZmF)Q|A;U0YH?@*v#leM4}fFVX{QrHj<qm82y!FPr8~u+NimT;ZgQjVk_iXBtNNm`%b8KBv`C{F)RrIBgtrD>|81{NQ zTiaXH4V#-_LvNfn!*JTny!g(J1wGex09Y`6L|=iRKva>oZECk(wX?G|Vh){Lz5Ge0 zQE1s^(1?ycWCQO*V%x@l`0o4v;qc*K0w=%{C_%;cg^g#QzM^d-Ar|ZQ_-J-?vIN$G zr6PsgD^|8x86W~RP=cGS?c`tni+^q=mL*s4Np4+|4u_Ndy^E`5`N6x#?|*Or z0>lBkz!c~Mh2k(`zFah4{_^)8+&_BZ`CAgrs#raL_2yuh)+W>vHG(5zQ0KC*|M^#6 zfAgWj0=vXN{QUEOZ@h6$lo9I1?Cslkey?ucP@MkppMB${mtVMfW6z~YH7692WVG! z&P`9MYOSh7uf)uNF>Ht^MtD(*7P>te-CD1|L4pS#9@Nj@$}-K9+-qp68p>(kkxLSn zS(iqoqNuCdw^eA$U^PMDzUys{H^-9^Wm+U9^|asbw^G$@5jB9jDKCN$8K|m-3efpj zJGy~YRf0;u$dFUo+Z#cXr(Ggiv7(!=?i4n#H;?ob_{nNvTzYp9aG!F5`vsZrl zXMgN7pL;2WvYO2e84bK%myaJmK0Td%@cxG%-hQ}P&MOZgSO-xI2IhqqpZ~&-e&*`M z3-jYywN8_q1Nowk{eGGz{n2o9F@NoY_YZ&+Iso=AUiyiPmtIcO@qB);oV|JX-Zz0q zi1T;edEk&+F&)$+^uJ4uYBhi5U2oGZanp?moNRakC&r#;~@a4H3Z4i?9%4et<%FF09Y(m zRn^qq16eP-nx&V6A4DWj>V{p2x{()j1nJ-Kgn+8DVMKI8d;%C1W)3k@MC$T1>2*HR zrfE`_tyd?|#i*+{ zRa=nRGLwX&UaiWqwwxCEXi)olwE{C%MfsU~<#^a164jd3qKcWGiw@Y*@BcF9z6CQ zK$hi~$K$8H9{?G_h9F=UBWp;vwqClMU#Y7*WfAV(yZ8L3uGLN1%!;k?_-wuiARz4z z_7XddlF^ekGAg0~A#?W9<;y=cJGp!9sTVI@{uzUAXPUjg*U`qe$oJPh!Nhy8ALhPGXNNdDoNMx3Wz8~an?dTGZ_lj)iEA4^#h;< zaO3(FR;jASHw6)FLTr0rvUwVntFo>Oznm2*G8i89hJ$`Sp7hd@jV^>NlA+*(Zv(Z4 z4N)Xku<}Q_Q&gWc@5+D$Ggw4@8z~0zL09X#djQs?q*h}jLbM1$4UwMH=zcM~2P}ZF zwKe|OC!QZ}_SJ?mtm}2<>&Rl7#)m2f<2N=EAKPVFSr-RM5;<7rMX_`_yM(1O#Yzs( z)@O^FgutQpo`{;J98Ja#9y|aT=x6!$t<9H%-&RQsgABw21VfYQ_$8M<@0&wF7OS)2 z#vtq4w#NE++15?QP6UK-@7|s6B#nm`6EkURA~Gu0FxnW2p~2?)bTrtjtBkogI5@D@ z#u$w{1LthgwW!?;oG4hK3MMGQSTKyrXgqxB`H%hY#v2pCKHwyPL=BSyqDmA+1L;}W zzEiB<1{x4P^}{bY=fFU0SL=ICdypkJA+QEf5Cho2e)I+jiu0PNP$m+AWiZHE@&W>w zVx9%!+3D#kMfon!jECu^i~B}3cS*6ByNqhDV;c1aJ(K6hC(CBtRO`U7)+WAc_jk6h zUfrcMhO9xNmN~XjL?|%DPGIgrysOiHQ<^QvKnWsH1tL*qZDJE=(}dlV{|Sw%kr^SJ z|8Wr|B4QE|5O>8pLMPi(HB1h5(=?6ujSmryjZ5>YSS=Q7W4LZww9zZT6oRObkCF_A ztFnId=xkPn*=l8pB}R}jhNAdD{&aQ*7{F~zFJ<%Q((0sX z8c)oK^pOnuQM1DeA;bW7WZcGd^HW5s>QoUzu*_`}Y|2bU#452xQ@`{2>%R@X3l#eo zH(vhqi|h4zFwWLz72^Hlqwid~aw%~aeZyodb(;n#579AM0z^TKsA8C6^ahpalBj|j zL!LQAsaijKeDK{nw|@sXaU8d{ryHYTwLT4A>bh=JM``XQq-olCY3guxvS^Bsn0||P zZ*Ob=!q#xBSIWw3OAHp0IzY&>H6T*9=Q;InVydG;Ei{4+U_jJO=`^ihS5*a}ZV`>f zx>*IkBHkg5?2S_rf?6E=4wslr5{0@nY%{a5H7+Dn%i1@MZ(B>8CV;Z{ADuI1w&H~im=PnGjEEQpGYc$W zRH3S@sGF7@C$?{G((#jZU5bQ{!mIl-B4CTCkO+by0#pDs#;B-CDC!(Iis8yvUmi-cxf z4adFFc#tH?a#q&spsh%wVq|B3Z*ybRA1BAvu^kww5%1M21#o9KHtLLJWP%v`1*qGq4xTKl zQe8D&mTH>DursFfaYRK>^&){f8S`9t;EwAXjV322*04Q%bQrx@wM`if_xCSe7APQ1 zRm2#TROx(Xn&^DKuM0J2C`2ftHNj8|Du|b7CvV+<^zE~=A0WI99H*vK3P1i6KlFtk z|KXxsK>Vja_2S(R{;-Jw@y_E1#p4IxadzJa1!lkq?!_Pdk$;i8F+3|nLL?$*Nu*sZ zKRiACGvFS;KmZz`0Y$Jtu{llu-p_sMx#zAI>p2-)HEn-5C=ORu)ns{}$rS7M`0+_o z%VM^=vO6C4d()kv8*=WlCbrr{^<*Lpvr*HL9mW`I%-?RX{&pz@pdbMmkcdc(K{Yx@ zn;S!G5TrtVZ&lps_n(c5gc1L?{wcj)`qDEu+wXnvfdWwvkB{{Uf+#JgEUXlUar(l z*Sg*92@nDA!%ENqAV!xjw8N?dQ65h=&yESe;pth?RFDRMA)A=Qz&dt~Z!TZi2i^u` zxjGC|xXjdRpFx;8gwERo73uXyfC-{?-4^rm+J#Hu#I`=PO=RW{yZlXW(H&QT3YAp?~$?{c}!2wJJhc{`luUm67?+ zzy8OovH%1)^Wpt-y#(8koy4>fYmoslj4`AdH88;%0p`Fd$Uqec9r`pDPu<-8`@iyc zfB5AWs&!#lW>JG^lDI7GrAZ%@0O~*$zmzqKWnHXVX=!g~@8;DjyE|iKvE(wU#1LX5 zR*eN4Qtmbs85Kl*lA`|qdaVEDM^!;WtQy0hmv0RF$7eP8?BL+_r=Iz7imHY>iBrG~ zfn+|~jmgWO`SgE#=guD;9e)!t1FEKIKDb@nx&0dOiZhsO^rzGD_RhwYOZyitT-d*~ zn@sw~>bN(mmd$c;7B%*U*<`b~vo}mLR%z>cu{t_g7VFh&WoTdx0Rn`oTpRGylCa})t9evn_hAjIKIvA`FawH<+#SnAXc2ZD;5L#n0B8sBSBoPFVu|87QgBoKv zvedAyw^%mbdyTR4nKG#egrR_CfZ!MsU<_h}0Srer$E)>QcW;0B=`xfi zukQWgFaO==UwUdZNteqrUseb{GyKIb{P1MF^;h5c?g#JRUagi2h@urhU1DmLH8>cD z5T$dwGLetsr3E}lhU4@Xf8p#{b+OopSy@(d)? z>D0Kitm@f(B~fQ5%l&8eMjKgwBW+#ng9n%bjIdRHGAjW95+NcY(gjv0i=Y29b?%0a z4~YT;W4bm_ds*+&*5umN)8n%bfYYPLuU@!#`6Xx#<*qA~KW)Pv?k<>G1eyJk+MD znTVMQq4lk`gARf~pJ-cTVpI_USoK_nu*|_LzzQ<#Qj=H9x}R;;p{SbDI>e@fcYoW? z*!|ZaLQupQU1DN9ST6tcmGA!t4exb{O5ry~>CMX*FHSdp?&rVcCP~_(s$BZE_Ej0H zKqgodU;4!Ln@?@8m#d~}RLm>if9t>e{$D9HhElXKq!K}3D9DmBNif#-085PNbo#IV z^}kA!~3vOmaAe#lksRcNKekNwL6U}4-O8`&gO09 zFYaIZ#3w#Jy^sX1gkoqsS~5yjjR6_zW&=bChL~UgQq_;l7M|)3VvHfk zVzH=Y;Mu+K{LMGs|DY^as2(1lzP`V+Pq-LcwkbkD1RO&Jk<%Er7^CrIe>{Hf##2AK zT79^h-7eOrUYhy(SlUNG4MZRWU(L^&`Rx8{Ke+ox|Me?ZE?;=z$cPZsoqFy8b>_ZdU#-`m9{HS?F zx5y`TP?%wR&BFNIiA-aK7XAOF&In$rxCN$+2O&##l8KD7cZ`=r)$4> ze02YV+aF%o+1%Qi?(S~YWf`0L=yY}Y#-)6i7j?T>tW>FKn!W2=y-~)wdheUErT_=a zLWy-ELPX5W%t8@rosG8J>e;=8PUs_&bGo5>9?U?uQPVQBNCf%)3)@dUb>Y?59)RZ$ zAN={n{bvxzM5Cq!JHSH#d*1fipbW8WdM?}ANT1)F`tB!|)oi)GyI9;^oZek7ZvzLw z8T1TTud4XwyLaCG@XkvwKlii0@cAh1>ER(n)Z2c4qwX=HO1t(PtFmBlgi7=v!4p!l z>*9&f+25=^FYYl$-*~mKWMDgC!4r{+@AneJ2r>Fl_)wAx1EeHRejqcLl0kn1ND;AK z*TvdzO*SK+MUKPC&?W4BkXW^CZ4wb?>P9sg5$MV^uok)d{)b;)uipUXAbI(d*Kb_A zGS2%{$EU7d8gCE03u!NlPJcbqgLv?$2y;U=$;3w!Wc6e z4|J5r$)G>!|HPMm^vyf}DXbP)zH;~8A3uL}qH@WYK@e*VT93p)B$8n!BWhwqj44A& z!D0Zid~LdMb7!mMoAbJPv|QaS>j#Giudn7G0!u~d!~B(3-tnk^{PUmO80{sj(z-0| zw>iZaW6Rd^>6~zOLI^&T!Pkz_bsh>Z5IeC9F3$!Xv3+(@%}!=L8X%}Kl-Pt2jkQfJ zlgY?AG*N;tnzqOiQaP_@{A8d+0K+NZ022dL*(E7kUd>OvZ;T-z0IkBGE5jf0&H^$W zx73I}IzIdkFefxmJ-zqR$6xSOSuAGP_b*L1`)&y888y*2O>6@zthEqjJ{Or2>-zn^ zh6qE>8D<~~AW*Lzjiy3Mmcc|&j@>{Q(6;T-(b2fyH&)5;?(T*8a^Zb*IzM^y-S-e; z>XLP{QVW-*^JO_ZUaV*JFzdhg;)@$weKl=WRZZRI(XkK|1dRfh*ls;6kt!zyV{%vJ z!Kv#)s#_e}MVmcux|q>fN@0j-FzDOuQ5g3*ORtQ^KlJHOeB;l50DJ%N{okb0KmW|H zM7^nT1mmnj)NYB+lftAh-I-MtfpJhJ#Bq>5@gzwv?j|n*_4Ug|Q9nF8dF%F_KX0mU zg>d-&@7`IRtiJG>=P&GU?QUIceAwQ~s;Y9fw_Mk|dwlod3Dn0}d0!>DkT5Hl5ar2w zFC>W@0uIU)CDz0dD%vr4G1v%pWcyj4xzipR(FP=-ZkDL4DZ+-k2X!88OkTKbeG}I6 z^|3&LbjTRQLL3>u6S3Yo z;CK)Uki#LzD=zAR$tdT9+kum`7vFs(tCDkG=Qa-P4D2 z$ist&e;C^4nOnb-o1Jvpcs>*0Zntz>(c=Uh0Z+kH$9^Q#NCL| zM_rcz8)7mR2CC|ui-BT@ZCi@~5Mp#_ojUbSl+F)Wr%~{^-6QI9UD(u|El$_#MVdJ} z|BF?m1w|l2P1nV%z#0+)p*=o)w_BZX{pywd?VZ?G$#CP!#S4v;ZN1po9I25|HL-5h zd&7>MJqKCJhM@)|DiYgD7%&F#0ccxkGFIwXH&L>z8p*&~3uXv|_3-$>vW&)kCY^4L z5oOTp4+f(ql#h;%i?+&KFG;eZ(Z#%~*CDaVjhk0Dru}8poXzGorn$|S7)(j#3~?KL zw*t0Xi^i}S{d6;b60DkOfAva;R~Pr<3Id* zaa;iRPL6+fz53w#Q$N1B@rg9OrZOcA11xY(hlzzz>W*0I5W77Q3L^kPo^;$*>lB;$ z@G~F#`1t*IFC8EJZbWl3FTVPX@BXj<=|9vMAi~hZNE0Dyn7dheBTP!d-FEsX9});f zp>Tds1QLTY9g0Cvv6hL{2PnjLgCiPMVi$`Ykk+md77!^@24nz-fL08<+4zaGQhrnFnC)06Twh83wl}nRpjzKgd+r~P!QR;{gt&$}s zvcw%eRbvbQ)fk$f%ESI(G_+;yfpT4)4K_m8y)&DRpB0fbP5XmEcj3*!3j_~R5nOcCu&1YX9vrEG8~Qjm#^%KHqZzmW@ejM?krM)nGy$$P$G1U zFmYCkysUhC{e|EUm;!F z$js-;4^+;Zp$H;Qz|J6b))R*PEX$ZG(b%?4ktXLosH%30YE{8x^K9U3-v@3y?%ccE zA0@S~ZOU6ao1@Wic{T&IZi;R}0n_>7X(hyNs$AN#I74^I2fIPu+Z<<`+rxA~I<}H{ zB28`HhSGtU!7y?@NoN#lO(IfTYeSHPU6PtC>j4cALuidL!9!JvNmcn={Y3CxMdgsG|A3SxlI#^VK^MOF*xU-uBjC*4o+>0%P2H*qUcBXVRC&%ll3F5Y5Ec%RnXHggA|JYI0GXMi4-8U2H$d-dwokH7T1XahD?RaI@(dLd5pBugQdja1$jb+KBlm#gVu`ogo%$GkdOlug-Y z*1>qTNWlFpH-^Y?=ysC0q%2Fz)YfGid@$ZHNFys$V|O_rfxBS}K)dC@rW+Cr9-)rj zu{g`B&NyaK=hC5E+}{1!AODd@j~{&Hum1YAH}Cjn-EBk){@&w&Av0XFme=5TOn zx^<&BxR@l9G@D3ps(G4^d@ZaATlP^!w4*ImNdsB?X>640uuh*)a@545c>0O~vwP;>s?#ISMJ z+S9R(Re)E7>@f{+#VerhQ?U+F~(R`)#7YD9FCuP?#9-I$-}pA zlPFuG1QJc0b7TOv)@EtaEuxXOf#D8;MuJxag@DgDzWgmJtGl%KqkC3CM668RH9KNd z;9T0zGuL;CGn+g8Bp2aIq`H26|DXM{UoO^RezZI}ncsfz&U+u;p3hE$bPLeIWY^0N z*UMM$-~HAwfAPw-ADiyHNM_H_Bx(v$>WCQqXg#Zi8|>^nw_LmeZSLNCaCCgUy*H}J z)Ky&+RrK9k7Gj8mCyI*s8x2&TQO_s5)it+p#f1Ao8g+WK9IhXc2k57D!cfmp2PPf`~Mok+mO zIA^orXj&9j6}R7izo{Obo*gu$f9lz1UU=cz>o>3UH#XRaW3GzYS_`l=@#b?kDV0@u z)>O4`Tj$acyj8SylVo|@w(P7_k|YURS5$4&G*O}gK@ph+-F_j1|K-O*07F10y^@GP zV`6NUq@Eoi9puA=txIihn&(3nQ>@F9B8Q^M$P6d>_5Gc;Zh!Uf{hj4<{oui)?|ko- zyZ0a5zV~Rc4q%mV6vJY^x;KCA8>8vRo_+2Yv+T2qeJC5SJP8Qtnhfntr_TY~z}e}{ zAI(lLK7Dbys*BRMO|+B%p#%Af08$cSh3Qljf`Ap4ZH~qPmBgqqa6)OCGs9YP#!^aA zusNQ5poKyfi`nLuiGegR(C#O60m5wZBpsk&0L$eZ2%FQ1bFQDI!+zdntfE*D!bfvX zO6SdcC!rCUZiJI9iHJx~I@Ev(=D6!0J zcs%Uy?d&o=5QMr}G4n?U?xSt2UBr@cPneO44K#)%&!lb46BOn{O%zoW^yEqi1BoDk zWs=y@dc7$sR3l5owr@fb#?#F-Dht+HJXefyr$x9?VYr~ zVg-p>vSf*^VTJd8G#FYn&M?IYBTd`DnYOM#sH)ZO? h{h$7cpB(r8^B?}fUq#I3 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 FV1gZu=Ij6f diff --git a/docs/reST/tutorials/assets/surfarray.webp b/docs/reST/tutorials/assets/surfarray.webp new file mode 100644 index 0000000000000000000000000000000000000000..659ccc9b6a13806879d7a537784f891e6173f3e5 GIT binary patch literal 38938 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 K(2O?u$^Zbcwa`rf literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_allblack.png b/docs/reST/tutorials/assets/surfarray_allblack.png deleted file mode 100644 index 80cbc35e95c54515b85571f60f1c8fed3b7bf3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwrE}kxqAr*7p9%N($Nlo~-{v8KM Z11Uh_Km!9~vREltkEg4j%Q~loCIB*76G8w0 diff --git a/docs/reST/tutorials/assets/surfarray_allblack.webp b/docs/reST/tutorials/assets/surfarray_allblack.webp new file mode 100644 index 0000000000000000000000000000000000000000..c8e54dc215e1c927aecd3ed66e9cf26af34608a6 GIT binary patch literal 42 wcmWIYbaPW;U|#_~o*?k=f4I`G`M=m10MqmgD*ylh literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_flipped.png b/docs/reST/tutorials/assets/surfarray_flipped.png deleted file mode 100644 index 742f4f3ae9a759040929dea0509ba4cbbc970771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50835 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 Ef(cSL+5i9m diff --git a/docs/reST/tutorials/assets/surfarray_flipped.webp b/docs/reST/tutorials/assets/surfarray_flipped.webp new file mode 100644 index 0000000000000000000000000000000000000000..3b3da69b583cbacf1f9ca387d102ec4ce628870c GIT binary patch literal 38804 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¸RH~_1?;wMPSkqdyp!HHND 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%0AigcCTmYb{2^cuOGbi=TsrI1I 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_redimg.png b/docs/reST/tutorials/assets/surfarray_redimg.png deleted file mode 100644 index 58e9c3f68fc501908aab0631d686a89085c3a142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23443 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 z 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 K(2O?u$^Zbcwa`rf literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_scaledown.png b/docs/reST/tutorials/assets/surfarray_scaledown.png deleted file mode 100644 index 0be3541df4df805fc46a5b6e02b0b86fe309ab24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15109 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 diff --git a/docs/reST/tutorials/assets/surfarray_scaledown.webp b/docs/reST/tutorials/assets/surfarray_scaledown.webp new file mode 100644 index 0000000000000000000000000000000000000000..f056ab78969a1fda64f26776a7a6e27158e91f1b GIT binary patch literal 12840 zcmV+@GS|&gNk&E>G5`QqMM6+kP&iBzG5`QCW55pp4M1$$NRqUY_Z!&xCp=r)}wZ zgJlC~+l~Joz;SI`*|PElcPOc}Wd38Jba%gbIl0&*BrCSHjk79d>x+oO3eS;Mkkq0LA|R_AL3%#ohzxzg#IWv+$-+be0;(Ld z@Lgjd0Yu%A?n=#)4`*R9>tbU3@zgbdgu<2Q*_URVjB1fI>%IXya_nZQkpvf{ksaCy zSg}&L@ywAJ0|lV-$r?~#TiBxj)5&DoW0wUpidSBdy7E8#11n1LJo4$4f-7juXnbOQ@>v@q{jEAzzW`f9hRFmqqFPrc|+gwWf2n!JNe- zm|tTR40YMDS5qtR+wftbONqE(Rw+736>5L?BiXiU+qP|aF0GF-Vc}+wwrz3S7PrcA z=KySpNn8wrdMnv>-;wYnNw#cTk|ZIoeSY1NA;{2WQX;B4jauJ3doeBBw$n(=c~??Z zHHMk#n;B++CnV62f9z|GVe{(oxQNdIBUk`*@%6)$B>yI6W|nVF86@f9;OGxOc6Wp1CP zE<<6VkYv~8CMh^xr;Z~_p3%&IB0O2!q)5_jTOy)hW^NAQ9_SIt^wVT!W@g3`&(a*T z1+zM5bn<7cJZGAt8D43g#NS+KehFUglQlR<7e#|b+ zCS)h(tj!|(nC=Q9@`ESaw%bUsZEG$8fM#?Hts_dacR_a%c6Qfb=XOe`wAR9%<^a~3 zE8>G*jdIa{^2f=C|H+H~uXO!M#LxOmE^00|7f{I@Pe%Ktij&Ft zucsmio(XGk?0-);XXVR3CAX)Y^2_9kp~Pk*2lLvb05dx_`i!=<9I^M$*=ck0iw~>o z7t`${{~rM_T{6sOv^XAIOXSbKL3bYcYpMk zo~)8smfCOT@>rKJZRpeURPDc3#v(PLU?{*kIA|^BES*4vFf-Q(4bmi69N4}5AumJg z(5Fa?Oq0@gyS*E>d(FFwF8P#4WsyTpHxsYM0s5>(Bg2EUTzL(vHYus3ABUp*V5s50GPd<=?y+4_HM*maB>*E(dM06Ihdnu4 zAB*i#v?2f?mr5ZBB~;>I)($vHjPn>6VmMto+2(~q;zf!pp$f_b0Ch@Y-~1l0`eW(A zNX^bxzLkT6M-z%w(qd|WjA(EypsMCBecka*Hg$3i?yt4zl0y-`^m+KHkX^fBmcLtoHP(lW~%~^=Z%pt&m$SPQ3N+&TB z?u5koqxBNYtxF99ZHt&0EhW)sb3hqHaHktaW%BIKJi(XXZ?hKwfSj#e^;?;+F4jC* zWhhTAwQS7yV&9i}OLo|u@-z{fqANYWEEyyc44ne_!Qrtv=3%Rp+}HH^!W7f}7kx$s zL8CaN-IJaCHE-=$l-^WFT6|mlK5{Un8?z8f{^=Gms(T5>HGOQC&;E77D~q2mCgerc64&B$qfg!`>Nxx*A@TZW_Lz8zQrvRy}fLpzdRHA3fUUGG;fQ z3+#zqr}m7f0I*gQ5Pbf&gFunfyVs=Ab*$|<>K*f(EWlg9j_YR0+Biqsmv&J4nK#?9 zrpJEaJmIPHN+;}N$+yAURfUgl@Y#$mJqpVUfvd|WvDRN7UZYivKSC1Th(wx~VC;=?S-58!(<0A*?=#gy5b!iv#$y=uG+uQ$6 zow%9OydY=x<_4(%U@Abvo9wRkq*{HG!sQX$1CxSUO~!Gdv*!|WtYRo?)9M#yz4FVf z?#i5m`0(X&%Ik;3?k(ZYm3mI!wu;SacT@AlWi@Tc2C1GB`=v2?VP;uhW;2Oxej42@#LS};M<<+_FKf#j z3VZ+Zvn^?k3`d+eey|Er@C0E!x29?@i8(vQ1qa0XQ1z%T$!5p2*12IOF=kRezRC~F zvG0dlNC#|+=%YDAKb-76ZtQM_qdc!zbOn?VLYYD*XCMu3uNOZFyovm-PQ+txN5CuOzkH~RXMY^iPYEF0a zP{?PlopI>&#fCn0mflWIy&VO@H{?6Zuat$UU#JcDyD{{H z`r}%)#CotZh=cP`Dh3QSK(2@q;et$sNi*;&*nBqC$~$(*wy2dZUEb|-HDhWAnDoj* zBdKg}fq;C>mJd7jpzccdo|?>F@6lEVH z{hvu{q*8c<`3H>|;`EO5-LF zha{H}g(fb5BUFT{XOE+@FE=(=eu6(pdeQjfTSV7P+5{Uc)#Zr9(jyTlFQ_}9x73^} zHtrEt@#fcZxMfqqL>cmzBJ9k>Ge6_U$?^fkfW#5v%!K9yjpVI#7^Xsa$g&|fzVs^v z2_zsTf+}z=nN=88Z!5%HcKPsOwc_bxMF0s{YDTW(pPo*Sk1-U30#LA|ZwJVQqf(`f z>4kQ%!kq(QHqSD*8^Wyu$nUDYSm!m#C~n7YqNJK`OIFhZML6wXFC5j}%9hm@RX*1F)cXElEgIMnBZGZ!N`C4vjxx zA>*B&%BM$+Of5)K&}C_e60o>VAI3iTk~>C)$};A%O`i%Ddw&C_Z2pg6sUc6wYobn z?{F`?ET-QCj0An-Cq8|av|?b%`iSW<4Z3$t#nc*?-m%DjE!?necu7}Z^7O57pASo{ zfmq!(bzG(@x4iM!2vkO^3Q(-@xiU7F}) z%aFM)%Tg|(J zy8NCzKVc^4|MCto-~=epW?g?Yc|TprR#_&o3GdUta&g>Czyfdt)F$*azI83F{~P)g z4>v}jC77={q`vQ`H{){GJOAS!sB{OE>PSrZ0+ezo@Xw#2FcI50m|UYGES zBy3LK2xhO|{Eh)wE2l?a$883qp0tW49MB3?2_h0n(#;NJ&b}D=#1HU0<~{Ej;{`0M0JMScrM=Ak{ad{|;-Xh*C_rGN}_ z&gIYj@ki_gKvDG&FP{vw1dx@pBut!;MgZ>QuYkDv>r-E1znpr1^|s0yCb*5_?uOZ2 z($(+!2UGMcxYRQ=4oVVJ!bMDeh7bP431|bLytk?X0y1=1m@ruq z!NO5~0>UG6*Y~%6Yx1@lO>S$IR@rdVeZ-F&<+yi70}fmVUa18@neIh^g6iSfIt*0V z1NLgQk_yBCsE9d~0EluxI}YSIb8T)B4$CPO0i1zKgg^>_9Dm-}$Fr-(Lw21$^==*L zOy=(GeY^JaNo{|+U!^{k4l<@2*(R7A(u`gXqhhDcTJ^?o9M-d#m%}ONRy9QGuo~fkm$lmGHEKNoYMM2C8(vK%y)cacA=!-0! zP^JJNpf(~$HjSqSYcHtVd-d~G@5%h?qaMzBdv0IqKd+B}|7kwStdAPF@?P)qr6FMU zD5)H&=Kg9vKX$ov-W70{7U_O{}jSPercvK&3 zXR<+Xnam}iMKra%ft?6k@IJ6Vt-9M|Jkt{Gy~d8D|4jten}oHm*teJi#DgtIA|PcC zPEPYg5w!8xz;IYj9cLBEke+2=q-A(6bmHN`H3Cj$kLj7;;o1MPW~2jh!EC=cY7gzB zcOJt~t><*kw5vlpAE5hUT;GFzyVsZDHy)*uV4)0Bw;rmXIr;4q8WOaUV87RVDZ{g@ z=m5}EfKW1A-4x7I^|e*bRKk6v+K5Ub=`DCxFYql)&{wDSc5DiG3e+Nz!>b^ls8vW@WQ;k(OV{V*o?01v=uT#L(_^>gz!uY&bDql%C?G&G zyeS?f?2^*_!eUxSp2Be`_^XeWl?ALx~MeMMN!I) zIV^|_%H3wO#oTE3z9w#G9zW$fmIWC$8NgTALwQPCi*%yG9I!g9$8vRI1itsFuguT6 zoMxJt2$B`Rq7N9Ck6@nN8M3IL8j`4Ca4HlsSSS*_9rbbvLnsSjOF#r4wPl55c~8!F z2k(&9WZgE#B&J(7Hr6|xX;(Powg@J^8Cx2`co5k%-qh#hE|+mp00QPW-4>Q&C!Lc) z!JT!Ct!u|Wf_#Q@itqr$vY23$lR;GyRscYCF4?nU{25t&WDNU*#GQ|mhB?110-zHX zBC$wC!BRk08d5JLB36ujfG;`@$JLE@c<7nTAjK$PUmganV#1CQ4u#;+c4WQXnvtN$)MPf7wOiM=8X1pRR8ng zqV0+w@}qajc+6E|3p9)St~>!L1ymPZ(QDhDQU0BHx7iJNYX#7o$@-k zxL=ykqLpeD$yTx=%aZFU&f_d;8K9--yKL359Qtx@-t?erDs;IgBHB25bVxV>A(&NJ zgB5d&u2nwqan+~~$DML|T|X6eqWuGLP!kqvQ4kda6U@_ zma#Jrq)2nRn|6z#iPw%ScEo-MeoBN9#WFLQCZUR(V8;~6#$>d!NEUvCh=}7ldL}=8 zb!Of}n<6wKd$oUBo+pt4sEY^!i=oP5Qe>*m=PMVD;!1eLjx$wQbacrVH_bbz(!=#^ zJQ^fCgY6stVWZoL1BakLe+^CVx7WRU>OL_q<7&N*a&tTOQXjW9Xb(Fy(JiyfM2Iv= z3`LY;pbp4HMn%e<1AyJk7|R~WhL0=h00+O`MRo*)Sc1<`$p9dSNvIIW5KK#Box^6Q zQ{+j2=2-;dEi>5MHizu)vT7q9$SN*uv(aR#Tm%3ISS^WSFK@PQNlSxxPz62xe-$oc zaLFsrKKhRYdp`J0%Y-0p!2~g7^d^a$HGg*g>Ueqf=kmUvdE?rfoaidbd=Ty;aE|an zgHPV|$-R-L#0T~OAURXfs!SG)6vD5>gfX&s0|4v66t=RXvz^?j^O3M=&B7yAi<%*f zbP^B(D9~ORgn?{q^2O*0&BLH_o&>|kGOXU?P2n>^5SYwW2sVXlh-O;vQ0hg`Woa!a=+(%K8#ukU=##ILnm9_vTd)e{=ivqQR90SF*kmcTJt%+0`q)T(QqN#Qay4PxAa!0c{c z!s{~)_kn|gcjgk2sFa#|0Dwqrlh!qgRSDkK#bja#fC<#9_?zE)`|U@VkMFMjCq9GG z2ij0>WbqQlyTSDUAOCxQj-RlltTF3;TlXk+0Yf?sbk@djMAbVhkPY&<%61{laLE(7 z_lAZmzV?^+j$fjSf0>KwKZpxR6-zJG|Gbslo(+tmwDRUb&-UOQgwj0_Ru|QYHBi0A zJ$KV8wkk%cMW8tB?z9&g$}P1?+-Pxa9LFL1Nu3)<9##t4x`xPd26V(I6Y!p)al}|F zBbC8v%6af1s=R&H%Wt$dQY3EM|M}kd_w(E^JL7myQ~|#L`YSL*C#46}@MX32x1Gb? zbjZW@8Y9xkCd44oc*_YF$`}t${b*3P;^!E*=KWxhfQ(#3NgRdmOAs-dLSTKL?s~h zR^iMIjbrwA0Ilx85Cy1_q{tCNy^8^wGwE36jNUq;b^%QQy*%nyZ^%9PGePF+NnF)F zdFO?ndh0iRd-n9J>HnR@7p)&S`u_XqdwJwKciMxB0(xL>d@HSe*`5l&b&dK#i~fJ& z$TX~5p}5gdjly$V1O0@__R{N}!5pa!A5u^ktFWk%a^f_{67 zi({Wsc||=zD)TkE3}ssnlTC`ITWD+Ri}AZKCPtzL3vy!-)G;-ll8gvCaa#4>+9>t0 zn`ZQsb_pgCK(@wOozDfJM#1cY!WRw9<-iBTQ#_rXN0==?ZD4sl9Hjx60R}aJZ0h>X z>CfAsWWqT0%I7# z!x%^q03o8N%7C#UR2&XwV;_2=Cw3GD%TCRZm(-KgDWFz3`auPh5>~`CZ(ppedxS?s z0%faed)m+Yn^l8BmqCgSpvC0$G$&$x9Z15Zuh|<_TU`DYr_#3ti@aH=wVeMawUy!HCxlb5O9}>a4gQ!q#x4;FHKl_M6&BSefrYmiB)+okW2M_a{c6s3(2J%r?bAG zt2F`YWz3la2V}QG25w{WDG=V-zJT0AF8%AQwjj8q44Q>f@dJd!i&G zp_iUI`dqFur%X074)^v5AmGY{e8%XW-sjaUeRNPe$P+p!ycpQk@yu@BN7|h}q(|Gu zu$*mkogAz^o4gw&fI}P!yj0b)vsxrl)IiT)8XRA*yZ-LKEsJ|WZ9ME7$A^ne;&5k` z)KNrxz#d`~NL4aaG}y>Xzok7JK4A3%w7Y(vKl()fg+`CFy7X3N-cSyrW8}a=E5(eY zswRJY>-*eK%+rv^-7rAONJcB6W9A5GSzqQ7{tKDCM!#iJo*$k|Oe!b^sDxNi1X1g{ ztGl!6aS+I|v6i#!^4{2~Kg>)0vaRE*G2RQWUtDinQlAU2b!~cKseiBI6o(m5bBLkE zKn|Lq#k;4pFCCXlR&wu~*5$uK19tONuYdmNeSQSWpj9=Dg6=5_=Cr+f&+`J`C3T}M z0WfuGe!0yRzi-~YK!dS+=J+=qdn0k#o_2K7`bV-<{3EHpX-;~7=V^$ZMBLU(rUD)s zMf=h^llNZEy&XL`yi(n$Km!=lVDvmznJDM-6k)eYREPT$?DFp_> z@@R+2*aOC(VovBLz^MdugVy7ph4nkQz|dKF!kLrgWJQb0ifmOV0mUf!gYhoH4=e5H zusanCIn)O#suu$pqEJLtmc=*V#2*uIT=gndaqpHF(BfX`M_E_L<-f{$?}ymB z2>{a&D$YZ!UnIMfN5}b+5qWk%j}@E2>_19|!wxlOhI8Pcr()eyrE@g16-wlp{fupU z9+9~hK;?K}1w&3BLifCtWapk-ttBd!f`m9&!Wo&P8#3aQl*XgkCm(#+1G(qo|LB(z zeoz6eLZc*Ll!Pcqk%if@AEUsmuXA^q_Wz?Ey>%fnTz=0U-I?oW=?4NZ7VyCI-0|Cf z$SJU2xwcf)m3(;wuw{%$K^E$c52R<3Ta`qIYAoYRBeb^UHgZ(=)XqKeybhB!N!*E zi=^fnOoCbK3EnuliusGy=V&f$zaDMg?*Eb54z+HD5!GkWGwD0ysMZ4Vyg(H)5~NCL z2?QXZ!W;+W7XHBE_Lb334bWi4jK$@>ZR(e$w3g+q#VVx=@5l42eHV{I$HZ{iARlPe z?s0p>H_XvHSS8PC`v&p;SB?5MCnzpSqym0pVD3iQ)5w}<+n(3~nq>b4g1Jl=gmhW% zfdB@VJ(*=Uyw9%Ak1D8ie)Kk6M&HxpcLXgnffgru;DaWfBvi2Wyu9K3H~ZSUZBt*` zfGwfjhXZqL&yij+at?txzrY#$URvl49RH3Au;oyH>o<9mnM{BK&2nc;Y5n(dq~XqygWCR>63ZQYaY6rXm%A-spa@Ca-vnr_(!cWb`JPOp=F0bKjQKx7d8Wq4-b%^Fvq+rk+aW=<1{d}csK+dWRo$+*0x z+3eAs^M$7EVcS(PF@m%=XkH;wR@OJ~%b(W;hCk6=x;VC`cwl;YnPj(%Axbt~{Vz$_{D- z&;)?KolGdM)_7Ng4+1D8)aKMcH3m*j+feRZI&AS{txxkLM*kVhoB+WTW*~6nKLlYN zjmT~y8x5JIFMBB^K2NOVAx^`GaJs$lU}h|*Z_}~(W9lW>M-Pu%oKuG#&DoJL8ul2W zpi>{5yQ$zsbOX-6I67W8%3Vb`jq5=#0}dxn7D?hToQ?PqsRGpW|8~`vpXNBaoO?M~ zqKv2&^MU|ym1%3T)${|g)}l@}6&?#Qa?yWQA;X0ECi= z_NQb4#`=a)K@{b(T;+~nWk?ml4Bw=(pW(syj{n%BNC|*Ebul9UkN6EYvqf&Ei-qBU zVCgE>F0)>=Me!hC`NWu(e#3K<0408KUk}#Y`;fg?p6|TP1T}A-ZbA3TWKm$_0>nn2 z58ct4#S#zC-2z3y1Djx;`+D9_U%_QYMQsF(@DXmTM096rV~b4)k-s1oB{L9&TyUgWWyNYBh>|}me%pf zO%Ha(1&M{=#szhO$RWLmo`ir97hoIU(;L*cSsWyr#+|apQK#&*#)scrFpxBASO-G@ zhi#(E=M|=D@=%&XUsah$Q}jqBd(_|*5~i64nk(p1+oaeFJ}^~&??SCguKJaPnp9>7 z6wzA~;9ji)Ce(VF#Uzt8Vg-m1;f%OmxnBh}o+G>FQ`T*ijfMhVbtI8*H;T_}<+CMa zrRU`+T}~8p)yxHrKn#J_)FoBhXzD>dI-ce7Dk%g8Ty{>*ZSL#^tE@%XKvt-r!)eG| zRM;01gjA8XR7nV;MH7~FQD6M(HWuy+b)dtjQ+&bdk~kA&FMuk|e9P;jXmu*%g*?LFZ~i zMK0MW932#AweuyJm~{t4Q`6|ha6pq8dR!eBI7B_BjVh?5?mir-?kW>rE8@C(0oQGh zdZRZkca0fpfV1-QdEsK9*vlc_Gpd8ib?(%>8LE&S_kmqJZ)p0-cw-a-3=#QaXR#dXaVxR6lF&#;MWDTI}bL^)t zABVuw&f~F<>I?&mcx(PzrXr@K`@D@jcDAx15>p_PG69OmfA7o{K+78GdG{IuFd`VY zL--O}P@B|4PRYK+2WV#G>r`H+(IW+oHgLe|G{O|6ZFbcZBHNsD`~964=K_ zzk0a+-wnuQk5^cn`z=^Q@bDQl^}`ga6VI>Vzg!zH{&&+2IRJWq?y7Qc69*{j3#1EM zK7)e#1CH7|V0cUIpSE{zc?6^;{S)=HL;ZhUyu3W*aunvDFEi&4stEU{Ti6OF&Z)9l_~}xL zD1tG_7AsUCj`bXC9a4t0kld*eJMS~TMx>)ffqO)38AS{A(BS}}fRmx&oBjWE12$LE z`qnjRmcEMjenv`3+`Uo`*q-vst*av5bPM*G_yhAy3=sflnkuY8&WcvatTjqB)Je3c zJ;$)QZ%i7To&a9N6?69Lf2W<&p)??C^=RCW8FNR@v)kij1N(Z$L4eb1eu0_rmg{{2v3SP?|dun$#&6{i?-hSV}+ znb9C$XNXE~)wmi{(crW^538aDAPcn>jspBWZ_FRegF4b~w{yCktx^%e(P1mNA-e#r z8n-07nvDzF4^cEE0|A7L1v%SBh69E!YivGVzQ!<4DlD z+0+~4C!D$wyQVZp>h;wB{V#IHXvStM-tf;@BbjvI*!Y$*s%%PyT`u<`ED1dXsJTGv zf8=9u>dcCL@uB3V?UYVI0a@kMcNn+u!xGUC|JJz@I^tZ$904Dt&(a%X}f+E`9HIzbLlz zeOjkLs3j*l&{t<|Thg85X7JJ2)eDD`8`;J25-d6-)_FwXCz{b+PKL@Z)AP`YNFzr1 zKZPQ8{sP9{GyDqrT#o!OuDeX$hU?wqcmy=E=ZU)(BlYG1AKzbp(W{}8Z@PSj8@T4)*%=QW8aTA8XhZH)8}&Qv zfB<7_C?=yennJT{?X;tHG^lhoS>^Nr=83)S*-^?i19cLSwfxcq(6uT;Y$tzt|GRYe zp7h=AT{?X8kcl{)N{^{6VI{NYM&bYLE~oa=vH1D=ZJax*1%nHP5GO�IGJ@Lx*L{ z64ZOp(UAp&f)P|Mu;DdX8Jl7kyog__A(A|~m)mpHp9`g&Kq1UXP;Qm~uQi`qF`ozN zr#poGdjn59qiPXZP^`WnR@XQy#@A!Y*_uE|^kkO*?yvZ4Yn zGh!K+y#1$Z8&$is&wRzJ+(^Axv>wky(y3lL&MZP0iA$sqJ79FWMd!A+pQoS zJ=J1-Abkq`hGSaFir@acqM05hEYp)iNj--#>jvzNp&rPotkqp%U zdU03i=_EMCO$P}eJIW>r1SkMPr$9CtVk-%izyL)MG@6QYZ6HKyi=$2$=hK8q4RD83 z1%*IZ6C)`y)G7%Q1Vxb`8$~j-kYWLWLI5<8rWv48TYGBNo`CGY1O|8jQb9E%hY z!Js1*2=ISJY9qDU$`Mv>9EwP=&_zf)SQ!~xq*IX$i)mPmR075VvPc)S0*H|s-G-nb zOeZOz!cwIxiUFxH>6Gg^h!M6Rfc_5FU{cbcMQ|`SX~QCbaH|ohZ;Rw@U{1PFZf*f% zgNr6bZHp~EYgQsiVFKz8b GBwGLsxTt^t literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_scaleup.png b/docs/reST/tutorials/assets/surfarray_scaleup.png deleted file mode 100644 index ff1f15e72dbe042cc29904186d1265030b6658b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67759 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�{_kdr_9iqDhT0G7}abSFxRQiSd?>t46sfv@Cvi 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 W*pbB;PryAzQiO@ISc^f=ZnOZfvTWS| literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_striped.png b/docs/reST/tutorials/assets/surfarray_striped.png deleted file mode 100644 index 2ca4a79d3726118b4d42ac3fbef03ac33cda72ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^VD$HNaSW-L^Y+R{K?VgLX2V1O ztlJGkKFm7s{L%9_^DHj^y>^wk&Rq3`mSY6xAuoZjrVT*B&u>~j|yRg1pBo41$X5mr#wVz!r HtzHfQldKWL literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/surfarray_xfade.png b/docs/reST/tutorials/assets/surfarray_xfade.png deleted file mode 100644 index 8b907068d42d43ef3d953688e48193ccf73b1b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41834 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/tom_formulae.png b/docs/reST/tutorials/assets/tom_formulae.png deleted file mode 100644 index f04b482a55a4fe7b257ddc3ebcad4b9453bc1c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6763 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 MilU}M8Okc;e-u&jXaE2J diff --git a/docs/reST/tutorials/assets/tom_formulae.webp b/docs/reST/tutorials/assets/tom_formulae.webp new file mode 100644 index 0000000000000000000000000000000000000000..651c20db9d38a218887f48bf89e125077b555b3f GIT binary patch literal 2626 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 literal 0 HcmV?d00001 diff --git a/docs/reST/tutorials/assets/tom_radians.png b/docs/reST/tutorials/assets/tom_radians.png deleted file mode 100644 index 4569df1cb4ab3aef4c064b3a71f0fdb8af0c9bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17409 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

    3I44^ zD+m64WpK}Lr%y^3Ht_n$!@Y|mwAc22LW!o%j)E6byS-|%tH=WD(db#0uy zqqs#F_CXYsj49>8rK$y5>-GybD3rfuwUTPmwc#P=;9mHnpCc@bz=dQoauPFYt@Y(d z-ly=n;Xd$$D`m}um66txmX*W2Gl1#NGzB)^|WfeVi7J4{zYjmgAO5tk3GCV@vURxX6du-sB zKQw%DDl~FvU|uF3a(Sco5?NE_&Dr5XZ2axhgGM67!m)8@(^oLL^{9IbUpfL`2>`t( zprkTpDi2wA2lqK4Y>zy#kG0$D#9-O#h&nlOr$d3-@3r~XT|rNczNt*(D+q6C6)JBx zLH2NvoPO1?s}`kR-czy-^5KSMdQdg%2aRHQl6JBb73+gRT#*3Z% zBQ~#>JKuGKHUMQf&E7Q7p#y-H7pM(V3fLXj>cWN+z%9t+QkMc!w54h;Cf;cOJ0O|3aMm%R8Um*RWt)F!EZhlVAa2Zn`i8X zS!bNM@xh;tPPMl&==GyjENKoFpb6; zk36`Z(vxVZT|7z$J-r@A8pY1WE{7=lakJy$*d@A#yM}RUjvzHgi3P{H6l{NvOf8;Iotx?p{FDCr%QVoG!vLmF=KT&Q-zJ3+O5?0`ha2 zihi0xK0@d&$=9po(XqE?u05HEO->B{z!Dou#rh)&`}{eH{_PUj;ESto4j#xasIt>3 zv8*=(1JY>EP30^H!=ARRJRG7ecQhW?E__iD&^!ngE8|aeO7NR3a;^sJ@|@v4)VH;@ z)eXZlTPcUh<%d8`S1!U6BDPIpBsj4pUO=2 zUO|_<(H2IBK-`!Iha7@cs)u?Wso4NIb4nUjvci&ZR3ozo&)$%;ZtH;|7a#4$y1!0X zsM=ZL0Aq*`Fb7LX`dcZ9+WyL5-X;O4Rys@0p%aM4_x4D6t;y>@YF!nOkpG8erO|+E z_g7H}YnE|*D~lYW&kT_x(GSU{TK;9^d@!ex`oBY}2xogX*qea0{j8B+Ni8pRjN{N}ZEAd^qBHk*D7_p~?WB@v@YE}2$&C^um0Z`dUSuLXAi7{nu#eC=V zWehEN;WA=8znjA{1z%?DNWLIZcspqzB?3$KVssW<;B2N%_4{T%xp4226Ozn zF)?S9r#>cFdglVh^xJFYi3HTP>7DS}u}K9zblvWiVcZLcTJnh|fXz@m55cg)JU^N1 z3uz5O40Y1p%Ycm+Wk)v7JYVZape6&IO`ft}QGx$QtVKfRsrE4k#$YT_d599#c9!_1 zD)`Z9u!9-?`pY@K`vzymPR-Y)CvQ~`y@Lfw*{pe7&SfA9u$A50!y6=1Cv^kKw!CTZ*KY9bIY zBu7|^f97*~&bXf(_iKJxG8mvZTsR3(ur1}U4?ffPorPjN;heC{#N6Kf+g};DQj^&& zz>x5mHD%VE>VvEP!C-nzn}0lhVRRMX7hXi)8MEk3*y-R@QFGK1<;Tmj=^7-h7i5IN zkRCnhmbl_lCifMUbbETC8gc>6-8y9gCpb!kqxHrUFkzRs5!+WRAzTNc?WOxL&}>MY zzJIH~RfTLG!8hq9aihEx_}a8wvcE!+cV3WrGs(P{f1~|gJ)YDm+qaa5^r+{20&l7l zf)g7_kr8cSOLnEk@qKs#qRJ z;rt>o;J1S`%4*F+L z`BMf|lwdCz6-npWZnq=>X5SN%YS$*oCS#s$-Tnp!f~N+juso}_q<68T*k#ap zvGNi<%2XtURl-^{zB;2O{@voBV1{MZ)=B#-wLbLPdqiZzzzeF1*49w-5nErXWJdzA z2gFBtliMeBt%l7doxmu1ZE^=&uhm8%YNY+ie>2ZTL!DmBFgXH_xzk9Z3=Vj+pT%x| zf7RWUP1WY!RFNTb!6aVeI28gRRXqP*0Ds@tNTZ39;JFL$!Lar1@GEZ$XlLj-$;2** zVwJs~X}^bfQ{_`O>y8JxV||EGcYw6b+VyZ@UroxdR!RiX&s7h9)p9=*I5q~|b!I8| zVwq!EMWSCVEvRX&_0pJv8tYSfl07otB4k0*g4fnDnYE}{YUKCiq+vaz=+h%%jh)*Z zgR11#>Sn26Yae$hoX1zRr9B?-Pf}X4QyTS1ly0Z zL@=s3_6M7xH$LIImc&guNKs1~-%DNnrdd#v{Mhf<28&v*REL`|~@_Tm>{KNzzU5 z6x#fB*f3a?uMV3@BAOb5rX?oBN#CznsLyW`ipp7;>R40Ga>Gpz?<4Lc?A}WrvMOI7 z5`G%Im{x4AtH@%EiJ&YNC|50rBG~pF>_(~=e|Bv@di7NhbZYBO8pW{H-jG0ELmV`pR|lb zvxX+k3L(sTj0;bFH+54DL4J*5;w}3r=}fOGWy_4denkN($H{hmL#4vx?Xka|=NIu8 zgyu)#VZeGoywiV6$6LVpl&PdY=6knGNDp(K>!-JO?}4wF@U)YF{am$?KS$U{7VdMk zf-jhWc|HW)TN%Ek-BT>)ySVJ^ZL4X#@s{_7;1EQ~Eto>2b H`O*IY`E>=u diff --git a/docs/reST/tutorials/assets/tom_radians.webp b/docs/reST/tutorials/assets/tom_radians.webp new file mode 100644 index 0000000000000000000000000000000000000000..97f004d787f3cbcae947e427656019546be0b74f GIT binary patch literal 9758 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 diff --git a/docs/reST/tutorials/en/intro-to-pygame.rst b/docs/reST/tutorials/en/intro-to-pygame.rst index 95e6a44764..345e7e0568 100644 --- a/docs/reST/tutorials/en/intro-to-pygame.rst +++ b/docs/reST/tutorials/en/intro-to-pygame.rst @@ -62,7 +62,7 @@ animation with 7 lines of code. Let's take a look at a friendlier version of that same thing. This should be simple enough to follow along, and a complete breakdown follows. -.. image:: ../assets/intro_ball.gif +.. image:: ../assets/intro_ball.webp :class: inlined-right .. code-block:: python @@ -77,7 +77,7 @@ along, and a complete breakdown follows. screen = pygame.display.set_mode(size) - ball = pygame.image.load("intro_ball.gif") + ball = pygame.image.load("intro_ball.webp") ballrect = ball.get_rect() while True: diff --git a/docs/reST/tutorials/en/intro-to-surfarray.rst b/docs/reST/tutorials/en/intro-to-surfarray.rst index df6756440c..89bafe00c1 100644 --- a/docs/reST/tutorials/en/intro-to-surfarray.rst +++ b/docs/reST/tutorials/en/intro-to-surfarray.rst @@ -267,7 +267,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_allblack.png + .. image:: ../assets/surfarray_allblack.webp :alt: allblack :: @@ -286,7 +286,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_striped.png + .. image:: ../assets/surfarray_striped.webp :alt: striped :: @@ -307,12 +307,12 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_rgbarray.png + .. image:: ../assets/surfarray_rgbarray.webp :alt: rgbarray :: - imgsurface = pygame.image.load('surfarray.png') + imgsurface = pygame.image.load('surfarray.webp') rgbarray = surfarray.array3d(imgsurface) surfdemo_show(rgbarray, 'rgbarray') @@ -330,7 +330,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_flipped.png + .. image:: ../assets/surfarray_flipped.webp :alt: flipped :: @@ -347,7 +347,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_scaledown.png + .. image:: ../assets/surfarray_scaledown.webp :alt: scaledown :: @@ -365,7 +365,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_scaleup.png + .. image:: ../assets/surfarray_scaleup.webp :alt: scaleup :: @@ -392,7 +392,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_redimg.png + .. image:: ../assets/surfarray_redimg.webp :alt: redimg :: @@ -412,7 +412,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_soften.png + .. image:: ../assets/surfarray_soften.webp :alt: soften :: @@ -445,7 +445,7 @@ that displays an array on the screen. .. container:: example - .. image:: ../assets/surfarray_xfade.png + .. image:: ../assets/surfarray_xfade.webp :alt: xfade :: diff --git a/docs/reST/tutorials/en/premultiplied-alpha.rst b/docs/reST/tutorials/en/premultiplied-alpha.rst index 27147d8c5f..73313be5d1 100644 --- a/docs/reST/tutorials/en/premultiplied-alpha.rst +++ b/docs/reST/tutorials/en/premultiplied-alpha.rst @@ -190,7 +190,7 @@ copy it into a 'fonts/' subdirectory or use an alternative font. The issue is vi fonts but more obvious on some fonts than others depending on how much they rely on alpha pixels for visibility. If you run this program you will get a result that looks like this: -.. image:: ../assets/straight_alpha_composition.png +.. image:: ../assets/straight_alpha_composition.webp :alt: Example of Straight Alpha Composition Which, to my eyes, makes the text difficult to read and something of a strain on the eyes. @@ -245,7 +245,7 @@ If we rewrite the example to use premultiplied alpha composition instead: You then get a result that looks like this: -.. image:: ../assets/premultiplied_alpha_composition.png +.. image:: ../assets/premultiplied_alpha_composition.webp :alt: Example of Premultiplied Alpha Composition Which is a lot easier to read. diff --git a/docs/reST/tutorials/en/tom-games2.rst b/docs/reST/tutorials/en/tom-games2.rst index c0111d6038..af70ed0fd1 100644 --- a/docs/reST/tutorials/en/tom-games2.rst +++ b/docs/reST/tutorials/en/tom-games2.rst @@ -20,7 +20,7 @@ For the sake of revision, and to ensure that you are familiar with the basic str a basic Pygame program, which will display no more than a window with some text in it, that should, by the end, look something like this (though of course the window decoration will probably be different on your system): -.. image:: ../assets/tom_basic.png +.. image:: ../assets/tom_basic.webp The full code for this example looks like this:: diff --git a/docs/reST/tutorials/en/tom-games4.rst b/docs/reST/tutorials/en/tom-games4.rst index 43818884bf..42ca1927a8 100644 --- a/docs/reST/tutorials/en/tom-games4.rst +++ b/docs/reST/tutorials/en/tom-games4.rst @@ -124,7 +124,7 @@ The angle is measured in radians, and will give you the direction in which the b moves. So by using this vector, we can determine the direction and speed of the ball, and therefore how much it will move on the x and y axes: -.. image:: ../assets/tom_radians.png +.. image:: ../assets/tom_radians.webp The diagram above illustrates the basic maths behind vectors. In the left hand diagram, you can see the ball's projected movement represented by the blue line. The length of that line (z) represents its speed, and the angle is the direction in which @@ -139,4 +139,4 @@ trigonometry, and can be done with the formulae shown in the diagram. If you've studied elementary trigonometry before, none of this should be news to you. But just in case you're forgetful, here are some useful formulae to remember, that will help you visualise the angles (I find it easier to visualise angles in degrees than in radians!) -.. image:: ../assets/tom_formulae.png +.. image:: ../assets/tom_formulae.webp diff --git a/docs/reST/tutorials/en/tom-games5.rst b/docs/reST/tutorials/en/tom-games5.rst index d8353cf565..b41ad81a21 100644 --- a/docs/reST/tutorials/en/tom-games5.rst +++ b/docs/reST/tutorials/en/tom-games5.rst @@ -68,7 +68,7 @@ with any attributes set back to their necessary values. Next, the way in which t ball, because here its movement is simple (up/down), but it relies on the user telling it to move, unlike the ball which just keeps moving in every frame. To make sense of how the bat moves, it is helpful to look at a quick diagram to show the sequence of events: -.. image:: ../assets/tom_event-flowchart.png +.. image:: ../assets/tom_event-flowchart.webp What happens here is that the person controlling the bat pushes down on the key that moves the bat up. For each iteration of the main game loop (for every frame), if the key is still held down, then the ``state`` attribute of that bat object will be set to diff --git a/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst b/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst index f4d65642b2..9f0f561439 100644 --- a/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst +++ b/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst @@ -48,7 +48,7 @@ del chimpancé para ti mismo en el directorio de ejemplos. (no, este no es un anuncio, es una captura de pantalla) - .. image:: ../assets/chimpshot.gif + .. image:: ../assets/chimpshot.webp :alt: chimp game banner :doc:`Full Source <../chimp.py>` diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/1.\355\224\204\353\241\244\353\241\234\352\267\270/\354\206\214\352\260\234.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/1.\355\224\204\353\241\244\353\241\234\352\267\270/\354\206\214\352\260\234.rst" index b82626d373..fff06c2afb 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/1.\355\224\204\353\241\244\353\241\234\352\267\270/\354\206\214\352\260\234.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/1.\355\224\204\353\241\244\353\241\234\352\267\270/\354\206\214\352\260\234.rst" @@ -16,7 +16,7 @@ Contact: rumia0601@gmail.com 게임도 프로그램의 일부이기 때문에, 게임은 입력, 처리 그리고 출력으로 구성된다. C 콘솔 환경에서 게임을 만든다고 가정해 보자(C로 소스코드를 작성한 후 콘솔에서 실행하는 방식). 그러면 입력은 수많은 scanf(또는 엔터 입력 필요 없는 비표준 getch) 함수로, 처리는 항상 절차적으로 실행되는 복잡한 알고리즘으로, 출력은 아스키아트를 이용한 printf(그리고 화면을 지우는 깜빡거리는 clear)함수로 구성할 수 있다. 하지만 이렇게 만든 게임은 구식이고, 그래픽 없는 CUI고, 끉겨 보인다는 단점이 있다. 이런 식의 게임을 만드는 것이 질린다면, 보통 Unity 게임엔진이나 Unreal 게임엔진 등 게임 엔진에도 손을 대보게 된다. 하지만, 게임 엔진은 입문장벽이 높다는 단점이 있다. 복소수좌표를 활용한 공간상에서의 충돌, Mechanin/Legacy 애니메이션 호환성, 더 좋은 그래픽을 위한 더 큰 메모리/더 빠른 CPU… 아무래도 콘솔 환경과 게임 엔진 사이에는 딜레마가 있는 것 같다. 이 딜레마를 해결할 수 있을까? -.. image:: ../../../assets/introduction-PuyoPuyo.png +.. image:: ../../../assets/introduction-PuyoPuyo.webp :class: inlined-right .. code-block:: python @@ -31,7 +31,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("introduction-PuyoPuyo.png") + ball = pygame.image.load("introduction-PuyoPuyo.webp") ballrect = ball.get_rect() while True: @@ -51,7 +51,7 @@ Contact: rumia0601@gmail.com (C 콘솔 환경 게임의 예시 - 뿌요뿌요) -.. image:: ../../../assets/introduction-TPS.png +.. image:: ../../../assets/introduction-TPS.webp :class: inlined-right .. code-block:: python @@ -66,7 +66,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("introduction-TPS.png") + ball = pygame.image.load("introduction-TPS.webp") ballrect = ball.get_rect() while True: @@ -88,7 +88,7 @@ Contact: rumia0601@gmail.com 다행히 파이게임은 그 딜레마를 해결할 수 있다. 파이게임 이란 프로그래머가 게임을 만들 수 있게 해 주는 파이썬의 외부 라이브러리이다. 파이게임은 콘솔 환경에서의 장점을 가지고 있다. 그 첫째 장점은 하나의 파이게임 프로젝트은 하나의 소스코드와 거의 동치관계라는 것이다. (외부 소리 파일이나 외부 사진 파일을 제외화면) 그래서 프로그래머는 소스 코드를 작성하는 것에만 집중하면 된다. 그리고 둘째 장점은 파이게임은 툴이 아닌 라이브러리이기 때문에, 소스파일에 “import pygame”만 있으면 그 소스파일은 파이게임의 모든 것에 접근할 수 있게 된다. 접근성이 좋다는 것이다. 파이게임은 게임 엔진의 장점도 가지고 있다. 그 첫째 장점은 파이게임이 키보드, 마우스, 파일 등의 상태를 확인하는 입력 관련 함수들과, 도형 그리기, 색 칠하기, 디스플레이 설정 등의 출력 관련 함수들을 제공하기 때문에, CUI가 아닌 GUI 환경에서 실행된다는 것이다. 그리고 둘째 장점은 파이게임이 파이썬에 기반하였기 때문에, 파이게임의 함수들은 절차적이 아닌 이벤트적(여러 함수들이 선택적으로 실행되거나 거의 동시에 실행됨)으로 실행된다는 것이다. -.. image:: ../../../assets/introduction-Battleship.png +.. image:: ../../../assets/introduction-Battleship.webp :class: inlined-right .. code-block:: python @@ -103,7 +103,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("introduction-Battleship.png") + ball = pygame.image.load("introduction-Battleship.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/2.\355\205\215\354\212\244\355\212\270 \354\266\234\353\240\245/\352\270\260\354\264\210 \355\205\234\355\224\214\353\246\277\352\263\274 \354\266\234\353\240\245.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/2.\355\205\215\354\212\244\355\212\270 \354\266\234\353\240\245/\352\270\260\354\264\210 \355\205\234\355\224\214\353\246\277\352\263\274 \354\266\234\353\240\245.rst" index 47173e2361..bd69b1b595 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/2.\355\205\215\354\212\244\355\212\270 \354\266\234\353\240\245/\352\270\260\354\264\210 \355\205\234\355\224\214\353\246\277\352\263\274 \354\266\234\353\240\245.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/2.\355\205\215\354\212\244\355\212\270 \354\266\234\353\240\245/\352\270\260\354\264\210 \355\205\234\355\224\214\353\246\277\352\263\274 \354\266\234\353\240\245.rst" @@ -16,7 +16,7 @@ Contact: rumia0601@gmail.com 앞서 말했듯, 파이게임은 GUI를 기반으로 한다. 정확히는, 파이게임은 2D용 입력, 출력 함수를 사용하여 2D GUI를 기반으로 한다. 어찌됐든, CUI환경에서만 먹히는 파이썬의 print함수나 input함수와는 이별을 해야 한다. 그렇다면, 파이게임의 어떤 함수가 print/input함수를 대체하는가? 우선, 프로그래밍 언어의 기본 형식과 출력을 배우는 친숙한 예제인 “Hello World!”프로젝트로 되돌아가야 한다. (이 프로젝트는 같은 디렉토리에 .ttf확장자를 가지는 폰트 파일을 필요로 한다.) -.. image:: ../../../assets/Basic-ouput-sourcecode.png +.. image:: ../../../assets/Basic-ouput-sourcecode.webp :class: inlined-right .. code-block:: python @@ -31,7 +31,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Basic-ouput-sourcecode.png") + ball = pygame.image.load("Basic-ouput-sourcecode.webp") ballrect = ball.get_rect() while True: @@ -49,7 +49,7 @@ Contact: rumia0601@gmail.com pygame.display.flip() -.. image:: ../../../assets/Bagic-ouput-result-screen.png +.. image:: ../../../assets/Bagic-ouput-result-screen.webp :class: inlined-right .. code-block:: python @@ -64,7 +64,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Bagic-ouput-result-screen.png") + ball = pygame.image.load("Bagic-ouput-result-screen.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/3.\355\205\215\354\212\244\355\212\270 \354\235\264\353\217\231/\352\270\260\354\264\210 \354\262\230\353\246\254.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/3.\355\205\215\354\212\244\355\212\270 \354\235\264\353\217\231/\352\270\260\354\264\210 \354\262\230\353\246\254.rst" index 398ed8149f..7ce0f89cdc 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/3.\355\205\215\354\212\244\355\212\270 \354\235\264\353\217\231/\352\270\260\354\264\210 \354\262\230\353\246\254.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/3.\355\205\215\354\212\244\355\212\270 \354\235\264\353\217\231/\352\270\260\354\264\210 \354\262\230\353\246\254.rst" @@ -16,7 +16,7 @@ Contact: rumia0601@gmail.com 이전 프로젝트는 게임이 아니라 이미지 한 장 같아 보인다. 출력을 바꾸는 입력이나 처리가 없기 때문이다. 물론, 윈도우의 종료 버튼을 누르는 것은 고려되지 않는다 (프로그램을 종료하는 것에 불과하므로). 우선, 우리는 “Hello World!”가 자동적으로 움직이게 할 것이다. 그러면 이제 프로젝트는 이미지 한 장이 아닌 애니메이션 같아 보일 것이다. 어떻게 텍스트를 움직일까? 우리는 텍스트의 위치가 Initial statement에서 초기화됨을 알고 있다. 그렇다면, 이 위치가 Always statement에서 업데이트되게 하면 된다. 물론, 추가적인 변수가 필요할 것이다. -.. image:: ../../../assets/Bagic-PROCESS-sourcecode.png +.. image:: ../../../assets/Bagic-PROCESS-sourcecode.webp :class: inlined-right .. code-block:: python @@ -31,7 +31,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Bagic-PROCESS-sourcecode.png") + ball = pygame.image.load("Bagic-PROCESS-sourcecode.webp") ballrect = ball.get_rect() while True: @@ -49,7 +49,7 @@ Contact: rumia0601@gmail.com pygame.display.flip() -.. image:: ../../../assets/Bagic-PROCESS-resultscreen.png +.. image:: ../../../assets/Bagic-PROCESS-resultscreen.webp :class: inlined-right .. code-block:: python @@ -64,7 +64,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Bagic-PROCESS-resultscreen.png") + ball = pygame.image.load("Bagic-PROCESS-resultscreen.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/4.\355\205\215\354\212\244\355\212\270 \354\241\260\354\242\205/\352\270\260\354\264\210 \354\236\205\353\240\245.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/4.\355\205\215\354\212\244\355\212\270 \354\241\260\354\242\205/\352\270\260\354\264\210 \354\236\205\353\240\245.rst" index 93e581ea70..d0e9c499d4 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/4.\355\205\215\354\212\244\355\212\270 \354\241\260\354\242\205/\352\270\260\354\264\210 \354\236\205\353\240\245.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/4.\355\205\215\354\212\244\355\212\270 \354\241\260\354\242\205/\352\270\260\354\264\210 \354\236\205\353\240\245.rst" @@ -16,7 +16,7 @@ Contact: rumia0601@gmail.com 생각해보면, 우리는 무언가를 출력하는 방법을 먼저 배우고(“Hello World”를 생각해봐라) 무언가를 입력하는 방법은 나중에 배운다. 왜 그런가? 왜냐면 입력은 몇몇 프로그램에선 필수조건이 아니지만, 출력은 모든 프로그램에선 항상 필수조건이기 때문이다. (프로그램의 정의: 0개 이상의 입력, 1개 이상의 출력) 그러나, 모든 게임은 입력이 필요하다. 그것이 우리는 “나는 게임을 Play한다”라고 말하는 이유이다. Play라는 단어는 몸의 일부분(아마도 손가락)을 움직인다는 뜻이다. 어쨌든, 이 프로젝트가 진짜 게임이 되기 위해 입력 로직을 추가해보자. -.. image:: ../../../assets/Bagic-INPUT-sourcecode.png +.. image:: ../../../assets/Bagic-INPUT-sourcecode.webp :class: inlined-right .. code-block:: python @@ -31,7 +31,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Bagic-INPUT-sourcecode.png") + ball = pygame.image.load("Bagic-INPUT-sourcecode.webp") ballrect = ball.get_rect() while True: @@ -49,7 +49,7 @@ Contact: rumia0601@gmail.com pygame.display.flip() -.. image:: ../../../assets/Bagic-INPUT-resultscreen.png +.. image:: ../../../assets/Bagic-INPUT-resultscreen.webp :class: inlined-right .. code-block:: python @@ -64,7 +64,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("Bagic-INPUT-resultscreen.png") + ball = pygame.image.load("Bagic-INPUT-resultscreen.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/5.HP\353\260\224/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\262\230\353\246\254.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/5.HP\353\260\224/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\262\230\353\246\254.rst" index 4111aca87f..0033513b5a 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/5.HP\353\260\224/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\262\230\353\246\254.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/5.HP\353\260\224/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\262\230\353\246\254.rst" @@ -12,7 +12,7 @@ Contact: rumia0601@gmail.com 우선, 텍스트가 아닌, 도형을 시각화 하겠다. HP 바는 어떤가? 만약 HP의 최대값이 고정되어 있고 오직 현재 HP 값만이 변한다면, 이 두 데이터를 출력하는 가장 쉬운 방법은 무엇인가? -.. image:: ../../../assets/AdvancedOutputProcess1.gif +.. image:: ../../../assets/AdvancedOutputProcess1.webp :class: inlined-right .. code-block:: python @@ -27,7 +27,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess1.gif") + ball = pygame.image.load("AdvancedOutputProcess1.webp") ballrect = ball.get_rect() while True: @@ -44,7 +44,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputProcess2.gif +.. image:: ../../../assets/AdvancedOutputProcess2.webp :class: inlined-right .. code-block:: python @@ -59,7 +59,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess2.gif") + ball = pygame.image.load("AdvancedOutputProcess2.webp") ballrect = ball.get_rect() while True: @@ -76,7 +76,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputProcess3.gif +.. image:: ../../../assets/AdvancedOutputProcess3.webp :class: inlined-right .. code-block:: python @@ -91,7 +91,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess3.gif") + ball = pygame.image.load("AdvancedOutputProcess3.webp") ballrect = ball.get_rect() while True: @@ -110,7 +110,7 @@ Contact: rumia0601@gmail.com 변수의 값이 변할 때마다 텍스트를 다시 렌더링 하기만 하면 된다. 변수의 값은 어떻게 바꾸는가? 그것은 Event문에서 이루어진다. (키보드 위 또는 아래를 눌러 HP를 조절하게 하였다.) 이전과 동일한 방법이다. 하지만, 이것들은 여전히 텍스트이다. 아직 충분히 시각화 되지 않는다. 이 데이터들을 어떻게 더 상세하게 시각화 할까? 총 탄창에서 아이디어를 따올 수 있다. HP는 정수 값이고, 불연속적 값을 가지므로, 아래와 같이 출력될 수 있다. -.. image:: ../../../assets/AdvancedOutputProcess4.gif +.. image:: ../../../assets/AdvancedOutputProcess4.webp :class: inlined-right .. code-block:: python @@ -125,7 +125,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess4.gif") + ball = pygame.image.load("AdvancedOutputProcess4.webp") ballrect = ball.get_rect() while True: @@ -142,7 +142,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputProcess5.gif +.. image:: ../../../assets/AdvancedOutputProcess5.webp :class: inlined-right .. code-block:: python @@ -157,7 +157,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess5.gif") + ball = pygame.image.load("AdvancedOutputProcess5.webp") ballrect = ball.get_rect() while True: @@ -174,7 +174,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputProcess6.gif +.. image:: ../../../assets/AdvancedOutputProcess6.webp :class: inlined-right .. code-block:: python @@ -189,7 +189,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputProcess6.gif") + ball = pygame.image.load("AdvancedOutputProcess6.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/6.\353\262\204\355\212\274\353\223\244/\354\213\254\355\231\224 \354\236\205\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\266\234\353\240\245.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/6.\353\262\204\355\212\274\353\223\244/\354\213\254\355\231\224 \354\236\205\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\266\234\353\240\245.rst" index 907dc206af..ba068bd05b 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/6.\353\262\204\355\212\274\353\223\244/\354\213\254\355\231\224 \354\236\205\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\266\234\353\240\245.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/6.\353\262\204\355\212\274\353\223\244/\354\213\254\355\231\224 \354\236\205\353\240\245 \352\267\270\353\246\254\352\263\240 \354\213\254\355\231\224 \354\266\234\353\240\245.rst" @@ -12,7 +12,7 @@ Contact: rumia0601@gmail.com KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 것처럼 보이는 이유는 GUI가 입력은 없고 오직 출력(프린트)하는 데에만 사용되었기 때문이다. GUI에서의 입력이란 특정한 위치에서의 마우스 이벤트를 처리하는 것이다. HP를 증가시키거나 감소시키는 버튼 2개를 만드는 것은 어떨까? -.. image:: ../../../assets/AdvancedInputOutput1.gif +.. image:: ../../../assets/AdvancedInputOutput1.webp :class: inlined-right .. code-block:: python @@ -27,7 +27,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedInputOutput1.gif") + ball = pygame.image.load("AdvancedInputOutput1.webp") ballrect = ball.get_rect() while True: @@ -44,7 +44,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedInputOutput2.gif +.. image:: ../../../assets/AdvancedInputOutput2.webp :class: inlined-right .. code-block:: python @@ -59,7 +59,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedInputOutput2.gif") + ball = pygame.image.load("AdvancedInputOutput2.webp") ballrect = ball.get_rect() while True: @@ -78,7 +78,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 버튼 2개를 만드는 것은 쉽다. 버튼을 보면, 뭔가 특이한 효과가 적용되어 있음을 알 수 있다. 어떻게 한 것인가? 이전의 아이디어처럼 단순하다. 첫째, 큰 정사각형을 그린다. 둘째, 내용은 없고 두께만 있는 작은 정사각형을 그린다. 하지만 이 버튼들은 아직 출력용이다. 이 버튼들을 위한 클릭 가능 공간을 만들어야 한다. -.. image:: ../../../assets/AdvancedInputOutput3.gif +.. image:: ../../../assets/AdvancedInputOutput3.webp :class: inlined-right .. code-block:: python @@ -93,7 +93,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedInputOutput3.gif") + ball = pygame.image.load("AdvancedInputOutput3.webp") ballrect = ball.get_rect() while True: @@ -110,7 +110,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedInputOutput4.gif +.. image:: ../../../assets/AdvancedInputOutput4.webp :class: inlined-right .. code-block:: python @@ -125,7 +125,7 @@ KEYDOWN이 사용되었지만, 아직도 이 게임이 완전한 GUI가 아닌 screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedInputOutput4.gif") + ball = pygame.image.load("AdvancedInputOutput4.webp") ballrect = ball.get_rect() while True: diff --git "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/7.\352\262\214\354\236\204\355\214\220/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\241\260\352\270\210 \353\215\224.rst" "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/7.\352\262\214\354\236\204\355\214\220/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\241\260\352\270\210 \353\215\224.rst" index a7ecf1050d..dbe3e9db71 100644 --- "a/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/7.\352\262\214\354\236\204\355\214\220/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\241\260\352\270\210 \353\215\224.rst" +++ "b/docs/reST/tutorials/ko/\353\271\250\352\260\204\353\270\224\353\241\235 \352\262\200\354\235\200\353\270\224\353\241\235/7.\352\262\214\354\236\204\355\214\220/\354\213\254\355\231\224 \354\266\234\353\240\245 \352\267\270\353\246\254\352\263\240 \354\241\260\352\270\210 \353\215\224.rst" @@ -12,7 +12,7 @@ Contact: rumia0601@gmail.com 사실, 모든 것들이 게임 같아 보이진 않는다. 이제, 이 프로그램에 규칙을 추가하려 한다. 그러면, 이 프로그램은 게임이 된다. 규칙은 간단하다: 5x5 2차원 배열에서 빨간 블록, 검은 블록의 수를 세고, 더 많은 색상의 블록을 고르는 것이다! 정답이라면 HP는 증가하고 오답이라면, HP는 감소한다. 그 다음, 다음 문제를 위한 새로운 2차원 배열이 그려진다! 대단히 단순하지만 이 튜토리얼 내에서 만들어 질 수 있는 게임이다. 우선, 2차원 배열을 만들고 출력해야 한다. 어떻게? 우리는 정수 데이터(0차원 배열과 같음)나 두 버튼(1차원 배열과 같음)을 출력하는 법을 알 고 있다. 2차원 배열은 요소 하나만 더 추가되면 된다. -.. image:: ../../../assets/AdvancedOutputAlpha1.gif +.. image:: ../../../assets/AdvancedOutputAlpha1.webp :class: inlined-right .. code-block:: python @@ -27,7 +27,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputAlpha1.gif") + ball = pygame.image.load("AdvancedOutputAlpha1.webp") ballrect = ball.get_rect() while True: @@ -44,7 +44,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputAlpha2.gif +.. image:: ../../../assets/AdvancedOutputAlpha2.webp :class: inlined-right .. code-block:: python @@ -59,7 +59,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputAlpha2.gif") + ball = pygame.image.load("AdvancedOutputAlpha2.webp") ballrect = ball.get_rect() while True: @@ -76,7 +76,7 @@ Contact: rumia0601@gmail.com screen.blit(ball, ballrect) pygame.display.flip() -.. image:: ../../../assets/AdvancedOutputAlpha3.gif +.. image:: ../../../assets/AdvancedOutputAlpha3.webp :class: inlined-right .. code-block:: python @@ -91,7 +91,7 @@ Contact: rumia0601@gmail.com screen = pygame.display.set_mode(size) - ball = pygame.image.load("AdvancedOutputAlpha3.gif") + ball = pygame.image.load("AdvancedOutputAlpha3.webp") ballrect = ball.get_rect() while True: From 5e3ae48ab346d003f3f6b7524f8087a3ec3e98ff Mon Sep 17 00:00:00 2001 From: damusss Date: Thu, 6 Mar 2025 16:40:20 +0100 Subject: [PATCH 104/441] Revert docs change --- docs/reST/ref/bufferproxy.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/bufferproxy.rst b/docs/reST/ref/bufferproxy.rst index 04c3732659..f214ae03ff 100644 --- a/docs/reST/ref/bufferproxy.rst +++ b/docs/reST/ref/bufferproxy.rst @@ -57,8 +57,8 @@ ``"before"`` : callable : (optional) Callback invoked when the :class:`BufferProxy` instance exports the buffer. The callback is given one argument, the - ``"parent"`` object if given, otherwise ``None``. - The callback is useful for setting a lock on the parent. + ``"parent"`` object if given, otherwise ``None``. + The callback is useful for setting a lock on the parent. ``"after"`` : callable : (optional) Callback invoked when an exported buffer is released. From 2049797373113a6c1d97727ab16fbf50996593ff Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Fri, 7 Mar 2025 00:39:27 +0200 Subject: [PATCH 105/441] update type annotations --- buildconfig/stubs/pygame/mask.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/buildconfig/stubs/pygame/mask.pyi b/buildconfig/stubs/pygame/mask.pyi index 6b18ed448e..c728d07c38 100644 --- a/buildconfig/stubs/pygame/mask.pyi +++ b/buildconfig/stubs/pygame/mask.pyi @@ -50,10 +50,10 @@ class Mask: surface: Optional[Surface] = None, setsurface: Optional[Surface] = None, unsetsurface: Optional[Surface] = None, - setcolor: Optional[ColorValue] = (255, 255, 255, 255), - unsetcolor: Optional[ColorValue] = (0, 0, 0, 255), - dest: Union[RectValue, Coordinate] = (0, 0), - area: Optional[RectValue] = None, + setcolor: Optional[ColorLike] = (255, 255, 255, 255), + unsetcolor: Optional[ColorLike] = (0, 0, 0, 255), + dest: Union[RectLike, Point] = (0, 0), + area: Optional[RectLike] = None, ) -> Surface: ... @deprecated("Use `Mask` instead (MaskType is an old alias)") From 2fb2e042ce0fd7e7bfcb9431c034b64210c010c4 Mon Sep 17 00:00:00 2001 From: Damiano <97639432+damusss@users.noreply.github.com> Date: Fri, 7 Mar 2025 00:15:26 +0100 Subject: [PATCH 106/441] Convert some `data/example` images to webp (#3362) * Convert some images to webp * Revert some aliens.py things --- docs/reST/tutorials/en/chimp-explanation.rst | 2 +- docs/reST/tutorials/en/move-it.rst | 2 +- .../tutorials/es/ChimpanceLineaporLinea.rst | 4 ++-- examples/arraydemo.py | 2 +- examples/blend_fill.py | 4 ++-- examples/blit_blends.py | 4 ++-- examples/chimp.py | 4 ++-- examples/cursors.py | 2 +- examples/data/arraydemo.bmp | Bin 76854 -> 0 bytes examples/data/arraydemo.webp | Bin 0 -> 39180 bytes examples/data/blue.mpg | Bin 6144 -> 0 bytes examples/data/chimp.png | Bin 826 -> 0 bytes examples/data/chimp.webp | Bin 0 -> 622 bytes examples/data/cursor.png | Bin 2708 -> 0 bytes examples/data/cursor.webp | Bin 0 -> 960 bytes examples/data/danger.gif | Bin 2761 -> 0 bytes examples/data/fist.png | Bin 86196 -> 0 bytes examples/data/fist.webp | Bin 0 -> 48246 bytes examples/data/frame.png | Bin 253 -> 0 bytes examples/data/frame.webp | Bin 0 -> 124 bytes examples/data/liquid.bmp | Bin 11734 -> 0 bytes examples/data/liquid.webp | Bin 0 -> 1810 bytes examples/data/midikeys.png | Bin 19666 -> 0 bytes examples/data/midikeys.webp | Bin 0 -> 9520 bytes examples/data/static.png | Bin 1202 -> 0 bytes examples/data/static.webp | Bin 0 -> 580 bytes examples/liquid.py | 2 +- examples/midi.py | 2 +- examples/moveit.py | 2 +- examples/ninepatch.py | 2 +- examples/pixelarray.py | 6 +++--- examples/scroll.py | 2 +- examples/testsprite.py | 6 +++--- test/transform_test.py | 4 ++-- 34 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 examples/data/arraydemo.bmp create mode 100644 examples/data/arraydemo.webp delete mode 100644 examples/data/blue.mpg delete mode 100644 examples/data/chimp.png create mode 100644 examples/data/chimp.webp delete mode 100644 examples/data/cursor.png create mode 100644 examples/data/cursor.webp delete mode 100644 examples/data/danger.gif delete mode 100644 examples/data/fist.png create mode 100644 examples/data/fist.webp delete mode 100644 examples/data/frame.png create mode 100644 examples/data/frame.webp delete mode 100644 examples/data/liquid.bmp create mode 100644 examples/data/liquid.webp delete mode 100644 examples/data/midikeys.png create mode 100644 examples/data/midikeys.webp delete mode 100644 examples/data/static.png create mode 100644 examples/data/static.webp diff --git a/docs/reST/tutorials/en/chimp-explanation.rst b/docs/reST/tutorials/en/chimp-explanation.rst index a18c83e0e2..fd2f096760 100644 --- a/docs/reST/tutorials/en/chimp-explanation.rst +++ b/docs/reST/tutorials/en/chimp-explanation.rst @@ -214,7 +214,7 @@ is colliding with the given target sprite. :: def __init__(self): pygame.sprite.Sprite.__init__(self) # call Sprite initializer - self.image, self.rect = load_image("chimp.png", -1, 4) + self.image, self.rect = load_image("chimp.webp", -1, 4) screen = pygame.display.get_surface() self.area = screen.get_rect() self.rect.topleft = 10, 90 diff --git a/docs/reST/tutorials/en/move-it.rst b/docs/reST/tutorials/en/move-it.rst index e13b1ffe41..07f30bd921 100644 --- a/docs/reST/tutorials/en/move-it.rst +++ b/docs/reST/tutorials/en/move-it.rst @@ -339,7 +339,7 @@ and reference. The pygame.image module has a load() function which will do what we want. The lines to load the images should become this. :: >>> player = pygame.image.load('player.bmp').convert() - >>> background = pygame.image.load('liquid.bmp').convert() + >>> background = pygame.image.load('liquid.webp').convert() We can see that's pretty simple, the load function just takes a filename diff --git a/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst b/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst index f4d65642b2..62dfd5a1db 100644 --- a/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst +++ b/docs/reST/tutorials/es/ChimpanceLineaporLinea.rst @@ -187,7 +187,7 @@ las revisaremos de a una. :: def __init__(self): pg.sprite.Sprite.__init__(self) # call Sprite initializer - self.image, self.rect = load_image("fist.png", -1) + self.image, self.rect = load_image("fist.webp", -1) self.fist_offset = (-235, -80) self.punching = False @@ -239,7 +239,7 @@ el puño está chocando con el sprite objetivo. :: def __init__(self): pg.sprite.Sprite.__init__(self) # call Sprite intializer - self.image, self.rect = load_image("chimp.png", -1, 4) + self.image, self.rect = load_image("chimp.webp", -1, 4) screen = pg.display.get_surface() self.area = screen.get_rect() self.rect.topleft = 10, 90 diff --git a/examples/arraydemo.py b/examples/arraydemo.py index 1b0c8334a6..132c828ac0 100644 --- a/examples/arraydemo.py +++ b/examples/arraydemo.py @@ -64,7 +64,7 @@ def main(): surfdemo_show(striped, "striped") # rgbarray - imagename = os.path.join(main_dir, "data", "arraydemo.bmp") + imagename = os.path.join(main_dir, "data", "arraydemo.webp") imgsurface = pygame.image.load(imagename) rgbarray = surfarray.array3d(imgsurface) surfdemo_show(rgbarray, "rgbarray") diff --git a/examples/blend_fill.py b/examples/blend_fill.py index 4f967288cd..a5be70d2a6 100644 --- a/examples/blend_fill.py +++ b/examples/blend_fill.py @@ -37,8 +37,8 @@ def main(): screen = pygame.display.set_mode((640, 480)) screen.fill((100, 100, 100)) - image = pygame.image.load(os.path.join(data_dir, "liquid.bmp")).convert() - blendimage = pygame.image.load(os.path.join(data_dir, "liquid.bmp")).convert() + image = pygame.image.load(os.path.join(data_dir, "liquid.webp")).convert() + blendimage = pygame.image.load(os.path.join(data_dir, "liquid.webp")).convert() screen.blit(image, (10, 10)) screen.blit(blendimage, (200, 10)) diff --git a/examples/blit_blends.py b/examples/blit_blends.py index de4047b8a8..773a738e90 100644 --- a/examples/blit_blends.py +++ b/examples/blit_blends.py @@ -52,9 +52,9 @@ def main(): images = {} images[pygame.K_1] = im2 - images[pygame.K_2] = pygame.image.load(os.path.join(data_dir, "chimp.png")) + images[pygame.K_2] = pygame.image.load(os.path.join(data_dir, "chimp.webp")) images[pygame.K_3] = pygame.image.load(os.path.join(data_dir, "alien3.gif")) - images[pygame.K_4] = pygame.image.load(os.path.join(data_dir, "liquid.bmp")) + images[pygame.K_4] = pygame.image.load(os.path.join(data_dir, "liquid.webp")) img_to_blit = im2.convert() iaa = img_to_blit.convert_alpha() diff --git a/examples/chimp.py b/examples/chimp.py index 1f0fecddfe..354ca30cfc 100644 --- a/examples/chimp.py +++ b/examples/chimp.py @@ -55,7 +55,7 @@ class Fist(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) # call Sprite initializer - self.image, self.rect = load_image("fist.png", -1) + self.image, self.rect = load_image("fist.webp", -1) self.fist_offset = (-235, -80) self.punching = False @@ -85,7 +85,7 @@ class Chimp(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) # call Sprite initializer - self.image, self.rect = load_image("chimp.png", -1, 4) + self.image, self.rect = load_image("chimp.webp", -1, 4) screen = pygame.display.get_surface() self.area = screen.get_rect() self.rect.topleft = 10, 90 diff --git a/examples/cursors.py b/examples/cursors.py index 9043bee72d..785d58ea9f 100644 --- a/examples/cursors.py +++ b/examples/cursors.py @@ -29,7 +29,7 @@ # Create a color cursor with an image surface main_dir = os.path.split(os.path.abspath(__file__))[0] -image_name = os.path.join(main_dir, "data", "cursor.png") +image_name = os.path.join(main_dir, "data", "cursor.webp") image = pygame.image.load(image_name) image_cursor = pygame.cursors.Cursor( (image.get_width() // 2, image.get_height() // 2), image diff --git a/examples/data/arraydemo.bmp b/examples/data/arraydemo.bmp deleted file mode 100644 index ad96338e7b4e4a853aa2d91b44ca5f90cf5d268e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76854 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%0A~1<;SaC;($_oT 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 VsVNzd0U3}18IXa048-i8{{aTI3E2Pu diff --git a/examples/data/chimp.png b/examples/data/chimp.png deleted file mode 100644 index 9bf37b1a0a9ec3b4a79d6b1b2f2c56d3db71d5b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)Px#1ZP1_K>z@;j|==^1poj54^T{0MgIT*0000S930%-+)z+ZYSagT00009a7bBm z000ib000ib0l1NC?EnA*v`IukR7l62mf3OOAPhjE0}IlCSQ;Qs10nQZ)9S(oj59k+ zK9caPTY%iU0KmO2f+?lr6(?Evf_<{Jx8OtPdkb*kgqsh1xp^#43?(6$ju;;b085JJ zNfCw}_lN~gS%vu;Lcl~CfGC`S6ovT%3O$UxEHRSJfKl}u$5}kF*3L1^oHK`s{EPHM zJfxMk%Dj+$_CL%?*1`mmFNMV)yme0Mfla;16YuI*UISYCa4oWY-;AF@#q-D;b4!5L zFy8^PKxSU3d`~Xsb3>Bn3iLKxxFkr+yYSxD%EQV%cFqopIDM0^00)lJT?zfjsdZ{H zDa(u>6BICC3MOt21li9wN6YB{^24|}5c>Z2zj5ppsT0qgA8wNOY3BIgnwXr2w&MiX znYTOyH6*C>nuo3)IaQt$T+_<4{6l}D)Tf5aJ>{*3s*cs!>BMJl;Mq97@m~Mq)_?3c z3a{P2%f4~h6|SakZh5Z96o0rIPk-P1yYoCX==aJ|`@Qp@!)b$e&X#u^2R`WkDQ-9* z%G=EwalI0h-#&mvT~N=O{wnn>Vam& z3NY|~7C$)0as-<4>-;Mh)p|s>{G-;YZXz3P?Ye(-54goU53Myjo~~auS0PA!`JtOk zu^FJvN+}G+=_0)D=bP&#M>pn>0*KEe6bL`9LHvU|Hp>1350D-rtRtA`;oxd2 zfOW#6o?*A#+X}4z7Y>q?_u?*_UI{P~J7ho9iS&yi1D*ylh07*qoM6N<$ Eg169#x&QzG diff --git a/examples/data/chimp.webp b/examples/data/chimp.webp new file mode 100644 index 0000000000000000000000000000000000000000..43b7d9101d791b72105cf3e6284a4cd8083eeb44 GIT binary patch literal 622 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 O00005{cPK|ZQHhO+qP}n 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 LGM9Il@po?FOYFDmUP?)m;dto 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

    GF%EEepky>Z6Jj~4YA^!XKNF4mw28j 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 KUv{2FTLTVN+U^|y literal 0 HcmV?d00001 diff --git a/examples/data/frame.png b/examples/data/frame.png deleted file mode 100644 index 2b81d7c3c7d9ef37751235b3475a51cb6bc8f9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf3?viMZ?gg^#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lf+TqYd_r6&B*kv)Ov?6-1`4Q0e?AOSR}$nG{Qv)d1_!N`Ux0kh0*}aI1_nN$ z9N%Haa0v{4U;o@n>ur`2+osRXUL5)t$`-F!#WByd zG3R8|>Mxx~)+L5N&JTw3(Cz*f8NwM l9qH%Il3xBeM|{F7?lbnhrspmQZUWlM;OXk;vd$@?2>{}nTH62s diff --git a/examples/data/frame.webp b/examples/data/frame.webp new file mode 100644 index 0000000000000000000000000000000000000000..30302ced322f77ec0ab2d702df0d3182e09583a8 GIT binary patch literal 124 zcmV-?0E7QhNk&F=00012MM6+kP&iCy0000lEkFwpA0QAQQ!XTkAtWF}&Tx)`v<+C? zJ(ZjP0Q{@ffK6>}ZN9?@P9Q~1bi@KCVxmj+X8pa@CjkJ5Q8Og~ literal 0 HcmV?d00001 diff --git a/examples/data/liquid.bmp b/examples/data/liquid.bmp deleted file mode 100644 index c4f12ebb708473ab81cb08621415c366d30a87da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11734 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 diff --git a/examples/data/liquid.webp b/examples/data/liquid.webp new file mode 100644 index 0000000000000000000000000000000000000000..70df9c44ef6225734edd7a35ad84f9ed237711bd GIT binary patch literal 1810 zcmV+t2krP$Nk&Er2LJ$9MM6+kP&iEf1^@srtH2-tcc3Veq~;RHz(O*O6bc#fo!{tC z8rf=80!2{@mEkD|cjcCGv0=>Aw(&nkS+urEW0gS#=0CpOqL9y%O1;ClOOr7G;h9;% z#z;~&i}>3^2hY;BDUxK{mJQ}HLL+l9Q?r;WB#XN>n3;RbcmvfM%xnX-xS}^~gb(V) z_*Ens-1T!AOdog`u>5-8q?ymBmc_UoN|QYO?|W>qIcHzae>HR*N{f%qfpzwlMAg+z4rmY zE1Y;mGGvXQivfUR`94}WBL6CgSL*w?g(@+dX74(mG8I7Nv)d8)raE-MC7FeRmTU!Ef=H&^HoQ&iK_f0rp|fglp}H^&g3}d6cM>< zSH`p<@~8zVNvoU5Z4hl;B}WvtmHwK|UL8k-S1Ff@PKk3$dB|+8u~j}LC10NNsVrSb zjU%2iZL}Hh%{eQc+2ZRpxR4B!aDwWwxWZ{I zz6)&qtLkQQhA|08fc6bXgr<%@uS%>MvP$Wm_TS7^f0i;n?qvB$e|%*rb;|1xrTn=J z-P?K69x4sl?o@CD4UWiVU5K1goXI_01%MO-1V=9Cr1S*w|H4e}!kl#;PC4T|uyq+< zQ46~x&xM)X0FcuFM7IN~-=Hc84B$tqlt&G31;79bX<+`z%(vXmu^lt!^~_Ed1yunb zkH@`8N_y8Y?8N%M`BrAm4%y_TYRyPDjCbCp?lx7yu}AG(bM2FMzWd$pK3DFIo4$T! z%qrJ^o%)s-c1-0PVvyT%;HgX`|Ls=tvcqYYiyTPy@$2yl`HeHwzIZ}tj@80^4G%R zFpr^i#TjiU{fF$OLrOz-(|0CYJBy)xCUIBS9XrH=cRi@;dQl;&fOa0%q&KLEIa z8Nh1VfFM7=*B+{!owaN7@Q!dF9O0KLsq>Y(;DtI1JVZ5)x>iauaL zQq_rwydzyC9awwlQ~{&vL!u2S-99{AAd+JhRg73W^^A{kP1)w}wO$vnmqr`1)Zbhl zb5bK8CZ}rAAHr6>SS7buU79}_b+jQbK%PY8g@IuCJ|Mww6n6_`E`7C@(&XoRs{blp z{~dx=nGh6hw71=&UgQH2kY2i!;RT|p*1Pmsiu~q`x!Wun zw}_2`ZAMZ{y@yx{%Dr|iIJw<&&g$}kB1FHd@mF4L;F8yoN4r*iTQxvH=9}|L`93*b zkrEFke^B9wSJTD;CYY$Z|>I1gqT@H|*rPgJ*P>{SaM&$KPdrJg$rnT^J zq+CF7q`F8?N^GG13R=cIY2*p=&)85oy1;7RJkd*_(v!gYE zM|uB)w5{{ENCjaFgbnh?MbZ;^RS?U_;n;pI)H)&UAIw|wz%6#4nJ4x0(s7gOiKl|q zl(kBC9FFiRtJ?mwN&b^#iR1p!q?YgfLhUlkYTI9&diS$75i&Kb)vA$hh{j}B)T{kD zZynv6<-@(jT~RONVFCH@^Aw1{<1E=5ZNWu3GOfYMUMHXZeo?nCkOKKt=KC1Ve1A>P zNSR+K0B*@Z;8n+z_t~#!=3gX!%ehzOX6Ds6OPbrXH})HHzRi0#y|WmlncUGrGj+}K zT+=<%LNoPya_eoOnHHL9q2V6=&k|l@j+l9oX(fHk6<%Kd-00@H`cEt^t*)6n3|T0S Ang9R* literal 0 HcmV?d00001 diff --git a/examples/data/midikeys.png b/examples/data/midikeys.png deleted file mode 100644 index 74ecb86b8c4d75a7cfacfc9361264f317d1122ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19666 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 diff --git a/examples/data/midikeys.webp b/examples/data/midikeys.webp new file mode 100644 index 0000000000000000000000000000000000000000..f78126e61a72df953f38188a0d4f0a13ea9a3bec GIT binary patch literal 9520 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 OdNj25HqhQ=>n8^FM98fG literal 0 HcmV?d00001 diff --git a/examples/data/static.png b/examples/data/static.png deleted file mode 100644 index fb3b0572ac41b9ad474d0f33efd38c638ef3ee1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP)6j@JE;pPXVi z5JTnu<9%s`$ti{dF;p%ct@|H8ImK`whRXfN`_c-NQw#@Us9ZW)_dos)IDP+?^QJNc z0Uw{G{e8c#&vjFS?k;S_NfmH-POs&!3e*iaVFC`#sjD-S-^!eD0mtQZ{vs;=nw(4m zlGBJ*a?)56t`?nEEJg z(BKzow9lq%OpzHNb8G9EPk@<|(JrtCXq?8IK{%vK`+A>E9VDsP3WAzw^$9R>@=3)` zp~QT`=hiwliD-PNQ9619rPDKs6`ueDCu1hnjsabaz=`yzt*VTblj`TQiLQ9f3PcY6 z6ahFVZcQ37U|0g31<#3)$TxMQQ)HN!+O2l-+>{8L7_}w=ASb%wkph^o)>4Y+)Xqo3 zUPX%hN|Q~u-n5zcNfSm9!<=P^xp|Egji$1=YxIbyK2_K&@bTv*?ihwbV zH4$Q8E_W{)e|9Uk1Se>17$VXn0Lmw7)qw$kdtPfFLAAobGWbwqvPsA%q%oPlKq8!; zH6yWjh<&+vg9)4-&6yRn&%Z~~T6J&EjNrnqok!TLxq2kha?HxNe=KWpA~M@{CWMqe zjZ+8QgQ^s+KwCK>^^HE4I2xx*ZaU5do?#PIc>DC-u-`K^<#3^!BpHxT_0XmgMD`bk zeBw`H+L1TpWSEiB?aF!o|15e%q82KAR^*dhZ@J+@1Ze%HAQ;Kv7UZ2P*;R5ig%N>K7JZ&GQt!JW& zRI9CLrhAQRL2F*mHGw2lHJZ-D=O|oLUJonvpNvho0PZ#!kE+hC(ZgH^tM7}&X2G|^ zRlYz{?>+BXs6MHE2tZdeb=ay5fOYS(gs8*vYPDoizhiN1ZwEE(EtEQD6n|sC@8?psdo%41KM4CeRKrmQ+;kED6qV>S72$T$>ZQ@Oj!4ufB+w- zt7BYngP}Y=2{dx@9wQ=0_xX(AKyr%VKn#_cYRM^v12I%)J|(9Z4#ZHI`IMYuI1oc+ z=2LQt;Xn+PnNP_nh66EFWn+a07*qoM6N<$f)Q0S)&Kwi diff --git a/examples/data/static.webp b/examples/data/static.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae00323cc159a32b6b3189f6bb12a781bce7b4fc GIT binary patch literal 580 zcmV-K0=xZENk&FI0ssJ4MM6+kP&iC40ssInjKB~8r!fBtBH2nFP2B09#GNK6Xe6l_ z4^I<`SzL4t%zykpJa8ev=TZ^@5_9935omZp39P74OTd-RN^bAIH#jH_sW?c?uks| zYiGN=3o419AK>ziV~u9B1OZbkaZD7F;D!ic!vgg+Kdx$!@(MHtR-*Yd8=R-G;zIF~ zG*#F}L!_{t3)dVq5+zJ_ z;FbS+Lv29gvyzwQ)T*~53ktK{Pav^$9JYI#9%CR^(kF}nRwT;zVr149Ond|@dI1OB zPaVY(iC%KA&5lV2sy_u)I6oF-sU+l;ui^zJGqi+WCTwu802mcM!GK~?V~w9bUSMs? z3Sk=atA}%RkKigP?5CPl+q Date: Fri, 7 Mar 2025 05:13:29 +0200 Subject: [PATCH 107/441] why --- src_c/mask.c | 158 ++++++++++++++++++++++++++-------------------- test/mask_test.py | 49 ++++++-------- 2 files changed, 109 insertions(+), 98 deletions(-) diff --git a/src_c/mask.c b/src_c/mask.c index 932cd28387..2460e10531 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -1985,9 +1985,8 @@ extract_color(SDL_Surface *surf, PyObject *color_obj, Uint8 rgba_color[], */ static void draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, - SDL_Rect *area_rect, int draw_setbits, int draw_unsetbits, - SDL_Surface *setsurf, SDL_Surface *unsetsurf, Uint32 *setcolor, - Uint32 *unsetcolor) + int draw_setbits, int draw_unsetbits, SDL_Surface *setsurf, + SDL_Surface *unsetsurf, Uint32 *setcolor, Uint32 *unsetcolor) { Uint8 *pixel = NULL; Uint8 bpp; @@ -2003,15 +2002,6 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, return; } - if (area_rect->x < 0) { - x_dest -= area_rect->x; - area_rect->w += area_rect->x; - } - if (area_rect->y < 0) { - y_dest -= area_rect->y; - area_rect->h += area_rect->y; - } - /* There is also nothing to do when the destination position is such that * nothing will be drawn on the surface. */ if ((x_dest >= surf->w) || (y_dest >= surf->h) || (-x_dest > bitmask->w) || @@ -2021,23 +2011,13 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, bpp = PG_SURF_BytesPerPixel(surf); - // clamp rect width and height to not stick out of the mask - area_rect->w = MIN(area_rect->w, bitmask->w - area_rect->x); - area_rect->h = MIN(area_rect->h, bitmask->h - area_rect->y); - xm_start = (x_dest < 0) ? -x_dest : 0; - if (area_rect->x > 0) { - xm_start += area_rect->x; - } x_start = (x_dest > 0) ? x_dest : 0; - x_end = MIN(MIN(surf->w, bitmask->w + x_dest), x_dest + area_rect->w); + x_end = MIN(surf->w, bitmask->w + x_dest); ym_start = (y_dest < 0) ? -y_dest : 0; - if (area_rect->y > 0) { - ym_start += area_rect->y; - } y_start = (y_dest > 0) ? y_dest : 0; - y_end = MIN(MIN(surf->h, bitmask->h + y_dest), y_dest + area_rect->h); + y_end = MIN(surf->h, bitmask->h + y_dest); if (NULL == setsurf && NULL == unsetsurf) { /* Draw just using color values. No surfaces. */ @@ -2181,7 +2161,7 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *destobj = NULL, *areaobj = NULL; SDL_Rect *area_rect, temp_rect; SDL_Surface *surf = NULL, *setsurf = NULL, *unsetsurf = NULL; - bitmask_t *bitmask = pgMask_AsBitmap(self); + bitmask_t *bitmask = pgMask_AsBitmap(self), *area_bitmask; Uint32 *setcolor_ptr = NULL, *unsetcolor_ptr = NULL; Uint32 setcolor, unsetcolor; int draw_setbits = 0, draw_unsetbits = 0; @@ -2200,10 +2180,64 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; /* Exception already set. */ } + if (NULL != destobj) { + int tempx = 0, tempy = 0; + + /* Destination coordinates can be extracted from: + * - lists/tuples with 2 items + * - Rect (or Rect like) objects (uses x, y values) */ + if (pg_TwoIntsFromObj(destobj, &tempx, &tempy)) { + x_dest = tempx; + y_dest = tempy; + } + else { + SDL_Rect temp_rect; + SDL_Rect *dest_rect = pgRect_FromObject(destobj, &temp_rect); + + if (NULL != dest_rect) { + x_dest = dest_rect->x; + y_dest = dest_rect->y; + } + else { + PyErr_SetString(PyExc_TypeError, "invalid dest argument"); + goto to_surface_error; + } + } + } + + if (areaobj && areaobj != Py_None) { + if (!(area_rect = pgRect_FromObject(areaobj, &temp_rect))) { + PyErr_SetString(PyExc_TypeError, "invalid rectstyle argument"); + goto to_surface_error; + } + } + else { + temp_rect.x = temp_rect.y = 0; + temp_rect.w = bitmask->w; + temp_rect.h = bitmask->h; + area_rect = &temp_rect; + } + + if (area_rect->x < 0) { + // x_dest -= area_rect->x; + area_rect->w += area_rect->x; + area_rect->x = 0; + } + if (area_rect->y < 0) { + // y_dest -= area_rect->y; + area_rect->h += area_rect->y; + area_rect->y = 0; + } + + // clamp rect width and height to not stick out of the mask + area_rect->w = MAX(MIN(area_rect->w, bitmask->w - area_rect->x), 0); + area_rect->h = MAX(MIN(area_rect->h, bitmask->h - area_rect->y), 0); + // pgRect_Normalize(area_rect); + if (Py_None == surfobj) { - surfobj = - PyObject_CallFunction((PyObject *)&pgSurface_Type, "(ii)ii", - bitmask->w, bitmask->h, PGS_SRCALPHA, 32); + surfobj = PyObject_CallFunction((PyObject *)&pgSurface_Type, "(ii)ii", + area_rect->w, area_rect->h, + PGS_SRCALPHA, 32); if (NULL == surfobj) { if (!PyErr_Occurred()) { @@ -2287,44 +2321,6 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) draw_unsetbits = 1; } - if (NULL != destobj) { - int tempx = 0, tempy = 0; - - /* Destination coordinates can be extracted from: - * - lists/tuples with 2 items - * - Rect (or Rect like) objects (uses x, y values) */ - if (pg_TwoIntsFromObj(destobj, &tempx, &tempy)) { - x_dest = tempx; - y_dest = tempy; - } - else { - SDL_Rect temp_rect; - SDL_Rect *dest_rect = pgRect_FromObject(destobj, &temp_rect); - - if (NULL != dest_rect) { - x_dest = dest_rect->x; - y_dest = dest_rect->y; - } - else { - PyErr_SetString(PyExc_TypeError, "invalid dest argument"); - goto to_surface_error; - } - } - } - - if (areaobj && areaobj != Py_None) { - if (!(area_rect = pgRect_FromObject(areaobj, &temp_rect))) { - PyErr_SetString(PyExc_TypeError, "invalid rectstyle argument"); - goto to_surface_error; - } - } - else { - temp_rect.x = temp_rect.y = 0; - temp_rect.w = bitmask->w; - temp_rect.h = bitmask->h; - area_rect = &temp_rect; - } - if (!pgSurface_Lock((pgSurfaceObject *)surfobj)) { PyErr_SetString(PyExc_RuntimeError, "cannot lock surface"); goto to_surface_error; @@ -2345,14 +2341,42 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) goto to_surface_error; } + if (areaobj) { + assert(area_rect->w >= 0 && area_rect->w >= 0); + area_bitmask = bitmask_create(area_rect->w, area_rect->h); + if (NULL == area_bitmask) { + PyErr_Format(PyExc_MemoryError, "failed to allocate memory for a mask"); + return NULL; + } + + bitmask_t *overlap_bitmask = bitmask_copy(area_bitmask); + if (NULL == overlap_bitmask) { + PyErr_SetString(PyExc_MemoryError, "failed to allocate memory for a mask"); + return NULL; + } + + bitmask_fill(overlap_bitmask); + + bitmask_overlap_mask(bitmask, overlap_bitmask, area_bitmask, + area_rect->x, area_rect->y); + bitmask_free(overlap_bitmask); + } + else { + area_bitmask = bitmask; + } + Py_BEGIN_ALLOW_THREADS; /* Release the GIL. */ - draw_to_surface(surf, bitmask, x_dest, y_dest, area_rect, draw_setbits, + draw_to_surface(surf, area_bitmask, x_dest, y_dest, draw_setbits, draw_unsetbits, setsurf, unsetsurf, setcolor_ptr, unsetcolor_ptr); Py_END_ALLOW_THREADS; /* Obtain the GIL. */ + if (areaobj) { + bitmask_free(area_bitmask); + } + if (NULL != unsetsurf && !pgSurface_Unlock((pgSurfaceObject *)unsetsurfobj)) { PyErr_SetString(PyExc_RuntimeError, "cannot unlock unsetsurface"); diff --git a/test/mask_test.py b/test/mask_test.py index fec0859f77..1bb42304d2 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -1,15 +1,14 @@ -from collections import OrderedDict import copy import platform import random -import unittest import sys +import unittest +from collections import OrderedDict import pygame from pygame.locals import * from pygame.math import Vector2 - IS_PYPY = "PyPy" == platform.python_implementation() @@ -3265,7 +3264,6 @@ def test_to_surface__zero_sized_dest_rect(self): assertSurfaceFilled(self, to_surface, expected_color) - @unittest.expectedFailure def test_to_surface__valid_area_formats(self): """Ensures to_surface handles valid area formats correctly.""" size = (3, 5) @@ -3298,7 +3296,6 @@ def test_to_surface__valid_area_formats(self): assertSurfaceFilled(self, to_surface, expected_color, area_rect) assertSurfaceFilledIgnoreArea(self, to_surface, surface_color, area_rect) - @unittest.expectedFailure def test_to_surface__invalid_area_formats(self): """Ensures to_surface handles invalid area formats correctly.""" mask = pygame.mask.Mask((3, 5)) @@ -3314,10 +3311,9 @@ def test_to_surface__invalid_area_formats(self): ) for area in invalid_areas: - with self.assertRaisesRegex(TypeError, "invalid area argument"): - unused_to_surface = mask.to_surface(area=area) + with self.assertRaisesRegex(TypeError, "invalid rectstyle argument"): + mask.to_surface(area=area) - @unittest.expectedFailure def test_to_surface__negative_sized_area_rect(self): """Ensures to_surface correctly handles negative sized area rects.""" size = (3, 5) @@ -3342,7 +3338,6 @@ def test_to_surface__negative_sized_area_rect(self): assertSurfaceFilled(self, to_surface, expected_color, area) assertSurfaceFilledIgnoreArea(self, to_surface, surface_color, area) - @unittest.expectedFailure def test_to_surface__zero_sized_area_rect(self): """Ensures to_surface correctly handles zero sized area rects.""" size = (3, 5) @@ -4579,8 +4574,6 @@ def test_to_surface__dest_locations(self): self, to_surface, surface_color, overlap_rect ) - @unittest.expectedFailure - @unittest.skipIf(IS_PYPY, "Segfaults on pypy") def test_to_surface__area_locations(self): """Ensures area rects can be different locations on/off the mask.""" SIDE = 7 @@ -4591,10 +4584,10 @@ def test_to_surface__area_locations(self): default_unsetcolor = pygame.Color("black") directions = ( - ((s, 0) for s in range(-SIDE, SIDE + 1)), # left to right - ((0, s) for s in range(-SIDE, SIDE + 1)), # top to bottom - ((s, s) for s in range(-SIDE, SIDE + 1)), # topleft to bottomright diag - ((-s, s) for s in range(-SIDE, SIDE + 1)), # topright to bottomleft diag + [(s, 0) for s in range(-SIDE, SIDE + 1)], # left to right + [(0, s) for s in range(-SIDE, SIDE + 1)], # top to bottom + [(s, s) for s in range(-SIDE, SIDE + 1)], # topleft to bottomright diag + [(-s, s) for s in range(-SIDE, SIDE + 1)], # topright to bottomleft diag ) for fill in (True, False): @@ -4617,7 +4610,6 @@ def test_to_surface__area_locations(self): self, to_surface, surface_color, overlap_rect ) - @unittest.expectedFailure def test_to_surface__dest_and_area_locations(self): """Ensures dest/area values can be different locations on/off the surface/mask. @@ -4671,7 +4663,6 @@ def test_to_surface__dest_and_area_locations(self): self, to_surface, surface_color, dest_overlap_rect ) - @unittest.expectedFailure def test_to_surface__area_sizes(self): """Ensures area rects can be different sizes.""" SIDE = 7 @@ -5131,8 +5122,6 @@ def test_to_surface__dest_off_surface_with_setsurface_unsetsurface(self): self, to_surface, surface_color, mask_rect ) - @unittest.expectedFailure - @unittest.skipIf(IS_PYPY, "Segfaults on pypy") def test_to_surface__area_on_mask(self): """Ensures area values on the mask work correctly when using the defaults for setcolor and unsetcolor. @@ -5156,16 +5145,18 @@ def test_to_surface__area_on_mask(self): overlap_rect = mask_rect.clip(area_rect) overlap_rect.topleft = (0, 0) - to_surface = mask.to_surface(surface, area=area_rect) + with self.subTest( + pos=pos, area_rect=area_rect.copy(), overlap_rect=overlap_rect + ): + to_surface = mask.to_surface(surface, area=area_rect) - self.assertIs(to_surface, surface) - self.assertEqual(to_surface.get_size(), size) - assertSurfaceFilled(self, to_surface, expected_color, overlap_rect) - assertSurfaceFilledIgnoreArea( - self, to_surface, surface_color, overlap_rect - ) + self.assertIs(to_surface, surface) + self.assertEqual(to_surface.get_size(), size) + assertSurfaceFilled(self, to_surface, expected_color, overlap_rect) + assertSurfaceFilledIgnoreArea( + self, to_surface, surface_color, overlap_rect + ) - @unittest.expectedFailure def test_to_surface__area_on_mask_with_setsurface_unsetsurface(self): """Ensures area values on the mask work correctly when using setsurface and unsetsurface. @@ -5222,8 +5213,6 @@ def test_to_surface__area_on_mask_with_setsurface_unsetsurface(self): self, to_surface, surface_color, overlap_rect ) - @unittest.expectedFailure - @unittest.skipIf(IS_PYPY, "Segfaults on pypy") def test_to_surface__area_off_mask(self): """Ensures area values off the mask work correctly when using the defaults for setcolor and unsetcolor. @@ -5259,8 +5248,6 @@ def test_to_surface__area_off_mask(self): self, to_surface, surface_color, overlap_rect ) - @unittest.expectedFailure - @unittest.skipIf(IS_PYPY, "Segfaults on pypy") def test_to_surface__area_off_mask_with_setsurface_unsetsurface(self): """Ensures area values off the mask work correctly when using setsurface and unsetsurface. From 9c5e0b2aa8b51b2031b688dac4c7f0255b28b633 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sat, 8 Mar 2025 01:38:58 +0200 Subject: [PATCH 108/441] a turning point, hopefully don't have to revert back to here --- src_c/mask.c | 73 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/src_c/mask.c b/src_c/mask.c index 2460e10531..0fb5d55e0d 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -2169,6 +2169,7 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) int x_dest = 0, y_dest = 0; /* Default destination coordinates. */ Uint8 dflt_setcolor[] = {255, 255, 255, 255}; /* Default set color. */ Uint8 dflt_unsetcolor[] = {0, 0, 0, 255}; /* Default unset color. */ + int create_area_bitmask = 0; static char *keywords[] = {"surface", "setsurface", "unsetsurface", "setcolor", "unsetcolor", "dest", @@ -2210,6 +2211,28 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) PyErr_SetString(PyExc_TypeError, "invalid rectstyle argument"); goto to_surface_error; } + + memcpy(&temp_rect, area_rect, sizeof(temp_rect)); + area_rect = &temp_rect; + + pgRect_Normalize(area_rect); + + if (area_rect->x < 0) { + // x_dest -= area_rect->x; + area_rect->w += area_rect->x; + area_rect->x = 0; + } + if (area_rect->y < 0) { + // y_dest -= area_rect->y; + area_rect->h += area_rect->y; + area_rect->y = 0; + } + + // clamp rect width and height to not stick out of the mask + area_rect->w = MAX(MIN(area_rect->w, bitmask->w - area_rect->x), 0); + area_rect->h = MAX(MIN(area_rect->h, bitmask->h - area_rect->y), 0); + + create_area_bitmask = area_rect->w > 0 && area_rect->h > 0; } else { temp_rect.x = temp_rect.y = 0; @@ -2218,22 +2241,6 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) area_rect = &temp_rect; } - if (area_rect->x < 0) { - // x_dest -= area_rect->x; - area_rect->w += area_rect->x; - area_rect->x = 0; - } - if (area_rect->y < 0) { - // y_dest -= area_rect->y; - area_rect->h += area_rect->y; - area_rect->y = 0; - } - - // clamp rect width and height to not stick out of the mask - area_rect->w = MAX(MIN(area_rect->w, bitmask->w - area_rect->x), 0); - area_rect->h = MAX(MIN(area_rect->h, bitmask->h - area_rect->y), 0); - // pgRect_Normalize(area_rect); - if (Py_None == surfobj) { surfobj = PyObject_CallFunction((PyObject *)&pgSurface_Type, "(ii)ii", area_rect->w, area_rect->h, @@ -2341,8 +2348,7 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) goto to_surface_error; } - if (areaobj) { - assert(area_rect->w >= 0 && area_rect->w >= 0); + if (create_area_bitmask) { area_bitmask = bitmask_create(area_rect->w, area_rect->h); if (NULL == area_bitmask) { PyErr_Format(PyExc_MemoryError, "failed to allocate memory for a mask"); @@ -2359,6 +2365,35 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) bitmask_overlap_mask(bitmask, overlap_bitmask, area_bitmask, area_rect->x, area_rect->y); + + printf("%i,%i\n", area_rect->x, area_rect->y); + printf("%ix%i\n", bitmask->w, bitmask->h); + for (int y = 0; y < bitmask->h; ++y) { + for (int x = 0; x < bitmask->w; ++x) { + int bit_value = (bitmask->bits[y] >> x) & 1; + printf("%d ", bit_value); + } + printf("\n"); + } + printf("\n"); + printf("overlap\n"); + for (int y = 0; y < overlap_bitmask->h; ++y) { + for (int x = 0; x < overlap_bitmask->w; ++x) { + int bit_value = (overlap_bitmask->bits[y] >> x) & 1; + printf("%d ", bit_value); + } + printf("\n"); + } + printf("\n%ix%i\n", area_rect->w, area_rect->h); + for (int y = 0; y < area_bitmask->h; ++y) { + for (int x = 0; x < area_bitmask->w; ++x) { + int bit_value = (area_bitmask->bits[y] >> x) & 1; + printf("%d ", bit_value); + } + printf("\n"); + } + printf("\n"); + bitmask_free(overlap_bitmask); } else { @@ -2373,7 +2408,7 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) Py_END_ALLOW_THREADS; /* Obtain the GIL. */ - if (areaobj) { + if (create_area_bitmask) { bitmask_free(area_bitmask); } From 6f03c0aea32a3f21a078a70ded72284f3197f6ca Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sat, 8 Mar 2025 02:27:23 +0200 Subject: [PATCH 109/441] well, at least the tests pass --- src_c/mask.c | 75 +++++++++++++---------------------------------- test/mask_test.py | 55 ++++++++++++++++------------------ 2 files changed, 47 insertions(+), 83 deletions(-) diff --git a/src_c/mask.c b/src_c/mask.c index 0fb5d55e0d..6afee6c467 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -1985,7 +1985,8 @@ extract_color(SDL_Surface *surf, PyObject *color_obj, Uint8 rgba_color[], */ static void draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, - int draw_setbits, int draw_unsetbits, SDL_Surface *setsurf, + int x_area_offset, int y_area_offset, int draw_setbits, + int draw_unsetbits, SDL_Surface *setsurf, SDL_Surface *unsetsurf, Uint32 *setcolor, Uint32 *unsetcolor) { Uint8 *pixel = NULL; @@ -2050,10 +2051,12 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, for (y = y_start, ym = ym_start; y < y_end; ++y, ++ym) { pixel = (Uint8 *)surf->pixels + y * surf->pitch + x_start * bpp; - setpixel = (Uint8 *)setsurf->pixels + ym * setsurf->pitch + - xm_start * bpp; - unsetpixel = (Uint8 *)unsetsurf->pixels + ym * unsetsurf->pitch + - xm_start * bpp; + setpixel = (Uint8 *)setsurf->pixels + + (y_area_offset + ym) * setsurf->pitch + + (x_area_offset + xm_start) * bpp; + unsetpixel = (Uint8 *)unsetsurf->pixels + + (y_area_offset + ym) * unsetsurf->pitch + + (x_area_offset + xm_start) * bpp; for (x = x_start, xm = xm_start; x < x_end; ++x, ++xm, pixel += bpp, setpixel += bpp, unsetpixel += bpp) { @@ -2084,13 +2087,15 @@ draw_to_surface(SDL_Surface *surf, bitmask_t *bitmask, int x_dest, int y_dest, draw_unsetbits && NULL != unsetsurf && unsetsurf->h > ym; if (use_setsurf) { - setpixel = (Uint8 *)setsurf->pixels + ym * setsurf->pitch + - xm_start * bpp; + setpixel = (Uint8 *)setsurf->pixels + + (y_area_offset + ym) * setsurf->pitch + + (x_area_offset + xm_start) * bpp; } if (use_unsetsurf) { unsetpixel = (Uint8 *)unsetsurf->pixels + - ym * unsetsurf->pitch + xm_start * bpp; + (y_area_offset + ym) * unsetsurf->pitch + + (x_area_offset + xm_start) * bpp; } for (x = x_start, xm = xm_start; x < x_end; @@ -2227,12 +2232,12 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) area_rect->h += area_rect->y; area_rect->y = 0; } - + // clamp rect width and height to not stick out of the mask area_rect->w = MAX(MIN(area_rect->w, bitmask->w - area_rect->x), 0); area_rect->h = MAX(MIN(area_rect->h, bitmask->h - area_rect->y), 0); - create_area_bitmask = area_rect->w > 0 && area_rect->h > 0; + create_area_bitmask = 1; } else { temp_rect.x = temp_rect.y = 0; @@ -2351,50 +2356,12 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) if (create_area_bitmask) { area_bitmask = bitmask_create(area_rect->w, area_rect->h); if (NULL == area_bitmask) { - PyErr_Format(PyExc_MemoryError, "failed to allocate memory for a mask"); - return NULL; - } - - bitmask_t *overlap_bitmask = bitmask_copy(area_bitmask); - if (NULL == overlap_bitmask) { - PyErr_SetString(PyExc_MemoryError, "failed to allocate memory for a mask"); + PyErr_Format(PyExc_MemoryError, + "failed to allocate memory for a mask"); return NULL; } - bitmask_fill(overlap_bitmask); - - bitmask_overlap_mask(bitmask, overlap_bitmask, area_bitmask, - area_rect->x, area_rect->y); - - printf("%i,%i\n", area_rect->x, area_rect->y); - printf("%ix%i\n", bitmask->w, bitmask->h); - for (int y = 0; y < bitmask->h; ++y) { - for (int x = 0; x < bitmask->w; ++x) { - int bit_value = (bitmask->bits[y] >> x) & 1; - printf("%d ", bit_value); - } - printf("\n"); - } - printf("\n"); - printf("overlap\n"); - for (int y = 0; y < overlap_bitmask->h; ++y) { - for (int x = 0; x < overlap_bitmask->w; ++x) { - int bit_value = (overlap_bitmask->bits[y] >> x) & 1; - printf("%d ", bit_value); - } - printf("\n"); - } - printf("\n%ix%i\n", area_rect->w, area_rect->h); - for (int y = 0; y < area_bitmask->h; ++y) { - for (int x = 0; x < area_bitmask->w; ++x) { - int bit_value = (area_bitmask->bits[y] >> x) & 1; - printf("%d ", bit_value); - } - printf("\n"); - } - printf("\n"); - - bitmask_free(overlap_bitmask); + bitmask_draw(area_bitmask, bitmask, -area_rect->x, -area_rect->y); } else { area_bitmask = bitmask; @@ -2402,9 +2369,9 @@ mask_to_surface(PyObject *self, PyObject *args, PyObject *kwargs) Py_BEGIN_ALLOW_THREADS; /* Release the GIL. */ - draw_to_surface(surf, area_bitmask, x_dest, y_dest, draw_setbits, - draw_unsetbits, setsurf, unsetsurf, setcolor_ptr, - unsetcolor_ptr); + draw_to_surface(surf, area_bitmask, x_dest, y_dest, area_rect->x, + area_rect->y, draw_setbits, draw_unsetbits, setsurf, + unsetsurf, setcolor_ptr, unsetcolor_ptr); Py_END_ALLOW_THREADS; /* Obtain the GIL. */ diff --git a/test/mask_test.py b/test/mask_test.py index 1bb42304d2..30782bcbb6 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -2870,7 +2870,7 @@ def test_to_surface__area_output(self): [{"dest": (1, 0), "area": (0, 0, 1, 2)}, [[black, white], [black, white]]], [{"dest": (0, 0), "area": (0, 0, 0, 0)}, [[black, black], [black, black]]], [{"dest": (1, 0), "area": (-1, 0, 1, 1)}, [[black, black], [black, black]]], - [{"dest": (0, 0), "area": (-1, 0, 2, 1)}, [[black, white], [black, black]]], + [{"dest": (0, 0), "area": (-1, 0, 2, 1)}, [[white, black], [black, black]]], [ {"dest": (1, 1), "area": (-2, -2, 1, 1)}, [[black, black], [black, black]], @@ -2881,16 +2881,16 @@ def test_to_surface__area_output(self): ], [ {"dest": (-1, 0), "area": (-1, 0, 2, 2)}, - [[white, black], [white, black]], + [[black, black], [black, black]], ], [ {"dest": (0, -1), "area": (-1, 0, 3, 2)}, - [[black, white], [black, black]], + [[white, white], [black, black]], ], [{"dest": (0, 0), "area": (2, 2, 2, 2)}, [[black, black], [black, black]]], [ {"dest": (-5, -5), "area": (-5, -5, 6, 6)}, - [[white, black], [black, black]], + [[black, black], [black, black]], ], [ {"dest": (-5, -5), "area": (-5, -5, 1, 1)}, @@ -4550,12 +4550,12 @@ def test_to_surface__dest_locations(self): default_setcolor = pygame.Color("white") default_unsetcolor = pygame.Color("black") - directions = ( - ((s, 0) for s in range(-SIDE, SIDE + 1)), # left to right - ((0, s) for s in range(-SIDE, SIDE + 1)), # top to bottom - ((s, s) for s in range(-SIDE, SIDE + 1)), # topleft to bottomright diag - ((-s, s) for s in range(-SIDE, SIDE + 1)), # topright to bottomleft diag - ) + directions = [ + [(s, 0) for s in range(-SIDE, SIDE + 1)], # left to right + [(0, s) for s in range(-SIDE, SIDE + 1)], # top to bottom + [(s, s) for s in range(-SIDE, SIDE + 1)], # topleft to bottomright diag + [(-s, s) for s in range(-SIDE, SIDE + 1)], # topright to bottomleft diag + ] for fill in (True, False): mask = pygame.mask.Mask((SIDE, SIDE), fill=fill) @@ -4583,12 +4583,12 @@ def test_to_surface__area_locations(self): default_setcolor = pygame.Color("white") default_unsetcolor = pygame.Color("black") - directions = ( + directions = [ [(s, 0) for s in range(-SIDE, SIDE + 1)], # left to right [(0, s) for s in range(-SIDE, SIDE + 1)], # top to bottom [(s, s) for s in range(-SIDE, SIDE + 1)], # topleft to bottomright diag [(-s, s) for s in range(-SIDE, SIDE + 1)], # topright to bottomleft diag - ) + ] for fill in (True, False): mask = pygame.mask.Mask((SIDE, SIDE), fill=fill) @@ -4623,16 +4623,16 @@ def test_to_surface__dest_and_area_locations(self): default_setcolor = pygame.Color("white") default_unsetcolor = pygame.Color("black") - dest_directions = ( - ((s, 0) for s in range(-SIDE, SIDE + 1)), # left to right - ((0, s) for s in range(-SIDE, SIDE + 1)), # top to bottom - ((s, s) for s in range(-SIDE, SIDE + 1)), # topleft to bottomright diag - ((-s, s) for s in range(-SIDE, SIDE + 1)), # topright to bottomleft diag - ) + dest_directions = [ + [(s, 0) for s in range(-SIDE, SIDE + 1)], # left to right + [(0, s) for s in range(-SIDE, SIDE + 1)], # top to bottom + [(s, s) for s in range(-SIDE, SIDE + 1)], # topleft to bottomright diag + [(-s, s) for s in range(-SIDE, SIDE + 1)], # topright to bottomleft diag + ] # Using only the topleft to bottomright diagonal to test the area (to # reduce the number of loop iterations). - area_positions = list(dest_directions[2]) + area_positions = dest_directions[2] for fill in (True, False): mask = pygame.mask.Mask((SIDE, SIDE), fill=fill) @@ -5145,17 +5145,14 @@ def test_to_surface__area_on_mask(self): overlap_rect = mask_rect.clip(area_rect) overlap_rect.topleft = (0, 0) - with self.subTest( - pos=pos, area_rect=area_rect.copy(), overlap_rect=overlap_rect - ): - to_surface = mask.to_surface(surface, area=area_rect) + to_surface = mask.to_surface(surface, area=area_rect) - self.assertIs(to_surface, surface) - self.assertEqual(to_surface.get_size(), size) - assertSurfaceFilled(self, to_surface, expected_color, overlap_rect) - assertSurfaceFilledIgnoreArea( - self, to_surface, surface_color, overlap_rect - ) + self.assertIs(to_surface, surface) + self.assertEqual(to_surface.get_size(), size) + assertSurfaceFilled(self, to_surface, expected_color, overlap_rect) + assertSurfaceFilledIgnoreArea( + self, to_surface, surface_color, overlap_rect + ) def test_to_surface__area_on_mask_with_setsurface_unsetsurface(self): """Ensures area values on the mask work correctly From 096dc21e1363e1b209af25dd30fed53ca0608a84 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 8 Mar 2025 15:21:55 -0800 Subject: [PATCH 110/441] Fix Circle and Line reprs --- src_c/circle.c | 2 +- src_c/line.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src_c/circle.c b/src_c/circle.c index 03b36c94af..b236da023a 100644 --- a/src_c/circle.c +++ b/src_c/circle.c @@ -91,7 +91,7 @@ pg_circle_repr(pgCircleObject *self) return NULL; } - PyObject *result = PyUnicode_FromFormat("", x, y, r); + PyObject *result = PyUnicode_FromFormat("Circle((%R, %R), %R)", x, y, r); Py_DECREF(x); Py_DECREF(y); diff --git a/src_c/line.c b/src_c/line.c index ff6171b4ad..ad25ed4866 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -261,8 +261,7 @@ pg_line_repr(pgLineObject *self) return NULL; } - result = - PyUnicode_FromFormat("", ax, ay, bx, by); + result = PyUnicode_FromFormat("Line((%R, %R), (%R, %R))", ax, ay, bx, by); Py_DECREF(ax); Py_DECREF(ay); From 3e8b74f43fc3e1a19923ece4050e88f1c240075f Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 8 Mar 2025 15:26:25 -0800 Subject: [PATCH 111/441] Update geometry tests --- test/geometry_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/geometry_test.py b/test/geometry_test.py index 445d57e2af..53bdecc377 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -619,14 +619,14 @@ def test_diameter_del(self): def test__str__(self): """Checks whether the __str__ method works correctly.""" - c_str = "" + c_str = "Circle((10.3, 3.2), 4.3)" circle = Circle((10.3, 3.2), 4.3) self.assertEqual(str(circle), c_str) self.assertEqual(circle.__str__(), c_str) def test__repr__(self): """Checks whether the __repr__ method works correctly.""" - c_repr = "" + c_repr = "Circle((10.3, 3.2), 4.3)" circle = Circle((10.3, 3.2), 4.3) self.assertEqual(repr(circle), c_repr) self.assertEqual(circle.__repr__(), c_repr) @@ -2203,14 +2203,14 @@ def test_meth_update(self): def test__str__(self): """Checks whether the __str__ method works correctly.""" - l_str = "" + l_str = "Line((10.1, 10.2), (4.3, 56.4))" line = Line(10.1, 10.2, 4.3, 56.4) self.assertEqual(str(line), l_str) self.assertEqual(line.__str__(), l_str) def test__repr__(self): """Checks whether the __repr__ method works correctly.""" - l_repr = "" + l_repr = "Line((10.1, 10.2), (4.3, 56.4))" line = Line(10.1, 10.2, 4.3, 56.4) self.assertEqual(repr(line), l_repr) self.assertEqual(line.__repr__(), l_repr) From 4d1d65a3c31c3230595f5f76c924d63faefd999e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 06:16:22 +0000 Subject: [PATCH 112/441] Bump robinraju/release-downloader from 1.11 to 1.12 Bumps [robinraju/release-downloader](https://github.com/robinraju/release-downloader) from 1.11 to 1.12. - [Release notes](https://github.com/robinraju/release-downloader/releases) - [Commits](https://github.com/robinraju/release-downloader/compare/v1.11...v1.12) --- updated-dependencies: - dependency-name: robinraju/release-downloader dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-pypi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 97db455522..8cbdc626ee 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Pull all release assets - uses: robinraju/release-downloader@v1.11 + uses: robinraju/release-downloader@v1.12 with: releaseId: ${{ github.event.release.id }} fileName: "*" From 19e4fd579b1a585645dd3b5c9241b873c6f6a3b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 06:16:24 +0000 Subject: [PATCH 113/441] Bump actions/attest-build-provenance from 2.2.0 to 2.2.3 Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 2.2.0 to 2.2.3. - [Release notes](https://github.com/actions/attest-build-provenance/releases) - [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest-build-provenance/compare/v2.2.0...v2.2.3) --- updated-dependencies: - dependency-name: actions/attest-build-provenance dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/release-gh-draft.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index fcfc9de0f9..abedbec55b 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -41,7 +41,7 @@ jobs: run: echo "VER=${GITHUB_REF_NAME#'release/'}" >> $GITHUB_OUTPUT - name: Generate release attestation - uses: actions/attest-build-provenance@v2.2.0 + uses: actions/attest-build-provenance@v2.2.3 with: subject-path: "pygame-wheels/*" From 863647b2c531578cfa9d94696b951b169f036798 Mon Sep 17 00:00:00 2001 From: damusss Date: Tue, 11 Mar 2025 15:59:38 +0100 Subject: [PATCH 114/441] Include tutorials --- docs/meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/meson.build b/docs/meson.build index e60da6c7de..81416b0216 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -4,7 +4,6 @@ if fs.is_dir('generated') 'generated', exclude_directories: [ 'doctrees', - 'tutorials', '_sources/tutorials', '_sources/c_api', ], From 12141bf5e7b2cd5b40dd0deb47cc879f6c3b403c Mon Sep 17 00:00:00 2001 From: "Matt V." <97783221+mv805@users.noreply.github.com> Date: Tue, 11 Mar 2025 14:48:50 -0700 Subject: [PATCH 115/441] Improve SysFont documentation and add font verification warning. Closes #2643 (#3373) * Improve SysFont documentation and add font verification warning * Refactor font verification message for correct formatting in SysFont function --- src_py/sysfont.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 8879f3e128..7808418aa9 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -437,12 +437,13 @@ def SysFont(name, size, bold=False, italic=False, constructor=None): fall back on the builtin pygame font if the given font is not found. - Name can also be an iterable of font names, a string of - comma-separated font names, or a bytes of comma-separated - font names, in which case the set of names will be searched - in order. Pygame uses a small set of common font aliases. If the - specific font you ask for is not available, a reasonable - alternative may be used. + Name shall be supplied as the plain font name without + file extensions. Name can also be an iterable of font names, + a string of comma-separated font names, or a bytes of + comma-separated font names, in which case the set of names + will be searched in order. Pygame uses a small set of common + font aliases. If the specific font you ask for is not available, + a reasonable alternative may be used. If optional constructor is provided, it must be a function with signature constructor(fontpath, size, bold, italic) which returns @@ -469,12 +470,16 @@ def SysFont(name, size, bold=False, italic=False, constructor=None): break else: + font_verification_message = ( + "Verify your font name input. Using the default font instead." + ) + if len(name) > 1: names = "', '".join(name) warnings.warn( "None of the specified system fonts " f"('{names}') could be found. " - "Using the default font instead." + f"{font_verification_message}" ) else: # Identifies the closest matches to the font provided by @@ -490,7 +495,7 @@ def SysFont(name, size, bold=False, italic=False, constructor=None): warnings.warn( f"The system font '{name[0]}' couldn't be " f"found. {match_text}" - "Using the default font instead." + f"{font_verification_message}" ) else: fontname = None From 66cdd815aec447c7a02056956c949cb00e912612 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Wed, 12 Mar 2025 23:30:51 -0700 Subject: [PATCH 116/441] Update versionchanged of lazy imports --- docs/reST/ref/sndarray.rst | 2 +- docs/reST/ref/surfarray.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/sndarray.rst b/docs/reST/ref/sndarray.rst index 37b44d5c6d..caf2f81c0a 100644 --- a/docs/reST/ref/sndarray.rst +++ b/docs/reST/ref/sndarray.rst @@ -23,7 +23,7 @@ Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. -.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary +.. versionchanged:: 2.5.4 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array diff --git a/docs/reST/ref/surfarray.rst b/docs/reST/ref/surfarray.rst index 82fa4be8f5..5c0e3b5f19 100644 --- a/docs/reST/ref/surfarray.rst +++ b/docs/reST/ref/surfarray.rst @@ -35,7 +35,7 @@ pixels from the surface and any changes performed to the array will make changes in the surface. As this last functions share memory with the surface, this one will be locked during the lifetime of the array. -.. versionchanged:: 2.5.3 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary +.. versionchanged:: 2.5.4 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array2d From 1f313ce6f98c12d1557a2d65a2b2a6c9bf635cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Thu, 13 Mar 2025 17:09:32 +0100 Subject: [PATCH 117/441] Refactor bufferproxy --- docs/reST/c_api/bufferproxy.rst | 12 +-- src_c/_pygame.h | 1 + src_c/bufferproxy.c | 123 ++++++++++++----------------- src_c/include/_pygame.h | 30 +++++++ src_c/include/pygame_bufferproxy.h | 56 ------------- src_c/pgbufferproxy.h | 7 -- src_c/static.c | 2 +- src_c/surface.c | 7 +- 8 files changed, 92 insertions(+), 146 deletions(-) delete mode 100644 src_c/include/pygame_bufferproxy.h delete mode 100644 src_c/pgbufferproxy.h diff --git a/docs/reST/c_api/bufferproxy.rst b/docs/reST/c_api/bufferproxy.rst index 4f4e71a917..5edaf7b4ae 100644 --- a/docs/reST/c_api/bufferproxy.rst +++ b/docs/reST/c_api/bufferproxy.rst @@ -11,20 +11,20 @@ src_c/bufferproxy.c This extension module defines Python type :py:class:`pygame.BufferProxy`. -Header file: src_c/include/pygame_bufferproxy.h +Header file: src_c/include/pygame.h -.. c:var:: PyTypeObject *pgBufproxy_Type +.. c:var:: PyTypeObject *pgBufferProxy_Type The pygame buffer proxy object type pygame.BufferProxy. -.. c:function:: int pgBufproxy_Check(PyObject *x) +.. c:function:: int pgBufferProxy_Check(PyObject *x) Return true if Python object *x* is a :py:class:`pygame.BufferProxy` instance, false otherwise. This will return false on :py:class:`pygame.BufferProxy` subclass instances as well. -.. c:function:: PyObject* pgBufproxy_New(PyObject *obj, getbufferproc get_buffer) +.. c:function:: PyObject* pgBufferProxy_New(PyObject *obj, getbufferproc get_buffer) Return a new :py:class:`pygame.BufferProxy` instance. Argument *obj* is the Python object that has its data exposed. @@ -33,13 +33,13 @@ Header file: src_c/include/pygame_bufferproxy.h It must not be ``NULL``. On failure raise a Python error and return ``NULL``. -.. c:function:: PyObject* pgBufproxy_GetParent(PyObject *obj) +.. c:function:: PyObject* pgBufferProxy_GetParent(PyObject *obj) Return the Python object wrapped by buffer proxy *obj*. Argument *obj* must not be ``NULL``. On failure, raise a Python error and return ``NULL``. -.. c:function:: int pgBufproxy_Trip(PyObject *obj) +.. c:function:: int pgBufferProxy_Trip(PyObject *obj) Cause the buffer proxy object *obj* to create a :c:type:`pg_buffer` view of its parent. Argument *obj* must not be ``NULL``. diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 3bba7ed079..77fda23aeb 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -626,5 +626,6 @@ typedef enum { #define PYGAMEAPI_WINDOW_NUMSLOTS 1 #define PYGAMEAPI_RENDER_NUMSLOTS 3 #define PYGAMEAPI_GEOMETRY_NUMSLOTS 2 +#define PYGAMEAPI_BUFFERPROXY_NUMSLOTS 4 #endif /* _PYGAME_INTERNAL_H */ diff --git a/src_c/bufferproxy.c b/src_c/bufferproxy.c index 1c41fa0813..a506ac7ec8 100644 --- a/src_c/bufferproxy.c +++ b/src_c/bufferproxy.c @@ -27,25 +27,12 @@ Python level - __array_interface__ - are exposed. */ -#define PY_SSIZE_T_CLEAN -#define PYGAMEAPI_BUFPROXY_INTERNAL +#define PYGAMEAPI_BUFFERPROXY_INTERNAL + #include "pygame.h" #include "pgcompat.h" -#include "pgbufferproxy.h" #include "doc/bufferproxy_doc.h" -#include - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define BUFPROXY_MY_ENDIAN '<' -#define BUFPROXY_OTHER_ENDIAN '>' -#else -#define BUFPROXY_MY_ENDIAN '>' -#define BUFPROXY_OTHER_ENDIAN '<' -#endif - -#define PROXY_MODNAME "bufferproxy" -#define PROXY_TYPE_NAME "BufferProxy" #ifdef NDEBUG #define PyBUF_PG_VIEW PyBUF_RECORDS @@ -55,22 +42,14 @@ #define PyBUF_PG_VIEW_RO (PyBUF_RECORDS_RO | PyBUF_PYGAME) #endif -typedef struct pgBufproxyObject_s { - PyObject_HEAD PyObject *obj; /* Wrapped object (parent) */ - pg_buffer *pg_view_p; /* For array interface export */ - getbufferproc get_buffer; /* pg_buffer get callback */ - PyObject *dict; /* Allow arbitrary attributes */ - PyObject *weakrefs; /* Reference cycles can happen */ -} pgBufproxyObject; - static int -pgBufproxy_Trip(PyObject *); +pgBufferProxy_Trip(PyObject *); static Py_buffer * -_proxy_get_view(pgBufproxyObject *); +_proxy_get_view(pgBufferProxyObject *); static int -proxy_getbuffer(pgBufproxyObject *, Py_buffer *, int); +proxy_getbuffer(pgBufferProxyObject *, Py_buffer *, int); static void -proxy_releasebuffer(pgBufproxyObject *, Py_buffer *); +proxy_releasebuffer(pgBufferProxyObject *, Py_buffer *); static void _release_buffer_from_dict(Py_buffer *); @@ -171,14 +150,14 @@ _release_buffer_from_dict(Py_buffer *view_p) /* Stub functions */ static PyObject * -proxy_get_raw(pgBufproxyObject *, PyObject *); +proxy_get_raw(pgBufferProxyObject *, PyObject *); /* End transitional stuff */ static PyObject * _proxy_subtype_new(PyTypeObject *type, PyObject *obj, getbufferproc get_buffer) { - pgBufproxyObject *self = (pgBufproxyObject *)type->tp_alloc(type, 0); + pgBufferProxyObject *self = (pgBufferProxyObject *)type->tp_alloc(type, 0); if (!self) { return 0; @@ -190,7 +169,7 @@ _proxy_subtype_new(PyTypeObject *type, PyObject *obj, getbufferproc get_buffer) } static Py_buffer * -_proxy_get_view(pgBufproxyObject *proxy) +_proxy_get_view(pgBufferProxyObject *proxy) { pg_buffer *pg_view_p = proxy->pg_view_p; @@ -214,7 +193,7 @@ _proxy_get_view(pgBufproxyObject *proxy) } static void -_proxy_release_view(pgBufproxyObject *proxy) +_proxy_release_view(pgBufferProxyObject *proxy) { pg_buffer *pg_view_p = proxy->pg_view_p; @@ -240,7 +219,7 @@ _proxy_zombie_get_buffer(PyObject *obj, Py_buffer *view_p, int flags) } /** - * Return a new pgBufproxyObject (Python level constructor). + * Return a new pgBufferProxyObject (Python level constructor). */ static PyObject * proxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -248,7 +227,7 @@ proxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *obj; getbufferproc get_buffer = (getbufferproc)pgObject_GetBuffer; - if (!PyArg_ParseTuple(args, "O:Bufproxy", &obj)) { + if (!PyArg_ParseTuple(args, "O:BufferProxy", &obj)) { return 0; } if (PyDict_Check(obj)) { @@ -258,11 +237,11 @@ proxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } /** - * Deallocates the pgBufproxyObject and its members. + * Deallocates the pgBufferProxyObject and its members. * Is reentrant. */ static void -proxy_dealloc(pgBufproxyObject *self) +proxy_dealloc(pgBufferProxyObject *self) { /* Prevent infinite recursion from a reentrant call */ if (self->get_buffer == _proxy_zombie_get_buffer) { @@ -282,7 +261,7 @@ proxy_dealloc(pgBufproxyObject *self) } static int -proxy_traverse(pgBufproxyObject *self, visitproc visit, void *arg) +proxy_traverse(pgBufferProxyObject *self, visitproc visit, void *arg) { if (self->obj) { Py_VISIT(self->obj); @@ -299,7 +278,7 @@ proxy_traverse(pgBufproxyObject *self, visitproc visit, void *arg) /**** Getter and setter access ****/ static PyObject * -proxy_get_arraystruct(pgBufproxyObject *self, PyObject *closure) +proxy_get_arraystruct(pgBufferProxyObject *self, PyObject *closure) { Py_buffer *view_p = _proxy_get_view(self); PyObject *capsule; @@ -315,7 +294,7 @@ proxy_get_arraystruct(pgBufproxyObject *self, PyObject *closure) } static PyObject * -proxy_get_arrayinterface(pgBufproxyObject *self, PyObject *closure) +proxy_get_arrayinterface(pgBufferProxyObject *self, PyObject *closure) { Py_buffer *view_p = _proxy_get_view(self); PyObject *dict; @@ -331,7 +310,7 @@ proxy_get_arrayinterface(pgBufproxyObject *self, PyObject *closure) } static PyObject * -proxy_get_parent(pgBufproxyObject *self, PyObject *closure) +proxy_get_parent(pgBufferProxyObject *self, PyObject *closure) { Py_buffer *view_p = _proxy_get_view(self); PyObject *obj; @@ -345,7 +324,7 @@ proxy_get_parent(pgBufproxyObject *self, PyObject *closure) } static PyObject * -proxy_get___dict__(pgBufproxyObject *self, PyObject *closure) +proxy_get___dict__(pgBufferProxyObject *self, PyObject *closure) { if (!self->dict) { self->dict = PyDict_New(); @@ -358,7 +337,7 @@ proxy_get___dict__(pgBufproxyObject *self, PyObject *closure) } static PyObject * -proxy_get_raw(pgBufproxyObject *self, PyObject *closure) +proxy_get_raw(pgBufferProxyObject *self, PyObject *closure) { Py_buffer *view_p = _proxy_get_view(self); PyObject *py_raw = 0; @@ -380,7 +359,7 @@ proxy_get_raw(pgBufproxyObject *self, PyObject *closure) } static PyObject * -proxy_get_length(pgBufproxyObject *self, PyObject *closure) +proxy_get_length(pgBufferProxyObject *self, PyObject *closure) { Py_buffer *view_p = _proxy_get_view(self); PyObject *py_length = 0; @@ -400,7 +379,7 @@ proxy_get_length(pgBufproxyObject *self, PyObject *closure) * Representation method. */ static PyObject * -proxy_repr(pgBufproxyObject *self) +proxy_repr(pgBufferProxyObject *self) { Py_buffer *view_p = _proxy_get_view(self); @@ -414,7 +393,7 @@ proxy_repr(pgBufproxyObject *self) * Writes raw data to the buffer. */ static PyObject * -proxy_write(pgBufproxyObject *self, PyObject *args, PyObject *kwds) +proxy_write(pgBufferProxyObject *self, PyObject *args, PyObject *kwds) { Py_buffer view; const char *buf = 0; @@ -462,7 +441,7 @@ static struct PyMethodDef proxy_methods[] = { {0, 0, 0, 0}}; /** - * Getters and setters for the pgBufproxyObject. + * Getters and setters for the pgBufferProxyObject. */ static PyGetSetDef proxy_getsets[] = { {"__array_struct__", (getter)proxy_get_arraystruct, 0, @@ -477,7 +456,7 @@ static PyGetSetDef proxy_getsets[] = { {0, 0, 0, 0, 0}}; static int -proxy_getbuffer(pgBufproxyObject *self, Py_buffer *view_p, int flags) +proxy_getbuffer(pgBufferProxyObject *self, Py_buffer *view_p, int flags) { Py_buffer *obj_view_p = PyMem_Malloc(sizeof(pg_buffer)); @@ -510,7 +489,7 @@ proxy_getbuffer(pgBufproxyObject *self, Py_buffer *view_p, int flags) } static void -proxy_releasebuffer(pgBufproxyObject *self, Py_buffer *view_p) +proxy_releasebuffer(pgBufferProxyObject *self, Py_buffer *view_p) { pgBuffer_Release((pg_buffer *)view_p->internal); PyMem_Free(view_p->internal); @@ -524,19 +503,19 @@ static PyBufferProcs proxy_bufferprocs = { #define PROXY_TPFLAGS \ (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC) -static PyTypeObject pgBufproxy_Type = { +static PyTypeObject pgBufferProxy_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame.bufferproxy.BufferProxy", - .tp_basicsize = sizeof(pgBufproxyObject), + .tp_basicsize = sizeof(pgBufferProxyObject), .tp_dealloc = (destructor)proxy_dealloc, .tp_repr = (reprfunc)proxy_repr, .tp_as_buffer = PROXY_BUFFERPROCS, .tp_flags = PROXY_TPFLAGS, .tp_doc = DOC_BUFFERPROXY, .tp_traverse = (traverseproc)proxy_traverse, - .tp_weaklistoffset = offsetof(pgBufproxyObject, weakrefs), + .tp_weaklistoffset = offsetof(pgBufferProxyObject, weakrefs), .tp_methods = proxy_methods, .tp_getset = proxy_getsets, - .tp_dictoffset = offsetof(pgBufproxyObject, dict), + .tp_dictoffset = offsetof(pgBufferProxyObject, dict), .tp_alloc = PyType_GenericAlloc, .tp_new = proxy_new, .tp_free = PyObject_GC_Del, @@ -549,7 +528,7 @@ static PyMethodDef bufferproxy_methods[] = {{0, 0, 0, 0}}; /**** Public C api ***/ static PyObject * -pgBufproxy_New(PyObject *obj, getbufferproc get_buffer) +pgBufferProxy_New(PyObject *obj, getbufferproc get_buffer) { if (!get_buffer) { if (!obj) { @@ -560,31 +539,31 @@ pgBufproxy_New(PyObject *obj, getbufferproc get_buffer) } get_buffer = (getbufferproc)pgObject_GetBuffer; } - return _proxy_subtype_new(&pgBufproxy_Type, obj, get_buffer); + return _proxy_subtype_new(&pgBufferProxy_Type, obj, get_buffer); } static PyObject * -pgBufproxy_GetParent(PyObject *obj) +pgBufferProxy_GetParent(PyObject *obj) { - if (!PyObject_IsInstance(obj, (PyObject *)&pgBufproxy_Type)) { + if (!PyObject_IsInstance(obj, (PyObject *)&pgBufferProxy_Type)) { PyErr_Format(PyExc_TypeError, "Expected a BufferProxy object: got %s instance instead", Py_TYPE(obj)->tp_name); return 0; } - return proxy_get_parent((pgBufproxyObject *)obj, 0); + return proxy_get_parent((pgBufferProxyObject *)obj, 0); } static int -pgBufproxy_Trip(PyObject *obj) +pgBufferProxy_Trip(PyObject *obj) { - if (!PyObject_IsInstance(obj, (PyObject *)&pgBufproxy_Type)) { + if (!PyObject_IsInstance(obj, (PyObject *)&pgBufferProxy_Type)) { PyErr_Format(PyExc_TypeError, "Expected a BufferProxy object: got %s instance instead", Py_TYPE(obj)->tp_name); return -1; } - return _proxy_get_view((pgBufproxyObject *)obj) ? 0 : -1; + return _proxy_get_view((pgBufferProxyObject *)obj) ? 0 : -1; } /*DOC*/ static char bufferproxy_doc[] = DOC_BUFFERPROXY; @@ -592,10 +571,10 @@ pgBufproxy_Trip(PyObject *obj) MODINIT_DEFINE(bufferproxy) { PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_BUFPROXY_NUMSLOTS]; + static void *c_api[PYGAMEAPI_BUFFERPROXY_NUMSLOTS]; static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, - PROXY_MODNAME, + "bufferproxy", bufferproxy_doc, -1, bufferproxy_methods, @@ -611,7 +590,7 @@ MODINIT_DEFINE(bufferproxy) } /* prepare exported types */ - if (PyType_Ready(&pgBufproxy_Type) < 0) { + if (PyType_Ready(&pgBufferProxy_Type) < 0) { return NULL; } @@ -623,21 +602,21 @@ MODINIT_DEFINE(bufferproxy) return NULL; } - Py_INCREF(&pgBufproxy_Type); - if (PyModule_AddObject(module, PROXY_TYPE_NAME, - (PyObject *)&pgBufproxy_Type)) { - Py_DECREF(&pgBufproxy_Type); + Py_INCREF(&pgBufferProxy_Type); + if (PyModule_AddObject(module, "BufferProxy", + (PyObject *)&pgBufferProxy_Type)) { + Py_DECREF(&pgBufferProxy_Type); Py_DECREF(module); return NULL; } -#if PYGAMEAPI_BUFPROXY_NUMSLOTS != 4 +#if PYGAMEAPI_BUFFERPROXY_NUMSLOTS != 4 #error export slot count mismatch #endif - c_api[0] = &pgBufproxy_Type; - c_api[1] = pgBufproxy_New; - c_api[2] = pgBufproxy_GetParent; - c_api[3] = pgBufproxy_Trip; - apiobj = encapsulate_api(c_api, PROXY_MODNAME); + c_api[0] = &pgBufferProxy_Type; + c_api[1] = pgBufferProxy_New; + c_api[2] = pgBufferProxy_GetParent; + c_api[3] = pgBufferProxy_Trip; + apiobj = encapsulate_api(c_api, "bufferproxy"); if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_XDECREF(apiobj); Py_DECREF(module); diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 2b2be56996..f1439393a4 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -452,6 +452,34 @@ typedef struct pgEventObject pgEventObject; #define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray) #endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */ +/* + * BufferProxy module + */ +typedef struct { + PyObject_HEAD PyObject *obj; /* Wrapped object (parent) */ + pg_buffer *pg_view_p; /* For array interface export */ + getbufferproc get_buffer; /* pg_buffer get callback */ + PyObject *dict; /* Allow arbitrary attributes */ + PyObject *weakrefs; /* Reference cycles can happen */ +} pgBufferProxyObject; + +#ifndef PYGAMEAPI_BUFFERPROXY_INTERNAL +#define pgBufferProxy_Type \ + (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(bufferproxy, 0)) + +#define pgBufferProxy_Check(x) ((x)->ob_type == &pgBufferProxy_Type) +#define pgBufferProxy_New \ + (*(PyObject * (*)(PyObject *, getbufferproc)) \ + PYGAMEAPI_GET_SLOT(bufferproxy, 1)) + +#define pgBufferProxy_GetParent \ + (*(PyObject * (*)(PyObject *)) PYGAMEAPI_GET_SLOT(bufferproxy, 2)) +#define pgBufferProxy_Trip \ + (*(int (*)(PyObject *))PYGAMEAPI_GET_SLOT(bufferproxy, 3)) + +#define import_pygame_bufferproxy() _IMPORT_PYGAME_MODULE(bufferproxy) +#endif /* ~PYGAMEAPI_BUFFERPROXY_INTERNAL */ + /* * Color module */ @@ -580,6 +608,7 @@ PYGAMEAPI_DEFINE_SLOTS(surflock); PYGAMEAPI_DEFINE_SLOTS(event); PYGAMEAPI_DEFINE_SLOTS(rwobject); PYGAMEAPI_DEFINE_SLOTS(pixelarray); +PYGAMEAPI_DEFINE_SLOTS(bufferproxy); PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); PYGAMEAPI_DEFINE_SLOTS(window); @@ -595,6 +624,7 @@ PYGAMEAPI_EXTERN_SLOTS(surflock); PYGAMEAPI_EXTERN_SLOTS(event); PYGAMEAPI_EXTERN_SLOTS(rwobject); PYGAMEAPI_EXTERN_SLOTS(pixelarray); +PYGAMEAPI_EXTERN_SLOTS(bufferproxy); PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); PYGAMEAPI_EXTERN_SLOTS(window); diff --git a/src_c/include/pygame_bufferproxy.h b/src_c/include/pygame_bufferproxy.h deleted file mode 100644 index 97a3133834..0000000000 --- a/src_c/include/pygame_bufferproxy.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - pygame-ce - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - Copyright (C) 2007 Rene Dudfield, Richard Goedeken - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -/* Bufferproxy module C api. */ -#if !defined(PG_BUFPROXY_HEADER) -#define PG_BUFPROXY_HEADER - -#include - -typedef PyObject *(*_pgbufproxy_new_t)(PyObject *, getbufferproc); -typedef PyObject *(*_pgbufproxy_get_obj_t)(PyObject *); -typedef int (*_pgbufproxy_trip_t)(PyObject *); - -#ifndef PYGAMEAPI_BUFPROXY_INTERNAL - -#include "pgimport.h" - -PYGAMEAPI_DEFINE_SLOTS(bufferproxy); - -#define pgBufproxy_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(bufferproxy, 0)) - -#define pgBufproxy_Check(x) ((x)->ob_type == &pgBufproxy_Type) - -#define pgBufproxy_New (*(_pgbufproxy_new_t)PYGAMEAPI_GET_SLOT(bufferproxy, 1)) - -#define pgBufproxy_GetParent \ - (*(_pgbufproxy_get_obj_t)PYGAMEAPI_GET_SLOT(bufferproxy, 2)) - -#define pgBufproxy_Trip \ - (*(_pgbufproxy_trip_t)PYGAMEAPI_GET_SLOT(bufferproxy, 3)) - -#define import_pygame_bufferproxy() _IMPORT_PYGAME_MODULE(bufferproxy) - -#endif /* ~PYGAMEAPI_BUFPROXY_INTERNAL */ - -#endif /* ~defined(PG_BUFPROXY_HEADER) */ diff --git a/src_c/pgbufferproxy.h b/src_c/pgbufferproxy.h deleted file mode 100644 index 150760867e..0000000000 --- a/src_c/pgbufferproxy.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PG_BUFPROXY_INTERNAL_H -#define PG_BUFPROXY_INTERNAL_H - -#include "include/pygame_bufferproxy.h" -#define PYGAMEAPI_BUFPROXY_NUMSLOTS 4 - -#endif /* ~PG_BUFPROXY_INTERNAL_H */ diff --git a/src_c/static.c b/src_c/static.c index ac771e491b..e526426ecf 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -355,7 +355,7 @@ PyInit_pygame_static() #include "color.c" -#undef pgBufproxy_New +#undef pgBufferProxy_New #include "bufferproxy.c" diff --git a/src_c/surface.c b/src_c/surface.c index 9dde1f92ff..aaecc7e93f 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -30,7 +30,6 @@ #include "structmember.h" #include "pgcompat.h" #include "doc/surface_doc.h" -#include "pgbufferproxy.h" /* stdint.h is missing from some versions of MSVC. */ #ifdef _MSC_VER @@ -3404,7 +3403,7 @@ surf_get_view(PyObject *self, PyObject *args) #endif } assert(get_buffer); - return pgBufproxy_New(self, get_buffer); + return pgBufferProxy_New(self, get_buffer); } static PyObject * @@ -3415,9 +3414,9 @@ surf_get_buffer(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surface) - proxy_obj = pgBufproxy_New(self, _get_buffer_0D); + proxy_obj = pgBufferProxy_New(self, _get_buffer_0D); if (proxy_obj) { - if (pgBufproxy_Trip(proxy_obj)) { + if (pgBufferProxy_Trip(proxy_obj)) { Py_DECREF(proxy_obj); proxy_obj = 0; } From af3fa86daef81406f4c5c4b6c15cf90ea39da39d Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:57:13 +0200 Subject: [PATCH 118/441] update and clarify the documentation --- docs/reST/ref/mask.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/mask.rst b/docs/reST/ref/mask.rst index f40103c694..a3ef716742 100644 --- a/docs/reST/ref/mask.rst +++ b/docs/reST/ref/mask.rst @@ -613,8 +613,10 @@ to store which parts collide. :param area: (optional) rectangular portion of the mask to draw. It can be a rect-like object (a Rect, a tuple or a list with 4 numbers or an object with a rect attribute, etc) or it can be None (the default) in which case it will use the - entire mask. Just like with Surface.blit, if the rect's topleft is negative - the final destination will be ``dest - rect.topleft``. + entire mask. If the given rect pertrudes outside the bounds of the mask (as returned + by :meth:`get_rect`), it will get clipped to fit those boundaries. If the final rect + is smaller than the mask and no destination ``surface`` is given, the returned surface + will have the same size as this final rect. :type area: Rect or rect-like object :returns: the ``surface`` parameter (or a newly created surface if no From e563e94f1286a5cf2f45e944d6ae3c2fef05467a Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Fri, 14 Mar 2025 01:12:59 +0200 Subject: [PATCH 119/441] tests to make sure that setsurface and unsetsurface are aligned with mask's actual (0, 0) --- test/mask_test.py | 228 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) diff --git a/test/mask_test.py b/test/mask_test.py index 30782bcbb6..7a024caad7 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -2905,6 +2905,234 @@ def test_to_surface__area_output(self): for x, value in enumerate(row): self.assertEqual(surface.get_at((x, y)), value) + def create_surface_from_array( + self, size: tuple[int, int], array: list[list[pygame.Color]], *args, **kwargs + ) -> pygame.Surface: + assert (len(array), len(array[0])) == size + + surface = pygame.Surface(size, *args, **kwargs) + for y, row in enumerate(array): + for x, color in enumerate(row): + surface.set_at((x, y), color) + + return surface + + def assert_surface_matches_array( + self, surface: pygame.Surface, array: list[list[pygame.Color]] + ) -> None: + assert (len(array), len(array[0])) == surface.get_size() + + for y, row in enumerate(array): + for x, color in enumerate(row): + with self.subTest(x=x, y=y, color=color): + self.assertEqual(color, surface.get_at((x, y))) + + def test_to_surface__area_with_setsurface_create_new(self): + c_1 = pygame.Color("red") + c_2 = pygame.Color("green") + size = (4, 4) + + mask = pygame.Mask(size, fill=True) + + set_surface = self.create_surface_from_array( + size=size, + array=[ + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_1, c_1], + [c_1, c_1, c_1, c_1], + ], + flags=SRCALPHA, + ) + + area = pygame.Rect(0, 0, 2, 2) + expected_pixels = [ + [c_1, c_1], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, setsurface=set_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(1, 1, 2, 2) + expected_pixels = [ + [c_1, c_2], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, setsurface=set_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(2, 1, 2, 2) + expected_pixels = [ + [c_2, c_2], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, setsurface=set_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + def test_to_surface__area_with_unsetsurface_create_new(self): + c_1 = pygame.Color("red") + c_2 = pygame.Color("green") + size = (4, 4) + + mask = pygame.Mask(size, fill=False) + + unset_surface = self.create_surface_from_array( + size=size, + array=[ + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_1, c_1], + [c_1, c_1, c_1, c_1], + ], + flags=SRCALPHA, + ) + + area = pygame.Rect(0, 0, 2, 2) + expected_pixels = [ + [c_1, c_1], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, unsetsurface=unset_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(1, 1, 2, 2) + expected_pixels = [ + [c_1, c_2], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, unsetsurface=unset_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(2, 1, 2, 2) + expected_pixels = [ + [c_2, c_2], + [c_1, c_1], + ] + surface = mask.to_surface(area=area, unsetsurface=unset_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + def test_to_surface__area_with_setsurface_to_destination(self): + c_1 = pygame.Color("red") + c_2 = pygame.Color("green") + c_3 = pygame.Color("blue") + size = (4, 4) + + mask = pygame.Mask(size, fill=True) + + set_surface = self.create_surface_from_array( + size=size, + array=[ + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_1, c_1], + [c_1, c_1, c_1, c_1], + ], + ) + + area = pygame.Rect(0, 0, 2, 2) + expected_pixels = [ + [c_1, c_1, c_3, c_3], + [c_1, c_1, c_3, c_3], + [c_3, c_3, c_3, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface(surface=surface, area=area, setsurface=set_surface) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(1, 1, 2, 2) + dest = (2, 0) + expected_pixels = [ + [c_3, c_3, c_1, c_2], + [c_3, c_3, c_1, c_1], + [c_3, c_3, c_3, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface( + surface=surface, dest=dest, area=area, setsurface=set_surface + ) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(2, 1, 2, 2) + dest = (1, 1) + expected_pixels = [ + [c_3, c_3, c_3, c_3], + [c_3, c_2, c_2, c_3], + [c_3, c_1, c_1, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface( + surface=surface, dest=dest, area=area, setsurface=set_surface + ) + self.assert_surface_matches_array(surface, expected_pixels) + + def test_to_surface__area_with_unsetsurface_to_destination(self): + c_1 = pygame.Color("red") + c_2 = pygame.Color("green") + c_3 = pygame.Color("blue") + size = (4, 4) + + mask = pygame.Mask(size, fill=False) + + unset_surface = self.create_surface_from_array( + size=size, + array=[ + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_2, c_2], + [c_1, c_1, c_1, c_1], + [c_1, c_1, c_1, c_1], + ], + ) + + area = pygame.Rect(0, 0, 2, 2) + expected_pixels = [ + [c_1, c_1, c_3, c_3], + [c_1, c_1, c_3, c_3], + [c_3, c_3, c_3, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface( + surface=surface, area=area, unsetsurface=unset_surface + ) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(1, 1, 2, 2) + dest = (2, 0) + expected_pixels = [ + [c_3, c_3, c_1, c_2], + [c_3, c_3, c_1, c_1], + [c_3, c_3, c_3, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface( + surface=surface, dest=dest, area=area, unsetsurface=unset_surface + ) + self.assert_surface_matches_array(surface, expected_pixels) + + area = pygame.Rect(2, 1, 2, 2) + dest = (1, 1) + expected_pixels = [ + [c_3, c_3, c_3, c_3], + [c_3, c_2, c_2, c_3], + [c_3, c_1, c_1, c_3], + [c_3, c_3, c_3, c_3], + ] + surface = pygame.Surface(size) + surface.fill(c_3) + surface = mask.to_surface( + surface=surface, dest=dest, area=area, unsetsurface=unset_surface + ) + self.assert_surface_matches_array(surface, expected_pixels) + def test_to_surface__area_default(self): """Ensures the default area is correct.""" expected_color = pygame.Color("white") From f1a547e5067a547b746316936425cca61086a904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Fri, 14 Mar 2025 14:01:25 +0100 Subject: [PATCH 120/441] Refactor bufferproxy --- src_c/bufferproxy.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src_c/bufferproxy.c b/src_c/bufferproxy.c index a506ac7ec8..cb81812d52 100644 --- a/src_c/bufferproxy.c +++ b/src_c/bufferproxy.c @@ -29,6 +29,8 @@ #define PYGAMEAPI_BUFFERPROXY_INTERNAL +#include + #include "pygame.h" #include "pgcompat.h" From 364a534f72959accdfd7c3b087c1b7ae7d613853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Fri, 14 Mar 2025 14:12:59 +0100 Subject: [PATCH 121/441] Refactor bufferproxy --- src_c/static.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_c/static.c b/src_c/static.c index e526426ecf..2a2a6fe1aa 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -7,6 +7,7 @@ #define PYGAMEAPI_JOYSTICK_INTERNAL #define PYGAMEAPI_BASE_INTERNAL #define PYGAMEAPI_SURFACE_INTERNAL +#define PYGAMEAPI_BUFFERPROXY_INTERNAL #define PYGAMEAPI_WINDOW_INTERNAL #define PYGAMEAPI_RENDER_INTERNAL From 56bad98cee924028bce0ca9f5f3ef5babd78d377 Mon Sep 17 00:00:00 2001 From: damusss Date: Sat, 15 Mar 2025 00:34:21 +0100 Subject: [PATCH 122/441] Fix set_mode 0-size warning false positives --- src_c/display.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src_c/display.c b/src_c/display.c index fa45a6f1ca..ebf3e8b1ad 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -988,6 +988,8 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) desktop resolution without breaking compatibility. */ w = display_mode.w; h = display_mode.h; + w_actual = w; /* avoid warning false positives */ + h_actual = h; } if (flags & PGS_FULLSCREEN) { From 86271de8f93cdb73473d2b705fc88def4ec2aa23 Mon Sep 17 00:00:00 2001 From: damusss Date: Sat, 15 Mar 2025 09:44:55 +0100 Subject: [PATCH 123/441] Don't warn with zero size with RESIZABLE --- src_c/display.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index ebf3e8b1ad..64f92bc248 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -871,6 +871,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) SDL_Surface *newownedsurf = NULL; int depth = 0; int flags = 0; + int zero_size = 0; int w, h, w_actual, h_actual; PyObject *size = NULL; int vsync = SDL_FALSE; @@ -988,8 +989,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) desktop resolution without breaking compatibility. */ w = display_mode.w; h = display_mode.h; - w_actual = w; /* avoid warning false positives */ - h_actual = h; + zero_size = 1; } if (flags & PGS_FULLSCREEN) { @@ -1434,7 +1434,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) * be respected enough that we don't need to issue a warning */ if (!state->using_gl && ((flags & (PGS_SCALED | PGS_FULLSCREEN)) == 0) && - !vsync) { + !vsync && (((flags & PGS_RESIZABLE) == 0) || !zero_size)) { if (((surface->surf->w != w_actual) || (surface->surf->h != h_actual)) && ((surface->surf->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0)) { From aef8f35e2f50e8c4ab3b1aa87624ff13d15de035 Mon Sep 17 00:00:00 2001 From: damusss Date: Sat, 15 Mar 2025 21:40:21 +0100 Subject: [PATCH 124/441] Make the warning message clearer --- src_c/display.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 64f92bc248..8f72dcbcc6 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -1440,10 +1440,10 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) ((surface->surf->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0)) { char buffer[150]; char *format_string = - "Requested window size was smaller than minimum supported " - "window size on platform. Using (%d, %d) instead."; - snprintf(buffer, sizeof(buffer), format_string, surface->surf->w, - surface->surf->h); + "Requested window was forcibly resized by the OS.\n\t" + "Requested window size: (%d, %d)\n\tNew window size: (%d, %d)"; + snprintf(buffer, sizeof(buffer), format_string, w_actual, h_actual, + surface->surf->w, surface->surf->h); if (PyErr_WarnEx(PyExc_RuntimeWarning, buffer, 1) != 0) { return NULL; } From 88d889905af089c0e2501c1fea5dd5ee88910122 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sun, 16 Mar 2025 11:48:14 +0100 Subject: [PATCH 125/441] Move draw docs to stubs --- buildconfig/stubs/pygame/draw.pyi | 499 ++++++++++++++++++++++++++- buildconfig/stubs/pygame/image.pyi | 1 - docs/reST/ref/draw.rst | 537 +---------------------------- src_c/doc/draw_doc.h | 22 +- 4 files changed, 503 insertions(+), 556 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 68ad3ace5b..4900e1ab27 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -1,3 +1,33 @@ +"""Pygame module for drawing shapes. + +Draw several simple shapes to a surface. These functions will work for +rendering to any format of surface. + +Most of the functions take a width argument to represent the size of stroke +(thickness) around the edge of the shape. If a width of 0 is passed the shape +will be filled (solid). + +All the drawing functions respect the clip area for the surface and will be +constrained to that area. The functions return a rectangle representing the +bounding area of changed pixels. This bounding rectangle is the 'minimum' +bounding box that encloses the affected area. + +All the drawing functions accept a color argument that is compatible with +:data:`pygame.typing.ColorLike`. + +A color's alpha value will be written directly into the surface (if the +surface contains pixel alphas), but the draw function will not draw +transparently. + +These functions temporarily lock the surface they are operating on. Many +sequential drawing calls can be sped up by locking and unlocking the surface +object around the draw calls (see :func:`pygame.Surface.lock` and +:func:`pygame.Surface.unlock`). + +.. note :: + See the :mod:`pygame.gfxdraw` module for alternative draw methods. +""" + from pygame.rect import Rect from pygame.surface import Surface from typing import overload @@ -14,13 +44,108 @@ def rect( border_top_right_radius: int = -1, border_bottom_left_radius: int = -1, border_bottom_right_radius: int = -1, -) -> Rect: ... +) -> Rect: + """Draw a rectangle. + + Draws a rectangle on the given surface. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param Rect rect: rectangle to draw, position and dimensions + :param int width: (optional) used for line thickness or to indicate that + the rectangle is to be filled (not to be confused with the width value + of the ``rect`` parameter) + + | if ``width == 0``, (default) fill the rectangle + | if ``width > 0``, used for line thickness + | if ``width < 0``, nothing will be drawn + | + + :param int border_radius: (optional) used for drawing rectangle with rounded corners. + The supported range is [0, min(height, width) / 2], with 0 representing a rectangle + without rounded corners. + :param int border_top_left_radius: (optional) used for setting the value of top left + border. If you don't set this value, it will use the border_radius value. + :param int border_top_right_radius: (optional) used for setting the value of top right + border. If you don't set this value, it will use the border_radius value. + :param int border_bottom_left_radius: (optional) used for setting the value of bottom left + border. If you don't set this value, it will use the border_radius value. + :param int border_bottom_right_radius: (optional) used for setting the value of bottom right + border. If you don't set this value, it will use the border_radius value. + + | if ``border_radius < 1`` it will draw rectangle without rounded corners + | if any of border radii has the value ``< 0`` it will use value of the border_radius + | If sum of radii on the same side of the rectangle is greater than the rect size the radii + | will get scaled + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the given ``rect`` + parameter and its width and height will be 0 + :rtype: Rect + + .. note:: + The :func:`pygame.Surface.fill()` method works just as well for drawing + filled rectangles and can be hardware accelerated on some platforms. + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + .. versionchangedold:: 2.0.0.dev8 Added support for border radius. + .. versionchangedold:: 2.1.1 + Drawing rects with width now draws the width correctly inside the + rect's area, rather than using an internal call to draw.lines(), + which had half the width spill outside the rect area. + """ + def polygon( surface: Surface, color: ColorLike, points: SequenceLike[Point], width: int = 0, -) -> Rect: ... +) -> Rect: + """Draw a polygon. + + Draws a polygon on the given surface. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param points: a sequence of 3 or more (x, y) coordinates that make up the + vertices of the polygon, each point in the sequence must be a + tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats, + e.g. ``[(x1, y1), (x2, y2), (x3, y3)]`` + :type points: tuple(point) or list(point) + :param int width: (optional) used for line thickness or to indicate that + the polygon is to be filled + + | if width == 0, (default) fill the polygon + | if width > 0, used for line thickness + | if width < 0, nothing will be drawn + | + + .. note:: + When using ``width`` values ``> 1``, the edge lines will grow + outside the original boundary of the polygon. For more details on + how the thickness for edge lines grow, refer to the ``width`` notes + of the :func:`pygame.draw.line` function. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the first point in the + ``points`` parameter (float values will be truncated) and its width and + height will be 0 + :rtype: Rect + + :raises ValueError: if ``len(points) < 3`` (must have at least 3 points) + :raises TypeError: if ``points`` is not a sequence or ``points`` does not + contain number pairs + + .. note:: + For an aapolygon, use :func:`aalines()` with ``closed=True``. + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + """ + def circle( surface: Surface, color: ColorLike, @@ -31,7 +156,61 @@ def circle( draw_top_left: bool = False, draw_bottom_left: bool = False, draw_bottom_right: bool = False, -) -> Rect: ... +) -> Rect: + """Draw a circle. + + Draws a circle on the given surface. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param center: center point of the circle as a sequence of 2 ints/floats, + e.g. ``(x, y)`` + :type center: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param radius: radius of the circle, measured from the ``center`` parameter, + nothing will be drawn if the ``radius`` is less than 1 + :type radius: int or float + :param int width: (optional) used for line thickness or to indicate that + the circle is to be filled + + | if ``width == 0``, (default) fill the circle + | if ``width > 0``, used for line thickness + | if ``width < 0``, nothing will be drawn + | + + .. note:: + When using ``width`` values ``> 1``, the edge lines will only grow + inward. + :param bool draw_top_right: (optional) if this is set to True then the top right corner + of the circle will be drawn + :param bool draw_top_left: (optional) if this is set to True then the top left corner + of the circle will be drawn + :param bool draw_bottom_left: (optional) if this is set to True then the bottom left corner + of the circle will be drawn + :param bool draw_bottom_right: (optional) if this is set to True then the bottom right corner + of the circle will be drawn + + | if any of the draw_circle_part is True then it will draw all circle parts that have the True + | value, otherwise it will draw the entire circle. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the ``center`` parameter value (float + values will be truncated) and its width and height will be 0 + :rtype: Rect + + :raises TypeError: if ``center`` is not a sequence of two numbers + :raises TypeError: if ``radius`` is not a number + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + Nothing is drawn when the radius is 0 (a pixel at the ``center`` coordinates + used to be drawn when the radius equaled 0). + Floats, and Vector2 are accepted for the ``center`` param. + The drawing algorithm was improved to look more like a circle. + .. versionchangedold:: 2.0.0.dev8 Added support for drawing circle quadrants. + """ + @overload def aacircle( surface: Surface, @@ -40,6 +219,7 @@ def aacircle( radius: float, width: int = 0, ) -> Rect: ... + @overload def aacircle( surface: Surface, @@ -52,9 +232,94 @@ def aacircle( draw_bottom_left: bool = False, draw_bottom_right: bool = False, ) -> Rect: ... + +def aacircle(*args, **kwargs): + """Draw an antialiased circle. + + Draws an antialiased circle on the given surface. + Uses Xiaolin Wu Circle Algorithm. + adapted from: https://cgg.mff.cuni.cz/~pepca/ref/WU.pdf + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param center: center point of the circle as a sequence of 2 ints/floats, + e.g. ``(x, y)`` + :type center: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param radius: radius of the circle, measured from the ``center`` parameter, + nothing will be drawn if the ``radius`` is less than 1 + :type radius: int or float + :param int width: (optional) used for line thickness or to indicate that + the circle is to be filled + + | if ``width == 0``, (default) fill the circle + | if ``width > 0``, used for line thickness + | if ``width < 0``, nothing will be drawn + | + + .. note:: + When using ``width`` values ``> 1``, the edge lines will only grow + inward. + :param bool draw_top_right: (optional) if this is set to True then the top right corner + of the circle will be drawn + :param bool draw_top_left: (optional) if this is set to True then the top left corner + of the circle will be drawn + :param bool draw_bottom_left: (optional) if this is set to True then the bottom left corner + of the circle will be drawn + :param bool draw_bottom_right: (optional) if this is set to True then the bottom right corner + of the circle will be drawn + + | if any of the draw_circle_part is True then it will draw all circle parts that have the True + | value, otherwise it will draw the entire circle. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the ``center`` parameter value (float + values will be truncated) and its width and height will be 0 + :rtype: Rect + + :raises TypeError: if ``center`` is not a sequence of two numbers + :raises TypeError: if ``radius`` is not a number + + .. versionadded:: 2.5.0 + """ + def ellipse( surface: Surface, color: ColorLike, rect: RectLike, width: int = 0 -) -> Rect: ... +) -> Rect: + """Draw an ellipse. + + Draws an ellipse on the given surface. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param Rect rect: rectangle to indicate the position and dimensions of the + ellipse, the ellipse will be centered inside the rectangle and bounded + by it + :param int width: (optional) used for line thickness or to indicate that + the ellipse is to be filled (not to be confused with the width value + of the ``rect`` parameter) + + | if ``width == 0``, (default) fill the ellipse + | if ``width > 0``, used for line thickness + | if ``width < 0``, nothing will be drawn + | + + .. note:: + When using ``width`` values ``> 1``, the edge lines will only grow + inward from the original boundary of the ``rect`` parameter. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the given ``rect`` + parameter and its width and height will be 0 + :rtype: Rect + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + """ + def arc( surface: Surface, color: ColorLike, @@ -62,31 +327,247 @@ def arc( start_angle: float, stop_angle: float, width: int = 1, -) -> Rect: ... +) -> Rect: + """Draw an elliptical arc. + + Draws an elliptical arc on the given surface. + + The two angle arguments are given in radians and indicate the start and stop + positions of the arc. The arc is drawn in a counterclockwise direction from + the ``start_angle`` to the ``stop_angle``. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param Rect rect: rectangle to indicate the position and dimensions of the + ellipse which the arc will be based on, the ellipse will be centered + inside the rectangle + :param float start_angle: start angle of the arc in radians + :param float stop_angle: stop angle of the arc in + radians + + | if ``start_angle < stop_angle``, the arc is drawn in a + counterclockwise direction from the ``start_angle`` to the + ``stop_angle`` + | if ``start_angle > stop_angle``, tau (tau == 2 * pi) will be added + to the ``stop_angle``, if the resulting stop angle value is greater + than the ``start_angle`` the above ``start_angle < stop_angle`` case + applies, otherwise nothing will be drawn + | if ``start_angle == stop_angle``, nothing will be drawn + + :param int width: (optional) used for line thickness (not to be confused + with the width value of the ``rect`` parameter) + + | if ``width == 0``, nothing will be drawn + | if ``width > 0``, (default is 1) used for line thickness + | if ``width < 0``, same as ``width == 0`` + + .. note:: + When using ``width`` values ``> 1``, the edge lines will only grow + inward from the original boundary of the ``rect`` parameter. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the given ``rect`` + parameter and its width and height will be 0 + :rtype: Rect + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + """ + def line( surface: Surface, color: ColorLike, start_pos: Point, end_pos: Point, width: int = 1, -) -> Rect: ... +) -> Rect: + """Draw a straight line. + + Draws a straight line on the given surface. There are no endcaps. For thick + lines the ends are squared off. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param start_pos: start position of the line, (x, y) + :type start_pos: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param end_pos: end position of the line, (x, y) + :type end_pos: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param int width: (optional) used for line thickness + + | if width >= 1, used for line thickness (default is 1) + | if width < 1, nothing will be drawn + + .. note:: + When using ``width`` values ``> 1``, lines will grow as follows. + + For odd ``width`` values, the thickness of each line grows with the + original line being in the center. + + For even ``width`` values, the thickness of each line grows with the + original line being offset from the center (as there is no exact + center line drawn). As a result, lines with a slope < 1 + (horizontal-ish) will have 1 more pixel of thickness below the + original line (in the y direction). Lines with a slope >= 1 + (vertical-ish) will have 1 more pixel of thickness to the right of + the original line (in the x direction). + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the ``start_pos`` parameter value (float + values will be truncated) and its width and height will be 0 + :rtype: Rect + + :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of + two numbers + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + """ + def lines( surface: Surface, color: ColorLike, closed: bool, points: SequenceLike[Point], width: int = 1, -) -> Rect: ... +) -> Rect: + """Draw multiple contiguous straight line segments. + + Draws a sequence of contiguous straight lines on the given surface. There are + no endcaps or miter joints. For thick lines the ends are squared off. + Drawing thick lines with sharp corners can have undesired looking results. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param bool closed: if ``True`` an additional line segment is drawn between + the first and last points in the ``points`` sequence + :param points: a sequence of 2 or more (x, y) coordinates, where each + point in the sequence must be a + tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent + points will be connected by a line segment, e.g. for the + points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn + from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``, + additionally if the ``closed`` parameter is ``True`` another line segment + will be drawn from ``(x3, y3)`` to ``(x1, y1)`` + :type points: tuple(point) or list(point) + :param int width: (optional) used for line thickness + + | if width >= 1, used for line thickness (default is 1) + | if width < 1, nothing will be drawn + + .. note:: + When using ``width`` values ``> 1`` refer to the ``width`` notes + of :func:`line` for details on how thick lines grow. + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the first point in the + ``points`` parameter (float values will be truncated) and its width and + height will be 0 + :rtype: Rect + + :raises ValueError: if ``len(points) < 2`` (must have at least 2 points) + :raises TypeError: if ``points`` is not a sequence or ``points`` does not + contain number pairs + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + """ + def aaline( surface: Surface, color: ColorLike, start_pos: Point, end_pos: Point, width: int = 1, -) -> Rect: ... +) -> Rect: + """Draw a straight antialiased line. + + Draws a straight antialiased line on the given surface. There are no endcaps. + For thick lines the ends are squared off. + + .. note:: + Regarding float values for coordinates, a point with coordinate + consisting of two whole numbers is considered being right in the center + of said pixel (and having a height and width of 1 pixel would therefore + completely cover it), while a point with coordinate where one (or both) + of the numbers have non-zero decimal parts would be partially covering + two (or four if both numbers have decimal parts) adjacent pixels, *e.g.* + the point ``(1.4, 2)`` covers 60% of the pixel ``(1, 2)`` and 40% of the + pixel ``(2,2)``. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param start_pos: start position of the line, (x, y) + :type start_pos: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param end_pos: end position of the line, (x, y) + :type end_pos: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + :param int width: (optional) used for line thickness + + | if width >= 1, used for line thickness (default is 1) + | if width < 1, nothing will be drawn + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the ``start_pos`` parameter value (float + values will be truncated) and its width and height will be 0 + :rtype: Rect + + :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of + two numbers + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + .. versionchanged:: 2.4.0 Removed deprecated 'blend' argument + .. versionchanged:: 2.5.0 ``blend`` argument re-added for backcompat, but will + always raise a deprecation exception when used + .. versionchanged:: 2.5.3 Added line width + """ + def aalines( surface: Surface, color: ColorLike, closed: bool, points: SequenceLike[Point], -) -> Rect: ... +) -> Rect: + """Draw multiple contiguous straight antialiased line segments. + + Draws a sequence of contiguous straight antialiased lines on the given + surface. + + :param Surface surface: surface to draw on + :param color: color to draw with, the alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` + :param bool closed: if ``True`` an additional line segment is drawn between + the first and last points in the ``points`` sequence + :param points: a sequence of 2 or more (x, y) coordinates, where each + point in the sequence must be a + tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent + points will be connected by a line segment, e.g. for the + points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn + from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``, + additionally if the ``closed`` parameter is ``True`` another line segment + will be drawn from ``(x3, y3)`` to ``(x1, y1)`` + :type points: tuple(point) or list(point) + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the first point in the + ``points`` parameter (float values will be truncated) and its width and + height will be 0 + :rtype: Rect + + :raises ValueError: if ``len(points) < 2`` (must have at least 2 points) + :raises TypeError: if ``points`` is not a sequence or ``points`` does not + contain number pairs + + .. versionchangedold:: 2.0.0 Added support for keyword arguments. + .. versionchanged:: 2.4.0 Removed deprecated ``blend`` argument + .. versionchanged:: 2.5.0 ``blend`` argument re-added for backcompat, but will + always raise a deprecation exception when used + """ diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 353d1fd052..a88c9c5f35 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -183,7 +183,6 @@ def get_extended() -> bool: but generally you will be able to load them all. """ - @deprecated("since 2.3.0. Use `pygame.image.tobytes` instead") def tostring( surface: Surface, diff --git a/docs/reST/ref/draw.rst b/docs/reST/ref/draw.rst index 01f39e4f4c..6816929e1a 100644 --- a/docs/reST/ref/draw.rst +++ b/docs/reST/ref/draw.rst @@ -3,541 +3,8 @@ :mod:`pygame.draw` ================== -.. module:: pygame.draw - :synopsis: pygame module for drawing shapes - -| :sl:`pygame module for drawing shapes` - -Draw several simple shapes to a surface. These functions will work for -rendering to any format of surface. - -Most of the functions take a width argument to represent the size of stroke -(thickness) around the edge of the shape. If a width of 0 is passed the shape -will be filled (solid). - -All the drawing functions respect the clip area for the surface and will be -constrained to that area. The functions return a rectangle representing the -bounding area of changed pixels. This bounding rectangle is the 'minimum' -bounding box that encloses the affected area. - -All the drawing functions accept a color argument that is compatible with -:data:`pygame.typing.ColorLike`. - -A color's alpha value will be written directly into the surface (if the -surface contains pixel alphas), but the draw function will not draw -transparently. - -These functions temporarily lock the surface they are operating on. Many -sequential drawing calls can be sped up by locking and unlocking the surface -object around the draw calls (see :func:`pygame.Surface.lock` and -:func:`pygame.Surface.unlock`). - -.. note :: - See the :mod:`pygame.gfxdraw` module for alternative draw methods. - - -.. function:: rect - - | :sl:`draw a rectangle` - | :sg:`rect(surface, color, rect) -> Rect` - | :sg:`rect(surface, color, rect, width=0, border_radius=0, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1) -> Rect` - - Draws a rectangle on the given surface. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param Rect rect: rectangle to draw, position and dimensions - :param int width: (optional) used for line thickness or to indicate that - the rectangle is to be filled (not to be confused with the width value - of the ``rect`` parameter) - - | if ``width == 0``, (default) fill the rectangle - | if ``width > 0``, used for line thickness - | if ``width < 0``, nothing will be drawn - | - - .. versionchangedold:: 2.1.1 - Drawing rects with width now draws the width correctly inside the - rect's area, rather than using an internal call to draw.lines(), - which had half the width spill outside the rect area. - - :param int border_radius: (optional) used for drawing rectangle with rounded corners. - The supported range is [0, min(height, width) / 2], with 0 representing a rectangle - without rounded corners. - :param int border_top_left_radius: (optional) used for setting the value of top left - border. If you don't set this value, it will use the border_radius value. - :param int border_top_right_radius: (optional) used for setting the value of top right - border. If you don't set this value, it will use the border_radius value. - :param int border_bottom_left_radius: (optional) used for setting the value of bottom left - border. If you don't set this value, it will use the border_radius value. - :param int border_bottom_right_radius: (optional) used for setting the value of bottom right - border. If you don't set this value, it will use the border_radius value. - - | if ``border_radius < 1`` it will draw rectangle without rounded corners - | if any of border radii has the value ``< 0`` it will use value of the border_radius - | If sum of radii on the same side of the rectangle is greater than the rect size the radii - | will get scaled - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the given ``rect`` - parameter and its width and height will be 0 - :rtype: Rect - - .. note:: - The :func:`pygame.Surface.fill()` method works just as well for drawing - filled rectangles and can be hardware accelerated on some platforms. - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - .. versionchangedold:: 2.0.0.dev8 Added support for border radius. - - .. ## pygame.draw.rect ## - -.. function:: polygon - - | :sl:`draw a polygon` - | :sg:`polygon(surface, color, points) -> Rect` - | :sg:`polygon(surface, color, points, width=0) -> Rect` - - Draws a polygon on the given surface. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param points: a sequence of 3 or more (x, y) coordinates that make up the - vertices of the polygon, each point in the sequence must be a - tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats, - e.g. ``[(x1, y1), (x2, y2), (x3, y3)]`` - :type points: tuple(point) or list(point) - :param int width: (optional) used for line thickness or to indicate that - the polygon is to be filled - - | if width == 0, (default) fill the polygon - | if width > 0, used for line thickness - | if width < 0, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1``, the edge lines will grow - outside the original boundary of the polygon. For more details on - how the thickness for edge lines grow, refer to the ``width`` notes - of the :func:`pygame.draw.line` function. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the first point in the - ``points`` parameter (float values will be truncated) and its width and - height will be 0 - :rtype: Rect - - :raises ValueError: if ``len(points) < 3`` (must have at least 3 points) - :raises TypeError: if ``points`` is not a sequence or ``points`` does not - contain number pairs - - .. note:: - For an aapolygon, use :func:`aalines()` with ``closed=True``. - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - - .. ## pygame.draw.polygon ## - -.. function:: circle - - | :sl:`draw a circle` - | :sg:`circle(surface, color, center, radius) -> Rect` - | :sg:`circle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect` - - Draws a circle on the given surface. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param center: center point of the circle as a sequence of 2 ints/floats, - e.g. ``(x, y)`` - :type center: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param radius: radius of the circle, measured from the ``center`` parameter, - nothing will be drawn if the ``radius`` is less than 1 - :type radius: int or float - :param int width: (optional) used for line thickness or to indicate that - the circle is to be filled - - | if ``width == 0``, (default) fill the circle - | if ``width > 0``, used for line thickness - | if ``width < 0``, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1``, the edge lines will only grow - inward. - :param bool draw_top_right: (optional) if this is set to True then the top right corner - of the circle will be drawn - :param bool draw_top_left: (optional) if this is set to True then the top left corner - of the circle will be drawn - :param bool draw_bottom_left: (optional) if this is set to True then the bottom left corner - of the circle will be drawn - :param bool draw_bottom_right: (optional) if this is set to True then the bottom right corner - of the circle will be drawn - - | if any of the draw_circle_part is True then it will draw all circle parts that have the True - | value, otherwise it will draw the entire circle. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the ``center`` parameter value (float - values will be truncated) and its width and height will be 0 - :rtype: Rect - - :raises TypeError: if ``center`` is not a sequence of two numbers - :raises TypeError: if ``radius`` is not a number - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - Nothing is drawn when the radius is 0 (a pixel at the ``center`` coordinates - used to be drawn when the radius equaled 0). - Floats, and Vector2 are accepted for the ``center`` param. - The drawing algorithm was improved to look more like a circle. - .. versionchangedold:: 2.0.0.dev8 Added support for drawing circle quadrants. - - .. ## pygame.draw.circle ## - -.. function:: aacircle - - | :sl:`draw an antialiased circle` - | :sg:`aacircle(surface, color, center, radius) -> Rect` - | :sg:`aacircle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect` - - Draws an antialiased circle on the given surface. - Uses Xiaolin Wu Circle Algorithm. - adapted from: https://cgg.mff.cuni.cz/~pepca/ref/WU.pdf - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param center: center point of the circle as a sequence of 2 ints/floats, - e.g. ``(x, y)`` - :type center: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param radius: radius of the circle, measured from the ``center`` parameter, - nothing will be drawn if the ``radius`` is less than 1 - :type radius: int or float - :param int width: (optional) used for line thickness or to indicate that - the circle is to be filled - - | if ``width == 0``, (default) fill the circle - | if ``width > 0``, used for line thickness - | if ``width < 0``, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1``, the edge lines will only grow - inward. - :param bool draw_top_right: (optional) if this is set to True then the top right corner - of the circle will be drawn - :param bool draw_top_left: (optional) if this is set to True then the top left corner - of the circle will be drawn - :param bool draw_bottom_left: (optional) if this is set to True then the bottom left corner - of the circle will be drawn - :param bool draw_bottom_right: (optional) if this is set to True then the bottom right corner - of the circle will be drawn - - | if any of the draw_circle_part is True then it will draw all circle parts that have the True - | value, otherwise it will draw the entire circle. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the ``center`` parameter value (float - values will be truncated) and its width and height will be 0 - :rtype: Rect - - :raises TypeError: if ``center`` is not a sequence of two numbers - :raises TypeError: if ``radius`` is not a number - - .. versionadded:: 2.5.0 - - .. ## pygame.draw.aacircle ## - -.. function:: ellipse - - | :sl:`draw an ellipse` - | :sg:`ellipse(surface, color, rect) -> Rect` - | :sg:`ellipse(surface, color, rect, width=0) -> Rect` - - Draws an ellipse on the given surface. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param Rect rect: rectangle to indicate the position and dimensions of the - ellipse, the ellipse will be centered inside the rectangle and bounded - by it - :param int width: (optional) used for line thickness or to indicate that - the ellipse is to be filled (not to be confused with the width value - of the ``rect`` parameter) - - | if ``width == 0``, (default) fill the ellipse - | if ``width > 0``, used for line thickness - | if ``width < 0``, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1``, the edge lines will only grow - inward from the original boundary of the ``rect`` parameter. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the given ``rect`` - parameter and its width and height will be 0 - :rtype: Rect - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - - .. ## pygame.draw.ellipse ## - -.. function:: arc - - | :sl:`draw an elliptical arc` - | :sg:`arc(surface, color, rect, start_angle, stop_angle) -> Rect` - | :sg:`arc(surface, color, rect, start_angle, stop_angle, width=1) -> Rect` - - Draws an elliptical arc on the given surface. - - The two angle arguments are given in radians and indicate the start and stop - positions of the arc. The arc is drawn in a counterclockwise direction from - the ``start_angle`` to the ``stop_angle``. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param Rect rect: rectangle to indicate the position and dimensions of the - ellipse which the arc will be based on, the ellipse will be centered - inside the rectangle - :param float start_angle: start angle of the arc in radians - :param float stop_angle: stop angle of the arc in - radians - - | if ``start_angle < stop_angle``, the arc is drawn in a - counterclockwise direction from the ``start_angle`` to the - ``stop_angle`` - | if ``start_angle > stop_angle``, tau (tau == 2 * pi) will be added - to the ``stop_angle``, if the resulting stop angle value is greater - than the ``start_angle`` the above ``start_angle < stop_angle`` case - applies, otherwise nothing will be drawn - | if ``start_angle == stop_angle``, nothing will be drawn - | - - :param int width: (optional) used for line thickness (not to be confused - with the width value of the ``rect`` parameter) - - | if ``width == 0``, nothing will be drawn - | if ``width > 0``, (default is 1) used for line thickness - | if ``width < 0``, same as ``width == 0`` - - .. note:: - When using ``width`` values ``> 1``, the edge lines will only grow - inward from the original boundary of the ``rect`` parameter. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the given ``rect`` - parameter and its width and height will be 0 - :rtype: Rect - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - - .. ## pygame.draw.arc ## - -.. function:: line - - | :sl:`draw a straight line` - | :sg:`line(surface, color, start_pos, end_pos) -> Rect` - | :sg:`line(surface, color, start_pos, end_pos, width=1) -> Rect` - - Draws a straight line on the given surface. There are no endcaps. For thick - lines the ends are squared off. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param start_pos: start position of the line, (x, y) - :type start_pos: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param end_pos: end position of the line, (x, y) - :type end_pos: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param int width: (optional) used for line thickness - - | if width >= 1, used for line thickness (default is 1) - | if width < 1, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1``, lines will grow as follows. - - For odd ``width`` values, the thickness of each line grows with the - original line being in the center. - - For even ``width`` values, the thickness of each line grows with the - original line being offset from the center (as there is no exact - center line drawn). As a result, lines with a slope < 1 - (horizontal-ish) will have 1 more pixel of thickness below the - original line (in the y direction). Lines with a slope >= 1 - (vertical-ish) will have 1 more pixel of thickness to the right of - the original line (in the x direction). - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the ``start_pos`` parameter value (float - values will be truncated) and its width and height will be 0 - :rtype: Rect - - :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of - two numbers - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - - .. ## pygame.draw.line ## - -.. function:: lines - - | :sl:`draw multiple contiguous straight line segments` - | :sg:`lines(surface, color, closed, points) -> Rect` - | :sg:`lines(surface, color, closed, points, width=1) -> Rect` - - Draws a sequence of contiguous straight lines on the given surface. There are - no endcaps or miter joints. For thick lines the ends are squared off. - Drawing thick lines with sharp corners can have undesired looking results. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param bool closed: if ``True`` an additional line segment is drawn between - the first and last points in the ``points`` sequence - :param points: a sequence of 2 or more (x, y) coordinates, where each - point in the sequence must be a - tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent - points will be connected by a line segment, e.g. for the - points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn - from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``, - additionally if the ``closed`` parameter is ``True`` another line segment - will be drawn from ``(x3, y3)`` to ``(x1, y1)`` - :type points: tuple(point) or list(point) - :param int width: (optional) used for line thickness - - | if width >= 1, used for line thickness (default is 1) - | if width < 1, nothing will be drawn - | - - .. note:: - When using ``width`` values ``> 1`` refer to the ``width`` notes - of :func:`line` for details on how thick lines grow. - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the first point in the - ``points`` parameter (float values will be truncated) and its width and - height will be 0 - :rtype: Rect - - :raises ValueError: if ``len(points) < 2`` (must have at least 2 points) - :raises TypeError: if ``points`` is not a sequence or ``points`` does not - contain number pairs - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - - .. ## pygame.draw.lines ## - -.. function:: aaline - - | :sl:`draw a straight antialiased line` - | :sg:`aaline(surface, color, start_pos, end_pos) -> Rect` - :sg:`aaline(surface, color, start_pos, end_pos, width=1) -> Rect` - - Draws a straight antialiased line on the given surface. There are no endcaps. - For thick lines the ends are squared off. - - .. note:: - Regarding float values for coordinates, a point with coordinate - consisting of two whole numbers is considered being right in the center - of said pixel (and having a height and width of 1 pixel would therefore - completely cover it), while a point with coordinate where one (or both) - of the numbers have non-zero decimal parts would be partially covering - two (or four if both numbers have decimal parts) adjacent pixels, *e.g.* - the point ``(1.4, 2)`` covers 60% of the pixel ``(1, 2)`` and 40% of the - pixel ``(2,2)``. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param start_pos: start position of the line, (x, y) - :type start_pos: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param end_pos: end position of the line, (x, y) - :type end_pos: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - :param int width: (optional) used for line thickness - - | if width >= 1, used for line thickness (default is 1) - | if width < 1, nothing will be drawn - | - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the ``start_pos`` parameter value (float - values will be truncated) and its width and height will be 0 - :rtype: Rect - - :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of - two numbers - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - .. versionchanged:: 2.4.0 Removed deprecated 'blend' argument - .. versionchanged:: 2.5.0 ``blend`` argument re-added for backcompat, but will always raise a deprecation exception when used - .. versionchanged:: 2.5.3 Added line width - - .. ## pygame.draw.aaline ## - -.. function:: aalines - - | :sl:`draw multiple contiguous straight antialiased line segments` - | :sg:`aalines(surface, color, closed, points) -> Rect` - - Draws a sequence of contiguous straight antialiased lines on the given - surface. - - :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` - :param bool closed: if ``True`` an additional line segment is drawn between - the first and last points in the ``points`` sequence - :param points: a sequence of 2 or more (x, y) coordinates, where each - point in the sequence must be a - tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent - points will be connected by a line segment, e.g. for the - points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn - from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``, - additionally if the ``closed`` parameter is ``True`` another line segment - will be drawn from ``(x3, y3)`` to ``(x1, y1)`` - :type points: tuple(point) or list(point) - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the first point in the - ``points`` parameter (float values will be truncated) and its width and - height will be 0 - :rtype: Rect - - :raises ValueError: if ``len(points) < 2`` (must have at least 2 points) - :raises TypeError: if ``points`` is not a sequence or ``points`` does not - contain number pairs - - .. versionchangedold:: 2.0.0 Added support for keyword arguments. - .. versionchanged:: 2.4.0 Removed deprecated ``blend`` argument - .. versionchanged:: 2.5.0 ``blend`` argument re-added for backcompat, but will always raise a deprecation exception when used - - .. ## pygame.draw.aalines ## - -.. ## pygame.draw ## +.. autopgmodule:: pygame.draw + :members: .. figure:: code_examples/draw_module_example.png :alt: draw module example diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index 384936e90c..b09d9be9b4 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -1,12 +1,12 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_DRAW "pygame module for drawing shapes" -#define DOC_DRAW_RECT "rect(surface, color, rect) -> Rect\nrect(surface, color, rect, width=0, border_radius=0, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1) -> Rect\ndraw a rectangle" -#define DOC_DRAW_POLYGON "polygon(surface, color, points) -> Rect\npolygon(surface, color, points, width=0) -> Rect\ndraw a polygon" -#define DOC_DRAW_CIRCLE "circle(surface, color, center, radius) -> Rect\ncircle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect\ndraw a circle" -#define DOC_DRAW_AACIRCLE "aacircle(surface, color, center, radius) -> Rect\naacircle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect\ndraw an antialiased circle" -#define DOC_DRAW_ELLIPSE "ellipse(surface, color, rect) -> Rect\nellipse(surface, color, rect, width=0) -> Rect\ndraw an ellipse" -#define DOC_DRAW_ARC "arc(surface, color, rect, start_angle, stop_angle) -> Rect\narc(surface, color, rect, start_angle, stop_angle, width=1) -> Rect\ndraw an elliptical arc" -#define DOC_DRAW_LINE "line(surface, color, start_pos, end_pos) -> Rect\nline(surface, color, start_pos, end_pos, width=1) -> Rect\ndraw a straight line" -#define DOC_DRAW_LINES "lines(surface, color, closed, points) -> Rect\nlines(surface, color, closed, points, width=1) -> Rect\ndraw multiple contiguous straight line segments" -#define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos) -> Rect\naaline(surface, color, start_pos, end_pos, width=1) -> Rect\ndraw a straight antialiased line" -#define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\ndraw multiple contiguous straight antialiased line segments" +#define DOC_DRAW "Pygame module for drawing shapes." +#define DOC_DRAW_RECT "rect(surface, color, rect, width=0, border_radius=-1, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1) -> Rect\nDraw a rectangle." +#define DOC_DRAW_POLYGON "polygon(surface, color, points, width=0) -> Rect\nDraw a polygon." +#define DOC_DRAW_CIRCLE "circle(surface, color, center, radius, width=0, draw_top_right=False, draw_top_left=False, draw_bottom_left=False, draw_bottom_right=False) -> Rect\nDraw a circle." +#define DOC_DRAW_AACIRCLE "aacircle(surface, color, center, radius, width=0) -> Rect\naacircle(surface, color, center, radius, width=0, draw_top_right=False, draw_top_left=False, draw_bottom_left=False, draw_bottom_right=False) -> Rect\nDraw an antialiased circle." +#define DOC_DRAW_ELLIPSE "ellipse(surface, color, rect, width=0) -> Rect\nDraw an ellipse." +#define DOC_DRAW_ARC "arc(surface, color, rect, start_angle, stop_angle, width=1) -> Rect\nDraw an elliptical arc." +#define DOC_DRAW_LINE "line(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight line." +#define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." +#define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." +#define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." From e4e64f6d6bbfd66c2a8fc2176fcfca3c1ecaa754 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sun, 16 Mar 2025 15:44:38 +0100 Subject: [PATCH 126/441] Move Surface docs to stubs --- buildconfig/stubs/pygame/surface.pyi | 996 +++++++++++++++++++++-- docs/reST/ref/surface.rst | 1094 +------------------------- src_c/doc/surface_doc.h | 113 ++- 3 files changed, 997 insertions(+), 1206 deletions(-) diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index 98425b8adf..4ab8c6af9a 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -41,13 +41,85 @@ _ViewKind = Literal[ ] class Surface: - _pixels_address: int - @property - def width(self) -> int: ... - @property - def height(self) -> int: ... - @property - def size(self) -> tuple[int, int]: ... + """Pygame object for representing images. + + A pygame Surface is used to represent any image. The Surface has a fixed + resolution and pixel format. Surfaces with 8-bit pixels use a color palette + to map to 24-bit color. + + Call :meth:`pygame.Surface()` to create a new image object. The Surface will + be cleared to all black. The only required arguments are the sizes. With no + additional arguments, the Surface will be created in a format that best + matches the display Surface. + + The pixel format can be controlled by passing the bit depth or an existing + Surface. The flags argument is a bitmask of additional features for the + surface. You can pass any combination of these flags: + + :: + + HWSURFACE (obsolete in pygame 2) creates the image in video memory + SRCALPHA the pixel format will include a per-pixel alpha + + Both flags are only a request, and may not be possible for all displays and + formats. + + Advanced users can combine a set of bitmasks with a depth value. The masks + are a set of 4 integers representing which bits in a pixel will represent + each color. Normal Surfaces should not require the masks argument. + + Surfaces can have many extra attributes like alpha planes, colorkeys, source + rectangle clipping. These functions mainly effect how the Surface is blitted + to other Surfaces. The blit routines will attempt to use hardware + acceleration when possible, otherwise they will use highly optimized + software blitting methods. + + There are three types of transparency supported in pygame: colorkeys, + surface alphas, and pixel alphas. Surface alphas can be mixed with + colorkeys, but an image with per pixel alphas cannot use the other modes. + Colorkey transparency makes a single color value transparent. Any pixels + matching the colorkey will not be drawn. The surface alpha value is a single + value that changes the transparency for the entire image. A surface alpha of + 255 is opaque, and a value of 0 is completely transparent. + + Per pixel alphas are different because they store a transparency value for + every pixel. This allows for the most precise transparency effects, but it + also the slowest. Per pixel alphas cannot be mixed with surface alpha and + colorkeys. + + There is support for pixel access for the Surfaces. Pixel access on hardware + surfaces is slow and not recommended. Pixels can be accessed using the + :meth:`get_at()` and :meth:`set_at()` functions. These methods are fine for + simple access, but will be considerably slow when doing of pixel work with + them. If you plan on doing a lot of pixel level work, it is recommended to + use a :class:`pygame.PixelArray`, which gives an array like view of the + surface. For involved mathematical manipulations try the + :mod:`pygame.surfarray` module (It's quite quick, but requires NumPy.) + + Any functions that directly access a surface's pixel data will need that + surface to be lock()'ed. These functions can :meth:`lock()` and + :meth:`unlock()` the surfaces themselves without assistance. But, if a + function will be called many times, there will be a lot of overhead for + multiple locking and unlocking of the surface. It is best to lock the + surface manually before making the function call many times, and then + unlocking when you are finished. All functions that need a locked surface + will say so in their docs. Remember to leave the Surface locked only while + necessary. + + Surface pixels are stored internally as a single number that has all the + colors encoded into it. Use the :meth:`map_rgb()` and + :meth:`unmap_rgb()` to convert between individual red, green, and blue + values into a packed integer for that Surface. + + Surfaces can also reference sections of other Surfaces. These are created + with the :meth:`subsurface()` method. Any change to either Surface will + effect the other. + + Each Surface contains a clipping area. By default the clip area covers the + entire Surface. If it is changed, all drawing operations will only effect + the smaller area. + """ + @overload def __init__( self, @@ -65,17 +137,66 @@ class Surface: ) -> None: ... def __copy__(self) -> Surface: ... def __deepcopy__(self, memo) -> Surface: ... - def copy(self) -> Surface: ... def blit( self, source: Surface, dest: Union[Point, RectLike] = (0, 0), area: Optional[RectLike] = None, special_flags: int = 0, - ) -> Rect: ... + ) -> Rect: + """Draw another surface onto this one. + + Draws another Surface onto this Surface. + + **Parameters** + - ``source`` + The ``Surface`` object to draw onto this ``Surface``. + If it has transparency, transparent pixels will be ignored when blittting to an 8-bit ``Surface``. + - ``dest`` *(optional)* + The ``source`` draw position onto this ``Surface``, defaults to (0, 0). + It can be a coordinate pair ``(x, y)`` or a ``Rect`` (using its top-left corner). + If a ``Rect`` is passed, its size will not affect the blit. + - ``area`` *(optional)* + The rectangular portion of the ``source`` to draw. + It can be a ``Rect`` object representing that section. If ``None`` or not provided, + the entire source surface will be drawn. + If the ``Rect`` has negative position, the final blit position will be + ``dest`` - ``Rect.topleft``. + - ``special_flags`` *(optional)* + Controls how the colors of the ``source`` are combined with this Surface. + If not provided it defaults to ``BLENDMODE_NONE`` (``0``). + See :doc:`special_flags_list` for a list of possible values. + **Return** + A :doc:`rect` object representing the affected area of this ``Surface`` that was modified + by the blit operation. This area includes only the pixels within this ``Surface`` or + its clipping area (see :meth:`set_clip`). + Generally you don't need to use this return value, as it was initially designed to + pass it to :meth:`pygame.display.update` to optimize the updating of the display. + Since modern computers are fast enough to update the entire display at high speeds, + this return value is rarely used nowadays. + **Example Use** + .. code-block:: python + + # create a surface of size 50x50 and fill it with red color + red_surf = pygame.Surface((50, 50)) + red_surf.fill("red") + + # draw the surface on another surface at position (0, 0) + another_surface.blit(red_surf, (0, 0)) + + **Notes** + - When self-blitting and there is a colorkey or alpha transparency set, resulting colors + may appear slightly different compared to a non-self blit. + + - The blit is ignored if the ``source`` is positioned completely outside this ``Surface``'s + clipping area. Otherwise only the overlapping area will be drawn. + + .. versionchanged:: 2.5.1 The dest argument is optional and defaults to (0, 0) + """ + def blits( self, - blit_SequenceLike: Iterable[ + blit_sequence: Iterable[ Union[ tuple[Surface, Union[Point, RectLike]], tuple[Surface, Union[Point, RectLike], Union[RectLike, int]], @@ -83,12 +204,84 @@ class Surface: ] ], doreturn: Union[int, bool] = 1, - ) -> Union[list[Rect], None]: ... + ) -> Union[list[Rect], None]: + """Draw many surfaces onto this surface at their corresponding location. + + The ``blits`` method efficiently draws a sequence of surfaces onto this ``Surface``. + + **Parameters** + + ``blit_sequence`` + A sequence that contains each surface to be drawn along with its associated blit + arguments. See the **Sequence Item Formats** section below for the possible formats. + + ``doreturn`` (optional) + The ``doreturn`` parameter controls the return value. When set to ``True``, it returns + a list of rectangles representing the changed areas. When set to ``False``, returns + ``None``. + + **Return** + + A list of rectangles or ``None``. + + **Sequence Item Formats** + + ``(source, dest)`` + - ``source``: Surface object to be drawn. + - ``dest``: Position where the source Surface should be blitted. + + ``(source, dest, area)`` + - ``area``: (optional) Specific area of the source Surface to be drawn. + + ``(source, dest, area, special_flags)`` + - ``special_flags``: (optional) Controls the blending mode for drawing colors. + See :doc:`special_flags_list` for a list of possible values. + + **Notes** + + - ``blits`` is an advanced method. It is recommended to read the documentation + of :meth:`blit` first. + + - To draw a ``Surface`` with a special flag, you must specify an area as well, e.g., + ``(source, dest, None, special_flags)``. + + - Prefer using :meth:`blits` over :meth:`blit` when drawing multiple surfaces + for better performance. Use :meth:`blit` if you need to draw a single surface. + + - For drawing a sequence of (source, dest) pairs with whole source Surface + and a singular special_flag, use the :meth:`fblits()` method. + + .. versionaddedold:: 1.9.4 + """ + def fblits( self, - blit_SequenceLike: Iterable[tuple[Surface, Union[Point, RectLike]]], + blit_sequence: Iterable[tuple[Surface, Union[Point, RectLike]]], special_flags: int = 0, / - ) -> None: ... + ) -> None: + """Draw many surfaces onto this surface at their corresponding location and with the same special_flags. + + This method takes a sequence of tuples (source, dest) as input, where source is a Surface + object and dest is its destination position on this Surface. It draws each source Surface + fully (meaning that unlike `blit()` you cannot pass an "area" parameter to represent + a smaller portion of the source Surface to draw) on this Surface with the same blending + mode specified by special_flags. + + :param blit_sequence: a sequence of (source, dest) + :param special_flags: the flag(s) representing the blend mode used for each surface. + See :doc:`special_flags_list` for a list of possible values. + + :returns: ``None`` + + .. note:: This method only accepts a sequence of (source, dest) pairs and a single + special_flags value that's applied to all surfaces drawn. This allows faster + iteration over the sequence and better performance over `blits()`. Further + optimizations are applied if blit_sequence is a list or a tuple (using one + of them is recommended). + + .. versionadded:: 2.1.4 + """ + @overload def convert(self, surface: Surface, /) -> Surface: ... @overload @@ -97,42 +290,389 @@ class Surface: def convert(self, masks: ColorLike, flags: int = 0, /) -> Surface: ... @overload def convert(self) -> Surface: ... - def convert_alpha(self) -> Surface: ... + def convert(self, *args): + """Change the pixel format of a surface. + + Creates a new copy of the Surface with the pixel format changed. The new + pixel format can be determined from another existing Surface. Otherwise + depth, flags, and masks arguments can be used, similar to the + :meth:`pygame.Surface()` call. + + If no arguments are passed the new Surface will have the same pixel + format as the display Surface. This is always the fastest format for + blitting. It is a good idea to convert all Surfaces before they are + blitted many times. + + The converted Surface will have no pixel alphas. They will be stripped if + the original had them. See :meth:`convert_alpha()` for preserving or + creating per-pixel alphas. + + The new copy will have the same class as the copied surface. This lets + a Surface subclass inherit this method without the need to override, + unless subclass specific instance attributes also need copying. + + .. versionchanged:: 2.5.0 converting to a known format will succeed without + a window/display surface. + """ + + def convert_alpha(self) -> Surface: + """Change the pixel format of a surface including per pixel alphas. + + Creates a new copy of the surface with the desired pixel format. The new + surface will be in a format suited for quick blitting to the display surface + with per pixel alpha. + + Unlike the :meth:`convert()` method, the pixel format for the new + surface will not be exactly the same as the display surface, but it will + be optimized for fast alpha blitting to it. + + As with :meth:`convert()` the returned surface has the same class as + the converted surface. + + .. versionchanged:: 2.4.0 'Surface' argument deprecated. + """ + + def copy(self) -> Surface: + """Create a new copy of a Surface. + + Makes a duplicate copy of a Surface. The new surface will have the same + pixel formats, color palettes, transparency settings, and class as the + original. If a Surface subclass also needs to copy any instance specific + attributes then it should override ``copy()``. Shallow copy and deepcopy + are supported, Surface implements __copy__ and __deepcopy__ respectively. + + .. versionadded:: 2.3.1 + Added support for deepcopy by implementing __deepcopy__, calls copy() internally. + """ + def fill( self, color: ColorLike, rect: Optional[RectLike] = None, special_flags: int = 0, - ) -> Rect: ... + ) -> Rect: + """Fill Surface with a solid color. + + Fill the Surface with a solid color. If no rect argument is given the + entire Surface will be filled. The rect argument will limit the fill to a + specific area. The fill will also be contained by the Surface clip area. + + The color argument should be compatible with :data:`pygame.typing.ColorLike`. + If using ``RGBA``, the Alpha (A part of ``RGBA``) is ignored unless the surface + uses per pixel alpha (Surface has the ``SRCALPHA`` flag). + + The special_flags argument controls how the colors are combined. See :doc:`special_flags_list` + for a list of possible values. + + This will return the affected Surface area. + + .. note:: As of pygame-ce version 2.5.1, a long-standing bug has been fixed! + Now when passing in a ``Rect`` with negative ``x`` or negative ``y`` (or both), + the ``Rect`` filled will no longer be shifted to ``(0, 0)``, but instead only the + part of the ``Rect`` overlapping the window's ``Rect`` will be filled. + """ + def scroll( self, dx: int = 0, dy: int = 0, scroll_flag: int = 0, / - ) -> None: ... + ) -> None: + """Shift the Surface pixels in place. + + Move the Surface by dx pixels right and dy pixels down. dx and dy may be + negative for left and up scrolls respectively. + + Scrolling is contained by the Surface clip area. It is safe to have dx + and dy values that exceed the surface size. + + The scroll flag can be: + * ``0`` (default): the pixels are shifted but previous pixels are + not modified. + + * ``pygame.SCROLL_ERASE``: the space created by the shifting pixels + is filled with black or transparency. + + * ``pygame.SCROLL_REPEAT``: the pixels that disappear out of the + surface or clip bounds are brought back on the opposite side + resulting in an infinitely scrolling and repeating surface. + + .. versionaddedold:: 1.9 + + .. versionchanged:: 2.5.3 Add repeating scroll and allow erasing pixels + """ + @overload def set_colorkey(self, color: ColorLike, flags: int = 0, /) -> None: ... @overload def set_colorkey(self, color: None, /) -> None: ... - def get_colorkey(self) -> Optional[tuple[int, int, int, int]]: ... + def set_colorkey(self, *args): + """Set the transparent colorkey. + + Set the current color key for the Surface. When blitting this Surface + onto a destination, any pixels that have the same color as the colorkey + will be transparent. The color should be compatible with :data:`pygame.typing.ColorLike`. + If ``None`` is passed, the colorkey will be unset. + + The colorkey will be ignored if the Surface is formatted to use per pixel + alpha values. The colorkey can be mixed with the full Surface alpha + value. + + The optional flags argument can be set to ``pygame.RLEACCEL`` to provide + better performance on non accelerated displays. An ``RLEACCEL`` Surface + will be slower to modify, but quicker to blit as a source. + """ + + def get_colorkey(self) -> Optional[tuple[int, int, int, int]]: + """Get the current transparent colorkey. + + Return the current colorkey value for the Surface. If the colorkey is not + set then ``None`` is returned. + """ + @overload def set_alpha(self, value: int, flags: int = 0, /) -> None: ... @overload def set_alpha(self, value: None, /) -> None: ... - def get_alpha(self) -> Optional[int]: ... - def lock(self) -> None: ... - def unlock(self) -> None: ... - def mustlock(self) -> bool: ... - def get_locked(self) -> bool: ... - def get_locks(self) -> tuple[Any, ...]: ... - def get_at(self, x_y: Point, /) -> Color: ... - def set_at(self, x_y: Point, color: ColorLike, /) -> None: ... - def get_at_mapped(self, x_y: Point, /) -> int: ... - def get_palette(self) -> list[Color]: ... - def get_palette_at(self, index: int, /) -> Color: ... - def set_palette(self, palette: SequenceLike[ColorLike], /) -> None: ... - def set_palette_at(self, index: int, color: ColorLike, /) -> None: ... - def map_rgb(self, color: ColorLike, /) -> int: ... - def unmap_rgb(self, mapped_int: int, /) -> Color: ... - def set_clip(self, rect: Optional[RectLike], /) -> None: ... - def get_clip(self) -> Rect: ... + def set_alpha(self, *args): + """Set the alpha value for the full Surface. + + Set the current alpha value for the Surface. When blitting this Surface + onto a destination, the pixels will be drawn slightly transparent. The + alpha value is an integer from 0 to 255, 0 is fully transparent and 255 + is fully opaque. If ``None`` is passed for the alpha value, then alpha + blending will be disabled, including per-pixel alpha. + + This value is different than the per pixel Surface alpha. For a surface + with per pixel alpha, blanket alpha is ignored and ``None`` is returned. + + .. versionchangedold:: 2.0 per-surface alpha can be combined with per-pixel + alpha. + + The optional flags argument can be set to ``pygame.RLEACCEL`` to provide + better performance on non accelerated displays. An ``RLEACCEL`` Surface + will be slower to modify, but quicker to blit as a source. + """ + + def get_alpha(self) -> Optional[int]: + """Get the current Surface transparency value. + + Return the current alpha value for the Surface. + """ + + def lock(self) -> None: + """Lock the Surface memory for pixel access. + + Lock the pixel data of a Surface for access. On accelerated Surfaces, the + pixel data may be stored in volatile video memory or nonlinear compressed + forms. When a Surface is locked the pixel memory becomes available to + access by regular software. Code that reads or writes pixel values will + need the Surface to be locked. + + Surfaces should not remain locked for more than necessary. A locked + Surface can often not be displayed or managed by pygame. + + Not all Surfaces require locking. The :meth:`mustlock()` method can + determine if it is actually required. There is no performance penalty for + locking and unlocking a Surface that does not need it. + + All pygame functions will automatically lock and unlock the Surface data + as needed. If a section of code is going to make calls that will + repeatedly lock and unlock the Surface many times, it can be helpful to + wrap the block inside a lock and unlock pair. + + It is safe to nest locking and unlocking calls. The surface will only be + unlocked after the final lock is released. + """ + + def unlock(self) -> None: + """Unlock the Surface memory from pixel access. + + Unlock the Surface pixel data after it has been locked. The unlocked + Surface can once again be drawn and managed by pygame. See the + :meth:`lock()` documentation for more details. + + All pygame functions will automatically lock and unlock the Surface data + as needed. If a section of code is going to make calls that will + repeatedly lock and unlock the Surface many times, it can be helpful to + wrap the block inside a lock and unlock pair. + + It is safe to nest locking and unlocking calls. The surface will only be + unlocked after the final lock is released. + """ + + def mustlock(self) -> bool: + """Test if the Surface requires locking. + + Returns ``True`` if the Surface is required to be locked to access pixel + data. Usually pure software Surfaces do not require locking. This method + is rarely needed, since it is safe and quickest to just lock all Surfaces + as needed. + + All pygame functions will automatically lock and unlock the Surface data + as needed. If a section of code is going to make calls that will + repeatedly lock and unlock the Surface many times, it can be helpful to + wrap the block inside a lock and unlock pair. + """ + + def get_locked(self) -> bool: + """Test if the Surface is current locked. + + Returns ``True`` when the Surface is locked. It doesn't matter how many + times the Surface is locked. + """ + + def get_locks(self) -> tuple[Any, ...]: + """Gets the locks for the Surface. + + Returns the currently existing locks for the Surface. + """ + + def get_at(self, x_y: Point, /) -> Color: + """Get the color value at a single pixel. + + Return a copy of the ``RGBA`` Color value at the given pixel. If the + Surface has no per pixel alpha, then the alpha value will always be 255 + (opaque). If the pixel position is outside the area of the Surface an + ``IndexError`` exception will be raised. + + Getting and setting pixels one at a time is generally too slow to be used + in a game or realtime situation. It is better to use methods which + operate on many pixels at a time like with the blit, fill and draw + methods - or by using :mod:`pygame.surfarray`/:mod:`pygame.PixelArray`. + + This function will temporarily lock and unlock the Surface as needed. + + .. versionchanged:: 2.3.1 can now also accept both float coordinates and + Vector2s for pixels. + + .. versionchangedold:: 1.9 + Returning a Color instead of tuple. Use ``tuple(surf.get_at((x,y)))`` + if you want a tuple, and not a Color. This should only matter if + you want to use the color as a key in a dict. + """ + + def set_at(self, x_y: Point, color: ColorLike, /) -> None: + """Set the color value for a single pixel. + + Set the color of a single pixel at the specified coordinates to be a + :data:`pygame.typing.ColorLike` value. If the Surface does not have per pixel alphas, + the alpha value is ignored. Setting pixels outside the Surface area or outside + the Surface clipping will have no effect. + + Getting and setting pixels one at a time is generally too slow to be used + in a game or realtime situation. + + This function will temporarily lock and unlock the Surface as needed. + + .. note:: If the surface is palettized, the pixel color will be set to the + most similar color in the palette. + + .. versionchanged:: 2.3.1 can now also accept both float coordinates and + Vector2s for pixels. + """ + + def get_at_mapped(self, x_y: Point, /) -> int: + """Get the mapped color value at a single pixel. + + Return the integer value of the given pixel. If the pixel position is + outside the area of the Surface an ``IndexError`` exception will be + raised. + + This method is intended for pygame unit testing. It unlikely has any use + in an application. + + This function will temporarily lock and unlock the Surface as needed. + + .. versionaddedold:: 1.9.2 + + .. versionchanged:: 2.3.1 can now also accept both float coordinates and + Vector2s for pixels. + """ + + def get_palette(self) -> list[Color]: + """Get the color index palette for an 8-bit Surface. + + Return a list of up to 256 color elements that represent the indexed + colors used in an 8-bit Surface. The returned list is a copy of the + palette, and changes will have no effect on the Surface. + + Returning a list of ``Color(with length 3)`` instances instead of tuples. + + .. versionaddedold:: 1.9 + """ + + def get_palette_at(self, index: int, /) -> Color: + """Get the color for a single entry in a palette. + + Returns the red, green, and blue color values for a single index in a + Surface palette. The index should be a value from 0 to 255. + + .. versionaddedold:: 1.9 + Returning ``Color(with length 3)`` instance instead of a tuple. + """ + + def set_palette(self, palette: SequenceLike[ColorLike], /) -> None: + """Set the color palette for an 8-bit Surface. + + Set the full palette for an 8-bit Surface. This will replace the colors in + the existing palette. A partial palette can be passed and only the first + colors in the original palette will be changed. + + This function has no effect on a Surface with more than 8-bits per pixel. + """ + + def set_palette_at(self, index: int, color: ColorLike, /) -> None: + """Set the color for a single index in an 8-bit Surface palette. + + Set the palette value for a single entry in a Surface palette. The index + should be a value from 0 to 255. + + This function has no effect on a Surface with more than 8-bits per pixel. + """ + + def map_rgb(self, color: ColorLike, /) -> int: + """Convert a color into a mapped color value. + + Convert a :data:`pygame.typing.ColorLike` into the mapped integer value + for this Surface. The returned integer will contain no more bits than the + bit depth of the Surface. Mapped color values are not often used inside pygame, + but can be passed to most functions that require a Surface and a color. + + See the Surface object documentation for more information about colors + and pixel formats. + """ + + def unmap_rgb(self, mapped_int: int, /) -> Color: + """Convert a mapped integer color value into a Color. + + Convert an mapped integer color into the ``RGB`` color components for + this Surface. Mapped color values are not often used inside pygame, but + can be passed to most functions that require a Surface and a color. + + See the Surface object documentation for more information about colors + and pixel formats. + """ + + def set_clip(self, rect: Optional[RectLike], /) -> None: + """Set the current clipping area of the Surface. + + Each Surface has an active clipping area. This is a rectangle that + represents the only pixels on the Surface that can be modified. If + ``None`` is passed for the rectangle the full Surface will be available + for changes. + + The clipping area is always restricted to the area of the Surface itself. + If the clip rectangle is too large it will be shrunk to fit inside the + Surface. + """ + + def get_clip(self) -> Rect: + """Get the current clipping area of the Surface. + + Return a rectangle of the current clipping area. The Surface will always + return a valid rectangle that will never be outside the bounds of the + surface. If the Surface has had ``None`` set for the clipping area, the + Surface will return a rectangle with the full area of the Surface. + """ + @overload def subsurface(self, rect: RectLike, /) -> Surface: ... @overload @@ -141,31 +681,373 @@ class Surface: def subsurface( self, left: float, top: float, width: float, height: float, / ) -> Surface: ... - def get_parent(self) -> Surface: ... - def get_abs_parent(self) -> Surface: ... - def get_offset(self) -> tuple[int, int]: ... - def get_abs_offset(self) -> tuple[int, int]: ... - def get_size(self) -> tuple[int, int]: ... - def get_width(self) -> int: ... - def get_height(self) -> int: ... - def get_rect(self, **kwargs: Any) -> Rect: ... - def get_frect(self, **kwargs: Any) -> FRect: ... - def get_bitsize(self) -> int: ... - def get_bytesize(self) -> int: ... - def get_flags(self) -> int: ... - def get_pitch(self) -> int: ... - def get_masks(self) -> tuple[int, int, int, int]: ... + def subsurface(self, *args): + """Create a new surface that references its parent. + + Returns a new Surface that shares its pixels with its new parent. The new + Surface is considered a child of the original. Modifications to either + Surface pixels will effect each other. Surface information like clipping + area and color keys are unique to each Surface. + + The new Surface will inherit the palette, color key, and alpha settings + from its parent. + + It is possible to have any number of subsurfaces and subsubsurfaces on + the parent. It is also possible to subsurface the display Surface if the + display mode is not hardware accelerated. + + See :meth:`get_offset()` and :meth:`get_parent()` to learn more + about the state of a subsurface. + + A subsurface will have the same class as the parent surface. + """ + + def get_parent(self) -> Surface: + """Find the parent of a subsurface. + + Returns the parent Surface of a subsurface. If this is not a subsurface + then ``None`` will be returned. + """ + + def get_abs_parent(self) -> Surface: + """Find the top level parent of a subsurface. + + Returns the parent Surface of a subsurface. If this is not a subsurface + then this surface will be returned. + """ + + def get_offset(self) -> tuple[int, int]: + """Find the position of a child subsurface inside a parent. + + Get the offset position of a child subsurface inside of a parent. If the + Surface is not a subsurface this will return (0, 0). + """ + + def get_abs_offset(self) -> tuple[int, int]: + """Find the absolute position of a child subsurface inside its top level parent. + + Get the offset position of a child subsurface inside of its top level + parent Surface. If the Surface is not a subsurface this will return (0, + 0). + """ + + def get_size(self) -> tuple[int, int]: + """Get the dimensions of the Surface. + + Return the width and height of the Surface in pixels. Can also be accessed + with :attr:`size` + """ + + def get_width(self) -> int: + """Get the width of the Surface. + + Return the width of the Surface in pixels. Can also be accessed with :attr:`width` + """ + + def get_height(self) -> int: + """Get the height of the Surface. + + Return the height of the Surface in pixels. Can also be accessed with :attr:`height` + """ + + def get_rect(self, **kwargs: Any) -> Rect: + """Get the rectangular area of the Surface. + + Returns a new rectangle covering the entire surface. This rectangle will + always start at (0, 0) with a width and height the same size as the surface. + + You can pass keyword argument values to this function. These named values + will be applied to the attributes of the Rect before it is returned. An + example would be ``mysurf.get_rect(center=(100, 100))`` to create a + rectangle for the Surface centered at a given position. Size attributes + such as ``size`` or ``w`` can also be applied to resize the Rect. + """ + + def get_frect(self, **kwargs: Any) -> FRect: + """Get the rectangular area of the Surface. + + This is the same as :meth:`Surface.get_rect` but returns an FRect. FRect is similar + to Rect, except it stores float values instead. + + You can pass keyword argument values to this function. These named values + will be applied to the attributes of the FRect before it is returned. An + example would be ``mysurf.get_frect(center=(100.5, 100.5))`` to create a + rectangle for the Surface centered at a given position. Size attributes + such as ``size`` or ``w`` can also be applied to resize the FRect. + """ + + def get_bitsize(self) -> int: + """Get the bit depth of the Surface pixel format. + + Returns the number of bits used to represent each pixel. This value may + not exactly fill the number of bytes used per pixel. For example a 15 bit + Surface still requires a full 2 bytes. + """ + + def get_bytesize(self) -> int: + """Get the bytes used per Surface pixel. + + Return the number of bytes used per pixel. + """ + + def get_flags(self) -> int: + """Get the additional flags used for the Surface. + + Returns a set of current Surface features. Each feature is a bit in the + flags bitmask. Typical flags are ``RLEACCEL``, ``SRCALPHA``, and + ``SRCCOLORKEY``. + + Here is a more complete list of flags. A full list can be found in + ``SDL_video.h`` + + :: + + SWSURFACE 0x00000000 # Surface is in system memory + HWSURFACE 0x00000001 # (obsolete in pygame 2) Surface is in video memory + ASYNCBLIT 0x00000004 # (obsolete in pygame 2) Use asynchronous blits if possible + + See :func:`pygame.display.set_mode()` for flags exclusive to the + display surface. + + Used internally (read-only) + + :: + + HWACCEL 0x00000100 # Blit uses hardware acceleration + SRCCOLORKEY 0x00001000 # Blit uses a source color key + RLEACCELOK 0x00002000 # Private flag + RLEACCEL 0x00004000 # Surface is RLE encoded + SRCALPHA 0x00010000 # Blit uses source alpha blending + PREALLOC 0x01000000 # Surface uses preallocated memory + """ + + def get_pitch(self) -> int: + """Get the number of bytes used per Surface row. + + Return the number of bytes separating each row in the Surface. Surfaces + in video memory are not always linearly packed. Subsurfaces will also + have a larger pitch than their real width. + + This value is not needed for normal pygame usage. + """ + + def get_masks(self) -> tuple[int, int, int, int]: + """The bitmasks needed to convert between a color and a mapped integer. + + Returns the bitmasks used to isolate each color in a mapped integer. + + This value is not needed for normal pygame usage. + """ + @deprecated("since 2.0.0. Immutable in SDL2") - def set_masks(self, color: ColorLike, /) -> None: ... - def get_shifts(self) -> tuple[int, int, int, int]: ... + def set_masks(self, color: ColorLike, /) -> None: + """Set the bitmasks needed to convert between a color and a mapped integer. + + This is not needed for normal pygame usage. + + .. note:: Starting in pygame 2.0, the masks are read-only and + accordingly this method will raise a TypeError if called. + + .. deprecatedold:: 2.0.0 + + .. versionaddedold:: 1.8.1 + """ + + def get_shifts(self) -> tuple[int, int, int, int]: + """The bit shifts needed to convert between a color and a mapped integer. + + Returns the pixel shifts need to convert between each color and a mapped + integer. + + This value is not needed for normal pygame usage. + """ + @deprecated("since 2.0.0. Immutable in SDL2") - def set_shifts(self, color: ColorLike, /) -> None: ... - def get_losses(self) -> tuple[int, int, int, int]: ... - def get_bounding_rect(self, min_alpha: int = 1) -> Rect: ... - def get_view(self, kind: _ViewKind = "2", /) -> BufferProxy: ... - def get_buffer(self) -> BufferProxy: ... + def set_shifts(self, color: ColorLike, /) -> None: + """Sets the bit shifts needed to convert between a color and a mapped integer. + + This is not needed for normal pygame usage. + + .. note:: Starting in pygame 2.0, the shifts are read-only and + accordingly this method will raise a TypeError if called. + + .. deprecatedold:: 2.0.0 + + .. versionaddedold:: 1.8.1 + """ + + def get_losses(self) -> tuple[int, int, int, int]: + """The significant bits used to convert between a color and a mapped integer. + + Return the least significant number of bits stripped from each color in a + mapped integer. + + This value is not needed for normal pygame usage. + """ + + def get_bounding_rect(self, min_alpha: int = 1) -> Rect: + """Find the smallest rect containing data. + + Returns the smallest rectangular region that contains all the pixels in + the surface that have an alpha value greater than or equal to the minimum + alpha value. + + This function will temporarily lock and unlock the Surface as needed. + + .. versionaddedold:: 1.8 + """ + + def get_view(self, kind: _ViewKind = "2", /) -> BufferProxy: + """Return a buffer view of the Surface's pixels. + + Return an object which exports a surface's internal pixel buffer as + a C level array struct, Python level array interface or a C level + buffer interface. The new buffer protocol is supported. + + The kind argument is the length 1 string '0', '1', '2', '3', + 'r', 'g', 'b', or 'a'. The letters are case insensitive; + 'A' will work as well. The argument can be either a Unicode or byte (char) + string. The default is '2'. + + '0' returns a contiguous unstructured bytes view. No surface shape + information is given. A ``ValueError`` is raised if the surface's pixels + are discontinuous. + + '1' returns a (surface-width * surface-height) array of continuous + pixels. A ``ValueError`` is raised if the surface pixels are + discontinuous. + + '2' returns a (surface-width, surface-height) array of raw pixels. + The pixels are surface-bytesize-d unsigned integers. The pixel format is + surface specific. The 3 byte unsigned integers of 24 bit surfaces are + unlikely accepted by anything other than other pygame functions. + + '3' returns a (surface-width, surface-height, 3) array of ``RGB`` color + components. Each of the red, green, and blue components are unsigned + bytes. Only 24-bit and 32-bit surfaces are supported. The color + components must be in either ``RGB`` or ``BGR`` order within the pixel. + + 'r' for red, 'g' for green, 'b' for blue, and 'a' for alpha return a + (surface-width, surface-height) view of a single color component within a + surface: a color plane. Color components are unsigned bytes. Both 24-bit + and 32-bit surfaces support 'r', 'g', and 'b'. Only 32-bit surfaces with + ``SRCALPHA`` support 'a'. + + The surface is locked only when an exposed interface is accessed. + For new buffer interface accesses, the surface is unlocked once the + last buffer view is released. For array interface and old buffer + interface accesses, the surface remains locked until the BufferProxy + object is released. + + .. versionaddedold:: 1.9.2 + """ + + def get_buffer(self) -> BufferProxy: + """Acquires a buffer object for the pixels of the Surface. + + Return a buffer object for the pixels of the Surface. The buffer can be + used for direct pixel access and manipulation. Surface pixel data is + represented as an unstructured block of memory, with a start address + and length in bytes. The data need not be contiguous. Any gaps are + included in the length, but otherwise ignored. + + This method implicitly locks the Surface. The lock will be released when + the returned :mod:`pygame.BufferProxy` object is garbage collected. + + .. versionaddedold:: 1.8 + """ + def get_blendmode(self) -> int: ... - def premul_alpha(self) -> Surface: ... - def premul_alpha_ip(self) -> Surface: ... + @property + def _pixels_address(self) -> int: + """Pixel buffer address. + + The starting address of the surface's raw pixel bytes. + + .. versionaddedold:: 1.9.2 + """ + + def premul_alpha(self) -> Surface: + """Returns a copy of the surface with the RGB channels pre-multiplied by the alpha channel. + + Returns a copy of the initial surface with the red, green and blue color + channels multiplied by the alpha channel. This is intended to make it + easier to work with the BLEND_PREMULTIPLED blend mode flag of the blit() + method. Surfaces which have called this method will only look correct + after blitting if the BLEND_PREMULTIPLED special flag is used. + + It is worth noting that after calling this method, methods that return the + color of a pixel such as get_at() will return the alpha multiplied color + values. It is not possible to fully reverse an alpha multiplication of + the colors in a surface as integer color channel data is generally + reduced by the operation (e.g. 255 x 0 = 0, from there it is not + possible to reconstruct the original 255 from just the two remaining + zeros in the color and alpha channels). + + If you call this method, and then call it again, it will multiply the color + channels by the alpha channel twice. There are many possible ways to obtain + a surface with the color channels pre-multiplied by the alpha channel in + pygame, and it is not possible to tell the difference just from the + information in the pixels. It is completely possible to have two identical + surfaces - one intended for pre-multiplied alpha blending and one intended + for normal blending. For this reason we do not store state on surfaces + intended for pre-multiplied alpha blending. + + Surfaces without an alpha channel cannot use this method and will return + an error if you use it on them. It is best used on 32 bit surfaces (the + default on most platforms) as the blitting on these surfaces can be + accelerated by SIMD versions of the pre-multiplied blitter. + + In general pre-multiplied alpha blitting is faster then 'straight alpha' + blitting and produces superior results when blitting an alpha surface onto + another surface with alpha - assuming both surfaces contain pre-multiplied + alpha colors. + + There is a `tutorial on premultiplied alpha blending here. `_ + + .. versionadded:: 2.1.4 + """ + + def premul_alpha_ip(self) -> Surface: + """Multiplies the RGB channels by the surface alpha channel. + + Multiplies the RGB channels of the surface by the alpha channel in place + and returns the surface. + + Surfaces without an alpha channel cannot use this method and will return + an error if you use it on them. It is best used on 32 bit surfaces (the + default on most platforms) as the blitting on these surfaces can be + accelerated by SIMD versions of the pre-multiplied blitter. + + Refer to the :meth:`premul_alpha` method for more information. + + .. versionadded:: 2.5.1 + """ + + @property + def width(self) -> int: + """Surface width in pixels (read-only). + + Read-only attribute. Same as :meth:`get_width()` + + .. versionadded:: 2.5.0 + """ + @property + def height(self) -> int: + """Surface height in pixels (read-only). + + Read-only attribute. Same as :meth:`get_height()` + + .. versionadded:: 2.5.0 + """ + + @property + def size(self) -> tuple[int, int]: + """Surface size in pixels (read-only). + + Read-only attribute. Same as :meth:`get_size()` + + .. versionadded:: 2.5.0 + """ SurfaceType = Surface diff --git a/docs/reST/ref/surface.rst b/docs/reST/ref/surface.rst index 06c14b2e83..0ca76bcf57 100644 --- a/docs/reST/ref/surface.rst +++ b/docs/reST/ref/surface.rst @@ -5,1095 +5,5 @@ .. currentmodule:: pygame -.. class:: Surface - - | :sl:`pygame object for representing images` - | :sg:`Surface((width, height), flags=0, depth=0, masks=None) -> Surface` - | :sg:`Surface((width, height), flags=0, Surface) -> Surface` - - A pygame Surface is used to represent any image. The Surface has a fixed - resolution and pixel format. Surfaces with 8-bit pixels use a color palette - to map to 24-bit color. - - Call :meth:`pygame.Surface()` to create a new image object. The Surface will - be cleared to all black. The only required arguments are the sizes. With no - additional arguments, the Surface will be created in a format that best - matches the display Surface. - - The pixel format can be controlled by passing the bit depth or an existing - Surface. The flags argument is a bitmask of additional features for the - surface. You can pass any combination of these flags: - - :: - - HWSURFACE (obsolete in pygame 2) creates the image in video memory - SRCALPHA the pixel format will include a per-pixel alpha - - Both flags are only a request, and may not be possible for all displays and - formats. - - Advanced users can combine a set of bitmasks with a depth value. The masks - are a set of 4 integers representing which bits in a pixel will represent - each color. Normal Surfaces should not require the masks argument. - - Surfaces can have many extra attributes like alpha planes, colorkeys, source - rectangle clipping. These functions mainly effect how the Surface is blitted - to other Surfaces. The blit routines will attempt to use hardware - acceleration when possible, otherwise they will use highly optimized - software blitting methods. - - There are three types of transparency supported in pygame: colorkeys, - surface alphas, and pixel alphas. Surface alphas can be mixed with - colorkeys, but an image with per pixel alphas cannot use the other modes. - Colorkey transparency makes a single color value transparent. Any pixels - matching the colorkey will not be drawn. The surface alpha value is a single - value that changes the transparency for the entire image. A surface alpha of - 255 is opaque, and a value of 0 is completely transparent. - - Per pixel alphas are different because they store a transparency value for - every pixel. This allows for the most precise transparency effects, but it - also the slowest. Per pixel alphas cannot be mixed with surface alpha and - colorkeys. - - There is support for pixel access for the Surfaces. Pixel access on hardware - surfaces is slow and not recommended. Pixels can be accessed using the - :meth:`get_at()` and :meth:`set_at()` functions. These methods are fine for - simple access, but will be considerably slow when doing of pixel work with - them. If you plan on doing a lot of pixel level work, it is recommended to - use a :class:`pygame.PixelArray`, which gives an array like view of the - surface. For involved mathematical manipulations try the - :mod:`pygame.surfarray` module (It's quite quick, but requires NumPy.) - - Any functions that directly access a surface's pixel data will need that - surface to be lock()'ed. These functions can :meth:`lock()` and - :meth:`unlock()` the surfaces themselves without assistance. But, if a - function will be called many times, there will be a lot of overhead for - multiple locking and unlocking of the surface. It is best to lock the - surface manually before making the function call many times, and then - unlocking when you are finished. All functions that need a locked surface - will say so in their docs. Remember to leave the Surface locked only while - necessary. - - Surface pixels are stored internally as a single number that has all the - colors encoded into it. Use the :meth:`map_rgb()` and - :meth:`unmap_rgb()` to convert between individual red, green, and blue - values into a packed integer for that Surface. - - Surfaces can also reference sections of other Surfaces. These are created - with the :meth:`subsurface()` method. Any change to either Surface will - effect the other. - - Each Surface contains a clipping area. By default the clip area covers the - entire Surface. If it is changed, all drawing operations will only effect - the smaller area. - - .. method:: blit - - | :sl:`draw another surface onto this one` - | :sg:`blit(source, dest=(0, 0), area=None, special_flags=0) -> Rect` - - Draws another Surface onto this Surface. - - **Parameters** - - ``source`` - The ``Surface`` object to draw onto this ``Surface``. - If it has transparency, transparent pixels will be ignored when blittting to an 8-bit ``Surface``. - - ``dest`` *(optional)* - The ``source`` draw position onto this ``Surface``, defaults to (0, 0). - It can be a coordinate pair ``(x, y)`` or a ``Rect`` (using its top-left corner). - If a ``Rect`` is passed, its size will not affect the blit. - - ``area`` *(optional)* - The rectangular portion of the ``source`` to draw. - It can be a ``Rect`` object representing that section. If ``None`` or not provided, - the entire source surface will be drawn. - If the ``Rect`` has negative position, the final blit position will be - ``dest`` - ``Rect.topleft``. - - ``special_flags`` *(optional)* - Controls how the colors of the ``source`` are combined with this Surface. - If not provided it defaults to ``BLENDMODE_NONE`` (``0``). - See :doc:`special_flags_list` for a list of possible values. - **Return** - A :doc:`rect` object representing the affected area of this ``Surface`` that was modified - by the blit operation. This area includes only the pixels within this ``Surface`` or - its clipping area (see :meth:`set_clip`). - Generally you don't need to use this return value, as it was initially designed to - pass it to :meth:`pygame.display.update` to optimize the updating of the display. - Since modern computers are fast enough to update the entire display at high speeds, - this return value is rarely used nowadays. - **Example Use** - .. code-block:: python - - # create a surface of size 50x50 and fill it with red color - red_surf = pygame.Surface((50, 50)) - red_surf.fill("red") - - # draw the surface on another surface at position (0, 0) - another_surface.blit(red_surf, (0, 0)) - - **Notes** - - When self-blitting and there is a colorkey or alpha transparency set, resulting colors - may appear slightly different compared to a non-self blit. - - - The blit is ignored if the ``source`` is positioned completely outside this ``Surface``'s - clipping area. Otherwise only the overlapping area will be drawn. - - .. versionchanged:: 2.5.1 The dest argument is optional and defaults to (0, 0) - - .. ## Surface.blit ## - - .. method:: blits - - | :sl:`draw many surfaces onto this surface at their corresponding location` - | :sg:`blits(blit_sequence=((source, dest), ...), doreturn=True) -> [Rect, ...] or None` - | :sg:`blits(((source, dest, area), ...)) -> [Rect, ...]` - | :sg:`blits(((source, dest, area, special_flags), ...)) -> [Rect, ...]` - - The ``blits`` method efficiently draws a sequence of surfaces onto this ``Surface``. - - **Parameters** - - ``blit_sequence`` - A sequence that contains each surface to be drawn along with its associated blit - arguments. See the **Sequence Item Formats** section below for the possible formats. - - ``doreturn`` (optional) - The ``doreturn`` parameter controls the return value. When set to ``True``, it returns - a list of rectangles representing the changed areas. When set to ``False``, returns - ``None``. - - **Return** - - A list of rectangles or ``None``. - - **Sequence Item Formats** - - ``(source, dest)`` - - ``source``: Surface object to be drawn. - - ``dest``: Position where the source Surface should be blitted. - - ``(source, dest, area)`` - - ``area``: (optional) Specific area of the source Surface to be drawn. - - ``(source, dest, area, special_flags)`` - - ``special_flags``: (optional) Controls the blending mode for drawing colors. - See :doc:`special_flags_list` for a list of possible values. - - **Notes** - - - ``blits`` is an advanced method. It is recommended to read the documentation - of :meth:`blit` first. - - - To draw a ``Surface`` with a special flag, you must specify an area as well, e.g., - ``(source, dest, None, special_flags)``. - - - Prefer using :meth:`blits` over :meth:`blit` when drawing multiple surfaces - for better performance. Use :meth:`blit` if you need to draw a single surface. - - - For drawing a sequence of (source, dest) pairs with whole source Surface - and a singular special_flag, use the :meth:`fblits()` method. - - .. versionaddedold:: 1.9.4 - - .. ## Surface.blits ## - - .. method:: fblits - - | :sl:`draw many surfaces onto this surface at their corresponding location and with the same special_flags` - | :sg:`fblits(blit_sequence=((source, dest), ...), special_flags=0, /) -> None` - - This method takes a sequence of tuples (source, dest) as input, where source is a Surface - object and dest is its destination position on this Surface. It draws each source Surface - fully (meaning that unlike `blit()` you cannot pass an "area" parameter to represent - a smaller portion of the source Surface to draw) on this Surface with the same blending - mode specified by special_flags. - - :param blit_sequence: a sequence of (source, dest) - :param special_flags: the flag(s) representing the blend mode used for each surface. - See :doc:`special_flags_list` for a list of possible values. - - :returns: ``None`` - - .. note:: This method only accepts a sequence of (source, dest) pairs and a single - special_flags value that's applied to all surfaces drawn. This allows faster - iteration over the sequence and better performance over `blits()`. Further - optimizations are applied if blit_sequence is a list or a tuple (using one - of them is recommended). - - .. versionadded:: 2.1.4 - - .. ## Surface.fblits ## - - .. method:: convert - - | :sl:`change the pixel format of a surface` - | :sg:`convert(surface, /) -> Surface` - | :sg:`convert(depth, flags=0, /) -> Surface` - | :sg:`convert(masks, flags=0, /) -> Surface` - | :sg:`convert() -> Surface` - - Creates a new copy of the Surface with the pixel format changed. The new - pixel format can be determined from another existing Surface. Otherwise - depth, flags, and masks arguments can be used, similar to the - :meth:`pygame.Surface()` call. - - If no arguments are passed the new Surface will have the same pixel - format as the display Surface. This is always the fastest format for - blitting. It is a good idea to convert all Surfaces before they are - blitted many times. - - The converted Surface will have no pixel alphas. They will be stripped if - the original had them. See :meth:`convert_alpha()` for preserving or - creating per-pixel alphas. - - The new copy will have the same class as the copied surface. This lets - a Surface subclass inherit this method without the need to override, - unless subclass specific instance attributes also need copying. - - .. versionchanged:: 2.5.0 converting to a known format will succeed without a window/display surface. - - .. ## Surface.convert ## - - .. method:: convert_alpha - - | :sl:`change the pixel format of a surface including per pixel alphas` - | :sg:`convert_alpha() -> Surface` - - Creates a new copy of the surface with the desired pixel format. The new - surface will be in a format suited for quick blitting to the display surface - with per pixel alpha. - - Unlike the :meth:`convert()` method, the pixel format for the new - surface will not be exactly the same as the display surface, but it will - be optimized for fast alpha blitting to it. - - As with :meth:`convert()` the returned surface has the same class as - the converted surface. - - .. versionchanged:: 2.4.0 'Surface' argument deprecated. - - .. ## Surface.convert_alpha ## - - .. method:: copy - - | :sl:`create a new copy of a Surface` - | :sg:`copy() -> Surface` - - Makes a duplicate copy of a Surface. The new surface will have the same - pixel formats, color palettes, transparency settings, and class as the - original. If a Surface subclass also needs to copy any instance specific - attributes then it should override ``copy()``. Shallow copy and deepcopy - are supported, Surface implements __copy__ and __deepcopy__ respectively. - - .. versionadded:: 2.3.1 - Added support for deepcopy by implementing __deepcopy__, calls copy() internally. - - .. ## Surface.copy ## - - .. method:: fill - - | :sl:`fill Surface with a solid color` - | :sg:`fill(color, rect=None, special_flags=0) -> Rect` - - Fill the Surface with a solid color. If no rect argument is given the - entire Surface will be filled. The rect argument will limit the fill to a - specific area. The fill will also be contained by the Surface clip area. - - The color argument should be compatible with :data:`pygame.typing.ColorLike`. - If using ``RGBA``, the Alpha (A part of ``RGBA``) is ignored unless the surface - uses per pixel alpha (Surface has the ``SRCALPHA`` flag). - - The special_flags argument controls how the colors are combined. See :doc:`special_flags_list` - for a list of possible values. - - This will return the affected Surface area. - - .. note:: As of pygame-ce version 2.5.1, a long-standing bug has been fixed! - Now when passing in a ``Rect`` with negative ``x`` or negative ``y`` (or both), - the ``Rect`` filled will no longer be shifted to ``(0, 0)``, but instead only the - part of the ``Rect`` overlapping the window's ``Rect`` will be filled. - - .. ## Surface.fill ## - - .. method:: scroll - - | :sl:`shift the Surface pixels in place` - | :sg:`scroll(dx=0, dy=0, scroll_flag=0, /) -> None` - - Move the Surface by dx pixels right and dy pixels down. dx and dy may be - negative for left and up scrolls respectively. - - Scrolling is contained by the Surface clip area. It is safe to have dx - and dy values that exceed the surface size. - - The scroll flag can be: - * ``0`` (default): the pixels are shifted but previous pixels are - not modified. - - * ``pygame.SCROLL_ERASE``: the space created by the shifting pixels - is filled with black or transparency. - - * ``pygame.SCROLL_REPEAT``: the pixels that disappear out of the - surface or clip bounds are brought back on the opposite side - resulting in an infinitely scrolling and repeating surface. - - .. versionaddedold:: 1.9 - - .. versionchanged:: 2.5.3 Add repeating scroll and allow erasing pixels - - .. ## Surface.scroll ## - - .. method:: set_colorkey - - | :sl:`set the transparent colorkey` - | :sg:`set_colorkey(color, flags=0, /) -> None` - | :sg:`set_colorkey(None) -> None` - - Set the current color key for the Surface. When blitting this Surface - onto a destination, any pixels that have the same color as the colorkey - will be transparent. The color should be compatible with :data:`pygame.typing.ColorLike`. - If ``None`` is passed, the colorkey will be unset. - - The colorkey will be ignored if the Surface is formatted to use per pixel - alpha values. The colorkey can be mixed with the full Surface alpha - value. - - The optional flags argument can be set to ``pygame.RLEACCEL`` to provide - better performance on non accelerated displays. An ``RLEACCEL`` Surface - will be slower to modify, but quicker to blit as a source. - - .. ## Surface.set_colorkey ## - - .. method:: get_colorkey - - | :sl:`get the current transparent colorkey` - | :sg:`get_colorkey() -> RGBA or None` - - Return the current colorkey value for the Surface. If the colorkey is not - set then ``None`` is returned. - - .. ## Surface.get_colorkey ## - - .. method:: set_alpha - - | :sl:`set the alpha value for the full Surface` - | :sg:`set_alpha(value, flags=0, /) -> None` - | :sg:`set_alpha(None) -> None` - - Set the current alpha value for the Surface. When blitting this Surface - onto a destination, the pixels will be drawn slightly transparent. The - alpha value is an integer from 0 to 255, 0 is fully transparent and 255 - is fully opaque. If ``None`` is passed for the alpha value, then alpha - blending will be disabled, including per-pixel alpha. - - This value is different than the per pixel Surface alpha. For a surface - with per pixel alpha, blanket alpha is ignored and ``None`` is returned. - - .. versionchangedold:: 2.0 per-surface alpha can be combined with per-pixel - alpha. - - The optional flags argument can be set to ``pygame.RLEACCEL`` to provide - better performance on non accelerated displays. An ``RLEACCEL`` Surface - will be slower to modify, but quicker to blit as a source. - - .. ## Surface.set_alpha ## - - .. method:: get_alpha - - | :sl:`get the current Surface transparency value` - | :sg:`get_alpha() -> int_value` - - Return the current alpha value for the Surface. - - .. ## Surface.get_alpha ## - - .. method:: lock - - | :sl:`lock the Surface memory for pixel access` - | :sg:`lock() -> None` - - Lock the pixel data of a Surface for access. On accelerated Surfaces, the - pixel data may be stored in volatile video memory or nonlinear compressed - forms. When a Surface is locked the pixel memory becomes available to - access by regular software. Code that reads or writes pixel values will - need the Surface to be locked. - - Surfaces should not remain locked for more than necessary. A locked - Surface can often not be displayed or managed by pygame. - - Not all Surfaces require locking. The :meth:`mustlock()` method can - determine if it is actually required. There is no performance penalty for - locking and unlocking a Surface that does not need it. - - All pygame functions will automatically lock and unlock the Surface data - as needed. If a section of code is going to make calls that will - repeatedly lock and unlock the Surface many times, it can be helpful to - wrap the block inside a lock and unlock pair. - - It is safe to nest locking and unlocking calls. The surface will only be - unlocked after the final lock is released. - - .. ## Surface.lock ## - - .. method:: unlock - - | :sl:`unlock the Surface memory from pixel access` - | :sg:`unlock() -> None` - - Unlock the Surface pixel data after it has been locked. The unlocked - Surface can once again be drawn and managed by pygame. See the - :meth:`lock()` documentation for more details. - - All pygame functions will automatically lock and unlock the Surface data - as needed. If a section of code is going to make calls that will - repeatedly lock and unlock the Surface many times, it can be helpful to - wrap the block inside a lock and unlock pair. - - It is safe to nest locking and unlocking calls. The surface will only be - unlocked after the final lock is released. - - .. ## Surface.unlock ## - - .. method:: mustlock - - | :sl:`test if the Surface requires locking` - | :sg:`mustlock() -> bool` - - Returns ``True`` if the Surface is required to be locked to access pixel - data. Usually pure software Surfaces do not require locking. This method - is rarely needed, since it is safe and quickest to just lock all Surfaces - as needed. - - All pygame functions will automatically lock and unlock the Surface data - as needed. If a section of code is going to make calls that will - repeatedly lock and unlock the Surface many times, it can be helpful to - wrap the block inside a lock and unlock pair. - - .. ## Surface.mustlock ## - - .. method:: get_locked - - | :sl:`test if the Surface is current locked` - | :sg:`get_locked() -> bool` - - Returns ``True`` when the Surface is locked. It doesn't matter how many - times the Surface is locked. - - .. ## Surface.get_locked ## - - .. method:: get_locks - - | :sl:`gets the locks for the Surface` - | :sg:`get_locks() -> tuple` - - Returns the currently existing locks for the Surface. - - .. ## Surface.get_locks ## - - .. method:: get_at - - | :sl:`get the color value at a single pixel` - | :sg:`get_at((x, y), /) -> Color` - - Return a copy of the ``RGBA`` Color value at the given pixel. If the - Surface has no per pixel alpha, then the alpha value will always be 255 - (opaque). If the pixel position is outside the area of the Surface an - ``IndexError`` exception will be raised. - - Getting and setting pixels one at a time is generally too slow to be used - in a game or realtime situation. It is better to use methods which - operate on many pixels at a time like with the blit, fill and draw - methods - or by using :mod:`pygame.surfarray`/:mod:`pygame.PixelArray`. - - This function will temporarily lock and unlock the Surface as needed. - - .. versionchanged:: 2.3.1 can now also accept both float coordinates and Vector2s for pixels. - - Returning a Color instead of tuple. Use ``tuple(surf.get_at((x,y)))`` - if you want a tuple, and not a Color. This should only matter if - you want to use the color as a key in a dict. - - .. versionaddedold:: 1.9 - - .. ## Surface.get_at ## - - .. method:: set_at - - | :sl:`set the color value for a single pixel` - | :sg:`set_at((x, y), color, /) -> None` - - Set the color of a single pixel at the specified coordinates to be a - :data:`pygame.typing.ColorLike` value. If the Surface does not have per pixel alphas, - the alpha value is ignored. Setting pixels outside the Surface area or outside - the Surface clipping will have no effect. - - Getting and setting pixels one at a time is generally too slow to be used - in a game or realtime situation. - - This function will temporarily lock and unlock the Surface as needed. - - .. note:: If the surface is palettized, the pixel color will be set to the - most similar color in the palette. - - .. versionchanged:: 2.3.1 can now also accept both float coordinates and Vector2s for pixels. - - .. ## Surface.set_at ## - - .. method:: get_at_mapped - - | :sl:`get the mapped color value at a single pixel` - | :sg:`get_at_mapped((x, y), /) -> Color` - - Return the integer value of the given pixel. If the pixel position is - outside the area of the Surface an ``IndexError`` exception will be - raised. - - This method is intended for pygame unit testing. It unlikely has any use - in an application. - - This function will temporarily lock and unlock the Surface as needed. - - .. versionaddedold:: 1.9.2 - - .. versionchanged:: 2.3.1 can now also accept both float coordinates and Vector2s for pixels. - - .. ## Surface.get_at_mapped ## - - .. method:: get_palette - - | :sl:`get the color index palette for an 8-bit Surface` - | :sg:`get_palette() -> [Color, Color, Color, ...]` - - Return a list of up to 256 color elements that represent the indexed - colors used in an 8-bit Surface. The returned list is a copy of the - palette, and changes will have no effect on the Surface. - - Returning a list of ``Color(with length 3)`` instances instead of tuples. - - .. versionaddedold:: 1.9 - - .. ## Surface.get_palette ## - - .. method:: get_palette_at - - | :sl:`get the color for a single entry in a palette` - | :sg:`get_palette_at(index, /) -> Color` - - Returns the red, green, and blue color values for a single index in a - Surface palette. The index should be a value from 0 to 255. - - .. versionaddedold:: 1.9 - Returning ``Color(with length 3)`` instance instead of a tuple. - - .. ## Surface.get_palette_at ## - - .. method:: set_palette - - | :sl:`set the color palette for an 8-bit Surface` - | :sg:`set_palette([color, color, color, ...], /) -> None` - - Set the full palette for an 8-bit Surface. This will replace the colors in - the existing palette. A partial palette can be passed and only the first - colors in the original palette will be changed. - - This function has no effect on a Surface with more than 8-bits per pixel. - - .. ## Surface.set_palette ## - - .. method:: set_palette_at - - | :sl:`set the color for a single index in an 8-bit Surface palette` - | :sg:`set_palette_at(index, color, /) -> None` - - Set the palette value for a single entry in a Surface palette. The index - should be a value from 0 to 255. - - This function has no effect on a Surface with more than 8-bits per pixel. - - .. ## Surface.set_palette_at ## - - .. method:: map_rgb - - | :sl:`convert a color into a mapped color value` - | :sg:`map_rgb(color, /) -> mapped_int` - - Convert a :data:`pygame.typing.ColorLike` into the mapped integer value - for this Surface. The returned integer will contain no more bits than the - bit depth of the Surface. Mapped color values are not often used inside pygame, - but can be passed to most functions that require a Surface and a color. - - See the Surface object documentation for more information about colors - and pixel formats. - - .. ## Surface.map_rgb ## - - .. method:: unmap_rgb - - | :sl:`convert a mapped integer color value into a Color` - | :sg:`unmap_rgb(mapped_int, /) -> Color` - - Convert an mapped integer color into the ``RGB`` color components for - this Surface. Mapped color values are not often used inside pygame, but - can be passed to most functions that require a Surface and a color. - - See the Surface object documentation for more information about colors - and pixel formats. - - .. ## Surface.unmap_rgb ## - - .. method:: set_clip - - | :sl:`set the current clipping area of the Surface` - | :sg:`set_clip(rect, /) -> None` - | :sg:`set_clip(None) -> None` - - Each Surface has an active clipping area. This is a rectangle that - represents the only pixels on the Surface that can be modified. If - ``None`` is passed for the rectangle the full Surface will be available - for changes. - - The clipping area is always restricted to the area of the Surface itself. - If the clip rectangle is too large it will be shrunk to fit inside the - Surface. - - .. ## Surface.set_clip ## - - .. method:: get_clip - - | :sl:`get the current clipping area of the Surface` - | :sg:`get_clip() -> Rect` - - Return a rectangle of the current clipping area. The Surface will always - return a valid rectangle that will never be outside the bounds of the - surface. If the Surface has had ``None`` set for the clipping area, the - Surface will return a rectangle with the full area of the Surface. - - .. ## Surface.get_clip ## - - .. method:: subsurface - - | :sl:`create a new surface that references its parent` - | :sg:`subsurface(rect, /) -> Surface` - - Returns a new Surface that shares its pixels with its new parent. The new - Surface is considered a child of the original. Modifications to either - Surface pixels will effect each other. Surface information like clipping - area and color keys are unique to each Surface. - - The new Surface will inherit the palette, color key, and alpha settings - from its parent. - - It is possible to have any number of subsurfaces and subsubsurfaces on - the parent. It is also possible to subsurface the display Surface if the - display mode is not hardware accelerated. - - See :meth:`get_offset()` and :meth:`get_parent()` to learn more - about the state of a subsurface. - - A subsurface will have the same class as the parent surface. - - .. ## Surface.subsurface ## - - .. method:: get_parent - - | :sl:`find the parent of a subsurface` - | :sg:`get_parent() -> Surface` - - Returns the parent Surface of a subsurface. If this is not a subsurface - then ``None`` will be returned. - - .. ## Surface.get_parent ## - - .. method:: get_abs_parent - - | :sl:`find the top level parent of a subsurface` - | :sg:`get_abs_parent() -> Surface` - - Returns the parent Surface of a subsurface. If this is not a subsurface - then this surface will be returned. - - .. ## Surface.get_abs_parent ## - - .. method:: get_offset - - | :sl:`find the position of a child subsurface inside a parent` - | :sg:`get_offset() -> (x, y)` - - Get the offset position of a child subsurface inside of a parent. If the - Surface is not a subsurface this will return (0, 0). - - .. ## Surface.get_offset ## - - .. method:: get_abs_offset - - | :sl:`find the absolute position of a child subsurface inside its top level parent` - | :sg:`get_abs_offset() -> (x, y)` - - Get the offset position of a child subsurface inside of its top level - parent Surface. If the Surface is not a subsurface this will return (0, - 0). - - .. ## Surface.get_abs_offset ## - - .. method:: get_size - - | :sl:`get the dimensions of the Surface` - | :sg:`get_size() -> (width, height)` - - Return the width and height of the Surface in pixels. Can also be accessed with :attr:`size` - - .. ## Surface.get_size ## - - .. method:: get_width - - | :sl:`get the width of the Surface` - | :sg:`get_width() -> width` - - Return the width of the Surface in pixels. Can also be accessed with :attr:`width` - - .. ## Surface.get_width ## - - .. method:: get_height - - | :sl:`get the height of the Surface` - | :sg:`get_height() -> height` - - Return the height of the Surface in pixels. Can also be accessed with :attr:`height` - - .. ## Surface.get_height ## - - .. method:: get_rect - - | :sl:`get the rectangular area of the Surface` - | :sg:`get_rect(\**kwargs) -> Rect` - - Returns a new rectangle covering the entire surface. This rectangle will - always start at (0, 0) with a width and height the same size as the surface. - - You can pass keyword argument values to this function. These named values - will be applied to the attributes of the Rect before it is returned. An - example would be ``mysurf.get_rect(center=(100, 100))`` to create a - rectangle for the Surface centered at a given position. Size attributes - such as ``size`` or ``w`` can also be applied to resize the Rect. - - .. ## Surface.get_rect ## - - .. method:: get_frect - - | :sl:`get the rectangular area of the Surface` - | :sg:`get_frect(\**kwargs) -> FRect` - - This is the same as :meth:`Surface.get_rect` but returns an FRect. FRect is similar - to Rect, except it stores float values instead. - - You can pass keyword argument values to this function. These named values - will be applied to the attributes of the FRect before it is returned. An - example would be ``mysurf.get_frect(center=(100.5, 100.5))`` to create a - rectangle for the Surface centered at a given position. Size attributes - such as ``size`` or ``w`` can also be applied to resize the FRect. - - .. ## Surface.get_frect ## - - .. method:: get_bitsize - - | :sl:`get the bit depth of the Surface pixel format` - | :sg:`get_bitsize() -> int` - - Returns the number of bits used to represent each pixel. This value may - not exactly fill the number of bytes used per pixel. For example a 15 bit - Surface still requires a full 2 bytes. - - .. ## Surface.get_bitsize ## - - .. method:: get_bytesize - - | :sl:`get the bytes used per Surface pixel` - | :sg:`get_bytesize() -> int` - - Return the number of bytes used per pixel. - - .. ## Surface.get_bytesize ## - - .. method:: get_flags - - | :sl:`get the additional flags used for the Surface` - | :sg:`get_flags() -> int` - - Returns a set of current Surface features. Each feature is a bit in the - flags bitmask. Typical flags are ``RLEACCEL``, ``SRCALPHA``, and - ``SRCCOLORKEY``. - - Here is a more complete list of flags. A full list can be found in - ``SDL_video.h`` - - :: - - SWSURFACE 0x00000000 # Surface is in system memory - HWSURFACE 0x00000001 # (obsolete in pygame 2) Surface is in video memory - ASYNCBLIT 0x00000004 # (obsolete in pygame 2) Use asynchronous blits if possible - - See :func:`pygame.display.set_mode()` for flags exclusive to the - display surface. - - Used internally (read-only) - - :: - - HWACCEL 0x00000100 # Blit uses hardware acceleration - SRCCOLORKEY 0x00001000 # Blit uses a source color key - RLEACCELOK 0x00002000 # Private flag - RLEACCEL 0x00004000 # Surface is RLE encoded - SRCALPHA 0x00010000 # Blit uses source alpha blending - PREALLOC 0x01000000 # Surface uses preallocated memory - - .. ## Surface.get_flags ## - - .. method:: get_pitch - - | :sl:`get the number of bytes used per Surface row` - | :sg:`get_pitch() -> int` - - Return the number of bytes separating each row in the Surface. Surfaces - in video memory are not always linearly packed. Subsurfaces will also - have a larger pitch than their real width. - - This value is not needed for normal pygame usage. - - .. ## Surface.get_pitch ## - - .. method:: get_masks - - | :sl:`the bitmasks needed to convert between a color and a mapped integer` - | :sg:`get_masks() -> (R, G, B, A)` - - Returns the bitmasks used to isolate each color in a mapped integer. - - This value is not needed for normal pygame usage. - - .. ## Surface.get_masks ## - - .. method:: set_masks - - | :sl:`set the bitmasks needed to convert between a color and a mapped integer` - | :sg:`set_masks((r, g, b, a), /) -> None` - - This is not needed for normal pygame usage. - - .. note:: Starting in pygame 2.0, the masks are read-only and - accordingly this method will raise a TypeError if called. - - .. deprecatedold:: 2.0.0 - - .. versionaddedold:: 1.8.1 - - .. ## Surface.set_masks ## - - .. method:: get_shifts - - | :sl:`the bit shifts needed to convert between a color and a mapped integer` - | :sg:`get_shifts() -> (R, G, B, A)` - - Returns the pixel shifts need to convert between each color and a mapped - integer. - - This value is not needed for normal pygame usage. - - .. ## Surface.get_shifts ## - - .. method:: set_shifts - - | :sl:`sets the bit shifts needed to convert between a color and a mapped integer` - | :sg:`set_shifts((r, g, b, a), /) -> None` - - This is not needed for normal pygame usage. - - .. note:: Starting in pygame 2.0, the shifts are read-only and - accordingly this method will raise a TypeError if called. - - .. deprecatedold:: 2.0.0 - - .. versionaddedold:: 1.8.1 - - .. ## Surface.set_shifts ## - - .. method:: get_losses - - | :sl:`the significant bits used to convert between a color and a mapped integer` - | :sg:`get_losses() -> (R, G, B, A)` - - Return the least significant number of bits stripped from each color in a - mapped integer. - - This value is not needed for normal pygame usage. - - .. ## Surface.get_losses ## - - .. method:: get_bounding_rect - - | :sl:`find the smallest rect containing data` - | :sg:`get_bounding_rect(min_alpha = 1) -> Rect` - - Returns the smallest rectangular region that contains all the pixels in - the surface that have an alpha value greater than or equal to the minimum - alpha value. - - This function will temporarily lock and unlock the Surface as needed. - - .. versionaddedold:: 1.8 - - .. ## Surface.get_bounding_rect ## - - .. method:: get_view - - | :sl:`return a buffer view of the Surface's pixels.` - | :sg:`get_view(kind='2', /) -> BufferProxy` - - Return an object which exports a surface's internal pixel buffer as - a C level array struct, Python level array interface or a C level - buffer interface. The new buffer protocol is supported. - - The kind argument is the length 1 string '0', '1', '2', '3', - 'r', 'g', 'b', or 'a'. The letters are case insensitive; - 'A' will work as well. The argument can be either a Unicode or byte (char) - string. The default is '2'. - - '0' returns a contiguous unstructured bytes view. No surface shape - information is given. A ``ValueError`` is raised if the surface's pixels - are discontinuous. - - '1' returns a (surface-width * surface-height) array of continuous - pixels. A ``ValueError`` is raised if the surface pixels are - discontinuous. - - '2' returns a (surface-width, surface-height) array of raw pixels. - The pixels are surface-bytesize-d unsigned integers. The pixel format is - surface specific. The 3 byte unsigned integers of 24 bit surfaces are - unlikely accepted by anything other than other pygame functions. - - '3' returns a (surface-width, surface-height, 3) array of ``RGB`` color - components. Each of the red, green, and blue components are unsigned - bytes. Only 24-bit and 32-bit surfaces are supported. The color - components must be in either ``RGB`` or ``BGR`` order within the pixel. - - 'r' for red, 'g' for green, 'b' for blue, and 'a' for alpha return a - (surface-width, surface-height) view of a single color component within a - surface: a color plane. Color components are unsigned bytes. Both 24-bit - and 32-bit surfaces support 'r', 'g', and 'b'. Only 32-bit surfaces with - ``SRCALPHA`` support 'a'. - - The surface is locked only when an exposed interface is accessed. - For new buffer interface accesses, the surface is unlocked once the - last buffer view is released. For array interface and old buffer - interface accesses, the surface remains locked until the BufferProxy - object is released. - - .. versionaddedold:: 1.9.2 - - .. method:: get_buffer - - | :sl:`acquires a buffer object for the pixels of the Surface.` - | :sg:`get_buffer() -> BufferProxy` - - Return a buffer object for the pixels of the Surface. The buffer can be - used for direct pixel access and manipulation. Surface pixel data is - represented as an unstructured block of memory, with a start address - and length in bytes. The data need not be contiguous. Any gaps are - included in the length, but otherwise ignored. - - This method implicitly locks the Surface. The lock will be released when - the returned :mod:`pygame.BufferProxy` object is garbage collected. - - .. versionaddedold:: 1.8 - - .. ## Surface.get_buffer ## - - .. attribute:: _pixels_address - - | :sl:`pixel buffer address` - | :sg:`_pixels_address -> int` - - The starting address of the surface's raw pixel bytes. - - .. versionaddedold:: 1.9.2 - - .. method:: premul_alpha - - | :sl:`returns a copy of the surface with the RGB channels pre-multiplied by the alpha channel.` - | :sg:`premul_alpha() -> Surface` - - Returns a copy of the initial surface with the red, green and blue color channels multiplied - by the alpha channel. This is intended to make it easier to work with the BLEND_PREMULTIPLED - blend mode flag of the blit() method. Surfaces which have called this method will only look - correct after blitting if the BLEND_PREMULTIPLED special flag is used. - - It is worth noting that after calling this method, methods that return the color of a pixel - such as get_at() will return the alpha multiplied color values. It is not possible to fully - reverse an alpha multiplication of the colors in a surface as integer color channel data - is generally reduced by the operation (e.g. 255 x 0 = 0, from there it is not possible to reconstruct - the original 255 from just the two remaining zeros in the color and alpha channels). - - If you call this method, and then call it again, it will multiply the color channels by the alpha channel - twice. There are many possible ways to obtain a surface with the color channels pre-multiplied by the - alpha channel in pygame, and it is not possible to tell the difference just from the information in the pixels. - It is completely possible to have two identical surfaces - one intended for pre-multiplied alpha blending and - one intended for normal blending. For this reason we do not store state on surfaces intended for pre-multiplied - alpha blending. - - Surfaces without an alpha channel cannot use this method and will return an error if you use - it on them. It is best used on 32 bit surfaces (the default on most platforms) as the blitting - on these surfaces can be accelerated by SIMD versions of the pre-multiplied blitter. - - In general pre-multiplied alpha blitting is faster then 'straight alpha' blitting and produces - superior results when blitting an alpha surface onto another surface with alpha - assuming both - surfaces contain pre-multiplied alpha colors. - - There is a `tutorial on premultiplied alpha blending here. `_ - - .. versionadded:: 2.1.4 - - .. ## Surface.premul_alpha ## - - .. method:: premul_alpha_ip - - | :sl:`multiplies the RGB channels by the surface alpha channel.` - | :sg:`premul_alpha_ip() -> Surface` - - Multiplies the RGB channels of the surface by the alpha channel in place and returns the surface. - - Surfaces without an alpha channel cannot use this method and will return an error if you use - it on them. It is best used on 32 bit surfaces (the default on most platforms) as the blitting - on these surfaces can be accelerated by SIMD versions of the pre-multiplied blitter. - - Refer to the :meth:`premul_alpha` method for more information. - - .. versionadded:: 2.5.1 - - .. ## Surface.premul_alpha_ip ## - - .. attribute:: width - - | :sl:`Surface width in pixels (read-only)` - | :sg:`width -> int` - - Read-only attribute. Same as :meth:`get_width()` - - .. versionadded:: 2.5.0 - - .. attribute:: height - - | :sl:`Surface height in pixels (read-only)` - | :sg:`height -> int` - - Read-only attribute. Same as :meth:`get_height()` - - .. versionadded:: 2.5.0 - - .. attribute:: size - - | :sl:`Surface size in pixels (read-only)` - | :sg:`height -> tuple[int, int]` - - Read-only attribute. Same as :meth:`get_size()` - - .. versionadded:: 2.5.0 - - .. ## pygame.Surface ## +.. autopgclass:: Surface + :members: diff --git a/src_c/doc/surface_doc.h b/src_c/doc/surface_doc.h index 43b62cbfa5..1ac7be1cef 100644 --- a/src_c/doc/surface_doc.h +++ b/src_c/doc/surface_doc.h @@ -1,58 +1,57 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_SURFACE "Surface((width, height), flags=0, depth=0, masks=None) -> Surface\nSurface((width, height), flags=0, Surface) -> Surface\npygame object for representing images" -#define DOC_SURFACE_BLIT "blit(source, dest=(0, 0), area=None, special_flags=0) -> Rect\ndraw another surface onto this one" -#define DOC_SURFACE_BLITS "blits(blit_sequence=((source, dest), ...), doreturn=True) -> [Rect, ...] or None\nblits(((source, dest, area), ...)) -> [Rect, ...]\nblits(((source, dest, area, special_flags), ...)) -> [Rect, ...]\ndraw many surfaces onto this surface at their corresponding location" -#define DOC_SURFACE_FBLITS "fblits(blit_sequence=((source, dest), ...), special_flags=0, /) -> None\ndraw many surfaces onto this surface at their corresponding location and with the same special_flags" -#define DOC_SURFACE_CONVERT "convert(surface, /) -> Surface\nconvert(depth, flags=0, /) -> Surface\nconvert(masks, flags=0, /) -> Surface\nconvert() -> Surface\nchange the pixel format of a surface" -#define DOC_SURFACE_CONVERTALPHA "convert_alpha() -> Surface\nchange the pixel format of a surface including per pixel alphas" -#define DOC_SURFACE_COPY "copy() -> Surface\ncreate a new copy of a Surface" -#define DOC_SURFACE_FILL "fill(color, rect=None, special_flags=0) -> Rect\nfill Surface with a solid color" -#define DOC_SURFACE_SCROLL "scroll(dx=0, dy=0, scroll_flag=0, /) -> None\nshift the Surface pixels in place" -#define DOC_SURFACE_SETCOLORKEY "set_colorkey(color, flags=0, /) -> None\nset_colorkey(None) -> None\nset the transparent colorkey" -#define DOC_SURFACE_GETCOLORKEY "get_colorkey() -> RGBA or None\nget the current transparent colorkey" -#define DOC_SURFACE_SETALPHA "set_alpha(value, flags=0, /) -> None\nset_alpha(None) -> None\nset the alpha value for the full Surface" -#define DOC_SURFACE_GETALPHA "get_alpha() -> int_value\nget the current Surface transparency value" -#define DOC_SURFACE_LOCK "lock() -> None\nlock the Surface memory for pixel access" -#define DOC_SURFACE_UNLOCK "unlock() -> None\nunlock the Surface memory from pixel access" -#define DOC_SURFACE_MUSTLOCK "mustlock() -> bool\ntest if the Surface requires locking" -#define DOC_SURFACE_GETLOCKED "get_locked() -> bool\ntest if the Surface is current locked" -#define DOC_SURFACE_GETLOCKS "get_locks() -> tuple\ngets the locks for the Surface" -#define DOC_SURFACE_GETAT "get_at((x, y), /) -> Color\nget the color value at a single pixel" -#define DOC_SURFACE_SETAT "set_at((x, y), color, /) -> None\nset the color value for a single pixel" -#define DOC_SURFACE_GETATMAPPED "get_at_mapped((x, y), /) -> Color\nget the mapped color value at a single pixel" -#define DOC_SURFACE_GETPALETTE "get_palette() -> [Color, Color, Color, ...]\nget the color index palette for an 8-bit Surface" -#define DOC_SURFACE_GETPALETTEAT "get_palette_at(index, /) -> Color\nget the color for a single entry in a palette" -#define DOC_SURFACE_SETPALETTE "set_palette([color, color, color, ...], /) -> None\nset the color palette for an 8-bit Surface" -#define DOC_SURFACE_SETPALETTEAT "set_palette_at(index, color, /) -> None\nset the color for a single index in an 8-bit Surface palette" -#define DOC_SURFACE_MAPRGB "map_rgb(color, /) -> mapped_int\nconvert a color into a mapped color value" -#define DOC_SURFACE_UNMAPRGB "unmap_rgb(mapped_int, /) -> Color\nconvert a mapped integer color value into a Color" -#define DOC_SURFACE_SETCLIP "set_clip(rect, /) -> None\nset_clip(None) -> None\nset the current clipping area of the Surface" -#define DOC_SURFACE_GETCLIP "get_clip() -> Rect\nget the current clipping area of the Surface" -#define DOC_SURFACE_SUBSURFACE "subsurface(rect, /) -> Surface\ncreate a new surface that references its parent" -#define DOC_SURFACE_GETPARENT "get_parent() -> Surface\nfind the parent of a subsurface" -#define DOC_SURFACE_GETABSPARENT "get_abs_parent() -> Surface\nfind the top level parent of a subsurface" -#define DOC_SURFACE_GETOFFSET "get_offset() -> (x, y)\nfind the position of a child subsurface inside a parent" -#define DOC_SURFACE_GETABSOFFSET "get_abs_offset() -> (x, y)\nfind the absolute position of a child subsurface inside its top level parent" -#define DOC_SURFACE_GETSIZE "get_size() -> (width, height)\nget the dimensions of the Surface" -#define DOC_SURFACE_GETWIDTH "get_width() -> width\nget the width of the Surface" -#define DOC_SURFACE_GETHEIGHT "get_height() -> height\nget the height of the Surface" -#define DOC_SURFACE_GETRECT "get_rect(**kwargs) -> Rect\nget the rectangular area of the Surface" -#define DOC_SURFACE_GETFRECT "get_frect(**kwargs) -> FRect\nget the rectangular area of the Surface" -#define DOC_SURFACE_GETBITSIZE "get_bitsize() -> int\nget the bit depth of the Surface pixel format" -#define DOC_SURFACE_GETBYTESIZE "get_bytesize() -> int\nget the bytes used per Surface pixel" -#define DOC_SURFACE_GETFLAGS "get_flags() -> int\nget the additional flags used for the Surface" -#define DOC_SURFACE_GETPITCH "get_pitch() -> int\nget the number of bytes used per Surface row" -#define DOC_SURFACE_GETMASKS "get_masks() -> (R, G, B, A)\nthe bitmasks needed to convert between a color and a mapped integer" -#define DOC_SURFACE_SETMASKS "set_masks((r, g, b, a), /) -> None\nset the bitmasks needed to convert between a color and a mapped integer" -#define DOC_SURFACE_GETSHIFTS "get_shifts() -> (R, G, B, A)\nthe bit shifts needed to convert between a color and a mapped integer" -#define DOC_SURFACE_SETSHIFTS "set_shifts((r, g, b, a), /) -> None\nsets the bit shifts needed to convert between a color and a mapped integer" -#define DOC_SURFACE_GETLOSSES "get_losses() -> (R, G, B, A)\nthe significant bits used to convert between a color and a mapped integer" -#define DOC_SURFACE_GETBOUNDINGRECT "get_bounding_rect(min_alpha = 1) -> Rect\nfind the smallest rect containing data" -#define DOC_SURFACE_GETVIEW "get_view(kind='2', /) -> BufferProxy\nreturn a buffer view of the Surface's pixels." -#define DOC_SURFACE_GETBUFFER "get_buffer() -> BufferProxy\nacquires a buffer object for the pixels of the Surface." -#define DOC_SURFACE_PIXELSADDRESS "_pixels_address -> int\npixel buffer address" -#define DOC_SURFACE_PREMULALPHA "premul_alpha() -> Surface\nreturns a copy of the surface with the RGB channels pre-multiplied by the alpha channel." -#define DOC_SURFACE_PREMULALPHAIP "premul_alpha_ip() -> Surface\nmultiplies the RGB channels by the surface alpha channel." -#define DOC_SURFACE_WIDTH "width -> int\nSurface width in pixels (read-only)" -#define DOC_SURFACE_HEIGHT "height -> int\nSurface height in pixels (read-only)" -#define DOC_SURFACE_SIZE "height -> tuple[int, int]\nSurface size in pixels (read-only)" +#define DOC_SURFACE "Surface(size, flags=0, depth=0, masks=None) -> Surface\nSurface(size, flags=0, surface=...) -> Surface\nPygame object for representing images." +#define DOC_SURFACE_BLIT "blit(source, dest=(0, 0), area=None, special_flags=0) -> Rect\nDraw another surface onto this one." +#define DOC_SURFACE_BLITS "blits(blit_sequence, doreturn=1) -> Union[list[Rect], None]\nDraw many surfaces onto this surface at their corresponding location." +#define DOC_SURFACE_FBLITS "fblits(blit_sequence, special_flags=0, /) -> None\nDraw many surfaces onto this surface at their corresponding location and with the same special_flags." +#define DOC_SURFACE_CONVERT "convert(surface, /) -> Surface\nconvert(depth, flags=0, /) -> Surface\nconvert(masks, flags=0, /) -> Surface\nconvert() -> Surface\nChange the pixel format of a surface." +#define DOC_SURFACE_CONVERTALPHA "convert_alpha() -> Surface\nChange the pixel format of a surface including per pixel alphas." +#define DOC_SURFACE_COPY "copy() -> Surface\nCreate a new copy of a Surface." +#define DOC_SURFACE_FILL "fill(color, rect=None, special_flags=0) -> Rect\nFill Surface with a solid color." +#define DOC_SURFACE_SCROLL "scroll(dx=0, dy=0, scroll_flag=0, /) -> None\nShift the Surface pixels in place." +#define DOC_SURFACE_SETCOLORKEY "set_colorkey(color, flags=0, /) -> None\nset_colorkey(color, /) -> None\nSet the transparent colorkey." +#define DOC_SURFACE_GETCOLORKEY "get_colorkey() -> Optional[tuple[int, int, int, int]]\nGet the current transparent colorkey." +#define DOC_SURFACE_SETALPHA "set_alpha(value, flags=0, /) -> None\nset_alpha(value, /) -> None\nSet the alpha value for the full Surface." +#define DOC_SURFACE_GETALPHA "get_alpha() -> Optional[int]\nGet the current Surface transparency value." +#define DOC_SURFACE_LOCK "lock() -> None\nLock the Surface memory for pixel access." +#define DOC_SURFACE_UNLOCK "unlock() -> None\nUnlock the Surface memory from pixel access." +#define DOC_SURFACE_MUSTLOCK "mustlock() -> bool\nTest if the Surface requires locking." +#define DOC_SURFACE_GETLOCKED "get_locked() -> bool\nTest if the Surface is current locked." +#define DOC_SURFACE_GETLOCKS "get_locks() -> tuple[Any, Ellipsis]\nGets the locks for the Surface." +#define DOC_SURFACE_GETAT "get_at(x_y, /) -> Color\nGet the color value at a single pixel." +#define DOC_SURFACE_SETAT "set_at(x_y, color, /) -> None\nSet the color value for a single pixel." +#define DOC_SURFACE_GETATMAPPED "get_at_mapped(x_y, /) -> int\nGet the mapped color value at a single pixel." +#define DOC_SURFACE_GETPALETTE "get_palette() -> list[Color]\nGet the color index palette for an 8-bit Surface." +#define DOC_SURFACE_GETPALETTEAT "get_palette_at(index, /) -> Color\nGet the color for a single entry in a palette." +#define DOC_SURFACE_SETPALETTE "set_palette(palette, /) -> None\nSet the color palette for an 8-bit Surface." +#define DOC_SURFACE_SETPALETTEAT "set_palette_at(index, color, /) -> None\nSet the color for a single index in an 8-bit Surface palette." +#define DOC_SURFACE_MAPRGB "map_rgb(color, /) -> int\nConvert a color into a mapped color value." +#define DOC_SURFACE_UNMAPRGB "unmap_rgb(mapped_int, /) -> Color\nConvert a mapped integer color value into a Color." +#define DOC_SURFACE_SETCLIP "set_clip(rect, /) -> None\nSet the current clipping area of the Surface." +#define DOC_SURFACE_GETCLIP "get_clip() -> Rect\nGet the current clipping area of the Surface." +#define DOC_SURFACE_SUBSURFACE "subsurface(rect, /) -> Surface\nsubsurface(left_top, width_height, /) -> Surface\nsubsurface(left, top, width, height, /) -> Surface\nCreate a new surface that references its parent." +#define DOC_SURFACE_GETPARENT "get_parent() -> Surface\nFind the parent of a subsurface." +#define DOC_SURFACE_GETABSPARENT "get_abs_parent() -> Surface\nFind the top level parent of a subsurface." +#define DOC_SURFACE_GETOFFSET "get_offset() -> tuple[int, int]\nFind the position of a child subsurface inside a parent." +#define DOC_SURFACE_GETABSOFFSET "get_abs_offset() -> tuple[int, int]\nFind the absolute position of a child subsurface inside its top level parent." +#define DOC_SURFACE_GETSIZE "get_size() -> tuple[int, int]\nGet the dimensions of the Surface." +#define DOC_SURFACE_GETWIDTH "get_width() -> int\nGet the width of the Surface." +#define DOC_SURFACE_GETHEIGHT "get_height() -> int\nGet the height of the Surface." +#define DOC_SURFACE_GETRECT "get_rect(**kwargs) -> Rect\nGet the rectangular area of the Surface." +#define DOC_SURFACE_GETFRECT "get_frect(**kwargs) -> FRect\nGet the rectangular area of the Surface." +#define DOC_SURFACE_GETBITSIZE "get_bitsize() -> int\nGet the bit depth of the Surface pixel format." +#define DOC_SURFACE_GETBYTESIZE "get_bytesize() -> int\nGet the bytes used per Surface pixel." +#define DOC_SURFACE_GETFLAGS "get_flags() -> int\nGet the additional flags used for the Surface." +#define DOC_SURFACE_GETPITCH "get_pitch() -> int\nGet the number of bytes used per Surface row." +#define DOC_SURFACE_GETMASKS "get_masks() -> tuple[int, int, int, int]\nThe bitmasks needed to convert between a color and a mapped integer." +#define DOC_SURFACE_SETMASKS "set_masks(color, /) -> None\nSet the bitmasks needed to convert between a color and a mapped integer." +#define DOC_SURFACE_GETSHIFTS "get_shifts() -> tuple[int, int, int, int]\nThe bit shifts needed to convert between a color and a mapped integer." +#define DOC_SURFACE_SETSHIFTS "set_shifts(color, /) -> None\nSets the bit shifts needed to convert between a color and a mapped integer." +#define DOC_SURFACE_GETLOSSES "get_losses() -> tuple[int, int, int, int]\nThe significant bits used to convert between a color and a mapped integer." +#define DOC_SURFACE_GETBOUNDINGRECT "get_bounding_rect(min_alpha=1) -> Rect\nFind the smallest rect containing data." +#define DOC_SURFACE_GETVIEW "get_view(kind='2', /) -> BufferProxy\nReturn a buffer view of the Surface's pixels." +#define DOC_SURFACE_GETBUFFER "get_buffer() -> BufferProxy\nAcquires a buffer object for the pixels of the Surface." +#define DOC_SURFACE_PREMULALPHA "premul_alpha() -> Surface\nReturns a copy of the surface with the RGB channels pre-multiplied by the alpha channel." +#define DOC_SURFACE_PREMULALPHAIP "premul_alpha_ip() -> Surface\nMultiplies the RGB channels by the surface alpha channel." +#define DOC_SURFACE_WIDTH "width -> int\nSurface width in pixels (read-only)." +#define DOC_SURFACE_HEIGHT "height -> int\nSurface height in pixels (read-only)." +#define DOC_SURFACE_SIZE "size -> tuple[int, int]\nSurface size in pixels (read-only)." From 31d29e314261514036dcb464141ba87fa069671c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 06:30:21 +0000 Subject: [PATCH 127/441] Bump pypa/cibuildwheel from 2.23.0 to 2.23.1 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 2.23.0 to 2.23.1. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/v2.23.1/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v2.23.0...v2.23.1) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 1b46f3ee92..a849c42612 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -137,7 +137,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.0 + uses: pypa/cibuildwheel@v2.23.1 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 700008a24b..bb99e6f881 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -93,7 +93,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v2.23.0 + uses: pypa/cibuildwheel@v2.23.1 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 567fe4c886..32d9d1b9ce 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -62,7 +62,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.0 + uses: pypa/cibuildwheel@v2.23.1 - uses: actions/upload-artifact@v4 with: From cc958db5a4810317f0f87e926c6400543e1dea3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 06:30:25 +0000 Subject: [PATCH 128/441] Bump docker/login-action from 3.3.0 to 3.4.0 Bumps [docker/login-action](https://github.com/docker/login-action) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/9780b0c442fbb1117ed29e0efdff1e18412f7567...74a5d142397b4f367a81961eba4e8cd7edddf772) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 700008a24b..a6786bb3e1 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -55,7 +55,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Log in to the Container registry - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 with: registry: ghcr.io username: ${{ github.actor }} From 499d09ff1e88380a59a173cb94192d0c5cbb0690 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 17 Mar 2025 14:10:53 +0530 Subject: [PATCH 129/441] Bump manylinux docker images --- buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-i686 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 index a1bf727ac2..0513259466 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_aarch64:2025.02.23-1 +FROM quay.io/pypa/manylinux2014_aarch64:2025.03.09-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 index 83f2d3b413..46ca8263c0 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_i686:2025.02.23-1 +FROM quay.io/pypa/manylinux2014_i686:2025.03.09-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 index 251769a445..8ddf38eee5 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_x86_64:2025.02.23-1 +FROM quay.io/pypa/manylinux2014_x86_64:2025.03.09-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" From 62a49309ece217691306175c880b49c57a822087 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sun, 23 Mar 2025 17:46:42 +0200 Subject: [PATCH 130/441] Use `ruff` to also sort imports (#3237) * sort imports with ruff * sorted imports (that's a lot of modified files) * some more dev.py alling ig * reconfigure the hooks to be more concise * future-proofing? ruff lint config, sth like that * combine as imports for ruff isort * rerun import sorting after configuration update * Select only the I rule * Update pyproject.toml * add the missing import and rewrite the method as how it is typically written elsewhere (e.g., the CPython repository) * add spaces around [] for consistency * some more unformatted files * exclude python files in buildconfig only * format and sort imports for buildconfig/stubs/pygame * ignore .ruff_cache * ignore typing.pyi explicitly since it's supposed to be an exact copy of typing.py * ignore import sorting in stubs __init__.py only as it's auto-generated --------- Co-authored-by: Dan Lawrence --- .gitignore | 3 ++ .pre-commit-config.yaml | 3 ++ buildconfig/stubs/gen_stubs.py | 1 + buildconfig/stubs/pygame/__init__.pyi | 1 + buildconfig/stubs/pygame/_debug.pyi | 6 ++- buildconfig/stubs/pygame/_sdl2/controller.pyi | 2 +- buildconfig/stubs/pygame/_sdl2/touch.pyi | 2 +- buildconfig/stubs/pygame/_sdl2/video.pyi | 19 ++------ buildconfig/stubs/pygame/camera.pyi | 5 +- buildconfig/stubs/pygame/color.pyi | 2 +- buildconfig/stubs/pygame/cursors.pyi | 5 +- buildconfig/stubs/pygame/display.pyi | 10 ++-- buildconfig/stubs/pygame/draw.pyi | 4 +- buildconfig/stubs/pygame/event.pyi | 2 +- buildconfig/stubs/pygame/font.pyi | 3 +- buildconfig/stubs/pygame/freetype.pyi | 3 +- buildconfig/stubs/pygame/geometry.pyi | 4 +- buildconfig/stubs/pygame/gfxdraw.pyi | 16 ++++--- buildconfig/stubs/pygame/image.pyi | 3 +- buildconfig/stubs/pygame/joystick.pyi | 2 +- buildconfig/stubs/pygame/mask.pyi | 3 +- buildconfig/stubs/pygame/math.pyi | 42 ++++++++--------- buildconfig/stubs/pygame/midi.pyi | 4 +- buildconfig/stubs/pygame/mixer.pyi | 6 +-- buildconfig/stubs/pygame/mouse.pyi | 13 +++-- buildconfig/stubs/pygame/pixelarray.pyi | 2 +- buildconfig/stubs/pygame/pixelcopy.pyi | 1 - buildconfig/stubs/pygame/rect.pyi | 47 ++++++++++++------- buildconfig/stubs/pygame/scrap.pyi | 5 +- buildconfig/stubs/pygame/sndarray.pyi | 4 +- buildconfig/stubs/pygame/sprite.pyi | 21 +++++---- buildconfig/stubs/pygame/surface.pyi | 10 ++-- buildconfig/stubs/pygame/surfarray.pyi | 6 +-- buildconfig/stubs/pygame/time.pyi | 1 - buildconfig/stubs/pygame/transform.pyi | 7 ++- buildconfig/stubs/pygame/typing.pyi | 5 +- buildconfig/stubs/pygame/window.pyi | 4 +- dev.py | 2 +- docs/__init__.py | 1 - docs/serve.py | 2 +- examples/aliens.py | 2 +- examples/audiocapture.py | 8 ++-- examples/blend_fill.py | 1 + examples/blit_blends.py | 5 +- examples/chimp.py | 1 + examples/cursors.py | 2 +- examples/font_viewer.py | 2 +- examples/freetype_misc.py | 1 + examples/glcube.py | 4 +- examples/go_over_there.py | 3 +- examples/headless_no_windows_needed.py | 1 + examples/liquid.py | 3 +- examples/midi.py | 2 +- examples/moveit.py | 1 + examples/multiplayer_joystick.py | 1 + examples/music_drop_fade.py | 3 +- examples/ninepatch.py | 1 + examples/pixelarray.py | 2 +- examples/prevent_display_stretching.py | 3 +- examples/retro_scaling.py | 1 + examples/scaletest.py | 3 +- examples/scroll.py | 2 +- examples/setmodescale.py | 3 +- examples/sound.py | 1 + examples/sound_array_demos.py | 4 +- examples/sprite_texture.py | 6 +-- examples/testsprite.py | 4 +- examples/textinput.py | 10 ++-- examples/vgrade.py | 1 + examples/video.py | 4 +- pyproject.toml | 9 +++- src_py/_camera_opencv.py | 4 +- src_py/_debug.py | 18 +++---- src_py/_sdl2/__init__.py | 2 +- src_py/_sprite.py | 16 +++---- src_py/freetype.py | 14 +++--- src_py/ftfont.py | 17 ++++--- src_py/locals.py | 2 +- src_py/macosx.py | 2 +- src_py/midi.py | 3 +- src_py/pkgdata.py | 2 +- src_py/sndarray.py | 5 +- src_py/sprite.py | 8 ++-- src_py/surfarray.py | 19 ++++---- src_py/sysfont.py | 9 ++-- src_py/typing.py | 5 +- src_py/version.py | 2 +- test/base_test.py | 13 ++--- test/bufferproxy_test.py | 11 ++--- test/color_test.py | 6 ++- test/constants_test.py | 2 +- test/controller_test.py | 1 + test/cursors_test.py | 3 +- test/debug_test.py | 3 +- test/display_test.py | 9 ++-- test/docs_test.py | 2 +- test/draw_test.py | 5 +- test/font_test.py | 6 +-- test/freetype_test.py | 9 ++-- test/ftfont_test.py | 6 +-- test/geometry_test.py | 2 +- test/gfxdraw_test.py | 1 + test/image__save_gl_surface_test.py | 2 +- test/image_test.py | 8 ++-- test/imageext_test.py | 5 +- test/joystick_test.py | 4 +- test/key_test.py | 2 +- test/mask_test.py | 5 +- test/midi_test.py | 5 +- test/mixer_music_test.py | 8 ++-- test/mixer_test.py | 21 ++++----- test/mouse_test.py | 4 +- test/pixelarray_test.py | 1 - test/pixelcopy_test.py | 12 ++--- test/rect_test.py | 2 +- test/rwobject_test.py | 2 +- test/scrap_test.py | 6 +-- test/sndarray_test.py | 3 +- test/sprite_test.py | 3 +- test/surface_test.py | 17 +++---- test/surfarray_test.py | 22 ++++----- test/surflock_test.py | 4 +- test/sysfont_test.py | 2 +- test/system_test.py | 2 +- test/test_utils/__init__.py | 3 +- test/test_utils/arrinter.py | 4 +- test/test_utils/async_sub.py | 12 ++--- test/test_utils/buftools.py | 37 +++++++-------- test/test_utils/png.py | 10 ++-- test/test_utils/run_tests.py | 18 +++---- test/test_utils/test_runner.py | 4 +- test/time_test.py | 3 +- test/touch_test.py | 7 ++- test/transform_test.py | 7 ++- test/version_test.py | 1 - test/video_test.py | 5 +- test/window_test.py | 4 +- 137 files changed, 422 insertions(+), 416 deletions(-) diff --git a/.gitignore b/.gitignore index 67c03d4c6c..8336497a84 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,9 @@ # mypy .mypy_cache/ +# Ruff +.ruff_cache + # Other envdev* .virtualenv* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dba4697836..e47cd77211 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,6 +28,9 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.4.2 hooks: # See pyproject.toml for configuration options. + - id: ruff + name: ruff-sort-imports + args: [ --select, I, --fix ] - id: ruff-format # Run the formatter types_or: [ python, pyi, jupyter ] diff --git a/buildconfig/stubs/gen_stubs.py b/buildconfig/stubs/gen_stubs.py index 7b2c60d4c7..f78d5e9f11 100644 --- a/buildconfig/stubs/gen_stubs.py +++ b/buildconfig/stubs/gen_stubs.py @@ -128,6 +128,7 @@ def get_all(mod: Any): # write the module docstring of this file in the generated file, so that # people know this file exists f.write(info_header) + f.write("# ruff: noqa: I001\n") f.write(misc_stubs) for mod, items in pygame_all_imports.items(): diff --git a/buildconfig/stubs/pygame/__init__.pyi b/buildconfig/stubs/pygame/__init__.pyi index 16ed10de2a..8611d810da 100644 --- a/buildconfig/stubs/pygame/__init__.pyi +++ b/buildconfig/stubs/pygame/__init__.pyi @@ -1,6 +1,7 @@ # buildconfig/stubs/gen_stubs.py # A script to auto-generate locals.pyi, constants.pyi and __init__.pyi typestubs # IMPORTANT NOTE: Do not edit this file by hand! +# ruff: noqa: I001 from . import ( display as display, diff --git a/buildconfig/stubs/pygame/_debug.pyi b/buildconfig/stubs/pygame/_debug.pyi index a7c8cb1994..6707acb2c8 100644 --- a/buildconfig/stubs/pygame/_debug.pyi +++ b/buildconfig/stubs/pygame/_debug.pyi @@ -1,8 +1,10 @@ from collections.abc import Callable -from typing import Union, Optional +from typing import Optional, Union ImportResult = tuple[str, bool, Optional[Callable]] def str_from_tuple(version_tuple: Union[tuple[int, int, int], None]) -> str: ... -def attempt_import(module: str, function_name: str, output_str: str = "") -> ImportResult: ... +def attempt_import( + module: str, function_name: str, output_str: str = "" +) -> ImportResult: ... def print_debug_info(filename: Optional[str] = None) -> None: ... diff --git a/buildconfig/stubs/pygame/_sdl2/controller.pyi b/buildconfig/stubs/pygame/_sdl2/controller.pyi index cb67ed2d24..c6fbca29d3 100644 --- a/buildconfig/stubs/pygame/_sdl2/controller.pyi +++ b/buildconfig/stubs/pygame/_sdl2/controller.pyi @@ -1,4 +1,5 @@ from typing import final + from pygame.joystick import JoystickType def init() -> None: ... @@ -6,7 +7,6 @@ def get_init() -> bool: ... def quit() -> None: ... def is_controller(device_index: int) -> bool: ... def get_count() -> int: ... - @final class Controller: def __new__(cls, device_index: int) -> Controller: ... diff --git a/buildconfig/stubs/pygame/_sdl2/touch.pyi b/buildconfig/stubs/pygame/_sdl2/touch.pyi index a76bb12c16..b91c964bab 100644 --- a/buildconfig/stubs/pygame/_sdl2/touch.pyi +++ b/buildconfig/stubs/pygame/_sdl2/touch.pyi @@ -1,4 +1,4 @@ -from typing import TypedDict, Optional +from typing import Optional, TypedDict class _FingerDict(TypedDict): id: int diff --git a/buildconfig/stubs/pygame/_sdl2/video.pyi b/buildconfig/stubs/pygame/_sdl2/video.pyi index cbae2e3f8c..e9ce224759 100644 --- a/buildconfig/stubs/pygame/_sdl2/video.pyi +++ b/buildconfig/stubs/pygame/_sdl2/video.pyi @@ -4,10 +4,9 @@ from typing import Any, Optional, Union from pygame.color import Color from pygame.rect import Rect from pygame.surface import Surface +from pygame.typing import ColorLike, Point, RectLike from pygame.window import Window as Window -from pygame.typing import ColorLike, RectLike, Point - WINDOWPOS_UNDEFINED: int WINDOWPOS_CENTERED: int @@ -160,18 +159,10 @@ class Renderer: def draw_point(self, point: Point) -> None: ... def draw_rect(self, rect: RectLike) -> None: ... def fill_rect(self, rect: RectLike) -> None: ... - def draw_triangle( - self, p1: Point, p2: Point, p3: Point - ) -> None: ... - def fill_triangle( - self, p1: Point, p2: Point, p3: Point - ) -> None: ... - def draw_quad( - self, p1: Point, p2: Point, p3: Point, p4: Point - ) -> None: ... - def fill_quad( - self, p1: Point, p2: Point, p3: Point, p4: Point - ) -> None: ... + def draw_triangle(self, p1: Point, p2: Point, p3: Point) -> None: ... + def fill_triangle(self, p1: Point, p2: Point, p3: Point) -> None: ... + def draw_quad(self, p1: Point, p2: Point, p3: Point, p4: Point) -> None: ... + def fill_quad(self, p1: Point, p2: Point, p3: Point, p4: Point) -> None: ... def to_surface( self, surface: Optional[Surface] = None, area: Optional[RectLike] = None ) -> Surface: ... diff --git a/buildconfig/stubs/pygame/camera.pyi b/buildconfig/stubs/pygame/camera.pyi index 2609bd640f..713fda223e 100644 --- a/buildconfig/stubs/pygame/camera.pyi +++ b/buildconfig/stubs/pygame/camera.pyi @@ -1,9 +1,8 @@ from abc import ABC, abstractmethod -from typing import Optional, Union, Literal - -from pygame.typing import IntPoint +from typing import Literal, Optional, Union from pygame.surface import Surface +from pygame.typing import IntPoint def get_backends() -> list[str]: ... def init(backend: Optional[str] = None) -> None: ... diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 1c69ab6083..127c3225f7 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -1,8 +1,8 @@ from collections.abc import Collection, Iterator from typing import Any, ClassVar, SupportsIndex, Union, overload -from typing_extensions import deprecated # added in 3.13 from pygame.typing import ColorLike +from typing_extensions import deprecated # added in 3.13 THECOLORS: dict[str, tuple[int, int, int, int]] diff --git a/buildconfig/stubs/pygame/cursors.pyi b/buildconfig/stubs/pygame/cursors.pyi index ae22d0dcb8..d6005b9778 100644 --- a/buildconfig/stubs/pygame/cursors.pyi +++ b/buildconfig/stubs/pygame/cursors.pyi @@ -2,7 +2,6 @@ from collections.abc import Iterator from typing import Any, Literal, Union, overload from pygame.surface import Surface - from pygame.typing import FileLike, IntPoint, SequenceLike _Small_string = tuple[ @@ -80,9 +79,7 @@ class Cursor: def __len__(self) -> int: ... def __copy__(self) -> Cursor: ... def __hash__(self) -> int: ... - def __getitem__( - self, index: int - ) -> Union[int, IntPoint, Surface]: ... + def __getitem__(self, index: int) -> Union[int, IntPoint, Surface]: ... def copy(self) -> Cursor: ... type: Literal["system", "color", "bitmap"] data: Union[ diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index c67a26c59b..b148536e50 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -52,21 +52,19 @@ required). """ from collections.abc import Iterable -from typing import Optional, Union, overload, Literal -from typing_extensions import deprecated # added in 3.13 +from typing import Literal, Optional, Union, overload +from pygame._sdl2 import Window from pygame.constants import FULLSCREEN from pygame.surface import Surface - -from pygame._sdl2 import Window - from pygame.typing import ( ColorLike, - Point, IntPoint, + Point, RectLike, SequenceLike, ) +from typing_extensions import deprecated # added in 3.13 class _VidInfo: @property diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 68ad3ace5b..15f79ed350 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -1,7 +1,7 @@ -from pygame.rect import Rect -from pygame.surface import Surface from typing import overload +from pygame.rect import Rect +from pygame.surface import Surface from pygame.typing import ColorLike, Point, RectLike, SequenceLike def rect( diff --git a/buildconfig/stubs/pygame/event.pyi b/buildconfig/stubs/pygame/event.pyi index cc721c1b91..4c0674731b 100644 --- a/buildconfig/stubs/pygame/event.pyi +++ b/buildconfig/stubs/pygame/event.pyi @@ -1,7 +1,7 @@ from typing import Any, ClassVar, Optional, Union, final -from typing_extensions import deprecated # added in 3.13 from pygame.typing import SequenceLike +from typing_extensions import deprecated # added in 3.13 class _GenericEvent: # Just exists to avoid duplication of data for Event diff --git a/buildconfig/stubs/pygame/font.pyi b/buildconfig/stubs/pygame/font.pyi index efc72f0ae4..36c1ea5ee2 100644 --- a/buildconfig/stubs/pygame/font.pyi +++ b/buildconfig/stubs/pygame/font.pyi @@ -1,10 +1,9 @@ from collections.abc import Callable, Hashable, Iterable from typing import Literal, Optional, Union -from typing_extensions import deprecated # added in 3.13 from pygame.surface import Surface - from pygame.typing import ColorLike, FileLike +from typing_extensions import deprecated # added in 3.13 # TODO: Figure out a way to type this attribute such that mypy knows it's not # always defined at runtime diff --git a/buildconfig/stubs/pygame/freetype.pyi b/buildconfig/stubs/pygame/freetype.pyi index 9a64a5c4b8..cd36088e9a 100644 --- a/buildconfig/stubs/pygame/freetype.pyi +++ b/buildconfig/stubs/pygame/freetype.pyi @@ -1,12 +1,11 @@ from collections.abc import Callable, Iterable from typing import Any, Optional, Union -from typing_extensions import deprecated # added in 3.13 from pygame.color import Color from pygame.rect import Rect from pygame.surface import Surface - from pygame.typing import ColorLike, FileLike, RectLike +from typing_extensions import deprecated # added in 3.13 def get_error() -> str: ... def get_version(linked: bool = True) -> tuple[int, int, int]: ... diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 8821f15e35..43724816ec 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -1,7 +1,7 @@ from collections.abc import Callable -from typing import overload, Union, Protocol +from typing import Protocol, Union, overload -from pygame import Rect, FRect +from pygame import FRect, Rect from pygame.typing import Point, RectLike, SequenceLike class _HasCircleAttribute(Protocol): diff --git a/buildconfig/stubs/pygame/gfxdraw.pyi b/buildconfig/stubs/pygame/gfxdraw.pyi index e274c738ae..7434b4b6dc 100644 --- a/buildconfig/stubs/pygame/gfxdraw.pyi +++ b/buildconfig/stubs/pygame/gfxdraw.pyi @@ -1,5 +1,4 @@ from pygame.surface import Surface - from pygame.typing import ColorLike, Point, RectLike, SequenceLike def pixel(surface: Surface, x: int, y: int, color: ColorLike, /) -> None: ... @@ -31,7 +30,8 @@ def arc( r: int, start_angle: int, atp_angle: int, - color: ColorLike, / + color: ColorLike, + /, ) -> None: ... def pie( surface: Surface, @@ -40,7 +40,8 @@ def pie( r: int, start_angle: int, atp_angle: int, - color: ColorLike, / + color: ColorLike, + /, ) -> None: ... def trigon( surface: Surface, @@ -50,7 +51,8 @@ def trigon( y2: int, x3: int, y3: int, - color: ColorLike, / + color: ColorLike, + /, ) -> None: ... def aatrigon( surface: Surface, @@ -60,7 +62,8 @@ def aatrigon( y2: int, x3: int, y3: int, - color: ColorLike, / + color: ColorLike, + /, ) -> None: ... def filled_trigon( surface: Surface, @@ -70,7 +73,8 @@ def filled_trigon( y2: int, x3: int, y3: int, - color: ColorLike, / + color: ColorLike, + /, ) -> None: ... def polygon( surface: Surface, points: SequenceLike[Point], color: ColorLike, / diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 3ec2809714..599ae07cb9 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -1,10 +1,9 @@ from typing import Literal, Optional, Union -from typing_extensions import deprecated # added in 3.13 from pygame.bufferproxy import BufferProxy from pygame.surface import Surface - from pygame.typing import FileLike, IntPoint, Point +from typing_extensions import deprecated # added in 3.13 _BufferLike = Union[BufferProxy, bytes, bytearray, memoryview] _from_buffer_format = Literal["P", "RGB", "BGR", "BGRA", "RGBX", "RGBA", "ARGB"] diff --git a/buildconfig/stubs/pygame/joystick.pyi b/buildconfig/stubs/pygame/joystick.pyi index 23a3ddb812..a04e212636 100644 --- a/buildconfig/stubs/pygame/joystick.pyi +++ b/buildconfig/stubs/pygame/joystick.pyi @@ -1,11 +1,11 @@ from typing import final + from typing_extensions import deprecated # added in 3.13 def init() -> None: ... def quit() -> None: ... def get_init() -> bool: ... def get_count() -> int: ... - @final class JoystickType: def __init__(self, id: int) -> None: ... diff --git a/buildconfig/stubs/pygame/mask.pyi b/buildconfig/stubs/pygame/mask.pyi index 0da8a2475f..3dd1b109f2 100644 --- a/buildconfig/stubs/pygame/mask.pyi +++ b/buildconfig/stubs/pygame/mask.pyi @@ -1,10 +1,9 @@ from typing import Any, Optional, Union -from typing_extensions import deprecated # added in 3.13 from pygame.rect import Rect from pygame.surface import Surface - from pygame.typing import ColorLike, Point, RectLike +from typing_extensions import deprecated # added in 3.13 def from_surface(surface: Surface, threshold: int = 127) -> Mask: ... def from_threshold( diff --git a/buildconfig/stubs/pygame/math.pyi b/buildconfig/stubs/pygame/math.pyi index 7e40450b0f..aed0449bc8 100644 --- a/buildconfig/stubs/pygame/math.pyi +++ b/buildconfig/stubs/pygame/math.pyi @@ -4,16 +4,16 @@ from typing import ( ClassVar, Generic, Literal, + Optional, SupportsIndex, TypeVar, Union, final, overload, - Optional ) -from typing_extensions import deprecated # added in 3.13 from pygame.typing import SequenceLike +from typing_extensions import deprecated # added in 3.13 def clamp(value: float, min: float, max: float, /) -> float: ... @@ -29,7 +29,9 @@ class _GenericVector(Collection[float]): @overload def __setitem__(self, key: int, value: float) -> None: ... @overload - def __setitem__(self, key: slice, value: Union[SequenceLike[float], _TVec]) -> None: ... + def __setitem__( + self, key: slice, value: Union[SequenceLike[float], _TVec] + ) -> None: ... @overload def __getitem__(self, i: SupportsIndex) -> float: ... @overload @@ -70,37 +72,31 @@ class _GenericVector(Collection[float]): def is_normalized(self) -> bool: ... def scale_to_length(self, value: float, /) -> None: ... def reflect(self: _TVec, other: Union[SequenceLike[float], _TVec], /) -> _TVec: ... - def reflect_ip(self: _TVec, other: Union[SequenceLike[float], _TVec], /) -> None: ... - def distance_to(self: _TVec, other: Union[SequenceLike[float], _TVec], /) -> float: ... + def reflect_ip( + self: _TVec, other: Union[SequenceLike[float], _TVec], / + ) -> None: ... + def distance_to( + self: _TVec, other: Union[SequenceLike[float], _TVec], / + ) -> float: ... def distance_squared_to( self: _TVec, other: Union[SequenceLike[float], _TVec], / ) -> float: ... def lerp( - self: _TVec, - other: Union[SequenceLike[float], _TVec], - value: float, / + self: _TVec, other: Union[SequenceLike[float], _TVec], value: float, / ) -> _TVec: ... def slerp( - self: _TVec, - other: Union[SequenceLike[float], _TVec], - value: float, / + self: _TVec, other: Union[SequenceLike[float], _TVec], value: float, / ) -> _TVec: ... def smoothstep( - self: _TVec, - other: Union[SequenceLike[float], _TVec], - value: float, / + self: _TVec, other: Union[SequenceLike[float], _TVec], value: float, / ) -> _TVec: ... def elementwise(self: _TVec) -> VectorElementwiseProxy[_TVec]: ... def angle_to(self: _TVec, other: Union[SequenceLike[float], _TVec], /) -> float: ... def move_towards( - self: _TVec, - target: Union[SequenceLike[float], _TVec], - max_distance: float, / + self: _TVec, target: Union[SequenceLike[float], _TVec], max_distance: float, / ) -> _TVec: ... def move_towards_ip( - self: _TVec, - target: Union[SequenceLike[float], _TVec], - max_distance: float, / + self: _TVec, target: Union[SequenceLike[float], _TVec], max_distance: float, / ) -> None: ... @overload def clamp_magnitude(self: _TVec, max_length: float, /) -> _TVec: ... @@ -331,12 +327,12 @@ class Vector3(_GenericVector): @overload def update(self, x: int, y: int, z: int) -> None: ... - def lerp(a: float, b: float, value: float, do_clamp: bool = True, /) -> float: ... def invlerp(a: float, b: float, value: float, /) -> float: ... -def remap(i_min: float, i_max: float, o_min: float, o_max: float, value: float, /) -> float: ... +def remap( + i_min: float, i_max: float, o_min: float, o_max: float, value: float, / +) -> float: ... def smoothstep(a: float, b: float, weight: float, /) -> float: ... - @deprecated("Functionality is removed") def enable_swizzling() -> None: ... @deprecated("Functionality is removed") diff --git a/buildconfig/stubs/pygame/midi.pyi b/buildconfig/stubs/pygame/midi.pyi index 7fac8ba892..b8da880a3b 100644 --- a/buildconfig/stubs/pygame/midi.pyi +++ b/buildconfig/stubs/pygame/midi.pyi @@ -46,6 +46,8 @@ class Output: def note_on(self, note: int, velocity: int, channel: int = 0) -> None: ... def set_instrument(self, instrument_id: int, channel: int = 0) -> None: ... def pitch_bend(self, value: int = 0, channel: int = 0) -> None: ... - def write(self, data: Iterable[SequenceLike[Union[SequenceLike[int], int]]]) -> None: ... + def write( + self, data: Iterable[SequenceLike[Union[SequenceLike[int], int]]] + ) -> None: ... def write_short(self, status: int, data1: int = 0, data2: int = 0) -> None: ... def write_sys_ex(self, when: int, msg: Union[list[int], str]) -> None: ... diff --git a/buildconfig/stubs/pygame/mixer.pyi b/buildconfig/stubs/pygame/mixer.pyi index 78c0d92c6c..445b3c77cf 100644 --- a/buildconfig/stubs/pygame/mixer.pyi +++ b/buildconfig/stubs/pygame/mixer.pyi @@ -1,12 +1,11 @@ from typing import Any, Optional, Union, overload -from typing_extensions import deprecated # added in 3.13 import numpy - from pygame.event import Event +from pygame.typing import FileLike +from typing_extensions import deprecated # added in 3.13 from . import mixer_music -from pygame.typing import FileLike # export mixer_music as mixer.music music = mixer_music @@ -74,7 +73,6 @@ class Sound: def get_length(self) -> float: ... def get_raw(self) -> bytes: ... - class Channel: def __init__(self, id: int) -> None: ... @property diff --git a/buildconfig/stubs/pygame/mouse.pyi b/buildconfig/stubs/pygame/mouse.pyi index 805862812d..d383b9ff01 100644 --- a/buildconfig/stubs/pygame/mouse.pyi +++ b/buildconfig/stubs/pygame/mouse.pyi @@ -1,19 +1,18 @@ from typing import Literal, overload -from typing_extensions import deprecated # added in 3.13 from pygame.cursors import Cursor from pygame.surface import Surface - -from pygame.typing import Point, SequenceLike, IntPoint +from pygame.typing import IntPoint, Point, SequenceLike +from typing_extensions import deprecated # added in 3.13 @overload def get_pressed( - num_buttons: Literal[3] = 3, - desktop: bool = False) -> tuple[bool, bool, bool]: ... + num_buttons: Literal[3] = 3, desktop: bool = False +) -> tuple[bool, bool, bool]: ... @overload def get_pressed( - num_buttons: Literal[5], - desktop: bool = False) -> tuple[bool, bool, bool, bool, bool]: ... + num_buttons: Literal[5], desktop: bool = False +) -> tuple[bool, bool, bool, bool, bool]: ... def get_just_pressed() -> tuple[bool, bool, bool, bool, bool]: ... def get_just_released() -> tuple[bool, bool, bool, bool, bool]: ... def get_pos(desktop: bool = False) -> tuple[int, int]: ... diff --git a/buildconfig/stubs/pygame/pixelarray.pyi b/buildconfig/stubs/pygame/pixelarray.pyi index b0067e8935..5df752c495 100644 --- a/buildconfig/stubs/pygame/pixelarray.pyi +++ b/buildconfig/stubs/pygame/pixelarray.pyi @@ -1,8 +1,8 @@ import sys from typing import Any, Union, overload -from pygame.surface import Surface from pygame.color import Color +from pygame.surface import Surface from pygame.typing import SequenceLike # 'ellipsis' existed in typeshed pre 3.10, now we use EllipsisType which is diff --git a/buildconfig/stubs/pygame/pixelcopy.pyi b/buildconfig/stubs/pygame/pixelcopy.pyi index 4c2f59ce7e..f28a208586 100644 --- a/buildconfig/stubs/pygame/pixelcopy.pyi +++ b/buildconfig/stubs/pygame/pixelcopy.pyi @@ -1,7 +1,6 @@ from typing import Literal import numpy - from pygame.surface import Surface _kind = Literal["P", "p", "R", "r", "G", "g", "B", "b", "A", "a", "C", "c"] diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index 70921fb11b..5dc6736ec0 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -3,15 +3,15 @@ from collections.abc import Callable, Collection, Iterator from typing import ( ClassVar, Literal, + Optional, SupportsIndex, TypeVar, Union, overload, - Optional, ) -from typing_extensions import deprecated # added in 3.13 from pygame.typing import Point, RectLike, SequenceLike +from typing_extensions import deprecated # added in 3.13 if sys.version_info >= (3, 11): from typing import Self @@ -30,7 +30,9 @@ _K = TypeVar("_K") _V = TypeVar("_V") _T = TypeVar("_T") -_RectTypeCompatible_co = TypeVar("_RectTypeCompatible_co", bound=RectLike, covariant=True) +_RectTypeCompatible_co = TypeVar( + "_RectTypeCompatible_co", bound=RectLike, covariant=True +) class _GenericRect(Collection[_N]): @property @@ -174,7 +176,9 @@ class _GenericRect(Collection[_N]): @overload def scale_by_ip(self, scale_by: Point) -> None: ... @overload - def update(self, left: float, top: float, width: float, height: float, /) -> None: ... + def update( + self, left: float, top: float, width: float, height: float, / + ) -> None: ... @overload def update(self, left_top: Point, width_height: Point, /) -> None: ... @overload @@ -184,7 +188,9 @@ class _GenericRect(Collection[_N]): @overload def clamp(self, left_top: Point, width_height: Point, /) -> Self: ... @overload - def clamp(self, left: float, top: float, width: float, height: float, /) -> Self: ... + def clamp( + self, left: float, top: float, width: float, height: float, / + ) -> Self: ... @overload def clamp_ip(self, rect: RectLike, /) -> None: ... @overload @@ -216,7 +222,9 @@ class _GenericRect(Collection[_N]): @overload def union(self, left_top: Point, width_height: Point, /) -> Self: ... @overload - def union(self, left: float, top: float, width: float, height: float, /) -> Self: ... + def union( + self, left: float, top: float, width: float, height: float, / + ) -> Self: ... @overload def union_ip(self, rect: RectLike, /) -> None: ... @overload @@ -226,7 +234,9 @@ class _GenericRect(Collection[_N]): self, left: float, top: float, width: float, height: float, / ) -> None: ... def unionall(self, rect: SequenceLike[_RectTypeCompatible_co], /) -> Self: ... - def unionall_ip(self, rect_SequenceLike: SequenceLike[_RectTypeCompatible_co], /) -> None: ... + def unionall_ip( + self, rect_SequenceLike: SequenceLike[_RectTypeCompatible_co], / + ) -> None: ... @overload def fit(self, rect: RectLike, /) -> Self: ... @overload @@ -255,8 +265,12 @@ class _GenericRect(Collection[_N]): def colliderect( self, left: float, top: float, width: float, height: float, / ) -> bool: ... - def collidelist(self, rect_list: SequenceLike[_RectTypeCompatible_co], /) -> int: ... - def collidelistall(self, rect_list: SequenceLike[_RectTypeCompatible_co], /) -> list[int]: ... + def collidelist( + self, rect_list: SequenceLike[_RectTypeCompatible_co], / + ) -> int: ... + def collidelistall( + self, rect_list: SequenceLike[_RectTypeCompatible_co], / + ) -> list[int]: ... def collideobjectsall( self, objects: SequenceLike[_T], key: Optional[Callable[[_T], RectLike]] = None ) -> list[_T]: ... @@ -265,7 +279,9 @@ class _GenericRect(Collection[_N]): ) -> Optional[_T]: ... @overload def collidedict( - self, rect_dict: dict[_RectTypeCompatible_co, _V], values: Literal[False] = False + self, + rect_dict: dict[_RectTypeCompatible_co, _V], + values: Literal[False] = False, ) -> Optional[tuple[_RectTypeCompatible_co, _V]]: ... @overload def collidedict( @@ -273,7 +289,9 @@ class _GenericRect(Collection[_N]): ) -> Optional[tuple[_K, _RectTypeCompatible_co]]: ... @overload def collidedictall( - self, rect_dict: dict[_RectTypeCompatible_co, _V], values: Literal[False] = False + self, + rect_dict: dict[_RectTypeCompatible_co, _V], + values: Literal[False] = False, ) -> list[tuple[_RectTypeCompatible_co, _V]]: ... @overload def collidedictall( @@ -282,11 +300,8 @@ class _GenericRect(Collection[_N]): # Rect confirms to the Collection ABC, since it also confirms to # Sized, Iterable and Container ABCs -class Rect(_GenericRect[int]): - ... - -class FRect(_GenericRect[float]): - ... +class Rect(_GenericRect[int]): ... +class FRect(_GenericRect[float]): ... @deprecated("Use `Rect` instead (RectType is an old alias)") class RectType(Rect): ... diff --git a/buildconfig/stubs/pygame/scrap.pyi b/buildconfig/stubs/pygame/scrap.pyi index 54e8044bd2..88f72bd32e 100644 --- a/buildconfig/stubs/pygame/scrap.pyi +++ b/buildconfig/stubs/pygame/scrap.pyi @@ -1,6 +1,7 @@ -from typing import Optional -from typing_extensions import deprecated # added in 3.13 from collections.abc import ByteString +from typing import Optional + +from typing_extensions import deprecated # added in 3.13 @deprecated("since 2.2.0. Use the new API instead, which only requires display init") def init() -> None: ... diff --git a/buildconfig/stubs/pygame/sndarray.pyi b/buildconfig/stubs/pygame/sndarray.pyi index 27778c40e3..f87b8e5e9b 100644 --- a/buildconfig/stubs/pygame/sndarray.pyi +++ b/buildconfig/stubs/pygame/sndarray.pyi @@ -1,8 +1,6 @@ -from typing_extensions import deprecated # added in 3.13 - import numpy - from pygame.mixer import Sound +from typing_extensions import deprecated # added in 3.13 def array(sound: Sound) -> numpy.ndarray: ... def samples(sound: Sound) -> numpy.ndarray: ... diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index dc3ce78c53..d601363259 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -9,13 +9,12 @@ from typing import ( TypeVar, Union, ) -from typing_extensions import deprecated # added in 3.13 +from pygame.mask import Mask from pygame.rect import FRect, Rect from pygame.surface import Surface -from pygame.mask import Mask - -from pygame.typing import RectLike, Point +from pygame.typing import Point, RectLike +from typing_extensions import deprecated # added in 3.13 # non-generic Group, used in Sprite _Group = AbstractGroup[_SpriteSupportsGroup] @@ -182,10 +181,12 @@ class Group(AbstractGroup[_TSprite]): # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") class RenderPlain(Group): ... + @deprecated("Use `pygame.sprite.Group` instead") class RenderClear(Group): ... class RenderUpdates(Group[_TSprite]): ... + @deprecated("Use `pygame.sprite.RenderUpdates` instead") class OrderedUpdates(RenderUpdates[_TSprite]): ... @@ -197,7 +198,7 @@ class LayeredUpdates(AbstractGroup[_TSprite]): AbstractGroup[_TSprite], Iterable[Union[_TSprite, AbstractGroup[_TSprite]]], ], - **kwargs: Any + **kwargs: Any, ) -> None: ... def add( self, @@ -206,7 +207,7 @@ class LayeredUpdates(AbstractGroup[_TSprite]): AbstractGroup[_TSprite], Iterable[Union[_TSprite, AbstractGroup[_TSprite]]], ], - **kwargs: Any + **kwargs: Any, ) -> None: ... def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... def get_sprite(self, idx: int) -> _TSprite: ... @@ -235,10 +236,10 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite]): def set_timing_threshold( self, time_ms: SupportsFloat ) -> None: ... # This actually accept any value - @deprecated("since 2.1.1. Use `pygame.sprite.LayeredDirty.set_timing_threshold` instead") - def set_timing_treshold( - self, time_ms: SupportsFloat - ) -> None: ... + @deprecated( + "since 2.1.1. Use `pygame.sprite.LayeredDirty.set_timing_threshold` instead" + ) + def set_timing_treshold(self, time_ms: SupportsFloat) -> None: ... class GroupSingle(AbstractGroup[_TSprite]): sprite: _TSprite diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index c9273563be..b8f00805e3 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -1,17 +1,16 @@ from collections.abc import Iterable from typing import Any, Literal, Optional, Union, overload -from typing_extensions import deprecated # added in 3.13 from pygame.bufferproxy import BufferProxy from pygame.color import Color from pygame.rect import FRect, Rect - from pygame.typing import ( ColorLike, Point, RectLike, SequenceLike, ) +from typing_extensions import deprecated # added in 3.13 _ViewKind = Literal[ "0", @@ -88,7 +87,8 @@ class Surface: def fblits( self, blit_SequenceLike: Iterable[tuple[Surface, Union[Point, RectLike]]], - special_flags: int = 0, / + special_flags: int = 0, + /, ) -> None: ... @overload def convert(self, surface: Surface, /) -> Surface: ... @@ -105,9 +105,7 @@ class Surface: rect: Optional[RectLike] = None, special_flags: int = 0, ) -> Rect: ... - def scroll( - self, dx: int = 0, dy: int = 0, scroll_flag: int = 0, / - ) -> None: ... + def scroll(self, dx: int = 0, dy: int = 0, scroll_flag: int = 0, /) -> None: ... @overload def set_colorkey(self, color: ColorLike, flags: int = 0, /) -> None: ... @overload diff --git a/buildconfig/stubs/pygame/surfarray.pyi b/buildconfig/stubs/pygame/surfarray.pyi index bafe709376..fe11163af2 100644 --- a/buildconfig/stubs/pygame/surfarray.pyi +++ b/buildconfig/stubs/pygame/surfarray.pyi @@ -1,14 +1,12 @@ -from typing_extensions import deprecated # added in 3.13 - import numpy -from pygame.surface import Surface - # importing this way exports the functions in the typestubs from pygame.pixelcopy import ( array_to_surface as array_to_surface, surface_to_array as surface_to_array, ) +from pygame.surface import Surface +from typing_extensions import deprecated # added in 3.13 def array2d(surface: Surface) -> numpy.ndarray: ... def pixels2d(surface: Surface) -> numpy.ndarray: ... diff --git a/buildconfig/stubs/pygame/time.pyi b/buildconfig/stubs/pygame/time.pyi index 1b2c9ebc88..930bb5e899 100644 --- a/buildconfig/stubs/pygame/time.pyi +++ b/buildconfig/stubs/pygame/time.pyi @@ -73,7 +73,6 @@ def set_timer(event: Union[int, Event], millis: int, loops: int = 0) -> None: .. versionchangedold:: 2.0.1 event argument supports ``pygame.event.Event`` object .. versionaddedold:: 2.0.1 added loops argument to replace once argument """ - @final class Clock: """Create an object to help track time. diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index 384b41d3ac..a0cc4715e9 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -1,7 +1,6 @@ -from typing import Optional, Union, Literal +from typing import Literal, Optional, Union from pygame.surface import Surface - from pygame.typing import ColorLike, Point, RectLike, SequenceLike def flip(surface: Surface, flip_x: bool, flip_y: bool) -> Surface: ... @@ -62,13 +61,13 @@ def box_blur( surface: Surface, radius: int, repeat_edge_pixels: bool = True, - dest_surface: Optional[Surface] = None + dest_surface: Optional[Surface] = None, ) -> Surface: ... def gaussian_blur( surface: Surface, radius: int, repeat_edge_pixels: bool = True, - dest_surface: Optional[Surface] = None + dest_surface: Optional[Surface] = None, ) -> Surface: ... def hsl( surface: Surface, diff --git a/buildconfig/stubs/pygame/typing.pyi b/buildconfig/stubs/pygame/typing.pyi index 2897a338fe..b373ea1cbf 100644 --- a/buildconfig/stubs/pygame/typing.pyi +++ b/buildconfig/stubs/pygame/typing.pyi @@ -15,11 +15,10 @@ __all__ = [ from abc import abstractmethod from collections.abc import Callable from os import PathLike as _PathProtocol -from typing import IO, Union, TypeVar, Protocol +from typing import IO, Protocol, TypeVar, Union from pygame.color import Color -from pygame.rect import Rect, FRect - +from pygame.rect import FRect, Rect # For functions that take a file name _PathLike = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]] diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index 3dfe2411a6..f671a8ebb0 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -1,10 +1,10 @@ from typing import Optional, Union -from typing_extensions import deprecated # added in 3.13 -from pygame.typing import Point, RectLike from pygame.locals import WINDOWPOS_UNDEFINED from pygame.rect import Rect from pygame.surface import Surface +from pygame.typing import Point, RectLike +from typing_extensions import deprecated # added in 3.13 def get_grabbed_window() -> Optional[Window]: ... diff --git a/dev.py b/dev.py index d53bca86df..d334178c04 100644 --- a/dev.py +++ b/dev.py @@ -11,9 +11,9 @@ import re import subprocess import sys +from enum import Enum from pathlib import Path from typing import Any, Union -from enum import Enum MOD_NAME = "pygame-ce" DIST_DIR = "dist" diff --git a/docs/__init__.py b/docs/__init__.py index c08f91c075..fbe690cc59 100644 --- a/docs/__init__.py +++ b/docs/__init__.py @@ -2,7 +2,6 @@ from pathlib import Path - PKG_DIR = Path(__file__).absolute().parent / "generated" diff --git a/docs/serve.py b/docs/serve.py index 625b3c8709..e5afa91234 100644 --- a/docs/serve.py +++ b/docs/serve.py @@ -2,7 +2,7 @@ import sys import webbrowser -from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer # use relative import here and not absolute, so that `python -m docs` works at # development time diff --git a/examples/aliens.py b/examples/aliens.py index 5d1fc65e08..3bc80f1623 100644 --- a/examples/aliens.py +++ b/examples/aliens.py @@ -23,8 +23,8 @@ """ -import random import os +import random # import basic pygame modules import pygame diff --git a/examples/audiocapture.py b/examples/audiocapture.py index c4026516f9..f3453760d2 100644 --- a/examples/audiocapture.py +++ b/examples/audiocapture.py @@ -7,14 +7,14 @@ * play back the recorded sound """ -import pygame import time +import pygame from pygame._sdl2 import ( - get_audio_device_names, - AudioDevice, - AUDIO_F32, AUDIO_ALLOW_FORMAT_CHANGE, + AUDIO_F32, + AudioDevice, + get_audio_device_names, ) from pygame._sdl2.mixer import set_post_mix diff --git a/examples/blend_fill.py b/examples/blend_fill.py index a5be70d2a6..a2c9d31c1d 100644 --- a/examples/blend_fill.py +++ b/examples/blend_fill.py @@ -12,6 +12,7 @@ """ import os + import pygame from pygame import K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9 diff --git a/examples/blit_blends.py b/examples/blit_blends.py index 773a738e90..12da36b92c 100644 --- a/examples/blit_blends.py +++ b/examples/blit_blends.py @@ -21,15 +21,16 @@ """ import os -import pygame import time +import pygame + main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, "data") try: - import pygame.surfarray import numpy + import pygame.surfarray except ImportError: print("no surfarray for you! install numpy") diff --git a/examples/chimp.py b/examples/chimp.py index 354ca30cfc..b85d28e2d4 100644 --- a/examples/chimp.py +++ b/examples/chimp.py @@ -9,6 +9,7 @@ # Import Modules import os + import pygame if not pygame.font: diff --git a/examples/cursors.py b/examples/cursors.py index 785d58ea9f..fe6bdbfcf7 100644 --- a/examples/cursors.py +++ b/examples/cursors.py @@ -8,9 +8,9 @@ *How to make a simple button """ -import pygame import os +import pygame # Create a system cursor diff --git a/examples/font_viewer.py b/examples/font_viewer.py index 3acd24c034..dc544b0c46 100644 --- a/examples/font_viewer.py +++ b/examples/font_viewer.py @@ -23,8 +23,8 @@ * Press escape to exit """ -import sys import os +import sys import pygame diff --git a/examples/freetype_misc.py b/examples/freetype_misc.py index 9b20cb9357..e4041d6c5a 100644 --- a/examples/freetype_misc.py +++ b/examples/freetype_misc.py @@ -31,6 +31,7 @@ """ import os + import pygame import pygame.freetype as freetype diff --git a/examples/glcube.py b/examples/glcube.py index b875e5c105..892442a293 100644 --- a/examples/glcube.py +++ b/examples/glcube.py @@ -24,8 +24,8 @@ """ -import math import ctypes +import math import pygame @@ -37,7 +37,7 @@ raise SystemExit try: - from numpy import array, dot, eye, zeros, float32, uint32 + from numpy import array, dot, eye, float32, uint32, zeros except ImportError: print("numpy missing. The GLCUBE example requires: pyopengl numpy") raise SystemExit diff --git a/examples/go_over_there.py b/examples/go_over_there.py index 7284134190..56d1baa37c 100644 --- a/examples/go_over_there.py +++ b/examples/go_over_there.py @@ -10,9 +10,10 @@ * Press R to restart the demo """ -import pygame import random +import pygame + MIN_SPEED = 0.25 MAX_SPEED = 5 MAX_BALLS = 1600 diff --git a/examples/headless_no_windows_needed.py b/examples/headless_no_windows_needed.py index cf6bdf5977..f55ac26c4c 100644 --- a/examples/headless_no_windows_needed.py +++ b/examples/headless_no_windows_needed.py @@ -15,6 +15,7 @@ import os import sys + import pygame # set SDL to use the NULL video driver, diff --git a/examples/liquid.py b/examples/liquid.py index fac91c115c..793dbed1b7 100644 --- a/examples/liquid.py +++ b/examples/liquid.py @@ -13,10 +13,11 @@ sound stuff, that's an easy enough challenge for the reader :] """ -import pygame import os from math import sin +import pygame + main_dir = os.path.split(os.path.abspath(__file__))[0] diff --git a/examples/midi.py b/examples/midi.py index b3bbdebfd1..988bf5639d 100644 --- a/examples/midi.py +++ b/examples/midi.py @@ -10,8 +10,8 @@ python -m pygame.examples.midi --input """ -import sys import os +import sys import pygame import pygame.midi diff --git a/examples/moveit.py b/examples/moveit.py index 0d5000ef19..3af127d44b 100644 --- a/examples/moveit.py +++ b/examples/moveit.py @@ -13,6 +13,7 @@ """ import os + import pygame main_dir = os.path.split(os.path.abspath(__file__))[0] diff --git a/examples/multiplayer_joystick.py b/examples/multiplayer_joystick.py index 6c8eac7a07..769b4fcf82 100644 --- a/examples/multiplayer_joystick.py +++ b/examples/multiplayer_joystick.py @@ -1,4 +1,5 @@ import sys + import pygame WIDTH, HEIGHT = 500, 500 diff --git a/examples/music_drop_fade.py b/examples/music_drop_fade.py index 2fd9d8aa33..cf487443f9 100644 --- a/examples/music_drop_fade.py +++ b/examples/music_drop_fade.py @@ -15,10 +15,11 @@ * Press any other button to skip to the next music file in the list """ -import pygame import os import sys +import pygame + VOLUME_CHANGE_AMOUNT = 0.02 # how fast should up and down arrows change the volume? SCREEN_SIZE = (640, 480) diff --git a/examples/ninepatch.py b/examples/ninepatch.py index 80db74de75..e9a5614bef 100644 --- a/examples/ninepatch.py +++ b/examples/ninepatch.py @@ -16,6 +16,7 @@ """ import os + import pygame SCREEN_SIZE = pygame.Vector2(600, 500) diff --git a/examples/pixelarray.py b/examples/pixelarray.py index 277249049b..1e6a0dc5e8 100644 --- a/examples/pixelarray.py +++ b/examples/pixelarray.py @@ -15,8 +15,8 @@ """ import os -import pygame +import pygame main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, "data") diff --git a/examples/prevent_display_stretching.py b/examples/prevent_display_stretching.py index 35c0ad5d1f..efd8390be9 100644 --- a/examples/prevent_display_stretching.py +++ b/examples/prevent_display_stretching.py @@ -28,9 +28,10 @@ if os.name != "nt" or sys.getwindowsversion()[0] < 6: raise NotImplementedError("this script requires Windows Vista or newer") -import pygame import ctypes +import pygame + def main(): # Determine whether or not the user would like to prevent stretching diff --git a/examples/retro_scaling.py b/examples/retro_scaling.py index dd99034990..e226bad796 100644 --- a/examples/retro_scaling.py +++ b/examples/retro_scaling.py @@ -1,4 +1,5 @@ import math + import pygame diff --git a/examples/scaletest.py b/examples/scaletest.py index 5f83a69844..faf43e15fd 100644 --- a/examples/scaletest.py +++ b/examples/scaletest.py @@ -7,6 +7,7 @@ import sys import time + import pygame @@ -137,7 +138,7 @@ def speed_test(image): print(f"\nUsage: {sys.argv[0]} imagefile [-t] [-convert_alpha]") print(" imagefile image filename (required)") print(" -t run speed test") - print(" -convert_alpha use convert_alpha() on the image's " "surface\n") + print(" -convert_alpha use convert_alpha() on the image's surface\n") else: main( sys.argv[1], diff --git a/examples/scroll.py b/examples/scroll.py index e1a7a7f8b0..66296a080e 100644 --- a/examples/scroll.py +++ b/examples/scroll.py @@ -15,8 +15,8 @@ to quit. """ -import sys import os +import sys import pygame from pygame.transform import scale diff --git a/examples/setmodescale.py b/examples/setmodescale.py index b8d119da77..6348dd49ce 100644 --- a/examples/setmodescale.py +++ b/examples/setmodescale.py @@ -10,9 +10,10 @@ on desktop size and the graphics are scaled. """ -import pygame import sys +import pygame + RES = (160, 120) FPS = 30 diff --git a/examples/sound.py b/examples/sound.py index fde2a45280..49bf2d512b 100644 --- a/examples/sound.py +++ b/examples/sound.py @@ -11,6 +11,7 @@ import os import sys + import pygame main_dir = os.path.split(os.path.abspath(__file__))[0] diff --git a/examples/sound_array_demos.py b/examples/sound_array_demos.py index 155a85ee76..6defd03416 100644 --- a/examples/sound_array_demos.py +++ b/examples/sound_array_demos.py @@ -15,10 +15,10 @@ """ import os -import pygame -from numpy import zeros, int32, int16 import time +import pygame +from numpy import int16, int32, zeros # pygame.mixer.init(44100, -16, 0) pygame.mixer.init() diff --git a/examples/sprite_texture.py b/examples/sprite_texture.py index 34539c833f..07dedab5df 100644 --- a/examples/sprite_texture.py +++ b/examples/sprite_texture.py @@ -11,11 +11,9 @@ """ import os -import pygame - - -from pygame._sdl2 import Window, Texture, Image, Renderer +import pygame +from pygame._sdl2 import Image, Renderer, Texture, Window data_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], "data") diff --git a/examples/testsprite.py b/examples/testsprite.py index 984eaadae6..da7e9c3e33 100644 --- a/examples/testsprite.py +++ b/examples/testsprite.py @@ -10,15 +10,13 @@ See pygame.examples.aliens for some prettier code. """ -import sys import os - +import sys from random import randint from time import time import pygame - main_dir = os.path.split(os.path.abspath(__file__))[0] data_dir = os.path.join(main_dir, "data") diff --git a/examples/textinput.py b/examples/textinput.py index c783de8bd8..fcf891d283 100644 --- a/examples/textinput.py +++ b/examples/textinput.py @@ -6,8 +6,8 @@ Shows how to use the TEXTEDITING and TEXTINPUT events. """ -import sys import os +import sys import pygame @@ -194,13 +194,13 @@ def _get_ime_text(self): """ if self._ime_editing_text: return ( - f"{self._ime_text[0: self._ime_text_pos]}" + f"{self._ime_text[0 : self._ime_text_pos]}" f"[{self._ime_editing_text}]" - f"{self._ime_text[self._ime_text_pos:]}" + f"{self._ime_text[self._ime_text_pos :]}" ) return ( - f"{self._ime_text[0: self._ime_text_pos]}" - f"{self._ime_text[self._ime_text_pos:]}" + f"{self._ime_text[0 : self._ime_text_pos]}" + f"{self._ime_text[self._ime_text_pos :]}" ) def draw(self, screen: pygame.Surface) -> None: diff --git a/examples/vgrade.py b/examples/vgrade.py index 0975c4436c..3b8cf6b866 100644 --- a/examples/vgrade.py +++ b/examples/vgrade.py @@ -27,6 +27,7 @@ """ import os + import pygame try: diff --git a/examples/video.py b/examples/video.py index 81b11f03dc..f867c8ad1d 100644 --- a/examples/video.py +++ b/examples/video.py @@ -11,9 +11,9 @@ """ import os -import pygame -from pygame._sdl2 import Window, Texture, Image, Renderer, get_drivers +import pygame +from pygame._sdl2 import Image, Renderer, Texture, Window, get_drivers data_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], "data") diff --git a/pyproject.toml b/pyproject.toml index 2489fb9057..2f89df124f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,11 +92,18 @@ setup-args = [ [tool.ruff] exclude = [ - "buildconfig/", + "buildconfig/*.py", + "buildconfig/stubs/pygame/typing.pyi", "docs/reST/", "setup.py", ] +[tool.ruff.lint] +select = ["I"] + +[tool.ruff.lint.isort] +combine-as-imports = true + [tool.ruff.format] quote-style = "preserve" diff --git a/src_py/_camera_opencv.py b/src_py/_camera_opencv.py index c175ff3020..c08e6caf15 100644 --- a/src_py/_camera_opencv.py +++ b/src_py/_camera_opencv.py @@ -1,7 +1,7 @@ -import numpy -import cv2 import time +import cv2 +import numpy import pygame diff --git a/src_py/_debug.py b/src_py/_debug.py index 12d6482394..d3d9ee5f5b 100644 --- a/src_py/_debug.py +++ b/src_py/_debug.py @@ -1,15 +1,15 @@ """Debug functionality that allows for more useful issue reporting""" +import importlib import platform import sys import traceback -import importlib from collections.abc import Callable -from typing import Optional from os import environ +from typing import Optional -from pygame.version import ver from pygame.system import get_cpu_instruction_sets +from pygame.version import ver ImportResult = tuple[str, bool, Optional[Callable]] @@ -101,6 +101,7 @@ def default_return(linked=True): # pylint: disable=unused-argument return (-1, -1, -1) + from pygame.base import get_sdl_version from pygame.display import ( get_driver as get_display_driver, get_init as display_init, @@ -109,7 +110,6 @@ def default_return(linked=True): get_driver as get_mixer_driver, get_init as mixer_init, ) - from pygame.base import get_sdl_version debug_str, *mixer = attempt_import( "pygame.mixer", "get_sdl_mixer_version", debug_str @@ -143,27 +143,27 @@ def default_return(linked=True): debug_str += ( f"SDL versions:\t\tLinked: {str_from_tuple(get_sdl_version())}\t" - f"Compiled: {str_from_tuple(get_sdl_version(linked = False))}\n" + f"Compiled: {str_from_tuple(get_sdl_version(linked=False))}\n" ) debug_str += ( f"SDL Mixer versions:\tLinked: {str_from_tuple(get_sdl_mixer_version())}\t" - f"Compiled: {str_from_tuple(get_sdl_mixer_version(linked = False))}\n" + f"Compiled: {str_from_tuple(get_sdl_mixer_version(linked=False))}\n" ) debug_str += ( f"SDL Font versions:\tLinked: {str_from_tuple(get_sdl_ttf_version())}\t" - f"Compiled: {str_from_tuple(get_sdl_ttf_version(linked = False))}\n" + f"Compiled: {str_from_tuple(get_sdl_ttf_version(linked=False))}\n" ) debug_str += ( f"SDL Image versions:\tLinked: {str_from_tuple(get_sdl_image_version())}\t" - f"Compiled: {str_from_tuple(get_sdl_image_version(linked = False))}\n" + f"Compiled: {str_from_tuple(get_sdl_image_version(linked=False))}\n" ) debug_str += ( f"Freetype versions:\tLinked: {str_from_tuple(ft_version())}\t" - f"Compiled: {str_from_tuple(ft_version(linked = False))}\n\n" + f"Compiled: {str_from_tuple(ft_version(linked=False))}\n\n" ) if display_init(): diff --git a/src_py/_sdl2/__init__.py b/src_py/_sdl2/__init__.py index 0f2912b3e1..6ad3b1b047 100644 --- a/src_py/_sdl2/__init__.py +++ b/src_py/_sdl2/__init__.py @@ -1,4 +1,4 @@ if __import__("sys").platform not in ("wasi", "emscripten"): - from .sdl2 import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] from .audio import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] + from .sdl2 import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] from .video import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] diff --git a/src_py/_sprite.py b/src_py/_sprite.py index 941db11504..b97e45d47c 100644 --- a/src_py/_sprite.py +++ b/src_py/_sprite.py @@ -7,22 +7,22 @@ ) from pygame.sprite import ( - Sprite, + AbstractGroup, DirtySprite, Group, GroupSingle, - AbstractGroup, + LayeredDirty, + LayeredUpdates, RenderClear, RenderPlain, RenderUpdates, - LayeredUpdates, - LayeredDirty, - spritecollide, - spritecollideany, + Sprite, + collide_circle, + collide_circle_ratio, collide_mask, collide_rect, - collide_circle, collide_rect_ratio, - collide_circle_ratio, groupcollide, + spritecollide, + spritecollideany, ) diff --git a/src_py/freetype.py b/src_py/freetype.py index 6c8dc0e4e2..146e6750d2 100644 --- a/src_py/freetype.py +++ b/src_py/freetype.py @@ -1,25 +1,25 @@ """Enhanced Pygame module for loading and rendering computer fonts""" from pygame._freetype import ( - Font, + STYLE_DEFAULT, STYLE_NORMAL, STYLE_OBLIQUE, STYLE_STRONG, STYLE_UNDERLINE, STYLE_WIDE, - STYLE_DEFAULT, - init, - quit, - get_init, - was_init, + Font, get_cache_size, get_default_font, get_default_resolution, get_error, + get_init, get_version, + init, + quit, set_default_resolution, + was_init, ) -from pygame.sysfont import match_font, get_fonts, SysFont as _SysFont +from pygame.sysfont import SysFont as _SysFont, get_fonts, match_font __all__ = [ "Font", diff --git a/src_py/ftfont.py b/src_py/ftfont.py index 0e3de5b39b..00041a91dc 100644 --- a/src_py/ftfont.py +++ b/src_py/ftfont.py @@ -11,12 +11,17 @@ "get_fonts", ] -from pygame._freetype import init, Font as _Font, get_default_resolution -from pygame._freetype import quit, get_default_font, get_init as _get_init -from pygame._freetype import _internal_mod_init -from pygame.sysfont import match_font, get_fonts, SysFont as _SysFont -from pygame import encode_file_path -from pygame import draw +from pygame import draw, encode_file_path +from pygame._freetype import ( + Font as _Font, + _internal_mod_init, + get_default_font, + get_default_resolution, + get_init as _get_init, + init, + quit, +) +from pygame.sysfont import SysFont as _SysFont, get_fonts, match_font class Font(_Font): diff --git a/src_py/locals.py b/src_py/locals.py index 1ecbd7188c..acdcdcd8ed 100644 --- a/src_py/locals.py +++ b/src_py/locals.py @@ -23,8 +23,8 @@ the local namespace for your module""" import pygame +from pygame.color import Color from pygame.constants import * # pylint: disable=wildcard-import,unused-wildcard-import; lgtm[py/polluting-import] from pygame.rect import Rect -from pygame.color import Color __all__ = pygame.constants.__all__ + ["Rect", "Color"] diff --git a/src_py/macosx.py b/src_py/macosx.py index 0a16d317be..73229d1955 100644 --- a/src_py/macosx.py +++ b/src_py/macosx.py @@ -1,5 +1,5 @@ -import platform import os +import platform import sys __all__ = ["Video_AutoInit"] diff --git a/src_py/midi.py b/src_py/midi.py index b66b95b73c..4838726c89 100644 --- a/src_py/midi.py +++ b/src_py/midi.py @@ -22,12 +22,11 @@ # - that can automatically inject input into the event queue # once the input object is running. Like joysticks. -import math import atexit +import math import pygame import pygame.locals - import pygame.pypm as _pypm # For backward compatibility. diff --git a/src_py/pkgdata.py b/src_py/pkgdata.py index 7cff0c383f..ddb6177d05 100644 --- a/src_py/pkgdata.py +++ b/src_py/pkgdata.py @@ -18,8 +18,8 @@ def getResource(identifier, pkgname=__name__): """ __all__ = ["getResource"] -import sys import os +import sys try: from importlib.resources import files diff --git a/src_py/sndarray.py b/src_py/sndarray.py index 0791051eb8..b19d00d58d 100644 --- a/src_py/sndarray.py +++ b/src_py/sndarray.py @@ -37,11 +37,10 @@ if the sound sample type requests this. """ -from pygame import mixer -import numpy - import warnings +import numpy +from pygame import mixer __all__ = [ "array", diff --git a/src_py/sprite.py b/src_py/sprite.py index e3865194bb..2075a5f1b2 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -85,14 +85,13 @@ # specialized cases. import types -from warnings import warn from typing import Optional +from warnings import warn import pygame - +from pygame.mask import from_surface from pygame.rect import Rect from pygame.time import get_ticks -from pygame.mask import from_surface class Sprite: @@ -372,8 +371,7 @@ class AbstractGroup: """ - def __class_getitem__(cls, generic): - return types.GenericAlias(cls, generic) + __class_getitem__ = classmethod(types.GenericAlias) # protected identifier value to identify sprite groups, and avoid infinite recursion _spritegroup = True diff --git a/src_py/surfarray.py b/src_py/surfarray.py index 9a1f7f4a63..df78d3c316 100644 --- a/src_py/surfarray.py +++ b/src_py/surfarray.py @@ -37,22 +37,21 @@ blue. """ -from pygame.pixelcopy import ( - array_to_surface, - surface_to_array, - map_array as pix_map_array, - make_surface as pix_make_surface, -) +import warnings # will be removed in the future + import numpy from numpy import ( array as numpy_array, empty as numpy_empty, - uint32 as numpy_uint32, ndarray as numpy_ndarray, + uint32 as numpy_uint32, +) +from pygame.pixelcopy import ( + array_to_surface, + make_surface as pix_make_surface, + map_array as pix_map_array, + surface_to_array, ) - -import warnings # will be removed in the future - # float96 not available on all numpy versions. numpy_floats = [ diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 7808418aa9..7c512dbac7 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -19,16 +19,15 @@ # pete@shinners.org """sysfont, used in the font module to find system fonts""" -import warnings +import difflib +import itertools import os import sys -import itertools -import difflib +import warnings from os.path import basename, dirname, exists, join, splitext -from pygame.font import Font from pygame import __file__ as pygame_main_file - +from pygame.font import Font OpenType_extensions = frozenset((".ttf", ".ttc", ".otf")) Sysfonts = {} diff --git a/src_py/typing.py b/src_py/typing.py index 2897a338fe..b373ea1cbf 100644 --- a/src_py/typing.py +++ b/src_py/typing.py @@ -15,11 +15,10 @@ from abc import abstractmethod from collections.abc import Callable from os import PathLike as _PathProtocol -from typing import IO, Union, TypeVar, Protocol +from typing import IO, Protocol, TypeVar, Union from pygame.color import Color -from pygame.rect import Rect, FRect - +from pygame.rect import FRect, Rect # For functions that take a file name _PathLike = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]] diff --git a/src_py/version.py b/src_py/version.py index c529ef7bea..1511dee8ba 100644 --- a/src_py/version.py +++ b/src_py/version.py @@ -27,7 +27,7 @@ releases. (hmm, until we get to versions > 10) """ -from pygame.base import get_sdl_version, __version__ +from pygame.base import __version__, get_sdl_version class SoftwareVersion(tuple): diff --git a/test/base_test.py b/test/base_test.py index 0959295338..01d19bc5cd 100644 --- a/test/base_test.py +++ b/test/base_test.py @@ -1,8 +1,7 @@ +import platform import sys import unittest -import platform - IS_PYPY = "PyPy" == platform.python_implementation() try: @@ -11,7 +10,6 @@ pass import pygame - quit_count = 0 @@ -115,7 +113,8 @@ def get__array_interface__(self): # verified by first checking the weak reference both before and # after the regular reference held by o is removed. - import weakref, gc + import gc + import weakref class NoDictError(RuntimeError): pass @@ -249,9 +248,10 @@ def test_newbuf(self): self.NEWBUF_assertSame(v, o) def test_bad_format(self): + from ctypes import addressof, create_string_buffer + from pygame.bufferproxy import BufferProxy from pygame.newbuffer import BufferMixin - from ctypes import create_string_buffer, addressof buftools = self.buftools Exporter = buftools.Exporter @@ -380,9 +380,10 @@ def test_PgDict_AsBuffer_PyBUF_flags(self): @unittest.skipIf(IS_PYPY, "newbuf with ctypes") def test_PgObject_AsBuffer_PyBUF_flags(self): - from pygame.bufferproxy import BufferProxy import ctypes + from pygame.bufferproxy import BufferProxy + is_lil_endian = pygame.get_sdl_byteorder() == pygame.LIL_ENDIAN fsys, frev = ("<", ">") if is_lil_endian else (">", "<") buftools = self.buftools diff --git a/test/bufferproxy_test.py b/test/bufferproxy_test.py index bd0b22f4c3..01ed49d2ca 100644 --- a/test/bufferproxy_test.py +++ b/test/bufferproxy_test.py @@ -1,13 +1,12 @@ -import re -import weakref -import gc import ctypes +import gc +import re import unittest +import weakref import pygame from pygame.bufferproxy import BufferProxy - try: BufferError except NameError: @@ -332,7 +331,7 @@ def test_oldbuf_arg(self): self.OLDBUF_test_oldbuf_arg() def OLDBUF_test_oldbuf_arg(self): - from pygame.bufferproxy import get_segcount, get_read_buffer, get_write_buffer + from pygame.bufferproxy import get_read_buffer, get_segcount, get_write_buffer content = b"\x01\x00\x00\x02" * 12 memory = ctypes.create_string_buffer(content) @@ -458,7 +457,7 @@ def test_write(self): # at the specified offset within the BufferProxy. # If the length of the passed buffer exceeds the length of the # BufferProxy (reduced by the offset), an IndexError will be raised. - from ctypes import c_byte, sizeof, addressof, string_at, memset + from ctypes import addressof, c_byte, memset, sizeof, string_at nullbyte = b"\x00" Buf = c_byte * 10 diff --git a/test/color_test.py b/test/color_test.py index deca70957d..bc83a26988 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -1087,9 +1087,10 @@ def test_pickle(self): @unittest.skipIf(IS_PYPY, "PyPy has no ctypes") def test_arraystruct(self): - import pygame.tests.test_utils.arrinter as ai import ctypes as ct + import pygame.tests.test_utils.arrinter as ai + c_byte_p = ct.POINTER(ct.c_byte) c = pygame.Color(5, 7, 13, 23) flags = ai.PAI_CONTIGUOUS | ai.PAI_FORTRAN | ai.PAI_ALIGNED | ai.PAI_NOTSWAPPED @@ -1108,8 +1109,9 @@ def test_arraystruct(self): self.assertEqual(data[j], c[j]) def test_newbuf(self): + from ctypes import POINTER, c_uint8, cast + from pygame.tests.test_utils import buftools - from ctypes import cast, POINTER, c_uint8 class ColorImporter(buftools.Importer): def __init__(self, color, flags): diff --git a/test/constants_test.py b/test/constants_test.py index 9c4790ce56..9ee72bdfe4 100644 --- a/test/constants_test.py +++ b/test/constants_test.py @@ -1,6 +1,6 @@ import unittest -import pygame.constants +import pygame.constants # K_* and KSCAN_* common names. K_AND_KSCAN_COMMON_NAMES = ( diff --git a/test/controller_test.py b/test/controller_test.py index 000ee40a6d..4175d63c18 100644 --- a/test/controller_test.py +++ b/test/controller_test.py @@ -1,4 +1,5 @@ import unittest + import pygame import pygame._sdl2.controller as controller from pygame.tests.test_utils import prompt, question diff --git a/test/cursors_test.py b/test/cursors_test.py index 0124f6a69d..abc7f44316 100644 --- a/test/cursors_test.py +++ b/test/cursors_test.py @@ -1,6 +1,7 @@ import unittest -from pygame.tests.test_utils import fixture_path + import pygame +from pygame.tests.test_utils import fixture_path class CursorsModuleTest(unittest.TestCase): diff --git a/test/debug_test.py b/test/debug_test.py index a0e327ce3a..622ff453a8 100644 --- a/test/debug_test.py +++ b/test/debug_test.py @@ -1,5 +1,6 @@ -import unittest, unittest.mock import io +import unittest +import unittest.mock import pygame diff --git a/test/display_test.py b/test/display_test.py index 5d5150fc91..881304b878 100644 --- a/test/display_test.py +++ b/test/display_test.py @@ -1,13 +1,12 @@ -import unittest import os import sys import time +import unittest -import pygame, pygame.transform - -from pygame.tests.test_utils import question - +import pygame +import pygame.transform from pygame import display +from pygame.tests.test_utils import question class DisplayModuleTest(unittest.TestCase): diff --git a/test/docs_test.py b/test/docs_test.py index c66221a108..05f07267d4 100644 --- a/test/docs_test.py +++ b/test/docs_test.py @@ -6,7 +6,7 @@ class DocsIncludedTest(unittest.TestCase): def test_doc_import_works(self): - from pygame.docs import has_local_docs, PKG_DIR + from pygame.docs import PKG_DIR, has_local_docs @unittest.skipIf("CI" not in os.environ, "Docs not required for local builds") def test_docs_included(self): diff --git a/test/draw_test.py b/test/draw_test.py index ffba331575..86c54541c0 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -1,14 +1,13 @@ import math -import unittest import sys +import unittest import warnings import pygame from pygame import draw from pygame.locals import SRCALPHA -from pygame.tests import test_utils from pygame.math import Vector2 - +from pygame.tests import test_utils RED = BG_RED = pygame.Color("red") GREEN = FG_GREEN = pygame.Color("green") diff --git a/test/font_test.py b/test/font_test.py index 6f2fd45b4e..1ecb22edad 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -import sys -import os import io -import unittest +import os import pathlib import platform +import sys +import unittest import pygame from pygame import font as pygame_font # So font can be replaced with ftfont diff --git a/test/freetype_test.py b/test/freetype_test.py index dccd7ab780..dcc85c9b1b 100644 --- a/test/freetype_test.py +++ b/test/freetype_test.py @@ -1,11 +1,11 @@ -import os -import io -import unittest import ctypes -import weakref import gc +import io +import os import pathlib import platform +import unittest +import weakref IS_PYPY = "PyPy" == platform.python_implementation() @@ -16,7 +16,6 @@ pass import pygame - import pygame.freetype as ft FONTDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "fixtures", "fonts") diff --git a/test/ftfont_test.py b/test/ftfont_test.py index d1384c7787..d737aefe13 100644 --- a/test/ftfont_test.py +++ b/test/ftfont_test.py @@ -1,11 +1,11 @@ -import sys import os +import sys import unittest -from . import font_test - import pygame.ftfont +from . import font_test + font_test.pygame_font = pygame.ftfont for name in dir(font_test): diff --git a/test/geometry_test.py b/test/geometry_test.py index 53bdecc377..c4d48e0d6a 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2,7 +2,7 @@ import unittest from math import sqrt -from pygame import Vector2, Vector3, Rect, FRect +from pygame import FRect, Rect, Vector2, Vector3 from pygame.geometry import Circle, Line diff --git a/test/gfxdraw_test.py b/test/gfxdraw_test.py index ad21542b76..76f9aa80b8 100644 --- a/test/gfxdraw_test.py +++ b/test/gfxdraw_test.py @@ -1,4 +1,5 @@ import unittest + import pygame import pygame.gfxdraw from pygame.locals import * diff --git a/test/image__save_gl_surface_test.py b/test/image__save_gl_surface_test.py index 0bd98da5ea..b70a0bac4e 100644 --- a/test/image__save_gl_surface_test.py +++ b/test/image__save_gl_surface_test.py @@ -1,9 +1,9 @@ import os import unittest -from pygame.tests import test_utils import pygame from pygame.locals import * +from pygame.tests import test_utils @unittest.skipIf( diff --git a/test/image_test.py b/test/image_test.py index 3d0f8f21e5..05520c85d2 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -1,15 +1,17 @@ import array import binascii +import glob import io import os +import pathlib import tempfile import unittest -import glob -import pathlib from concurrent.futures import ThreadPoolExecutor +import pygame +import pygame.image +import pygame.pkgdata from pygame.tests.test_utils import example_path, png, tostring -import pygame, pygame.image, pygame.pkgdata sdl_image_svg_jpeg_save_bug = False _sdl_image_ver = pygame.image.get_sdl_image_version() diff --git a/test/imageext_test.py b/test/imageext_test.py index c5ce75916f..53396c49d6 100644 --- a/test/imageext_test.py +++ b/test/imageext_test.py @@ -3,9 +3,10 @@ import sys import unittest +import pygame +import pygame.image +import pygame.pkgdata from pygame.tests.test_utils import example_path -import pygame, pygame.image, pygame.pkgdata - imageext = sys.modules["pygame.imageext"] diff --git a/test/joystick_test.py b/test/joystick_test.py index fd7f978859..61eb1510a3 100644 --- a/test/joystick_test.py +++ b/test/joystick_test.py @@ -1,8 +1,8 @@ import unittest -from pygame.tests.test_utils import question, prompt import pygame import pygame._sdl2.controller +from pygame.tests.test_utils import prompt, question class JoystickTypeTest(unittest.TestCase): @@ -122,7 +122,7 @@ def test_get_count(self): try: count = pygame.joystick.get_count() self.assertGreaterEqual( - count, 0, ("joystick.get_count() must " "return a value >= 0") + count, 0, ("joystick.get_count() must return a value >= 0") ) finally: pygame.joystick.quit() diff --git a/test/key_test.py b/test/key_test.py index 758010b420..79bd8e1b6f 100644 --- a/test/key_test.py +++ b/test/key_test.py @@ -1,6 +1,6 @@ import os -import time import platform +import time import unittest import pygame diff --git a/test/mask_test.py b/test/mask_test.py index 0a46719f0f..6644e76d4c 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -1,15 +1,14 @@ -from collections import OrderedDict import copy import platform import random -import unittest import sys +import unittest +from collections import OrderedDict import pygame from pygame.locals import * from pygame.math import Vector2 - IS_PYPY = "PyPy" == platform.python_implementation() diff --git a/test/midi_test.py b/test/midi_test.py index f4189a2351..2bf4e89883 100644 --- a/test/midi_test.py +++ b/test/midi_test.py @@ -1,6 +1,5 @@ import unittest - import pygame @@ -210,7 +209,7 @@ def test_pitch_bend(self): out.pitch_bend(-10001, 1) self.assertEqual( str(cm.exception), - "Pitch bend value must be between " "-8192 and +8191, not -10001.", + "Pitch bend value must be between -8192 and +8191, not -10001.", ) with self.assertRaises(ValueError) as cm: out.pitch_bend(10665, 2) @@ -439,7 +438,7 @@ def test_midis2events__extra_event_data_missing_timestamp(self): def test_conversions(self): """of frequencies to midi note numbers and ansi note names.""" - from pygame.midi import frequency_to_midi, midi_to_frequency, midi_to_ansi_note + from pygame.midi import frequency_to_midi, midi_to_ansi_note, midi_to_frequency self.assertEqual(frequency_to_midi(27.5), 21) self.assertEqual(frequency_to_midi(36.7), 26) diff --git a/test/mixer_music_test.py b/test/mixer_music_test.py index f9cb722b4b..1774535a3e 100644 --- a/test/mixer_music_test.py +++ b/test/mixer_music_test.py @@ -1,11 +1,11 @@ import os -import sys import platform -import unittest +import sys import time +import unittest -from pygame.tests.test_utils import example_path import pygame +from pygame.tests.test_utils import example_path class MixerMusicModuleTest(unittest.TestCase): @@ -517,8 +517,8 @@ def todo_test_set_pos(self): def test_init(self): """pygame-ce issue #622. unload music whenever mixer.quit() is called""" - import tempfile import shutil + import tempfile testfile = example_path(os.path.join("data", "house_lo.wav")) tempcopy = os.path.join(tempfile.gettempdir(), "tempfile.wav") diff --git a/test/mixer_test.py b/test/mixer_test.py index 9b3551b834..9bc08bf6e9 100644 --- a/test/mixer_test.py +++ b/test/mixer_test.py @@ -1,14 +1,13 @@ -import sys import os -import unittest -import time import pathlib import platform - -from pygame.tests.test_utils import example_path, prompt, question +import sys +import time +import unittest import pygame from pygame import mixer +from pygame.tests.test_utils import example_path, prompt, question IS_PYPY = "PyPy" == platform.python_implementation() @@ -300,15 +299,15 @@ def test_sound_unicode(self): def test_array_keyword(self): try: from numpy import ( - array, arange, - zeros, + array, int8, - uint8, int16, - uint16, int32, + uint8, + uint16, uint32, + zeros, ) except ImportError: self.skipTest("requires numpy") @@ -369,7 +368,7 @@ def test_array_keyword(self): mixer.quit() def _test_array_argument(self, format, a, test_pass): - from numpy import array, all as all_ + from numpy import all as all_, array try: snd = mixer.Sound(array=a) @@ -1105,7 +1104,7 @@ def test_sound__before_init(self): def test_samples_address(self): """Test the _samples_address getter.""" try: - from ctypes import pythonapi, c_void_p, py_object + from ctypes import c_void_p, py_object, pythonapi Bytes_FromString = pythonapi.PyBytes_FromString diff --git a/test/mouse_test.py b/test/mouse_test.py index 019c8a7da6..f7642d6ab6 100644 --- a/test/mouse_test.py +++ b/test/mouse_test.py @@ -1,9 +1,9 @@ -import unittest import os import platform +import unittest import warnings -import pygame +import pygame DARWIN = "Darwin" in platform.platform() diff --git a/test/pixelarray_test.py b/test/pixelarray_test.py index af8117ceeb..50ba0384d2 100644 --- a/test/pixelarray_test.py +++ b/test/pixelarray_test.py @@ -15,7 +15,6 @@ import pygame - IS_PYPY = "PyPy" == platform.python_implementation() diff --git a/test/pixelcopy_test.py b/test/pixelcopy_test.py index 662918d120..534a80ed65 100644 --- a/test/pixelcopy_test.py +++ b/test/pixelcopy_test.py @@ -7,7 +7,7 @@ pass import pygame from pygame.locals import * -from pygame.pixelcopy import surface_to_array, map_array, array_to_surface, make_surface +from pygame.pixelcopy import array_to_surface, make_surface, map_array, surface_to_array IS_PYPY = "PyPy" == platform.python_implementation() @@ -377,7 +377,7 @@ def tearDown(self): def test_surface_to_array_2d(self): try: - from numpy import empty, dtype + from numpy import dtype, empty except ImportError: return @@ -458,7 +458,7 @@ def test_surface_to_array_2d(self): def test_surface_to_array_3d(self): try: - from numpy import empty, dtype + from numpy import dtype, empty except ImportError: return @@ -534,7 +534,7 @@ def test_surface_to_array_3d(self): def test_map_array(self): try: - from numpy import array, zeros, uint8, int32, all as np_all + from numpy import all as np_all, array, int32, uint8, zeros except ImportError: return @@ -599,7 +599,7 @@ class PixelCopyTestWithArrayNewBuf(unittest.TestCase): class Array2D(buftools.Exporter): def __init__(self, initializer): - from ctypes import cast, POINTER, c_uint32 + from ctypes import POINTER, c_uint32, cast Array2D = PixelCopyTestWithArrayNewBuf.Array2D super().__init__((3, 5), format="=I", strides=(20, 4)) @@ -615,7 +615,7 @@ def __getitem__(self, key): class Array3D(buftools.Exporter): def __init__(self, initializer): - from ctypes import cast, POINTER, c_uint8 + from ctypes import POINTER, c_uint8, cast Array3D = PixelCopyTestWithArrayNewBuf.Array3D super().__init__((3, 5, 3), format="B", strides=(20, 4, 1)) diff --git a/test/rect_test.py b/test/rect_test.py index 0ad1af77c3..fce9242206 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -2,7 +2,7 @@ import unittest from collections.abc import Collection, Sequence -from pygame import Vector2, FRect, Rect as IRect +from pygame import FRect, Rect as IRect, Vector2 from pygame.tests import test_utils Rect = IRect diff --git a/test/rwobject_test.py b/test/rwobject_test.py index 90c878b9dc..e12cb2b2f2 100644 --- a/test/rwobject_test.py +++ b/test/rwobject_test.py @@ -1,7 +1,7 @@ import pathlib import unittest -from pygame import encode_string, encode_file_path +from pygame import encode_file_path, encode_string class RWopsEncodeStringTest(unittest.TestCase): diff --git a/test/scrap_test.py b/test/scrap_test.py index 601a5baeb4..a62d31c6ea 100644 --- a/test/scrap_test.py +++ b/test/scrap_test.py @@ -1,11 +1,10 @@ import os import sys - import unittest -from pygame.tests.test_utils import trunk_relative_path import pygame from pygame import scrap +from pygame.tests.test_utils import trunk_relative_path if os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER: __tags__ = ("ignore", "subprocess_ignore") @@ -226,8 +225,7 @@ def test_issue_223(self): """ from pygame import display, event, freetype - from pygame.locals import SCRAP_SELECTION, SCRAP_TEXT - from pygame.locals import KEYDOWN, K_y, QUIT + from pygame.locals import KEYDOWN, QUIT, SCRAP_SELECTION, SCRAP_TEXT, K_y success = False freetype.init() diff --git a/test/sndarray_test.py b/test/sndarray_test.py index a99171fc5a..639224fbec 100644 --- a/test/sndarray_test.py +++ b/test/sndarray_test.py @@ -1,9 +1,8 @@ import unittest -from numpy import int8, int16, uint8, uint16, float32, array, all as np_all - import pygame import pygame.sndarray +from numpy import all as np_all, array, float32, int8, int16, uint8, uint16 class SndarrayTest(unittest.TestCase): diff --git a/test/sprite_test.py b/test/sprite_test.py index 56ce86a4a5..fd06cd47d6 100644 --- a/test/sprite_test.py +++ b/test/sprite_test.py @@ -8,7 +8,6 @@ import pygame from pygame import sprite - ################################# MODULE LEVEL ################################# @@ -1374,8 +1373,8 @@ def test_memoryleak_bug(self): # For memory leak bug posted to mailing list by Tobias Steinrücken on 16/11/10. # Fixed in revision 2953. - import weakref import gc + import weakref class MySprite(sprite.Sprite): def __init__(self, *args, **kwargs): diff --git a/test/surface_test.py b/test/surface_test.py index 4e4b5d40ca..c3bb3d098a 100644 --- a/test/surface_test.py +++ b/test/surface_test.py @@ -1,24 +1,25 @@ import os import unittest + from pygame.tests import test_utils from pygame.tests.test_utils import ( - example_path, SurfaceSubclass, + example_path, ) try: from pygame.tests.test_utils.arrinter import * except (ImportError, NameError): pass -import pygame -from pygame.locals import * -from pygame.bufferproxy import BufferProxy - -import platform -import gc -import weakref import ctypes +import gc import itertools +import platform +import weakref + +import pygame +from pygame.bufferproxy import BufferProxy +from pygame.locals import * IS_PYPY = "PyPy" == platform.python_implementation() diff --git a/test/surfarray_test.py b/test/surfarray_test.py index bfcf8f15fe..f51a411179 100644 --- a/test/surfarray_test.py +++ b/test/surfarray_test.py @@ -1,27 +1,23 @@ -import unittest import platform +import unittest +import pygame +import pygame.surfarray from numpy import ( + __version__ as np_version, + all as np_all, + arange, + float32, + float64, + rint, uint8, uint16, uint32, uint64, zeros, - float32, - float64, - all as np_all, - rint, - arange, - __version__ as np_version, - array, ) - -import pygame from pygame.locals import * -import pygame.surfarray - - IS_PYPY = "PyPy" == platform.python_implementation() diff --git a/test/surflock_test.py b/test/surflock_test.py index 19f354bfd9..c56bffe021 100644 --- a/test/surflock_test.py +++ b/test/surflock_test.py @@ -1,6 +1,6 @@ -import unittest -import sys import platform +import sys +import unittest import pygame diff --git a/test/sysfont_test.py b/test/sysfont_test.py index 4b45f018ef..eaa3ce2d8c 100644 --- a/test/sysfont_test.py +++ b/test/sysfont_test.py @@ -1,5 +1,5 @@ -import unittest import platform +import unittest class SysfontModuleTest(unittest.TestCase): diff --git a/test/system_test.py b/test/system_test.py index b905b8b651..e03921c72a 100644 --- a/test/system_test.py +++ b/test/system_test.py @@ -1,5 +1,5 @@ -import unittest import os +import unittest import pygame diff --git a/test/test_utils/__init__.py b/test/test_utils/__init__.py index 040d7b8876..2cbb913b11 100644 --- a/test/test_utils/__init__.py +++ b/test/test_utils/__init__.py @@ -1,8 +1,9 @@ import os -import pygame import sys import tempfile +import pygame + ############################################################################### diff --git a/test/test_utils/arrinter.py b/test/test_utils/arrinter.py index 626913c9ce..b39b7895d7 100644 --- a/test/test_utils/arrinter.py +++ b/test/test_utils/arrinter.py @@ -1,7 +1,7 @@ -import sys import ctypes -from ctypes import * +import sys import unittest +from ctypes import * __all__ = [ "PAI_CONTIGUOUS", diff --git a/test/test_utils/async_sub.py b/test/test_utils/async_sub.py index 560d377b12..5f34c72962 100644 --- a/test/test_utils/async_sub.py +++ b/test/test_utils/async_sub.py @@ -7,14 +7,14 @@ #################################### IMPORTS ################################### +import errno import os import platform import subprocess -import errno -import time import sys -import unittest import tempfile +import time +import unittest def geterror(): @@ -86,15 +86,15 @@ def PeekNamedPipe(handle, desired_bytes): return "", c_avail.value, c_message.value except ImportError: + from win32api import TerminateProcess from win32file import ReadFile, WriteFile from win32pipe import PeekNamedPipe - from win32api import TerminateProcess import msvcrt else: - from signal import SIGINT, SIGTERM, SIGKILL - import select import fcntl + import select + from signal import SIGINT, SIGKILL, SIGTERM ################################### CONSTANTS ################################## diff --git a/test/test_utils/buftools.py b/test/test_utils/buftools.py index 74227727ac..d9f5342aea 100644 --- a/test/test_utils/buftools.py +++ b/test/test_utils/buftools.py @@ -20,34 +20,33 @@ """ -import pygame +import ctypes +import operator +import unittest +from functools import reduce +import pygame import pygame.newbuffer from pygame.newbuffer import ( - PyBUF_SIMPLE, - PyBUF_FORMAT, - PyBUF_ND, - PyBUF_WRITABLE, - PyBUF_STRIDES, + PyBUF_ANY_CONTIGUOUS, PyBUF_C_CONTIGUOUS, + PyBUF_CONTIG, + PyBUF_CONTIG_RO, PyBUF_F_CONTIGUOUS, - PyBUF_ANY_CONTIGUOUS, + PyBUF_FORMAT, + PyBUF_FULL, + PyBUF_FULL_RO, PyBUF_INDIRECT, - PyBUF_STRIDED, - PyBUF_STRIDED_RO, + PyBUF_ND, PyBUF_RECORDS, PyBUF_RECORDS_RO, - PyBUF_FULL, - PyBUF_FULL_RO, - PyBUF_CONTIG, - PyBUF_CONTIG_RO, + PyBUF_SIMPLE, + PyBUF_STRIDED, + PyBUF_STRIDED_RO, + PyBUF_STRIDES, + PyBUF_WRITABLE, ) -import unittest -import ctypes -import operator -from functools import reduce - __all__ = ["Exporter", "Importer"] try: @@ -322,7 +321,7 @@ def internal(self): return self._view.internal def _to_ssize_tuple(self, addr): - from ctypes import cast, POINTER, c_ssize_t + from ctypes import POINTER, c_ssize_t, cast if addr is None: return None diff --git a/test/test_utils/png.py b/test/test_utils/png.py index 3768e21198..d6c2ebcaec 100644 --- a/test/test_utils/png.py +++ b/test/test_utils/png.py @@ -167,8 +167,8 @@ import operator import struct import sys -import zlib import warnings +import zlib from array import array from functools import reduce @@ -2430,7 +2430,7 @@ def testPtrns(self): self.assertEqual(map(list, pixels), map(list, flat)) def testRGBtoRGBA(self): - "asRGBA8() on color type 2 source." "" + "asRGBA8() on color type 2 source." # Test for pygame-ce issue 41 r = Reader(bytes=_pngsuite["basn2c08"]) x, y, pixels, meta = r.asRGBA8() @@ -2439,7 +2439,7 @@ def testRGBtoRGBA(self): self.assertEqual(row9[0:8], [0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF]) def testLtoRGBA(self): - "asRGBA() on gray source." "" + "asRGBA() on gray source." # Test for pygame-ce issue 75 r = Reader(bytes=_pngsuite["basi0g08"]) x, y, pixels, meta = r.asRGBA() @@ -2812,8 +2812,8 @@ def testNumpyarray(self): def _dehex(s): """Liberally convert from hex string to binary string.""" - import re import binascii + import re # Remove all non-hexadecimal digits s = re.sub(r"[^a-fA-F\d]", "", s) @@ -3781,8 +3781,8 @@ def _main(argv): """ # Parse command line arguments - from optparse import OptionParser import re + from optparse import OptionParser version = "%prog " + re.sub(r"( ?\$|URL: |Rev:)", "", __version__) parser = OptionParser(version=version) diff --git a/test/test_utils/run_tests.py b/test/test_utils/run_tests.py index 695cf34954..64db0ec8b9 100644 --- a/test/test_utils/run_tests.py +++ b/test/test_utils/run_tests.py @@ -9,32 +9,32 @@ if is_pygame_pkg: from pygame.tests.test_utils import import_submodule from pygame.tests.test_utils.test_runner import ( - prepare_test_env, - run_test, + TEST_RESULTS_START, combine_results, get_test_results, - TEST_RESULTS_START, + prepare_test_env, + run_test, ) else: from test.test_utils import import_submodule from test.test_utils.test_runner import ( - prepare_test_env, - run_test, + TEST_RESULTS_START, combine_results, get_test_results, - TEST_RESULTS_START, + prepare_test_env, + run_test, ) -import pygame - import os +import random import re import shutil import tempfile import time -import random from concurrent.futures import ThreadPoolExecutor from pprint import pformat +import pygame + was_run = False diff --git a/test/test_utils/test_runner.py b/test/test_utils/test_runner.py index 61200691d3..3bf7f91746 100644 --- a/test/test_utils/test_runner.py +++ b/test/test_utils/test_runner.py @@ -1,5 +1,5 @@ -import sys import os +import sys if __name__ == "__main__": pkg_dir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0] @@ -56,7 +56,7 @@ def exclude_callback(option, opt, value, parser): "-s", "--usesubprocess", action="store_true", - help="run everything in a single process " " (default: use no subprocesses)", + help="run everything in a single process (default: use no subprocesses)", ) opt_parser.add_option( diff --git a/test/time_test.py b/test/time_test.py index e58bff78f6..4d21299115 100644 --- a/test/time_test.py +++ b/test/time_test.py @@ -1,6 +1,7 @@ +import time import unittest + import pygame -import time Clock = pygame.time.Clock diff --git a/test/touch_test.py b/test/touch_test.py index 9ddd53a343..3b16c3df7e 100644 --- a/test/touch_test.py +++ b/test/touch_test.py @@ -1,5 +1,6 @@ -import unittest import os +import unittest + import pygame from pygame._sdl2 import touch from pygame.tests.test_utils import question @@ -65,9 +66,7 @@ def test_get_finger(self): font = pygame.font.Font(None, 32) instructions_str_1 = "Please place some fingers on your touch device" - instructions_str_2 = ( - "Close the window when finished, " "and answer the question" - ) + instructions_str_2 = "Close the window when finished, and answer the question" inst_1_render = font.render(instructions_str_1, True, pygame.Color("#000000")) inst_2_render = font.render(instructions_str_2, True, pygame.Color("#000000")) diff --git a/test/transform_test.py b/test/transform_test.py index a4e13314bd..580bfdc66e 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -1,13 +1,12 @@ -import unittest import os import platform - -from pygame.tests import test_utils -from pygame.tests.test_utils import example_path +import unittest import pygame import pygame.transform from pygame.locals import * +from pygame.tests import test_utils +from pygame.tests.test_utils import example_path def show_image(s, images=[]): diff --git a/test/version_test.py b/test/version_test.py index 72d7cb9514..d03f68d0dd 100644 --- a/test/version_test.py +++ b/test/version_test.py @@ -1,6 +1,5 @@ import os import unittest - from importlib.metadata import version import pygame diff --git a/test/video_test.py b/test/video_test.py index 1672f90dde..f6876bc56c 100644 --- a/test/video_test.py +++ b/test/video_test.py @@ -1,11 +1,10 @@ import platform -import unittest import sys -import pygame +import unittest +import pygame from pygame._sdl2 import video - IS_PYPY = "PyPy" == platform.python_implementation() diff --git a/test/window_test.py b/test/window_test.py index f30ab08bc5..5212b97b9c 100644 --- a/test/window_test.py +++ b/test/window_test.py @@ -1,8 +1,8 @@ -import unittest -import pygame import os import platform +import unittest +import pygame from pygame import Window from pygame.version import SDL From 4677a25303d3d5e45476650d7d82ee132f7df196 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 06:43:45 +0000 Subject: [PATCH 131/441] Bump actions/cache from 4.2.2 to 4.2.3 Bumps [actions/cache](https://github.com/actions/cache) from 4.2.2 to 4.2.3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4.2.2...v4.2.3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 6 +++--- .github/workflows/build-ubuntu-debug-python.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index a849c42612..cb83d89ee6 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -51,7 +51,7 @@ jobs: - name: Test for Mac Deps cache hit id: macdep-cache - uses: actions/cache@v4.2.2 + uses: actions/cache@v4.2.3 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} # The hash of all files in buildconfig manylinux-build and macdependencies is @@ -118,14 +118,14 @@ jobs: - uses: actions/checkout@v4.2.2 - name: pip cache - uses: actions/cache@v4.2.2 + uses: actions/cache@v4.2.3 with: path: ~/Library/Caches/pip # This cache path is only right on mac key: pip-cache-${{ matrix.macarch }}-${{ matrix.os }} - name: Fetch Mac deps id: macdep-cache - uses: actions/cache@v4.2.2 + uses: actions/cache@v4.2.3 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} key: macdep-${{ hashFiles('buildconfig/manylinux-build/**') }}-${{ hashFiles('buildconfig/macdependencies/*.sh') }}-${{ matrix.macarch }} diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/build-ubuntu-debug-python.yml index 49e309d55e..b1c24766e5 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/build-ubuntu-debug-python.yml @@ -84,7 +84,7 @@ jobs: - name: Cache debug python build id: cache-python - uses: actions/cache@v4.2.2 + uses: actions/cache@v4.2.3 with: key: ${{ matrix.python }} path: ~/.pyenv/versions/${{ matrix.python }}-debug/** From d97b113ca90a4bdd5a261a65ca341ba17c9ea29a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 06:08:43 +0000 Subject: [PATCH 132/441] Bump pypa/cibuildwheel from 2.23.1 to 2.23.2 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 2.23.1 to 2.23.2. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v2.23.1...v2.23.2) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index cb83d89ee6..cd039df4d5 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -137,7 +137,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.1 + uses: pypa/cibuildwheel@v2.23.2 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 65295e3cdb..4a9e5a8af1 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -93,7 +93,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v2.23.1 + uses: pypa/cibuildwheel@v2.23.2 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 32d9d1b9ce..8589dd5cba 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -62,7 +62,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.1 + uses: pypa/cibuildwheel@v2.23.2 - uses: actions/upload-artifact@v4 with: From bea207a3b72bff1f7bab623c634b7721d448f1e5 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:17:48 -0700 Subject: [PATCH 133/441] Fix CI by avoiding bugged version of pyproject-metadata package --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 2f89df124f..2506837f6f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ requires = [ "cython<=3.0.11", "sphinx<=8.1.3", "sphinx-autoapi<=3.3.2", + "pyproject-metadata!=0.9.1", ] build-backend = 'mesonpy' From 4b2a69fae38aac24f37349c8c8d6ee46df43dd33 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 8 Apr 2025 17:28:40 -0700 Subject: [PATCH 134/441] Add stubs __buffer__ and __release_buffer__ to pygame buffer types --- buildconfig/stubs/pygame/bufferproxy.pyi | 2 ++ buildconfig/stubs/pygame/color.pyi | 1 + buildconfig/stubs/pygame/mask.pyi | 2 ++ buildconfig/stubs/pygame/mixer.pyi | 2 ++ buildconfig/stubs/pygame/pixelarray.pyi | 1 + 5 files changed, 8 insertions(+) diff --git a/buildconfig/stubs/pygame/bufferproxy.pyi b/buildconfig/stubs/pygame/bufferproxy.pyi index 58624cabdb..e9c70346cd 100644 --- a/buildconfig/stubs/pygame/bufferproxy.pyi +++ b/buildconfig/stubs/pygame/bufferproxy.pyi @@ -13,5 +13,7 @@ class BufferProxy: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... def __init__(self, parent: Any) -> None: ... # TODO: parent: TypedDict | Protocol def write(self, buffer: bytes, offset: int = 0) -> None: ... diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 127c3225f7..fc11e7f0a1 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -21,6 +21,7 @@ class Color(Collection[int]): __hash__: ClassVar[None] # type: ignore[assignment] @property def __array_struct__(self) -> Any: ... + def __buffer__(self, flags: int, /) -> memoryview[int]: ... @overload def __init__(self, r: int, g: int, b: int, a: int = 255) -> None: ... @overload diff --git a/buildconfig/stubs/pygame/mask.pyi b/buildconfig/stubs/pygame/mask.pyi index 3dd1b109f2..47ab835330 100644 --- a/buildconfig/stubs/pygame/mask.pyi +++ b/buildconfig/stubs/pygame/mask.pyi @@ -53,6 +53,8 @@ class Mask: unsetcolor: Optional[ColorLike] = (0, 0, 0, 255), dest: Union[RectLike, Point] = (0, 0), ) -> Surface: ... + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... @deprecated("Use `Mask` instead (MaskType is an old alias)") class MaskType(Mask): ... diff --git a/buildconfig/stubs/pygame/mixer.pyi b/buildconfig/stubs/pygame/mixer.pyi index 445b3c77cf..985448f824 100644 --- a/buildconfig/stubs/pygame/mixer.pyi +++ b/buildconfig/stubs/pygame/mixer.pyi @@ -65,6 +65,8 @@ class Sound: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... def stop(self) -> None: ... def fadeout(self, time: int, /) -> None: ... def set_volume(self, value: float, /) -> None: ... diff --git a/buildconfig/stubs/pygame/pixelarray.pyi b/buildconfig/stubs/pygame/pixelarray.pyi index 5df752c495..e0a140e6a6 100644 --- a/buildconfig/stubs/pygame/pixelarray.pyi +++ b/buildconfig/stubs/pygame/pixelarray.pyi @@ -31,6 +31,7 @@ class PixelArray: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... + def __buffer__(self, flags: int, /) -> memoryview[int]: ... def __init__(self, surface: Surface) -> None: ... def __enter__(self) -> PixelArray: ... def __exit__(self, *args, **kwargs) -> None: ... From 41f11ed141c4dda6b5308a894f22bd322f8e8f26 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 8 Apr 2025 17:49:03 -0700 Subject: [PATCH 135/441] Fix Bufferyproxy.write stub buffer arg --- buildconfig/stubs/pygame/bufferproxy.pyi | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/bufferproxy.pyi b/buildconfig/stubs/pygame/bufferproxy.pyi index e9c70346cd..337a9ac7a5 100644 --- a/buildconfig/stubs/pygame/bufferproxy.pyi +++ b/buildconfig/stubs/pygame/bufferproxy.pyi @@ -16,4 +16,8 @@ class BufferProxy: def __buffer__(self, flags: int, /) -> memoryview[int]: ... def __release_buffer__(self, view: memoryview[int], /) -> None: ... def __init__(self, parent: Any) -> None: ... # TODO: parent: TypedDict | Protocol - def write(self, buffer: bytes, offset: int = 0) -> None: ... + def write( + self, + buffer: str | bytes, # See https://docs.python.org/3/c-api/arg.html at s# + offset: int = 0, + ) -> None: ... From 19ee3d4fe46b9764ed0a9e76dbba8decb12c0a09 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 8 Apr 2025 17:54:14 -0700 Subject: [PATCH 136/441] Use typing_extensions.Buffer in stubs --- buildconfig/stubs/pygame/image.pyi | 8 +++++--- buildconfig/stubs/pygame/mixer.pyi | 14 +++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 599ae07cb9..db44a8c4ea 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -3,9 +3,11 @@ from typing import Literal, Optional, Union from pygame.bufferproxy import BufferProxy from pygame.surface import Surface from pygame.typing import FileLike, IntPoint, Point -from typing_extensions import deprecated # added in 3.13 +from typing_extensions import ( + Buffer, # collections.abc 3.12 + deprecated, # added in 3.13 +) -_BufferLike = Union[BufferProxy, bytes, bytearray, memoryview] _from_buffer_format = Literal["P", "RGB", "BGR", "BGRA", "RGBX", "RGBA", "ARGB"] _to_bytes_format = Literal[ "P", "RGB", "RGBX", "RGBA", "ARGB", "BGRA", "ABGR", "RGBA_PREMULT", "ARGB_PREMULT" @@ -47,7 +49,7 @@ def frombytes( pitch: int = -1, ) -> Surface: ... def frombuffer( - buffer: _BufferLike, + buffer: Buffer, size: IntPoint, format: _from_buffer_format, pitch: int = -1, diff --git a/buildconfig/stubs/pygame/mixer.pyi b/buildconfig/stubs/pygame/mixer.pyi index 985448f824..658f09cf9c 100644 --- a/buildconfig/stubs/pygame/mixer.pyi +++ b/buildconfig/stubs/pygame/mixer.pyi @@ -1,9 +1,11 @@ from typing import Any, Optional, Union, overload -import numpy from pygame.event import Event from pygame.typing import FileLike -from typing_extensions import deprecated # added in 3.13 +from typing_extensions import ( + Buffer, # collections.abc 3.12 + deprecated, # added in 3.13 +) from . import mixer_music @@ -46,13 +48,7 @@ class Sound: @overload def __init__(self, file: FileLike) -> None: ... @overload - def __init__( - self, buffer: Any - ) -> None: ... # Buffer protocol is still not implemented in typing - @overload - def __init__( - self, array: numpy.ndarray - ) -> None: ... # Buffer protocol is still not implemented in typing + def __init__(self, buffer: Buffer) -> None: ... def play( self, loops: int = 0, From f9231b46e3aaecbf5a9bf973a89e16db417ffd91 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:42:31 -0700 Subject: [PATCH 137/441] Update dependencies SDL2 2.32.2 -> 2.32.4 SDL3 3.2.6 -> 3.2.10 SDL3_image 3.2.0 -> 3.2.4 SDL3_tff 3.2.0 -> 3.2.2 --- buildconfig/download_win_prebuilt.py | 32 +++++++++---------- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 6 ++-- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index edad5d3292..dd1e99e2dd 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,28 +78,28 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.2/SDL2-devel-2.32.2-VC.zip', - '08737e7e813443e47b663be4d91f8a4d8de6916b', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.4/SDL2-devel-2.32.4-VC.zip', + '7acde0592228113acdad3d264c246c6e92a512e4', ], [ - 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.6/SDL3-devel-3.2.6-VC.zip', - 'a36424427129f9ae133e59cfe070fc0b418d7fe0' + 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-VC.zip', + '7a17d6fc7aa509c0c020e16ca10f82d6b5c2fc57' ], [ 'https://github.com/pygame-community/SDL_image/releases/download/2.8.4-pgce/SDL2_image-devel-2.8.4-VCpgce.zip', 'b9b4a5d44cab57901003255a1c1f98a42282762b' ], [ - 'https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.0/SDL3_image-devel-3.2.0-VC.zip', - '2aebab1f803edfb708622fa4e1afc0afadcf5c8b' + 'https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.4/SDL3_image-devel-3.2.4-VC.zip', + 'd0db06c5dd2c7c6399e55332ff1dccd984914cb7' ], [ 'https://github.com/libsdl-org/SDL_ttf/releases/download/release-2.24.0/SDL2_ttf-devel-2.24.0-VC.zip', '2d18b9a4fc2ec0eee80de2a946b088d4e6efd0ee' ], [ - 'https://github.com/libsdl-org/SDL_ttf/releases/download/release-3.2.0/SDL3_ttf-devel-3.2.0-VC.zip', - '2883df767c9b8c910c10108242542ef36054a267' + 'https://github.com/libsdl-org/SDL_ttf/releases/download/release-3.2.2/SDL3_ttf-devel-3.2.2-VC.zip', + '3786bc016d89ca4cf9739e4d342ca29e3e29c137' ], [ 'https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.1/SDL2_mixer-devel-2.8.1-VC.zip', @@ -224,12 +224,12 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL3_image-devel-3.2.0-VC/SDL3_image-3.2.0' + 'SDL3_image-devel-3.2.4-VC/SDL3_image-3.2.4' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3_image-3.2.0' + 'SDL3_image-3.2.4' ) ) @@ -258,34 +258,34 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL3_ttf-devel-3.2.0-VC/SDL3_ttf-3.2.0' + 'SDL3_ttf-devel-3.2.2-VC/SDL3_ttf-3.2.2' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3_ttf-3.2.0' + 'SDL3_ttf-3.2.2' ) ) copy( os.path.join( temp_dir, - 'SDL2-devel-2.32.2-VC/SDL2-2.32.2' + 'SDL2-devel-2.32.4-VC/SDL2-2.32.4' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.32.2' + 'SDL2-2.32.4' ) ) copy( os.path.join( temp_dir, - 'SDL3-devel-3.2.6-VC/SDL3-3.2.6' + 'SDL3-devel-3.2.10-VC/SDL3-3.2.10' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3-3.2.6' + 'SDL3-3.2.10' ) ) diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index 34103c6349..55da303004 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.32.2" +SDL2_VER="2.32.4" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.4" IMG2="SDL2_image-$IMG2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index 110d13d866..dc4b3e3335 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -9a608974a69b97fd5589bf8feed4742498f8f07731bcd5b99dd518089acda8b9b4216197b6adf7ca79ef1a9fe47c542033eefe94763e66229b1d9ba5207da5c5 SDL2-2.32.2.tar.gz +36e2f9cc743703f03a4fa161b5a8134ded58be8952cd4a1e019ea013c744ece2ef83eac7a79257ee4ce9190dc79d33108cb6f2613d7f935aebe50af8be100a7b SDL2-2.32.4.tar.gz a4b7436442be43b96dc7b90c9badd011da1622e283ae068b82367fcb72b7dd7a0357aec5550fe44103a77da75b8c570d5204fff11a805373f2194f92b8f71343 SDL2_image-2.8.4.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index e6b9a3cf12..41802c5d71 100644 --- a/meson.build +++ b/meson.build @@ -109,10 +109,10 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.6' : '2.32.2' - sdl_image_ver = (sdl_api == 3) ? '3.2.0' : '2.8.4' + sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.4' + sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.4' sdl_mixer_ver = '2.8.1' - sdl_ttf_ver = (sdl_api == 3) ? '3.2.0' : '2.24.0' + sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' dlls = [] From d3a44071b6f9b8fd0cfed4e92636dbcfb0757444 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:06:08 -0700 Subject: [PATCH 138/441] Add version conditional to __buffer__ methods in stubs --- buildconfig/stubs/pygame/bufferproxy.pyi | 6 ++++-- buildconfig/stubs/pygame/color.pyi | 4 +++- buildconfig/stubs/pygame/mask.pyi | 6 ++++-- buildconfig/stubs/pygame/mixer.pyi | 6 ++++-- buildconfig/stubs/pygame/pixelarray.pyi | 3 ++- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/buildconfig/stubs/pygame/bufferproxy.pyi b/buildconfig/stubs/pygame/bufferproxy.pyi index 337a9ac7a5..3275ffac53 100644 --- a/buildconfig/stubs/pygame/bufferproxy.pyi +++ b/buildconfig/stubs/pygame/bufferproxy.pyi @@ -1,3 +1,4 @@ +import sys from typing import Any class BufferProxy: @@ -13,8 +14,9 @@ class BufferProxy: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... - def __buffer__(self, flags: int, /) -> memoryview[int]: ... - def __release_buffer__(self, view: memoryview[int], /) -> None: ... + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... def __init__(self, parent: Any) -> None: ... # TODO: parent: TypedDict | Protocol def write( self, diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index fc11e7f0a1..ab3560971c 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -1,3 +1,4 @@ +import sys from collections.abc import Collection, Iterator from typing import Any, ClassVar, SupportsIndex, Union, overload @@ -21,7 +22,8 @@ class Color(Collection[int]): __hash__: ClassVar[None] # type: ignore[assignment] @property def __array_struct__(self) -> Any: ... - def __buffer__(self, flags: int, /) -> memoryview[int]: ... + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview[int]: ... @overload def __init__(self, r: int, g: int, b: int, a: int = 255) -> None: ... @overload diff --git a/buildconfig/stubs/pygame/mask.pyi b/buildconfig/stubs/pygame/mask.pyi index 47ab835330..722b9c67cc 100644 --- a/buildconfig/stubs/pygame/mask.pyi +++ b/buildconfig/stubs/pygame/mask.pyi @@ -1,3 +1,4 @@ +import sys from typing import Any, Optional, Union from pygame.rect import Rect @@ -53,8 +54,9 @@ class Mask: unsetcolor: Optional[ColorLike] = (0, 0, 0, 255), dest: Union[RectLike, Point] = (0, 0), ) -> Surface: ... - def __buffer__(self, flags: int, /) -> memoryview[int]: ... - def __release_buffer__(self, view: memoryview[int], /) -> None: ... + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... @deprecated("Use `Mask` instead (MaskType is an old alias)") class MaskType(Mask): ... diff --git a/buildconfig/stubs/pygame/mixer.pyi b/buildconfig/stubs/pygame/mixer.pyi index 658f09cf9c..555375c1fd 100644 --- a/buildconfig/stubs/pygame/mixer.pyi +++ b/buildconfig/stubs/pygame/mixer.pyi @@ -1,3 +1,4 @@ +import sys from typing import Any, Optional, Union, overload from pygame.event import Event @@ -61,8 +62,9 @@ class Sound: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... - def __buffer__(self, flags: int, /) -> memoryview[int]: ... - def __release_buffer__(self, view: memoryview[int], /) -> None: ... + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview[int]: ... + def __release_buffer__(self, view: memoryview[int], /) -> None: ... def stop(self) -> None: ... def fadeout(self, time: int, /) -> None: ... def set_volume(self, value: float, /) -> None: ... diff --git a/buildconfig/stubs/pygame/pixelarray.pyi b/buildconfig/stubs/pygame/pixelarray.pyi index e0a140e6a6..c51e2fe1a4 100644 --- a/buildconfig/stubs/pygame/pixelarray.pyi +++ b/buildconfig/stubs/pygame/pixelarray.pyi @@ -31,7 +31,8 @@ class PixelArray: def __array_interface__(self) -> dict[str, Any]: ... @property def __array_struct__(self) -> Any: ... - def __buffer__(self, flags: int, /) -> memoryview[int]: ... + if sys.version_info >= (3, 12): + def __buffer__(self, flags: int, /) -> memoryview[int]: ... def __init__(self, surface: Surface) -> None: ... def __enter__(self) -> PixelArray: ... def __exit__(self, *args, **kwargs) -> None: ... From 43c55c96151c42209d7abe37886bb23286237f85 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Fri, 11 Apr 2025 16:24:16 +0200 Subject: [PATCH 139/441] Fix CI --- buildconfig/stubs/pygame/display.pyi | 3 ++- buildconfig/stubs/pygame/draw.pyi | 2 +- buildconfig/stubs/pygame/surface.pyi | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index b148536e50..8aed5fea80 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -310,7 +310,8 @@ def update(rectangles: Iterable[Optional[RectLike]], /) -> None: ... @overload def update(x: float, y: float, w: float, h: float, /) -> None: ... @overload -def update(xy: Point, wh: Point, /) -> None: +def update(xy: Point, wh: Point, /) -> None: ... +def update(*args): # type: ignore """Update all, or a portion, of the display. For non-OpenGL displays. For non OpenGL display Surfaces, this function is very similar to diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 81005b708b..c3c88aca81 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -231,7 +231,7 @@ def aacircle( draw_bottom_left: bool = False, draw_bottom_right: bool = False, ) -> Rect: ... -def aacircle(*args, **kwargs): +def aacircle(*args, **kwargs): # type: ignore """Draw an antialiased circle. Draws an antialiased circle on the given surface. diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index 404e07ea30..eb7e1dfb9f 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -290,7 +290,7 @@ class Surface: def convert(self, masks: ColorLike, flags: int = 0, /) -> Surface: ... @overload def convert(self) -> Surface: ... - def convert(self, *args): + def convert(self, *args): # type: ignore """Change the pixel format of a surface. Creates a new copy of the Surface with the pixel format changed. The new @@ -401,7 +401,7 @@ class Surface: def set_colorkey(self, color: ColorLike, flags: int = 0, /) -> None: ... @overload def set_colorkey(self, color: None, /) -> None: ... - def set_colorkey(self, *args): + def set_colorkey(self, *args): # type: ignore """Set the transparent colorkey. Set the current color key for the Surface. When blitting this Surface @@ -429,7 +429,7 @@ class Surface: def set_alpha(self, value: int, flags: int = 0, /) -> None: ... @overload def set_alpha(self, value: None, /) -> None: ... - def set_alpha(self, *args): + def set_alpha(self, *args): # type: ignore """Set the alpha value for the full Surface. Set the current alpha value for the Surface. When blitting this Surface @@ -679,7 +679,7 @@ class Surface: def subsurface( self, left: float, top: float, width: float, height: float, / ) -> Surface: ... - def subsurface(self, *args): + def subsurface(self, *args): # type: ignore """Create a new surface that references its parent. Returns a new Surface that shares its pixels with its new parent. The new From 812a1a4a291dfeac5b8ba9547010110250971c8e Mon Sep 17 00:00:00 2001 From: Marcell Perger <102254594+MarcellPerger1@users.noreply.github.com> Date: Sat, 12 Apr 2025 18:56:36 +0100 Subject: [PATCH 140/441] Merge pull request #3321 from MarcellPerger1/group-draw-special-flags Add `special_flags` to `Group.draw()` --- buildconfig/stubs/pygame/sprite.pyi | 4 +- docs/reST/ref/sprite.rst | 27 ++++++++++---- src_c/doc/sprite_doc.h | 8 ++-- src_py/sprite.py | 57 ++++++++++++++++++++--------- 4 files changed, 65 insertions(+), 31 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index d601363259..90a72bb50c 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -165,7 +165,7 @@ class AbstractGroup(Generic[_TSprite]): self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] ) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def draw(self, surface: Surface) -> list[Union[FRect, Rect]]: ... + def draw(self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0) -> list[Union[FRect, Rect]]: ... def clear( self, surface: Surface, @@ -226,7 +226,7 @@ class LayeredUpdates(AbstractGroup[_TSprite]): class LayeredDirty(LayeredUpdates[_TDirtySprite]): def __init__(self, *sprites: _TDirtySprite, **kwargs: Any) -> None: ... def draw( - self, surface: Surface, bgd: Optional[Surface] = None + self, surface: Surface, bgd: Optional[Surface] = None, special_flags: Optional[int] = None ) -> list[Union[FRect, Rect]]: ... # clear breaks Liskov substitution principle in code def clear(self, surface: Surface, bgd: Surface) -> None: ... # type: ignore[override] diff --git a/docs/reST/ref/sprite.rst b/docs/reST/ref/sprite.rst index a1e96a71c9..16583d9690 100644 --- a/docs/reST/ref/sprite.rst +++ b/docs/reST/ref/sprite.rst @@ -291,14 +291,18 @@ Sprites are not thread safe. So lock them yourself if using threads. .. method:: draw | :sl:`blit the Sprite images` - | :sg:`draw(Surface) -> list[Rect]` + | :sg:`draw(Surface, bgd=None, special_flags=0) -> list[Rect]` Draws the contained Sprites to the Surface argument. This uses the ``Sprite.image`` attribute for the source surface, and ``Sprite.rect`` - for the position. + for the position. ``special_flags`` is passed to ``Surface.blit()``. + ``bgd`` is unused in this method but ``LayeredDirty.draw()`` uses + it. The Group keeps sprites in the order they were added, they will be drawn in this order. + .. versionchanged:: 2.5.4 Added the ``bgd`` and ``special_flags`` arguments + .. ## Group.draw ## .. method:: clear @@ -347,18 +351,22 @@ Sprites are not thread safe. So lock them yourself if using threads. .. method:: draw | :sl:`blit the Sprite images and track changed areas` - | :sg:`draw(surface) -> Rect_list` + | :sg:`draw(surface, bgd=None, special_flags=0) -> Rect_list` Draws all the Sprites to the surface, the same as ``Group.draw()``. This method also returns a list of Rectangular areas on the screen that have been changed. The returned changes include areas of the screen that have - been affected by previous ``Group.clear()`` calls. + been affected by previous ``Group.clear()`` calls. ``special_flags`` is + passed to ``Surface.blit()``. ``bgd`` is unused in this method but + ``LayeredDirty.draw()`` uses it. The returned Rect list should be passed to ``pygame.display.update()``. This will help performance on software driven display modes. This type of updating is usually only helpful on destinations with non-animating backgrounds. + .. versionchanged:: 2.5.4 Added the ``bgd`` and ``special_flags`` arguments + .. ## RenderUpdates.draw ## .. ## pygame.sprite.RenderUpdates ## @@ -403,7 +411,9 @@ Sprites are not thread safe. So lock them yourself if using threads. .. method:: draw | :sl:`draw all sprites in the right order onto the passed surface.` - | :sg:`draw(surface) -> Rect_list` + | :sg:`draw(surface, bgd=None, special_flags=0) -> Rect_list` + + .. versionchanged:: 2.5.4 Added the ``bgd`` and ``special_flags`` arguments .. ## LayeredUpdates.draw ## @@ -551,10 +561,13 @@ Sprites are not thread safe. So lock them yourself if using threads. .. method:: draw | :sl:`draw all sprites in the right order onto the passed surface.` - | :sg:`draw(surface, bgd=None) -> Rect_list` + | :sg:`draw(surface, bgd=None, special_flags=None) -> Rect_list` You can pass the background too. If a background is already set, then the - bgd argument has no effect. + bgd argument has no effect. ``special_flags`` is passed to + ``Surface.blit()``. + + .. versionchanged:: 2.5.4 Added the ``special_flags`` argument .. ## LayeredDirty.draw ## diff --git a/src_c/doc/sprite_doc.h b/src_c/doc/sprite_doc.h index 857f1c6d70..457ac3c56a 100644 --- a/src_c/doc/sprite_doc.h +++ b/src_c/doc/sprite_doc.h @@ -15,15 +15,15 @@ #define DOC_SPRITE_GROUP_REMOVE "remove(*sprites) -> None\nremove Sprites from the Group" #define DOC_SPRITE_GROUP_HAS "has(*sprites) -> bool\ntest if a Group contains Sprites" #define DOC_SPRITE_GROUP_UPDATE "update(*args, **kwargs) -> None\ncall the update method on contained Sprites" -#define DOC_SPRITE_GROUP_DRAW "draw(Surface) -> list[Rect]\nblit the Sprite images" +#define DOC_SPRITE_GROUP_DRAW "draw(Surface, bgd=None, special_flags=0) -> list[Rect]\nblit the Sprite images" #define DOC_SPRITE_GROUP_CLEAR "clear(Surface_dest, background) -> None\ndraw a background over the Sprites" #define DOC_SPRITE_GROUP_EMPTY "empty() -> None\nremove all Sprites" #define DOC_SPRITE_RENDERUPDATES "RenderUpdates(*sprites) -> RenderUpdates\nGroup sub-class that tracks dirty updates." -#define DOC_SPRITE_RENDERUPDATES_DRAW "draw(surface) -> Rect_list\nblit the Sprite images and track changed areas" +#define DOC_SPRITE_RENDERUPDATES_DRAW "draw(surface, bgd=None, special_flags=0) -> Rect_list\nblit the Sprite images and track changed areas" #define DOC_SPRITE_LAYEREDUPDATES "LayeredUpdates(*sprites, **kwargs) -> LayeredUpdates\nLayeredUpdates is a sprite group that handles layers and draws like RenderUpdates." #define DOC_SPRITE_LAYEREDUPDATES_ADD "add(*sprites, **kwargs) -> None\nadd a sprite or sequence of sprites to a group" #define DOC_SPRITE_LAYEREDUPDATES_SPRITES "sprites() -> sprites\nreturns an ordered list of sprites (first back, last top)." -#define DOC_SPRITE_LAYEREDUPDATES_DRAW "draw(surface) -> Rect_list\ndraw all sprites in the right order onto the passed surface." +#define DOC_SPRITE_LAYEREDUPDATES_DRAW "draw(surface, bgd=None, special_flags=0) -> Rect_list\ndraw all sprites in the right order onto the passed surface." #define DOC_SPRITE_LAYEREDUPDATES_GETSPRITESAT "get_sprites_at(pos) -> colliding_sprites\nreturns a list with all sprites at that position." #define DOC_SPRITE_LAYEREDUPDATES_GETSPRITE "get_sprite(idx) -> sprite\nreturns the sprite at the index idx from the groups sprites" #define DOC_SPRITE_LAYEREDUPDATES_REMOVESPRITESOFLAYER "remove_sprites_of_layer(layer_nr) -> sprites\nremoves all sprites from a layer and returns them as a list." @@ -38,7 +38,7 @@ #define DOC_SPRITE_LAYEREDUPDATES_GETSPRITESFROMLAYER "get_sprites_from_layer(layer) -> sprites\nreturns all sprites from a layer, ordered by how they where added" #define DOC_SPRITE_LAYEREDUPDATES_SWITCHLAYER "switch_layer(layer1_nr, layer2_nr) -> None\nswitches the sprites from layer1 to layer2" #define DOC_SPRITE_LAYEREDDIRTY "LayeredDirty(*sprites, **kwargs) -> LayeredDirty\nLayeredDirty group is for DirtySprite objects. Subclasses LayeredUpdates." -#define DOC_SPRITE_LAYEREDDIRTY_DRAW "draw(surface, bgd=None) -> Rect_list\ndraw all sprites in the right order onto the passed surface." +#define DOC_SPRITE_LAYEREDDIRTY_DRAW "draw(surface, bgd=None, special_flags=None) -> Rect_list\ndraw all sprites in the right order onto the passed surface." #define DOC_SPRITE_LAYEREDDIRTY_CLEAR "clear(surface, bgd) -> None\nused to set background" #define DOC_SPRITE_LAYEREDDIRTY_REPAINTRECT "repaint_rect(screen_rect) -> None\nrepaints the given area" #define DOC_SPRITE_LAYEREDDIRTY_SETCLIP "set_clip(screen_rect=None) -> None\nclip the area where to draw. Just pass None (default) to reset the clip" diff --git a/src_py/sprite.py b/src_py/sprite.py index 2075a5f1b2..0c36801b58 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -555,10 +555,10 @@ def update(self, *args, **kwargs): for sprite in self.sprites(): sprite.update(*args, **kwargs) - def draw(self, surface): + def draw(self, surface, bgd=None, special_flags=0): # noqa pylint: disable=unused-argument; bgd arg used in LayeredDirty """draw all sprites onto the surface - Group.draw(surface): return Rect_list + Group.draw(surface, bgd=None, special_flags=0): return Rect_list Draws all of the member sprites onto the given surface. @@ -566,11 +566,18 @@ def draw(self, surface): sprites = self.sprites() if hasattr(surface, "blits"): self.spritedict.update( - zip(sprites, surface.blits((spr.image, spr.rect) for spr in sprites)) + zip( + sprites, + surface.blits( + (spr.image, spr.rect, None, special_flags) for spr in sprites + ), + ) ) else: for spr in sprites: - self.spritedict[spr] = surface.blit(spr.image, spr.rect) + self.spritedict[spr] = surface.blit( + spr.image, spr.rect, None, special_flags + ) self.lostsprites = [] dirty = self.lostsprites @@ -685,14 +692,14 @@ class RenderUpdates(Group): """ - def draw(self, surface): + def draw(self, surface, bgd=None, special_flags=0): surface_blit = surface.blit dirty = self.lostsprites self.lostsprites = [] dirty_append = dirty.append for sprite in self.sprites(): old_rect = self.spritedict[sprite] - new_rect = surface_blit(sprite.image, sprite.rect) + new_rect = surface_blit(sprite.image, sprite.rect, None, special_flags) if old_rect: if new_rect.colliderect(old_rect): dirty_append(new_rect.union(old_rect)) @@ -854,10 +861,10 @@ def sprites(self): """ return self._spritelist.copy() - def draw(self, surface): + def draw(self, surface, bgd=None, special_flags=0): """draw all sprites in the right order onto the passed surface - LayeredUpdates.draw(surface): return Rect_list + LayeredUpdates.draw(surface, bgd=None, special_flags=0): return Rect_list """ spritedict = self.spritedict @@ -868,7 +875,7 @@ def draw(self, surface): init_rect = self._init_rect for spr in self.sprites(): rec = spritedict[spr] - newrect = surface_blit(spr.image, spr.rect) + newrect = surface_blit(spr.image, spr.rect, None, special_flags) if rec is init_rect: dirty_append(newrect) else: @@ -1127,13 +1134,16 @@ def add_internal(self, sprite, layer=None): LayeredUpdates.add_internal(self, sprite, layer) - def draw(self, surface, bgd=None): # noqa pylint: disable=arguments-differ; unable to change public interface + def draw(self, surface, bgd=None, special_flags=None): """draw all sprites in the right order onto the given surface - LayeredDirty.draw(surface, bgd=None): return Rect_list + LayeredDirty.draw(surface, bgd=None, special_flags=0): return Rect_list You can pass the background too. If a self.bgd is already set to some value that is not None, then the bgd argument has no effect. + Passing a value to special_flags will pass that value as the + special_flags argument to all Surface.blit calls, overriding + the sprite.blendmode attribute. """ # functions and classes assigned locally to speed up loops @@ -1173,21 +1183,29 @@ def draw(self, surface, bgd=None): # noqa pylint: disable=arguments-differ; una # clear using background if local_bgd is not None: + flags = 0 if special_flags is None else special_flags for rec in local_update: - surf_blit_func(local_bgd, rec, rec) + surf_blit_func(local_bgd, rec, rec, flags) # 2. draw self._draw_dirty_internal( - local_old_rect, rect_type, local_sprites, surf_blit_func, local_update + local_old_rect, + rect_type, + local_sprites, + surf_blit_func, + local_update, + special_flags, ) local_ret = list(local_update) else: # flip, full screen mode if local_bgd is not None: - surf_blit_func(local_bgd, (0, 0)) + flags = 0 if special_flags is None else special_flags + surf_blit_func(local_bgd, (0, 0), None, flags) for spr in local_sprites: if spr.visible: + flags = spr.blendmode if special_flags is None else special_flags local_old_rect[spr] = surf_blit_func( - spr.image, spr.rect, spr.source_rect, spr.blendmode + spr.image, spr.rect, spr.source_rect, flags ) # return only the part of the screen changed local_ret = [rect_type(latest_clip)] @@ -1209,8 +1227,11 @@ def draw(self, surface, bgd=None): # noqa pylint: disable=arguments-differ; una return local_ret @staticmethod - def _draw_dirty_internal(_old_rect, _rect, _sprites, _surf_blit, _update): + def _draw_dirty_internal( + _old_rect, _rect, _sprites, _surf_blit, _update, _special_flags + ): for spr in _sprites: + flags = spr.blendmode if _special_flags is None else _special_flags if spr.dirty < 1 and spr.visible: # sprite not dirty; blit only the intersecting part if spr.source_rect is not None: @@ -1238,12 +1259,12 @@ def _draw_dirty_internal(_old_rect, _rect, _sprites, _surf_blit, _update): clip[2], clip[3], ), - spr.blendmode, + flags, ) else: # dirty sprite if spr.visible: _old_rect[spr] = _surf_blit( - spr.image, spr.rect, spr.source_rect, spr.blendmode + spr.image, spr.rect, spr.source_rect, flags ) if spr.dirty == 1: spr.dirty = 0 From 55771539ec53539ca6ff88b3d6cff201305f94a2 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 13 Apr 2025 00:20:29 +0530 Subject: [PATCH 141/441] Run `pre-commit autoupdate` --- .pre-commit-config.yaml | 6 ++-- buildconfig/stubs/pygame/sprite.pyi | 9 +++-- src_c/.clang-format | 1 - src_c/freetype/ft_layout.c | 2 +- src_c/freetype/ft_wrap.c | 51 +++++++++++++++-------------- src_c/include/_pygame.h | 2 +- 6 files changed, 38 insertions(+), 33 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e47cd77211..47597c7a4f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: end-of-file-fixer exclude: | @@ -26,7 +26,7 @@ repos: )$ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.2 + rev: v0.11.5 hooks: # See pyproject.toml for configuration options. - id: ruff name: ruff-sort-imports @@ -35,7 +35,7 @@ repos: types_or: [ python, pyi, jupyter ] - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.4 + rev: v20.1.0 hooks: - id: clang-format exclude: | diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 90a72bb50c..c3b7ece936 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -165,7 +165,9 @@ class AbstractGroup(Generic[_TSprite]): self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] ) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def draw(self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0) -> list[Union[FRect, Rect]]: ... + def draw( + self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 + ) -> list[Union[FRect, Rect]]: ... def clear( self, surface: Surface, @@ -226,7 +228,10 @@ class LayeredUpdates(AbstractGroup[_TSprite]): class LayeredDirty(LayeredUpdates[_TDirtySprite]): def __init__(self, *sprites: _TDirtySprite, **kwargs: Any) -> None: ... def draw( - self, surface: Surface, bgd: Optional[Surface] = None, special_flags: Optional[int] = None + self, + surface: Surface, + bgd: Optional[Surface] = None, + special_flags: Optional[int] = None, ) -> list[Union[FRect, Rect]]: ... # clear breaks Liskov substitution principle in code def clear(self, surface: Surface, bgd: Surface) -> None: ... # type: ignore[override] diff --git a/src_c/.clang-format b/src_c/.clang-format index 1f6a6ac97c..defc239cac 100644 --- a/src_c/.clang-format +++ b/src_c/.clang-format @@ -10,7 +10,6 @@ DerivePointerAlignment: false InsertBraces: true # These settings are mirrored in .editorconfig. Keep them in sync. IndentWidth: 4 -Language: Cpp PointerAlignment: Right ReflowComments: true SpaceBeforeParens: ControlStatements diff --git a/src_c/freetype/ft_layout.c b/src_c/freetype/ft_layout.c index 7355207c96..8d4cfd917f 100644 --- a/src_c/freetype/ft_layout.c +++ b/src_c/freetype/ft_layout.c @@ -33,7 +33,7 @@ #define FX16_WIDE_FACTOR (FX16_ONE / 12) #define SLANT_FACTOR 0.22 -static FT_Matrix slant_matrix = {FX16_ONE, (FT_Fixed)(SLANT_FACTOR *FX16_ONE), +static FT_Matrix slant_matrix = {FX16_ONE, (FT_Fixed)(SLANT_FACTOR * FX16_ONE), 0, FX16_ONE}; static FT_Matrix unit_matrix = {FX16_ONE, 0, 0, FX16_ONE}; diff --git a/src_c/freetype/ft_wrap.c b/src_c/freetype/ft_wrap.c index 50afd3bced..708e9832d5 100644 --- a/src_c/freetype/ft_wrap.c +++ b/src_c/freetype/ft_wrap.c @@ -38,7 +38,8 @@ ft_wrap_quit(pgFontObject *); * *********************************************************/ void -_PGFT_SetError(FreeTypeInstance *ft, const char *error_msg, FT_Error error_id){ +_PGFT_SetError(FreeTypeInstance *ft, const char *error_msg, FT_Error error_id) +{ #undef __FTERRORS_H__ #define FT_ERRORDEF(e, v, s) {e, s}, #define FT_ERROR_START_LIST { @@ -48,37 +49,37 @@ _PGFT_SetError(FreeTypeInstance *ft, const char *error_msg, FT_Error error_id){ } \ } \ ; - static const struct {int err_code; -const char *err_msg; -} -ft_errors[] = + static const struct { + int err_code; + const char *err_msg; + } ft_errors[] = #include FT_ERRORS_H - const int maxlen = (int)(sizeof(ft->_error_msg)) - 1; -int i; -const char *ft_msg; + const int maxlen = (int)(sizeof(ft->_error_msg)) - 1; + int i; + const char *ft_msg; -ft_msg = 0; -for (i = 0; ft_errors[i].err_msg; ++i) { - if (error_id == ft_errors[i].err_code) { - ft_msg = ft_errors[i].err_msg; - break; + ft_msg = 0; + for (i = 0; ft_errors[i].err_msg; ++i) { + if (error_id == ft_errors[i].err_code) { + ft_msg = ft_errors[i].err_msg; + break; + } } -} -if (error_id && ft_msg) { - int ret = PyOS_snprintf(ft->_error_msg, sizeof(ft->_error_msg), "%.*s: %s", - maxlen - 3, error_msg, ft_msg); - if (ret >= 0) { - /* return after successfully copying full or truncated error. - * If ret < 0, PyOS_snprintf failed so try to strncpy error - * message */ - return; + if (error_id && ft_msg) { + int ret = PyOS_snprintf(ft->_error_msg, sizeof(ft->_error_msg), + "%.*s: %s", maxlen - 3, error_msg, ft_msg); + if (ret >= 0) { + /* return after successfully copying full or truncated error. + * If ret < 0, PyOS_snprintf failed so try to strncpy error + * message */ + return; + } } -} -strncpy(ft->_error_msg, error_msg, maxlen); -ft->_error_msg[maxlen] = '\0'; /* in case of message truncation */ + strncpy(ft->_error_msg, error_msg, maxlen); + ft->_error_msg[maxlen] = '\0'; /* in case of message truncation */ } const char * diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index f1439393a4..6f9942cb6c 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -184,7 +184,7 @@ typedef struct pg_bufferinfo_s { (*(int (*)(void))PYGAMEAPI_GET_SLOT(base, 23)) #define pg_GetDefaultConvertFormat \ - (*(PG_PixelFormatEnum(*)(void))PYGAMEAPI_GET_SLOT(base, 27)) + (*(PG_PixelFormatEnum (*)(void))PYGAMEAPI_GET_SLOT(base, 27)) #define pg_SetDefaultConvertFormat \ (*(void (*)(Uint32))PYGAMEAPI_GET_SLOT(base, 28)) From e003a0ae222f1cbf700e288b2e8540485e4967f2 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 12 Apr 2025 12:36:30 -0700 Subject: [PATCH 142/441] Update to SDL2_image 2.8.8 --- buildconfig/download_win_prebuilt.py | 8 ++++---- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../manylinux-build/docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index dd1e99e2dd..35abaaeeb5 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -86,8 +86,8 @@ def get_urls(x86=True, x64=True): '7a17d6fc7aa509c0c020e16ca10f82d6b5c2fc57' ], [ - 'https://github.com/pygame-community/SDL_image/releases/download/2.8.4-pgce/SDL2_image-devel-2.8.4-VCpgce.zip', - 'b9b4a5d44cab57901003255a1c1f98a42282762b' + 'https://github.com/pygame-community/SDL_image/releases/download/2.8.8-pgce/SDL2_image-devel-2.8.8-VCpgce.zip', + '8cd149cbaae2d362f2eaa69483d992e79f4836f5' ], [ 'https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.4/SDL3_image-devel-3.2.4-VC.zip', @@ -213,12 +213,12 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL2_image-devel-2.8.4-VCpgce/SDL2_image-2.8.4' + 'SDL2_image-devel-2.8.8-VCpgce/SDL2_image-2.8.8' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2_image-2.8.4' + 'SDL2_image-2.8.8' ) ) copy( diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index 55da303004..599f3f5a2a 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -5,7 +5,7 @@ cd $(dirname `readlink -f "$0"`) SDL2_VER="2.32.4" SDL2="SDL2-$SDL2_VER" -IMG2_VER="2.8.4" +IMG2_VER="2.8.8" IMG2="SDL2_image-$IMG2_VER" TTF2_VER="2.24.0" TTF2="SDL2_ttf-$TTF2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index dc4b3e3335..04dfc0962d 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ 36e2f9cc743703f03a4fa161b5a8134ded58be8952cd4a1e019ea013c744ece2ef83eac7a79257ee4ce9190dc79d33108cb6f2613d7f935aebe50af8be100a7b SDL2-2.32.4.tar.gz -a4b7436442be43b96dc7b90c9badd011da1622e283ae068b82367fcb72b7dd7a0357aec5550fe44103a77da75b8c570d5204fff11a805373f2194f92b8f71343 SDL2_image-2.8.4.tar.gz +5c521ae6a053e1eb6b42dce3ccccdbdb353eb7e9d1bd89392b1913bfc9fbb6b8a9d5506c80e5b7924b51637bb95cd270657ca87dafe60edd5534e333524bc901 SDL2_image-2.8.8.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index 41802c5d71..96a721a74a 100644 --- a/meson.build +++ b/meson.build @@ -110,7 +110,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') endif sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.4' - sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.4' + sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' From 22ccf842158b8f484117661ca240c398a3209c12 Mon Sep 17 00:00:00 2001 From: XFajk Date: Mon, 14 Apr 2025 11:50:20 +0200 Subject: [PATCH 143/441] implemented the Line.project method with all the tests and docs --- buildconfig/stubs/pygame/geometry.pyi | 1 + docs/reST/ref/code_examples/project1.png | Bin 0 -> 3471 bytes docs/reST/ref/code_examples/project2.png | Bin 0 -> 4016 bytes docs/reST/ref/code_examples/project3.png | Bin 0 -> 4490 bytes docs/reST/ref/geometry.rst | 28 ++++++ src_c/doc/geometry_doc.h | 1 + src_c/line.c | 114 +++++++++++++++++++++++ test/geometry_test.py | 19 ++++ 8 files changed, 163 insertions(+) create mode 100644 docs/reST/ref/code_examples/project1.png create mode 100644 docs/reST/ref/code_examples/project2.png create mode 100644 docs/reST/ref/code_examples/project3.png diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 43724816ec..8e3d22202e 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -197,3 +197,4 @@ class Line: def scale_ip(self, factor_and_origin: Point, /) -> None: ... def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... + def project(self, point: Point, do_clamp: bool = False) -> Point: ... diff --git a/docs/reST/ref/code_examples/project1.png b/docs/reST/ref/code_examples/project1.png new file mode 100644 index 0000000000000000000000000000000000000000..dccd5221c92dc74b8db0d943e422c6a6bfe4eb90 GIT binary patch literal 3471 zcmd^C>0eXF8lI3y5`+eb3u_W~6nE5u!XXG0kR?FvjZj1=)}T-Yx!4#F5-}xMfhghv zt--BIWwTWg>q2r|(AqXoD2P=_3JQwKK|qg)c;DE2zuZ6Iez_m=o4oTb&&=~aGv_xu zW1>SX%^(95k223mGp=rUCIo5N!;7?QxKK!ko!O&(8~ z1U5S}EIu2d53U-2wC0UfYoL;AcyQnfY0|U%{-qA_Q{}C5zK|ErCr`5)G;=g5hkQ;? zZV)CLQX&~%Hf0sd%MSfqBYQo(ZO}JbTvfe%_Q~hdUvD_cYr;oq$Wn8lPmJUSHXjMh z4RoY%!jXKQf`cpzNE#w6F(kAhn1~fbA(X=UKMFF^gPWrj^yljhuvPhqt{y`) zjP7jSCeXsd5OVikl6KhkrSxVLg<=lrk4%9Yi}IDfL+WqIWBg}azg}2yW9K*h<$S=#1KYF zHa?0R5vKfGdYQLIsvn1L^LJctjiGOyrTu#zu0RgGUsQ-vb=qmJd$)>OR+ALVzZ`WV!KVl8QoM@)*_oVSc-b^Ss-aT7O zw*aQ5aMaB`L(i(Mg4YpDL1TOWg#k02gTHrbVX1;6jQMVd#2v2+rx2r!;Hi$yS#O1* zz%n!SjP*s+65McPDt=+6N}ZM90e?Rk3rlx|%!2(azMQr%De=KBb$M)%mx7}aE@$d` zSB*p#*(CterZHnH(@U-WB5qjB28JE0t^D?u<*G-si|iACuO;mXWMoH=t6Rz8g$8=d zo&>G8ueJY~+D@CL?XKXCP0iY}*OyfUxNJ`dWSLn9HIx1?K{rFTc@#uc!Q3h^}i-mTTIhK0A@IH+HSd$jIj<>RTOK?E>0i zVrIIV)ZO=}WOMH+PA|x8=BdlgXUe=~?u2q0Y|Bi>Qr|k{vW#jmG0b|x0J~P*{$J;Drygwe^G2N-slOUy(Ey9{JE>Lj4Zc_ z=mp@#EOmNZPhXg;))6Y^`>WIUJ9$IJI~m0e;#^N?H|{2_`}6B>A>%m4sk6p}Y59E^ zq2#gn0#|Kzlb69e9_vhVhNG-V&GJ>{^k&T8R0T*WEcN(<>#99LaOQ2)skJ{Q{m0m^ z|6by??R|&k28ilNNiA!cY@nM5k-ZY7@&TKl%$jx}@9gv$!_5;f-pn|r2fZZN&luKa zw9n^a!cK-x6=(AK?dq(|UjI*Ry#^|~8dIHd`5fPlyPFrw+(WNQwoOzI{^5$>f!R8i zI#+yD@?wL-tnR$G_d0r-t5V$|n5FJ~c~mm!GSNTm(U$%oH}978NC?49tI%&5%((Wn zOSWoxJBu$9;PSQciP2}K&acPrt`5fvd

    yYb${s+M71n2(5E;_Uo5c;fa$W% zlSR9d2+5dlannHsXZOC;+HIG1RmKu05BRun4D>Zl(lM?R-Y`*oBY76VY}}`RELM=^ zBcyjJ+=Cmy>wy;vDRdw{k$1J4^yT_<4MFJ&PG*JP_VzyVv72n|?aEG@BDlwtZ1w#6 zw%A9LYoYrKw)&-Vv0$L(JVRtIxhfgRdGFB7(Q-s)zl=dap%Xq}%!?&Uqp1{55IL?uZS*OR~WI6cfQvX(jF z0#B`XL$z3zyn{>wzEUzLcUmF4p3srDyUD^kQp2^a@NH zEq%9&++MIU(e!2nC8RSrLR*44b5qTvnEm8-GcX+qrWpk1u=$=sQscu@HJ`7)A*obw z)~wC4y)i#j_Y3P8RET77ibAOo5vBRnAzgdNA!js-(nLZ28wCeWH5zlm^{!fa3t)Qy zSpQyfyAiBg!Ew#3ne;S%;_Hih?qUY|TozC7`0C~3UF3F)d}f#%KIV)k2a+hX_NwHw zvkeiHX7BaS_2vfnk_JihnTb{9R!tFV*d;$QDy;oWGQgv6G63DK=3Do z@)3BSJL75l{b6*+;SA6OfbI=7;BKuj*05G^K7pv^*4PRsDXI#jV#@q^@gGWQ!e5@p$?6>-%dfz8AMO5ZeEnQfx;GDPeLuaF@%yNJO zQTRlWsKwrJH6@=ZPh#^+0Y>J5hkcf1d${JY_ryx4tE<8w^-@Z*Sdi>lC83&==1@>bMnF&H}Qt+eg*pg>tC0nO$k$ z)kBjvzzClH9pnWeiG-^aIyR&n77=|2wv@}o*nn3QNL@;So>|S>m}#?RWOAh=FdN%g zJ^Uph2_ezEiX7?}XLmWd<;P~a=4QiRp%er3TS)8?>q#StJ*Px1dmb%pe3v|mx3dJ;&SYbrq8L1 zWLC{2v?aK)N%Wz?MT!KKqmGBZ61jo%1sB@~ZScGuD|VZ9fF^gSFf*d`wg*!_9VT*Y zd}3ps3>$mCI&b35aO|5?N>#NVYPnLYj~{T7S8$B6qsJM#gxj={hp*51eoPkfP*q># zNaSx<>J(25XG-ji)qd}-KSM`3_p|;uaoweUt?DOa6#9QX3^bg&Iqv6WbKwO4{cMPm z)ZcB)_C_t=9kXiNG!l7FV~N6EJULNN%hbX3hf;i=nEa2P6aoyJV3wN2q;y|s*a?p) N6dn>CT(>Ma|6k(roG<_Y literal 0 HcmV?d00001 diff --git a/docs/reST/ref/code_examples/project2.png b/docs/reST/ref/code_examples/project2.png new file mode 100644 index 0000000000000000000000000000000000000000..51ca189590babcbdfbf20d723bb1085c480aa9f6 GIT binary patch literal 4016 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 Zo#-)<`iCe#>q~fLBe{Qw?5I?o_HX&r$~pi5 literal 0 HcmV?d00001 diff --git a/docs/reST/ref/code_examples/project3.png b/docs/reST/ref/code_examples/project3.png new file mode 100644 index 0000000000000000000000000000000000000000..f54a85c2cd8b51b5927e922c93ce98196cc4fb6b GIT binary patch literal 4490 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 P_v5+9dttF#;Qs#r;$K point` + + Returns a new point(tuple[float, float]) that is projected onto the line like so + + .. figure:: code_examples/project1.png + :alt: project method image + + Example of what project method does if you input the green point you get back the yellow one. + + + .. figure:: code_examples/project2.png + :alt: project do_clamp=False image + + Example of what the do_clamp argument does when it is False + + + .. figure:: code_examples/project1.png + :alt: project do_clamp=True image + + Example of what the do_clamp argument does when it is True + + .. versionadded:: 2.5.4 + + .. ## Line.project ## diff --git a/src_c/doc/geometry_doc.h b/src_c/doc/geometry_doc.h index 7873df226f..3dce1dec6b 100644 --- a/src_c/doc/geometry_doc.h +++ b/src_c/doc/geometry_doc.h @@ -45,3 +45,4 @@ #define DOC_LINE_SCALEIP "scale_ip(factor, origin) -> None\nscale_ip(factor_and_origin) -> None\nscales the line by the given factor from the given origin in place" #define DOC_LINE_FLIPAB "flip_ab() -> Line\nflips the line a and b points" #define DOC_LINE_FLIPABIP "flip_ab_ip() -> None\nflips the line a and b points, in place" +#define DOC_LINE_PROJECT "project(point, do_clamp=False) -> point\nprojects the line onto the given line" diff --git a/src_c/line.c b/src_c/line.c index ad25ed4866..aec3eec5b3 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -179,6 +179,70 @@ _line_scale_helper(pgLineBase *line, double factor, double origin) return 1; } +void +_normalize_vector(double *vector) +{ + double length = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + // check to see if the vector is zero + if (length == 0) { + vector[0] = 0; + vector[1] = 0; + } + else { + vector[0] /= length; + vector[1] /= length; + } +} + +double +_length_of_vector(double *vector) +{ + return sqrt(vector[0] * vector[0] + vector[1] * vector[1]); +} + +static PyObject * +_line_project_helper(pgLineBase *line, double *point, int do_clamp) +{ + // this is a vector that goes from one point of the line to another + double line_vector[2] = {line->bx - line->ax, line->by - line->ay}; + double line_length = _length_of_vector(line_vector); + + // this is a unit vector that points in the direction of the line + double normalized_line_vector[2] = {line_vector[0], line_vector[1]}; + _normalize_vector(normalized_line_vector); + + // this is a vector that goes from the start of the line to the point we + // are projecting onto the line + double vector_from_line_start_to_point[2] = {point[0] - line->ax, + point[1] - line->ay}; + + double dot_product = + vector_from_line_start_to_point[0] * normalized_line_vector[0] + + vector_from_line_start_to_point[1] * normalized_line_vector[1]; + + double projection[2] = {dot_product * normalized_line_vector[0], + dot_product * normalized_line_vector[1]}; + + if (do_clamp) { + if (dot_product > line_length) { + projection[0] = line_vector[0]; + projection[1] = line_vector[1]; + } + else if (dot_product < 0) { + projection[0] = 0; + projection[1] = 0; + } + } + + double projected_point[2] = {line->ax + projection[0], + line->ay + projection[1]}; + + PyObject *projected_tuple = + Py_BuildValue("(dd)", projected_point[0], projected_point[1]); + + return projected_tuple; +} + static PyObject * pg_line_scale(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) { @@ -219,6 +283,54 @@ pg_line_scale_ip(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) Py_RETURN_NONE; } +static PyObject * +pg_line_project(pgLineObject *self, PyObject *args, PyObject *kwnames) +{ + PyObject *point_obj = NULL; + int do_clamp = 0; + + static char *kwlist[] = {"point", "do_clamp", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwnames, "O|p:project", kwlist, + &point_obj, &do_clamp)) { + return RAISE( + PyExc_TypeError, + "project requires a sequence(point) and an optional clamp flag"); + } + + PyObject *item; + double point[2]; + + if (!PySequence_Check(point_obj) || PySequence_Size(point_obj) != 2) { + return RAISE( + PyExc_ValueError, + "project requires the point to be a sequence of 2 elements"); + } + + item = PySequence_GetItem(point_obj, 0); + point[0] = PyFloat_AsDouble(item); + + PyObject *error_type; + if ((error_type = PyErr_Occurred())) { + return NULL; + } + + item = PySequence_GetItem(point_obj, 1); + point[1] = PyFloat_AsDouble(item); + + if ((error_type = PyErr_Occurred())) { + return NULL; + } + + PyObject *projected_point; + if (!(projected_point = + _line_project_helper(&pgLine_AsLine(self), point, do_clamp))) { + return NULL; + } + + return projected_point; +} + static struct PyMethodDef pg_line_methods[] = { {"__copy__", (PyCFunction)pg_line_copy, METH_NOARGS, DOC_LINE_COPY}, {"copy", (PyCFunction)pg_line_copy, METH_NOARGS, DOC_LINE_COPY}, @@ -231,6 +343,8 @@ static struct PyMethodDef pg_line_methods[] = { {"scale", (PyCFunction)pg_line_scale, METH_FASTCALL, DOC_LINE_SCALE}, {"scale_ip", (PyCFunction)pg_line_scale_ip, METH_FASTCALL, DOC_LINE_SCALEIP}, + {"project", (PyCFunction)pg_line_project, METH_VARARGS | METH_KEYWORDS, + ""}, {NULL, NULL, 0, NULL}}; static PyObject * diff --git a/test/geometry_test.py b/test/geometry_test.py index c4d48e0d6a..c5b4c9f6c2 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2201,6 +2201,25 @@ def test_meth_update(self): with self.assertRaises(TypeError): line.update(1, 2, 3) + def test_meth_project(self): + line = Line(0, 0, 100, 100) + test_point1 = (25, 75) + test_clamp_point1 = (100, 300) + test_clamp_point2 = (-50, -150) + + projected_point = line.project(test_point1) + self.assertEqual(math.ceil(projected_point[0]), 50) + self.assertEqual(math.ceil(projected_point[1]), 50) + + projected_point = line.project(test_clamp_point1, do_clamp=True) + self.assertEqual(math.ceil(projected_point[0]), 100) + self.assertEqual(math.ceil (projected_point[1]), 100) + + projected_point = line.project(test_clamp_point2, do_clamp=True) + self.assertEqual(math.ceil(projected_point[0]), 0) + self.assertEqual(math.ceil(projected_point[1]), 0) + + def test__str__(self): """Checks whether the __str__ method works correctly.""" l_str = "Line((10.1, 10.2), (4.3, 56.4))" From e2001ddb932e1e930b5e4219f2cc666cda5bd76e Mon Sep 17 00:00:00 2001 From: XFajk Date: Mon, 14 Apr 2025 12:38:21 +0200 Subject: [PATCH 144/441] added the doc string to the method in C --- src_c/line.c | 2 +- test/geometry_test.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index aec3eec5b3..525c374f9e 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -344,7 +344,7 @@ static struct PyMethodDef pg_line_methods[] = { {"scale_ip", (PyCFunction)pg_line_scale_ip, METH_FASTCALL, DOC_LINE_SCALEIP}, {"project", (PyCFunction)pg_line_project, METH_VARARGS | METH_KEYWORDS, - ""}, + DOC_LINE_PROJECT}, {NULL, NULL, 0, NULL}}; static PyObject * diff --git a/test/geometry_test.py b/test/geometry_test.py index c5b4c9f6c2..d98ff444f3 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2213,13 +2213,12 @@ def test_meth_project(self): projected_point = line.project(test_clamp_point1, do_clamp=True) self.assertEqual(math.ceil(projected_point[0]), 100) - self.assertEqual(math.ceil (projected_point[1]), 100) + self.assertEqual(math.ceil(projected_point[1]), 100) projected_point = line.project(test_clamp_point2, do_clamp=True) self.assertEqual(math.ceil(projected_point[0]), 0) self.assertEqual(math.ceil(projected_point[1]), 0) - def test__str__(self): """Checks whether the __str__ method works correctly.""" l_str = "Line((10.1, 10.2), (4.3, 56.4))" From 193071aeb3edfee35d0d5b021c0dc51d015c37e0 Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 15 Apr 2025 17:47:31 +0200 Subject: [PATCH 145/441] optimized the Line.project method made it METH_FASTCALL and removed sqrt calls --- src_c/line.c | 75 ++++++++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 50 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index 525c374f9e..b42b603da5 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -201,15 +201,10 @@ _length_of_vector(double *vector) } static PyObject * -_line_project_helper(pgLineBase *line, double *point, int do_clamp) +_line_project_helper(pgLineBase *line, double *point, int clamp) { // this is a vector that goes from one point of the line to another double line_vector[2] = {line->bx - line->ax, line->by - line->ay}; - double line_length = _length_of_vector(line_vector); - - // this is a unit vector that points in the direction of the line - double normalized_line_vector[2] = {line_vector[0], line_vector[1]}; - _normalize_vector(normalized_line_vector); // this is a vector that goes from the start of the line to the point we // are projecting onto the line @@ -217,14 +212,17 @@ _line_project_helper(pgLineBase *line, double *point, int do_clamp) point[1] - line->ay}; double dot_product = - vector_from_line_start_to_point[0] * normalized_line_vector[0] + - vector_from_line_start_to_point[1] * normalized_line_vector[1]; + (vector_from_line_start_to_point[0] * line_vector[0] + + vector_from_line_start_to_point[1] * line_vector[1]) / + (line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]); - double projection[2] = {dot_product * normalized_line_vector[0], - dot_product * normalized_line_vector[1]}; + double projection[2] = {dot_product * line_vector[0], + dot_product * line_vector[1]}; - if (do_clamp) { - if (dot_product > line_length) { + if (clamp) { + if (projection[0] * projection[0] + projection[1] * projection[1] > + line_vector[0] * line_vector[0] + + line_vector[1] * line_vector[1]) { projection[0] = line_vector[0]; projection[1] = line_vector[1]; } @@ -237,10 +235,8 @@ _line_project_helper(pgLineBase *line, double *point, int do_clamp) double projected_point[2] = {line->ax + projection[0], line->ay + projection[1]}; - PyObject *projected_tuple = - Py_BuildValue("(dd)", projected_point[0], projected_point[1]); - - return projected_tuple; + return pg_tuple_couple_from_values_double(projected_point[0], + projected_point[1]); } static PyObject * @@ -284,47 +280,26 @@ pg_line_scale_ip(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) } static PyObject * -pg_line_project(pgLineObject *self, PyObject *args, PyObject *kwnames) +pg_line_project(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs, + PyObject *kwnames) { - PyObject *point_obj = NULL; - int do_clamp = 0; + double point[2] = {0.f, 0.f}; + int clamp = 0; - static char *kwlist[] = {"point", "do_clamp", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwnames, "O|p:project", kwlist, - &point_obj, &do_clamp)) { - return RAISE( - PyExc_TypeError, - "project requires a sequence(point) and an optional clamp flag"); - } - - PyObject *item; - double point[2]; - - if (!PySequence_Check(point_obj) || PySequence_Size(point_obj) != 2) { - return RAISE( - PyExc_ValueError, - "project requires the point to be a sequence of 2 elements"); - } - - item = PySequence_GetItem(point_obj, 0); - point[0] = PyFloat_AsDouble(item); - - PyObject *error_type; - if ((error_type = PyErr_Occurred())) { - return NULL; + if (nargs >= 1) { + if (!pg_TwoDoublesFromObj(args[0], &point[0], &point[1])) { + return RAISE(PyExc_TypeError, + "project requires a sequence of two numbers"); + } } - item = PySequence_GetItem(point_obj, 1); - point[1] = PyFloat_AsDouble(item); - - if ((error_type = PyErr_Occurred())) { - return NULL; + if (kwnames != NULL) { + clamp = PyObject_IsTrue(args[nargs]); } PyObject *projected_point; if (!(projected_point = - _line_project_helper(&pgLine_AsLine(self), point, do_clamp))) { + _line_project_helper(&pgLine_AsLine(self), point, clamp))) { return NULL; } @@ -343,7 +318,7 @@ static struct PyMethodDef pg_line_methods[] = { {"scale", (PyCFunction)pg_line_scale, METH_FASTCALL, DOC_LINE_SCALE}, {"scale_ip", (PyCFunction)pg_line_scale_ip, METH_FASTCALL, DOC_LINE_SCALEIP}, - {"project", (PyCFunction)pg_line_project, METH_VARARGS | METH_KEYWORDS, + {"project", (PyCFunction)pg_line_project, METH_FASTCALL | METH_KEYWORDS, DOC_LINE_PROJECT}, {NULL, NULL, 0, NULL}}; From ea76d39201ac85672b1dddbe83b746102b30c555 Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 15 Apr 2025 17:48:28 +0200 Subject: [PATCH 146/441] made the docs more clear, improved the images --- buildconfig/stubs/pygame/geometry.pyi | 4 +++- docs/reST/ref/code_examples/project.png | Bin 0 -> 14532 bytes docs/reST/ref/code_examples/project1.png | Bin 3471 -> 0 bytes docs/reST/ref/code_examples/project2.png | Bin 4016 -> 0 bytes docs/reST/ref/code_examples/project3.png | Bin 4490 -> 0 bytes docs/reST/ref/code_examples/project_clamp.png | Bin 0 -> 30877 bytes docs/reST/ref/geometry.rst | 20 +++++++----------- src_c/doc/geometry_doc.h | 2 +- 8 files changed, 12 insertions(+), 14 deletions(-) create mode 100644 docs/reST/ref/code_examples/project.png delete mode 100644 docs/reST/ref/code_examples/project1.png delete mode 100644 docs/reST/ref/code_examples/project2.png delete mode 100644 docs/reST/ref/code_examples/project3.png create mode 100644 docs/reST/ref/code_examples/project_clamp.png diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 8e3d22202e..d745f16557 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -197,4 +197,6 @@ class Line: def scale_ip(self, factor_and_origin: Point, /) -> None: ... def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... - def project(self, point: Point, do_clamp: bool = False) -> Point: ... + def project( + self, point: tuple[float, float], clamp: bool = False + ) -> tuple[float, float]: ... diff --git a/docs/reST/ref/code_examples/project.png b/docs/reST/ref/code_examples/project.png new file mode 100644 index 0000000000000000000000000000000000000000..3177bf05f672f04846906f2829161365a21851d5 GIT binary patch literal 14532 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

    s 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 literal 0 HcmV?d00001 diff --git a/docs/reST/ref/code_examples/project1.png b/docs/reST/ref/code_examples/project1.png deleted file mode 100644 index dccd5221c92dc74b8db0d943e422c6a6bfe4eb90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3471 zcmd^C>0eXF8lI3y5`+eb3u_W~6nE5u!XXG0kR?FvjZj1=)}T-Yx!4#F5-}xMfhghv zt--BIWwTWg>q2r|(AqXoD2P=_3JQwKK|qg)c;DE2zuZ6Iez_m=o4oTb&&=~aGv_xu zW1>SX%^(95k223mGp=rUCIo5N!;7?QxKK!ko!O&(8~ z1U5S}EIu2d53U-2wC0UfYoL;AcyQnfY0|U%{-qA_Q{}C5zK|ErCr`5)G;=g5hkQ;? zZV)CLQX&~%Hf0sd%MSfqBYQo(ZO}JbTvfe%_Q~hdUvD_cYr;oq$Wn8lPmJUSHXjMh z4RoY%!jXKQf`cpzNE#w6F(kAhn1~fbA(X=UKMFF^gPWrj^yljhuvPhqt{y`) zjP7jSCeXsd5OVikl6KhkrSxVLg<=lrk4%9Yi}IDfL+WqIWBg}azg}2yW9K*h<$S=#1KYF zHa?0R5vKfGdYQLIsvn1L^LJctjiGOyrTu#zu0RgGUsQ-vb=qmJd$)>OR+ALVzZ`WV!KVl8QoM@)*_oVSc-b^Ss-aT7O zw*aQ5aMaB`L(i(Mg4YpDL1TOWg#k02gTHrbVX1;6jQMVd#2v2+rx2r!;Hi$yS#O1* zz%n!SjP*s+65McPDt=+6N}ZM90e?Rk3rlx|%!2(azMQr%De=KBb$M)%mx7}aE@$d` zSB*p#*(CterZHnH(@U-WB5qjB28JE0t^D?u<*G-si|iACuO;mXWMoH=t6Rz8g$8=d zo&>G8ueJY~+D@CL?XKXCP0iY}*OyfUxNJ`dWSLn9HIx1?K{rFTc@#uc!Q3h^}i-mTTIhK0A@IH+HSd$jIj<>RTOK?E>0i zVrIIV)ZO=}WOMH+PA|x8=BdlgXUe=~?u2q0Y|Bi>Qr|k{vW#jmG0b|x0J~P*{$J;Drygwe^G2N-slOUy(Ey9{JE>Lj4Zc_ z=mp@#EOmNZPhXg;))6Y^`>WIUJ9$IJI~m0e;#^N?H|{2_`}6B>A>%m4sk6p}Y59E^ zq2#gn0#|Kzlb69e9_vhVhNG-V&GJ>{^k&T8R0T*WEcN(<>#99LaOQ2)skJ{Q{m0m^ z|6by??R|&k28ilNNiA!cY@nM5k-ZY7@&TKl%$jx}@9gv$!_5;f-pn|r2fZZN&luKa zw9n^a!cK-x6=(AK?dq(|UjI*Ry#^|~8dIHd`5fPlyPFrw+(WNQwoOzI{^5$>f!R8i zI#+yD@?wL-tnR$G_d0r-t5V$|n5FJ~c~mm!GSNTm(U$%oH}978NC?49tI%&5%((Wn zOSWoxJBu$9;PSQciP2}K&acPrt`5fvd

    yYb${s+M71n2(5E;_Uo5c;fa$W% zlSR9d2+5dlannHsXZOC;+HIG1RmKu05BRun4D>Zl(lM?R-Y`*oBY76VY}}`RELM=^ zBcyjJ+=Cmy>wy;vDRdw{k$1J4^yT_<4MFJ&PG*JP_VzyVv72n|?aEG@BDlwtZ1w#6 zw%A9LYoYrKw)&-Vv0$L(JVRtIxhfgRdGFB7(Q-s)zl=dap%Xq}%!?&Uqp1{55IL?uZS*OR~WI6cfQvX(jF z0#B`XL$z3zyn{>wzEUzLcUmF4p3srDyUD^kQp2^a@NH zEq%9&++MIU(e!2nC8RSrLR*44b5qTvnEm8-GcX+qrWpk1u=$=sQscu@HJ`7)A*obw z)~wC4y)i#j_Y3P8RET77ibAOo5vBRnAzgdNA!js-(nLZ28wCeWH5zlm^{!fa3t)Qy zSpQyfyAiBg!Ew#3ne;S%;_Hih?qUY|TozC7`0C~3UF3F)d}f#%KIV)k2a+hX_NwHw zvkeiHX7BaS_2vfnk_JihnTb{9R!tFV*d;$QDy;oWGQgv6G63DK=3Do z@)3BSJL75l{b6*+;SA6OfbI=7;BKuj*05G^K7pv^*4PRsDXI#jV#@q^@gGWQ!e5@p$?6>-%dfz8AMO5ZeEnQfx;GDPeLuaF@%yNJO zQTRlWsKwrJH6@=ZPh#^+0Y>J5hkcf1d${JY_ryx4tE<8w^-@Z*Sdi>lC83&==1@>bMnF&H}Qt+eg*pg>tC0nO$k$ z)kBjvzzClH9pnWeiG-^aIyR&n77=|2wv@}o*nn3QNL@;So>|S>m}#?RWOAh=FdN%g zJ^Uph2_ezEiX7?}XLmWd<;P~a=4QiRp%er3TS)8?>q#StJ*Px1dmb%pe3v|mx3dJ;&SYbrq8L1 zWLC{2v?aK)N%Wz?MT!KKqmGBZ61jo%1sB@~ZScGuD|VZ9fF^gSFf*d`wg*!_9VT*Y zd}3ps3>$mCI&b35aO|5?N>#NVYPnLYj~{T7S8$B6qsJM#gxj={hp*51eoPkfP*q># zNaSx<>J(25XG-ji)qd}-KSM`3_p|;uaoweUt?DOa6#9QX3^bg&Iqv6WbKwO4{cMPm z)ZcB)_C_t=9kXiNG!l7FV~N6EJULNN%hbX3hf;i=nEa2P6aoyJV3wN2q;y|s*a?p) N6dn>CT(>Ma|6k(roG<_Y diff --git a/docs/reST/ref/code_examples/project2.png b/docs/reST/ref/code_examples/project2.png deleted file mode 100644 index 51ca189590babcbdfbf20d723bb1085c480aa9f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4016 zcmb_fdsq`!7QY!HW^_>))S^5LVMa#9iYy|cND>1~0)fERYI$gIvEmC*`6z195u*@9 zBw?xoRtOTPc2%@I)Cz|BD71<^q`r`1wN(7@34(9-1nsxofA`xz^4)uK=AQFAkNdm# zYE>bDRwE{iKnPjM8Cf_&m;xc*QGq4=li)Nt2L|5y@IWa#+UU>?0)M$gDM9G??vZa| zhJlPHGM}wSXw*6LkN0E3H?atf_Ls{fpQJ2)c>8#^+l8_0ooGL7w$4A`;>et(4Wlx0 zvVLvclOb5$P;v&1AHPo4I5p~V)aTbbI%ePY{d-&Vg0kAsh~@#T!GF%{^{;w9m#2&%j64*8jiB+_(MR%O{>?t2KnFvve!Dr*ql|58GbfySAipVZyPk zWo3Vip5Ay3q2PTq5Aihw5{utYOlW^Df8h8ftDNh8gU^ojwtbs0_(WkW7obmuPFGJ6Tn2)LeHT#?Z5hy@@$pYycH5)v# zgL`P6D$Dg=J%r4Pg7x(b$eM1O@u!|!Hf41GV@)>3dI3I9^}G9L527L~DPH6e#(zjC z(AZs0^0HxxL7f%BH1CrWW8^M9w9-QE);#6sb~HS)K(y;bz3*-pzw9`jmN0FVwS2q6 zPD@5CE9NI!>-cX0qc_W>&C8>CJ*)eSYwqW12{9$YZ@O}5inV-TeLoQhUgi`8>X_4o z-|h9zccjqiJ3UnP=f!;StkM`#@13TFVwz+)5~_>&s`|b&1$RQ_dWo{2$8FPBaDr)bhMO~IBbD6X^!5n&|o{nFH4@P(> z)1siKcD1kDwifDOpF!H~RAJW{vMvQ0$Sv{2z;#et1m~_>e`1ytS0CIkMoZRT*_w;W zJ3Zvj?yd{|;Og_z(CSk)mjC?jAm4q4A13r6kli*F=56b5+ONV=ob_~FUeHScrA`Ub z#Rh7R>_5fjs<0iC^eiRC?e;LmCEfGyInh_nJw>J*8BxAnOSn7e_^T<7HDr*T;~=>0 z40hB;A-3`L8#PVOW~eZyWNk_7lE~4eW>9KvSqGagi@A4jSiLz_6I#y2CX#}=%)?dP*Jv|%w(?rPvCt(vS4&SeP= z@ua-Syz&c5>xdW!0CRi%0$Ree$A?j)~Vxi-zcD1wyj$|0{=U%f>tl=GzBu>M zA5+=8(2B~Fmf=^9 zlN@_n)=KL5eNvkDy|vuE$}RNbh6h%3<6=T}vvBb3wcfVY*1>oEg}rU>02v2`%C~H3 zx2e1Li@hofq=?Lt+{&{{(o|TcwOkw^#Z&e%*vcE54uk3R3{pKhu>I3p?~RKsrTEE6 zPbDE2LzAA|$zTCO=#FU*DPF9(O%`=n2Ece(MkI1a%HkiV`c$hhFB`cjLqn7+NZ!nU zDR*Y4Tr1f78@3ZdOMA)V0%a{)6*kV_KlKz2zvEG%VNUBKv(Se zeGR)%ioe*#U@1W~Z=#lD2Q-9Gk1#22>8eLd0S-72P<9b!c<8LH!kyOf%R}foc2B<^ zrBIyOeNQ#73jPPCO0+ldw^_?kHHZkri3WZHn0$>>c95V&uAK0ATt2BsRW^zo_#qH=iO7SU> z(>1n=^6!Sy0(`Cx1Vw@rPd0xC;_#rKZ=t^Vv?K=b)Wawd;lhs${O#c9OARpwO0|wq zl)HfUSqA>-%u+e5-y+4G%nDmYqN|RdQ>aRt<2Eh9A_u~;-|&N#+ChrPgZ`q3Q^P`c zCj%cyo1KAEDJ+B4E9tt-Avn(fn3&{cDQO7|LasB@oSci!ocf||Jc<%f`=HdpIOT0C zN0(r+vmU`oUWb86FT?pKKz9r#re}ES_$I<|zFbC_d2)V4M296i(r`X;?j1|hr&29Y zGm3ZS>~=6%Cy34j_?rI28`adL*EWxhe88$QFojb`MS+{_JKD#*Pyhd2{{zw!B%X zg+yTpXp;ghf{Z$ov`Dnbr*r+^rKg0WU`57yd zKts%eAhM)1Re4Qc4Ou3olbv;Zv<%$9V$Oxrdk<>~Cm&YcpQcCk!8BDqj@ca$KEy_` zuAEQxz!=!c?jDA#x+AXxsZz$(+#v3lfeY4(ec)I`(#g;pXc=w{>8UACg(mI%O7-A; zrS+8YjH?Jo9UC{llteyqofiG#*|&v_3y;+fzAWf%+XUf+;l`~|BTG(gaMzM3pzD`g z!YWxy!?nUKU(`bU>S9m!h|cr*-O)?-A4BS>NkcbAuHCn_BzM!GFRGV)IO_hqL;rc1 z4qrELApM>Lh0M2mXM-mjSvJ2^j-JdhcxD`V>S6}?MGf`*R$1ZK$2!io_uo8p3j>_C z3S8;Zz0@fPnS81{^ryzjkttOZE`k_-A{25rfBmg^1eD9cCI-$lHUeni%m+YKY$`-= z77JC10Fo!3EuC!hAt#p)!U-?lus8-o*6v~deNX@E&HXNKf@i9)wpWLWoNSF3Fa3I_ zsxM>~QZJDnaxNC2n<8!kq_)UcdWdJfo#E(#jp8eC8Mjxp5~!Yir3v>R>I<>GCLHdr z2*_^A6OBFUlhBTro_U!`&e05IiKayYmG29r7XVooMN1C>wVFwCcphADF}B}#OUl|> zOQin6e3=z;@R*bSIoWgS3wPhBmew_>X}YcPhc4H|>0j4dp$a8Emdr%Jo1ehx0=yai z0plx*ONQeJ2)A4E9^9a&#iEDeiQ}c+A#kDy{R~ON!Tmq26~iEydVhK>w7hVlAt~K_ zVMO%}L2G#kdtds$zSqhx)ztN|^3an!lXo!p>7~#+{hMbYyL45AFcYa)OD7BU2pN)G z<|vT+C_|F}P(QnmGk8MzfgL?#rsHTIp;!*N%m?>`Vmjm`aThGt!}4?KdLRg)M-mMf z)D7i^dpMNha*iQ(gFU+bgU0}zR;X0dk_SWAj=vd)uy*GE`M87o!2k7W`9Ho@7yA0X Zo#-)<`iCe#>q~fLBe{Qw?5I?o_HX&r$~pi5 diff --git a/docs/reST/ref/code_examples/project3.png b/docs/reST/ref/code_examples/project3.png deleted file mode 100644 index f54a85c2cd8b51b5927e922c93ce98196cc4fb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4490 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 z 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 A-T(jq literal 0 HcmV?d00001 diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index 8ebc3f8732..051ece46a0 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -744,26 +744,22 @@ .. method:: project | :sl:`projects the line onto the given line` - | :sg:`project(point, do_clamp=False) -> point` + | :sg:`project(point: tuple[float, float], clamp=False) -> tuple[float, float]` - Returns a new point(tuple[float, float]) that is projected onto the line like so + This method takes in a point and one boolean keyword argument clamp. It outputs an orthogonally projected point onto the line. + If clamp is True it makes sure that the outputted point will be on the line segment. - .. figure:: code_examples/project1.png - :alt: project method image - - Example of what project method does if you input the green point you get back the yellow one. + .. figure:: code_examples/project.png + :alt: project method image - .. figure:: code_examples/project2.png - :alt: project do_clamp=False image - - Example of what the do_clamp argument does when it is False + Example of how it projects the point on to the line purplish point is the point we want to project and the blue point is what you would get as a result - .. figure:: code_examples/project1.png + .. figure:: code_examples/project_clamp.png :alt: project do_clamp=True image - Example of what the do_clamp argument does when it is True + Example of what the clamp argument changes if it is true it stays on the line segment .. versionadded:: 2.5.4 diff --git a/src_c/doc/geometry_doc.h b/src_c/doc/geometry_doc.h index 3dce1dec6b..6c061840d3 100644 --- a/src_c/doc/geometry_doc.h +++ b/src_c/doc/geometry_doc.h @@ -45,4 +45,4 @@ #define DOC_LINE_SCALEIP "scale_ip(factor, origin) -> None\nscale_ip(factor_and_origin) -> None\nscales the line by the given factor from the given origin in place" #define DOC_LINE_FLIPAB "flip_ab() -> Line\nflips the line a and b points" #define DOC_LINE_FLIPABIP "flip_ab_ip() -> None\nflips the line a and b points, in place" -#define DOC_LINE_PROJECT "project(point, do_clamp=False) -> point\nprojects the line onto the given line" +#define DOC_LINE_PROJECT "project(point: tuple[float, float], clamp=False) -> tuple[float, float]\nprojects the line onto the given line" From 44ab4fc23d5c2a8084d6eb16117ebbaefdfd2bc0 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Wed, 16 Apr 2025 11:45:16 +0200 Subject: [PATCH 147/441] Update docs/reST/ref/geometry.rst clarify the docs for the Line.project methdo Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> --- docs/reST/ref/geometry.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index 051ece46a0..ab9579002e 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -747,7 +747,8 @@ | :sg:`project(point: tuple[float, float], clamp=False) -> tuple[float, float]` This method takes in a point and one boolean keyword argument clamp. It outputs an orthogonally projected point onto the line. - If clamp is True it makes sure that the outputted point will be on the line segment. + If clamp is `True` it makes sure that the outputted point will be on the line segment (which might not be orthogonal), and if it is `False` (the default) then any point on the infinitely extended line may be outputted. + This method can be used to find the closest point on a line to the given point. The output is the unique point on the line or line segment that is the smallest distance away from the given point. .. figure:: code_examples/project.png From cd9c648cd4b2c52d5d4d92880a35bdee5a1e5e05 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Wed, 16 Apr 2025 11:46:03 +0200 Subject: [PATCH 148/441] Update docs/reST/ref/geometry.rst grammar fix in the docs for the Line.project method Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> --- docs/reST/ref/geometry.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index ab9579002e..c4d1d9c35a 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -754,7 +754,7 @@ .. figure:: code_examples/project.png :alt: project method image - Example of how it projects the point on to the line purplish point is the point we want to project and the blue point is what you would get as a result + Example of how it projects the point onto the line. The red point is the point we want to project and the blue point is what you would get as a result. .. figure:: code_examples/project_clamp.png From 896f7b28c6f4ad7b2a542c7b36b7113da7e7fc6f Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Wed, 16 Apr 2025 11:48:32 +0200 Subject: [PATCH 149/441] Update docs/reST/ref/geometry.rst small update to the docs for Line.project Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> --- docs/reST/ref/geometry.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index c4d1d9c35a..a9c91795d3 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -758,9 +758,9 @@ .. figure:: code_examples/project_clamp.png - :alt: project do_clamp=True image + :alt: project clamp argument image - Example of what the clamp argument changes if it is true it stays on the line segment + Example of what the clamp argument changes. If it is `True`, the point is bounded between the line segment ends. .. versionadded:: 2.5.4 From ed8af87e238af6c099d66309cc9c44bf8b4621b5 Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 15 Apr 2025 18:02:52 +0200 Subject: [PATCH 150/441] added "/" to the stub file to indicate that the first arg is positional only --- buildconfig/stubs/pygame/geometry.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index d745f16557..0c8919cac5 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -198,5 +198,5 @@ class Line: def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... def project( - self, point: tuple[float, float], clamp: bool = False + self, point: tuple[float, float], / clamp: bool = False ) -> tuple[float, float]: ... From bfe2698a47e7a766817ab03b0c495b18854a952f Mon Sep 17 00:00:00 2001 From: XFajk Date: Wed, 16 Apr 2025 12:41:04 +0200 Subject: [PATCH 151/441] added one more test case fixed the stub --- buildconfig/stubs/pygame/geometry.pyi | 2 +- test/geometry_test.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 0c8919cac5..3a62fe601a 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -198,5 +198,5 @@ class Line: def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... def project( - self, point: tuple[float, float], / clamp: bool = False + self, point: Point, / clamp: bool = False ) -> tuple[float, float]: ... diff --git a/test/geometry_test.py b/test/geometry_test.py index d98ff444f3..6e09cd2cc1 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2206,16 +2206,21 @@ def test_meth_project(self): test_point1 = (25, 75) test_clamp_point1 = (100, 300) test_clamp_point2 = (-50, -150) + test_clamp_point3 = (-200, -200) projected_point = line.project(test_point1) self.assertEqual(math.ceil(projected_point[0]), 50) self.assertEqual(math.ceil(projected_point[1]), 50) - projected_point = line.project(test_clamp_point1, do_clamp=True) + projected_point = line.project(test_clamp_point1, clamp=True) self.assertEqual(math.ceil(projected_point[0]), 100) self.assertEqual(math.ceil(projected_point[1]), 100) - projected_point = line.project(test_clamp_point2, do_clamp=True) + projected_point = line.project(test_clamp_point2, clamp=True) + self.assertEqual(math.ceil(projected_point[0]), 0) + self.assertEqual(math.ceil(projected_point[1]), 0) + + projected_point = line.project(test_clamp_point3, clamp=True) self.assertEqual(math.ceil(projected_point[0]), 0) self.assertEqual(math.ceil(projected_point[1]), 0) From a2913292afa7a81655a1be36525afa026cb4c685 Mon Sep 17 00:00:00 2001 From: XFajk Date: Wed, 16 Apr 2025 15:11:59 +0200 Subject: [PATCH 152/441] made a small change to the stub --- buildconfig/stubs/pygame/geometry.pyi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 3a62fe601a..985d6050cb 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -197,6 +197,4 @@ class Line: def scale_ip(self, factor_and_origin: Point, /) -> None: ... def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... - def project( - self, point: Point, / clamp: bool = False - ) -> tuple[float, float]: ... + def project(self, point: Point, /, clamp: bool = False) -> tuple[float, float]: ... From 317719e3348e6a9afd35bb96cac1542e8f96078d Mon Sep 17 00:00:00 2001 From: XFajk Date: Wed, 16 Apr 2025 15:18:42 +0200 Subject: [PATCH 153/441] fixed a bug in the Line.project method --- src_c/line.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index b42b603da5..066a0b2aad 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -220,16 +220,17 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) dot_product * line_vector[1]}; if (clamp) { - if (projection[0] * projection[0] + projection[1] * projection[1] > - line_vector[0] * line_vector[0] + - line_vector[1] * line_vector[1]) { - projection[0] = line_vector[0]; - projection[1] = line_vector[1]; - } - else if (dot_product < 0) { + if (dot_product < 0) { projection[0] = 0; projection[1] = 0; } + else if (projection[0] * projection[0] + + projection[1] * projection[1] > + line_vector[0] * line_vector[0] + + line_vector[1] * line_vector[1]) { + projection[0] = line_vector[0]; + projection[1] = line_vector[1]; + } } double projected_point[2] = {line->ax + projection[0], From 5c7a5286272fdbf56af643d60646e53026422593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 19 Apr 2025 10:42:09 +0200 Subject: [PATCH 154/441] Refactor alphablit --- src_c/alphablit.c | 2205 ++++++++++----------------------------------- 1 file changed, 453 insertions(+), 1752 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 5473d3008f..1d3258b0ce 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -594,1675 +594,178 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -static void -blit_blend_rgba_add(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_add(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp = (*dst) + (*src); - (*dst) = (tmp <= 255 ? tmp : 255); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_sub(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Sint32 tmp2; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_sub(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp2 = (*dst) - (*src); - (*dst) = (tmp2 >= 0 ? tmp2 : 0); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_mul(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_mul(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp = ((*dst) && (*src)) - ? (((*dst) * (*src)) + 255) >> 8 - : 0; - (*dst) = (tmp <= 255 ? tmp : 255); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_min(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_min(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - if ((*src) < (*dst)) { - (*dst) = (*src); - } - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_max(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_max(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - if ((*src) > (*dst)) { - (*dst) = (*src); - } - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_premultiplied(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - dst[dstoffsetR] = src[srcoffsetR]; - dst[dstoffsetG] = src[srcoffsetG]; - dst[dstoffsetB] = src[srcoffsetB]; - - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - if (sA == 0) { - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - } - else if (sA == 255) { - dst[offsetR] = sR; - dst[offsetG] = sG; - dst[offsetB] = sB; - } - else { - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, - dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - // We can save some blending time by just copying - // pixels with alphas of 255 or 0 - if (sA == 0) { - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - } - else if (sA == 255) { - CREATE_PIXEL(dst, sR, sG, sB, sA, dstbpp, dstfmt); - } - else { - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, - dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -/* --------------------------------------------------------- */ - -static void -blit_blend_add(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_sub(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Sint32 tmp2; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp2 = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp2 >= 0 ? tmp2 : 0); - tmp2 = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp2 >= 0 ? tmp2 : 0); - tmp2 = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp2 >= 0 ? tmp2 : 0); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_mul(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp = - ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = - ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = - ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_min(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; +#define SETUP_BASE() \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; + +#define SETUP_BLIT_BLEND(...) \ + SETUP_BASE() \ + __VA_ARGS__; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - if (src[srcoffsetR] < dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } - if (src[srcoffsetG] < dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } - if (src[srcoffsetB] < dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } +/* --------------------------------------------------------- */ - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } +#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ + static void blit_blend_rgba_##operation(SDL_BlitInfo *info) \ + { \ + SETUP_BLIT_BLEND(tmp_variable) \ + if (!dstppa) { \ + blit_blend_##operation(info); \ + return; \ + } \ + if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ + srcfmt->Gmask == dstfmt->Gmask && \ + srcfmt->Bmask == dstfmt->Bmask && \ + srcfmt->Amask == dstfmt->Amask && \ + info->src_blend != SDL_BLENDMODE_NONE) { \ + int incr = srcpxskip > 0 ? 1 : -1; \ + if (incr < 0) { \ + src += 3; \ + dst += 3; \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + REPEAT_4({ \ + code src += incr; \ + dst += incr; \ + }); \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ } -} + +BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = (*dst) + (*src); + (*dst) = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = (*dst) - (*src); + (*dst) = (tmp >= 0 ? tmp : 0);); + +BLIT_BLEND_RGBA_OP(mul, Uint32 tmp, + BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 + : 0; + (*dst) = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_RGBA_OP( + min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), + if ((*src) < (*dst)) { (*dst) = (*src); }); + +BLIT_BLEND_RGBA_OP( + max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), + if ((*src) > (*dst)) { (*dst) = (*src); }); static void -blit_blend_max(SDL_BlitInfo *info) +blit_blend_premultiplied(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - + SETUP_BLIT_BLEND() if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; @@ -2281,15 +784,10 @@ blit_blend_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - if (src[srcoffsetR] > dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } - if (src[srcoffsetG] > dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } - if (src[srcoffsetB] > dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; - } + dst[dstoffsetR] = src[srcoffsetR]; + dst[dstoffsetG] = src[srcoffsetG]; + dst[dstoffsetB] = src[srcoffsetB]; + src += srcpxskip; dst += dstpxskip; }, @@ -2307,7 +805,8 @@ blit_blend_max(SDL_BlitInfo *info) { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; @@ -2327,7 +826,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; @@ -2339,7 +839,7 @@ blit_blend_max(SDL_BlitInfo *info) dst += dstskip; } } - else /* even dstbpp */ + else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( @@ -2348,7 +848,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; @@ -2369,7 +870,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; @@ -2391,10 +893,23 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; + if (sA == 0) { + dst[offsetR] = dR; + dst[offsetG] = dG; + dst[offsetB] = dB; + } + else if (sA == 255) { + dst[offsetR] = sR; + dst[offsetG] = sG; + dst[offsetB] = sB; + } + else { + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, + dG, dB, dA); + dst[offsetR] = dR; + dst[offsetG] = dG; + dst[offsetB] = dB; + } src += srcpxskip; dst += dstpxskip; }, @@ -2403,7 +918,7 @@ blit_blend_max(SDL_BlitInfo *info) dst += dstskip; } } - else /* even dstbpp */ + else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( @@ -2414,8 +929,19 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + // We can save some blending time by just copying + // pixels with alphas of 255 or 0 + if (sA == 0) { + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + } + else if (sA == 255) { + CREATE_PIXEL(dst, sR, sG, sB, sA, dstbpp, dstfmt); + } + else { + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, + dG, dB, dA); + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + } src += srcpxskip; dst += dstpxskip; }, @@ -2429,32 +955,250 @@ blit_blend_max(SDL_BlitInfo *info) /* --------------------------------------------------------- */ +#define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ + static void blit_blend_##operation(SDL_BlitInfo *info) \ + { \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ + Uint32 pixel; \ + tmp_variable; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ + int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ + if (srcbpp >= 3 && dstbpp >= 3 && \ + info->src_blend == SDL_BLENDMODE_NONE) { \ + size_t srcoffsetR, srcoffsetG, srcoffsetB; \ + size_t dstoffsetR, dstoffsetG, dstoffsetB; \ + if (srcbpp == 3) { \ + SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + else { \ + SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + if (dstbpp == 3) { \ + SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + else { \ + SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + code src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ + dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ + dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + } + +BLIT_BLEND_OP(add, Uint32 tmp, BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_OP(sub, Sint32 tmp, BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0);); + +BLIT_BLEND_OP(mul, Uint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_OP( + min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), + if (src[srcoffsetR] < dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } if (src[srcoffsetG] < dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } if (src[srcoffsetB] < dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + }); + +BLIT_BLEND_OP( + max, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), + if (src[srcoffsetR] > dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } if (src[srcoffsetG] > dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } if (src[srcoffsetB] > dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + }); + +/* --------------------------------------------------------- */ + +#define SETUP_ALPHABLIT() \ + SETUP_BASE() \ + int dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ + int alpha = info->src_blanket_alpha; + static void alphablit_alpha(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; - Uint32 modulateA = info->src_blanket_alpha; - Uint32 pixel; - - /* - printf ("Alpha blit with %d and %d\n", srcbpp, dstbpp); - */ + SETUP_ALPHABLIT() + int sAi; if (srcbpp == 1) { if (dstbpp == 1) { @@ -2525,7 +1269,7 @@ alphablit_alpha(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); /* modulate Alpha */ - sA = (sA * modulateA) / 255; + sA = (sA * alpha) / 255; dRi = dR; dGi = dG; @@ -2547,30 +1291,9 @@ alphablit_alpha(SDL_BlitInfo *info) static void alphablit_colorkey(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; - int alpha = info->src_blanket_alpha; + SETUP_ALPHABLIT() + int sAi; Uint32 colorkey = info->src_colorkey; - Uint32 pixel; - - /* - printf ("Colorkey blit with %d and %d\n", srcbpp, dstbpp); - */ assert(info->src_has_colorkey); if (srcbpp == 1) { @@ -2697,29 +1420,7 @@ alphablit_colorkey(SDL_BlitInfo *info) static void alphablit_solid(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi; - int alpha = info->src_blanket_alpha; - int pixel; - - /* - printf ("Solid blit with %d and %d\n", srcbpp, dstbpp); - */ + SETUP_ALPHABLIT() if (srcbpp == 1) { if (dstbpp == 1) { From f67ce180b17ae45f4ca3794333e77eb0ed71ac3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 19 Apr 2025 14:56:29 +0200 Subject: [PATCH 155/441] Replace AddObject with AddObjectRef --- src_c/_camera.c | 9 +++------ src_c/_freetype.c | 8 +++----- src_c/base.c | 13 ++++--------- src_c/bufferproxy.c | 9 +++------ src_c/color.c | 12 +++--------- src_c/constants.c | 3 +-- src_c/event.c | 12 ++++-------- src_c/font.c | 12 +++--------- src_c/geometry.c | 11 +++-------- src_c/joystick.c | 9 +++------ src_c/key.c | 6 ++---- src_c/mask.c | 11 +++-------- src_c/math.c | 35 +++++++++-------------------------- src_c/mixer.c | 26 +++++++++----------------- src_c/music.c | 6 ++---- src_c/newbuffer.c | 14 +++++--------- src_c/pixelarray.c | 9 +++------ src_c/rect.c | 20 ++++++-------------- src_c/render.c | 17 ++++++----------- src_c/rwobject.c | 3 +-- src_c/surface.c | 18 ++++++------------ src_c/surflock.c | 3 +-- src_c/system.c | 3 +-- src_c/time.c | 4 +--- src_c/window.c | 7 ++----- 25 files changed, 87 insertions(+), 193 deletions(-) diff --git a/src_c/_camera.c b/src_c/_camera.c index d1542a991e..5c1977ad39 100644 --- a/src_c/_camera.c +++ b/src_c/_camera.c @@ -1988,15 +1988,12 @@ MODINIT_DEFINE(_camera) return NULL; } - Py_INCREF(&pgCamera_Type); - if (PyModule_AddObject(module, "CameraType", (PyObject *)&pgCamera_Type)) { - Py_DECREF(&pgCamera_Type); + if (PyModule_AddObjectRef(module, "CameraType", + (PyObject *)&pgCamera_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgCamera_Type); - if (PyModule_AddObject(module, "Camera", (PyObject *)&pgCamera_Type)) { - Py_DECREF(&pgCamera_Type); + if (PyModule_AddObjectRef(module, "Camera", (PyObject *)&pgCamera_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 7b032671cc..71cfa5a1c5 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2383,9 +2383,8 @@ MODINIT_DEFINE(_freetype) FREETYPE_MOD_STATE(module)->cache_size = 0; FREETYPE_MOD_STATE(module)->resolution = PGFT_DEFAULT_RESOLUTION; - Py_INCREF(&pgFont_Type); - if (PyModule_AddObject(module, FONT_TYPE_NAME, (PyObject *)&pgFont_Type)) { - Py_DECREF(&pgFont_Type); + if (PyModule_AddObjectRef(module, FONT_TYPE_NAME, + (PyObject *)&pgFont_Type)) { Py_DECREF(module); return NULL; } @@ -2416,8 +2415,7 @@ MODINIT_DEFINE(_freetype) c_api[1] = &pgFont_New; apiobj = encapsulate_api(c_api, "freetype"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/base.c b/src_c/base.c index 7363a36c68..368914ae75 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -2396,17 +2396,14 @@ MODINIT_DEFINE(base) /* create the exceptions */ pgExc_SDLError = PyErr_NewException("pygame.error", PyExc_RuntimeError, NULL); - if (PyModule_AddObject(module, "error", pgExc_SDLError)) { - Py_XDECREF(pgExc_SDLError); + if (PyModule_AddObjectRef(module, "error", pgExc_SDLError)) { goto error; } pgExc_BufferError = PyErr_NewException("pygame.BufferError", PyExc_BufferError, NULL); /* Because we need a reference to BufferError in the base module */ - Py_XINCREF(pgExc_BufferError); - if (PyModule_AddObject(module, "BufferError", pgExc_BufferError)) { - Py_XDECREF(pgExc_BufferError); + if (PyModule_AddObjectRef(module, "BufferError", pgExc_BufferError)) { goto error; } @@ -2449,8 +2446,7 @@ MODINIT_DEFINE(base) #endif apiobj = encapsulate_api(c_api, "base"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { goto error; } @@ -2464,8 +2460,7 @@ MODINIT_DEFINE(base) if (!version) { goto error; } - if (PyModule_AddObject(module, "__version__", version)) { - Py_DECREF(version); + if (PyModule_AddObjectRef(module, "__version__", version)) { goto error; } diff --git a/src_c/bufferproxy.c b/src_c/bufferproxy.c index cb81812d52..5d29ab621d 100644 --- a/src_c/bufferproxy.c +++ b/src_c/bufferproxy.c @@ -604,10 +604,8 @@ MODINIT_DEFINE(bufferproxy) return NULL; } - Py_INCREF(&pgBufferProxy_Type); - if (PyModule_AddObject(module, "BufferProxy", - (PyObject *)&pgBufferProxy_Type)) { - Py_DECREF(&pgBufferProxy_Type); + if (PyModule_AddObjectRef(module, "BufferProxy", + (PyObject *)&pgBufferProxy_Type)) { Py_DECREF(module); return NULL; } @@ -619,8 +617,7 @@ MODINIT_DEFINE(bufferproxy) c_api[2] = pgBufferProxy_GetParent; c_api[3] = pgBufferProxy_Trip; apiobj = encapsulate_api(c_api, "bufferproxy"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/color.c b/src_c/color.c index baea8bb96c..39491f76f4 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -2485,15 +2485,10 @@ MODINIT_DEFINE(color) goto error; } - Py_INCREF(&pgColor_Type); - if (PyModule_AddObject(module, "Color", (PyObject *)&pgColor_Type)) { - Py_DECREF(&pgColor_Type); + if (PyModule_AddObjectRef(module, "Color", (PyObject *)&pgColor_Type)) { goto error; } - Py_INCREF(_COLORDICT); - if (PyModule_AddObject(module, "THECOLORS", _COLORDICT)) { - /* Yes, _COLORDICT is decref'd twice here and we want that */ - Py_DECREF(_COLORDICT); + if (PyModule_AddObjectRef(module, "THECOLORS", _COLORDICT)) { goto error; } @@ -2504,8 +2499,7 @@ MODINIT_DEFINE(color) c_api[4] = pg_MappedColorFromObj; apiobj = encapsulate_api(c_api, "color"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { goto error; } return module; diff --git a/src_c/constants.c b/src_c/constants.c index 04b8e0771d..00623b3aaf 100644 --- a/src_c/constants.c +++ b/src_c/constants.c @@ -648,8 +648,7 @@ MODINIT_DEFINE(constants) DEC_CONSTS(FLASH_UNTIL_FOCUSED, -1); #endif - if (PyModule_AddObject(module, "__all__", all_list)) { - Py_DECREF(all_list); + if (PyModule_AddObjectRef(module, "__all__", all_list)) { Py_DECREF(module); return NULL; } diff --git a/src_c/event.c b/src_c/event.c index 79db3f51e3..c9526adf92 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -2578,15 +2578,12 @@ MODINIT_DEFINE(event) return NULL; } - Py_INCREF(&pgEvent_Type); - if (PyModule_AddObject(module, "EventType", (PyObject *)&pgEvent_Type)) { - Py_DECREF(&pgEvent_Type); + if (PyModule_AddObjectRef(module, "EventType", + (PyObject *)&pgEvent_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgEvent_Type); - if (PyModule_AddObject(module, "Event", (PyObject *)&pgEvent_Type)) { - Py_DECREF(&pgEvent_Type); + if (PyModule_AddObjectRef(module, "Event", (PyObject *)&pgEvent_Type)) { Py_DECREF(module); return NULL; } @@ -2605,8 +2602,7 @@ MODINIT_DEFINE(event) c_api[9] = pgEvent_GetMouseButtonUpInfo; apiobj = encapsulate_api(c_api, "event"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/font.c b/src_c/font.c index bbc2987365..1160fa5bc2 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -1422,16 +1422,12 @@ MODINIT_DEFINE(font) return NULL; } - Py_INCREF(&PyFont_Type); - if (PyModule_AddObject(module, "FontType", (PyObject *)&PyFont_Type)) { - Py_DECREF(&PyFont_Type); + if (PyModule_AddObjectRef(module, "FontType", (PyObject *)&PyFont_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&PyFont_Type); - if (PyModule_AddObject(module, "Font", (PyObject *)&PyFont_Type)) { - Py_DECREF(&PyFont_Type); + if (PyModule_AddObjectRef(module, "Font", (PyObject *)&PyFont_Type)) { Py_DECREF(module); return NULL; } @@ -1448,9 +1444,7 @@ MODINIT_DEFINE(font) c_api[0] = &PyFont_Type; c_api[1] = PyFont_New; c_api[2] = &font_initialized; - apiobj = encapsulate_api(c_api, "font"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/geometry.c b/src_c/geometry.c index d55eeb7504..39ced94529 100644 --- a/src_c/geometry.c +++ b/src_c/geometry.c @@ -40,16 +40,12 @@ MODINIT_DEFINE(geometry) return NULL; } - Py_INCREF(&pgCircle_Type); - if (PyModule_AddObject(module, "Circle", (PyObject *)&pgCircle_Type)) { - Py_DECREF(&pgCircle_Type); + if (PyModule_AddObjectRef(module, "Circle", (PyObject *)&pgCircle_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgLine_Type); - if (PyModule_AddObject(module, "Line", (PyObject *)&pgLine_Type)) { - Py_DECREF(&pgLine_Type); + if (PyModule_AddObjectRef(module, "Line", (PyObject *)&pgLine_Type)) { Py_DECREF(module); return NULL; } @@ -57,8 +53,7 @@ MODINIT_DEFINE(geometry) c_api[0] = &pgCircle_Type; c_api[1] = &pgLine_Type; apiobj = encapsulate_api(c_api, "geometry"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/joystick.c b/src_c/joystick.c index 42451f46ef..a95988ebab 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -676,10 +676,8 @@ MODINIT_DEFINE(joystick) return NULL; } - Py_INCREF(&pgJoystick_Type); - if (PyModule_AddObject(module, "JoystickType", - (PyObject *)&pgJoystick_Type)) { - Py_DECREF(&pgJoystick_Type); + if (PyModule_AddObjectRef(module, "JoystickType", + (PyObject *)&pgJoystick_Type)) { Py_DECREF(module); return NULL; } @@ -689,8 +687,7 @@ MODINIT_DEFINE(joystick) c_api[1] = pgJoystick_New; c_api[2] = pgJoystick_GetDeviceIndexByInstanceID; apiobj = encapsulate_api(c_api, "joystick"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/key.c b/src_c/key.c index 18e3b41a70..a4bd1cf1d0 100644 --- a/src_c/key.c +++ b/src_c/key.c @@ -684,10 +684,8 @@ MODINIT_DEFINE(key) return NULL; } - Py_INCREF(&pgScancodeWrapper_Type); - if (PyModule_AddObject(module, _PG_SCANCODEWRAPPER_TYPE_NAME, - (PyObject *)&pgScancodeWrapper_Type)) { - Py_DECREF(&pgScancodeWrapper_Type); + if (PyModule_AddObjectRef(module, _PG_SCANCODEWRAPPER_TYPE_NAME, + (PyObject *)&pgScancodeWrapper_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/mask.c b/src_c/mask.c index 92c2cf9acd..36216cd243 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -2649,16 +2649,12 @@ MODINIT_DEFINE(mask) if (module == NULL) { return NULL; } - Py_INCREF(&pgMask_Type); - if (PyModule_AddObject(module, "MaskType", (PyObject *)&pgMask_Type)) { - Py_DECREF(&pgMask_Type); + if (PyModule_AddObjectRef(module, "MaskType", (PyObject *)&pgMask_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgMask_Type); - if (PyModule_AddObject(module, "Mask", (PyObject *)&pgMask_Type)) { - Py_DECREF(&pgMask_Type); + if (PyModule_AddObjectRef(module, "Mask", (PyObject *)&pgMask_Type)) { Py_DECREF(module); return NULL; } @@ -2666,8 +2662,7 @@ MODINIT_DEFINE(mask) /* export the c api */ c_api[0] = &pgMask_Type; apiobj = encapsulate_api(c_api, "mask"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/math.c b/src_c/math.c index e53e14cd90..94a549147e 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -4573,31 +4573,15 @@ MODINIT_DEFINE(math) } /* add extension types to module */ - Py_INCREF(&pgVector2_Type); - Py_INCREF(&pgVector3_Type); - Py_INCREF(&pgVectorIter_Type); - Py_INCREF(&pgVectorElementwiseProxy_Type); - if ((PyModule_AddObject(module, "Vector2", (PyObject *)&pgVector2_Type) != + if ((PyModule_AddObjectRef(module, "Vector2", + (PyObject *)&pgVector2_Type) < 0) || + (PyModule_AddObjectRef(module, "Vector3", + (PyObject *)&pgVector3_Type) < 0) || + (PyModule_AddObjectRef(module, "VectorElementwiseProxy", + (PyObject *)&pgVectorElementwiseProxy_Type) < 0) || - (PyModule_AddObject(module, "Vector3", (PyObject *)&pgVector3_Type) != - 0) || - (PyModule_AddObject(module, "VectorElementwiseProxy", - (PyObject *)&pgVectorElementwiseProxy_Type) != - 0) || - (PyModule_AddObject(module, "VectorIterator", - (PyObject *)&pgVectorIter_Type) != 0)) { - if (!PyObject_HasAttrString(module, "Vector2")) { - Py_DECREF(&pgVector2_Type); - } - if (!PyObject_HasAttrString(module, "Vector3")) { - Py_DECREF(&pgVector3_Type); - } - if (!PyObject_HasAttrString(module, "VectorElementwiseProxy")) { - Py_DECREF(&pgVectorElementwiseProxy_Type); - } - if (!PyObject_HasAttrString(module, "VectorIterator")) { - Py_DECREF(&pgVectorIter_Type); - } + (PyModule_AddObjectRef(module, "VectorIterator", + (PyObject *)&pgVectorIter_Type) < 0)) { Py_DECREF(module); return NULL; } @@ -4610,8 +4594,7 @@ MODINIT_DEFINE(math) c_api[3] = pgVectorCompatible_Check; */ apiobj = encapsulate_api(c_api, "math"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/mixer.c b/src_c/mixer.c index 38672af019..eab75acaf9 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -2101,28 +2101,22 @@ MODINIT_DEFINE(mixer) return NULL; } - Py_INCREF(&pgSound_Type); - if (PyModule_AddObject(module, "Sound", (PyObject *)&pgSound_Type)) { - Py_DECREF(&pgSound_Type); + if (PyModule_AddObjectRef(module, "Sound", (PyObject *)&pgSound_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgSound_Type); - if (PyModule_AddObject(module, "SoundType", (PyObject *)&pgSound_Type)) { - Py_DECREF(&pgSound_Type); + if (PyModule_AddObjectRef(module, "SoundType", + (PyObject *)&pgSound_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgChannel_Type); - if (PyModule_AddObject(module, "ChannelType", - (PyObject *)&pgChannel_Type)) { - Py_DECREF(&pgChannel_Type); + if (PyModule_AddObjectRef(module, "ChannelType", + (PyObject *)&pgChannel_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgChannel_Type); - if (PyModule_AddObject(module, "Channel", (PyObject *)&pgChannel_Type)) { - Py_DECREF(&pgChannel_Type); + if (PyModule_AddObjectRef(module, "Channel", + (PyObject *)&pgChannel_Type)) { Py_DECREF(module); return NULL; } @@ -2133,16 +2127,14 @@ MODINIT_DEFINE(mixer) c_api[3] = &pgChannel_Type; c_api[4] = pgChannel_New; apiobj = encapsulate_api(c_api, "mixer"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } music = import_music(); if (music) { - if (PyModule_AddObject(module, "music", music)) { - Py_DECREF(music); + if (PyModule_AddObjectRef(module, "music", music)) { Py_DECREF(module); return NULL; } diff --git a/src_c/music.c b/src_c/music.c index 5cc41390bf..7fec8b1a58 100644 --- a/src_c/music.c +++ b/src_c/music.c @@ -628,15 +628,13 @@ MODINIT_DEFINE(mixer_music) } cobj = PyCapsule_New(¤t_music, "pygame.music_mixer._MUSIC_POINTER", NULL); - if (PyModule_AddObject(module, "_MUSIC_POINTER", cobj)) { - Py_XDECREF(cobj); + if (PyModule_AddObjectRef(module, "_MUSIC_POINTER", cobj)) { Py_DECREF(module); return NULL; } cobj = PyCapsule_New(&queue_music, "pygame.music_mixer._QUEUE_POINTER", NULL); - if (PyModule_AddObject(module, "_QUEUE_POINTER", cobj)) { - Py_XDECREF(cobj); + if (PyModule_AddObjectRef(module, "_QUEUE_POINTER", cobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/newbuffer.c b/src_c/newbuffer.c index f58b4c3b4d..fabc5e861d 100644 --- a/src_c/newbuffer.c +++ b/src_c/newbuffer.c @@ -68,8 +68,7 @@ Module_AddSsize_tConstant(PyObject *module, const char *name, Py_ssize_t value) if (!py_value) { return -1; } - if (PyModule_AddObject(module, name, py_value)) { - Py_DECREF(py_value); + if (PyModule_AddObjectRef(module, name, py_value)) { return -1; } return 0; @@ -869,16 +868,13 @@ MODINIT_DEFINE(newbuffer) return NULL; } - Py_INCREF(&BufferMixin_Type); - if (PyModule_AddObject(module, "BufferMixin", - (PyObject *)&BufferMixin_Type)) { - Py_DECREF(&BufferMixin_Type); + if (PyModule_AddObjectRef(module, "BufferMixin", + (PyObject *)&BufferMixin_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&Py_buffer_Type); - if (PyModule_AddObject(module, "Py_buffer", (PyObject *)&Py_buffer_Type)) { - Py_DECREF(&Py_buffer_Type); + if (PyModule_AddObjectRef(module, "Py_buffer", + (PyObject *)&Py_buffer_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/pixelarray.c b/src_c/pixelarray.c index 1486031de6..213351ae2b 100644 --- a/src_c/pixelarray.c +++ b/src_c/pixelarray.c @@ -1936,10 +1936,8 @@ MODINIT_DEFINE(pixelarray) if (!module) { return NULL; } - Py_INCREF(&pgPixelArray_Type); - if (PyModule_AddObject(module, "PixelArray", - (PyObject *)&pgPixelArray_Type)) { - Py_DECREF((PyObject *)&pgPixelArray_Type); + if (PyModule_AddObjectRef(module, "PixelArray", + (PyObject *)&pgPixelArray_Type)) { Py_DECREF(module); return NULL; } @@ -1948,8 +1946,7 @@ MODINIT_DEFINE(pixelarray) c_api[0] = &pgPixelArray_Type; c_api[1] = pgPixelArray_New; apiobj = encapsulate_api(c_api, "pixelarray"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/rect.c b/src_c/rect.c index f3e22f69d8..edcb83e144 100644 --- a/src_c/rect.c +++ b/src_c/rect.c @@ -801,27 +801,20 @@ MODINIT_DEFINE(rect) return NULL; } - Py_INCREF(&pgRect_Type); - if (PyModule_AddObject(module, "RectType", (PyObject *)&pgRect_Type)) { - Py_DECREF(&pgRect_Type); + if (PyModule_AddObjectRef(module, "RectType", (PyObject *)&pgRect_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgRect_Type); - if (PyModule_AddObject(module, "Rect", (PyObject *)&pgRect_Type)) { - Py_DECREF(&pgRect_Type); + if (PyModule_AddObjectRef(module, "Rect", (PyObject *)&pgRect_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgFRect_Type); - if (PyModule_AddObject(module, "FRectType", (PyObject *)&pgFRect_Type)) { - Py_DECREF(&pgFRect_Type); + if (PyModule_AddObjectRef(module, "FRectType", + (PyObject *)&pgFRect_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgFRect_Type); - if (PyModule_AddObject(module, "FRect", (PyObject *)&pgFRect_Type)) { - Py_DECREF(&pgFRect_Type); + if (PyModule_AddObjectRef(module, "FRect", (PyObject *)&pgFRect_Type)) { Py_DECREF(module); return NULL; } @@ -838,8 +831,7 @@ MODINIT_DEFINE(rect) c_api[8] = pgFRect_FromObject; c_api[9] = pgFRect_Normalize; apiobj = encapsulate_api(c_api, "rect"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/render.c b/src_c/render.c index 9f873d615c..ec12214641 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -91,23 +91,19 @@ MODINIT_DEFINE(_render) return NULL; } - Py_INCREF(&pgRenderer_Type); - if (PyModule_AddObject(module, "Renderer", (PyObject *)&pgRenderer_Type)) { - Py_DECREF(&pgRenderer_Type); + if (PyModule_AddObjectRef(module, "Renderer", + (PyObject *)&pgRenderer_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgTexture_Type); - if (PyModule_AddObject(module, "Texture", (PyObject *)&pgTexture_Type)) { - Py_DECREF(&pgTexture_Type); + if (PyModule_AddObjectRef(module, "Texture", + (PyObject *)&pgTexture_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgImage_Type); - if (PyModule_AddObject(module, "Image", (PyObject *)&pgImage_Type)) { - Py_DECREF(&pgImage_Type); + if (PyModule_AddObjectRef(module, "Image", (PyObject *)&pgImage_Type)) { Py_DECREF(module); return NULL; } @@ -116,8 +112,7 @@ MODINIT_DEFINE(_render) c_api[1] = &pgTexture_Type; c_api[2] = &pgImage_Type; apiobj = encapsulate_api(c_api, "_render"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 61e05b9428..0c5b8f0788 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -874,8 +874,7 @@ MODINIT_DEFINE(rwobject) c_api[3] = pg_EncodeString; c_api[4] = pgRWops_FromFileObject; apiobj = encapsulate_api(c_api, "rwobject"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/surface.c b/src_c/surface.c index aaecc7e93f..e42942c82e 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4327,17 +4327,14 @@ MODINIT_DEFINE(surface) Py_DECREF(module); return NULL; } - Py_INCREF(&pgSurface_Type); - if (PyModule_AddObject(module, "SurfaceType", - (PyObject *)&pgSurface_Type)) { - Py_DECREF(&pgSurface_Type); + if (PyModule_AddObjectRef(module, "SurfaceType", + (PyObject *)&pgSurface_Type)) { Py_DECREF(module); return NULL; } - Py_INCREF(&pgSurface_Type); - if (PyModule_AddObject(module, "Surface", (PyObject *)&pgSurface_Type)) { - Py_DECREF(&pgSurface_Type); + if (PyModule_AddObjectRef(module, "Surface", + (PyObject *)&pgSurface_Type)) { Py_DECREF(module); return NULL; } @@ -4348,14 +4345,11 @@ MODINIT_DEFINE(surface) c_api[2] = pgSurface_Blit; c_api[3] = pgSurface_SetSurface; apiobj = encapsulate_api(c_api, "surface"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } - Py_XINCREF(pgSurface_Type.tp_dict); - if (PyModule_AddObject(module, "_dict", pgSurface_Type.tp_dict)) { - Py_XDECREF(pgSurface_Type.tp_dict); + if (PyModule_AddObjectRef(module, "_dict", pgSurface_Type.tp_dict)) { Py_DECREF(module); return NULL; } diff --git a/src_c/surflock.c b/src_c/surflock.c index f34fac3ce4..8f95baacaa 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -234,8 +234,7 @@ MODINIT_DEFINE(surflock) c_api[4] = pgSurface_LockBy; c_api[5] = pgSurface_UnlockBy; apiobj = encapsulate_api(c_api, "surflock"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } diff --git a/src_c/system.c b/src_c/system.c index 2c9e2b4e5f..125747c292 100644 --- a/src_c/system.c +++ b/src_c/system.c @@ -302,8 +302,7 @@ MODINIT_DEFINE(system) return NULL; } - if (PyModule_AddObject(module, "PowerState", PowerState_class)) { - Py_DECREF(PowerState_class); + if (PyModule_AddObjectRef(module, "PowerState", PowerState_class)) { Py_DECREF(module); return NULL; } diff --git a/src_c/time.c b/src_c/time.c index b89e43e9de..e0b8d955c8 100644 --- a/src_c/time.c +++ b/src_c/time.c @@ -754,9 +754,7 @@ MODINIT_DEFINE(time) return NULL; } - Py_INCREF(&PyClock_Type); - if (PyModule_AddObject(module, "Clock", (PyObject *)&PyClock_Type)) { - Py_DECREF(&PyClock_Type); + if (PyModule_AddObjectRef(module, "Clock", (PyObject *)&PyClock_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/window.c b/src_c/window.c index 8e0b1bde50..9ca5af64db 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -1501,17 +1501,14 @@ MODINIT_DEFINE(window) return NULL; } - Py_INCREF(&pgWindow_Type); - if (PyModule_AddObject(module, "Window", (PyObject *)&pgWindow_Type)) { - Py_DECREF(&pgWindow_Type); + if (PyModule_AddObjectRef(module, "Window", (PyObject *)&pgWindow_Type)) { Py_DECREF(module); return NULL; } c_api[0] = &pgWindow_Type; apiobj = encapsulate_api(c_api, "window"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; } From c37b9cd240a0c1e6d349eb20ff85113f18360ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 19 Apr 2025 15:07:46 +0200 Subject: [PATCH 156/441] Replace AddObject with AddObjectRef --- src_c/font.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_c/font.c b/src_c/font.c index 1160fa5bc2..b52aeaadfd 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -1444,6 +1444,7 @@ MODINIT_DEFINE(font) c_api[0] = &PyFont_Type; c_api[1] = PyFont_New; c_api[2] = &font_initialized; + apiobj = encapsulate_api(c_api, "font"); if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_DECREF(module); return NULL; From ec30d0b3b783ebf150441d0ee211acab58efd887 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sun, 20 Apr 2025 19:32:14 +0300 Subject: [PATCH 157/441] swap checking order for numbers and sequences to handle cases where something that is a sequence, implements a numeric protocol and it fails on conversion to double (also improved error checking for PyFloat_AsDouble) --- src_c/math.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index e53e14cd90..e0da7d2e42 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -2280,19 +2280,23 @@ static int _vector2_set(pgVector *self, PyObject *xOrSequence, PyObject *y) { if (xOrSequence) { - if (RealNumber_Check(xOrSequence)) { - self->coords[0] = PyFloat_AsDouble(xOrSequence); - /* scalar constructor. */ - if (y == NULL) { - self->coords[1] = self->coords[0]; + if (pgVectorCompatible_Check(xOrSequence, self->dim)) { + if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 2)) { + return -1; + } + else { return 0; } } - else if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 2)) { + else if (RealNumber_Check(xOrSequence)) { + self->coords[0] = PyFloat_AsDouble(xOrSequence); + if (self->coords[0] == -1.0 && PyErr_Occurred()) { return -1; } - else { + + /* scalar constructor. */ + if (y == NULL) { + self->coords[1] = self->coords[0]; return 0; } } @@ -2323,6 +2327,9 @@ _vector2_set(pgVector *self, PyObject *xOrSequence, PyObject *y) if (RealNumber_Check(y)) { self->coords[1] = PyFloat_AsDouble(y); + if (self->coords[1] == -1.0 && PyErr_Occurred()) { + return -1; + } } else { goto error; From 13c5887443b7635cd849fb40affae993d55fa2d7 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sun, 20 Apr 2025 20:08:55 +0300 Subject: [PATCH 158/441] add tests to prevent a regression --- test/math_test.py | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/test/math_test.py b/test/math_test.py index d8690ff502..8aa2afca8a 100644 --- a/test/math_test.py +++ b/test/math_test.py @@ -6,6 +6,11 @@ import pygame.math from pygame.math import Vector2, Vector3 +try: + import numpy +except ModuleNotFoundError: + numpy = None + IS_PYPY = "PyPy" == platform.python_implementation() @@ -255,6 +260,48 @@ def testConstructionVector2(self): self.assertEqual(v.x, 1.2) self.assertEqual(v.y, 3.4) + def testConstructionNumericSequence(self): + class NumericSequence: + # PyFloat_AsDouble will use this to convert to a float + # so this is testing the implementation a bit + def __float__(self): + raise TypeError("Cannot convert to float") + + def __getitem__(self, index): + return [1, 0][index] + + def __len__(self): + return 2 + + v = Vector2(NumericSequence()) + self.assertEqual(v.x, 1.0) + self.assertEqual(v.y, 0.0) + + def testConstructionNumericNonFloat(self): + class NumericNonFloat: + # PyFloat_AsDouble will use this to convert to a float + # so this is testing the implementation a bit + def __float__(self): + raise TypeError("Cannot convert to float") + + with self.assertRaises(TypeError): + Vector2(NumericNonFloat()) + + with self.assertRaises(TypeError): + Vector2(NumericNonFloat(), NumericNonFloat()) + + with self.assertRaises(TypeError): + Vector2(1.0, NumericNonFloat()) + + @unittest.skipIf(numpy is None, "numpy not available") + def testConstructionNumpyArray(self): + assert numpy is not None + + arr = numpy.array([1.2, 3.4]) + v = Vector2(arr) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + def testAttributeAccess(self): tmp = self.v1.x self.assertEqual(tmp, self.v1.x) @@ -1431,6 +1478,48 @@ def testConstructionMissing(self): self.assertRaises(ValueError, Vector3, 1, 2) self.assertRaises(ValueError, Vector3, x=1, y=2) + def testConstructionNumericSequence(self): + class NumericSequence: + # PyFloat_AsDouble will use this to convert to a float + # so this is testing the implementation a bit + def __float__(self): + raise TypeError("Cannot convert to float") + + def __getitem__(self, index): + return [1, 0][index] + + def __len__(self): + return 2 + + v = Vector2(NumericSequence()) + self.assertEqual(v.x, 1.0) + self.assertEqual(v.y, 0.0) + + def testConstructionNumericNonFloat(self): + class NumericNonFloat: + # PyFloat_AsDouble will use this to convert to a float + # so this is testing the implementation a bit + def __float__(self): + raise TypeError("Cannot convert to float") + + with self.assertRaises(TypeError): + Vector2(NumericNonFloat()) + + with self.assertRaises(TypeError): + Vector2(NumericNonFloat(), NumericNonFloat()) + + with self.assertRaises(TypeError): + Vector2(1.0, NumericNonFloat()) + + @unittest.skipIf(numpy is None, "numpy not available") + def testConstructionNumpyArray(self): + assert numpy is not None + + arr = numpy.array([1.2, 3.4]) + v = Vector2(arr) + self.assertEqual(v.x, 1.2) + self.assertEqual(v.y, 3.4) + def testAttributeAccess(self): tmp = self.v1.x self.assertEqual(tmp, self.v1.x) From 21f2f2eeb28f97a9486c46d1b21fc65a1f04d696 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 07:48:37 +0000 Subject: [PATCH 159/441] Bump uraimo/run-on-arch-action from 3.0.0 to 3.0.1 Bumps [uraimo/run-on-arch-action](https://github.com/uraimo/run-on-arch-action) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/uraimo/run-on-arch-action/releases) - [Commits](https://github.com/uraimo/run-on-arch-action/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: uraimo/run-on-arch-action dependency-version: 3.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-debian-multiarch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian-multiarch.yml b/.github/workflows/build-debian-multiarch.yml index 41e495898c..927b5f841b 100644 --- a/.github/workflows/build-debian-multiarch.yml +++ b/.github/workflows/build-debian-multiarch.yml @@ -68,7 +68,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Build sources and run tests - uses: uraimo/run-on-arch-action@v3.0.0 + uses: uraimo/run-on-arch-action@v3.0.1 id: build with: arch: ${{ matrix.base_image && 'none' || matrix.arch }} @@ -134,7 +134,7 @@ jobs: done - name: Test armv7 wheel on armv6 - uses: uraimo/run-on-arch-action@v3.0.0 + uses: uraimo/run-on-arch-action@v3.0.1 with: arch: armv6 distro: bookworm From 92dd2d66ae0a7e0e9d77e8b0b5f6f37e0262f1d3 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:11:04 +0300 Subject: [PATCH 160/441] fix vector3 tests and also actually fix vector3 init cuz I forgot to before --- src_c/math.c | 29 ++++++++++++++++++++--------- test/math_test.py | 21 +++++++++++++-------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index e0da7d2e42..036c34173c 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -2725,20 +2725,24 @@ static int _vector3_set(pgVector *self, PyObject *xOrSequence, PyObject *y, PyObject *z) { if (xOrSequence) { - if (RealNumber_Check(xOrSequence)) { - self->coords[0] = PyFloat_AsDouble(xOrSequence); - /* scalar constructor. */ - if (y == NULL && z == NULL) { - self->coords[1] = self->coords[0]; - self->coords[2] = self->coords[0]; + if (pgVectorCompatible_Check(xOrSequence, self->dim)) { + if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 3)) { + return -1; + } + else { return 0; } } - else if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 3)) { + else if (RealNumber_Check(xOrSequence)) { + self->coords[0] = PyFloat_AsDouble(xOrSequence); + if (self->coords[0] == -1.0 && PyErr_Occurred()) { return -1; } - else { + + /* scalar constructor. */ + if (y == NULL && z == NULL) { + self->coords[1] = self->coords[0]; + self->coords[2] = self->coords[0]; return 0; } } @@ -2771,7 +2775,14 @@ _vector3_set(pgVector *self, PyObject *xOrSequence, PyObject *y, PyObject *z) else if (y && z) { if (RealNumber_Check(y) && RealNumber_Check(z)) { self->coords[1] = PyFloat_AsDouble(y); + if (self->coords[1] == -1.0 && PyErr_Occurred()) { + return -1; + } + self->coords[2] = PyFloat_AsDouble(z); + if (self->coords[2] == -1.0 && PyErr_Occurred()) { + return -1; + } } else { goto error; diff --git a/test/math_test.py b/test/math_test.py index 8aa2afca8a..0c195835ff 100644 --- a/test/math_test.py +++ b/test/math_test.py @@ -1486,14 +1486,15 @@ def __float__(self): raise TypeError("Cannot convert to float") def __getitem__(self, index): - return [1, 0][index] + return [1, 0, 5][index] def __len__(self): - return 2 + return 3 - v = Vector2(NumericSequence()) + v = Vector3(NumericSequence()) self.assertEqual(v.x, 1.0) self.assertEqual(v.y, 0.0) + self.assertEqual(v.z, 5.0) def testConstructionNumericNonFloat(self): class NumericNonFloat: @@ -1503,22 +1504,26 @@ def __float__(self): raise TypeError("Cannot convert to float") with self.assertRaises(TypeError): - Vector2(NumericNonFloat()) + Vector3(NumericNonFloat()) with self.assertRaises(TypeError): - Vector2(NumericNonFloat(), NumericNonFloat()) + Vector3(NumericNonFloat(), NumericNonFloat(), NumericNonFloat()) with self.assertRaises(TypeError): - Vector2(1.0, NumericNonFloat()) + Vector3(1.0, NumericNonFloat(), 5.0) + + with self.assertRaises(TypeError): + Vector3(1.0, 0.0, NumericNonFloat()) @unittest.skipIf(numpy is None, "numpy not available") def testConstructionNumpyArray(self): assert numpy is not None - arr = numpy.array([1.2, 3.4]) - v = Vector2(arr) + arr = numpy.array([1.2, 3.4, 5.6], dtype=float) + v = Vector3(arr) self.assertEqual(v.x, 1.2) self.assertEqual(v.y, 3.4) + self.assertEqual(v.z, 5.6) def testAttributeAccess(self): tmp = self.v1.x From e76176b1935239632640898b3ebc6608805a2fa7 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 21 Apr 2025 15:28:52 +0530 Subject: [PATCH 161/441] Fix `__class_getitem__` to be positional-only Update sprite.pyi --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index c3b7ece936..3d27f65889 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -144,7 +144,7 @@ _TDirtySprite = TypeVar("_TDirtySprite", bound=_DirtySpriteSupportsGroup) class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] - def __class_getitem__(cls, generic: Any) -> types.GenericAlias: ... + def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[_TSprite]: ... From 1a34396d97fe0600bd90a2bde9c1cfe82eb84b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 26 Apr 2025 11:09:12 +0200 Subject: [PATCH 162/441] Replace AddObject with AddObjectRef --- src_c/_freetype.c | 3 ++- src_c/base.c | 9 ++++++--- src_c/bufferproxy.c | 3 ++- src_c/color.c | 3 ++- src_c/constants.c | 3 ++- src_c/event.c | 3 ++- src_c/font.c | 3 ++- src_c/geometry.c | 3 ++- src_c/joystick.c | 3 ++- src_c/mask.c | 3 ++- src_c/math.c | 3 ++- src_c/mixer.c | 6 ++++-- src_c/music.c | 6 ++++-- src_c/newbuffer.c | 3 ++- src_c/pixelarray.c | 3 ++- src_c/rect.c | 3 ++- src_c/render.c | 3 ++- src_c/rwobject.c | 3 ++- src_c/surface.c | 3 ++- src_c/surflock.c | 3 ++- src_c/system.c | 3 ++- src_c/window.c | 3 ++- 22 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 71cfa5a1c5..512693dfb6 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2415,7 +2415,8 @@ MODINIT_DEFINE(_freetype) c_api[1] = &pgFont_New; apiobj = encapsulate_api(c_api, "freetype"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/base.c b/src_c/base.c index 368914ae75..654e73404a 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -2396,7 +2396,8 @@ MODINIT_DEFINE(base) /* create the exceptions */ pgExc_SDLError = PyErr_NewException("pygame.error", PyExc_RuntimeError, NULL); - if (PyModule_AddObjectRef(module, "error", pgExc_SDLError)) { + if (PyModule_AddObject(module, "error", pgExc_SDLError)) { + Py_XDECREF(pgExc_SDLError); goto error; } @@ -2446,7 +2447,8 @@ MODINIT_DEFINE(base) #endif apiobj = encapsulate_api(c_api, "base"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); goto error; } @@ -2460,7 +2462,8 @@ MODINIT_DEFINE(base) if (!version) { goto error; } - if (PyModule_AddObjectRef(module, "__version__", version)) { + if (PyModule_AddObject(module, "__version__", version)) { + Py_DECREF(version); goto error; } diff --git a/src_c/bufferproxy.c b/src_c/bufferproxy.c index 5d29ab621d..7e06e9b939 100644 --- a/src_c/bufferproxy.c +++ b/src_c/bufferproxy.c @@ -617,7 +617,8 @@ MODINIT_DEFINE(bufferproxy) c_api[2] = pgBufferProxy_GetParent; c_api[3] = pgBufferProxy_Trip; apiobj = encapsulate_api(c_api, "bufferproxy"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/color.c b/src_c/color.c index 39491f76f4..7ebacb83b4 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -2499,7 +2499,8 @@ MODINIT_DEFINE(color) c_api[4] = pg_MappedColorFromObj; apiobj = encapsulate_api(c_api, "color"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); goto error; } return module; diff --git a/src_c/constants.c b/src_c/constants.c index 00623b3aaf..04b8e0771d 100644 --- a/src_c/constants.c +++ b/src_c/constants.c @@ -648,7 +648,8 @@ MODINIT_DEFINE(constants) DEC_CONSTS(FLASH_UNTIL_FOCUSED, -1); #endif - if (PyModule_AddObjectRef(module, "__all__", all_list)) { + if (PyModule_AddObject(module, "__all__", all_list)) { + Py_DECREF(all_list); Py_DECREF(module); return NULL; } diff --git a/src_c/event.c b/src_c/event.c index c9526adf92..35ac437d4e 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -2602,7 +2602,8 @@ MODINIT_DEFINE(event) c_api[9] = pgEvent_GetMouseButtonUpInfo; apiobj = encapsulate_api(c_api, "event"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/font.c b/src_c/font.c index b52aeaadfd..35f20d950a 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -1445,7 +1445,8 @@ MODINIT_DEFINE(font) c_api[1] = PyFont_New; c_api[2] = &font_initialized; apiobj = encapsulate_api(c_api, "font"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/geometry.c b/src_c/geometry.c index 39ced94529..b7164da6fe 100644 --- a/src_c/geometry.c +++ b/src_c/geometry.c @@ -53,7 +53,8 @@ MODINIT_DEFINE(geometry) c_api[0] = &pgCircle_Type; c_api[1] = &pgLine_Type; apiobj = encapsulate_api(c_api, "geometry"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/joystick.c b/src_c/joystick.c index a95988ebab..518e25756e 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -687,7 +687,8 @@ MODINIT_DEFINE(joystick) c_api[1] = pgJoystick_New; c_api[2] = pgJoystick_GetDeviceIndexByInstanceID; apiobj = encapsulate_api(c_api, "joystick"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/mask.c b/src_c/mask.c index 36216cd243..b7fef4d874 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -2662,7 +2662,8 @@ MODINIT_DEFINE(mask) /* export the c api */ c_api[0] = &pgMask_Type; apiobj = encapsulate_api(c_api, "mask"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/math.c b/src_c/math.c index 94a549147e..727e8722a1 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -4594,7 +4594,8 @@ MODINIT_DEFINE(math) c_api[3] = pgVectorCompatible_Check; */ apiobj = encapsulate_api(c_api, "math"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/mixer.c b/src_c/mixer.c index eab75acaf9..19872ec9ea 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -2127,14 +2127,16 @@ MODINIT_DEFINE(mixer) c_api[3] = &pgChannel_Type; c_api[4] = pgChannel_New; apiobj = encapsulate_api(c_api, "mixer"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } music = import_music(); if (music) { - if (PyModule_AddObjectRef(module, "music", music)) { + if (PyModule_AddObject(module, "music", music)) { + Py_DECREF(music); Py_DECREF(module); return NULL; } diff --git a/src_c/music.c b/src_c/music.c index 7fec8b1a58..5cc41390bf 100644 --- a/src_c/music.c +++ b/src_c/music.c @@ -628,13 +628,15 @@ MODINIT_DEFINE(mixer_music) } cobj = PyCapsule_New(¤t_music, "pygame.music_mixer._MUSIC_POINTER", NULL); - if (PyModule_AddObjectRef(module, "_MUSIC_POINTER", cobj)) { + if (PyModule_AddObject(module, "_MUSIC_POINTER", cobj)) { + Py_XDECREF(cobj); Py_DECREF(module); return NULL; } cobj = PyCapsule_New(&queue_music, "pygame.music_mixer._QUEUE_POINTER", NULL); - if (PyModule_AddObjectRef(module, "_QUEUE_POINTER", cobj)) { + if (PyModule_AddObject(module, "_QUEUE_POINTER", cobj)) { + Py_XDECREF(cobj); Py_DECREF(module); return NULL; } diff --git a/src_c/newbuffer.c b/src_c/newbuffer.c index fabc5e861d..fdba603c88 100644 --- a/src_c/newbuffer.c +++ b/src_c/newbuffer.c @@ -68,7 +68,8 @@ Module_AddSsize_tConstant(PyObject *module, const char *name, Py_ssize_t value) if (!py_value) { return -1; } - if (PyModule_AddObjectRef(module, name, py_value)) { + if (PyModule_AddObject(module, name, py_value)) { + Py_DECREF(py_value); return -1; } return 0; diff --git a/src_c/pixelarray.c b/src_c/pixelarray.c index 213351ae2b..539b3ae6e7 100644 --- a/src_c/pixelarray.c +++ b/src_c/pixelarray.c @@ -1946,7 +1946,8 @@ MODINIT_DEFINE(pixelarray) c_api[0] = &pgPixelArray_Type; c_api[1] = pgPixelArray_New; apiobj = encapsulate_api(c_api, "pixelarray"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/rect.c b/src_c/rect.c index edcb83e144..2817fc20f3 100644 --- a/src_c/rect.c +++ b/src_c/rect.c @@ -831,7 +831,8 @@ MODINIT_DEFINE(rect) c_api[8] = pgFRect_FromObject; c_api[9] = pgFRect_Normalize; apiobj = encapsulate_api(c_api, "rect"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/render.c b/src_c/render.c index ec12214641..a2ff057bd0 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -112,7 +112,8 @@ MODINIT_DEFINE(_render) c_api[1] = &pgTexture_Type; c_api[2] = &pgImage_Type; apiobj = encapsulate_api(c_api, "_render"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 0c5b8f0788..61e05b9428 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -874,7 +874,8 @@ MODINIT_DEFINE(rwobject) c_api[3] = pg_EncodeString; c_api[4] = pgRWops_FromFileObject; apiobj = encapsulate_api(c_api, "rwobject"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/surface.c b/src_c/surface.c index e42942c82e..410660565b 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4345,7 +4345,8 @@ MODINIT_DEFINE(surface) c_api[2] = pgSurface_Blit; c_api[3] = pgSurface_SetSurface; apiobj = encapsulate_api(c_api, "surface"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/surflock.c b/src_c/surflock.c index 8f95baacaa..f34fac3ce4 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -234,7 +234,8 @@ MODINIT_DEFINE(surflock) c_api[4] = pgSurface_LockBy; c_api[5] = pgSurface_UnlockBy; apiobj = encapsulate_api(c_api, "surflock"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } diff --git a/src_c/system.c b/src_c/system.c index 125747c292..2c9e2b4e5f 100644 --- a/src_c/system.c +++ b/src_c/system.c @@ -302,7 +302,8 @@ MODINIT_DEFINE(system) return NULL; } - if (PyModule_AddObjectRef(module, "PowerState", PowerState_class)) { + if (PyModule_AddObject(module, "PowerState", PowerState_class)) { + Py_DECREF(PowerState_class); Py_DECREF(module); return NULL; } diff --git a/src_c/window.c b/src_c/window.c index 9ca5af64db..f2976df502 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -1508,7 +1508,8 @@ MODINIT_DEFINE(window) c_api[0] = &pgWindow_Type; apiobj = encapsulate_api(c_api, "window"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_XDECREF(apiobj); Py_DECREF(module); return NULL; } From 32b0cb36b018bee43468131e474ba9580c3a6a73 Mon Sep 17 00:00:00 2001 From: Damiano <97639432+damusss@users.noreply.github.com> Date: Sun, 27 Apr 2025 18:37:44 +0200 Subject: [PATCH 163/441] Add `Color.hex` (#3379) * Add Color.hex * Add DEL_ATTR_NOT_SUPPORTED_CHECK * Fix docs and tests * Formatting This little maneuver took 15 hours! on my Android --------- Co-authored-by: Matiiss <83066658+Matiiss@users.noreply.github.com> --- buildconfig/stubs/pygame/color.pyi | 1 + docs/reST/ref/color.rst | 17 +++++++++++++ src_c/color.c | 36 +++++++++++++++++++++++++++ src_c/doc/color_doc.h | 1 + test/color_test.py | 39 +++++++++++++++++++++++++++++- 5 files changed, 93 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 127c3225f7..1d351656c0 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -18,6 +18,7 @@ class Color(Collection[int]): hsla: tuple[float, float, float, float] i1i2i3: tuple[float, float, float] normalized: tuple[float, float, float, float] + hex: str __hash__: ClassVar[None] # type: ignore[assignment] @property def __array_struct__(self) -> Any: ... diff --git a/docs/reST/ref/color.rst b/docs/reST/ref/color.rst index 4d36c23fcc..2198f7492b 100644 --- a/docs/reST/ref/color.rst +++ b/docs/reST/ref/color.rst @@ -210,6 +210,23 @@ .. ## Color.normalized ## + .. attribute:: hex + + | :sl:`Gets or sets the stringified hexadecimal representation of the Color.` + | :sg:`hex -> str` + + The stringified hexadecimal representation of the Color. The hexadecimal string + is formatted as ``"#rrggbbaa"`` where rr, gg, bb, and aa are two digit hex numbers + in the range from 0x00 to 0xff. + + Setting this property means changing the color channels in place. Both lowercase + and uppercase letters are allowed, the alpha can be omitted (defaults to 0xff) and + the string can start with either ``#`` or ``0x``. + + .. versionadded:: 2.5.4 + + .. ## Color.hex ## + .. classmethod:: from_cmy | :sl:`Returns a Color object from a CMY representation` diff --git a/src_c/color.c b/src_c/color.c index baea8bb96c..9f71e9a0c0 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -156,6 +156,10 @@ _color_get_normalized(pgColorObject *, void *); static int _color_set_normalized(pgColorObject *, PyObject *, void *); static PyObject * +_color_get_hex(pgColorObject *, void *); +static int +_color_set_hex(pgColorObject *, PyObject *, void *); +static PyObject * _color_get_arraystruct(pgColorObject *, void *); /* Number protocol methods */ @@ -269,6 +273,8 @@ static PyGetSetDef _color_getsets[] = { NULL}, {"normalized", (getter)_color_get_normalized, (setter)_color_set_normalized, DOC_COLOR_NORMALIZED, NULL}, + {"hex", (getter)_color_get_hex, (setter)_color_set_hex, DOC_COLOR_HEX, + NULL}, {"__array_struct__", (getter)_color_get_arraystruct, NULL, "array structure interface, read only", NULL}, {NULL, NULL, NULL, NULL, NULL}}; @@ -1543,6 +1549,36 @@ _color_set_normalized(pgColorObject *color, PyObject *value, void *closure) return 0; } +static PyObject * +_color_get_hex(pgColorObject *color, void *closure) +{ + return PyUnicode_FromFormat("#%02x%02x%02x%02x", color->data[0], + color->data[1], color->data[2], + color->data[3]); +} + +static int +_color_set_hex(pgColorObject *color, PyObject *value, void *closure) +{ + DEL_ATTR_NOT_SUPPORTED_CHECK("hex", value); + + if (!PyUnicode_Check(value)) { + PyErr_SetString(PyExc_TypeError, "hex color must be a string"); + return -1; + } + + switch (_hexcolor(value, color->data)) { + case TRISTATE_FAIL: + PyErr_SetString(PyExc_ValueError, "invalid hex string"); + return -1; + case TRISTATE_ERROR: + return -1; /* forward python error */ + default: + return 0; + } + return 0; +} + static PyObject * _color_get_arraystruct(pgColorObject *color, void *closure) { diff --git a/src_c/doc/color_doc.h b/src_c/doc/color_doc.h index 1a469e4a66..a16ba2076b 100644 --- a/src_c/doc/color_doc.h +++ b/src_c/doc/color_doc.h @@ -9,6 +9,7 @@ #define DOC_COLOR_HSLA "hsla -> tuple\nGets or sets the HSLA representation of the Color." #define DOC_COLOR_I1I2I3 "i1i2i3 -> tuple\nGets or sets the I1I2I3 representation of the Color." #define DOC_COLOR_NORMALIZED "normalized -> tuple\nGets or sets the normalized representation of the Color." +#define DOC_COLOR_HEX "hex -> str\nGets or sets the stringified hexadecimal representation of the Color." #define DOC_COLOR_FROMCMY "from_cmy(object, /) -> Color\nfrom_cmy(c, m, y, /) -> Color\nReturns a Color object from a CMY representation" #define DOC_COLOR_FROMHSVA "from_hsva(object, /) -> Color\nfrom_hsva(h, s, v, a, /) -> Color\nReturns a Color object from an HSVA representation" #define DOC_COLOR_FROMHSLA "from_hsla(object, /) -> Color\nfrom_hsla(h, s, l, a, /) -> Color\nReturns a Color object from an HSLA representation" diff --git a/test/color_test.py b/test/color_test.py index bc83a26988..604b8d0078 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -950,6 +950,37 @@ def test_normalize__all_elements_within_limits(self): self.assertTrue(0 <= b <= 1) self.assertTrue(0 <= a <= 1) + def test_hex_property(self): + color = pygame.Color(255, 0, 255, 0) + hex = color.hex + self.assertEqual(hex, "#ff00ff00") + + for c in rgba_combos_Color_generator(): + col_hex = c.hex + self.assertIsInstance(col_hex, str) + self.assertEqual(len(col_hex), 9) + self.assertEqual(col_hex[0], "#") + for char in col_hex: + self.assertIn(char, "#0123456789abcdef") + self.assertEqual(c, pygame.Color(col_hex)) + + with self.assertRaises(TypeError): + color.hex = 0xFFFFFFFF + with self.assertRaises(AttributeError): + del color.hex + + for value in ["FFFFFFFF", "#FFzzFF00", "0x FFFFFF", "#FF"]: + for v in [value, value.lower()]: + with self.assertRaises(ValueError): + color.hex = v + + for value in ["#FFFFFFFF", "#FFFFFF", "0xFFFFFFFF", "0xFFFFFF"]: + for v in [value, value.lower()]: + color.hex = v + self.assertEqual( + (color.r, color.g, color.b, color.a), (255, 255, 255, 255) + ) + def test_issue_284(self): """PyColor OverflowError on HSVA with hue value of 360 @@ -1007,6 +1038,9 @@ def test_i1i2i3__sanity_testing_converted_should_not_raise(self): def test_normalized__sanity_testing_converted_should_not_raise(self): self.colorspaces_converted_should_not_raise("normalized") + def test_hex__sanity_testing_converted_should_not_raise(self): + self.colorspaces_converted_should_not_raise("hex") + ################################################################################ def colorspaces_converted_should_equate_bar_rounding(self, prop): @@ -1021,7 +1055,7 @@ def colorspaces_converted_should_equate_bar_rounding(self, prop): self.assertTrue(abs(other.b - c.b) <= 1) self.assertTrue(abs(other.g - c.g) <= 1) # CMY and I1I2I3 do not care about the alpha - if not prop in ("cmy", "i1i2i3"): + if prop not in ("cmy", "i1i2i3"): self.assertTrue(abs(other.a - c.a) <= 1) except ValueError: @@ -1042,6 +1076,9 @@ def test_i1i2i3__sanity_testing_converted_should_equate_bar_rounding(self): def test_normalized__sanity_testing_converted_should_equate_bar_rounding(self): self.colorspaces_converted_should_equate_bar_rounding("normalized") + def test_hex__sanity_testing_converted_should_equate_bar_rounding(self): + self.colorspaces_converted_should_equate_bar_rounding("hex") + def test_colorspaces_deprecated_large_sequence(self): c = pygame.Color("black") for space in ("hsla", "hsva", "i1i2i3", "cmy", "normalized"): From 30356bada776ccadbd1b00e7575f33938ddba759 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 06:52:56 +0000 Subject: [PATCH 164/441] Bump docker/build-push-action from 6.15.0 to 6.16.0 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.15.0 to 6.16.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/471d1dc4e07e5cdedd4c2171150001c434f0b7a4...14487ce63c7a62a4a324b0bfb37086795e31c6c1) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: 6.16.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 4a9e5a8af1..bcee568983 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -75,7 +75,7 @@ jobs: - name: Build and push Docker image if: steps.inspect.outcome == 'failure' - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 with: context: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base file: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base/Dockerfile-${{ matrix.arch }} From abcc935c75eef84558f332dff01bed37d719c882 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 06:53:01 +0000 Subject: [PATCH 165/441] Bump astral-sh/setup-uv from 5 to 6 Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 5 to 6. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/v5...v6) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index cd039df4d5..9f5acaa5cc 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -132,7 +132,7 @@ jobs: fail-on-cache-miss: true - name: Install uv for speed - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.5.26" diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 8589dd5cba..3fc0f9b206 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -57,7 +57,7 @@ jobs: arch: ${{ matrix.msvc-dev-arch }} - name: Install uv for speed - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.5.26" From 0cc489e0cf651dbb1d301a067411d476e65d7082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Mon, 28 Apr 2025 12:11:35 +0200 Subject: [PATCH 166/441] Remove controller.c from gitignore controller.c is not cython generated file (?) so it shouldn't be ignored by git --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8336497a84..ee57d22510 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,5 @@ buildconfig/win_dll_dirs.json # cython generated files src_c/_sdl2/*.c !/src_c/_sdl2/touch.c +!/src_c/_sdl2/controller.c src_c/pypm.c From e6c1f8cd021d052f70dda30d7ce03f77f4000e92 Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 29 Apr 2025 18:17:43 +0200 Subject: [PATCH 167/441] remade the method to be VARARGS insted of FASTCALL --- .clangd | 2 ++ .my_pygame_test/main.py | 27 +++++++++++++++++++++++ src_c/line.c | 47 ++++++++++++++--------------------------- 3 files changed, 45 insertions(+), 31 deletions(-) create mode 100644 .clangd create mode 100644 .my_pygame_test/main.py diff --git a/.clangd b/.clangd new file mode 100644 index 0000000000..e4a68e17b5 --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + CompilationDatabase: ./.mesonpy-build/ diff --git a/.my_pygame_test/main.py b/.my_pygame_test/main.py new file mode 100644 index 0000000000..00983c4adf --- /dev/null +++ b/.my_pygame_test/main.py @@ -0,0 +1,27 @@ +import pygame +from pygame.geometry import Line + +pygame.init() + +window = pygame.display.set_mode((600, 600)) + +l = Line(10, 10, 200, 200) +p = (1, 1) + +running = True +while running: + + window.fill((255, 255, 255)) + + pygame.draw.line(window, (255, 0, 0), l.a, l.b, 5) + + pygame.draw.circle(window, (0, 255, 0), p, 5) + pygame.draw.circle(window, (0, 255, 0), l.project(p, do_clamp=True), 5) + + pygame.display.flip() + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + +pygame.quit() diff --git a/src_c/line.c b/src_c/line.c index 066a0b2aad..982d236719 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -1,5 +1,7 @@ #include "doc/geometry_doc.h" #include "geometry_common.h" +#include "methodobject.h" +#include "pytypedefs.h" static double pgLine_Length(pgLineBase *line) @@ -179,27 +181,6 @@ _line_scale_helper(pgLineBase *line, double factor, double origin) return 1; } -void -_normalize_vector(double *vector) -{ - double length = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); - // check to see if the vector is zero - if (length == 0) { - vector[0] = 0; - vector[1] = 0; - } - else { - vector[0] /= length; - vector[1] /= length; - } -} - -double -_length_of_vector(double *vector) -{ - return sqrt(vector[0] * vector[0] + vector[1] * vector[1]); -} - static PyObject * _line_project_helper(pgLineBase *line, double *point, int clamp) { @@ -281,21 +262,25 @@ pg_line_scale_ip(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) } static PyObject * -pg_line_project(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwnames) +pg_line_project(pgLineObject *self, PyObject *args, PyObject *kwnames) { double point[2] = {0.f, 0.f}; int clamp = 0; - if (nargs >= 1) { - if (!pg_TwoDoublesFromObj(args[0], &point[0], &point[1])) { - return RAISE(PyExc_TypeError, - "project requires a sequence of two numbers"); - } + PyObject *point_obj = NULL; + + static char *kwlist[] = {"point", "clamp", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwnames, "O|p:project", kwlist, + &point_obj, &clamp)) { + return RAISE( + PyExc_TypeError, + "project requires a sequence(point) and an optional clamp flag"); } - if (kwnames != NULL) { - clamp = PyObject_IsTrue(args[nargs]); + if (!pg_TwoDoublesFromObj(point_obj, &point[0], &point[1])) { + return RAISE(PyExc_TypeError, + "project requires a sequence of two numbers"); } PyObject *projected_point; @@ -319,7 +304,7 @@ static struct PyMethodDef pg_line_methods[] = { {"scale", (PyCFunction)pg_line_scale, METH_FASTCALL, DOC_LINE_SCALE}, {"scale_ip", (PyCFunction)pg_line_scale_ip, METH_FASTCALL, DOC_LINE_SCALEIP}, - {"project", (PyCFunction)pg_line_project, METH_FASTCALL | METH_KEYWORDS, + {"project", (PyCFunction)pg_line_project, METH_VARARGS | METH_KEYWORDS, DOC_LINE_PROJECT}, {NULL, NULL, 0, NULL}}; From 383741f535455ddfdf6424968b6ac4934b8cce1b Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 29 Apr 2025 20:12:15 +0200 Subject: [PATCH 168/441] added proper error handling and and reflected that in the docs and tests --- .my_pygame_test/main.py | 3 +- docs/reST/ref/geometry.rst | 2 + src_c/line.c | 104 ++++++++++++++++++++----------------- test/geometry_test.py | 11 ++++ 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/.my_pygame_test/main.py b/.my_pygame_test/main.py index 00983c4adf..f49ae66c07 100644 --- a/.my_pygame_test/main.py +++ b/.my_pygame_test/main.py @@ -10,11 +10,10 @@ running = True while running: - window.fill((255, 255, 255)) pygame.draw.line(window, (255, 0, 0), l.a, l.b, 5) - + pygame.draw.circle(window, (0, 255, 0), p, 5) pygame.draw.circle(window, (0, 255, 0), l.project(p, do_clamp=True), 5) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index a9c91795d3..032f01dcdb 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -762,6 +762,8 @@ Example of what the clamp argument changes. If it is `True`, the point is bounded between the line segment ends. + WARNING: This method has to have some length or the clamp parameter must be true for it to work and not throw a `ValueError` + .. versionadded:: 2.5.4 .. ## Line.project ## diff --git a/src_c/line.c b/src_c/line.c index 982d236719..0380c3ac26 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -1,6 +1,7 @@ #include "doc/geometry_doc.h" #include "geometry_common.h" #include "methodobject.h" +#include "pyerrors.h" #include "pytypedefs.h" static double @@ -181,46 +182,6 @@ _line_scale_helper(pgLineBase *line, double factor, double origin) return 1; } -static PyObject * -_line_project_helper(pgLineBase *line, double *point, int clamp) -{ - // this is a vector that goes from one point of the line to another - double line_vector[2] = {line->bx - line->ax, line->by - line->ay}; - - // this is a vector that goes from the start of the line to the point we - // are projecting onto the line - double vector_from_line_start_to_point[2] = {point[0] - line->ax, - point[1] - line->ay}; - - double dot_product = - (vector_from_line_start_to_point[0] * line_vector[0] + - vector_from_line_start_to_point[1] * line_vector[1]) / - (line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]); - - double projection[2] = {dot_product * line_vector[0], - dot_product * line_vector[1]}; - - if (clamp) { - if (dot_product < 0) { - projection[0] = 0; - projection[1] = 0; - } - else if (projection[0] * projection[0] + - projection[1] * projection[1] > - line_vector[0] * line_vector[0] + - line_vector[1] * line_vector[1]) { - projection[0] = line_vector[0]; - projection[1] = line_vector[1]; - } - } - - double projected_point[2] = {line->ax + projection[0], - line->ay + projection[1]}; - - return pg_tuple_couple_from_values_double(projected_point[0], - projected_point[1]); -} - static PyObject * pg_line_scale(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) { @@ -261,6 +222,61 @@ pg_line_scale_ip(pgLineObject *self, PyObject *const *args, Py_ssize_t nargs) Py_RETURN_NONE; } +static PyObject * +_line_project_helper(pgLineBase *line, double *point, int clamp) +{ + // this is a vector that goes from one point of the line to another + double line_vector[2] = {line->bx - line->ax, line->by - line->ay}; + double squred_line_length = + line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]; + + if (squred_line_length == 0.0 && clamp) { + double projected_point[2]; + projected_point[0] = line->ax; + projected_point[1] = line->ay; + return pg_tuple_couple_from_values_double(projected_point[0], + projected_point[1]); + } + else if (squred_line_length == 0.0) { + return RAISE(PyExc_ValueError, + "The Line has to have some length or this method has to " + "be clamped to work"); + } + + // this is a vector that goes from the start of the line to the point we + // are projecting onto the line + double vector_from_line_start_to_point[2] = {point[0] - line->ax, + point[1] - line->ay}; + + double dot_product = + (vector_from_line_start_to_point[0] * line_vector[0] + + vector_from_line_start_to_point[1] * line_vector[1]) / + (line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]); + + double projection[2] = {dot_product * line_vector[0], + dot_product * line_vector[1]}; + + if (clamp) { + if (dot_product < 0) { + projection[0] = 0; + projection[1] = 0; + } + else if (projection[0] * projection[0] + + projection[1] * projection[1] > + line_vector[0] * line_vector[0] + + line_vector[1] * line_vector[1]) { + projection[0] = line_vector[0]; + projection[1] = line_vector[1]; + } + } + + double projected_point[2] = {line->ax + projection[0], + line->ay + projection[1]}; + + return pg_tuple_couple_from_values_double(projected_point[0], + projected_point[1]); +} + static PyObject * pg_line_project(pgLineObject *self, PyObject *args, PyObject *kwnames) { @@ -283,13 +299,7 @@ pg_line_project(pgLineObject *self, PyObject *args, PyObject *kwnames) "project requires a sequence of two numbers"); } - PyObject *projected_point; - if (!(projected_point = - _line_project_helper(&pgLine_AsLine(self), point, clamp))) { - return NULL; - } - - return projected_point; + return _line_project_helper(&pgLine_AsLine(self), point, clamp); } static struct PyMethodDef pg_line_methods[] = { diff --git a/test/geometry_test.py b/test/geometry_test.py index 6e09cd2cc1..8d9ab89b08 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2208,6 +2208,9 @@ def test_meth_project(self): test_clamp_point2 = (-50, -150) test_clamp_point3 = (-200, -200) + bad_line = Line(0, 0, 0, 0) + test_bad_line_point = (10, 10) + projected_point = line.project(test_point1) self.assertEqual(math.ceil(projected_point[0]), 50) self.assertEqual(math.ceil(projected_point[1]), 50) @@ -2224,6 +2227,14 @@ def test_meth_project(self): self.assertEqual(math.ceil(projected_point[0]), 0) self.assertEqual(math.ceil(projected_point[1]), 0) + projected_point = bad_line.project(test_bad_line_point, clamp=True) + self.assertEqual(math.ceil(projected_point[0]), 0) + self.assertEqual(math.ceil(projected_point[1]), 0) + + # testing if the method fails when it should + with self.assertRaises(ValueError): + bad_line.project(test_bad_line_point) + def test__str__(self): """Checks whether the __str__ method works correctly.""" l_str = "Line((10.1, 10.2), (4.3, 56.4))" From f7178f6b7af263232f6ac329b31fe5d28a7355c9 Mon Sep 17 00:00:00 2001 From: XFajk Date: Tue, 29 Apr 2025 20:47:10 +0200 Subject: [PATCH 169/441] removed one mistake made --- .my_pygame_test/main.py | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .my_pygame_test/main.py diff --git a/.my_pygame_test/main.py b/.my_pygame_test/main.py deleted file mode 100644 index f49ae66c07..0000000000 --- a/.my_pygame_test/main.py +++ /dev/null @@ -1,26 +0,0 @@ -import pygame -from pygame.geometry import Line - -pygame.init() - -window = pygame.display.set_mode((600, 600)) - -l = Line(10, 10, 200, 200) -p = (1, 1) - -running = True -while running: - window.fill((255, 255, 255)) - - pygame.draw.line(window, (255, 0, 0), l.a, l.b, 5) - - pygame.draw.circle(window, (0, 255, 0), p, 5) - pygame.draw.circle(window, (0, 255, 0), l.project(p, do_clamp=True), 5) - - pygame.display.flip() - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - running = False - -pygame.quit() From e89deaae8a5a9c1910986a0dc6d49df42aeacc82 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:28:46 +0200 Subject: [PATCH 170/441] Update line.c --- src_c/line.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index 0380c3ac26..93a0d7e3d6 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -1,8 +1,6 @@ #include "doc/geometry_doc.h" #include "geometry_common.h" #include "methodobject.h" -#include "pyerrors.h" -#include "pytypedefs.h" static double pgLine_Length(pgLineBase *line) From d06b3835bbafcbb3b9ae72441549d15112fbd735 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:29:29 +0200 Subject: [PATCH 171/441] Update line.c --- src_c/line.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src_c/line.c b/src_c/line.c index 93a0d7e3d6..f03c5874b6 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -1,6 +1,5 @@ #include "doc/geometry_doc.h" #include "geometry_common.h" -#include "methodobject.h" static double pgLine_Length(pgLineBase *line) From 3d20ef27b4ddf785edb8006aa67c0088f8098325 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:53:03 +0200 Subject: [PATCH 172/441] Add back _pixels_address to docs --- buildconfig/stubs/pygame/surface.pyi | 2 ++ docs/reST/ref/surface.rst | 1 + src_c/doc/surface_doc.h | 1 + 3 files changed, 4 insertions(+) diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index eb7e1dfb9f..847a03222b 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -772,6 +772,8 @@ class Surface: example would be ``mysurf.get_frect(center=(100.5, 100.5))`` to create a rectangle for the Surface centered at a given position. Size attributes such as ``size`` or ``w`` can also be applied to resize the FRect. + + ..versionadded:: 2.3.0 """ def get_bitsize(self) -> int: diff --git a/docs/reST/ref/surface.rst b/docs/reST/ref/surface.rst index 0ca76bcf57..47914f67bd 100644 --- a/docs/reST/ref/surface.rst +++ b/docs/reST/ref/surface.rst @@ -7,3 +7,4 @@ .. autopgclass:: Surface :members: + :private-members: +_pixels_address diff --git a/src_c/doc/surface_doc.h b/src_c/doc/surface_doc.h index 1ac7be1cef..6be8f6ffd4 100644 --- a/src_c/doc/surface_doc.h +++ b/src_c/doc/surface_doc.h @@ -50,6 +50,7 @@ #define DOC_SURFACE_GETBOUNDINGRECT "get_bounding_rect(min_alpha=1) -> Rect\nFind the smallest rect containing data." #define DOC_SURFACE_GETVIEW "get_view(kind='2', /) -> BufferProxy\nReturn a buffer view of the Surface's pixels." #define DOC_SURFACE_GETBUFFER "get_buffer() -> BufferProxy\nAcquires a buffer object for the pixels of the Surface." +#define DOC_SURFACE_PIXELSADDRESS "_pixels_address -> int\nPixel buffer address." #define DOC_SURFACE_PREMULALPHA "premul_alpha() -> Surface\nReturns a copy of the surface with the RGB channels pre-multiplied by the alpha channel." #define DOC_SURFACE_PREMULALPHAIP "premul_alpha_ip() -> Surface\nMultiplies the RGB channels by the surface alpha channel." #define DOC_SURFACE_WIDTH "width -> int\nSurface width in pixels (read-only)." From 0c10905a2e71840e12dda5202bdfaeb1edaa1e6f Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sat, 3 May 2025 16:31:50 +0200 Subject: [PATCH 173/441] Replace Ellipsis with ... --- buildconfig/stubs/pygame/image.pyi | 4 +--- docs/reST/ext/documenters.py | 1 + src_c/doc/surface_doc.h | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index 1ff9665810..7dfa4654f7 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -369,9 +369,7 @@ def load_basic(file: FileLike, /) -> Surface: file-like object, or a pathlib.Path. This function only supports loading "basic" image format, ie ``BMP`` - format. - - This function is always available, no matter how pygame was built. + format. This function is always available, no matter how pygame was built. """ def load_extended(file: FileLike, namehint: str = "") -> Surface: diff --git a/docs/reST/ext/documenters.py b/docs/reST/ext/documenters.py index a25b2ba95b..9ecec61f38 100644 --- a/docs/reST/ext/documenters.py +++ b/docs/reST/ext/documenters.py @@ -53,6 +53,7 @@ def build_signatures(object): # Shorten "pygame.module.X" types to "X" ret = re.sub(r"pygame(.[a-zA-Z0-9_]+)+", lambda x: x.group(1)[1:], ret) + ret = ret.replace("Ellipsis", "...") yield f"| :sg:`{name}{arg_string} -> {ret}`" diff --git a/src_c/doc/surface_doc.h b/src_c/doc/surface_doc.h index 6be8f6ffd4..a0f7f8da5a 100644 --- a/src_c/doc/surface_doc.h +++ b/src_c/doc/surface_doc.h @@ -16,7 +16,7 @@ #define DOC_SURFACE_UNLOCK "unlock() -> None\nUnlock the Surface memory from pixel access." #define DOC_SURFACE_MUSTLOCK "mustlock() -> bool\nTest if the Surface requires locking." #define DOC_SURFACE_GETLOCKED "get_locked() -> bool\nTest if the Surface is current locked." -#define DOC_SURFACE_GETLOCKS "get_locks() -> tuple[Any, Ellipsis]\nGets the locks for the Surface." +#define DOC_SURFACE_GETLOCKS "get_locks() -> tuple[Any, ...]\nGets the locks for the Surface." #define DOC_SURFACE_GETAT "get_at(x_y, /) -> Color\nGet the color value at a single pixel." #define DOC_SURFACE_SETAT "set_at(x_y, color, /) -> None\nSet the color value for a single pixel." #define DOC_SURFACE_GETATMAPPED "get_at_mapped(x_y, /) -> int\nGet the mapped color value at a single pixel." From 8234daa0b9901a43e24f992c64f0e5e64ace3d5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 06:54:53 +0000 Subject: [PATCH 174/441] Bump actions/attest-build-provenance from 2.2.3 to 2.3.0 Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 2.2.3 to 2.3.0. - [Release notes](https://github.com/actions/attest-build-provenance/releases) - [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest-build-provenance/compare/v2.2.3...v2.3.0) --- updated-dependencies: - dependency-name: actions/attest-build-provenance dependency-version: 2.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-gh-draft.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index abedbec55b..5f21601dba 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -41,7 +41,7 @@ jobs: run: echo "VER=${GITHUB_REF_NAME#'release/'}" >> $GITHUB_OUTPUT - name: Generate release attestation - uses: actions/attest-build-provenance@v2.2.3 + uses: actions/attest-build-provenance@v2.3.0 with: subject-path: "pygame-wheels/*" From e6019fb88e4e0682877f19836bf9a5d19f9bdf04 Mon Sep 17 00:00:00 2001 From: XORandom <40043238+XORandom@users.noreply.github.com> Date: Fri, 9 May 2025 01:18:08 +0300 Subject: [PATCH 175/441] Update README.ru.rst I've updated the icons and translated a few phrases. --- docs/readmes/README.ru.rst | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/readmes/README.ru.rst b/docs/readmes/README.ru.rst index 57eea35501..faf09373fe 100644 --- a/docs/readmes/README.ru.rst +++ b/docs/readmes/README.ru.rst @@ -9,7 +9,7 @@ |Python3| |GithubCommits| |BlackFormatBadge| `English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ **Русский** ---------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ - бесплатная кроссплатформенная библиотека с открытым исходным кодом для разработки мультимедийных приложений, таких как видеоигры, с использованием Python. @@ -17,7 +17,6 @@ Pygame_ - бесплатная кроссплатформенная библи для абстрагирования наиболее распространенных функций, что делает написание этих программ более интуитивно понятной задачей. - Этот дистрибутив называется **'pygame - Community Edition'** (сокращённо 'pygame-ce'). Это ответвление исходного проекта pygame от его бывших главных разработчиков и было создано после того, как непреодолимые @@ -127,7 +126,6 @@ pygame.org, чтобы другие могли учиться и получат Также большое спасибо Roger Dingledine и команде SEUL.ORG за наш отличный хостинг. - Зависимости ------------ @@ -156,14 +154,14 @@ SDL_rotozoom, а gfxdraw имеет встроенную версию SDL_gfx. ----------------- Прежде всего, спасибо, что согласились внести свой вклад в pygame-ce! Именно такие люди, как вы, делают pygame-ce отличной библиотекой. Пожалуйста, выполните следующие действия, чтобы начать: -1. Read the `Contribution Guidelines`_ and the `Many Ways to Contribute`_ wiki pages. -2. Read the documentataion on `Opening A Pull Request`_ and `Opening a Great Pull Request`_. -3. Read how to `label and link reported issues`_. -4. Check the `issue tracker`_ for open issues that interest you or open a new issue to start a discussion about your idea. +1. Ознакомьтесь со страницами вики `Contribution Guidelines`_ и `Many Ways to Contribute`_. +2. Ознакомьтесь с документацией `Opening A Pull Request`_ и `Opening a Great Pull Request`_. +3. Прочитайте, как сделать `label and link reported issues`_. +4. Проверьте `issue tracker`_ на наличие интересующих вас открытых проблем или создайте новую проблему, чтобы начать обсуждение своей идеи. -There are many more resources throughout the `wiki pages`_ that can help you get started. +На странице `wiki pages`_ есть множество ресурсов, которые могут помочь вам начать. -If you have any questions, please feel free to ask in the `Pygame Community Discord Server`_ or open an issue. +Если у вас есть какие-то вопросы, не стесняйтесь задавать их на `Pygame Community Discord Server`_ или открыв проблему (issue). License ------- @@ -175,8 +173,8 @@ License По сути, это означает, что вы можете использовать pygame в любом проекте, который захотите, но если вы вносите какие-либо изменения или дополнения в саму pygame, они -должны быть выпущены с совместимой лицензией (preferably submitted -back to the pygame-ce project). Игры с закрытым исходным кодом и коммерческие игры - это нормально. +должны быть выпущены с совместимой лицензией (желательно, чтобы они были отправлены +обратно в проект pygame-ce ). Игры с закрытым исходным кодом и коммерческие игры - это нормально. Программы в подкаталоге ``examples`` находятся в открытом доступе. @@ -191,8 +189,8 @@ back to the pygame-ce project). Игры с закрытым исходным .. |Python3| image:: https://img.shields.io/badge/python-3-blue.svg?v=1 -.. |GithubCommits| image:: https://img.shields.io/github.amrom.workers.devmits-since/pygame-community/pygame-ce/2.4.1.svg - :target: https://github.com/pygame-community/pygame-ce/compare/2.4.1...main +.. |GithubCommits| image:: https://img.shields.io/github.amrom.workers.devmits-since/pygame-community/pygame-ce/2.5.2.svg + :target: https://github.com/pygame-community/pygame-ce/compare/2.5.2...main .. |DocsStatus| image:: https://img.shields.io/website?down_message=offline&label=docs&up_message=online&url=https%3A%2F%2Fpyga.me%2Fdocs%2F :target: https://pyga.me/docs/ From 6570f22c4511d8081ae8c301c8ab1de72ba690e8 Mon Sep 17 00:00:00 2001 From: XORandom <40043238+XORandom@users.noreply.github.com> Date: Fri, 9 May 2025 01:51:58 +0300 Subject: [PATCH 176/441] Update README.ru.rst Translation of those parts of links that are better perceived in Russian (100% translation of the page on 2025-05-09) --- docs/readmes/README.ru.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/readmes/README.ru.rst b/docs/readmes/README.ru.rst index faf09373fe..2a7d12f084 100644 --- a/docs/readmes/README.ru.rst +++ b/docs/readmes/README.ru.rst @@ -154,14 +154,14 @@ SDL_rotozoom, а gfxdraw имеет встроенную версию SDL_gfx. ----------------- Прежде всего, спасибо, что согласились внести свой вклад в pygame-ce! Именно такие люди, как вы, делают pygame-ce отличной библиотекой. Пожалуйста, выполните следующие действия, чтобы начать: -1. Ознакомьтесь со страницами вики `Contribution Guidelines`_ и `Many Ways to Contribute`_. -2. Ознакомьтесь с документацией `Opening A Pull Request`_ и `Opening a Great Pull Request`_. -3. Прочитайте, как сделать `label and link reported issues`_. +1. Ознакомьтесь со страницами вики `Руководящие принципы по внесению вклада`_ и `Множество способов внести свой вклад`_. +2. Ознакомьтесь с документацией `Отправка запроса на вытягивание`_ и `Отправка отличного запроса на вытягивание`_. +3. Прочитайте, как `маркировать и связывать сообщённые проблемы`_. 4. Проверьте `issue tracker`_ на наличие интересующих вас открытых проблем или создайте новую проблему, чтобы начать обсуждение своей идеи. -На странице `wiki pages`_ есть множество ресурсов, которые могут помочь вам начать. +На странице `вики-проекта`_ есть множество ресурсов, которые могут помочь вам начать. -Если у вас есть какие-то вопросы, не стесняйтесь задавать их на `Pygame Community Discord Server`_ или открыв проблему (issue). +Если у вас есть какие-то вопросы, не стесняйтесь задавать их на `сервере Discord Pygame Community`_ или открыв проблему (issue). License ------- @@ -205,14 +205,14 @@ License .. _Compilation wiki page: https://github.com/pygame-community/pygame-ce/wiki#compiling .. _docs page: https://pyga.me/docs .. _GNU LGPL version 2.1: https://www.gnu.org/copyleft/lesser.html -.. _Contribution Guidelines: https://github.com/pygame-community/pygame-ce/wiki/Contribution-guidelines -.. _Many Ways to Contribute: https://github.com/pygame-community/pygame-ce/wiki/Many-ways-to-contribute -.. _Opening A Pull Request: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-pull-request -.. _Opening a Great Pull Request: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-great-pull-request +.. _Руководящие принципы по внесению вклада: https://github.com/pygame-community/pygame-ce/wiki/Contribution-guidelines +.. _Множество способов внести свой вклад: https://github.com/pygame-community/pygame-ce/wiki/Many-ways-to-contribute +.. _Отправка запроса на вытягивание: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-pull-request +.. _Отправка отличного запроса на вытягивание: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-great-pull-request .. _issue tracker: https://github.com/pygame-community/pygame-ce/issues -.. _label and link reported issues: https://github.com/pygame-community/pygame-ce/wiki/Labelling-&-linking-reported-issues -.. _Pygame Community Discord Server: https://discord.gg/pygame -.. _wiki pages: https://github.com/pygame-community/pygame-ce/wiki +.. _маркировать и связывать сообщённые проблемы: https://github.com/pygame-community/pygame-ce/wiki/Labelling-&-linking-reported-issues +.. _сервере Discord Pygame Community: https://discord.gg/pygame +.. _вики-проекта: https://github.com/pygame-community/pygame-ce/wiki .. _English: ./../../README.rst .. _简体中文: README.zh-cn.rst From 1876e28036b6284c0d15acda7611b571dc2160a4 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 11 May 2025 01:06:29 -0700 Subject: [PATCH 177/441] Update SDL2 to 2.32.6 --- buildconfig/download_win_prebuilt.py | 8 ++++---- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../manylinux-build/docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 35abaaeeb5..489d6ddd93 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,8 +78,8 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.4/SDL2-devel-2.32.4-VC.zip', - '7acde0592228113acdad3d264c246c6e92a512e4', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.6/SDL2-devel-2.32.6-VC.zip', + 'beab1beb38b0c5a4cc6ebd2d059431e1de631b35', ], [ 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-VC.zip', @@ -269,12 +269,12 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL2-devel-2.32.4-VC/SDL2-2.32.4' + 'SDL2-devel-2.32.6-VC/SDL2-2.32.6' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.32.4' + 'SDL2-2.32.6' ) ) copy( diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index 599f3f5a2a..bf9b51ffe2 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.32.4" +SDL2_VER="2.32.6" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.8" IMG2="SDL2_image-$IMG2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index 04dfc0962d..b884de0ad9 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -36e2f9cc743703f03a4fa161b5a8134ded58be8952cd4a1e019ea013c744ece2ef83eac7a79257ee4ce9190dc79d33108cb6f2613d7f935aebe50af8be100a7b SDL2-2.32.4.tar.gz +2dae8ae9f10e160a50f625daddad891d25e782130e5a5e3f02079d94ab8858aca92ab8871ab19fdf5be6aca83ffeb9c1ea03949841c2506066f12d2bf2332d47 SDL2-2.32.6.tar.gz 5c521ae6a053e1eb6b42dce3ccccdbdb353eb7e9d1bd89392b1913bfc9fbb6b8a9d5506c80e5b7924b51637bb95cd270657ca87dafe60edd5534e333524bc901 SDL2_image-2.8.8.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index 96a721a74a..f58ab5b4ff 100644 --- a/meson.build +++ b/meson.build @@ -109,7 +109,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.4' + sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.6' sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' From 0aff9f36c3b973712a66687fe43284a44b100d2d Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 11 May 2025 15:28:32 -0700 Subject: [PATCH 178/441] Small set_linesize fixes --- docs/reST/ref/font.rst | 10 ++++++---- src_c/font.c | 10 ++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/reST/ref/font.rst b/docs/reST/ref/font.rst index ca22b5e9b5..387f8e4dce 100644 --- a/docs/reST/ref/font.rst +++ b/docs/reST/ref/font.rst @@ -514,10 +514,12 @@ solves no longer exists, it will likely be removed in the future. .. method:: set_linesize | :sl:`set the line space of the font text` - | :sg:`set_linesize(linesize) -> int` + | :sg:`set_linesize(linesize) -> None` - Set the height in pixels for a line of text with the font. When rendering - multiple lines of text this refers to the amount of space between lines. + Set the height in pixels for a line of text with the font. When rendering + multiple lines of text this refers to the amount of space between lines. + + .. versionadded:: 2.5.4 .. ## Font.set_linesize ## @@ -534,7 +536,7 @@ solves no longer exists, it will likely be removed in the future. .. method:: set_point_size | :sl:`set the point size of the font` - | :sg:`set_point_size(size, /) -> int` + | :sg:`set_point_size(size, /) -> None` Sets the point size of the font, which is the value that was used to initialize this font. diff --git a/src_c/font.c b/src_c/font.c index 79ebad543b..7842d225a2 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -235,12 +235,18 @@ font_set_linesize(PyObject *self, PyObject *arg) #if SDL_TTF_VERSION_ATLEAST(2, 24, 0) TTF_Font *font = PyFont_AsFont(self); + + if (!PyLong_Check(arg)) { + return RAISE(PyExc_TypeError, "linesize must be an integer"); + } int linesize = PyLong_AsLong(arg); - if (PyErr_Occurred()) + if (linesize == -1 && PyErr_Occurred()) { return NULL; + } - if (linesize < 0) + if (linesize < 0) { return RAISE(PyExc_ValueError, "linesize must be >= 0"); + } TTF_SetFontLineSkip(font, linesize); From ed59a94d966260e4ace7df885dd6bb7457c0227e Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 11 May 2025 15:52:43 -0700 Subject: [PATCH 179/441] Update font tests and docs --- docs/reST/ref/font.rst | 1 + src_c/doc/font_doc.h | 4 ++-- test/font_test.py | 10 +++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/reST/ref/font.rst b/docs/reST/ref/font.rst index 387f8e4dce..33632edecf 100644 --- a/docs/reST/ref/font.rst +++ b/docs/reST/ref/font.rst @@ -518,6 +518,7 @@ solves no longer exists, it will likely be removed in the future. Set the height in pixels for a line of text with the font. When rendering multiple lines of text this refers to the amount of space between lines. + The value must be non-negative. .. versionadded:: 2.5.4 diff --git a/src_c/doc/font_doc.h b/src_c/doc/font_doc.h index fb21603c75..486e2d9088 100644 --- a/src_c/doc/font_doc.h +++ b/src_c/doc/font_doc.h @@ -29,9 +29,9 @@ #define DOC_FONT_FONT_METRICS "metrics(text, /) -> list\ngets the metrics for each character in the passed string" #define DOC_FONT_FONT_GETITALIC "get_italic() -> bool\ncheck if the text will be rendered italic" #define DOC_FONT_FONT_GETLINESIZE "get_linesize() -> int\nget the line space of the font text" -#define DOC_FONT_FONT_SETLINESIZE "set_linesize(linesize) -> int\nset the line space of the font text" +#define DOC_FONT_FONT_SETLINESIZE "set_linesize(linesize) -> None\nset the line space of the font text" #define DOC_FONT_FONT_GETHEIGHT "get_height() -> int\nget the height of the font" -#define DOC_FONT_FONT_SETPOINTSIZE "set_point_size(size, /) -> int\nset the point size of the font" +#define DOC_FONT_FONT_SETPOINTSIZE "set_point_size(size, /) -> None\nset the point size of the font" #define DOC_FONT_FONT_GETPOINTSIZE "get_point_size() -> int\nget the point size of the font" #define DOC_FONT_FONT_GETASCENT "get_ascent() -> int\nget the ascent of the font" #define DOC_FONT_FONT_GETDESCENT "get_descent() -> int\nget the descent of the font" diff --git a/test/font_test.py b/test/font_test.py index e71b13a652..3e236d52e0 100644 --- a/test/font_test.py +++ b/test/font_test.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -import sys -import os import io -import unittest +import os import pathlib import platform +import sys +import unittest import pygame from pygame import font as pygame_font # So font can be replaced with ftfont @@ -409,6 +409,10 @@ def test_set_linesize(self): # check invalid linesize with self.assertRaises(ValueError): f.set_linesize(-1) + with self.assertRaises(OverflowError): + f.set_linesize(2**100) + with self.assertRaises(TypeError): + f.set_linesize(12.0) def test_metrics(self): # Ensure bytes decoding works correctly. Can only compare results From c1e88843f1ff209dee16875c3147c1ed59d5980e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Mon, 12 May 2025 14:56:26 +0200 Subject: [PATCH 180/441] Port Renderer to C code (#3327) --- buildconfig/stubs/pygame/__init__.pyi | 15 + buildconfig/stubs/pygame/_render.pyi | 81 ++++ buildconfig/stubs/pygame/constants.pyi | 15 + buildconfig/stubs/pygame/locals.pyi | 15 + src_c/constants.c | 16 + src_c/render.c | 628 ++++++++++++++++++++++++- src_c/static.c | 2 +- test/meson.build | 1 + test/render_test.py | 214 +++++++++ 9 files changed, 980 insertions(+), 7 deletions(-) create mode 100644 buildconfig/stubs/pygame/_render.pyi create mode 100644 test/render_test.py diff --git a/buildconfig/stubs/pygame/__init__.pyi b/buildconfig/stubs/pygame/__init__.pyi index 8611d810da..ba617180f4 100644 --- a/buildconfig/stubs/pygame/__init__.pyi +++ b/buildconfig/stubs/pygame/__init__.pyi @@ -109,11 +109,26 @@ from .constants import ( AUDIO_U16SYS as AUDIO_U16SYS, AUDIO_U8 as AUDIO_U8, BIG_ENDIAN as BIG_ENDIAN, + BLENDFACTOR_DST_ALPHA as BLENDFACTOR_DST_ALPHA, + BLENDFACTOR_DST_COLOR as BLENDFACTOR_DST_COLOR, + BLENDFACTOR_ONE as BLENDFACTOR_ONE, + BLENDFACTOR_ONE_MINUS_DST_ALPHA as BLENDFACTOR_ONE_MINUS_DST_ALPHA, + BLENDFACTOR_ONE_MINUS_DST_COLOR as BLENDFACTOR_ONE_MINUS_DST_COLOR, + BLENDFACTOR_ONE_MINUS_SRC_ALPHA as BLENDFACTOR_ONE_MINUS_SRC_ALPHA, + BLENDFACTOR_ONE_MINUS_SRC_COLOR as BLENDFACTOR_ONE_MINUS_SRC_COLOR, + BLENDFACTOR_SRC_ALPHA as BLENDFACTOR_SRC_ALPHA, + BLENDFACTOR_SRC_COLOR as BLENDFACTOR_SRC_COLOR, + BLENDFACTOR_ZERO as BLENDFACTOR_ZERO, BLENDMODE_ADD as BLENDMODE_ADD, BLENDMODE_BLEND as BLENDMODE_BLEND, BLENDMODE_MOD as BLENDMODE_MOD, BLENDMODE_MUL as BLENDMODE_MUL, BLENDMODE_NONE as BLENDMODE_NONE, + BLENDOPERATION_ADD as BLENDOPERATION_ADD, + BLENDOPERATION_MAXIMUM as BLENDOPERATION_MAXIMUM, + BLENDOPERATION_MINIMUM as BLENDOPERATION_MINIMUM, + BLENDOPERATION_REV_SUBTRACT as BLENDOPERATION_REV_SUBTRACT, + BLENDOPERATION_SUBTRACT as BLENDOPERATION_SUBTRACT, BLEND_ADD as BLEND_ADD, BLEND_ALPHA_SDL2 as BLEND_ALPHA_SDL2, BLEND_MAX as BLEND_MAX, diff --git a/buildconfig/stubs/pygame/_render.pyi b/buildconfig/stubs/pygame/_render.pyi new file mode 100644 index 0000000000..2a76653dec --- /dev/null +++ b/buildconfig/stubs/pygame/_render.pyi @@ -0,0 +1,81 @@ +from typing import Optional, Protocol, Union, final + +from pygame.color import Color +from pygame.rect import Rect +from pygame.surface import Surface +from pygame.typing import ColorLike, IntPoint, Point, RectLike, SequenceLike +from pygame.window import Window +from typing_extensions import deprecated # added in 3.13 + +class _DrawableClass(Protocol): + # Object that has the draw method that accepts area and dest arguments + def draw( + self, area: Optional[RectLike] = None, dest: Optional[RectLike] = None + ): ... + +@final +class Renderer: + def __init__( + self, + window: Window, + index: int = -1, + accelerated: int = -1, + vsync: bool = False, + target_texture: bool = False, + ) -> None: ... + def blit( + self, + source: Union["Texture", "Image", _DrawableClass], + dest: Optional[RectLike] = None, + area: Optional[RectLike] = None, + special_flags: int = 0, + ) -> Rect: ... + def clear(self) -> None: ... + def draw_line(self, p1: Point, p2: Point) -> None: ... + def draw_point(self, point: Point) -> None: ... + def draw_quad(self, p1: Point, p2: Point, p3: Point, p4: Point) -> None: ... + def draw_rect(self, rect: RectLike) -> None: ... + def draw_triangle(self, p1: Point, p2: Point, p3: Point) -> None: ... + def fill_quad(self, p1: Point, p2: Point, p3: Point, p4: Point) -> None: ... + def fill_rect(self, rect: RectLike) -> None: ... + def fill_triangle(self, p1: Point, p2: Point, p3: Point) -> None: ... + def get_viewport(self) -> Rect: ... + def present(self) -> None: ... + def set_viewport(self, area: Optional[RectLike]) -> None: ... + def to_surface( + self, surface: Optional[Surface] = None, area: Optional[RectLike] = None + ) -> Surface: ... + @property + def draw_blend_mode(self) -> int: ... + @draw_blend_mode.setter + def draw_blend_mode(self, value: int) -> None: ... + @property + def draw_color(self) -> Color: ... + @draw_color.setter + def draw_color(self, value: ColorLike) -> None: ... + @property + def logical_size(self) -> tuple[int, int]: ... + @logical_size.setter + def logical_size(self, value: IntPoint) -> None: ... + @property + def scale(self) -> tuple[float, float]: ... + @scale.setter + def scale(self, value: Point) -> None: ... + @property + def target(self) -> "Texture": ... + @target.setter + def target(self, value: "Texture") -> None: ... + @classmethod + def compose_custom_blend_mode( + cls, color_mode: SequenceLike[int], alpha_mode: SequenceLike[int] + ) -> int: ... + @classmethod + def from_window(cls, window: Window) -> Renderer: ... + +@final +class Texture: + pass + +@final +class Image: + pass diff --git a/buildconfig/stubs/pygame/constants.pyi b/buildconfig/stubs/pygame/constants.pyi index 2c4f5030f9..a824f88bb5 100644 --- a/buildconfig/stubs/pygame/constants.pyi +++ b/buildconfig/stubs/pygame/constants.pyi @@ -31,11 +31,26 @@ AUDIO_U16MSB: int AUDIO_U16SYS: int AUDIO_U8: int BIG_ENDIAN: int +BLENDFACTOR_DST_ALPHA: int +BLENDFACTOR_DST_COLOR: int +BLENDFACTOR_ONE: int +BLENDFACTOR_ONE_MINUS_DST_ALPHA: int +BLENDFACTOR_ONE_MINUS_DST_COLOR: int +BLENDFACTOR_ONE_MINUS_SRC_ALPHA: int +BLENDFACTOR_ONE_MINUS_SRC_COLOR: int +BLENDFACTOR_SRC_ALPHA: int +BLENDFACTOR_SRC_COLOR: int +BLENDFACTOR_ZERO: int BLENDMODE_ADD: int BLENDMODE_BLEND: int BLENDMODE_MOD: int BLENDMODE_MUL: int BLENDMODE_NONE: int +BLENDOPERATION_ADD: int +BLENDOPERATION_MAXIMUM: int +BLENDOPERATION_MINIMUM: int +BLENDOPERATION_REV_SUBTRACT: int +BLENDOPERATION_SUBTRACT: int BLEND_ADD: int BLEND_ALPHA_SDL2: int BLEND_MAX: int diff --git a/buildconfig/stubs/pygame/locals.pyi b/buildconfig/stubs/pygame/locals.pyi index b1d3a99093..329bda5c2b 100644 --- a/buildconfig/stubs/pygame/locals.pyi +++ b/buildconfig/stubs/pygame/locals.pyi @@ -31,11 +31,26 @@ AUDIO_U16MSB: int AUDIO_U16SYS: int AUDIO_U8: int BIG_ENDIAN: int +BLENDFACTOR_DST_ALPHA: int +BLENDFACTOR_DST_COLOR: int +BLENDFACTOR_ONE: int +BLENDFACTOR_ONE_MINUS_DST_ALPHA: int +BLENDFACTOR_ONE_MINUS_DST_COLOR: int +BLENDFACTOR_ONE_MINUS_SRC_ALPHA: int +BLENDFACTOR_ONE_MINUS_SRC_COLOR: int +BLENDFACTOR_SRC_ALPHA: int +BLENDFACTOR_SRC_COLOR: int +BLENDFACTOR_ZERO: int BLENDMODE_ADD: int BLENDMODE_BLEND: int BLENDMODE_MOD: int BLENDMODE_MUL: int BLENDMODE_NONE: int +BLENDOPERATION_ADD: int +BLENDOPERATION_MAXIMUM: int +BLENDOPERATION_MINIMUM: int +BLENDOPERATION_REV_SUBTRACT: int +BLENDOPERATION_SUBTRACT: int BLEND_ADD: int BLEND_ALPHA_SDL2: int BLEND_MAX: int diff --git a/src_c/constants.c b/src_c/constants.c index 04b8e0771d..07ae11b90a 100644 --- a/src_c/constants.c +++ b/src_c/constants.c @@ -161,6 +161,22 @@ MODINIT_DEFINE(constants) DEC_CONST(BLENDMODE_ADD); DEC_CONST(BLENDMODE_MOD); DEC_CONST(BLENDMODE_MUL); + DEC_CONST(BLENDFACTOR_ZERO); + DEC_CONST(BLENDFACTOR_ONE); + DEC_CONST(BLENDFACTOR_SRC_COLOR); + DEC_CONST(BLENDFACTOR_ONE_MINUS_SRC_COLOR); + DEC_CONST(BLENDFACTOR_SRC_ALPHA); + DEC_CONST(BLENDFACTOR_ONE_MINUS_SRC_ALPHA); + DEC_CONST(BLENDFACTOR_DST_COLOR); + DEC_CONST(BLENDFACTOR_ONE_MINUS_DST_COLOR); + DEC_CONST(BLENDFACTOR_DST_ALPHA); + DEC_CONST(BLENDFACTOR_ONE_MINUS_DST_ALPHA); + DEC_CONST(BLENDOPERATION_ADD); + DEC_CONST(BLENDOPERATION_SUBTRACT); + DEC_CONST(BLENDOPERATION_REV_SUBTRACT); + DEC_CONST(BLENDOPERATION_MINIMUM); + DEC_CONST(BLENDOPERATION_MAXIMUM); + DEC_CONST(GL_STEREO); DEC_CONST(GL_MULTISAMPLEBUFFERS); DEC_CONST(GL_MULTISAMPLESAMPLES); diff --git a/src_c/render.c b/src_c/render.c index 9f873d615c..7dbdf29ccc 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -12,9 +12,603 @@ static PyTypeObject pgTexture_Type; static PyTypeObject pgImage_Type; -static PyMethodDef renderer_methods[] = {{NULL, NULL, 0, NULL}}; +#define pgRenderer_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgRenderer_Type)) -static PyGetSetDef renderer_getset[] = {{NULL, 0, NULL, NULL, NULL}}; +#define pgTexture_Check(x) \ + (PyObject_IsInstance((x), (PyObject *)&pgTexture_Type)) + +#define pgImage_Check(x) (PyObject_IsInstance((x), (PyObject *)&pgImage_Type)) + +#define RENDERER_ERROR_CHECK(x) \ + if (x < 0) { \ + return RAISE(pgExc_SDLError, SDL_GetError()); \ + } + +#define RENDERER_PROPERTY_ERROR_CHECK(x) \ + if (x < 0) { \ + RAISERETURN(pgExc_SDLError, SDL_GetError(), -1); \ + } + +#define PARSE_POINT(obj, x, y, name) \ + if (!pg_TwoFloatsFromObj(obj, &x, &y)) { \ + return RAISE(PyExc_TypeError, "invalid " #name " argument"); \ + } + +static void +texture_renderer_draw(pgTextureObject *self, PyObject *area, PyObject *dest); + +static void +image_renderer_draw(pgImageObject *self, PyObject *area, PyObject *dest); + +/* Renderer implementation */ +static PyObject * +renderer_from_window(PyTypeObject *cls, PyObject *args, PyObject *kwargs) +{ + PyObject *window; + static char *keywords[] = {"window", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", keywords, + &pgWindow_Type, &window)) { + return NULL; + } + pgRendererObject *self = + (pgRendererObject *)(cls->tp_new(cls, NULL, NULL)); + self->window = (pgWindowObject *)window; + if (self->window->_is_borrowed) { + self->_is_borrowed = SDL_TRUE; + } + else { + return RAISE(pgExc_SDLError, + "Window is not created from display module"); + } + self->renderer = SDL_GetRenderer(self->window->_win); + if (!self->renderer) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + self->target = NULL; + Py_INCREF(self); + return (PyObject *)self; +} + +static PyObject * +renderer_draw_point(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *point; + SDL_FPoint pos; + static char *keywords[] = {"point", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &point)) { + return NULL; + } + if (!pg_TwoFloatsFromObj(point, &pos.x, &pos.y)) { + return RAISE(PyExc_TypeError, "invalid argument"); + } + RENDERER_ERROR_CHECK(SDL_RenderDrawPointF(self->renderer, pos.x, pos.y)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_draw_line(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *start, *end; + SDL_FPoint start_pos, end_pos; + static char *keywords[] = {"p1", "p2", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO", keywords, &start, + &end)) { + return NULL; + } + PARSE_POINT(start, start_pos.x, start_pos.y, "p1") + PARSE_POINT(end, end_pos.x, end_pos.y, "p2") + RENDERER_ERROR_CHECK(SDL_RenderDrawLineF( + self->renderer, start_pos.x, start_pos.y, end_pos.x, end_pos.y)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_draw_rect(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *rectobj; + SDL_FRect *rect = NULL, temp; + static char *keywords[] = {"rect", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &rectobj)) { + return NULL; + } + if (!(rect = pgFRect_FromObject(rectobj, &temp))) { + return RAISE(PyExc_TypeError, "rect argument is invalid"); + } + RENDERER_ERROR_CHECK(SDL_RenderDrawRectF(self->renderer, rect)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_fill_rect(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *rectobj; + SDL_FRect *rect = NULL, temp; + static char *keywords[] = {"rect", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &rectobj)) { + return NULL; + } + if (!(rect = pgFRect_FromObject(rectobj, &temp))) { + return RAISE(PyExc_TypeError, "rect argument is invalid"); + } + RENDERER_ERROR_CHECK(SDL_RenderFillRectF(self->renderer, rect)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_draw_triangle(pgRendererObject *self, PyObject *args, + PyObject *kwargs) +{ + PyObject *p1, *p2, *p3; + SDL_FPoint points[4]; + static char *keywords[] = {"p1", "p2", "p3", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", keywords, &p1, &p2, + &p3)) { + return NULL; + } + PARSE_POINT(p1, points[0].x, points[0].y, "p1") + PARSE_POINT(p2, points[1].x, points[1].y, "p2") + PARSE_POINT(p3, points[2].x, points[2].y, "p3") + points[3] = points[0]; + RENDERER_ERROR_CHECK(SDL_RenderDrawLinesF(self->renderer, points, 4)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_fill_triangle(pgRendererObject *self, PyObject *args, + PyObject *kwargs) +{ +#if SDL_VERSION_ATLEAST(2, 0, 18) + PyObject *p1, *p2, *p3; + SDL_Vertex vertices[3]; + static char *keywords[] = {"p1", "p2", "p3", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", keywords, &p1, &p2, + &p3)) { + return NULL; + } + PARSE_POINT(p1, vertices[0].position.x, vertices[0].position.y, "p1") + PARSE_POINT(p2, vertices[1].position.x, vertices[1].position.y, "p2") + PARSE_POINT(p3, vertices[2].position.x, vertices[2].position.y, "p3") + RENDERER_ERROR_CHECK(SDL_GetRenderDrawColor( + self->renderer, &vertices[0].color.r, &vertices[0].color.g, + &vertices[0].color.b, &vertices[0].color.a)) + vertices[1].color = vertices[0].color; + vertices[2].color = vertices[0].color; + RENDERER_ERROR_CHECK( + SDL_RenderGeometry(self->renderer, NULL, vertices, 3, NULL, 0)) + Py_RETURN_NONE; +#else + RAISE(PyExc_TypeError, "fill_triangle() requires SDL 2.0.18 or newer"); + Py_RETURN_NONE; +#endif +} + +static PyObject * +renderer_draw_quad(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *p1, *p2, *p3, *p4; + SDL_FPoint points[5]; + static char *keywords[] = {"p1", "p2", "p3", "p4", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", keywords, &p1, &p2, + &p3, &p4)) { + return NULL; + } + PARSE_POINT(p1, points[0].x, points[0].y, "p1") + PARSE_POINT(p2, points[1].x, points[1].y, "p2") + PARSE_POINT(p3, points[2].x, points[2].y, "p3") + PARSE_POINT(p4, points[3].x, points[3].y, "p4") + points[4] = points[0]; + RENDERER_ERROR_CHECK(SDL_RenderDrawLinesF(self->renderer, points, 5)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_fill_quad(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ +#if SDL_VERSION_ATLEAST(2, 0, 18) + PyObject *p1, *p2, *p3, *p4; + SDL_Vertex vertices[4]; + static char *keywords[] = {"p1", "p2", "p3", "p4", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", keywords, &p1, &p2, + &p3, &p4)) { + return NULL; + } + PARSE_POINT(p1, vertices[0].position.x, vertices[0].position.y, "p1") + PARSE_POINT(p2, vertices[1].position.x, vertices[1].position.y, "p2") + PARSE_POINT(p3, vertices[2].position.x, vertices[2].position.y, "p3") + PARSE_POINT(p4, vertices[3].position.x, vertices[3].position.y, "p4") + RENDERER_ERROR_CHECK(SDL_GetRenderDrawColor( + self->renderer, &vertices[0].color.r, &vertices[0].color.g, + &vertices[0].color.b, &vertices[0].color.a)) + for (int i = 1; i < 4; i++) { + vertices[i].color = vertices[0].color; + } + const int indices[] = {0, 1, 2, 2, 3, 0}; + RENDERER_ERROR_CHECK( + SDL_RenderGeometry(self->renderer, NULL, vertices, 4, indices, 6)) + Py_RETURN_NONE; +#else + RAISE(PyExc_TypeError, "fill_quad() requires SDL 2.0.18 or newer"); + Py_RETURN_NONE; +#endif +} + +static PyObject * +renderer_present(pgRendererObject *self, PyObject *_null) +{ + SDL_RenderPresent(self->renderer); + Py_RETURN_NONE; +} + +static PyObject * +renderer_clear(pgRendererObject *self, PyObject *_null) +{ + RENDERER_ERROR_CHECK(SDL_RenderClear(self->renderer)) + Py_RETURN_NONE; +} + +static PyObject * +renderer_get_viewport(pgRendererObject *self, PyObject *_null) +{ + SDL_Rect rect; + SDL_RenderGetViewport(self->renderer, &rect); + return pgRect_New(&rect); +} + +static PyObject * +renderer_set_viewport(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *rectobj; + SDL_Rect *rect = NULL, temp; + static char *keywords[] = {"area", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &rectobj)) { + return NULL; + } + if (rectobj == Py_None) { + RENDERER_ERROR_CHECK(SDL_RenderSetViewport(self->renderer, NULL)) + } + else { + if (!(rect = pgRect_FromObject(rectobj, &temp))) { + return RAISE(PyExc_TypeError, "area must be rectangle or None"); + } + RENDERER_ERROR_CHECK(SDL_RenderSetViewport(self->renderer, rect)) + } + Py_RETURN_NONE; +} + +static PyObject * +renderer_compose_custom_blend_mode(PyObject *self, PyObject *args, + PyObject *kwargs) +{ + int mode[6]; + SDL_BlendMode blend_mode; + static char *keywords[] = {"color_mode", "alpha_mode", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(iii)(iii)", keywords, + &mode[0], &mode[1], &mode[2], &mode[3], + &mode[4], &mode[5])) { + return NULL; + } + blend_mode = SDL_ComposeCustomBlendMode(mode[0], mode[1], mode[2], mode[3], + mode[4], mode[5]); + return PyLong_FromLong((long)blend_mode); +} + +static PyObject * +renderer_to_surface(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *surfobj = Py_None, *rectobj = Py_None; + SDL_Surface *surf; + pgSurfaceObject *surface; + SDL_Rect viewport, *areaparam, temp, *rect = &temp; + Uint32 format; + static char *keywords[] = {"surface", "area", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO", keywords, &surfobj, + &rectobj)) { + return NULL; + } + if (!Py_IsNone(rectobj)) { + if (!(rect = pgRect_FromObject(rectobj, &temp))) { + return RAISE(PyExc_TypeError, "area must be None or a rect"); + } + SDL_RenderGetViewport(self->renderer, &viewport); + SDL_IntersectRect(rect, &viewport, rect); + areaparam = rect; + } + else { + SDL_RenderGetViewport(self->renderer, rect); + areaparam = NULL; + } + if (!Py_IsNone(surfobj)) { + if (!(pgSurface_Check(surfobj))) { + return RAISE(PyExc_TypeError, "surface must be None or a Surface"); + } + surface = (pgSurfaceObject *)surfobj; + Py_INCREF(surface); + surf = surface->surf; + if (surf->w < rect->w || surf->h < rect->h) { + return RAISE(PyExc_ValueError, "the surface is too small"); + } + format = surf->format->format; + } + else { + format = SDL_GetWindowPixelFormat(self->window->_win); + if (format == SDL_PIXELFORMAT_UNKNOWN) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + surf = SDL_CreateRGBSurfaceWithFormat( + 0, rect->w, rect->h, SDL_BITSPERPIXEL(format), format); + if (surf == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + surface = pgSurface_New(surf); + } + RENDERER_ERROR_CHECK(SDL_RenderReadPixels( + self->renderer, areaparam, format, surf->pixels, surf->pitch)); + return (PyObject *)surface; +} + +static PyObject * +renderer_blit(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *sourceobj, *destobj = Py_None, *areaobj = Py_None; + int special_flags = 0; + static char *keywords[] = {"source", "dest", "area", "special_flags", + NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOi", keywords, + &sourceobj, &destobj, &areaobj, + &special_flags)) { + return NULL; + } + + if (pgTexture_Check(sourceobj)) { + texture_renderer_draw((pgTextureObject *)sourceobj, areaobj, destobj); + } + else if (pgImage_Check(sourceobj)) { + image_renderer_draw((pgImageObject *)sourceobj, areaobj, destobj); + } + else { + if (!PyObject_CallFunctionObjArgs( + PyObject_GetAttrString(sourceobj, "draw"), areaobj, destobj, + NULL)) { + return NULL; + } + } + + if (Py_IsNone(destobj)) { + return renderer_get_viewport(self, NULL); + } + Py_INCREF(destobj); + return destobj; +} + +static PyObject * +renderer_get_draw_color(pgRendererObject *self, void *closure) +{ + Uint8 rgba[4]; + RENDERER_ERROR_CHECK(SDL_GetRenderDrawColor(self->renderer, &rgba[0], + &rgba[1], &rgba[2], &rgba[3])) + return pgColor_NewLength(rgba, 4); +} + +static int +renderer_set_draw_color(pgRendererObject *self, PyObject *arg, void *closure) +{ + Uint8 color[4]; + if (!pg_RGBAFromObjEx(arg, color, PG_COLOR_HANDLE_ALL)) { + return -1; + } + RENDERER_PROPERTY_ERROR_CHECK(SDL_SetRenderDrawColor( + self->renderer, color[0], color[1], color[2], color[3])) + return 0; +} + +static PyObject * +renderer_get_draw_blend_mode(pgRendererObject *self, void *closure) +{ + SDL_BlendMode blend_mode; + RENDERER_ERROR_CHECK( + SDL_GetRenderDrawBlendMode(self->renderer, &blend_mode)) + return PyLong_FromLong((long)blend_mode); +} + +static int +renderer_set_draw_blend_mode(pgRendererObject *self, PyObject *arg, + void *closure) +{ + if (!PyLong_Check(arg)) { + RAISERETURN(PyExc_TypeError, "Draw blend mode must be int", -1); + } + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetRenderDrawBlendMode(self->renderer, (int)PyLong_AsLong(arg))) + return 0; +} + +static PyObject * +renderer_get_logical_size(pgRendererObject *self, void *closure) +{ + int w, h; + SDL_RenderGetLogicalSize(self->renderer, &w, &h); + return pg_tuple_couple_from_values_int(w, h); +} + +static int +renderer_set_logical_size(pgRendererObject *self, PyObject *arg, void *closure) +{ + int w, h; + if (!pg_TwoIntsFromObj(arg, &w, &h)) { + RAISERETURN(PyExc_TypeError, "invalid logical size", -1); + } + RENDERER_PROPERTY_ERROR_CHECK( + SDL_RenderSetLogicalSize(self->renderer, w, h)) + return 0; +} + +static PyObject * +renderer_get_scale(pgRendererObject *self, void *closure) +{ + float x, y; + SDL_RenderGetScale(self->renderer, &x, &y); + return pg_tuple_couple_from_values_double(x, y); +} + +static int +renderer_set_scale(pgRendererObject *self, PyObject *arg, void *closure) +{ + float x, y; + if (!pg_TwoFloatsFromObj(arg, &x, &y)) { + RAISERETURN(PyExc_TypeError, "invalid scale", -1); + } + RENDERER_PROPERTY_ERROR_CHECK(SDL_RenderSetScale(self->renderer, x, y)) + return 0; +} + +static PyObject * +renderer_get_target(pgRendererObject *self, void *closure) +{ + if (self->target == NULL) { + Py_RETURN_NONE; + } + Py_INCREF(self->target); + return (PyObject *)self->target; +} + +static int +renderer_set_target(pgRendererObject *self, PyObject *arg, void *closure) +{ + if (Py_IsNone(arg)) { + self->target = NULL; + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetRenderTarget(self->renderer, NULL)) + return 0; + } + else if (pgTexture_Check(arg)) { + self->target = (pgTextureObject *)arg; + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetRenderTarget(self->renderer, self->target->texture)) + return 0; + } + else { + RAISERETURN(PyExc_TypeError, "target must be Texture object or None", + -1); + } +} + +static int +renderer_init(pgRendererObject *self, PyObject *args, PyObject *kwargs) +{ + SDL_Renderer *renderer = NULL; + pgWindowObject *window; + int index = -1; + int accelerated = -1; + int vsync = 0; + int target_texture = 0; + Uint32 flags = 0; + + char *keywords[] = {"window", "index", "accelerated", + "vsync", "target_texture", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|iipp", keywords, + &pgWindow_Type, &window, &index, + &accelerated, &vsync, &target_texture)) { + return -1; + } + if (accelerated >= 0) { + flags |= + accelerated ? SDL_RENDERER_ACCELERATED : SDL_RENDERER_SOFTWARE; + } + if (vsync) { + flags |= SDL_RENDERER_PRESENTVSYNC; + } + if (target_texture) { + flags |= SDL_RENDERER_TARGETTEXTURE; + } + renderer = SDL_CreateRenderer(window->_win, index, flags); + if (!renderer) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + self->renderer = renderer; + self->window = window; + self->target = NULL; + self->_is_borrowed = SDL_FALSE; + return 0; +} + +static void +renderer_dealloc(pgRendererObject *self, PyObject *_null) +{ + if (!self->_is_borrowed && self->renderer) { + SDL_DestroyRenderer(self->renderer); + } + Py_TYPE(self)->tp_free(self); +} + +/* Texture implementation */ +static void +texture_renderer_draw(pgTextureObject *self, PyObject *area, PyObject *dest) +{ + return; +} + +/* Image implementation */ +static void +image_renderer_draw(pgImageObject *self, PyObject *area, PyObject *dest) +{ + return; +} + +/* Module definition */ +static PyMethodDef renderer_methods[] = { + {"draw_point", (PyCFunction)renderer_draw_point, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_DRAWPOINT}, + {"draw_line", (PyCFunction)renderer_draw_line, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_DRAWLINE}, + {"draw_rect", (PyCFunction)renderer_draw_rect, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_DRAWRECT}, + {"draw_triangle", (PyCFunction)renderer_draw_triangle, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_DRAWTRIANGLE}, + {"draw_quad", (PyCFunction)renderer_draw_quad, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_DRAWQUAD}, + {"fill_rect", (PyCFunction)renderer_fill_rect, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_FILLRECT}, + {"fill_triangle", (PyCFunction)renderer_fill_triangle, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_FILLTRIANGLE}, + {"fill_quad", (PyCFunction)renderer_fill_quad, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_FILLQUAD}, + {"present", (PyCFunction)renderer_present, METH_NOARGS, + DOC_SDL2_VIDEO_RENDERER_PRESENT}, + {"clear", (PyCFunction)renderer_clear, METH_NOARGS, + DOC_SDL2_VIDEO_RENDERER_CLEAR}, + {"set_viewport", (PyCFunction)renderer_set_viewport, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_SETVIEWPORT}, + {"get_viewport", (PyCFunction)renderer_get_viewport, METH_NOARGS, + DOC_SDL2_VIDEO_RENDERER_GETVIEWPORT}, + {"compose_custom_blend_mode", + (PyCFunction)renderer_compose_custom_blend_mode, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + DOC_SDL2_VIDEO_RENDERER_COMPOSECUSTOMBLENDMODE}, + {"from_window", (PyCFunction)renderer_from_window, + METH_CLASS | METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_GETGRABBEDWINDOW}, + {"to_surface", (PyCFunction)renderer_to_surface, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_RENDERER_TOSURFACE}, + {"blit", (PyCFunction)renderer_blit, METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_RENDERER_SETVIEWPORT}, + {NULL, NULL, 0, NULL}}; + +static PyGetSetDef renderer_getset[] = { + {"draw_color", (getter)renderer_get_draw_color, + (setter)renderer_set_draw_color, DOC_SDL2_VIDEO_RENDERER_DRAWCOLOR, NULL}, + {"draw_blend_mode", (getter)renderer_get_draw_blend_mode, + (setter)renderer_set_draw_blend_mode, DOC_SDL2_VIDEO_RENDERER_DRAWCOLOR, + NULL}, + {"logical_size", (getter)renderer_get_logical_size, + (setter)renderer_set_logical_size, DOC_SDL2_VIDEO_RENDERER_LOGICALSIZE, + NULL}, + {"scale", (getter)renderer_get_scale, (setter)renderer_set_scale, + DOC_SDL2_VIDEO_RENDERER_SCALE, NULL}, + {"target", (getter)renderer_get_target, (setter)renderer_set_target, + DOC_SDL2_VIDEO_RENDERER_TARGET, NULL}, + {NULL, 0, NULL, NULL, NULL}}; static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; @@ -27,10 +621,12 @@ static PyGetSetDef image_getset[] = {{NULL, 0, NULL, NULL, NULL}}; static PyTypeObject pgRenderer_Type = { 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, - //.tp_init = (initproc)renderer_init, - .tp_new = PyType_GenericNew, .tp_getset = renderer_getset}; + .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 PyTypeObject pgTexture_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame._render.Texture", @@ -73,6 +669,26 @@ MODINIT_DEFINE(_render) return NULL; } + import_pygame_surface(); + if (PyErr_Occurred()) { + return NULL; + } + + import_pygame_rect(); + if (PyErr_Occurred()) { + return NULL; + } + + import_pygame_color(); + if (PyErr_Occurred()) { + return NULL; + } + + import_pygame_window(); + if (PyErr_Occurred()) { + return NULL; + } + if (PyType_Ready(&pgRenderer_Type) < 0) { return NULL; } diff --git a/src_c/static.c b/src_c/static.c index 2a2a6fe1aa..87c0264d14 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -370,7 +370,6 @@ PyInit_pygame_static() #include "simd_blitters_sse2.c" #include "window.c" -#include "render.c" #undef pgVidInfo_Type #undef pgVidInfo_New @@ -389,6 +388,7 @@ PyInit_pygame_static() #include "rwobject.c" #define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) +#include "render.c" #include "image.c" #include "imageext.c" diff --git a/test/meson.build b/test/meson.build index d789ad01e0..1e2cadfa7d 100644 --- a/test/meson.build +++ b/test/meson.build @@ -35,6 +35,7 @@ test_files = files( 'pixelarray_test.py', 'pixelcopy_test.py', 'rect_test.py', + 'render_test.py', 'rwobject_test.py', 'scrap_tags.py', 'scrap_test.py', diff --git a/test/render_test.py b/test/render_test.py new file mode 100644 index 0000000000..b04a635ddd --- /dev/null +++ b/test/render_test.py @@ -0,0 +1,214 @@ +import unittest + +import pygame +import pygame._render as _render + + +class DrawableObject: + def __init__(self): + self.drawn = False + self.area = None + self.dest = None + + def draw(self, area, dest): + self.drawn = True + self.area = area + self.dest = dest + + +class RendererTest(unittest.TestCase): + def setUp(self): + self.window = pygame.Window(size=(100, 100)) + self.renderer = _render.Renderer(self.window) + + def test_to_surface(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_point((10, 10)) # assumes Renderer.draw_point works + surf1 = self.renderer.to_surface() + self.assertEqual(surf1.get_at((10, 10)), pygame.Color(255, 255, 0, 255)) + self.assertEqual(surf1.size, (100, 100)) + + surf2 = pygame.Surface((150, 150)) + self.renderer.to_surface(surf2) + self.assertEqual(surf2.get_at((10, 10)), pygame.Color(255, 255, 0, 255)) + + surf3 = self.renderer.to_surface(area=pygame.Rect(5, 5, 20, 20)) + self.assertEqual(surf3.get_at((5, 5)), pygame.Color(255, 255, 0, 255)) + self.assertEqual(surf3.size, (20, 20)) + + surf4 = pygame.Surface((150, 150)) + self.renderer.to_surface(surf4, pygame.Rect(7, 7, 40, 40)) + self.assertEqual(surf4.get_at((3, 3)), pygame.Color(255, 255, 0, 255)) + + small_surf = pygame.Surface((50, 50)) + with self.assertRaises(ValueError): + self.renderer.to_surface(small_surf) + + def test_blit(self): + texture = _render.Texture(self.renderer, (20, 20)) + image = _render.Image(texture) + drawable_object = DrawableObject() + dest = pygame.Rect(10, 10, 20, 20) + area = pygame.Rect(0, 0, 15, 15) + + self.renderer.blit( + texture, dest, area + ) # TODO Assert after Texture implementation + + self.renderer.blit(image, dest, area) # TODO Assert after Image implementation + + self.renderer.blit(drawable_object, dest, area) + self.assertEqual(drawable_object.drawn, True) + self.assertEqual(drawable_object.area, area) + self.assertEqual(drawable_object.dest, dest) + + def test_clear(self): + self.renderer.draw_color = "YELLOW" + self.renderer.clear() + surf = self.renderer.to_surface() + for x in range(surf.width): + for y in range(surf.height): + self.assertEqual(surf.get_at((x, y)), pygame.Color(255, 255, 0, 255)) + + def test_draw_point(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_point((10, 10)) + surf = self.renderer.to_surface() + for x in range(-1, 2): + for y in range(-1, 2): + if x or y: + self.assertEqual( + surf.get_at((10 + x, 10 + y)), pygame.Color(0, 0, 0, 255) + ) + else: + self.assertEqual( + surf.get_at((10, 10)), pygame.Color(255, 255, 0, 255) + ) + + def test_draw_line(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_line((10, 10), (40, 40)) + surf = self.renderer.to_surface() + test_points = ((10, 10), (20, 20), (30, 30), (40, 40)) + for point in test_points: + self.assertEqual(surf.get_at(point), pygame.Color(255, 255, 0, 255)) + + def test_draw_triangle(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_triangle((10, 10), (10, 40), (40, 10)) + surf = self.renderer.to_surface() + test_points = ( + (10, 10), + (20, 10), + (30, 10), + (40, 10), + (10, 20), + (30, 20), + (10, 30), + (20, 30), + (10, 40), + ) + for point in test_points: + self.assertEqual(surf.get_at(point), pygame.Color(255, 255, 0, 255)) + + def test_draw_rect(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_rect(pygame.Rect(10, 10, 11, 11)) + surf = self.renderer.to_surface() + test_points = ((10, 15), (15, 10), (20, 15), (15, 20)) + for point in test_points: + self.assertEqual(surf.get_at(point), pygame.Color(255, 255, 0, 255)) + + def test_draw_quad(self): + self.renderer.draw_color = "YELLOW" + self.renderer.draw_quad((10, 40), (40, 10), (70, 40), (40, 70)) + surf = self.renderer.to_surface() + test_points = ((30, 20), (50, 20), (30, 60), (50, 60)) + for point in test_points: + self.assertEqual(surf.get_at(point), pygame.Color(255, 255, 0, 255)) + + def test_fill_triangle(self): + self.renderer.draw_color = "YELLOW" + self.renderer.fill_triangle((10, 10), (10, 40), (40, 10)) + surf = self.renderer.to_surface() + for x in range(10, 29): + self.assertEqual(surf.get_at((x, 20)), pygame.Color(255, 255, 0, 255)) + for x in range(10, 19): + self.assertEqual(surf.get_at((x, 30)), pygame.Color(255, 255, 0, 255)) + + def test_fill_rect(self): + self.renderer.draw_color = "YELLOW" + self.renderer.fill_rect(pygame.Rect(10, 10, 11, 11)) + surf = self.renderer.to_surface() + for x in range(10, 21): + for y in range(10, 21): + self.assertEqual(surf.get_at((x, y)), pygame.Color(255, 255, 0, 255)) + + def test_fill_quad(self): + self.renderer.draw_color = "GREEN" + self.renderer.draw_quad((10, 40), (40, 10), (70, 40), (40, 70)) + self.renderer.draw_color = "YELLOW" + self.renderer.fill_quad((10, 40), (40, 10), (70, 40), (40, 70)) + surf = self.renderer.to_surface() + for x in range(30, 50): + self.assertEqual(surf.get_at((x, 20)), pygame.Color(255, 255, 0, 255)) + self.assertEqual(surf.get_at((x, 59)), pygame.Color(255, 255, 0, 255)) + + def test_viewport(self): + self.assertEqual(self.renderer.get_viewport(), pygame.Rect(0, 0, 100, 100)) + self.renderer.set_viewport(pygame.Rect(20, 20, 60, 60)) + self.assertEqual(self.renderer.get_viewport(), pygame.Rect(20, 20, 60, 60)) + self.renderer.set_viewport(None) + self.assertEqual(self.renderer.get_viewport(), pygame.Rect(0, 0, 100, 100)) + + 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)) + + def test_scale(self): + self.assertEqual(self.renderer.scale, (1.0, 1.0)) + self.renderer.scale = (0.5, 2) + self.assertEqual(self.renderer.scale, (0.5, 2.0)) + + def test_target(self): + self.assertEqual(self.renderer.target, None) + texture = _render.Texture(self.renderer, (10, 10), target=True) + self.renderer.target = texture + self.assertEqual(id(self.renderer.target), id(texture)) + self.renderer.target = None + self.assertEqual(self.renderer.target, None) + + @unittest.skip("Unable to create that blend_mode on all devices") + def test_compose_custom_blend_mode(self): + color_mode, alpha_mode = ( + ( + pygame.BLENDFACTOR_SRC_COLOR, + pygame.BLENDFACTOR_ONE_MINUS_DST_COLOR, + pygame.BLENDOPERATION_MAXIMUM, + ), + ( + pygame.BLENDFACTOR_ONE_MINUS_SRC_ALPHA, + pygame.BLENDFACTOR_DST_ALPHA, + pygame.BLENDOPERATION_MINIMUM, + ), + ) + custom_blend_mode = self.renderer.compose_custom_blend_mode( + color_mode, alpha_mode + ) + self.assertEqual(custom_blend_mode, 157550645) + self.renderer.draw_blend_mode = custom_blend_mode + self.assertEqual(self.renderer.draw_blend_mode, custom_blend_mode) + + def test_draw_blend_mode(self): + self.assertEqual(self.renderer.draw_blend_mode, pygame.BLENDMODE_NONE) + self.renderer.draw_blend_mode = pygame.BLENDMODE_MUL + self.assertEqual(self.renderer.draw_blend_mode, pygame.BLENDMODE_MUL) + unsupported_blend_mode = pygame.BLENDMODE_MUL + 1 + with self.assertRaises(Exception): + self.renderer.draw_blend_mode = unsupported_blend_mode + + def test_draw_color(self): + self.assertEqual(self.renderer.draw_color, pygame.Color(0, 0, 0, 0)) + self.renderer.draw_color = "YELLOW" + self.assertEqual(self.renderer.draw_color, pygame.Color(255, 255, 0, 255)) From 3838bf6116acf6dfc8523ee0155755bd138b7c77 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Mon, 3 Mar 2025 00:05:41 -0800 Subject: [PATCH 181/441] Restructure and port surface init and convert to SDL3 --- src_c/surface.c | 246 ++++++++++++++++++++++-------------------------- 1 file changed, 115 insertions(+), 131 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index aaecc7e93f..35d2a8be2a 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -483,7 +483,7 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) int bpp; Uint32 Rmask, Gmask, Bmask, Amask; SDL_Surface *surface; - SDL_PixelFormat default_format; + PG_PixelFormatEnum format = SDL_PIXELFORMAT_UNKNOWN; char *kwids[] = {"size", "flags", "depth", "masks", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwids, &size, &flags, @@ -510,8 +510,6 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) return -1; } - default_format.palette = NULL; - surface_cleanup(self); if (depth && masks) { /* all info supplied, most errorchecking @@ -539,6 +537,8 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) "invalid mask values in masks sequence"); return -1; } + + format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); } else if (depth && PyNumber_Check(depth)) { /* use default masks */ if (!pg_IntFromObj(depth, &bpp)) { @@ -549,16 +549,10 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) if (flags & PGS_SRCALPHA) { switch (bpp) { case 16: - Rmask = 0xF << 8; - Gmask = 0xF << 4; - Bmask = 0xF; - Amask = 0xF << 12; + format = SDL_PIXELFORMAT_ARGB4444; break; case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; - Amask = 0xFF << 24; + format = SDL_PIXELFORMAT_ARGB8888; break; default: PyErr_SetString( @@ -569,33 +563,28 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) } } else { - Amask = 0; switch (bpp) { case 8: - Rmask = 0; - Gmask = 0; - Bmask = 0; + format = SDL_PIXELFORMAT_INDEX8; break; case 12: - Rmask = 0xFF >> 4 << 8; - Gmask = 0xFF >> 4 << 4; - Bmask = 0xFF >> 4; + format = SDL_PIXELFORMAT_XRGB4444; break; case 15: - Rmask = 0xFF >> 3 << 10; - Gmask = 0xFF >> 3 << 5; - Bmask = 0xFF >> 3; + format = SDL_PIXELFORMAT_XRGB1555; break; case 16: - Rmask = 0xFF >> 3 << 11; - Gmask = 0xFF >> 2 << 5; - Bmask = 0xFF >> 3; + format = SDL_PIXELFORMAT_RGB565; break; case 24: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + format = SDL_PIXELFORMAT_RGB24; +#else + format = SDL_PIXELFORMAT_BGR24; +#endif + break; case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; + format = SDL_PIXELFORMAT_XRGB8888; break; default: PyErr_SetString(PyExc_ValueError, @@ -605,44 +594,27 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) } } else { /* no depth or surface */ - SDL_PixelFormat *pix; if (depth && pgSurface_Check(depth)) { - pix = ((pgSurfaceObject *)depth)->surf->format; + format = PG_SURF_FORMATENUM(((pgSurfaceObject *)depth)->surf); } else if (pg_GetDefaultWindowSurface()) { - pix = pgSurface_AsSurface(pg_GetDefaultWindowSurface())->format; + format = PG_SURF_FORMATENUM( + pgSurface_AsSurface(pg_GetDefaultWindowSurface())); } else { - pix = &default_format; -#if SDL_VERSION_ATLEAST(3, 0, 0) - pix->bits_per_pixel = 32; -#else - pix->BitsPerPixel = 32; -#endif - pix->Amask = 0; - pix->Rmask = 0xFF0000; - pix->Gmask = 0xFF00; - pix->Bmask = 0xFF; + format = SDL_PIXELFORMAT_XRGB8888; } - bpp = PG_FORMAT_BitsPerPixel(pix); if (flags & PGS_SRCALPHA) { - switch (bpp) { + switch (SDL_BITSPERPIXEL(format)) { case 16: - Rmask = 0xF << 8; - Gmask = 0xF << 4; - Bmask = 0xF; - Amask = 0xF << 12; + format = SDL_PIXELFORMAT_ARGB4444; break; case 24: - bpp = 32; // we automatically step up to 32 if video is 24, fall // through to case below case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; - Amask = 0xFF << 24; + format = SDL_PIXELFORMAT_ARGB8888; break; default: PyErr_SetString( @@ -652,22 +624,14 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) return -1; } } - else { - Rmask = pix->Rmask; - Gmask = pix->Gmask; - Bmask = pix->Bmask; - Amask = pix->Amask; - } } - Uint32 pxformat = - SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); - if (pxformat == SDL_PIXELFORMAT_UNKNOWN) { + if (format == SDL_PIXELFORMAT_UNKNOWN) { PyErr_SetString(PyExc_ValueError, "Invalid mask values"); return -1; } - surface = PG_CreateSurface(width, height, pxformat); + surface = PG_CreateSurface(width, height, format); if (!surface) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; @@ -685,17 +649,29 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) * See Github issue: * https://github.com/pygame-community/pygame-ce/issues/796 */ - if (Amask != 0) { + PG_PixelFormat *surf_format; + SDL_Palette *surf_palette; + if (!PG_GetSurfaceDetails(surface, &surf_format, &surf_palette)) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + SDL_FreeSurface(surface); + return -1; + } + + if (surf_format->Amask != 0) { SDL_FillRect(surface, NULL, - SDL_MapRGBA(surface->format, 0, 0, 0, 255)); + PG_MapRGBA(surf_format, surf_palette, 0, 0, 0, 255)); } } if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surface))) { /* Give the surface something other than an all white palette. * */ - if (SDL_SetPaletteColors(surface->format->palette, - default_palette_colors, 0, +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_Palette *surf_palette = SDL_CreateSurfacePalette(surface); +#else + SDL_Palette *surf_palette = PG_GetSurfacePalette(surface); +#endif + if (SDL_SetPaletteColors(surf_palette, default_palette_colors, 0, default_palette_size - 1) != 0) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(surface); @@ -1496,13 +1472,20 @@ surf_convert(pgSurfaceObject *self, PyObject *args) pgSurface_Prep(self); if ((has_colorkey = SDL_HasColorKey(surf))) { + PG_PixelFormat *surf_format; + SDL_Palette *surf_palette; + if (!PG_GetSurfaceDetails(surf, &surf_format, &surf_palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + SDL_GetColorKey(surf, &colorkey); if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) { - SDL_GetRGBA(colorkey, surf->format, &key_r, &key_g, &key_b, - &key_a); + PG_GetRGBA(colorkey, surf_format, surf_palette, &key_r, &key_g, + &key_b, &key_a); } else { - SDL_GetRGB(colorkey, surf->format, &key_r, &key_g, &key_b); + PG_GetRGB(colorkey, surf_format, surf_palette, &key_r, &key_g, + &key_b); } } @@ -1515,26 +1498,18 @@ surf_convert(pgSurfaceObject *self, PyObject *args) /* will be updated later, initialize to make static analyzer happy */ int bpp = 0; - SDL_Palette *palette = SDL_AllocPalette(default_palette_size); - SDL_PixelFormat format; + SDL_Palette *palette = NULL; + PG_PixelFormatEnum format_enum = SDL_PIXELFORMAT_UNKNOWN; - memcpy(&format, surf->format, sizeof(format)); + // PATH 1 = from bpp if (pg_IntFromObj(argobject, &bpp)) { - Uint32 Rmask, Gmask, Bmask, Amask; - if (flags != UINT32_MAX && flags & PGS_SRCALPHA) { switch (bpp) { case 16: - Rmask = 0xF << 8; - Gmask = 0xF << 4; - Bmask = 0xF; - Amask = 0xF << 12; + format_enum = SDL_PIXELFORMAT_ARGB4444; break; case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; - Amask = 0xFF << 24; + format_enum = SDL_PIXELFORMAT_ARGB8888; break; default: return RAISE(PyExc_ValueError, @@ -1543,63 +1518,63 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } } else { - Amask = 0; switch (bpp) { case 8: - Rmask = 0; - Gmask = 0; - Bmask = 0; + format_enum = SDL_PIXELFORMAT_INDEX8; break; case 12: - Rmask = 0xFF >> 4 << 8; - Gmask = 0xFF >> 4 << 4; - Bmask = 0xFF >> 4; + format_enum = SDL_PIXELFORMAT_XRGB4444; break; case 15: - Rmask = 0xFF >> 3 << 10; - Gmask = 0xFF >> 3 << 5; - Bmask = 0xFF >> 3; + format_enum = SDL_PIXELFORMAT_XRGB1555; break; case 16: - Rmask = 0xFF >> 3 << 11; - Gmask = 0xFF >> 2 << 5; - Bmask = 0xFF >> 3; + format_enum = SDL_PIXELFORMAT_RGB565; break; case 24: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + format_enum = SDL_PIXELFORMAT_RGB24; +#else + format_enum = SDL_PIXELFORMAT_BGR24; +#endif + break; case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; + format_enum = SDL_PIXELFORMAT_XRGB8888; break; default: return RAISE(PyExc_ValueError, "nonstandard bit depth given"); } } - format.Rmask = Rmask; - format.Gmask = Gmask; - format.Bmask = Bmask; - format.Amask = Amask; } + // PATH 2 = from masks only else if (PySequence_Check(argobject) && PySequence_Size(argobject) == 4) { - Uint32 mask; + Uint32 Rmask, Gmask, Bmask, Amask; - if (!pg_UintFromObjIndex(argobject, 0, &format.Rmask) || - !pg_UintFromObjIndex(argobject, 1, &format.Gmask) || - !pg_UintFromObjIndex(argobject, 2, &format.Bmask) || - !pg_UintFromObjIndex(argobject, 3, &format.Amask)) { + if (!pg_UintFromObjIndex(argobject, 0, &Rmask) || + !pg_UintFromObjIndex(argobject, 1, &Gmask) || + !pg_UintFromObjIndex(argobject, 2, &Bmask) || + !pg_UintFromObjIndex(argobject, 3, &Amask)) { pgSurface_Unprep(self); return RAISE(PyExc_ValueError, "invalid color masks given"); } - mask = - format.Rmask | format.Gmask | format.Bmask | format.Amask; + Uint32 mask = Rmask | Gmask | Bmask | Amask; + + // This code shocked me. -Starbuck, Mar. 2025 + // Like what if you have a hole in the mask? + // Like a blank alpha mask first-- it would just terminate + // the whole loop right? + // I think this whole code path should be deprecated. for (bpp = 0; bpp < 32; ++bpp) { if (!(mask >> bpp)) { break; } } + + format_enum = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, + Bmask, Amask); } else { pgSurface_Unprep(self); @@ -1607,40 +1582,45 @@ surf_convert(pgSurfaceObject *self, PyObject *args) PyExc_ValueError, "invalid argument specifying new format to convert to"); } -#if SDL_VERSION_ATLEAST(3, 0, 0) - format.bits_per_pixel = (Uint8)bpp; - format.bytes_per_pixel = (bpp + 7) / 8; -#else - format.BitsPerPixel = (Uint8)bpp; - format.BytesPerPixel = (bpp + 7) / 8; -#endif - if (PG_FORMAT_BitsPerPixel((&format)) > 8) { - /* Allow a 8 bit source surface with an empty palette to be - * converted to a format without a palette (pygame-ce issue - * #146). If the target format has a non-NULL palette pointer - * then SDL_ConvertSurface checks that the palette is not - * empty-- that at least one entry is not black. - */ - format.palette = NULL; - } - if (SDL_ISPIXELFORMAT_INDEXED(SDL_MasksToPixelFormatEnum( - PG_FORMAT_BitsPerPixel((&format)), format.Rmask, - format.Gmask, format.Bmask, format.Amask))) { + + // If the destination format is indexed, provide a new palette or + // copy over existing palette. + if (SDL_ISPIXELFORMAT_INDEXED(format_enum)) { if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { - SDL_SetPixelFormatPalette(&format, surf->format->palette); + palette = PG_GetSurfacePalette(surf); } else { /* Give the surface something other than an all white * palette. */ + palette = SDL_AllocPalette(default_palette_size); SDL_SetPaletteColors(palette, default_palette_colors, 0, default_palette_size); - SDL_SetPixelFormatPalette(&format, palette); } } - newsurf = PG_ConvertSurface(surf, &format); + +#if SDL_VERSION_ATLEAST(3, 0, 0) + newsurf = SDL_ConvertSurfaceAndColorspace( + surf, format_enum, palette, SDL_GetSurfaceColorspace(surf), 0); +#else + SDL_PixelFormat *format = SDL_AllocFormat(format_enum); + if (palette != NULL) { + if (SDL_SetPixelFormatPalette(format, palette) < 0) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + } + newsurf = SDL_ConvertSurface(surf, format, 0); + // SDL formats are refcounted, this removes our reference + SDL_FreeFormat(format); +#endif + // In this scenario, we allocated the palette, so we also need + // to remove our reference to it. + if (SDL_ISPIXELFORMAT_INDEXED(format_enum) && + !SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { + SDL_FreePalette(palette); + } + SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE); - SDL_FreePalette(palette); } } else { @@ -1655,7 +1635,11 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } if (has_colorkey) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + colorkey = SDL_MapSurfaceRGBA(newsurf, key_r, key_g, key_b, key_a); +#else colorkey = SDL_MapRGBA(newsurf->format, key_r, key_g, key_b, key_a); +#endif if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); From 2e02ed453637ce3b5aab2337edc5fa9a177694a5 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 14 May 2025 23:34:47 -0700 Subject: [PATCH 182/441] Fully separate SDL2/3 surf init/convert paths --- src_c/surface.c | 375 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 357 insertions(+), 18 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 35d2a8be2a..2f73c2bb9a 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -483,7 +483,13 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) int bpp; Uint32 Rmask, Gmask, Bmask, Amask; SDL_Surface *surface; + +#if SDL_VERSION_ATLEAST(3, 0, 0) PG_PixelFormatEnum format = SDL_PIXELFORMAT_UNKNOWN; +#else + SDL_PixelFormat default_format; + default_format.palette = NULL; +#endif char *kwids[] = {"size", "flags", "depth", "masks", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwids, &size, &flags, @@ -512,6 +518,7 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) surface_cleanup(self); +#if SDL_VERSION_ATLEAST(3, 0, 0) if (depth && masks) { /* all info supplied, most errorchecking * needed */ if (pgSurface_Check(depth)) { @@ -666,11 +673,7 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surface))) { /* Give the surface something other than an all white palette. * */ -#if SDL_VERSION_ATLEAST(3, 0, 0) SDL_Palette *surf_palette = SDL_CreateSurfacePalette(surface); -#else - SDL_Palette *surf_palette = PG_GetSurfacePalette(surface); -#endif if (SDL_SetPaletteColors(surf_palette, default_palette_colors, 0, default_palette_size - 1) != 0) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); @@ -678,6 +681,192 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) return -1; } } +#else + if (depth && masks) { /* all info supplied, most errorchecking + * needed */ + if (pgSurface_Check(depth)) { + PyErr_SetString(PyExc_ValueError, + "cannot pass surface for depth and color masks"); + return -1; + } + if (!pg_IntFromObj(depth, &bpp)) { + PyErr_SetString(PyExc_ValueError, + "invalid bits per pixel depth argument"); + return -1; + } + if (!PySequence_Check(masks) || PySequence_Length(masks) != 4) { + PyErr_SetString(PyExc_ValueError, + "masks argument must be sequence of four numbers"); + return -1; + } + if (!pg_UintFromObjIndex(masks, 0, &Rmask) || + !pg_UintFromObjIndex(masks, 1, &Gmask) || + !pg_UintFromObjIndex(masks, 2, &Bmask) || + !pg_UintFromObjIndex(masks, 3, &Amask)) { + PyErr_SetString(PyExc_ValueError, + "invalid mask values in masks sequence"); + return -1; + } + } + else if (depth && PyNumber_Check(depth)) { /* use default masks */ + if (!pg_IntFromObj(depth, &bpp)) { + PyErr_SetString(PyExc_ValueError, + "invalid bits per pixel depth argument"); + return -1; + } + if (flags & PGS_SRCALPHA) { + switch (bpp) { + case 16: + Rmask = 0xF << 8; + Gmask = 0xF << 4; + Bmask = 0xF; + Amask = 0xF << 12; + break; + case 32: + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + Amask = 0xFF << 24; + break; + default: + PyErr_SetString( + PyExc_ValueError, + "no standard masks exist for given bitdepth with " + "alpha"); + return -1; + } + } + else { + Amask = 0; + switch (bpp) { + case 8: + Rmask = 0; + Gmask = 0; + Bmask = 0; + break; + case 12: + Rmask = 0xFF >> 4 << 8; + Gmask = 0xFF >> 4 << 4; + Bmask = 0xFF >> 4; + break; + case 15: + Rmask = 0xFF >> 3 << 10; + Gmask = 0xFF >> 3 << 5; + Bmask = 0xFF >> 3; + break; + case 16: + Rmask = 0xFF >> 3 << 11; + Gmask = 0xFF >> 2 << 5; + Bmask = 0xFF >> 3; + break; + case 24: + case 32: + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + break; + default: + PyErr_SetString(PyExc_ValueError, + "nonstandard bit depth given"); + return -1; + } + } + } + else { /* no depth or surface */ + SDL_PixelFormat *pix; + if (depth && pgSurface_Check(depth)) { + pix = ((pgSurfaceObject *)depth)->surf->format; + } + else if (pg_GetDefaultWindowSurface()) { + pix = pgSurface_AsSurface(pg_GetDefaultWindowSurface())->format; + } + else { + pix = &default_format; + pix->BitsPerPixel = 32; + pix->Amask = 0; + pix->Rmask = 0xFF0000; + pix->Gmask = 0xFF00; + pix->Bmask = 0xFF; + } + bpp = PG_FORMAT_BitsPerPixel(pix); + + if (flags & PGS_SRCALPHA) { + switch (bpp) { + case 16: + Rmask = 0xF << 8; + Gmask = 0xF << 4; + Bmask = 0xF; + Amask = 0xF << 12; + break; + case 24: + bpp = 32; + // we automatically step up to 32 if video is 24, fall + // through to case below + case 32: + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + Amask = 0xFF << 24; + break; + default: + PyErr_SetString( + PyExc_ValueError, + "no standard masks exist for given bitdepth with " + "alpha"); + return -1; + } + } + else { + Rmask = pix->Rmask; + Gmask = pix->Gmask; + Bmask = pix->Bmask; + Amask = pix->Amask; + } + } + + Uint32 pxformat = + SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); + if (pxformat == SDL_PIXELFORMAT_UNKNOWN) { + PyErr_SetString(PyExc_ValueError, "Invalid mask values"); + return -1; + } + + surface = PG_CreateSurface(width, height, pxformat); + if (!surface) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + + if (!(flags & PGS_SRCALPHA)) { + /* We ignore the error if any. */ + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); + + /* When the display format has a full alpha channel (macOS right now), + * Surfaces may be created with an unreqested alpha channel, which + * could cause issues. + * pygame Surfaces are supposed to be (0, 0, 0, 255) by default. + * This is a simple fix to fill it with (0, 0, 0, 255) if necessary. + * See Github issue: + * https://github.com/pygame-community/pygame-ce/issues/796 + */ + if (Amask != 0) { + SDL_FillRect(surface, NULL, + SDL_MapRGBA(surface->format, 0, 0, 0, 255)); + } + } + + if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surface))) { + /* Give the surface something other than an all white palette. + * */ + if (SDL_SetPaletteColors(surface->format->palette, + default_palette_colors, 0, + default_palette_size - 1) != 0) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + SDL_FreeSurface(surface); + return -1; + } + } +#endif if (surface) { self->surf = surface; @@ -1471,6 +1660,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) pgSurface_Prep(self); +#if SDL_VERSION_ATLEAST(3, 0, 0) if ((has_colorkey = SDL_HasColorKey(surf))) { PG_PixelFormat *surf_format; SDL_Palette *surf_palette; @@ -1599,20 +1789,9 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } } -#if SDL_VERSION_ATLEAST(3, 0, 0) newsurf = SDL_ConvertSurfaceAndColorspace( surf, format_enum, palette, SDL_GetSurfaceColorspace(surf), 0); -#else - SDL_PixelFormat *format = SDL_AllocFormat(format_enum); - if (palette != NULL) { - if (SDL_SetPixelFormatPalette(format, palette) < 0) { - return RAISE(pgExc_SDLError, SDL_GetError()); - } - } - newsurf = SDL_ConvertSurface(surf, format, 0); - // SDL formats are refcounted, this removes our reference - SDL_FreeFormat(format); -#endif + // In this scenario, we allocated the palette, so we also need // to remove our reference to it. if (SDL_ISPIXELFORMAT_INDEXED(format_enum) && @@ -1635,17 +1814,177 @@ surf_convert(pgSurfaceObject *self, PyObject *args) } if (has_colorkey) { -#if SDL_VERSION_ATLEAST(3, 0, 0) colorkey = SDL_MapSurfaceRGBA(newsurf, key_r, key_g, key_b, key_a); + if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + SDL_FreeSurface(newsurf); + return NULL; + } + } #else + if ((has_colorkey = SDL_HasColorKey(surf))) { + SDL_GetColorKey(surf, &colorkey); + if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) { + SDL_GetRGBA(colorkey, surf->format, &key_r, &key_g, &key_b, + &key_a); + } + else { + SDL_GetRGB(colorkey, surf->format, &key_r, &key_g, &key_b); + } + } + + if (argobject) { + if (pgSurface_Check(argobject)) { + src = pgSurface_AsSurface(argobject); + newsurf = PG_ConvertSurface(surf, src->format); + } + else { + /* will be updated later, initialize to make static analyzer happy + */ + int bpp = 0; + SDL_Palette *palette = SDL_AllocPalette(default_palette_size); + SDL_PixelFormat format; + + memcpy(&format, surf->format, sizeof(format)); + if (pg_IntFromObj(argobject, &bpp)) { + Uint32 Rmask, Gmask, Bmask, Amask; + + if (flags != UINT32_MAX && flags & PGS_SRCALPHA) { + switch (bpp) { + case 16: + Rmask = 0xF << 8; + Gmask = 0xF << 4; + Bmask = 0xF; + Amask = 0xF << 12; + break; + case 32: + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + Amask = 0xFF << 24; + break; + default: + return RAISE(PyExc_ValueError, + "no standard masks exist for given " + "bitdepth with alpha"); + } + } + else { + Amask = 0; + switch (bpp) { + case 8: + Rmask = 0; + Gmask = 0; + Bmask = 0; + break; + case 12: + Rmask = 0xFF >> 4 << 8; + Gmask = 0xFF >> 4 << 4; + Bmask = 0xFF >> 4; + break; + case 15: + Rmask = 0xFF >> 3 << 10; + Gmask = 0xFF >> 3 << 5; + Bmask = 0xFF >> 3; + break; + case 16: + Rmask = 0xFF >> 3 << 11; + Gmask = 0xFF >> 2 << 5; + Bmask = 0xFF >> 3; + break; + case 24: + case 32: + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + break; + default: + return RAISE(PyExc_ValueError, + "nonstandard bit depth given"); + } + } + format.Rmask = Rmask; + format.Gmask = Gmask; + format.Bmask = Bmask; + format.Amask = Amask; + } + else if (PySequence_Check(argobject) && + PySequence_Size(argobject) == 4) { + Uint32 mask; + + if (!pg_UintFromObjIndex(argobject, 0, &format.Rmask) || + !pg_UintFromObjIndex(argobject, 1, &format.Gmask) || + !pg_UintFromObjIndex(argobject, 2, &format.Bmask) || + !pg_UintFromObjIndex(argobject, 3, &format.Amask)) { + pgSurface_Unprep(self); + return RAISE(PyExc_ValueError, + "invalid color masks given"); + } + mask = + format.Rmask | format.Gmask | format.Bmask | format.Amask; + for (bpp = 0; bpp < 32; ++bpp) { + if (!(mask >> bpp)) { + break; + } + } + } + else { + pgSurface_Unprep(self); + return RAISE( + PyExc_ValueError, + "invalid argument specifying new format to convert to"); + } + format.BitsPerPixel = (Uint8)bpp; + format.BytesPerPixel = (bpp + 7) / 8; + if (PG_FORMAT_BitsPerPixel((&format)) > 8) { + /* Allow a 8 bit source surface with an empty palette to be + * converted to a format without a palette (pygame-ce issue + * #146). If the target format has a non-NULL palette pointer + * then SDL_ConvertSurface checks that the palette is not + * empty-- that at least one entry is not black. + */ + format.palette = NULL; + } + if (SDL_ISPIXELFORMAT_INDEXED(SDL_MasksToPixelFormatEnum( + PG_FORMAT_BitsPerPixel((&format)), format.Rmask, + format.Gmask, format.Bmask, format.Amask))) { + if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { + SDL_SetPixelFormatPalette(&format, surf->format->palette); + } + else { + /* Give the surface something other than an all white + * palette. + */ + SDL_SetPaletteColors(palette, default_palette_colors, 0, + default_palette_size); + SDL_SetPixelFormatPalette(&format, palette); + } + } + newsurf = PG_ConvertSurface(surf, &format); + SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE); + SDL_FreePalette(palette); + } + } + else { + newsurf = pg_DisplayFormat(surf); + if (newsurf) { + SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE); + } + } + + if (newsurf == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (has_colorkey) { colorkey = SDL_MapRGBA(newsurf->format, key_r, key_g, key_b, key_a); -#endif if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; } } +#endif pgSurface_Unprep(self); From b54f3e14db536e06d2ca2a9ee30b75325d6078d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 06:50:41 +0000 Subject: [PATCH 183/441] Bump docker/build-push-action from 6.16.0 to 6.17.0 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/14487ce63c7a62a4a324b0bfb37086795e31c6c1...1dc73863535b631f98b2378be8619f83b136f4a0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: 6.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index bcee568983..4eac40e1d4 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -75,7 +75,7 @@ jobs: - name: Build and push Docker image if: steps.inspect.outcome == 'failure' - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 + uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 with: context: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base file: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base/Dockerfile-${{ matrix.arch }} From 4c291abd746dd5c6120a1dd361cc659a62fcc055 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 20 May 2025 11:44:54 -0700 Subject: [PATCH 184/441] Improve comment on BufferProxy.write() arg --- buildconfig/stubs/pygame/bufferproxy.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/bufferproxy.pyi b/buildconfig/stubs/pygame/bufferproxy.pyi index 3275ffac53..e05dfa9160 100644 --- a/buildconfig/stubs/pygame/bufferproxy.pyi +++ b/buildconfig/stubs/pygame/bufferproxy.pyi @@ -20,6 +20,6 @@ class BufferProxy: def __init__(self, parent: Any) -> None: ... # TODO: parent: TypedDict | Protocol def write( self, - buffer: str | bytes, # See https://docs.python.org/3/c-api/arg.html at s# + buffer: str | bytes, # Any "read-only bytes-like-object" is valid offset: int = 0, ) -> None: ... From 9e4941ef7b94048c29b3f4c7fe76474d2cc8f19d Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 21 May 2025 23:29:24 -0700 Subject: [PATCH 185/441] Port SDL_SetPaletteColors int->bool return --- src_c/_pygame.h | 8 ++++++++ src_c/freetype/ft_render.c | 2 +- src_c/pixelcopy.c | 4 ++-- src_c/surface.c | 17 ++++++++--------- src_c/transform.c | 4 ++-- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index f0518ccfe2..14095a1312 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -131,6 +131,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) } #define PG_GetSurfacePalette SDL_GetSurfacePalette +#define PG_SetPaletteColors SDL_SetPaletteColors #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB @@ -233,6 +234,13 @@ PG_GetSurfacePalette(SDL_Surface *surf) return surf->format->palette; } +static inline bool +PG_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, + int firstcolor, int ncolors) +{ + return SDL_SetPaletteColors(palette, colors, firstcolor, ncolors) == 0; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/freetype/ft_render.c b/src_c/freetype/ft_render.c index 376abb7ca9..fdc61a7bdd 100644 --- a/src_c/freetype/ft_render.c +++ b/src_c/freetype/ft_render.c @@ -494,7 +494,7 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, colors[0].g = ~colors[1].g; colors[0].b = ~colors[1].b; colors[0].a = SDL_ALPHA_OPAQUE; - if (SDL_SetPaletteColors(palette, colors, 0, 2)) { + if (!PG_SetPaletteColors(palette, colors, 0, 2)) { PyErr_Format(PyExc_SystemError, "Pygame bug in _PGFT_Render_NewSurface: %.200s", SDL_GetError()); diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 75982bc8e5..6a3ebab913 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -1210,8 +1210,8 @@ make_surface(PyObject *self, PyObject *arg) if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { /* Give the surface something other than an all white palette. * */ - if (SDL_SetPaletteColors(palette, default_palette_colors, 0, - default_palette_size - 1) != 0) { + if (!PG_SetPaletteColors(palette, default_palette_colors, 0, + default_palette_size - 1)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(surf); return 0; diff --git a/src_c/surface.c b/src_c/surface.c index ada724a9a3..ba6f1a22a7 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -674,8 +674,8 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) /* Give the surface something other than an all white palette. * */ SDL_Palette *surf_palette = SDL_CreateSurfacePalette(surface); - if (SDL_SetPaletteColors(surf_palette, default_palette_colors, 0, - default_palette_size - 1) != 0) { + if (!PG_SetPaletteColors(surf_palette, default_palette_colors, 0, + default_palette_size - 1)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(surface); return -1; @@ -858,9 +858,9 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surface))) { /* Give the surface something other than an all white palette. * */ - if (SDL_SetPaletteColors(surface->format->palette, + if (!PG_SetPaletteColors(surface->format->palette, default_palette_colors, 0, - default_palette_size - 1) != 0) { + default_palette_size - 1)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(surface); return -1; @@ -1332,7 +1332,7 @@ surf_set_palette(PyObject *self, PyObject *seq) } if (!pal) { - return RAISE(pgExc_SDLError, "Surface is not palettitized\n"); + return RAISE(pgExc_SDLError, "Surface is not palettized\n"); } old_colors = pal->colors; @@ -1360,8 +1360,7 @@ surf_set_palette(PyObject *self, PyObject *seq) colors[i].a = (unsigned char)old_colors[i].a; } - ecode = SDL_SetPaletteColors(pal, colors, 0, len); - if (ecode != 0) { + if (!PG_SetPaletteColors(pal, colors, 0, len)) { return RAISE(pgExc_SDLError, SDL_GetError()); } Py_RETURN_NONE; @@ -1405,7 +1404,7 @@ surf_set_palette_at(PyObject *self, PyObject *args) color.b = rgba[2]; color.a = pal->colors[_index].a; /* May be a colorkey color. */ - if (SDL_SetPaletteColors(pal, &color, _index, 1) != 0) { + if (!PG_SetPaletteColors(pal, &color, _index, 1)) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3232,7 +3231,7 @@ surf_subsurface(PyObject *self, PyObject *args) SDL_FreeSurface(sub); return NULL; } - if (SDL_SetPaletteColors(pal, colors, 0, ncolors) != 0) { + if (!PG_SetPaletteColors(pal, colors, 0, ncolors)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreePalette(pal); SDL_FreeSurface(sub); diff --git a/src_c/transform.c b/src_c/transform.c index 30a9e73022..f21901c58c 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -158,8 +158,8 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) return NULL; } - if (SDL_SetPaletteColors(newsurf_palette, surf_palette->colors, 0, - surf_palette->ncolors) != 0) { + if (!PG_SetPaletteColors(newsurf_palette, surf_palette->colors, 0, + surf_palette->ncolors)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; From 0eccffc8ff5f369ebbccd20ad41afd0c461b49cd Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 21 May 2025 23:36:26 -0700 Subject: [PATCH 186/441] Port Get|SetSurfaceBlendMode int->bool return --- src_c/_pygame.h | 14 ++++++++++++++ src_c/alphablit.c | 4 ++-- src_c/pixelcopy.c | 7 +------ src_c/surface.c | 12 ++++++------ src_c/transform.c | 11 +++-------- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 14095a1312..0b488a851a 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -132,6 +132,8 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_GetSurfacePalette SDL_GetSurfacePalette #define PG_SetPaletteColors SDL_SetPaletteColors +#define PG_SetSurfaceBlendMode SDL_SetSurfaceBlendMode +#define PG_GetSurfaceBlendMode SDL_GetSurfaceBlendMode #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB @@ -241,6 +243,18 @@ PG_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, return SDL_SetPaletteColors(palette, colors, firstcolor, ncolors) == 0; } +static inline bool +PG_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode) +{ + return SDL_SetSurfaceBlendMode(surface, blendMode) == 0; +} + +static inline bool +PG_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode) +{ + return SDL_GetSurfaceBlendMode(surface, blendMode) == 0; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 5473d3008f..f2e3524384 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -127,8 +127,8 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, if ((info.src_has_colorkey = SDL_HasColorKey(src))) { SDL_GetColorKey(src, &info.src_colorkey); } - if (SDL_GetSurfaceBlendMode(src, &info.src_blend) || - SDL_GetSurfaceBlendMode(dst, &info.dst_blend)) { + if (!PG_GetSurfaceBlendMode(src, &info.src_blend) || + !PG_GetSurfaceBlendMode(dst, &info.dst_blend)) { okay = 0; } if (okay) { diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 6a3ebab913..0304d7ebce 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -287,12 +287,7 @@ _copy_colorplane(Py_buffer *view_p, SDL_Surface *surf, intsize); return -1; } -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_GetSurfaceBlendMode(surf, &mode)) -#else - if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) -#endif - { + if (!PG_GetSurfaceBlendMode(surf, &mode)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } diff --git a/src_c/surface.c b/src_c/surface.c index ba6f1a22a7..bd78505770 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1517,12 +1517,12 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) return RAISE(PyExc_TypeError, "invalid alpha argument"); } - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND) != 0) { + if (!PG_SetSurfaceBlendMode(surf, SDL_BLENDMODE_BLEND)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } else { - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) { + if (!PG_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } @@ -1539,7 +1539,7 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) if (alpha == 255 && (PG_SURF_BytesPerPixel(surf) == 1)) { /* Can't blend with a surface alpha of 255 and 8bit surfaces */ - if (SDL_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE) != 0) { + if (!PG_SetSurfaceBlendMode(surf, SDL_BLENDMODE_NONE)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } @@ -1582,7 +1582,7 @@ surf_get_alpha(pgSurfaceObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) { + if (!PG_GetSurfaceBlendMode(surf, &mode)) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -1605,7 +1605,7 @@ surf_get_blendmode(PyObject *self, PyObject *_null) SURF_INIT_CHECK(surf) - if (SDL_GetSurfaceBlendMode(surf, &mode) != 0) { + if (!PG_GetSurfaceBlendMode(surf, &mode)) { return RAISE(pgExc_SDLError, SDL_GetError()); } return PyLong_FromLong((long)mode); @@ -2970,7 +2970,7 @@ static int _PgSurface_SrcAlpha(SDL_Surface *surf) { SDL_BlendMode mode; - if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) { + if (!PG_GetSurfaceBlendMode(surf, &mode)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } diff --git a/src_c/transform.c b/src_c/transform.c index f21901c58c..3fec049b42 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -95,12 +95,7 @@ _PgSurface_SrcAlpha(SDL_Surface *surf) { if (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(surf))) { SDL_BlendMode mode; -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_GetSurfaceBlendMode(surf, &mode)) -#else - if (SDL_GetSurfaceBlendMode(surf, &mode) < 0) -#endif - { + if (!PG_GetSurfaceBlendMode(surf, &mode)) { return -1; } if (mode == SDL_BLENDMODE_BLEND) { @@ -181,7 +176,7 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) isalpha = _PgSurface_SrcAlpha(surf); if (isalpha == 1) { - if (SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_BLEND) != 0) { + if (!PG_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_BLEND)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; @@ -193,7 +188,7 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) return NULL; } else { - if (SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE) != 0) { + if (!PG_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; From cf7adab9598c651aa72fec3eba5388d6aa6c0961 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 21 May 2025 23:53:36 -0700 Subject: [PATCH 187/441] Port Get|SetSurfaceAlphaMod int->bool return --- src_c/_pygame.h | 14 ++++++++++++++ src_c/surface.c | 12 ++++++------ src_c/transform.c | 6 +++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 0b488a851a..808be1a496 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -134,6 +134,8 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_SetPaletteColors SDL_SetPaletteColors #define PG_SetSurfaceBlendMode SDL_SetSurfaceBlendMode #define PG_GetSurfaceBlendMode SDL_GetSurfaceBlendMode +#define PG_GetSurfaceAlphaMod SDL_GetSurfaceAlphaMod +#define PG_SetSurfaceAlphaMod SDL_SetSurfaceAlphaMod #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB @@ -255,6 +257,18 @@ PG_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode) return SDL_GetSurfaceBlendMode(surface, blendMode) == 0; } +static inline bool +PG_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha) +{ + return SDL_GetSurfaceAlphaMod(surface, alpha) == 0; +} + +static inline bool +PG_SetSurfaceAlphaMod(SDL_Surface *surface, Uint8 alpha) +{ + return SDL_SetSurfaceAlphaMod(surface, alpha) == 0; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/surface.c b/src_c/surface.c index bd78505770..0f0dbe919d 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1562,11 +1562,11 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) } /* HACK HACK HACK */ if (result == 0) { - result = SDL_SetSurfaceAlphaMod(surf, alpha); + result = !PG_SetSurfaceAlphaMod(surf, alpha); } pgSurface_Unprep(self); - if (result == -1) { + if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -1590,7 +1590,7 @@ surf_get_alpha(pgSurfaceObject *self, PyObject *_null) Py_RETURN_NONE; } - if (SDL_GetSurfaceAlphaMod(surf, &alpha) != 0) { + if (!PG_GetSurfaceAlphaMod(surf, &alpha)) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3245,13 +3245,13 @@ surf_subsurface(PyObject *self, PyObject *args) } SDL_FreePalette(pal); } - if (SDL_GetSurfaceAlphaMod(surf, &alpha) != 0) { + if (!PG_GetSurfaceAlphaMod(surf, &alpha)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(sub); return NULL; } if (alpha != 255) { - if (SDL_SetSurfaceAlphaMod(sub, alpha) != 0) { + if (!PG_SetSurfaceAlphaMod(sub, alpha)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(sub); return NULL; @@ -4515,7 +4515,7 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, /* can't blit alpha to 8bit, crashes SDL */ else if (PG_SURF_BytesPerPixel(dst) == 1 && (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(src)) || - ((SDL_GetSurfaceAlphaMod(src, &alpha) == 0 && alpha != 255)))) { + ((PG_GetSurfaceAlphaMod(src, &alpha) && alpha != 255)))) { /* Py_BEGIN_ALLOW_THREADS */ if (PG_SURF_BytesPerPixel(src) == 1) { result = pygame_Blit(src, srcrect, dst, dstrect, 0); diff --git a/src_c/transform.c b/src_c/transform.c index 3fec049b42..4d308f9d33 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -104,7 +104,7 @@ _PgSurface_SrcAlpha(SDL_Surface *surf) } else { Uint8 color = SDL_ALPHA_OPAQUE; - if (SDL_GetSurfaceAlphaMod(surf, &color) != 0) { + if (!PG_GetSurfaceAlphaMod(surf, &color)) { return -1; } if (color != SDL_ALPHA_OPAQUE) { @@ -161,13 +161,13 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) } } - if (SDL_GetSurfaceAlphaMod(surf, &alpha) != 0) { + if (!PG_GetSurfaceAlphaMod(surf, &alpha)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; } if (alpha != 255) { - if (SDL_SetSurfaceAlphaMod(newsurf, alpha) != 0) { + if (!PG_SetSurfaceAlphaMod(newsurf, alpha)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; From b12870472580038ed08480bdbdf5082e8c16ed70 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Thu, 22 May 2025 12:50:36 +0200 Subject: [PATCH 188/441] Move mouse docs to stubs --- buildconfig/stubs/pygame/mouse.pyi | 277 +++++++++++++++++++++++-- docs/reST/ref/mouse.rst | 312 +---------------------------- src_c/doc/mouse_doc.h | 28 +-- 3 files changed, 280 insertions(+), 337 deletions(-) diff --git a/buildconfig/stubs/pygame/mouse.pyi b/buildconfig/stubs/pygame/mouse.pyi index d383b9ff01..a20bb8ea50 100644 --- a/buildconfig/stubs/pygame/mouse.pyi +++ b/buildconfig/stubs/pygame/mouse.pyi @@ -1,4 +1,74 @@ -from typing import Literal, overload +"""Pygame module to work with the mouse. + +The mouse functions can be used to get the current state of the mouse device. +These functions can also alter the system cursor for the mouse. + +When the display mode is set, the event queue will start receiving mouse +events. The mouse buttons generate ``pygame.MOUSEBUTTONDOWN`` and +``pygame.MOUSEBUTTONUP`` events when they are pressed and released. These +events contain a button attribute representing which button was pressed. The +mouse wheel will generate ``pygame.MOUSEBUTTONDOWN`` and +``pygame.MOUSEBUTTONUP`` events when rolled. The button will be set to 4 +when the wheel is rolled up, and to button 5 when the wheel is rolled down. +Whenever the mouse is moved it generates a ``pygame.MOUSEMOTION`` event. The +mouse movement is broken into small and accurate motion events. As the mouse +is moving many motion events will be placed on the queue. Mouse motion events +that are not properly cleaned from the event queue are the primary reason the +event queue fills up. + +If the mouse cursor is hidden, and input is grabbed to the current display the +mouse will enter a virtual input mode, where the relative movements of the +mouse will never be stopped by the borders of the screen. See the functions +``pygame.mouse.set_visible()`` and ``pygame.event.set_grab()`` to get this +configured. + +**Mouse Wheel Behavior in pygame 2** + +There is proper functionality for mouse wheel behaviour with pygame 2 supporting +``pygame.MOUSEWHEEL`` events. The new events support horizontal and vertical +scroll movements, with signed integer values representing the amount scrolled +(``x`` and ``y``), as well as ``flipped`` direction (the set positive and +negative values for each axis is flipped). Read more about SDL2 +input-related changes here ``_ + +In pygame 2, the mouse wheel functionality can be used by listening for the +``pygame.MOUSEWHEEL`` type of an event (Bear in mind they still emit +``pygame.MOUSEBUTTONDOWN`` events like in pygame 1.x, as well). +When this event is triggered, a developer can access the appropriate ``Event`` object +with ``pygame.event.get()``. The object can be used to access data about the mouse +scroll, such as ``which`` (it will tell you what exact mouse device trigger the event). + +.. code-block:: python + :caption: Code example of mouse scroll (tested on 2.0.0.dev7) + :name: test.py + + # Taken from husano896's PR thread (slightly modified) + import pygame + from pygame.locals import * + pygame.init() + screen = pygame.display.set_mode((640, 480)) + clock = pygame.time.Clock() + + def main(): + while True: + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + return + elif event.type == MOUSEWHEEL: + print(event) + print(event.x, event.y) + print(event.flipped) + print(event.which) + # can access properties with + # proper notation(ex: event.y) + clock.tick(60) + + # Execute game: + main() +""" + +from typing import Any, Literal, overload from pygame.cursors import Cursor from pygame.surface import Surface @@ -13,22 +83,156 @@ def get_pressed( def get_pressed( num_buttons: Literal[5], desktop: bool = False ) -> tuple[bool, bool, bool, bool, bool]: ... -def get_just_pressed() -> tuple[bool, bool, bool, bool, bool]: ... -def get_just_released() -> tuple[bool, bool, bool, bool, bool]: ... -def get_pos(desktop: bool = False) -> tuple[int, int]: ... -def get_rel() -> tuple[int, int]: ... +def get_pressed(*args, **kwargs) -> Any: + """Get the state of the mouse buttons. + + Returns a sequence of booleans representing the state of all the mouse + buttons. A true value means the mouse is currently being pressed at the time + of the call. + + To get all of the mouse events it is better to use either + ``pygame.event.wait()`` or ``pygame.event.get()`` and check all of those + events to see if they are ``MOUSEBUTTONDOWN``, ``MOUSEBUTTONUP``, or + ``MOUSEMOTION``. Remember to call ``pygame.event.get()`` or ``pygame.event.pump()`` + before this function, otherwise it will not work as expected. + + To support five button mice, an optional parameter ``num_buttons`` has been + added in pygame 2. When this is set to ``5``, ``button4`` and ``button5`` + are added to the returned tuple. Only ``3`` and ``5`` are valid values + for this parameter. + + If the ``desktop`` argument is ``True`` the mouse state will be correct even + if the window has no focus. In addition since it queries the OS it does not depend + on the last event pump while being slightly slower. + + .. note:: On ``X11`` some X servers use middle button emulation. When you + click both buttons ``1`` and ``3`` at the same time a ``2`` button event + can be emitted. + + .. warning:: Due to design constraints it is impossible to retrieve the desktop + mouse state on Wayland. The normal mouse state is returned instead. + + .. versionchangedold:: 2.0.0 ``num_buttons`` argument added + + .. versionchanged:: 2.5.2 Added the ``desktop`` argument + """ + +def get_just_pressed() -> tuple[bool, bool, bool, bool, bool]: + """Get the most recently pressed buttons. + + Very similar to :func:`pygame.mouse.get_pressed()`, returning a tuple + of length 5 with the important difference that the buttons are + True only in the frame they start being pressed. This can be convenient + for checking the buttons pressed "this frame", but for more precise results + and correct ordering prefer using the ``pygame.MOUSEBUTTONDOWN`` event. + + The result of this function is updated when new events are processed, + e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. + + .. seealso:: :func:`pygame.mouse.get_just_released()` + + :: + + if pygame.mouse.get_just_pressed()[0]: + print("LMB just pressed") + + .. versionadded:: 2.5.0 + """ + +def get_just_released() -> tuple[bool, bool, bool, bool, bool]: + """Get the most recently released buttons. + + Similar to :func:`pygame.mouse.get_pressed()`, returning a tuple + of length 5 with the important difference that the buttons are + True only in the frame they stop being pressed. This can be convenient + for checking the buttons released "this frame", but for more precise results + and correct ordering prefer using the ``pygame.MOUSEBUTTONUP`` event. + + The result of this function is updated when new events are processed, + e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. + + .. seealso:: :func:`pygame.mouse.get_just_pressed()` + + :: + + if pygame.mouse.get_just_released()[0]: + print("LMB just released") + + .. versionadded:: 2.5.0 + """ + +def get_pos(desktop: bool = False) -> tuple[int, int]: + """Get the mouse cursor position. + + By default returns the ``x`` and ``y`` position of the mouse cursor. The position + is relative to the top-left corner of the display. The cursor position can be + located outside of the display window, but is always constrained to the screen. + + If the ``desktop`` argument is ``True``, the position will be instead relative to the + top-left corner of the primary monitor. The position might be negative or exceed + the desktop bounds if multiple monitors are present. + + .. warning:: Due to design constraints it is impossible to retrieve the desktop + mouse state on Wayland. The relative mouse position is returned instead. + + .. versionchanged:: 2.5.2 Added the ``desktop`` argument + """ + +def get_rel() -> tuple[int, int]: + """Get the amount of mouse movement. + + Returns the amount of movement in ``x`` and ``y`` since the previous call to + this function. The relative movement of the mouse cursor is constrained to + the edges of the screen, but see the virtual input mouse mode for a way + around this. Virtual input mode is described at the top of the page. + """ + @overload def set_pos(pos: Point, /) -> None: ... @overload def set_pos(x: float, y: float, /) -> None: ... -def set_visible(value: bool, /) -> int: ... -def get_visible() -> bool: ... -def get_focused() -> bool: ... +def set_pos(*args) -> None: + """Set the mouse cursor position. + + Set the current mouse position to arguments given. If the mouse cursor is + visible it will jump to the new coordinates. Moving the mouse will generate + a new ``pygame.MOUSEMOTION`` event. + """ + +def set_visible(value: bool, /) -> int: + """Hide or show the mouse cursor. + + If the bool argument is true, the mouse cursor will be visible. This will + return the previous visible state of the cursor. + """ + +def get_visible() -> bool: + """Get the current visibility state of the mouse cursor. + + Get the current visibility state of the mouse cursor. ``True`` if the mouse is + visible, ``False`` otherwise. + + .. versionaddedold:: 2.0.0 + """ + +def get_focused() -> bool: + """Check if the display is receiving mouse input. + + Returns true when pygame is receiving mouse input events (or, in windowing + terminology, is "active" or has the "focus"). + + This method is most useful when working in a window. By contrast, in + full-screen mode, this method always returns true. + + Note: under ``MS`` Windows, the window that has the mouse focus also has the + keyboard focus. But under X-Windows, one window can receive mouse events and + another receive keyboard events. ``pygame.mouse.get_focused()`` indicates + whether the pygame window receives mouse events. + """ + @overload def set_cursor(cursor: Cursor) -> None: ... @overload -def set_cursor(constant: int) -> None: ... -@overload def set_cursor( size: IntPoint, hotspot: IntPoint, @@ -37,8 +241,55 @@ def set_cursor( ) -> None: ... @overload def set_cursor(hotspot: IntPoint, surface: Surface) -> None: ... -def get_cursor() -> Cursor: ... +@overload +def set_cursor(constant: int) -> None: ... +def set_cursor(*args, **kwargs) -> None: + """Set the mouse cursor to a new cursor. + + Set the mouse cursor to something new. This function accepts either an explicit + ``Cursor`` object or arguments to create a ``Cursor`` object. + + See :class:`pygame.cursors.Cursor` for help creating cursors and for examples. + + .. versionchangedold:: 2.0.1 + """ + +def get_cursor() -> Cursor: + """Get the current mouse cursor. + + Get the information about the mouse system cursor. The return value contains + the same data as the arguments passed into :func:`pygame.mouse.set_cursor()`. + + .. note:: Code that unpacked a get_cursor() call into + ``size, hotspot, xormasks, andmasks`` will still work, + assuming the call returns an old school type cursor. + + .. versionchangedold:: 2.0.1 + """ + @deprecated("since 2.2.0. Use `pygame.mouse.set_cursor` instead") def set_system_cursor(cursor: int, /) -> None: ... -def get_relative_mode() -> bool: ... -def set_relative_mode(enable: bool, /) -> None: ... +def get_relative_mode() -> bool: + """Query whether relative mouse mode is enabled. + + Query whether relative mouse mode is enabled. + + .. versionadded:: 2.4.0 + """ + +def set_relative_mode(enable: bool, /) -> None: + """Set relative mouse mode. + + Sets the relative mouse mode state. + While the mouse is in relative mode, the cursor is hidden, + the mouse position is constrained to the window, and pygame + will report continuous relative mouse motion even if the + mouse is at the edge of the window. + + *This function will flush any pending mouse motion."* + + Calling :func:`pygame.mouse.set_visible` with argument + ``True`` will exit relative mouse mode. + + .. versionadded:: 2.4.0 + """ diff --git a/docs/reST/ref/mouse.rst b/docs/reST/ref/mouse.rst index dd2096ed23..c45b6bba0c 100644 --- a/docs/reST/ref/mouse.rst +++ b/docs/reST/ref/mouse.rst @@ -3,313 +3,5 @@ :mod:`pygame.mouse` =================== -.. module:: pygame.mouse - :synopsis: pygame module to work with the mouse - -| :sl:`pygame module to work with the mouse` - -The mouse functions can be used to get the current state of the mouse device. -These functions can also alter the system cursor for the mouse. - -When the display mode is set, the event queue will start receiving mouse -events. The mouse buttons generate ``pygame.MOUSEBUTTONDOWN`` and -``pygame.MOUSEBUTTONUP`` events when they are pressed and released. These -events contain a button attribute representing which button was pressed. The -mouse wheel will generate ``pygame.MOUSEBUTTONDOWN`` and -``pygame.MOUSEBUTTONUP`` events when rolled. The button will be set to 4 -when the wheel is rolled up, and to button 5 when the wheel is rolled down. -Whenever the mouse is moved it generates a ``pygame.MOUSEMOTION`` event. The -mouse movement is broken into small and accurate motion events. As the mouse -is moving many motion events will be placed on the queue. Mouse motion events -that are not properly cleaned from the event queue are the primary reason the -event queue fills up. - -If the mouse cursor is hidden, and input is grabbed to the current display the -mouse will enter a virtual input mode, where the relative movements of the -mouse will never be stopped by the borders of the screen. See the functions -``pygame.mouse.set_visible()`` and ``pygame.event.set_grab()`` to get this -configured. - - -**Mouse Wheel Behavior in pygame 2** - -There is proper functionality for mouse wheel behaviour with pygame 2 supporting -``pygame.MOUSEWHEEL`` events. The new events support horizontal and vertical -scroll movements, with signed integer values representing the amount scrolled -(``x`` and ``y``), as well as ``flipped`` direction (the set positive and -negative values for each axis is flipped). Read more about SDL2 -input-related changes here ``_ - -In pygame 2, the mouse wheel functionality can be used by listening for the -``pygame.MOUSEWHEEL`` type of an event (Bear in mind they still emit -``pygame.MOUSEBUTTONDOWN`` events like in pygame 1.x, as well). -When this event is triggered, a developer can access the appropriate ``Event`` object -with ``pygame.event.get()``. The object can be used to access data about the mouse -scroll, such as ``which`` (it will tell you what exact mouse device trigger the event). - -.. code-block:: python - :caption: Code example of mouse scroll (tested on 2.0.0.dev7) - :name: test.py - - # Taken from husano896's PR thread (slightly modified) - import pygame - from pygame.locals import * - pygame.init() - screen = pygame.display.set_mode((640, 480)) - clock = pygame.time.Clock() - - def main(): - while True: - for event in pygame.event.get(): - if event.type == QUIT: - pygame.quit() - return - elif event.type == MOUSEWHEEL: - print(event) - print(event.x, event.y) - print(event.flipped) - print(event.which) - # can access properties with - # proper notation(ex: event.y) - clock.tick(60) - - # Execute game: - main() - -.. function:: get_pressed - - | :sl:`get the state of the mouse buttons` - | :sg:`get_pressed(num_buttons=3, desktop=False) -> (left_button, middle_button, right_button)` - | :sg:`get_pressed(num_buttons=5, desktop=False) -> (left_button, middle_button, right_button, x1_button, x2_button)` - - Returns a sequence of booleans representing the state of all the mouse - buttons. A true value means the mouse is currently being pressed at the time - of the call. - - To get all of the mouse events it is better to use either - ``pygame.event.wait()`` or ``pygame.event.get()`` and check all of those - events to see if they are ``MOUSEBUTTONDOWN``, ``MOUSEBUTTONUP``, or - ``MOUSEMOTION``. Remember to call ``pygame.event.get()`` or ``pygame.event.pump()`` - before this function, otherwise it will not work as expected. - - To support five button mice, an optional parameter ``num_buttons`` has been - added in pygame 2. When this is set to ``5``, ``button4`` and ``button5`` - are added to the returned tuple. Only ``3`` and ``5`` are valid values - for this parameter. - - If the ``desktop`` argument is ``True`` the mouse state will be correct even - if the window has no focus. In addition since it queries the OS it does not depend - on the last event pump while being slightly slower. - - .. note:: On ``X11`` some X servers use middle button emulation. When you - click both buttons ``1`` and ``3`` at the same time a ``2`` button event - can be emitted. - - .. warning:: Due to design constraints it is impossible to retrieve the desktop - mouse state on Wayland. The normal mouse state is returned instead. - - .. versionchangedold:: 2.0.0 ``num_buttons`` argument added - - .. versionchanged:: 2.5.2 Added the ``desktop`` argument - - .. ## pygame.mouse.get_pressed ## - -.. function:: get_just_pressed - - | :sl:`get the most recently pressed buttons` - | :sg:`get_just_pressed() -> (left_button, middle_button, right_button, x1_button, x2_button)` - - Very similar to :func:`pygame.mouse.get_pressed()`, returning a tuple - of length 5 with the important difference that the buttons are - True only in the frame they start being pressed. This can be convenient - for checking the buttons pressed "this frame", but for more precise results - and correct ordering prefer using the ``pygame.MOUSEBUTTONDOWN`` event. - - The result of this function is updated when new events are processed, - e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. - - .. seealso:: :func:`pygame.mouse.get_just_released()` - - :: - - if pygame.mouse.get_just_pressed()[0]: - print("LMB just pressed") - - .. versionadded:: 2.5.0 - - .. ## pygame.mouse.get_just_pressed ## - -.. function:: get_just_released - - | :sl:`get the most recently released buttons` - | :sg:`get_just_released() -> (left_button, middle_button, right_button, x1_button, x2_button)` - - Similar to :func:`pygame.mouse.get_pressed()`, returning a tuple - of length 5 with the important difference that the buttons are - True only in the frame they stop being pressed. This can be convenient - for checking the buttons released "this frame", but for more precise results - and correct ordering prefer using the ``pygame.MOUSEBUTTONUP`` event. - - The result of this function is updated when new events are processed, - e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. - - .. seealso:: :func:`pygame.mouse.get_just_pressed()` - - :: - - if pygame.mouse.get_just_released()[0]: - print("LMB just released") - - .. versionadded:: 2.5.0 - - .. ## pygame.mouse.get_just_released ## - -.. function:: get_pos - - | :sl:`get the mouse cursor position` - | :sg:`get_pos(desktop=False) -> (x, y)` - - By default returns the ``x`` and ``y`` position of the mouse cursor. The position - is relative to the top-left corner of the display. The cursor position can be - located outside of the display window, but is always constrained to the screen. - - If the ``desktop`` argument is ``True``, the position will be instead relative to the - top-left corner of the primary monitor. The position might be negative or exceed - the desktop bounds if multiple monitors are present. - - .. warning:: Due to design constraints it is impossible to retrieve the desktop - mouse state on Wayland. The relative mouse position is returned instead. - - .. versionchanged:: 2.5.2 Added the ``desktop`` argument - - .. ## pygame.mouse.get_pos ## - -.. function:: get_rel - - | :sl:`get the amount of mouse movement` - | :sg:`get_rel() -> (x, y)` - - Returns the amount of movement in ``x`` and ``y`` since the previous call to - this function. The relative movement of the mouse cursor is constrained to - the edges of the screen, but see the virtual input mouse mode for a way - around this. Virtual input mode is described at the top of the page. - - .. ## pygame.mouse.get_rel ## - -.. function:: set_pos - - | :sl:`set the mouse cursor position` - | :sg:`set_pos([x, y], /) -> None` - - Set the current mouse position to arguments given. If the mouse cursor is - visible it will jump to the new coordinates. Moving the mouse will generate - a new ``pygame.MOUSEMOTION`` event. - - .. ## pygame.mouse.set_pos ## - -.. function:: set_visible - - | :sl:`hide or show the mouse cursor` - | :sg:`set_visible(bool, /) -> bool` - - If the bool argument is true, the mouse cursor will be visible. This will - return the previous visible state of the cursor. - - .. ## pygame.mouse.set_visible ## - -.. function:: get_visible - - | :sl:`get the current visibility state of the mouse cursor` - | :sg:`get_visible() -> bool` - - Get the current visibility state of the mouse cursor. ``True`` if the mouse is - visible, ``False`` otherwise. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.mouse.get_visible ## - -.. function:: get_focused - - | :sl:`check if the display is receiving mouse input` - | :sg:`get_focused() -> bool` - - Returns true when pygame is receiving mouse input events (or, in windowing - terminology, is "active" or has the "focus"). - - This method is most useful when working in a window. By contrast, in - full-screen mode, this method always returns true. - - Note: under ``MS`` Windows, the window that has the mouse focus also has the - keyboard focus. But under X-Windows, one window can receive mouse events and - another receive keyboard events. ``pygame.mouse.get_focused()`` indicates - whether the pygame window receives mouse events. - - .. ## pygame.mouse.get_focused ## - -.. function:: set_cursor - - | :sl:`set the mouse cursor to a new cursor` - | :sg:`set_cursor(pygame.cursors.Cursor) -> None` - | :sg:`set_cursor(size, hotspot, xormasks, andmasks) -> None` - | :sg:`set_cursor(hotspot, surface) -> None` - | :sg:`set_cursor(constant) -> None` - - Set the mouse cursor to something new. This function accepts either an explicit - ``Cursor`` object or arguments to create a ``Cursor`` object. - - See :class:`pygame.cursors.Cursor` for help creating cursors and for examples. - - .. versionchangedold:: 2.0.1 - - .. ## pygame.mouse.set_cursor ## - - -.. function:: get_cursor - - | :sl:`get the current mouse cursor` - | :sg:`get_cursor() -> pygame.cursors.Cursor` - - Get the information about the mouse system cursor. The return value contains - the same data as the arguments passed into :func:`pygame.mouse.set_cursor()`. - - .. note:: Code that unpacked a get_cursor() call into - ``size, hotspot, xormasks, andmasks`` will still work, - assuming the call returns an old school type cursor. - - .. versionchangedold:: 2.0.1 - - .. ## pygame.mouse.get_cursor ## - -.. function:: get_relative_mode - - | :sl:`query whether relative mouse mode is enabled` - | :sg:`get_relative_mode() -> bool` - - Query whether relative mouse mode is enabled. - - .. versionadded:: 2.4.0 - - .. ## pygame.mouse.get_relative_mode ## - -.. function:: set_relative_mode - - | :sl:`set relative mouse mode` - | :sg:`set_relative_mode(enable, /) -> None` - - Sets the relative mouse mode state. - While the mouse is in relative mode, the cursor is hidden, - the mouse position is constrained to the window, and pygame - will report continuous relative mouse motion even if the - mouse is at the edge of the window. - - *This function will flush any pending mouse motion."* - - Calling :func:`pygame.mouse.set_visible` with argument - ``True`` will exit relative mouse mode. - - .. versionadded:: 2.4.0 - - .. ## pygame.mouse.set_relative_mode ## - -.. ## pygame.mouse ## +.. autopgmodule:: pygame.mouse + :members: diff --git a/src_c/doc/mouse_doc.h b/src_c/doc/mouse_doc.h index 5b64b36a69..c17721e9e7 100644 --- a/src_c/doc/mouse_doc.h +++ b/src_c/doc/mouse_doc.h @@ -1,15 +1,15 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_MOUSE "pygame module to work with the mouse" -#define DOC_MOUSE_GETPRESSED "get_pressed(num_buttons=3, desktop=False) -> (left_button, middle_button, right_button)\nget_pressed(num_buttons=5, desktop=False) -> (left_button, middle_button, right_button, x1_button, x2_button)\nget the state of the mouse buttons" -#define DOC_MOUSE_GETJUSTPRESSED "get_just_pressed() -> (left_button, middle_button, right_button, x1_button, x2_button)\nget the most recently pressed buttons" -#define DOC_MOUSE_GETJUSTRELEASED "get_just_released() -> (left_button, middle_button, right_button, x1_button, x2_button)\nget the most recently released buttons" -#define DOC_MOUSE_GETPOS "get_pos(desktop=False) -> (x, y)\nget the mouse cursor position" -#define DOC_MOUSE_GETREL "get_rel() -> (x, y)\nget the amount of mouse movement" -#define DOC_MOUSE_SETPOS "set_pos([x, y], /) -> None\nset the mouse cursor position" -#define DOC_MOUSE_SETVISIBLE "set_visible(bool, /) -> bool\nhide or show the mouse cursor" -#define DOC_MOUSE_GETVISIBLE "get_visible() -> bool\nget the current visibility state of the mouse cursor" -#define DOC_MOUSE_GETFOCUSED "get_focused() -> bool\ncheck if the display is receiving mouse input" -#define DOC_MOUSE_SETCURSOR "set_cursor(pygame.cursors.Cursor) -> None\nset_cursor(size, hotspot, xormasks, andmasks) -> None\nset_cursor(hotspot, surface) -> None\nset_cursor(constant) -> None\nset the mouse cursor to a new cursor" -#define DOC_MOUSE_GETCURSOR "get_cursor() -> pygame.cursors.Cursor\nget the current mouse cursor" -#define DOC_MOUSE_GETRELATIVEMODE "get_relative_mode() -> bool\nquery whether relative mouse mode is enabled" -#define DOC_MOUSE_SETRELATIVEMODE "set_relative_mode(enable, /) -> None\nset relative mouse mode" +#define DOC_MOUSE "Pygame module to work with the mouse." +#define DOC_MOUSE_GETPRESSED "get_pressed(num_buttons=3, desktop=False) -> tuple[bool, bool, bool]\nget_pressed(num_buttons, desktop=False) -> tuple\nGet the state of the mouse buttons." +#define DOC_MOUSE_GETJUSTPRESSED "get_just_pressed() -> tuple\nGet the most recently pressed buttons." +#define DOC_MOUSE_GETJUSTRELEASED "get_just_released() -> tuple\nGet the most recently released buttons." +#define DOC_MOUSE_GETPOS "get_pos(desktop=False) -> tuple[int, int]\nGet the mouse cursor position." +#define DOC_MOUSE_GETREL "get_rel() -> tuple[int, int]\nGet the amount of mouse movement." +#define DOC_MOUSE_SETPOS "set_pos(pos, /) -> None\nset_pos(x, y, /) -> None\nSet the mouse cursor position." +#define DOC_MOUSE_SETVISIBLE "set_visible(value, /) -> int\nHide or show the mouse cursor." +#define DOC_MOUSE_GETVISIBLE "get_visible() -> bool\nGet the current visibility state of the mouse cursor." +#define DOC_MOUSE_GETFOCUSED "get_focused() -> bool\nCheck if the display is receiving mouse input." +#define DOC_MOUSE_SETCURSOR "set_cursor(cursor) -> None\nset_cursor(size, hotspot, xormasks, andmasks) -> None\nset_cursor(hotspot, surface) -> None\nset_cursor(constant) -> None\nSet the mouse cursor to a new cursor." +#define DOC_MOUSE_GETCURSOR "get_cursor() -> Cursor\nGet the current mouse cursor." +#define DOC_MOUSE_GETRELATIVEMODE "get_relative_mode() -> bool\nQuery whether relative mouse mode is enabled." +#define DOC_MOUSE_SETRELATIVEMODE "set_relative_mode(enable, /) -> None\nSet relative mouse mode." From 3631a50edf386eeb9de87333901a7e86656f8cc2 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 23 May 2025 23:41:54 -0700 Subject: [PATCH 189/441] 2.5.4.dev2 --- README.rst | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index f2ba63348b..946991bedd 100644 --- a/README.rst +++ b/README.rst @@ -190,7 +190,7 @@ See docs/licenses for licenses of dependencies. .. |Python3| image:: https://img.shields.io/badge/python-3-blue.svg?v=1 .. |GithubCommits| image:: https://img.shields.io/github.amrom.workers.devmits-since/pygame-community/pygame-ce/2.5.2.svg - :target: https://github.com/pygame-community/pygame-ce/compare/2.5.2...main + :target: https://github.com/pygame-community/pygame-ce/compare/2.5.3...main .. |DocsStatus| image:: https://img.shields.io/website?down_message=offline&label=docs&up_message=online&url=https%3A%2F%2Fpyga.me%2Fdocs%2F :target: https://pyga.me/docs/ diff --git a/pyproject.toml b/pyproject.toml index 2506837f6f..057f7b28b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pygame-ce" -version = "2.5.4.dev1" +version = "2.5.4.dev2" description = "Python Game Development" readme = "README.rst" # for long description requires-python = ">=3.9" From 55ad8b8edb63a16e808dc34ed5056c97c999be90 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 24 May 2025 00:07:22 -0700 Subject: [PATCH 190/441] Start 2.5.5 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 057f7b28b2..be0b18dfa0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pygame-ce" -version = "2.5.4.dev2" +version = "2.5.5.dev1" description = "Python Game Development" readme = "README.rst" # for long description requires-python = ">=3.9" From 575ef3f81ce58e0ac1d23fcd50496b6fb5e65d65 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sat, 24 May 2025 09:49:13 +0200 Subject: [PATCH 191/441] Move key docs to stubs --- buildconfig/stubs/pygame/key.pyi | 468 +++++++++++++++++++++++++++- docs/reST/ref/key.rst | 505 +------------------------------ src_c/doc/key_doc.h | 28 +- 3 files changed, 472 insertions(+), 529 deletions(-) diff --git a/buildconfig/stubs/pygame/key.pyi b/buildconfig/stubs/pygame/key.pyi index 9961017068..11c4e9824e 100644 --- a/buildconfig/stubs/pygame/key.pyi +++ b/buildconfig/stubs/pygame/key.pyi @@ -1,3 +1,234 @@ +"""Pygame module to work with the keyboard. + +This module contains functions for dealing with the keyboard. + +The :mod:`pygame.event` queue gets ``pygame.KEYDOWN`` and ``pygame.KEYUP`` +events when the keyboard buttons are pressed and released. Both events have +``key`` and ``mod`` attributes. + + * ``key``: an :ref:`integer ID ` representing every key + on the keyboard + * ``mod``: a bitmask of all the :ref:`modifier keys ` + that were in a pressed state when the event occurred + +The ``pygame.KEYDOWN`` event has the additional attributes ``unicode`` and +``scancode``. + + * ``unicode``: a single character string that is the fully translated + character entered, this takes into account the shift and composition keys + * ``scancode``: the platform-specific key code, which could be different from + keyboard to keyboard, but is useful for key selection of weird keys like + the multimedia keys + +.. versionaddedold:: 2.0.0 + The ``pygame.TEXTINPUT`` event is preferred to the ``unicode`` attribute + of ``pygame.KEYDOWN``. The attribute ``text`` contains the input. + + +.. _key-constants-label: + +The following is a list of all the constants (from :mod:`pygame.locals`) used to +represent keyboard keys. + +Portability note: The integers for key constants differ between pygame 1 and 2. +Always use key constants (``K_a``) rather than integers directly (``97``) so +that your key handling code works well on both pygame 1 and pygame 2. + + +:: + + pygame + Constant ASCII Description + --------------------------------- + K_BACKSPACE \\b backspace + K_TAB \\t tab + K_CLEAR clear + K_RETURN \\r return + K_PAUSE pause + K_ESCAPE ^[ escape + K_SPACE space + K_EXCLAIM ! exclaim + K_QUOTEDBL " quotedbl + K_HASH # hash + K_DOLLAR $ dollar + K_AMPERSAND & ampersand + K_QUOTE quote + K_LEFTPAREN ( left parenthesis + K_RIGHTPAREN ) right parenthesis + K_ASTERISK * asterisk + K_PLUS + plus sign + K_COMMA , comma + K_MINUS - minus sign + K_PERIOD . period + K_SLASH / forward slash + K_0 0 0 + K_1 1 1 + K_2 2 2 + K_3 3 3 + K_4 4 4 + K_5 5 5 + K_6 6 6 + K_7 7 7 + K_8 8 8 + K_9 9 9 + K_COLON : colon + K_SEMICOLON ; semicolon + K_LESS < less-than sign + K_EQUALS = equals sign + K_GREATER > greater-than sign + K_QUESTION ? question mark + K_AT @ at + K_LEFTBRACKET [ left bracket + K_BACKSLASH \\ backslash + K_RIGHTBRACKET ] right bracket + K_CARET ^ caret + K_UNDERSCORE _ underscore + K_BACKQUOTE ` grave + K_a a a + K_b b b + K_c c c + K_d d d + K_e e e + K_f f f + K_g g g + K_h h h + K_i i i + K_j j j + K_k k k + K_l l l + K_m m m + K_n n n + K_o o o + K_p p p + K_q q q + K_r r r + K_s s s + K_t t t + K_u u u + K_v v v + K_w w w + K_x x x + K_y y y + K_z z z + K_DELETE delete + K_KP0 keypad 0 + K_KP1 keypad 1 + K_KP2 keypad 2 + K_KP3 keypad 3 + K_KP4 keypad 4 + K_KP5 keypad 5 + K_KP6 keypad 6 + K_KP7 keypad 7 + K_KP8 keypad 8 + K_KP9 keypad 9 + K_KP_PERIOD . keypad period + K_KP_DIVIDE / keypad divide + K_KP_MULTIPLY * keypad multiply + K_KP_MINUS - keypad minus + K_KP_PLUS + keypad plus + K_KP_ENTER \\r keypad enter + K_KP_EQUALS = keypad equals + K_UP up arrow + K_DOWN down arrow + K_RIGHT right arrow + K_LEFT left arrow + K_INSERT insert + K_HOME home + K_END end + K_PAGEUP page up + K_PAGEDOWN page down + K_F1 F1 + K_F2 F2 + K_F3 F3 + K_F4 F4 + K_F5 F5 + K_F6 F6 + K_F7 F7 + K_F8 F8 + K_F9 F9 + K_F10 F10 + K_F11 F11 + K_F12 F12 + K_F13 F13 + K_F14 F14 + K_F15 F15 + K_NUMLOCK numlock + K_CAPSLOCK capslock + K_SCROLLOCK scrollock + K_RSHIFT right shift + K_LSHIFT left shift + K_RCTRL right control + K_LCTRL left control + K_RALT right alt + K_LALT left alt + K_RMETA right meta + K_LMETA left meta + K_LSUPER left Windows key + K_RSUPER right Windows key + K_MODE mode shift + K_HELP help + K_PRINT print screen + K_SYSREQ sysrq + K_BREAK break + K_MENU menu + K_POWER power + K_EURO Euro + K_AC_BACK Android back button + + +.. _key-modifiers-label: + +The keyboard also has a list of modifier states (from :mod:`pygame.locals`) that +can be assembled by bitwise-ORing them together. + +:: + + pygame + Constant Description + ------------------------- + KMOD_NONE no modifier keys pressed + KMOD_LSHIFT left shift + KMOD_RSHIFT right shift + KMOD_SHIFT left shift or right shift or both + KMOD_LCTRL left control + KMOD_RCTRL right control + KMOD_CTRL left control or right control or both + KMOD_LALT left alt + KMOD_RALT right alt + KMOD_ALT left alt or right alt or both + KMOD_LMETA left meta + KMOD_RMETA right meta + KMOD_META left meta or right meta or both + KMOD_CAPS caps lock + KMOD_NUM num lock + KMOD_MODE AltGr + + +The modifier information is contained in the ``mod`` attribute of the +``pygame.KEYDOWN`` and ``pygame.KEYUP`` events. The ``mod`` attribute is a +bitmask of all the modifier keys that were in a pressed state when the event +occurred. The modifier information can be decoded using a bitwise AND (except +for ``KMOD_NONE``, which should be compared using equals ``==``). For example: + +:: + + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN or event.type == pygame.KEYUP: + if event.mod == pygame.KMOD_NONE: + print('No modifier keys were in a pressed state when this ' + 'event occurred.') + else: + if event.mod & pygame.KMOD_LSHIFT: + print('Left shift was in a pressed state when this event ' + 'occurred.') + if event.mod & pygame.KMOD_RSHIFT: + print('Right shift was in a pressed state when this event ' + 'occurred.') + if event.mod & pygame.KMOD_SHIFT: + print('Left shift or right shift or both were in a ' + 'pressed state when this event occurred.') +""" + from typing import NoReturn from pygame.typing import RectLike @@ -5,16 +236,227 @@ from pygame.typing import RectLike class ScancodeWrapper(tuple[bool, ...]): def __iter__(self) -> NoReturn: ... -def get_focused() -> bool: ... -def get_pressed() -> ScancodeWrapper: ... -def get_just_pressed() -> ScancodeWrapper: ... -def get_just_released() -> ScancodeWrapper: ... -def get_mods() -> int: ... -def set_mods(mods: int, /) -> None: ... -def set_repeat(delay: int = 0, interval: int = 0, /) -> None: ... -def get_repeat() -> tuple[int, int]: ... -def name(key: int, use_compat: bool = True) -> str: ... -def key_code(name: str) -> int: ... -def start_text_input() -> None: ... -def stop_text_input() -> None: ... -def set_text_input_rect(rect: RectLike, /) -> None: ... +def get_focused() -> bool: + """True if the display is receiving keyboard input from the system. + + Returns ``True`` when the display window has keyboard focus from the + system. If the display needs to ensure it does not lose keyboard focus, it + can use :func:`pygame.event.set_grab()` to grab all input. + """ + +def get_pressed() -> ScancodeWrapper: + """Get the state of all keyboard buttons. + + Returns a sequence of boolean values representing the state of every key on + the keyboard. Use the key constant values to index the array. A ``True`` + value means that the button is pressed. + + .. note:: + Getting the list of pushed buttons with this function is not the proper + way to handle text entry from the user. There is no way to know the order + of keys pressed, and rapidly pushed keys can be completely unnoticed + between two calls to ``pygame.key.get_pressed()``. There is also no way to + translate these pushed keys into a fully translated character value. See + the ``pygame.KEYDOWN`` events on the :mod:`pygame.event` queue for this + functionality. + + .. versionchanged:: 2.1.4 + The collection of bools returned by ``get_pressed`` can not be iterated + over because the indexes of the internal tuple does not correspond to the + keycodes. + """ + +def get_just_pressed() -> ScancodeWrapper: + """Returns a ScancodeWrapper containing the most recent key presses. + + Returns a mapping from key codes to booleans indicating which keys were + newly pressed as of the last time events were processed. This can be used + as a convenience function to detect keys that were pressed "this frame." + + The result of this function is updated when new events are processed, + e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. + + A key can be marked as "just pressed" even if it is not currently pressed + according to :func:`pygame.key.get_pressed()`, if it was pressed and released + again during the same frame. Multiple presses and releases of the same key + are not distinguished from a single press with this function. + + .. seealso:: :func:`pygame.key.get_just_released()` + + .. note:: + If you require getting the key presses in order, use the event queue + ``KEYDOWN`` events + + :: + + if pygame.key.get_just_pressed()[pygame.K_b]: + print("B key just pressed") + + .. versionadded:: 2.4.0 + """ + +def get_just_released() -> ScancodeWrapper: + """Returns a ScancodeWrapper containing the most recent key releases. + + Returns a mapping from key codes to booleans indicating which keys were + newly released as of the last time events were processed. This can be used + as a convenience function to detect keys that were released "this frame." + + The result of this function is updated when new events are processed, + e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. + + .. seealso:: :func:`pygame.key.get_just_pressed()` + + .. note:: + If you require getting the key releases in order, use the event queue + ``KEYUP`` events. + + :: + + if pygame.key.get_just_released()[pygame.K_b]: + print("B key just released") + + .. versionadded:: 2.4.0 + """ + +def get_mods() -> int: + """Determine which modifier keys are being held. + + Returns a single integer representing a bitmask of all the modifier keys + being held. Using bitwise operators you can test if specific + :ref:`modifier keys ` are pressed. + """ + +def set_mods(mods: int, /) -> None: + """Temporarily set which modifier keys are pressed. + + Create a bitmask of the :ref:`modifier key constants ` + you want to impose on your program. + """ + +def set_repeat(delay: int = 0, interval: int = 0, /) -> None: + """Control how held keys are repeated. + + When the keyboard repeat is enabled, keys that are held down will generate + multiple ``pygame.KEYDOWN`` events. The ``delay`` parameter is the number of + milliseconds before the first repeated ``pygame.KEYDOWN`` event will be sent. + After that, another ``pygame.KEYDOWN`` event will be sent every ``interval`` + milliseconds. If a ``delay`` value is provided and an ``interval`` value is + not provided or is 0, then the ``interval`` will be set to the same value as + ``delay``. + + To disable key repeat call this function with no arguments or with ``delay`` + set to 0. + + When pygame is initialized the key repeat is disabled. + + :raises ValueError: if ``delay`` or ``interval`` is < 0 + + .. versionchangedold:: 2.0.0 A ``ValueError`` is now raised (instead of a + ``pygame.error``) if ``delay`` or ``interval`` is < 0. + """ + +def get_repeat() -> tuple[int, int]: + """See how held keys are repeated. + + Get the ``delay`` and ``interval`` keyboard repeat values. Refer to + :func:`pygame.key.set_repeat()` for a description of these values. + + .. versionaddedold:: 1.8 + """ + +def name(key: int, use_compat: bool = True) -> str: + """Get the name of a key identifier. + + Get the descriptive name of the button from a keyboard button id constant. + Returns an empty string (``""``) if the key is not found. + + If ``use_compat`` argument is ``True`` (which is the default), this function + returns the legacy name of a key where applicable. The return value is + expected to be the same across different pygame versions (provided the + corresponding key constant exists and is unique). If the return value is + passed to the ``key_code`` function, the original constant will be returned. + + If this argument is ``False``, the returned name may be prettier to display + and may cover a wider range of keys than with ``use_compat``, but there are + no guarantees that this name will be the same across different pygame + versions. If the name returned is passed to the ``key_code`` function, the + original constant is returned back (this is an implementation detail which + may change later, do not rely on this) + + .. versionchanged:: 2.1.3 Added ``use_compat`` argument and guaranteed API stability for it + """ + +def key_code(name: str) -> int: + """Get the key identifier from a key name. + + Get the key identifier code from the descriptive name of the key. This + returns an integer matching one of the K_* keycodes. For example: + + :: + + >>> pygame.key.key_code("return") == pygame.K_RETURN + True + >>> pygame.key.key_code("0") == pygame.K_0 + True + >>> pygame.key.key_code("space") == pygame.K_SPACE + True + + :raises ValueError: if the key name is not known. + + .. versionaddedold:: 2.0.0 + """ + +def start_text_input() -> None: + """Start handling Unicode text input events. + + Start receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT`` + events. If applicable, show the on-screen keyboard or IME editor. + + For many languages, key presses will automatically generate a + corresponding ``pygame.TEXTINPUT`` event. Special keys like + escape or function keys, and certain key combinations will not + generate ``pygame.TEXTINPUT`` events. + + In other languages, entering a single symbol may require multiple + key presses, or a language-specific user interface. In this case, + ``pygame.TEXTINPUT`` events are preferable to ``pygame.KEYDOWN`` + events for text input. + + A ``pygame.TEXTEDITING`` event is received when an IME composition + is started or changed. It contains the composition ``text``, ``length``, + and editing ``start`` position within the composition (attributes + ``text``, ``length``, and ``start``, respectively). + When the composition is committed (or non-IME input is received), + a ``pygame.TEXTINPUT`` event is generated. + + Text input events handling is on by default. + + .. versionaddedold:: 2.0.0 + """ + +def stop_text_input() -> None: + """Stop handling Unicode text input events. + + Stop receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT`` + events. If an on-screen keyboard or IME editor was shown with + ``pygame.key.start_text_input()``, hide it again. + + Text input events handling is on by default. + + To avoid triggering the IME editor or the on-screen keyboard + when the user is holding down a key during gameplay, text input + should be disabled once text entry is finished, or when the user + clicks outside of a text box. + + .. versionaddedold:: 2.0.0 + """ + +def set_text_input_rect(rect: RectLike, /) -> None: + """Controls the position of the candidate list. + + This sets the rectangle used for typing with an IME. + It controls where the candidate list will open, if supported. + + .. versionaddedold:: 2.0.0 + """ diff --git a/docs/reST/ref/key.rst b/docs/reST/ref/key.rst index 8feba790fb..67b66c7009 100644 --- a/docs/reST/ref/key.rst +++ b/docs/reST/ref/key.rst @@ -3,505 +3,6 @@ :mod:`pygame.key` ================= -.. module:: pygame.key - :synopsis: pygame module to work with the keyboard - -| :sl:`pygame module to work with the keyboard` - -This module contains functions for dealing with the keyboard. - -The :mod:`pygame.event` queue gets ``pygame.KEYDOWN`` and ``pygame.KEYUP`` -events when the keyboard buttons are pressed and released. Both events have -``key`` and ``mod`` attributes. - - * ``key``: an :ref:`integer ID ` representing every key - on the keyboard - * ``mod``: a bitmask of all the :ref:`modifier keys ` - that were in a pressed state when the event occurred - -The ``pygame.KEYDOWN`` event has the additional attributes ``unicode`` and -``scancode``. - - * ``unicode``: a single character string that is the fully translated - character entered, this takes into account the shift and composition keys - * ``scancode``: the platform-specific key code, which could be different from - keyboard to keyboard, but is useful for key selection of weird keys like - the multimedia keys - -.. versionaddedold:: 2.0.0 - The ``pygame.TEXTINPUT`` event is preferred to the ``unicode`` attribute - of ``pygame.KEYDOWN``. The attribute ``text`` contains the input. - - -.. _key-constants-label: - -The following is a list of all the constants (from :mod:`pygame.locals`) used to -represent keyboard keys. - -Portability note: The integers for key constants differ between pygame 1 and 2. -Always use key constants (``K_a``) rather than integers directly (``97``) so -that your key handling code works well on both pygame 1 and pygame 2. - - -:: - - pygame - Constant ASCII Description - --------------------------------- - K_BACKSPACE \b backspace - K_TAB \t tab - K_CLEAR clear - K_RETURN \r return - K_PAUSE pause - K_ESCAPE ^[ escape - K_SPACE space - K_EXCLAIM ! exclaim - K_QUOTEDBL " quotedbl - K_HASH # hash - K_DOLLAR $ dollar - K_AMPERSAND & ampersand - K_QUOTE quote - K_LEFTPAREN ( left parenthesis - K_RIGHTPAREN ) right parenthesis - K_ASTERISK * asterisk - K_PLUS + plus sign - K_COMMA , comma - K_MINUS - minus sign - K_PERIOD . period - K_SLASH / forward slash - K_0 0 0 - K_1 1 1 - K_2 2 2 - K_3 3 3 - K_4 4 4 - K_5 5 5 - K_6 6 6 - K_7 7 7 - K_8 8 8 - K_9 9 9 - K_COLON : colon - K_SEMICOLON ; semicolon - K_LESS < less-than sign - K_EQUALS = equals sign - K_GREATER > greater-than sign - K_QUESTION ? question mark - K_AT @ at - K_LEFTBRACKET [ left bracket - K_BACKSLASH \ backslash - K_RIGHTBRACKET ] right bracket - K_CARET ^ caret - K_UNDERSCORE _ underscore - K_BACKQUOTE ` grave - K_a a a - K_b b b - K_c c c - K_d d d - K_e e e - K_f f f - K_g g g - K_h h h - K_i i i - K_j j j - K_k k k - K_l l l - K_m m m - K_n n n - K_o o o - K_p p p - K_q q q - K_r r r - K_s s s - K_t t t - K_u u u - K_v v v - K_w w w - K_x x x - K_y y y - K_z z z - K_DELETE delete - K_KP0 keypad 0 - K_KP1 keypad 1 - K_KP2 keypad 2 - K_KP3 keypad 3 - K_KP4 keypad 4 - K_KP5 keypad 5 - K_KP6 keypad 6 - K_KP7 keypad 7 - K_KP8 keypad 8 - K_KP9 keypad 9 - K_KP_PERIOD . keypad period - K_KP_DIVIDE / keypad divide - K_KP_MULTIPLY * keypad multiply - K_KP_MINUS - keypad minus - K_KP_PLUS + keypad plus - K_KP_ENTER \r keypad enter - K_KP_EQUALS = keypad equals - K_UP up arrow - K_DOWN down arrow - K_RIGHT right arrow - K_LEFT left arrow - K_INSERT insert - K_HOME home - K_END end - K_PAGEUP page up - K_PAGEDOWN page down - K_F1 F1 - K_F2 F2 - K_F3 F3 - K_F4 F4 - K_F5 F5 - K_F6 F6 - K_F7 F7 - K_F8 F8 - K_F9 F9 - K_F10 F10 - K_F11 F11 - K_F12 F12 - K_F13 F13 - K_F14 F14 - K_F15 F15 - K_NUMLOCK numlock - K_CAPSLOCK capslock - K_SCROLLOCK scrollock - K_RSHIFT right shift - K_LSHIFT left shift - K_RCTRL right control - K_LCTRL left control - K_RALT right alt - K_LALT left alt - K_RMETA right meta - K_LMETA left meta - K_LSUPER left Windows key - K_RSUPER right Windows key - K_MODE mode shift - K_HELP help - K_PRINT print screen - K_SYSREQ sysrq - K_BREAK break - K_MENU menu - K_POWER power - K_EURO Euro - K_AC_BACK Android back button - - -.. _key-modifiers-label: - -The keyboard also has a list of modifier states (from :mod:`pygame.locals`) that -can be assembled by bitwise-ORing them together. - -:: - - pygame - Constant Description - ------------------------- - KMOD_NONE no modifier keys pressed - KMOD_LSHIFT left shift - KMOD_RSHIFT right shift - KMOD_SHIFT left shift or right shift or both - KMOD_LCTRL left control - KMOD_RCTRL right control - KMOD_CTRL left control or right control or both - KMOD_LALT left alt - KMOD_RALT right alt - KMOD_ALT left alt or right alt or both - KMOD_LMETA left meta - KMOD_RMETA right meta - KMOD_META left meta or right meta or both - KMOD_CAPS caps lock - KMOD_NUM num lock - KMOD_MODE AltGr - - -The modifier information is contained in the ``mod`` attribute of the -``pygame.KEYDOWN`` and ``pygame.KEYUP`` events. The ``mod`` attribute is a -bitmask of all the modifier keys that were in a pressed state when the event -occurred. The modifier information can be decoded using a bitwise AND (except -for ``KMOD_NONE``, which should be compared using equals ``==``). For example: - -:: - - for event in pygame.event.get(): - if event.type == pygame.KEYDOWN or event.type == pygame.KEYUP: - if event.mod == pygame.KMOD_NONE: - print('No modifier keys were in a pressed state when this ' - 'event occurred.') - else: - if event.mod & pygame.KMOD_LSHIFT: - print('Left shift was in a pressed state when this event ' - 'occurred.') - if event.mod & pygame.KMOD_RSHIFT: - print('Right shift was in a pressed state when this event ' - 'occurred.') - if event.mod & pygame.KMOD_SHIFT: - print('Left shift or right shift or both were in a ' - 'pressed state when this event occurred.') - - - -.. function:: get_focused - - | :sl:`true if the display is receiving keyboard input from the system` - | :sg:`get_focused() -> bool` - - Returns ``True`` when the display window has keyboard focus from the - system. If the display needs to ensure it does not lose keyboard focus, it - can use :func:`pygame.event.set_grab()` to grab all input. - - .. ## pygame.key.get_focused ## - -.. function:: get_pressed - - | :sl:`get the state of all keyboard buttons` - | :sg:`get_pressed() -> bools` - - Returns a sequence of boolean values representing the state of every key on - the keyboard. Use the key constant values to index the array. A ``True`` - value means that the button is pressed. - - .. note:: - Getting the list of pushed buttons with this function is not the proper - way to handle text entry from the user. There is no way to know the order - of keys pressed, and rapidly pushed keys can be completely unnoticed - between two calls to ``pygame.key.get_pressed()``. There is also no way to - translate these pushed keys into a fully translated character value. See - the ``pygame.KEYDOWN`` events on the :mod:`pygame.event` queue for this - functionality. - - .. versionchanged:: 2.1.4 - The collection of bools returned by ``get_pressed`` can not be iterated - over because the indexes of the internal tuple does not correspond to the - keycodes. - - .. ## pygame.key.get_pressed ## - -.. function:: get_just_pressed - - | :sl:`returns a pygame.key.ScancodeWrapper containing the most recent key presses` - | :sg:`get_just_pressed() -> bools` - - Returns a mapping from key codes to booleans indicating which keys were - newly pressed as of the last time events were processed. This can be used - as a convenience function to detect keys that were pressed "this frame." - - The result of this function is updated when new events are processed, - e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. - - A key can be marked as "just pressed" even if it is not currently pressed - according to :func:`pygame.key.get_pressed()`, if it was pressed and released - again during the same frame. Multiple presses and releases of the same key - are not distinguished from a single press with this function. - - .. seealso:: :func:`pygame.key.get_just_released()` - - .. note:: - If you require getting the key presses in order, use the event queue - ``KEYDOWN`` events - - :: - - if pygame.key.get_just_pressed()[pygame.K_b]: - print("B key just pressed") - - .. versionadded:: 2.4.0 - - .. ## pygame.key.get_just_pressed ## - -.. function:: get_just_released - - | :sl:`returns a pygame.key.ScancodeWrapper containing the most recent key releases` - | :sg:`get_just_pressed() -> bools` - - Returns a mapping from key codes to booleans indicating which keys were - newly released as of the last time events were processed. This can be used - as a convenience function to detect keys that were released "this frame." - - The result of this function is updated when new events are processed, - e.g. in :func:`pygame.event.get()` or :func:`pygame.event.pump()`. - - .. seealso:: :func:`pygame.key.get_just_pressed()` - - .. note:: - If you require getting the key releases in order, use the event queue - ``KEYUP`` events. - - :: - - if pygame.key.get_just_released()[pygame.K_b]: - print("B key just released") - - .. versionadded:: 2.4.0 - - .. ## pygame.key.get_just_released ## - -.. function:: get_mods - - | :sl:`determine which modifier keys are being held` - | :sg:`get_mods() -> int` - - Returns a single integer representing a bitmask of all the modifier keys - being held. Using bitwise operators you can test if specific - :ref:`modifier keys ` are pressed. - - .. ## pygame.key.get_mods ## - -.. function:: set_mods - - | :sl:`temporarily set which modifier keys are pressed` - | :sg:`set_mods(int, /) -> None` - - Create a bitmask of the :ref:`modifier key constants ` - you want to impose on your program. - - .. ## pygame.key.set_mods ## - -.. function:: set_repeat - - | :sl:`control how held keys are repeated` - | :sg:`set_repeat() -> None` - | :sg:`set_repeat(delay, /) -> None` - | :sg:`set_repeat(delay, interval, /) -> None` - - When the keyboard repeat is enabled, keys that are held down will generate - multiple ``pygame.KEYDOWN`` events. The ``delay`` parameter is the number of - milliseconds before the first repeated ``pygame.KEYDOWN`` event will be sent. - After that, another ``pygame.KEYDOWN`` event will be sent every ``interval`` - milliseconds. If a ``delay`` value is provided and an ``interval`` value is - not provided or is 0, then the ``interval`` will be set to the same value as - ``delay``. - - To disable key repeat call this function with no arguments or with ``delay`` - set to 0. - - When pygame is initialized the key repeat is disabled. - - :raises ValueError: if ``delay`` or ``interval`` is < 0 - - .. versionchangedold:: 2.0.0 A ``ValueError`` is now raised (instead of a - ``pygame.error``) if ``delay`` or ``interval`` is < 0. - - .. ## pygame.key.set_repeat ## - -.. function:: get_repeat - - | :sl:`see how held keys are repeated` - | :sg:`get_repeat() -> (delay, interval)` - - Get the ``delay`` and ``interval`` keyboard repeat values. Refer to - :func:`pygame.key.set_repeat()` for a description of these values. - - .. versionaddedold:: 1.8 - - .. ## pygame.key.get_repeat ## - -.. function:: name - - | :sl:`get the name of a key identifier` - | :sg:`name(key, use_compat=True) -> str` - - Get the descriptive name of the button from a keyboard button id constant. - Returns an empty string (``""``) if the key is not found. - - If ``use_compat`` argument is ``True`` (which is the default), this function - returns the legacy name of a key where applicable. The return value is - expected to be the same across different pygame versions (provided the - corresponding key constant exists and is unique). If the return value is - passed to the ``key_code`` function, the original constant will be returned. - - If this argument is ``False``, the returned name may be prettier to display - and may cover a wider range of keys than with ``use_compat``, but there are - no guarantees that this name will be the same across different pygame - versions. If the name returned is passed to the ``key_code`` function, the - original constant is returned back (this is an implementation detail which - may change later, do not rely on this) - - .. versionchanged:: 2.1.3 Added ``use_compat`` argument and guaranteed API stability for it - - .. ## pygame.key.name ## - -.. function:: key_code - - | :sl:`get the key identifier from a key name` - | :sg:`key_code(name=string) -> int` - - Get the key identifier code from the descriptive name of the key. This - returns an integer matching one of the K_* keycodes. For example: - - :: - - >>> pygame.key.key_code("return") == pygame.K_RETURN - True - >>> pygame.key.key_code("0") == pygame.K_0 - True - >>> pygame.key.key_code("space") == pygame.K_SPACE - True - - :raises ValueError: if the key name is not known. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.key.key_code ## - -.. function:: start_text_input - - | :sl:`start handling Unicode text input events` - | :sg:`start_text_input() -> None` - - Start receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT`` - events. If applicable, show the on-screen keyboard or IME editor. - - For many languages, key presses will automatically generate a - corresponding ``pygame.TEXTINPUT`` event. Special keys like - escape or function keys, and certain key combinations will not - generate ``pygame.TEXTINPUT`` events. - - In other languages, entering a single symbol may require multiple - key presses, or a language-specific user interface. In this case, - ``pygame.TEXTINPUT`` events are preferable to ``pygame.KEYDOWN`` - events for text input. - - A ``pygame.TEXTEDITING`` event is received when an IME composition - is started or changed. It contains the composition ``text``, ``length``, - and editing ``start`` position within the composition (attributes - ``text``, ``length``, and ``start``, respectively). - When the composition is committed (or non-IME input is received), - a ``pygame.TEXTINPUT`` event is generated. - - Text input events handling is on by default. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.key.start_text_input ## - -.. function:: stop_text_input - - | :sl:`stop handling Unicode text input events` - | :sg:`stop_text_input() -> None` - - Stop receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT`` - events. If an on-screen keyboard or IME editor was shown with - ``pygame.key.start_text_input()``, hide it again. - - Text input events handling is on by default. - - To avoid triggering the IME editor or the on-screen keyboard - when the user is holding down a key during gameplay, text input - should be disabled once text entry is finished, or when the user - clicks outside of a text box. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.key.stop_text_input ## - -.. function:: set_text_input_rect - - | :sl:`controls the position of the candidate list` - | :sg:`set_text_input_rect(rect, /) -> None` - - This sets the rectangle used for typing with an IME. - It controls where the candidate list will open, if supported. - - .. versionaddedold:: 2.0.0 - - .. ## pygame.key.set_text_input_rect ## - -.. ## pygame.key ## +.. autopgmodule:: pygame.key + :members: + :exclude-members: ScancodeWrapper diff --git a/src_c/doc/key_doc.h b/src_c/doc/key_doc.h index 3a75fd097e..5c7157208d 100644 --- a/src_c/doc/key_doc.h +++ b/src_c/doc/key_doc.h @@ -1,15 +1,15 @@ /* Auto generated file: with make_docs.py . Docs go in docs/reST/ref/ . */ -#define DOC_KEY "pygame module to work with the keyboard" -#define DOC_KEY_GETFOCUSED "get_focused() -> bool\ntrue if the display is receiving keyboard input from the system" -#define DOC_KEY_GETPRESSED "get_pressed() -> bools\nget the state of all keyboard buttons" -#define DOC_KEY_GETJUSTPRESSED "get_just_pressed() -> bools\nreturns a pygame.key.ScancodeWrapper containing the most recent key presses" -#define DOC_KEY_GETJUSTRELEASED "get_just_pressed() -> bools\nreturns a pygame.key.ScancodeWrapper containing the most recent key releases" -#define DOC_KEY_GETMODS "get_mods() -> int\ndetermine which modifier keys are being held" -#define DOC_KEY_SETMODS "set_mods(int, /) -> None\ntemporarily set which modifier keys are pressed" -#define DOC_KEY_SETREPEAT "set_repeat() -> None\nset_repeat(delay, /) -> None\nset_repeat(delay, interval, /) -> None\ncontrol how held keys are repeated" -#define DOC_KEY_GETREPEAT "get_repeat() -> (delay, interval)\nsee how held keys are repeated" -#define DOC_KEY_NAME "name(key, use_compat=True) -> str\nget the name of a key identifier" -#define DOC_KEY_KEYCODE "key_code(name=string) -> int\nget the key identifier from a key name" -#define DOC_KEY_STARTTEXTINPUT "start_text_input() -> None\nstart handling Unicode text input events" -#define DOC_KEY_STOPTEXTINPUT "stop_text_input() -> None\nstop handling Unicode text input events" -#define DOC_KEY_SETTEXTINPUTRECT "set_text_input_rect(rect, /) -> None\ncontrols the position of the candidate list" +#define DOC_KEY "Pygame module to work with the keyboard." +#define DOC_KEY_GETFOCUSED "get_focused() -> bool\nTrue if the display is receiving keyboard input from the system." +#define DOC_KEY_GETPRESSED "get_pressed() -> ScancodeWrapper\nGet the state of all keyboard buttons." +#define DOC_KEY_GETJUSTPRESSED "get_just_pressed() -> ScancodeWrapper\nReturns a ScancodeWrapper containing the most recent key presses." +#define DOC_KEY_GETJUSTRELEASED "get_just_released() -> ScancodeWrapper\nReturns a ScancodeWrapper containing the most recent key releases." +#define DOC_KEY_GETMODS "get_mods() -> int\nDetermine which modifier keys are being held." +#define DOC_KEY_SETMODS "set_mods(mods, /) -> None\nTemporarily set which modifier keys are pressed." +#define DOC_KEY_SETREPEAT "set_repeat(delay=0, interval=0, /) -> None\nControl how held keys are repeated." +#define DOC_KEY_GETREPEAT "get_repeat() -> tuple[int, int]\nSee how held keys are repeated." +#define DOC_KEY_NAME "name(key, use_compat=True) -> str\nGet the name of a key identifier." +#define DOC_KEY_KEYCODE "key_code(name) -> int\nGet the key identifier from a key name." +#define DOC_KEY_STARTTEXTINPUT "start_text_input() -> None\nStart handling Unicode text input events." +#define DOC_KEY_STOPTEXTINPUT "stop_text_input() -> None\nStop handling Unicode text input events." +#define DOC_KEY_SETTEXTINPUTRECT "set_text_input_rect(rect, /) -> None\nControls the position of the candidate list." From 3a8d1355ba513dfbc5406fc927defc0a4cfa7690 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 24 May 2025 01:00:38 -0700 Subject: [PATCH 192/441] Update CIBW setting to prevent warning --- pyproject.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index be0b18dfa0..e156ce53bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,11 @@ skip = "*-musllinux_*" # build[uv] is verbose by default, so below flag is not needed here # build-verbosity = 3 +# In CIBW 2, defaults to pypy-enabled, but is throwing warnings about the +# default changing in CIBW 3. So since we use pypy, lets explicitly enable it. +# https://cibuildwheel.pypa.io/en/stable/options/#enable +enable = ["pypy"] + environment = { SDL_VIDEODRIVER="dummy", SDL_AUDIODRIVER="disk" } test-command = "python -m pygame.tests -v --exclude opengl,music,timing --time_out 300" test-requires = ["numpy"] From ff307d87db35157042c10817c6c80566a414cbd6 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Fri, 28 Feb 2025 13:35:54 -0600 Subject: [PATCH 193/441] Surface is now multi-phase initialization --- src_c/surface.c | 105 +++++++++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 9dde1f92ff..ba48784f57 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4275,17 +4275,71 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, static PyMethodDef _surface_methods[] = {{NULL, NULL, 0, NULL}}; -MODINIT_DEFINE(surface) +int +exec_surface(PyObject *module) { - PyObject *module, *apiobj; + PyObject *apiobj; static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; + if (pg_warn_simd_at_runtime_but_uncompiled() < 0) { + Py_DECREF(module); + return -1; + } + + Py_INCREF(&pgSurface_Type); + if (PyModule_AddObjectRef(module, "SurfaceType", + (PyObject *)&pgSurface_Type)) { + Py_DECREF(module); + return -1; + } + + Py_INCREF(&pgSurface_Type); + if (PyModule_AddObjectRef(module, "Surface", + (PyObject *)&pgSurface_Type)) { + Py_DECREF(module); + return -1; + } + + /* export the c api */ + c_api[0] = &pgSurface_Type; + c_api[1] = pgSurface_New2; + c_api[2] = pgSurface_Blit; + c_api[3] = pgSurface_SetSurface; + apiobj = encapsulate_api(c_api, "surface"); + if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + Py_DECREF(module); + return -1; + } + + Py_XINCREF(pgSurface_Type.tp_dict); + if (PyModule_AddObjectRef(module, "_dict", pgSurface_Type.tp_dict)) { + Py_DECREF(module); + return -1; + } + + return 0; +} + +MODINIT_DEFINE(surface) +{ + static PyModuleDef_Slot surf_slots[] = { + {Py_mod_exec, &exec_surface}, +#if PY_VERSION_HEX >= 0x030c0000 + {Py_mod_multiple_interpreters, + Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}, // TODO: see if this can + // be supported later +#endif +#if PY_VERSION_HEX >= 0x030d0000 + {Py_mod_gil, Py_MOD_GIL_USED}, // TODO: support this later +#endif + {0, NULL}}; + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "surface", DOC_SURFACE, - -1, + 0, _surface_methods, - NULL, + surf_slots, NULL, NULL, NULL}; @@ -4319,46 +4373,5 @@ MODINIT_DEFINE(surface) return NULL; } - /* create the module */ - module = PyModule_Create(&_module); - if (module == NULL) { - return NULL; - } - if (pg_warn_simd_at_runtime_but_uncompiled() < 0) { - Py_DECREF(module); - return NULL; - } - Py_INCREF(&pgSurface_Type); - if (PyModule_AddObject(module, "SurfaceType", - (PyObject *)&pgSurface_Type)) { - Py_DECREF(&pgSurface_Type); - Py_DECREF(module); - return NULL; - } - - Py_INCREF(&pgSurface_Type); - if (PyModule_AddObject(module, "Surface", (PyObject *)&pgSurface_Type)) { - Py_DECREF(&pgSurface_Type); - Py_DECREF(module); - return NULL; - } - - /* export the c api */ - c_api[0] = &pgSurface_Type; - c_api[1] = pgSurface_New2; - c_api[2] = pgSurface_Blit; - c_api[3] = pgSurface_SetSurface; - apiobj = encapsulate_api(c_api, "surface"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); - Py_DECREF(module); - return NULL; - } - Py_XINCREF(pgSurface_Type.tp_dict); - if (PyModule_AddObject(module, "_dict", pgSurface_Type.tp_dict)) { - Py_XDECREF(pgSurface_Type.tp_dict); - Py_DECREF(module); - return NULL; - } - return module; + return PyModuleDef_Init(&_module); } From 1daefece2206440178483310f462deab093fa950 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 1 Mar 2025 20:20:04 -0600 Subject: [PATCH 194/441] m_size actually zero now --- src_c/surface.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index ba48784f57..2d03edb7f7 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -53,10 +53,10 @@ typedef enum { } SurfViewKind; /* To avoid problems with non-const Py_buffer format field */ -static char FormatUint8[] = "B"; -static char FormatUint16[] = "=H"; -static char FormatUint24[] = "3x"; -static char FormatUint32[] = "=I"; +#define FormatUint8 "B" +#define FormatUint16 "=H" +#define FormatUint24 "3x" +#define FormatUint32 "=I" typedef struct pg_bufferinternal_s { PyObject *consumer_ref; /* A weak reference to a bufferproxy object */ From e33b87aaf7748264b5dabe09f447bb0aaaddbe71 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 8 Mar 2025 21:55:53 -0600 Subject: [PATCH 195/441] Removed unnecessary module decrefs and strong refs in exec_surface --- src_c/surface.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 2d03edb7f7..14b4511c5f 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4282,21 +4282,16 @@ exec_surface(PyObject *module) static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; if (pg_warn_simd_at_runtime_but_uncompiled() < 0) { - Py_DECREF(module); return -1; } - Py_INCREF(&pgSurface_Type); if (PyModule_AddObjectRef(module, "SurfaceType", (PyObject *)&pgSurface_Type)) { - Py_DECREF(module); return -1; } - Py_INCREF(&pgSurface_Type); if (PyModule_AddObjectRef(module, "Surface", (PyObject *)&pgSurface_Type)) { - Py_DECREF(module); return -1; } @@ -4307,13 +4302,10 @@ exec_surface(PyObject *module) c_api[3] = pgSurface_SetSurface; apiobj = encapsulate_api(c_api, "surface"); if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_DECREF(module); return -1; } - Py_XINCREF(pgSurface_Type.tp_dict); if (PyModule_AddObjectRef(module, "_dict", pgSurface_Type.tp_dict)) { - Py_DECREF(module); return -1; } From a0688ebe0e04c287b5ab90c19d8a8d56db70f46e Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 24 May 2025 13:43:32 -0500 Subject: [PATCH 196/441] Replace PyModule_AddObjectRef with PyModule_Add for surface capi --- src_c/surface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 7c9cfce5e7..e542c7dbb0 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4623,8 +4623,7 @@ exec_surface(PyObject *module) c_api[2] = pgSurface_Blit; c_api[3] = pgSurface_SetSurface; apiobj = encapsulate_api(c_api, "surface"); - if (PyModule_AddObjectRef(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); + if (PyModule_Add(module, PYGAMEAPI_LOCAL_ENTRY, apiobj) < 0) { return -1; } From b0fa4ab393b0f260864214e4235d40440d87bf62 Mon Sep 17 00:00:00 2001 From: AntoineM <160046187+AntoineMamou@users.noreply.github.com> Date: Sat, 24 May 2025 20:47:06 +0200 Subject: [PATCH 197/441] new angle and angle_rad property in vector2 (#3222) * Changes to be commited: new file: test.txt * Delete test.txt * add angle and angle_rad property for vector2 * syntax error correction * code modification for properties angle and angle rad and new doc for these properties * type stubs correction * add new property vector2_default_angle * correction math_test.py * .angle and .angle_rad with math.atan2 behaviour for special cases * adding helper function _pg_atan2 + docs modification * Add versionadded doc to angle properties * Update version to 2.5.5 --------- Co-authored-by: Gabriele Co-authored-by: GabrieleLS Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> Co-authored-by: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> --- buildconfig/stubs/pygame/math.pyi | 4 ++ docs/reST/ref/math.rst | 21 +++++++ src_c/doc/math_doc.h | 2 + src_c/math.c | 63 ++++++++++++++++++++ test/math_test.py | 98 +++++++++++++++++++++++++++++++ 5 files changed, 188 insertions(+) diff --git a/buildconfig/stubs/pygame/math.pyi b/buildconfig/stubs/pygame/math.pyi index aed0449bc8..98b84ec340 100644 --- a/buildconfig/stubs/pygame/math.pyi +++ b/buildconfig/stubs/pygame/math.pyi @@ -209,6 +209,10 @@ class Vector2(_GenericVector): xy: Vector2 yx: Vector2 yy: Vector2 + @property + def angle(self) -> float: ... + @property + def angle_rad(self) -> float: ... @overload def __init__( self: _TVec, diff --git a/docs/reST/ref/math.rst b/docs/reST/ref/math.rst index e359a4b899..e366b1f5c3 100644 --- a/docs/reST/ref/math.rst +++ b/docs/reST/ref/math.rst @@ -616,6 +616,27 @@ Multiple coordinates can be set using slices or swizzling find that either the margin is too large or too small, in which case changing ``epsilon`` slightly might help you out. + .. attribute:: angle + + | :sl:`Gives the angle of the vector in degrees, relative to the X-axis, normalized to the interval [-180, 180].` + + Read-only attribute representing the angle of the vector in degrees relative to the X-axis. This angle is normalized to + the interval [-180, 180]. + + Usage: Accessing `angle` provides the current angle of the vector in degrees within the predefined range of [-180, 180]. + + .. versionadded:: 2.5.5 + + .. attribute:: angle_rad + + | :sl:`Gives the angle of the vector in radians, relative to the X-axis, normalized to the interval [-π, π].` + + Read-only attribute representing the angle of the vector in radians relative to the X-axis. This value is equivalent + to the `angle` attribute converted to radians and is normalized to the interval [-π, π]. + + Usage: Accessing `angle_rad` provides the current angle of the vector in radians within the predefined range of [-π, π]. + + .. versionadded:: 2.5.5 .. ## pygame.math.Vector2 ## diff --git a/src_c/doc/math_doc.h b/src_c/doc/math_doc.h index e002a0c672..548465487d 100644 --- a/src_c/doc/math_doc.h +++ b/src_c/doc/math_doc.h @@ -40,6 +40,8 @@ #define DOC_MATH_VECTOR2_CLAMPMAGNITUDEIP "clamp_magnitude_ip(max_length, /) -> None\nclamp_magnitude_ip(min_length, max_length, /) -> None\nClamps the vector's magnitude between max_length and min_length" #define DOC_MATH_VECTOR2_UPDATE "update() -> None\nupdate(int) -> None\nupdate(float) -> None\nupdate(Vector2) -> None\nupdate(x, y) -> None\nupdate((x, y)) -> None\nSets the coordinates of the vector." #define DOC_MATH_VECTOR2_EPSILON "Determines the tolerance of vector calculations." +#define DOC_MATH_VECTOR2_ANGLE "Gives the angle of the vector in degrees, relative to the X-axis, normalized to the interval [-180, 180]." +#define DOC_MATH_VECTOR2_ANGLERAD "Gives the angle of the vector in radians, relative to the X-axis, normalized to the interval [-π, π]." #define DOC_MATH_VECTOR3 "Vector3() -> Vector3(0, 0, 0)\nVector3(int) -> Vector3\nVector3(float) -> Vector3\nVector3(Vector3) -> Vector3\nVector3(x, y, z) -> Vector3\nVector3((x, y, z)) -> Vector3\na 3-Dimensional Vector" #define DOC_MATH_VECTOR3_DOT "dot(Vector3, /) -> float\ncalculates the dot- or scalar-product with the other vector" #define DOC_MATH_VECTOR3_CROSS "cross(Vector3, /) -> Vector3\ncalculates the cross- or vector-product" diff --git a/src_c/math.c b/src_c/math.c index 822640ccd6..3961eea174 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -51,6 +51,9 @@ #define TWO_PI (2. * M_PI) +#define RAD_TO_DEG (180.0 / M_PI) +#define DEG_TO_RAD (M_PI / 180.0) + #ifndef M_PI_2 #define M_PI_2 (M_PI / 2.0) #endif /* M_PI_2 */ @@ -142,6 +145,8 @@ _vector_coords_from_string(PyObject *str, char **delimiter, double *coords, static void _vector_move_towards_helper(Py_ssize_t dim, double *origin_coords, double *target_coords, double max_distance); +static double +_pg_atan2(double y, double x); /* generic vector functions */ static PyObject * @@ -202,6 +207,10 @@ vector_sety(pgVector *self, PyObject *value, void *closure); static int vector_setz(pgVector *self, PyObject *value, void *closure); static PyObject * +vector_get_angle(pgVector *self, void *closure); +static PyObject * +vector_get_angle_rad(pgVector *self, void *closure); +static PyObject * vector_richcompare(PyObject *o1, PyObject *o2, int op); static PyObject * vector_length(pgVector *self, PyObject *args); @@ -635,6 +644,40 @@ vector_dealloc(pgVector *self) Py_TYPE(self)->tp_free((PyObject *)self); } +/* + *Returns rhe arctangent of the quotient y / x, in radians, considering the + *following special cases: atan2((anything), NaN ) is NaN; atan2(NAN , + *(anything) ) is NaN; atan2(+-0, +(anything but NaN)) is +-0 ; atan2(+-0, + *-(anything but NaN)) is +-pi ; atan2(+-(anything but 0 and NaN), 0) is + *+-pi/2; atan2(+-(anything but INF and NaN), +INF) is +-0 ; atan2(+-(anything + *but INF and NaN), -INF) is +-pi; atan2(+-INF,+INF ) is +-pi/4 ; + * atan2(+-INF,-INF ) is +-3pi/4; + * atan2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; + * + */ +static double +_pg_atan2(double y, double x) +{ + if (Py_IS_NAN(x) || Py_IS_NAN(y)) { + return Py_NAN; + } + + if (Py_IS_INFINITY(y)) { + if (Py_IS_INFINITY(x)) { + return copysign((copysign(1., x) == 1.) ? 0.25 * Py_MATH_PI + : 0.75 * Py_MATH_PI, + y); + } + return copysign(0.5 * Py_MATH_PI, y); + } + + if (Py_IS_INFINITY(x) || y == 0.) { + return copysign((copysign(1., x) == 1.) ? 0. : Py_MATH_PI, y); + } + + return atan2(y, x); +} + /********************************************** * Generic vector PyNumber emulation routines **********************************************/ @@ -1303,6 +1346,23 @@ vector_setz(pgVector *self, PyObject *value, void *closure) return vector_set_component(self, value, 2); } +static PyObject * +vector_get_angle_rad(pgVector *self, void *closure) +{ + double angle_rad = _pg_atan2(self->coords[1], self->coords[0]); + + return PyFloat_FromDouble(angle_rad); +} + +static PyObject * +vector_get_angle(pgVector *self, void *closure) +{ + double angle_rad = _pg_atan2(self->coords[1], self->coords[0]); + double angle_deg = angle_rad * RAD_TO_DEG; + + return PyFloat_FromDouble(angle_deg); +} + static PyObject * vector_richcompare(PyObject *o1, PyObject *o2, int op) { @@ -2675,6 +2735,9 @@ static PyMethodDef vector2_methods[] = { static PyGetSetDef vector2_getsets[] = { {"x", (getter)vector_getx, (setter)vector_setx, NULL, NULL}, {"y", (getter)vector_gety, (setter)vector_sety, NULL, NULL}, + {"angle", (getter)vector_get_angle, NULL, DOC_MATH_VECTOR2_ANGLE, NULL}, + {"angle_rad", (getter)vector_get_angle_rad, NULL, + DOC_MATH_VECTOR2_ANGLERAD, NULL}, {NULL, 0, NULL, NULL, NULL} /* Sentinel */ }; diff --git a/test/math_test.py b/test/math_test.py index 0c195835ff..b7b91f73c8 100644 --- a/test/math_test.py +++ b/test/math_test.py @@ -1410,6 +1410,104 @@ def test_del_y(self): exception = ctx.exception self.assertEqual(str(exception), "Cannot delete the y attribute") + def test_angle_rad_property(self): + v0 = Vector2(1, 0) + self.assertEqual(v0.angle_rad, 0.0) + + v1 = Vector2(0, 1) + self.assertEqual(v1.angle_rad, math.pi / 2) + + v2 = Vector2(-1, 0) + self.assertEqual(v2.angle_rad, math.pi) + + v3 = Vector2(0, -1) + self.assertEqual(v3.angle_rad, -math.pi / 2) + + v4 = Vector2(1, 1) + self.assertEqual(v4.angle_rad, math.pi / 4) + + v5 = Vector2(-1, 1) + self.assertEqual(v5.angle_rad, 3 * math.pi / 4) + + v6 = Vector2(-1, -1) + self.assertEqual(v6.angle_rad, -3 * math.pi / 4) + + v7 = Vector2(1, -1) + self.assertEqual(v7.angle_rad, -math.pi / 4) + + v8 = Vector2(float('inf'), float('inf')) + self.assertEqual(v8.angle_rad, math.pi / 4) + + v9 = Vector2(float('-inf'), float('inf')) + self.assertEqual(v9.angle_rad, 3 * math.pi / 4) + + v10 = Vector2(float('-inf'), float('-inf')) + self.assertEqual(v10.angle_rad, -3 * math.pi / 4) + + v11 = Vector2(float('inf'), float('-inf')) + self.assertEqual(v11.angle_rad, -math.pi / 4) + + v12 = Vector2(0, 0) + self.assertEqual(v12.angle_rad, 0.0) + + v13 = Vector2(float('nan'), 1) + self.assertTrue(math.isnan(v13.angle_rad)) + + v14 = Vector2(1, float('nan')) + self.assertTrue(math.isnan(v14.angle_rad)) + + v15 = Vector2(float('nan'), float('nan')) + self.assertTrue(math.isnan(v15.angle_rad)) + + def test_angle_property(self): + v0 = pygame.math.Vector2(1, 0) + self.assertEqual(v0.angle, 0.0) + + v1 = pygame.math.Vector2(0, 1) + self.assertEqual(v1.angle, 90.0) + + v2 = pygame.math.Vector2(-1, 0) + self.assertEqual(v2.angle, 180.0) + + v3 = pygame.math.Vector2(0, -1) + self.assertEqual(v3.angle, -90.0) + + v4 = pygame.math.Vector2(1, 1) + self.assertEqual(v4.angle, 45.0) + + v5 = pygame.math.Vector2(-1, 1) + self.assertEqual(v5.angle, 135.0) + + v6 = pygame.math.Vector2(-1, -1) + self.assertEqual(v6.angle, -135.0) + + v7 = pygame.math.Vector2(1, -1) + self.assertEqual(v7.angle, -45.0) + + v8 = pygame.math.Vector2(float('inf'), float('inf')) + self.assertEqual(v8.angle, 45.0) + + v9 = pygame.math.Vector2(float('-inf'), float('inf')) + self.assertEqual(v9.angle, 135.0) + + v10 = pygame.math.Vector2(float('-inf'), float('-inf')) + self.assertEqual(v10.angle, -135.0) + + v11 = pygame.math.Vector2(float('inf'), float('-inf')) + self.assertEqual(v11.angle, -45.0) + + v12 = pygame.math.Vector2(0, 0) + self.assertEqual(v12.angle, 0.0) + + v13 = pygame.math.Vector2(float('nan'), 1) + self.assertTrue(math.isnan(v13.angle)) + + v14 = pygame.math.Vector2(1, float('nan')) + self.assertTrue(math.isnan(v14.angle)) + + v15 = pygame.math.Vector2(float('nan'), float('nan')) + self.assertTrue(math.isnan(v15.angle)) + class Vector3TypeTest(unittest.TestCase): def setUp(self): From 780bfd40c2426b8294dde97edfe2729034d83ab9 Mon Sep 17 00:00:00 2001 From: damusss Date: Sun, 25 May 2025 10:39:04 +0200 Subject: [PATCH 198/441] Use floats for delay, improve docs --- buildconfig/stubs/pygame/image.pyi | 6 +++--- src_c/doc/image_doc.h | 2 +- src_c/imageext.c | 3 ++- test/image_test.py | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/buildconfig/stubs/pygame/image.pyi b/buildconfig/stubs/pygame/image.pyi index b9e1d487d0..01591a823f 100644 --- a/buildconfig/stubs/pygame/image.pyi +++ b/buildconfig/stubs/pygame/image.pyi @@ -136,8 +136,8 @@ def load_sized_svg(file: FileLike, size: Point) -> Surface: .. versionadded:: 2.4.0 """ -def load_animation(file: FileLike, namehint: str = "") -> list[tuple[Surface, int]]: - """Load an animation (GIF/WEBP) from a file (or file-like object). +def load_animation(file: FileLike, namehint: str = "") -> list[tuple[Surface, float]]: + """Load an animation (GIF/WEBP) from a file (or file-like object) as a list of frames. Load an animation (GIF/WEBP) from a file source. You can pass either a filename, a Python file-like object, or a pathlib.Path. If you pass a raw @@ -146,7 +146,7 @@ def load_animation(file: FileLike, namehint: str = "") -> list[tuple[Surface, in format. This returns a list of tuples (corresponding to every frame of the animation), - where each tuple is a (surface, delay) pair for that frame. + where each tuple is a (surface, delay in milliseconds) pair for that frame. This function requires SDL_image 2.6.0 or above. If pygame was compiled with an older version, ``pygame.error`` will be raised when this function is diff --git a/src_c/doc/image_doc.h b/src_c/doc/image_doc.h index bbb1f16c45..9830b39291 100644 --- a/src_c/doc/image_doc.h +++ b/src_c/doc/image_doc.h @@ -2,7 +2,7 @@ #define DOC_IMAGE "Pygame module for image transfer." #define DOC_IMAGE_LOAD "load(file, namehint='') -> Surface\nLoad new image from a file (or file-like object)." #define DOC_IMAGE_LOADSIZEDSVG "load_sized_svg(file, size) -> Surface\nLoad an SVG image from a file (or file-like object) with the given size." -#define DOC_IMAGE_LOADANIMATION "load_animation(file, namehint='') -> list[tuple[Surface, int]]\nLoad an animation (GIF/WEBP) from a file (or file-like object)." +#define DOC_IMAGE_LOADANIMATION "load_animation(file, namehint='') -> list[tuple[Surface, float]]\nLoad an animation (GIF/WEBP) from a file (or file-like object) as a list of frames." #define DOC_IMAGE_SAVE "save(surface, file, namehint='') -> None\nSave an image to file (or file-like object)." #define DOC_IMAGE_GETSDLIMAGEVERSION "get_sdl_image_version(linked=True) -> Optional[tuple[int, int, int]]\nGet version number of the SDL_Image library being used." #define DOC_IMAGE_GETEXTENDED "get_extended() -> bool\nTest if extended image formats can be loaded." diff --git a/src_c/imageext.c b/src_c/imageext.c index 5e39e62d02..5fe672756d 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -264,7 +264,8 @@ imageext_load_animation(PyObject *self, PyObject *arg, PyObject *kwargs) * to null in the animation to prevent double free */ surfs->frames[i] = NULL; - PyObject *listentry = Py_BuildValue("(Oi)", frame, surfs->delays[i]); + PyObject *listentry = + Py_BuildValue("(Of)", frame, (float)surfs->delays[i]); Py_DECREF(frame); if (!listentry) { goto error; diff --git a/test/image_test.py b/test/image_test.py index 05520c85d2..eab5cc06fc 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -1369,7 +1369,7 @@ def test_load_sized_svg_erroring(self): def test_load_animation(self): # test loading from a file SAMPLE_FRAMES = 10 - SAMPLE_DELAY = 150 + SAMPLE_DELAY = 150.0 SAMPLE_SIZE = (312, 312) gif_path = pathlib.Path(example_path("data/animated_sample.gif")) for inp in ( @@ -1390,7 +1390,7 @@ def test_load_animation(self): frame, delay = val self.assertIsInstance(frame, pygame.Surface) self.assertEqual(frame.size, SAMPLE_SIZE) - self.assertIsInstance(delay, int) + self.assertIsInstance(delay, float) self.assertEqual(delay, SAMPLE_DELAY) def test_load_pathlib(self): From 40a6380498e6de66be50389b39dc25a222ef6d9a Mon Sep 17 00:00:00 2001 From: damusss Date: Sun, 25 May 2025 10:50:08 +0200 Subject: [PATCH 199/441] Use double --- src_c/imageext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/imageext.c b/src_c/imageext.c index 5fe672756d..b13a6859c7 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -265,7 +265,7 @@ imageext_load_animation(PyObject *self, PyObject *arg, PyObject *kwargs) surfs->frames[i] = NULL; PyObject *listentry = - Py_BuildValue("(Of)", frame, (float)surfs->delays[i]); + Py_BuildValue("(Od)", frame, (double)surfs->delays[i]); Py_DECREF(frame); if (!listentry) { goto error; From fb776862b2fdf41246efd0b33ee335d0d3047a0b Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 25 May 2025 02:10:46 -0700 Subject: [PATCH 200/441] Update pythoncapi_compat.h --- src_c/include/pythoncapi_compat.h | 869 +++++++++++++++++++++++++++++- 1 file changed, 857 insertions(+), 12 deletions(-) diff --git a/src_c/include/pythoncapi_compat.h b/src_c/include/pythoncapi_compat.h index 51e8c0de75..4b179e4931 100644 --- a/src_c/include/pythoncapi_compat.h +++ b/src_c/include/pythoncapi_compat.h @@ -7,7 +7,7 @@ // https://github.com/python/pythoncapi_compat // // Latest version: -// https://raw.githubusercontent.com/python/pythoncapi_compat/master/pythoncapi_compat.h +// https://raw.githubusercontent.com/python/pythoncapi-compat/main/pythoncapi_compat.h // // SPDX-License-Identifier: 0BSD @@ -19,11 +19,15 @@ extern "C" { #endif #include +#include // offsetof() // Python 3.11.0b4 added PyFrame_Back() to Python.h #if PY_VERSION_HEX < 0x030b00B4 && !defined(PYPY_VERSION) # include "frameobject.h" // PyFrameObject, PyFrame_GetBack() #endif +#if PY_VERSION_HEX < 0x030C00A3 +# include // T_SHORT, READONLY +#endif #ifndef _Py_CAST @@ -33,11 +37,13 @@ extern "C" { // Static inline functions should use _Py_NULL rather than using directly NULL // to prevent C++ compiler warnings. On C23 and newer and on C++11 and newer, // _Py_NULL is defined as nullptr. -#if (defined (__STDC_VERSION__) && __STDC_VERSION__ > 201710L) \ - || (defined(__cplusplus) && __cplusplus >= 201103) -# define _Py_NULL nullptr -#else -# define _Py_NULL NULL +#ifndef _Py_NULL +# if (defined (__STDC_VERSION__) && __STDC_VERSION__ > 201710L) \ + || (defined(__cplusplus) && __cplusplus >= 201103) +# define _Py_NULL nullptr +# else +# define _Py_NULL NULL +# endif #endif // Cast argument to PyObject* type. @@ -45,6 +51,13 @@ extern "C" { # define _PyObject_CAST(op) _Py_CAST(PyObject*, op) #endif +#ifndef Py_BUILD_ASSERT +# define Py_BUILD_ASSERT(cond) \ + do { \ + (void)sizeof(char [1 - 2 * !(cond)]); \ + } while(0) +#endif + // bpo-42262 added Py_NewRef() to Python 3.10.0a3 #if PY_VERSION_HEX < 0x030A00A3 && !defined(Py_NewRef) @@ -280,7 +293,7 @@ PyFrame_GetVarString(PyFrameObject *frame, const char *name) // bpo-39947 added PyThreadState_GetInterpreter() to Python 3.9.0a5 -#if PY_VERSION_HEX < 0x030900A5 || defined(PYPY_VERSION) +#if PY_VERSION_HEX < 0x030900A5 || (defined(PYPY_VERSION) && PY_VERSION_HEX < 0x030B0000) static inline PyInterpreterState * PyThreadState_GetInterpreter(PyThreadState *tstate) { @@ -573,7 +586,7 @@ static inline int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) return 0; } *pobj = Py_NewRef(obj); - return (*pobj != NULL); + return 1; } #endif @@ -911,7 +924,7 @@ static inline int PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg) { PyObject **dict = _PyObject_GetDictPtr(obj); - if (*dict == NULL) { + if (dict == NULL || *dict == NULL) { return -1; } Py_VISIT(*dict); @@ -922,7 +935,7 @@ static inline void PyObject_ClearManagedDict(PyObject *obj) { PyObject **dict = _PyObject_GetDictPtr(obj); - if (*dict == NULL) { + if (dict == NULL || *dict == NULL) { return; } Py_CLEAR(*dict); @@ -1197,11 +1210,11 @@ static inline int PyTime_PerfCounter(PyTime_t *result) #endif // gh-111389 added hash constants to Python 3.13.0a5. These constants were -// added first as private macros to Python 3.4.0b1 and PyPy 7.3.9. +// added first as private macros to Python 3.4.0b1 and PyPy 7.3.8. #if (!defined(PyHASH_BITS) \ && ((!defined(PYPY_VERSION) && PY_VERSION_HEX >= 0x030400B1) \ || (defined(PYPY_VERSION) && PY_VERSION_HEX >= 0x03070000 \ - && PYPY_VERSION_NUM >= 0x07090000))) + && PYPY_VERSION_NUM >= 0x07030800))) # define PyHASH_BITS _PyHASH_BITS # define PyHASH_MODULUS _PyHASH_MODULUS # define PyHASH_INF _PyHASH_INF @@ -1338,6 +1351,166 @@ PyDict_SetDefaultRef(PyObject *d, PyObject *key, PyObject *default_value, } #endif +#if PY_VERSION_HEX < 0x030D00B3 +# define Py_BEGIN_CRITICAL_SECTION(op) { +# define Py_END_CRITICAL_SECTION() } +# define Py_BEGIN_CRITICAL_SECTION2(a, b) { +# define Py_END_CRITICAL_SECTION2() } +#endif + +#if PY_VERSION_HEX < 0x030E0000 && PY_VERSION_HEX >= 0x03060000 && !defined(PYPY_VERSION) +typedef struct PyUnicodeWriter PyUnicodeWriter; + +static inline void PyUnicodeWriter_Discard(PyUnicodeWriter *writer) +{ + _PyUnicodeWriter_Dealloc((_PyUnicodeWriter*)writer); + PyMem_Free(writer); +} + +static inline PyUnicodeWriter* PyUnicodeWriter_Create(Py_ssize_t length) +{ + if (length < 0) { + PyErr_SetString(PyExc_ValueError, + "length must be positive"); + return NULL; + } + + const size_t size = sizeof(_PyUnicodeWriter); + PyUnicodeWriter *pub_writer = (PyUnicodeWriter *)PyMem_Malloc(size); + if (pub_writer == _Py_NULL) { + PyErr_NoMemory(); + return _Py_NULL; + } + _PyUnicodeWriter *writer = (_PyUnicodeWriter *)pub_writer; + + _PyUnicodeWriter_Init(writer); + if (_PyUnicodeWriter_Prepare(writer, length, 127) < 0) { + PyUnicodeWriter_Discard(pub_writer); + return NULL; + } + writer->overallocate = 1; + return pub_writer; +} + +static inline PyObject* PyUnicodeWriter_Finish(PyUnicodeWriter *writer) +{ + PyObject *str = _PyUnicodeWriter_Finish((_PyUnicodeWriter*)writer); + assert(((_PyUnicodeWriter*)writer)->buffer == NULL); + PyMem_Free(writer); + return str; +} + +static inline int +PyUnicodeWriter_WriteChar(PyUnicodeWriter *writer, Py_UCS4 ch) +{ + if (ch > 0x10ffff) { + PyErr_SetString(PyExc_ValueError, + "character must be in range(0x110000)"); + return -1; + } + + return _PyUnicodeWriter_WriteChar((_PyUnicodeWriter*)writer, ch); +} + +static inline int +PyUnicodeWriter_WriteStr(PyUnicodeWriter *writer, PyObject *obj) +{ + PyObject *str = PyObject_Str(obj); + if (str == NULL) { + return -1; + } + + int res = _PyUnicodeWriter_WriteStr((_PyUnicodeWriter*)writer, str); + Py_DECREF(str); + return res; +} + +static inline int +PyUnicodeWriter_WriteRepr(PyUnicodeWriter *writer, PyObject *obj) +{ + PyObject *str = PyObject_Repr(obj); + if (str == NULL) { + return -1; + } + + int res = _PyUnicodeWriter_WriteStr((_PyUnicodeWriter*)writer, str); + Py_DECREF(str); + return res; +} + +static inline int +PyUnicodeWriter_WriteUTF8(PyUnicodeWriter *writer, + const char *str, Py_ssize_t size) +{ + if (size < 0) { + size = (Py_ssize_t)strlen(str); + } + + PyObject *str_obj = PyUnicode_FromStringAndSize(str, size); + if (str_obj == _Py_NULL) { + return -1; + } + + int res = _PyUnicodeWriter_WriteStr((_PyUnicodeWriter*)writer, str_obj); + Py_DECREF(str_obj); + return res; +} + +static inline int +PyUnicodeWriter_WriteWideChar(PyUnicodeWriter *writer, + const wchar_t *str, Py_ssize_t size) +{ + if (size < 0) { + size = (Py_ssize_t)wcslen(str); + } + + PyObject *str_obj = PyUnicode_FromWideChar(str, size); + if (str_obj == _Py_NULL) { + return -1; + } + + int res = _PyUnicodeWriter_WriteStr((_PyUnicodeWriter*)writer, str_obj); + Py_DECREF(str_obj); + return res; +} + +static inline int +PyUnicodeWriter_WriteSubstring(PyUnicodeWriter *writer, PyObject *str, + Py_ssize_t start, Py_ssize_t end) +{ + if (!PyUnicode_Check(str)) { + PyErr_Format(PyExc_TypeError, "expect str, not %T", str); + return -1; + } + if (start < 0 || start > end) { + PyErr_Format(PyExc_ValueError, "invalid start argument"); + return -1; + } + if (end > PyUnicode_GET_LENGTH(str)) { + PyErr_Format(PyExc_ValueError, "invalid end argument"); + return -1; + } + + return _PyUnicodeWriter_WriteSubstring((_PyUnicodeWriter*)writer, str, + start, end); +} + +static inline int +PyUnicodeWriter_Format(PyUnicodeWriter *writer, const char *format, ...) +{ + va_list vargs; + va_start(vargs, format); + PyObject *str = PyUnicode_FromFormatV(format, vargs); + va_end(vargs); + if (str == _Py_NULL) { + return -1; + } + + int res = _PyUnicodeWriter_WriteStr((_PyUnicodeWriter*)writer, str); + Py_DECREF(str); + return res; +} +#endif // PY_VERSION_HEX < 0x030E0000 // gh-116560 added PyLong_GetSign() to Python 3.14.0a0 #if PY_VERSION_HEX < 0x030E00A0 @@ -1353,6 +1526,678 @@ static inline int PyLong_GetSign(PyObject *obj, int *sign) } #endif +// gh-126061 added PyLong_IsPositive/Negative/Zero() to Python in 3.14.0a2 +#if PY_VERSION_HEX < 0x030E00A2 +static inline int PyLong_IsPositive(PyObject *obj) +{ + if (!PyLong_Check(obj)) { + PyErr_Format(PyExc_TypeError, "expected int, got %s", Py_TYPE(obj)->tp_name); + return -1; + } + return _PyLong_Sign(obj) == 1; +} + +static inline int PyLong_IsNegative(PyObject *obj) +{ + if (!PyLong_Check(obj)) { + PyErr_Format(PyExc_TypeError, "expected int, got %s", Py_TYPE(obj)->tp_name); + return -1; + } + return _PyLong_Sign(obj) == -1; +} + +static inline int PyLong_IsZero(PyObject *obj) +{ + if (!PyLong_Check(obj)) { + PyErr_Format(PyExc_TypeError, "expected int, got %s", Py_TYPE(obj)->tp_name); + return -1; + } + return _PyLong_Sign(obj) == 0; +} +#endif + + +// gh-124502 added PyUnicode_Equal() to Python 3.14.0a0 +#if PY_VERSION_HEX < 0x030E00A0 +static inline int PyUnicode_Equal(PyObject *str1, PyObject *str2) +{ + if (!PyUnicode_Check(str1)) { + PyErr_Format(PyExc_TypeError, "first argument must be str, not %s", + Py_TYPE(str1)->tp_name); + return -1; + } + if (!PyUnicode_Check(str2)) { + PyErr_Format(PyExc_TypeError, "second argument must be str, not %s", + Py_TYPE(str2)->tp_name); + return -1; + } + +#if PY_VERSION_HEX >= 0x030d0000 && !defined(PYPY_VERSION) + PyAPI_FUNC(int) _PyUnicode_Equal(PyObject *str1, PyObject *str2); + + return _PyUnicode_Equal(str1, str2); +#elif PY_VERSION_HEX >= 0x03060000 && !defined(PYPY_VERSION) + return _PyUnicode_EQ(str1, str2); +#elif PY_VERSION_HEX >= 0x03090000 && defined(PYPY_VERSION) + return _PyUnicode_EQ(str1, str2); +#else + return (PyUnicode_Compare(str1, str2) == 0); +#endif +} +#endif + + +// gh-121645 added PyBytes_Join() to Python 3.14.0a0 +#if PY_VERSION_HEX < 0x030E00A0 +static inline PyObject* PyBytes_Join(PyObject *sep, PyObject *iterable) +{ + return _PyBytes_Join(sep, iterable); +} +#endif + + +#if PY_VERSION_HEX < 0x030E00A0 +static inline Py_hash_t Py_HashBuffer(const void *ptr, Py_ssize_t len) +{ +#if PY_VERSION_HEX >= 0x03000000 && !defined(PYPY_VERSION) + PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void *src, Py_ssize_t len); + + return _Py_HashBytes(ptr, len); +#else + Py_hash_t hash; + PyObject *bytes = PyBytes_FromStringAndSize((const char*)ptr, len); + if (bytes == NULL) { + return -1; + } + hash = PyObject_Hash(bytes); + Py_DECREF(bytes); + return hash; +#endif +} +#endif + + +#if PY_VERSION_HEX < 0x030E00A0 +static inline int PyIter_NextItem(PyObject *iter, PyObject **item) +{ + iternextfunc tp_iternext; + + assert(iter != NULL); + assert(item != NULL); + + tp_iternext = Py_TYPE(iter)->tp_iternext; + if (tp_iternext == NULL) { + *item = NULL; + PyErr_Format(PyExc_TypeError, "expected an iterator, got '%s'", + Py_TYPE(iter)->tp_name); + return -1; + } + + if ((*item = tp_iternext(iter))) { + return 1; + } + if (!PyErr_Occurred()) { + return 0; + } + if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + PyErr_Clear(); + return 0; + } + return -1; +} +#endif + + +#if PY_VERSION_HEX < 0x030E00A0 +static inline PyObject* PyLong_FromInt32(int32_t value) +{ + Py_BUILD_ASSERT(sizeof(long) >= 4); + return PyLong_FromLong(value); +} + +static inline PyObject* PyLong_FromInt64(int64_t value) +{ + Py_BUILD_ASSERT(sizeof(long long) >= 8); + return PyLong_FromLongLong(value); +} + +static inline PyObject* PyLong_FromUInt32(uint32_t value) +{ + Py_BUILD_ASSERT(sizeof(unsigned long) >= 4); + return PyLong_FromUnsignedLong(value); +} + +static inline PyObject* PyLong_FromUInt64(uint64_t value) +{ + Py_BUILD_ASSERT(sizeof(unsigned long long) >= 8); + return PyLong_FromUnsignedLongLong(value); +} + +static inline int PyLong_AsInt32(PyObject *obj, int32_t *pvalue) +{ + Py_BUILD_ASSERT(sizeof(int) == 4); + int value = PyLong_AsInt(obj); + if (value == -1 && PyErr_Occurred()) { + return -1; + } + *pvalue = (int32_t)value; + return 0; +} + +static inline int PyLong_AsInt64(PyObject *obj, int64_t *pvalue) +{ + Py_BUILD_ASSERT(sizeof(long long) == 8); + long long value = PyLong_AsLongLong(obj); + if (value == -1 && PyErr_Occurred()) { + return -1; + } + *pvalue = (int64_t)value; + return 0; +} + +static inline int PyLong_AsUInt32(PyObject *obj, uint32_t *pvalue) +{ + Py_BUILD_ASSERT(sizeof(long) >= 4); + unsigned long value = PyLong_AsUnsignedLong(obj); + if (value == (unsigned long)-1 && PyErr_Occurred()) { + return -1; + } +#if SIZEOF_LONG > 4 + if ((unsigned long)UINT32_MAX < value) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C uint32_t"); + return -1; + } +#endif + *pvalue = (uint32_t)value; + return 0; +} + +static inline int PyLong_AsUInt64(PyObject *obj, uint64_t *pvalue) +{ + Py_BUILD_ASSERT(sizeof(long long) == 8); + unsigned long long value = PyLong_AsUnsignedLongLong(obj); + if (value == (unsigned long long)-1 && PyErr_Occurred()) { + return -1; + } + *pvalue = (uint64_t)value; + return 0; +} +#endif + + +// gh-102471 added import and export API for integers to 3.14.0a2. +#if PY_VERSION_HEX < 0x030E00A2 && PY_VERSION_HEX >= 0x03000000 && !defined(PYPY_VERSION) +// Helpers to access PyLongObject internals. +static inline void +_PyLong_SetSignAndDigitCount(PyLongObject *op, int sign, Py_ssize_t size) +{ +#if PY_VERSION_HEX >= 0x030C0000 + op->long_value.lv_tag = (uintptr_t)(1 - sign) | ((uintptr_t)(size) << 3); +#elif PY_VERSION_HEX >= 0x030900A4 + Py_SET_SIZE(op, sign * size); +#else + Py_SIZE(op) = sign * size; +#endif +} + +static inline Py_ssize_t +_PyLong_DigitCount(const PyLongObject *op) +{ +#if PY_VERSION_HEX >= 0x030C0000 + return (Py_ssize_t)(op->long_value.lv_tag >> 3); +#else + return _PyLong_Sign((PyObject*)op) < 0 ? -Py_SIZE(op) : Py_SIZE(op); +#endif +} + +static inline digit* +_PyLong_GetDigits(const PyLongObject *op) +{ +#if PY_VERSION_HEX >= 0x030C0000 + return (digit*)(op->long_value.ob_digit); +#else + return (digit*)(op->ob_digit); +#endif +} + +typedef struct PyLongLayout { + uint8_t bits_per_digit; + uint8_t digit_size; + int8_t digits_order; + int8_t digit_endianness; +} PyLongLayout; + +typedef struct PyLongExport { + int64_t value; + uint8_t negative; + Py_ssize_t ndigits; + const void *digits; + Py_uintptr_t _reserved; +} PyLongExport; + +typedef struct PyLongWriter PyLongWriter; + +static inline const PyLongLayout* +PyLong_GetNativeLayout(void) +{ + static const PyLongLayout PyLong_LAYOUT = { + PyLong_SHIFT, + sizeof(digit), + -1, // least significant first + PY_LITTLE_ENDIAN ? -1 : 1, + }; + + return &PyLong_LAYOUT; +} + +static inline int +PyLong_Export(PyObject *obj, PyLongExport *export_long) +{ + if (!PyLong_Check(obj)) { + memset(export_long, 0, sizeof(*export_long)); + PyErr_Format(PyExc_TypeError, "expected int, got %s", + Py_TYPE(obj)->tp_name); + return -1; + } + + // Fast-path: try to convert to a int64_t + PyLongObject *self = (PyLongObject*)obj; + int overflow; +#if SIZEOF_LONG == 8 + long value = PyLong_AsLongAndOverflow(obj, &overflow); +#else + // Windows has 32-bit long, so use 64-bit long long instead + long long value = PyLong_AsLongLongAndOverflow(obj, &overflow); +#endif + Py_BUILD_ASSERT(sizeof(value) == sizeof(int64_t)); + // the function cannot fail since obj is a PyLongObject + assert(!(value == -1 && PyErr_Occurred())); + + if (!overflow) { + export_long->value = value; + export_long->negative = 0; + export_long->ndigits = 0; + export_long->digits = 0; + export_long->_reserved = 0; + } + else { + export_long->value = 0; + export_long->negative = _PyLong_Sign(obj) < 0; + export_long->ndigits = _PyLong_DigitCount(self); + if (export_long->ndigits == 0) { + export_long->ndigits = 1; + } + export_long->digits = _PyLong_GetDigits(self); + export_long->_reserved = (Py_uintptr_t)Py_NewRef(obj); + } + return 0; +} + +static inline void +PyLong_FreeExport(PyLongExport *export_long) +{ + PyObject *obj = (PyObject*)export_long->_reserved; + + if (obj) { + export_long->_reserved = 0; + Py_DECREF(obj); + } +} + +static inline PyLongWriter* +PyLongWriter_Create(int negative, Py_ssize_t ndigits, void **digits) +{ + if (ndigits <= 0) { + PyErr_SetString(PyExc_ValueError, "ndigits must be positive"); + return NULL; + } + assert(digits != NULL); + + PyLongObject *obj = _PyLong_New(ndigits); + if (obj == NULL) { + return NULL; + } + _PyLong_SetSignAndDigitCount(obj, negative?-1:1, ndigits); + + *digits = _PyLong_GetDigits(obj); + return (PyLongWriter*)obj; +} + +static inline void +PyLongWriter_Discard(PyLongWriter *writer) +{ + PyLongObject *obj = (PyLongObject *)writer; + + assert(Py_REFCNT(obj) == 1); + Py_DECREF(obj); +} + +static inline PyObject* +PyLongWriter_Finish(PyLongWriter *writer) +{ + PyObject *obj = (PyObject *)writer; + PyLongObject *self = (PyLongObject*)obj; + Py_ssize_t j = _PyLong_DigitCount(self); + Py_ssize_t i = j; + int sign = _PyLong_Sign(obj); + + assert(Py_REFCNT(obj) == 1); + + // Normalize and get singleton if possible + while (i > 0 && _PyLong_GetDigits(self)[i-1] == 0) { + --i; + } + if (i != j) { + if (i == 0) { + sign = 0; + } + _PyLong_SetSignAndDigitCount(self, sign, i); + } + if (i <= 1) { + long val = sign * (long)(_PyLong_GetDigits(self)[0]); + Py_DECREF(obj); + return PyLong_FromLong(val); + } + + return obj; +} +#endif + + +#if PY_VERSION_HEX < 0x030C00A3 +# define Py_T_SHORT T_SHORT +# define Py_T_INT T_INT +# define Py_T_LONG T_LONG +# define Py_T_FLOAT T_FLOAT +# define Py_T_DOUBLE T_DOUBLE +# define Py_T_STRING T_STRING +# define _Py_T_OBJECT T_OBJECT +# define Py_T_CHAR T_CHAR +# define Py_T_BYTE T_BYTE +# define Py_T_UBYTE T_UBYTE +# define Py_T_USHORT T_USHORT +# define Py_T_UINT T_UINT +# define Py_T_ULONG T_ULONG +# define Py_T_STRING_INPLACE T_STRING_INPLACE +# define Py_T_BOOL T_BOOL +# define Py_T_OBJECT_EX T_OBJECT_EX +# define Py_T_LONGLONG T_LONGLONG +# define Py_T_ULONGLONG T_ULONGLONG +# define Py_T_PYSSIZET T_PYSSIZET + +# if PY_VERSION_HEX >= 0x03000000 && !defined(PYPY_VERSION) +# define _Py_T_NONE T_NONE +# endif + +# define Py_READONLY READONLY +# define Py_AUDIT_READ READ_RESTRICTED +# define _Py_WRITE_RESTRICTED PY_WRITE_RESTRICTED +#endif + + +// gh-127350 added Py_fopen() and Py_fclose() to Python 3.14a4 +#if PY_VERSION_HEX < 0x030E00A4 +static inline FILE* Py_fopen(PyObject *path, const char *mode) +{ +#if 0x030400A2 <= PY_VERSION_HEX && !defined(PYPY_VERSION) + PyAPI_FUNC(FILE*) _Py_fopen_obj(PyObject *path, const char *mode); + + return _Py_fopen_obj(path, mode); +#else + FILE *f; + PyObject *bytes; +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_FSConverter(path, &bytes)) { + return NULL; + } +#else + if (!PyString_Check(path)) { + PyErr_SetString(PyExc_TypeError, "except str"); + return NULL; + } + bytes = Py_NewRef(path); +#endif + const char *path_bytes = PyBytes_AS_STRING(bytes); + + f = fopen(path_bytes, mode); + Py_DECREF(bytes); + + if (f == NULL) { + PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path); + return NULL; + } + return f; +#endif +} + +static inline int Py_fclose(FILE *file) +{ + return fclose(file); +} +#endif + + +#if 0x03090000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x030E0000 && !defined(PYPY_VERSION) +static inline PyObject* +PyConfig_Get(const char *name) +{ + typedef enum { + _PyConfig_MEMBER_INT, + _PyConfig_MEMBER_UINT, + _PyConfig_MEMBER_ULONG, + _PyConfig_MEMBER_BOOL, + _PyConfig_MEMBER_WSTR, + _PyConfig_MEMBER_WSTR_OPT, + _PyConfig_MEMBER_WSTR_LIST, + } PyConfigMemberType; + + typedef struct { + const char *name; + size_t offset; + PyConfigMemberType type; + const char *sys_attr; + } PyConfigSpec; + +#define PYTHONCAPI_COMPAT_SPEC(MEMBER, TYPE, sys_attr) \ + {#MEMBER, offsetof(PyConfig, MEMBER), \ + _PyConfig_MEMBER_##TYPE, sys_attr} + + static const PyConfigSpec config_spec[] = { + PYTHONCAPI_COMPAT_SPEC(argv, WSTR_LIST, "argv"), + PYTHONCAPI_COMPAT_SPEC(base_exec_prefix, WSTR_OPT, "base_exec_prefix"), + PYTHONCAPI_COMPAT_SPEC(base_executable, WSTR_OPT, "_base_executable"), + PYTHONCAPI_COMPAT_SPEC(base_prefix, WSTR_OPT, "base_prefix"), + PYTHONCAPI_COMPAT_SPEC(bytes_warning, UINT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(exec_prefix, WSTR_OPT, "exec_prefix"), + PYTHONCAPI_COMPAT_SPEC(executable, WSTR_OPT, "executable"), + PYTHONCAPI_COMPAT_SPEC(inspect, BOOL, _Py_NULL), +#if 0x030C0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(int_max_str_digits, UINT, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(interactive, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(module_search_paths, WSTR_LIST, "path"), + PYTHONCAPI_COMPAT_SPEC(optimization_level, UINT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(parser_debug, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(platlibdir, WSTR, "platlibdir"), + PYTHONCAPI_COMPAT_SPEC(prefix, WSTR_OPT, "prefix"), + PYTHONCAPI_COMPAT_SPEC(pycache_prefix, WSTR_OPT, "pycache_prefix"), + PYTHONCAPI_COMPAT_SPEC(quiet, BOOL, _Py_NULL), +#if 0x030B0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(stdlib_dir, WSTR_OPT, "_stdlib_dir"), +#endif + PYTHONCAPI_COMPAT_SPEC(use_environment, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(verbose, UINT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(warnoptions, WSTR_LIST, "warnoptions"), + PYTHONCAPI_COMPAT_SPEC(write_bytecode, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(xoptions, WSTR_LIST, "_xoptions"), + PYTHONCAPI_COMPAT_SPEC(buffered_stdio, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(check_hash_pycs_mode, WSTR, _Py_NULL), +#if 0x030B0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(code_debug_ranges, BOOL, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(configure_c_stdio, BOOL, _Py_NULL), +#if 0x030D0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(cpu_count, INT, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(dev_mode, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(dump_refs, BOOL, _Py_NULL), +#if 0x030B0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(dump_refs_file, WSTR_OPT, _Py_NULL), +#endif +#ifdef Py_GIL_DISABLED + PYTHONCAPI_COMPAT_SPEC(enable_gil, INT, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(faulthandler, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(filesystem_encoding, WSTR, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(filesystem_errors, WSTR, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(hash_seed, ULONG, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(home, WSTR_OPT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(import_time, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(install_signal_handlers, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(isolated, BOOL, _Py_NULL), +#ifdef MS_WINDOWS + PYTHONCAPI_COMPAT_SPEC(legacy_windows_stdio, BOOL, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(malloc_stats, BOOL, _Py_NULL), +#if 0x030A0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(orig_argv, WSTR_LIST, "orig_argv"), +#endif + PYTHONCAPI_COMPAT_SPEC(parse_argv, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(pathconfig_warnings, BOOL, _Py_NULL), +#if 0x030C0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(perf_profiling, UINT, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(program_name, WSTR, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(run_command, WSTR_OPT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(run_filename, WSTR_OPT, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(run_module, WSTR_OPT, _Py_NULL), +#if 0x030B0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(safe_path, BOOL, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(show_ref_count, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(site_import, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(skip_source_first_line, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(stdio_encoding, WSTR, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(stdio_errors, WSTR, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(tracemalloc, UINT, _Py_NULL), +#if 0x030B0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(use_frozen_modules, BOOL, _Py_NULL), +#endif + PYTHONCAPI_COMPAT_SPEC(use_hash_seed, BOOL, _Py_NULL), + PYTHONCAPI_COMPAT_SPEC(user_site_directory, BOOL, _Py_NULL), +#if 0x030A0000 <= PY_VERSION_HEX + PYTHONCAPI_COMPAT_SPEC(warn_default_encoding, BOOL, _Py_NULL), +#endif + }; + +#undef PYTHONCAPI_COMPAT_SPEC + + const PyConfigSpec *spec; + int found = 0; + for (size_t i=0; i < sizeof(config_spec) / sizeof(config_spec[0]); i++) { + spec = &config_spec[i]; + if (strcmp(spec->name, name) == 0) { + found = 1; + break; + } + } + if (found) { + if (spec->sys_attr != NULL) { + PyObject *value = PySys_GetObject(spec->sys_attr); + if (value == NULL) { + PyErr_Format(PyExc_RuntimeError, "lost sys.%s", spec->sys_attr); + return NULL; + } + return Py_NewRef(value); + } + + PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); + + const PyConfig *config = _Py_GetConfig(); + void *member = (char *)config + spec->offset; + switch (spec->type) { + case _PyConfig_MEMBER_INT: + case _PyConfig_MEMBER_UINT: + { + int value = *(int *)member; + return PyLong_FromLong(value); + } + case _PyConfig_MEMBER_BOOL: + { + int value = *(int *)member; + return PyBool_FromLong(value != 0); + } + case _PyConfig_MEMBER_ULONG: + { + unsigned long value = *(unsigned long *)member; + return PyLong_FromUnsignedLong(value); + } + case _PyConfig_MEMBER_WSTR: + case _PyConfig_MEMBER_WSTR_OPT: + { + wchar_t *wstr = *(wchar_t **)member; + if (wstr != NULL) { + return PyUnicode_FromWideChar(wstr, -1); + } + else { + return Py_NewRef(Py_None); + } + } + case _PyConfig_MEMBER_WSTR_LIST: + { + const PyWideStringList *list = (const PyWideStringList *)member; + PyObject *tuple = PyTuple_New(list->length); + if (tuple == NULL) { + return NULL; + } + + for (Py_ssize_t i = 0; i < list->length; i++) { + PyObject *item = PyUnicode_FromWideChar(list->items[i], -1); + if (item == NULL) { + Py_DECREF(tuple); + return NULL; + } + PyTuple_SET_ITEM(tuple, i, item); + } + return tuple; + } + default: + Py_UNREACHABLE(); + } + } + + PyErr_Format(PyExc_ValueError, "unknown config option name: %s", name); + return NULL; +} + +static inline int +PyConfig_GetInt(const char *name, int *value) +{ + PyObject *obj = PyConfig_Get(name); + if (obj == NULL) { + return -1; + } + + if (!PyLong_Check(obj)) { + Py_DECREF(obj); + PyErr_Format(PyExc_TypeError, "config option %s is not an int", name); + return -1; + } + + int as_int = PyLong_AsInt(obj); + Py_DECREF(obj); + if (as_int == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_OverflowError, + "config option %s value does not fit into a C int", name); + return -1; + } + + *value = as_int; + return 0; +} +#endif // PY_VERSION_HEX > 0x03090000 && !defined(PYPY_VERSION) + #ifdef __cplusplus } From f531d0b7626b13b08365a47c5299700db919dcc0 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 25 May 2025 12:59:18 -0500 Subject: [PATCH 201/441] Moved imports and PyType_Ready to exec_surface --- src_c/surface.c | 58 ++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index e542c7dbb0..76ff3bd785 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4600,6 +4600,35 @@ static PyMethodDef _surface_methods[] = {{NULL, NULL, 0, NULL}}; int exec_surface(PyObject *module) { + /* imported needed apis; Do this first so if there is an error + the module is not loaded. + */ + import_pygame_base(); + if (PyErr_Occurred()) { + return -1; + } + import_pygame_color(); + if (PyErr_Occurred()) { + return -1; + } + import_pygame_rect(); + if (PyErr_Occurred()) { + return -1; + } + import_pygame_bufferproxy(); + if (PyErr_Occurred()) { + return -1; + } + _IMPORT_PYGAME_MODULE(surflock); + if (PyErr_Occurred()) { + return -1; + } + + /* type preparation */ + if (PyType_Ready(&pgSurface_Type) < 0) { + return -1; + } + PyObject *apiobj; static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; @@ -4658,34 +4687,5 @@ MODINIT_DEFINE(surface) 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; - } - import_pygame_color(); - if (PyErr_Occurred()) { - return NULL; - } - import_pygame_rect(); - if (PyErr_Occurred()) { - return NULL; - } - import_pygame_bufferproxy(); - if (PyErr_Occurred()) { - return NULL; - } - _IMPORT_PYGAME_MODULE(surflock); - if (PyErr_Occurred()) { - return NULL; - } - - /* type preparation */ - if (PyType_Ready(&pgSurface_Type) < 0) { - return NULL; - } - return PyModuleDef_Init(&_module); } From 80c04482a3c8e80c3a3592fbc7ed0744623f9e4f Mon Sep 17 00:00:00 2001 From: Michael Lamertz Date: Wed, 28 May 2025 14:11:42 +0200 Subject: [PATCH 202/441] Elaborate on Vector conversion to tuples/lists --- docs/reST/ref/math.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/reST/ref/math.rst b/docs/reST/ref/math.rst index e366b1f5c3..a254758f1f 100644 --- a/docs/reST/ref/math.rst +++ b/docs/reST/ref/math.rst @@ -35,13 +35,32 @@ subscripts v.y == v[1] v.z == v[2] -Multiple coordinates can be set using slices or swizzling +Multiple coordinates can be set and retrieved using slices or swizzling. :: v = pygame.Vector2() v.xy = 1, 2 v[:] = 1, 2 + print(v) # Vector2(1, 2) + print(v.x) # 1.0 + print(v.y) # 2.0 + print(v.xy) # Vector2(1, 2) + print(v.yx) # Vector2(2, 1) + print(v.xyyx) # (1.0, 2.0, 2.0, 1.0) + +Note above, that swizzlling with 2 components will return a Vector2 instance +again, while more than 2 components will result in a tuple. But since vectors +support the iterator protocol, they can be by unpacked, or converted to lists +or tuples. + +:: + + v = Vector2(1, 2) + print(*v) # 1.0 2.0 + print(tuple(v)) # (1.0, 2.0) + print(tuple(v.yx)) # (2.0, 1.0) + .. versionaddedold:: 1.9.2pre .. versionchangedold:: 1.9.4 Removed experimental notice. From b3d135c299798236d0b04276eab4076fbeaa1f63 Mon Sep 17 00:00:00 2001 From: Michael Lamertz Date: Thu, 29 May 2025 10:21:01 +0200 Subject: [PATCH 203/441] Typo and grammar fixes --- docs/reST/ref/math.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reST/ref/math.rst b/docs/reST/ref/math.rst index a254758f1f..d8efb944e5 100644 --- a/docs/reST/ref/math.rst +++ b/docs/reST/ref/math.rst @@ -49,10 +49,10 @@ Multiple coordinates can be set and retrieved using slices or swizzling. print(v.yx) # Vector2(2, 1) print(v.xyyx) # (1.0, 2.0, 2.0, 1.0) -Note above, that swizzlling with 2 components will return a Vector2 instance +Note above, that swizzling with 2 components will return a Vector2 instance again, while more than 2 components will result in a tuple. But since vectors -support the iterator protocol, they can be by unpacked, or converted to lists -or tuples. +support the iterator protocol, they can be unpacked, or converted to lists or +tuples. :: From fbe0a52b182c09af92289174d0f1795fe44e4b5a Mon Sep 17 00:00:00 2001 From: Toni Date: Fri, 30 May 2025 15:48:44 +0300 Subject: [PATCH 204/441] add doc for vec conversion (#3446) --- docs/reST/ref/math.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/reST/ref/math.rst b/docs/reST/ref/math.rst index d8efb944e5..96532b9f4e 100644 --- a/docs/reST/ref/math.rst +++ b/docs/reST/ref/math.rst @@ -62,6 +62,33 @@ tuples. print(tuple(v.yx)) # (2.0, 1.0) +A vector can be converted to other data types using the built-in constructors + +:: + + v = pygame.Vector2(1, 2) + + list(v) == [1.0, 2.0] + tuple(v) == (1.0, 2.0) + set(v) == {1.0, 2.0} + +Conversion can be combined with swizzling or slicing to create a new order + +:: + + v = pygame.Vector3(1, 2, 3) + + list(v.xz) == [1.0, 3.0] + list(v.zyx) == [3.0, 2.0, 1.0] + list(v.yyy) == [2.0, 2.0, 2.0] + tuple(v.xyyzzz) == (1.0, 2.0, 2.0, 3.0, 3.0, 3.0) + tuple(v.zxyxzzyx) == (3.0, 1.0, 2.0, 1.0, 3.0, 3.0, 2.0, 1.0) + set(v.yxzxzyzxyx) == {1.0, 2.0, 3.0} # sets remove duplicates + + list(v[:]) == [1.0, 2.0, 3.0] + tuple(v[::-1]) == (3.0, 2.0, 1.0) + set(v[1:3]) == {2.0, 3.0} + .. versionaddedold:: 1.9.2pre .. versionchangedold:: 1.9.4 Removed experimental notice. .. versionchangedold:: 1.9.4 Allow scalar construction like GLSL Vector2(2) == Vector2(2.0, 2.0) From 881a962122309c15fd7dae64568d372ac7cb374c Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 23 May 2025 22:00:30 -0700 Subject: [PATCH 205/441] Port SDL_FillRect SDL3 --- src_c/_pygame.h | 7 +++++++ src_c/draw.c | 5 ++--- src_c/surface.c | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 808be1a496..423421267f 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -136,6 +136,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_GetSurfaceBlendMode SDL_GetSurfaceBlendMode #define PG_GetSurfaceAlphaMod SDL_GetSurfaceAlphaMod #define PG_SetSurfaceAlphaMod SDL_SetSurfaceAlphaMod +#define PG_FillSurfaceRect SDL_FillSurfaceRect #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB @@ -269,6 +270,12 @@ PG_SetSurfaceAlphaMod(SDL_Surface *surface, Uint8 alpha) return SDL_SetSurfaceAlphaMod(surface, alpha) == 0; } +static inline bool +PG_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color) +{ + return SDL_FillRect(dst, rect, color) == 0; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/draw.c b/src_c/draw.c index c837c7a5c7..a63aea97cc 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1178,7 +1178,6 @@ rect(PyObject *self, PyObject *args, PyObject *kwargs) int top_left_radius = -1, top_right_radius = -1, bottom_left_radius = -1, bottom_right_radius = -1; SDL_Rect sdlrect; - int result; SDL_Rect clipped; int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, INT_MIN}; /* Used to store bounding box values */ @@ -1248,10 +1247,10 @@ rect(PyObject *self, PyObject *args, PyObject *kwargs) else { pgSurface_Prep(surfobj); pgSurface_Lock(surfobj); - result = SDL_FillRect(surf, &clipped, color); + bool success = PG_FillSurfaceRect(surf, &clipped, color); pgSurface_Unlock(surfobj); pgSurface_Unprep(surfobj); - if (result != 0) { + if (!success) { return RAISE(pgExc_SDLError, SDL_GetError()); } } diff --git a/src_c/surface.c b/src_c/surface.c index 0f0dbe919d..cc00235241 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -2198,7 +2198,7 @@ surf_fill(pgSurfaceObject *self, PyObject *args, PyObject *keywds) else { pgSurface_Prep(self); pgSurface_Lock((pgSurfaceObject *)self); - result = SDL_FillRect(surf, &sdlrect, color); + result = PG_FillSurfaceRect(surf, &sdlrect, color) - 1; pgSurface_Unlock((pgSurfaceObject *)self); pgSurface_Unprep(self); } @@ -2938,7 +2938,7 @@ surf_scroll(PyObject *self, PyObject *args, PyObject *keywds) if (!repeat) { if (dx >= w || dx <= -w || dy >= h || dy <= -h) { if (erase) { - if (SDL_FillRect(surf, NULL, 0) == -1) { + if (!PG_FillSurfaceRect(surf, NULL, 0)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return NULL; } From 1ff87598be2f4a908b225555bbc31916b2863527 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 02:58:30 -0700 Subject: [PATCH 206/441] Port SDL_LockSurface SDL3 --- src_c/_pygame.h | 7 +++++++ src_c/alphablit.c | 4 ++-- src_c/freetype/ft_render.c | 4 ++-- src_c/surface_fill.c | 2 +- src_c/surflock.c | 7 +------ src_c/transform.c | 18 ++++-------------- 6 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 423421267f..fc528874ae 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -137,6 +137,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_GetSurfaceAlphaMod SDL_GetSurfaceAlphaMod #define PG_SetSurfaceAlphaMod SDL_SetSurfaceAlphaMod #define PG_FillSurfaceRect SDL_FillSurfaceRect +#define PG_LockSurface SDL_LockSurface #define PG_GetRGBA SDL_GetRGBA #define PG_GetRGB SDL_GetRGB @@ -276,6 +277,12 @@ PG_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color) return SDL_FillRect(dst, rect, color) == 0; } +static inline bool +PG_LockSurface(SDL_Surface *surface) +{ + return SDL_LockSurface(surface) == 0; +} + // NOTE: // palette is part of the format in SDL2, so these functions below have it // as a separate parameter to be consistent with the SDL3 signature. diff --git a/src_c/alphablit.c b/src_c/alphablit.c index f2e3524384..f279c50b4b 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -80,7 +80,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* Lock the destination if it's in hardware */ dst_locked = 0; if (SDL_MUSTLOCK(dst)) { - if (SDL_LockSurface(dst) < 0) { + if (!PG_LockSurface(dst)) { okay = 0; } else { @@ -90,7 +90,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* Lock the source if it's in hardware */ src_locked = 0; if (SDL_MUSTLOCK(src)) { - if (SDL_LockSurface(src) < 0) { + if (!PG_LockSurface(src)) { okay = 0; } else { diff --git a/src_c/freetype/ft_render.c b/src_c/freetype/ft_render.c index fdc61a7bdd..a7cb54c28d 100644 --- a/src_c/freetype/ft_render.c +++ b/src_c/freetype/ft_render.c @@ -286,7 +286,7 @@ _PGFT_Render_ExistingSurface(FreeTypeInstance *ft, pgFontObject *fontobj, Layout *font_text; if (SDL_MUSTLOCK(surface)) { - if (SDL_LockSurface(surface) == -1) { + if (!PG_LockSurface(surface)) { SDL_FreeSurface(surface); PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; @@ -445,7 +445,7 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, } if (SDL_MUSTLOCK(surface)) { - if (SDL_LockSurface(surface) == -1) { + if (!PG_LockSurface(surface)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(surface); return 0; diff --git a/src_c/surface_fill.c b/src_c/surface_fill.c index 9e9ad0be04..ad4e084069 100644 --- a/src_c/surface_fill.c +++ b/src_c/surface_fill.c @@ -927,7 +927,7 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, /* Lock the surface, if needed */ if (SDL_MUSTLOCK(surface)) { - if (SDL_LockSurface(surface) < 0) { + if (!PG_LockSurface(surface)) { return -1; } locked = 1; diff --git a/src_c/surflock.c b/src_c/surflock.c index f34fac3ce4..862c9a9303 100644 --- a/src_c/surflock.c +++ b/src_c/surflock.c @@ -99,12 +99,7 @@ pgSurface_LockBy(pgSurfaceObject *surfobj, PyObject *lockobj) if (surf->subsurface != NULL) { pgSurface_Prep(surfobj); } -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_LockSurface(surf->surf)) -#else - if (SDL_LockSurface(surf->surf) == -1) -#endif - { + if (!PG_LockSurface(surf->surf)) { PyErr_SetString(PyExc_RuntimeError, "error locking surface"); return 0; } diff --git a/src_c/transform.c b/src_c/transform.c index 4d308f9d33..8869607b33 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -2420,20 +2420,10 @@ solid_overlay(pgSurfaceObject *srcobj, Uint32 color, pgSurfaceObject *dstobj, int src_lock = SDL_MUSTLOCK(src); int dst_lock = src != newsurf && SDL_MUSTLOCK(newsurf); -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (src_lock && !SDL_LockSurface(src)) -#else - if (src_lock && SDL_LockSurface(src) < 0) -#endif - { + if (src_lock && !PG_LockSurface(src)) { return NULL; } -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (dst_lock && !SDL_LockSurface(newsurf)) -#else - if (dst_lock && SDL_LockSurface(newsurf) < 0) -#endif - { + if (dst_lock && !PG_LockSurface(newsurf)) { if (src_lock) { SDL_UnlockSurface(src); } @@ -2696,13 +2686,13 @@ modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, { int surf_locked = 0; if (SDL_MUSTLOCK(surf)) { - if (SDL_LockSurface(surf) == 0) { + if (PG_LockSurface(surf)) { surf_locked = 1; } } int dst_locked = 0; if (SDL_MUSTLOCK(dst)) { - if (SDL_LockSurface(dst) == 0) { + if (PG_LockSurface(dst)) { dst_locked = 1; } } From 36b067d6337a7427e4f03c4b78866522ed53dd24 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 31 May 2025 17:06:05 -0500 Subject: [PATCH 207/441] Update pre-commit config --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 47597c7a4f..a9476d3460 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,7 +26,7 @@ repos: )$ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.5 + rev: v0.11.12 hooks: # See pyproject.toml for configuration options. - id: ruff name: ruff-sort-imports @@ -35,7 +35,7 @@ repos: types_or: [ python, pyi, jupyter ] - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.0 + rev: v20.1.5 hooks: - id: clang-format exclude: | From a484e3427f6347ec06c51bc8a2449c73d7972e2e Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 22:30:02 -0700 Subject: [PATCH 208/441] Remove math C API --- src_c/_pygame.h | 1 - src_c/include/_pygame.h | 18 +----------------- src_c/math.c | 18 +----------------- 3 files changed, 2 insertions(+), 35 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index fc528874ae..d2d747dc23 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -670,7 +670,6 @@ typedef enum { #define PYGAMEAPI_RWOBJECT_NUMSLOTS 5 #define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2 #define PYGAMEAPI_COLOR_NUMSLOTS 5 -#define PYGAMEAPI_MATH_NUMSLOTS 2 #define PYGAMEAPI_BASE_NUMSLOTS 30 #define PYGAMEAPI_EVENT_NUMSLOTS 10 #define PYGAMEAPI_WINDOW_NUMSLOTS 1 diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index 6f9942cb6c..c3bcc5ec55 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -509,26 +509,10 @@ typedef struct pgColorObject pgColorObject; #endif /* PYGAMEAPI_COLOR_INTERNAL */ /* - * Math module + * Geometry module */ -#ifndef PYGAMEAPI_MATH_INTERNAL -#define pgVector2_Check(x) \ - ((x)->ob_type == (PyTypeObject *)PYGAMEAPI_GET_SLOT(math, 0)) - -#define pgVector3_Check(x) \ - ((x)->ob_type == (PyTypeObject *)PYGAMEAPI_GET_SLOT(math, 1)) -/* -#define pgVector2_New \ - (*(PyObject*(*)) \ - PYGAMEAPI_GET_SLOT(PyGAME_C_API, 1)) -*/ -#define import_pygame_math() IMPORT_PYGAME_MODULE(math) -#endif /* PYGAMEAPI_MATH_INTERNAL */ - #ifndef PYGAMEAPI_GEOMETRY_INTERNAL - #define import_pygame_geometry() IMPORT_PYGAME_MODULE(geometry) - #endif /* ~PYGAMEAPI_GEOMETRY_INTERNAL */ /* diff --git a/src_c/math.c b/src_c/math.c index 3961eea174..7d57b273c2 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -4625,9 +4625,7 @@ MODINIT_DEFINE(pg_math) MODINIT_DEFINE(math) #endif { - PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_MATH_NUMSLOTS]; - + PyObject *module; static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "math", DOC_MATH, @@ -4667,19 +4665,5 @@ MODINIT_DEFINE(math) return NULL; } - /* export the C api */ - c_api[0] = &pgVector2_Type; - c_api[1] = &pgVector3_Type; - /* - c_api[2] = pgVector_NEW; - c_api[3] = pgVectorCompatible_Check; - */ - apiobj = encapsulate_api(c_api, "math"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); - Py_DECREF(module); - return NULL; - } - return module; } From fb8c30ce536c90c79acceb46f3dd39f9aa3daeaa Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 22:37:48 -0700 Subject: [PATCH 209/441] Use PyModule_AddType in math.c --- src_c/math.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index 7d57b273c2..918fa12d43 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -4636,14 +4636,6 @@ MODINIT_DEFINE(math) NULL, NULL}; - /* initialize the extension types */ - if ((PyType_Ready(&pgVector2_Type) < 0) || - (PyType_Ready(&pgVector3_Type) < 0) || - (PyType_Ready(&pgVectorIter_Type) < 0) || - (PyType_Ready(&pgVectorElementwiseProxy_Type) < 0)) { - return NULL; - } - /* initialize the module */ module = PyModule_Create(&_module); @@ -4652,15 +4644,10 @@ MODINIT_DEFINE(math) } /* add extension types to module */ - if ((PyModule_AddObjectRef(module, "Vector2", - (PyObject *)&pgVector2_Type) < 0) || - (PyModule_AddObjectRef(module, "Vector3", - (PyObject *)&pgVector3_Type) < 0) || - (PyModule_AddObjectRef(module, "VectorElementwiseProxy", - (PyObject *)&pgVectorElementwiseProxy_Type) < - 0) || - (PyModule_AddObjectRef(module, "VectorIterator", - (PyObject *)&pgVectorIter_Type) < 0)) { + if ((PyModule_AddType(module, &pgVector2_Type) < 0) || + (PyModule_AddType(module, &pgVector3_Type) < 0) || + (PyModule_AddType(module, &pgVectorElementwiseProxy_Type) < 0) || + (PyModule_AddType(module, &pgVectorIter_Type) < 0)) { Py_DECREF(module); return NULL; } From 68808a8ae04369977c79be048a607113a56927fa Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Sun, 1 Jun 2025 10:36:05 +0200 Subject: [PATCH 210/441] Fix CI --- buildconfig/stubs/pygame/mouse.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/mouse.pyi b/buildconfig/stubs/pygame/mouse.pyi index a20bb8ea50..b040d871d8 100644 --- a/buildconfig/stubs/pygame/mouse.pyi +++ b/buildconfig/stubs/pygame/mouse.pyi @@ -83,7 +83,7 @@ def get_pressed( def get_pressed( num_buttons: Literal[5], desktop: bool = False ) -> tuple[bool, bool, bool, bool, bool]: ... -def get_pressed(*args, **kwargs) -> Any: +def get_pressed(*args, **kwargs) -> Any: # type: ignore """Get the state of the mouse buttons. Returns a sequence of booleans representing the state of all the mouse @@ -191,7 +191,7 @@ def get_rel() -> tuple[int, int]: def set_pos(pos: Point, /) -> None: ... @overload def set_pos(x: float, y: float, /) -> None: ... -def set_pos(*args) -> None: +def set_pos(*args) -> None: # type: ignore """Set the mouse cursor position. Set the current mouse position to arguments given. If the mouse cursor is @@ -243,7 +243,7 @@ def set_cursor( def set_cursor(hotspot: IntPoint, surface: Surface) -> None: ... @overload def set_cursor(constant: int) -> None: ... -def set_cursor(*args, **kwargs) -> None: +def set_cursor(*args, **kwargs) -> None: # type: ignore """Set the mouse cursor to a new cursor. Set the mouse cursor to something new. This function accepts either an explicit From f5702b66c34ffaf27f118894294ba7d9f659b7dd Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 1 Jun 2025 03:01:02 -0700 Subject: [PATCH 211/441] Optimize vector-number math by avoiding RealNumber_Check PyFloat_AsDouble does basically the same checks internally, so since this is the last case checked in the generic_math functions in math.c, we can just try to convert directly and handle if if the conversion fails. --- src_c/math.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index 3961eea174..fc55f93187 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -688,7 +688,7 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) Py_ssize_t i, dim; double *vec_coords; double other_coords[VECTOR_MAX_SIZE] = {0}; - double tmp; + double tmp = 0.0; PyObject *other; pgVector *vec, *ret = NULL; if (pgVector_Check(o1)) { @@ -712,11 +712,15 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) if (pg_VectorCoordsFromObj(other, dim, other_coords)) { op |= OP_ARG_VECTOR; } - else if (RealNumber_Check(other)) { - op |= OP_ARG_NUMBER; - } else { - op |= OP_ARG_UNKNOWN; + tmp = PyFloat_AsDouble(other); + if (tmp == -1.0 && PyErr_Occurred()) { + PyErr_Clear(); + op |= OP_ARG_UNKNOWN; + } + else { + op |= OP_ARG_NUMBER; + } } if (op & OP_INPLACE) { @@ -761,14 +765,12 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) case OP_MUL | OP_ARG_NUMBER: case OP_MUL | OP_ARG_NUMBER | OP_ARG_REVERSE: case OP_MUL | OP_ARG_NUMBER | OP_INPLACE: - tmp = PyFloat_AsDouble(other); for (i = 0; i < dim; i++) { ret->coords[i] = vec_coords[i] * tmp; } break; case OP_DIV | OP_ARG_NUMBER: case OP_DIV | OP_ARG_NUMBER | OP_INPLACE: - tmp = PyFloat_AsDouble(other); if (tmp == 0.) { PyErr_SetString(PyExc_ZeroDivisionError, "division by zero"); Py_DECREF(ret); @@ -781,7 +783,6 @@ vector_generic_math(PyObject *o1, PyObject *o2, int op) break; case OP_FLOOR_DIV | OP_ARG_NUMBER: case OP_FLOOR_DIV | OP_ARG_NUMBER | OP_INPLACE: - tmp = PyFloat_AsDouble(other); if (tmp == 0.) { PyErr_SetString(PyExc_ZeroDivisionError, "division by zero"); Py_DECREF(ret); @@ -3971,12 +3972,15 @@ vector_elementwiseproxy_generic_math(PyObject *o1, PyObject *o2, int op) return NULL; } } - else if (RealNumber_Check(other)) { - op |= OP_ARG_NUMBER; - other_value = PyFloat_AsDouble(other); - } else { - op |= OP_ARG_UNKNOWN; + other_value = PyFloat_AsDouble(other); + if (other_value == -1.0 && PyErr_Occurred()) { + PyErr_Clear(); + op |= OP_ARG_UNKNOWN; + } + else { + op |= OP_ARG_NUMBER; + } } ret = _vector_subtype_new(vec); From 7ca9d1c86c42dc5e3be33c4e9d9dd26c0589ef87 Mon Sep 17 00:00:00 2001 From: Antonis Date: Mon, 2 Jun 2025 04:15:12 +0300 Subject: [PATCH 212/441] add Color.from_hex --- buildconfig/stubs/pygame/color.pyi | 3 +++ docs/reST/ref/color.rst | 12 ++++++++++++ src_c/color.c | 6 ++++++ src_c/doc/color_doc.h | 1 + test/color_test.py | 12 ++++++++++++ 5 files changed, 34 insertions(+) diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index cbb39ad371..00e16c7e72 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -78,6 +78,9 @@ class Color(Collection[int]): @overload @classmethod def from_normalized(cls, r: float, g: float, b: float, a: float, /) -> Color: ... + @overload + @classmethod + def from_hex(cls, hex:str, /) -> Color: ... def normalize(self) -> tuple[float, float, float, float]: ... def correct_gamma(self, gamma: float, /) -> Color: ... @deprecated("since 2.1.3. Use unpacking instead") diff --git a/docs/reST/ref/color.rst b/docs/reST/ref/color.rst index 2198f7492b..6c0952acec 100644 --- a/docs/reST/ref/color.rst +++ b/docs/reST/ref/color.rst @@ -292,6 +292,18 @@ .. ## Color.from_normalized ## + .. classmethod:: from_hex + + | :sl:`Returns a Color object from a Hexadecimal representation` + | :sg:`from_hex(hex, /) -> Color` + + Creates a Color object from the given Hexadecimal components. Refer to :attr:`Color.hex` + for more information. + + .. versionadded:: 2.5.0 + + .. ## Color.from_hex ## + .. method:: normalize | :sl:`Returns the normalized RGBA values of the Color.` diff --git a/src_c/color.c b/src_c/color.c index 1ea417ce1e..7ae4fd3f77 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -116,6 +116,7 @@ COLOR_FROM_SPACE(hsla); COLOR_FROM_SPACE(cmy); COLOR_FROM_SPACE(i1i2i3); COLOR_FROM_SPACE(normalized); +COLOR_FROM_SPACE(hex); #undef COLOR_FROM_SPACE /* Getters/setters */ @@ -240,6 +241,8 @@ static PyMethodDef _color_methods[] = { DOC_COLOR_FROMI1I2I3}, {"from_normalized", (PyCFunction)_color_from_normalized, METH_CLASS | METH_VARARGS, DOC_COLOR_FROMNORMALIZED}, + {"from_hex", (PyCFunction)_color_from_hex, + METH_CLASS | METH_VARARGS, DOC_COLOR_FROMHEX}, {"normalize", (PyCFunction)_color_normalize, METH_NOARGS, DOC_COLOR_NORMALIZE}, {"correct_gamma", (PyCFunction)_color_correct_gamma, METH_VARARGS, @@ -723,6 +726,9 @@ _color_from_space(char *space, PyObject *args) else if (strcmp(space, "normalized") == 0) { set_success = _color_set_normalized(color, args, NULL); } + else if (strcmp(space, "hex") == 0) { + set_success = _color_set_hex(color, args, NULL); + } if (set_success != 0) { return NULL; diff --git a/src_c/doc/color_doc.h b/src_c/doc/color_doc.h index a16ba2076b..56fc569121 100644 --- a/src_c/doc/color_doc.h +++ b/src_c/doc/color_doc.h @@ -15,6 +15,7 @@ #define DOC_COLOR_FROMHSLA "from_hsla(object, /) -> Color\nfrom_hsla(h, s, l, a, /) -> Color\nReturns a Color object from an HSLA representation" #define DOC_COLOR_FROMI1I2I3 "from_i1i2i3(object, /) -> Color\nfrom_i1i2i3(i1, i2, i3, /) -> Color\nReturns a Color object from a I1I2I3 representation" #define DOC_COLOR_FROMNORMALIZED "from_normalized(object, /) -> Color\nfrom_normalized(r, g, b, a /) -> Color\nReturns a Color object from a Normalized representation" +#define DOC_COLOR_FROMHEX "from_hex(hex, /) -> Color\nReturns a Color object from a Hexadecimal representation" #define DOC_COLOR_NORMALIZE "normalize() -> tuple\nReturns the normalized RGBA values of the Color." #define DOC_COLOR_CORRECTGAMMA "correct_gamma(gamma, /) -> Color\nApplies a certain gamma value to the Color." #define DOC_COLOR_SETLENGTH "set_length(len, /) -> None\nSet the number of elements in the Color to 1,2,3, or 4." diff --git a/test/color_test.py b/test/color_test.py index 604b8d0078..6ceca06859 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -848,6 +848,18 @@ def test_from_normalized(self): ValueError, lambda: pygame.Color.from_normalized(1, 1, 1, 1, "lel") ) + def test_from_hex(self): + hex = pygame.Color.from_hex("#FFFFFF") + + expected_hex = (255, 255, 255, 255) + + self.assertEqual(expected_hex, hex) + + self.assertRaises( + ValueError, lambda: pygame.Color.from_hex("not-a-color") + ) + + def test_normalize(self): c = pygame.Color(204, 38, 194, 55) self.assertEqual(c.r, 204) From 45801dd4051de6bf1e2a704d6fb5aa0bec285361 Mon Sep 17 00:00:00 2001 From: Antonis Date: Mon, 2 Jun 2025 04:27:12 +0300 Subject: [PATCH 213/441] fix --- buildconfig/stubs/pygame/color.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 00e16c7e72..10980f347c 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -78,9 +78,8 @@ class Color(Collection[int]): @overload @classmethod def from_normalized(cls, r: float, g: float, b: float, a: float, /) -> Color: ... - @overload @classmethod - def from_hex(cls, hex:str, /) -> Color: ... + def from_hex(cls, hex: str, /) -> Color: ... def normalize(self) -> tuple[float, float, float, float]: ... def correct_gamma(self, gamma: float, /) -> Color: ... @deprecated("since 2.1.3. Use unpacking instead") From 19582fb5897701120e430655c677da2e3a536f72 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 1 Jun 2025 21:43:09 -0700 Subject: [PATCH 214/441] Use pg_VectorCoordsFromObj in _vector(2|3)_set Rather than using pgVectorCompatible_Check and then PySequence_AsVectorCoords, which have duplicative operations, we can use pg_VectorCoordsFromObj to try to unpack directly for a speedup when processing sequence input. --- src_c/math.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index 3961eea174..69efaa8add 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -2340,13 +2340,8 @@ static int _vector2_set(pgVector *self, PyObject *xOrSequence, PyObject *y) { if (xOrSequence) { - if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 2)) { - return -1; - } - else { - return 0; - } + if (pg_VectorCoordsFromObj(xOrSequence, 2, self->coords)) { + return 0; } else if (RealNumber_Check(xOrSequence)) { self->coords[0] = PyFloat_AsDouble(xOrSequence); @@ -2788,13 +2783,8 @@ static int _vector3_set(pgVector *self, PyObject *xOrSequence, PyObject *y, PyObject *z) { if (xOrSequence) { - if (pgVectorCompatible_Check(xOrSequence, self->dim)) { - if (!PySequence_AsVectorCoords(xOrSequence, self->coords, 3)) { - return -1; - } - else { - return 0; - } + if (pg_VectorCoordsFromObj(xOrSequence, 3, self->coords)) { + return 0; } else if (RealNumber_Check(xOrSequence)) { self->coords[0] = PyFloat_AsDouble(xOrSequence); From 753a14eae2fa2b6ed00148376c3edd00bbe0e0f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 07:17:42 +0000 Subject: [PATCH 215/441] Bump docker/build-push-action from 6.17.0 to 6.18.0 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.17.0 to 6.18.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/1dc73863535b631f98b2378be8619f83b136f4a0...263435318d21b8e681c14492fe198d362a7d2c83) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: 6.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 4eac40e1d4..0421e63163 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -75,7 +75,7 @@ jobs: - name: Build and push Docker image if: steps.inspect.outcome == 'failure' - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 with: context: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base file: ${{ github.workspace }}/buildconfig/manylinux-build/docker_base/Dockerfile-${{ matrix.arch }} From 223f035a1ae9100d2cd3721d8cff4c0442fbd415 Mon Sep 17 00:00:00 2001 From: Antonis Date: Mon, 2 Jun 2025 12:52:30 +0300 Subject: [PATCH 216/441] format --- docs/reST/ref/color.rst | 2 +- src_c/color.c | 4 ++-- test/color_test.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/reST/ref/color.rst b/docs/reST/ref/color.rst index 6c0952acec..4983261032 100644 --- a/docs/reST/ref/color.rst +++ b/docs/reST/ref/color.rst @@ -300,7 +300,7 @@ Creates a Color object from the given Hexadecimal components. Refer to :attr:`Color.hex` for more information. - .. versionadded:: 2.5.0 + .. versionadded:: 2.5.5 .. ## Color.from_hex ## diff --git a/src_c/color.c b/src_c/color.c index 7ae4fd3f77..653cc93070 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -241,8 +241,8 @@ static PyMethodDef _color_methods[] = { DOC_COLOR_FROMI1I2I3}, {"from_normalized", (PyCFunction)_color_from_normalized, METH_CLASS | METH_VARARGS, DOC_COLOR_FROMNORMALIZED}, - {"from_hex", (PyCFunction)_color_from_hex, - METH_CLASS | METH_VARARGS, DOC_COLOR_FROMHEX}, + {"from_hex", (PyCFunction)_color_from_hex, METH_CLASS | METH_VARARGS, + DOC_COLOR_FROMHEX}, {"normalize", (PyCFunction)_color_normalize, METH_NOARGS, DOC_COLOR_NORMALIZE}, {"correct_gamma", (PyCFunction)_color_correct_gamma, METH_VARARGS, diff --git a/test/color_test.py b/test/color_test.py index 6ceca06859..ffd25e2857 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -855,11 +855,11 @@ def test_from_hex(self): self.assertEqual(expected_hex, hex) + self.assertRaises(ValueError, lambda: pygame.Color.from_hex("not-a-color")) self.assertRaises( - ValueError, lambda: pygame.Color.from_hex("not-a-color") + ValueError, lambda: pygame.Color.from_hex("not-a-color", "lel") ) - def test_normalize(self): c = pygame.Color(204, 38, 194, 55) self.assertEqual(c.r, 204) From ae9e063c6c12eb527d5671628c0d6be0c44fa609 Mon Sep 17 00:00:00 2001 From: Antonis Date: Mon, 2 Jun 2025 14:24:08 +0300 Subject: [PATCH 217/441] change error type --- test/color_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/color_test.py b/test/color_test.py index ffd25e2857..9da2990a94 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -857,7 +857,7 @@ def test_from_hex(self): self.assertRaises(ValueError, lambda: pygame.Color.from_hex("not-a-color")) self.assertRaises( - ValueError, lambda: pygame.Color.from_hex("not-a-color", "lel") + TypeError, lambda: pygame.Color.from_hex("not-a-color", "lel") ) def test_normalize(self): From b30397e12c919ab6d45bea86522c01aa8efd0a62 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 2 Jun 2025 21:51:51 -0500 Subject: [PATCH 218/441] Fixed Incorrect palette instantiation in newsurf_fromsurf from #3314 to fix #3463 and added regression test --- src_c/transform.c | 2 +- test/transform_test.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src_c/transform.c b/src_c/transform.c index 8869607b33..77b900263e 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -136,7 +136,7 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) /* Copy palette, colorkey, etc info */ if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { SDL_Palette *newsurf_palette = PG_GetSurfacePalette(newsurf); - SDL_Palette *surf_palette = PG_GetSurfacePalette(newsurf); + SDL_Palette *surf_palette = PG_GetSurfacePalette(surf); if (newsurf_palette == NULL) { PyErr_SetString( diff --git a/test/transform_test.py b/test/transform_test.py index 580bfdc66e..1c674f9ee4 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -1449,6 +1449,39 @@ def test_rotate__lossless_at_90_degrees(self): for pt, color in gradient: self.assertTrue(s.get_at(pt) == color) + def test_rotate_after_convert_regression(self): + # Tests a regression found from https://github.com/pygame-community/pygame-ce/pull/3314 + # Reported in https://github.com/pygame-community/pygame-ce/issues/3463 + + pygame.display.set_mode((1, 1)) + + output1 = pygame.transform.rotate( + pygame.image.load( + os.path.join( + os.path.abspath(os.path.dirname(__file__)), + "../examples/data/alien1.png", + ) + ).convert_alpha(), + 180, + ) + output2 = pygame.transform.rotate( + pygame.image.load( + os.path.join( + os.path.abspath(os.path.dirname(__file__)), + "../examples/data/alien1.png", + ) + ), + 180, + ).convert_alpha() + + for x in range(50): + for y in range(50): + color1 = pygame.Color(output1.get_at((x, y))) + color2 = pygame.Color(output2.get_at((x, y))) + self.assertEqual(color1, color2) + + pygame.quit() + def test_scale2x(self): # __doc__ (as of 2008-06-25) for pygame.transform.scale2x: From 492bd221bd8c701776f024706521c37f40ec13b4 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:46:14 -0500 Subject: [PATCH 219/441] added pygame.transform.pixelate --- buildconfig/stubs/pygame/transform.pyi | 23 +++++ src_c/transform.c | 112 +++++++++++++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index e5df5844a8..c1666ba1c9 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -459,3 +459,26 @@ def hsl( .. versionadded:: 2.5.0 """ + +def pixelate( + surface: Surface, + pixel_size: int, + dest_surface: Optional[Surface] = None +) -> Surface: + """Returns a pixelated version of the original surface. + + ``pixel_size`` is an integer describing how large you want the pixels in the final pixelated image to be. + An optional destination surface can be passed which is faster than creating a new Surface. This destination + surface must have the same dimensions (width, height) and smae depth as the source surface. + + :param pygame.Surface surface: the surface to pixelate. + + :param int pixel_size: how large the pixels in the pixelated image should be. + + :param pygame.Surface dest_surface: An optional destination surface to store the pixelated image. + If provided, it should have the same dimensions and depth as the source surface. + + :returns: A new surface that's been pixelated. + + ..versionadded:: 2.5.5 + """ diff --git a/src_c/transform.c b/src_c/transform.c index 8869607b33..566c843532 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4225,6 +4225,116 @@ surf_invert(PyObject *self, PyObject *args, PyObject *kwargs) return (PyObject *)pgSurface_New(newsurf); } +SDL_Surface * +pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) +{ + SDL_Surface *src = pgSurface_AsSurface(srcobj); + SDL_Surface *newsurf; + + if (!dstobj) { + newsurf = newsurf_fromsurf(src, srcobj->surf->w, srcobj->surf->h); + if (!newsurf) + return NULL; + } + else { + newsurf = pgSurface_AsSurface(dstobj); + } + + if (newsurf->w != src->w || newsurf->h != src->h) { + return (SDL_Surface *)(RAISE( + PyExc_ValueError, + "Destination surface must be the same size as source surface.")); + } + + if (src->format->BytesPerPixel != newsurf->format->BytesPerPixel) { + return (SDL_Surface *)(RAISE( + PyExc_ValueError, + "Source and destination surfaces need the same format.")); + } + + int x, y; + for (y = 0; y < src->h; y += pixel_size) { + for (x = 0; x < src->w; x += pixel_size) { + unsigned char r, g, b, a; // current + Uint64 ra, ga, ba, aa; // averages + Uint64 size; + Uint32 color, average; + Uint8 *pix; + int width = min(pixel_size, src->w - x); + int height = min(pixel_size, src->h - y); + + ra = 0; + ga = 0; + ba = 0; + aa = 0; + for (int w = 0; w < width; w++) { + for (int h = 0; h < height; h++) { + SURF_GET_AT(color, src, x + w, y + h, (Uint8 *)src->pixels, + src->format, pix); + SDL_GetRGBA(color, src->format, &r, &g, &b, &a); + ra += r; + ga += g; + ba += b; + aa += a; + } + } + size = width * height; + ra /= size; + ga /= size; + ba /= size; + aa /= size; + + average = SDL_MapRGBA(newsurf->format, ra, ga, ba, aa); + + printf("%u\n", average); + for (int w = 0; w < width; w++) { + for (int h = 0; h < height; h++) { + SURF_SET_AT(average, newsurf, x + w, y + h, + (Uint8 *)newsurf->pixels, newsurf->format, + pix); + } + } + } + } + + SDL_UnlockSurface(newsurf); + + return newsurf; +} + +/* + * anticipated API: pygame.transform.pixelate(surface, pixel_size, dest_surface + * = None) + */ +static PyObject * +surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) +{ + pgSurfaceObject *src; + pgSurfaceObject *dst = NULL; + int pixel_size; + SDL_Surface *new_surf; + + static char *kwds[] = {"surface", "pixel_size", "dest_surface", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!i|O!", kwds, + &pgSurface_Type, &src, &pixel_size, + &pgSurface_Type, &dst)) { + return NULL; + } + + new_surf = pixelate(src, dst, pixel_size); + + if (!new_surf) { + return NULL; + } + + if (dst) { + Py_INCREF(dst); + return (PyObject *)dst; + } + return (PyObject *)pgSurface_New(new_surf); +} + static PyMethodDef _transform_methods[] = { {"scale", (PyCFunction)surf_scale, METH_VARARGS | METH_KEYWORDS, DOC_TRANSFORM_SCALE}, @@ -4268,6 +4378,8 @@ static PyMethodDef _transform_methods[] = { METH_VARARGS | METH_KEYWORDS, DOC_TRANSFORM_SOLIDOVERLAY}, {"hsl", (PyCFunction)surf_hsl, METH_VARARGS | METH_KEYWORDS, DOC_TRANSFORM_HSL}, + {"pixelate", (PyCFunction)surf_pixelate, METH_VARARGS | METH_KEYWORDS, + DOC_TRANSFORM_PIXELATE}, {NULL, NULL, 0, NULL}}; MODINIT_DEFINE(transform) From 76e012c0cfe72493a228c730e0130642401f0098 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:53:14 -0500 Subject: [PATCH 220/441] replaced min call with ternary operations --- src_c/transform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 566c843532..b6cdf973dd 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4260,8 +4260,8 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) Uint64 size; Uint32 color, average; Uint8 *pix; - int width = min(pixel_size, src->w - x); - int height = min(pixel_size, src->h - y); + int width = (pixel_size > (src->w - x)) ? src->w - x : pixel_size; + int height = (pixel_size > (src->h - y)) ? src->h - y : pixel_size; ra = 0; ga = 0; From f1b006dbacfb665dbcbb6e13ec0192a2ed3d7b36 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Thu, 27 Jul 2023 21:54:10 -0500 Subject: [PATCH 221/441] addressed compiler warnings about conversion to Uint8 and possible slight speedup --- src_c/transform.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index b6cdf973dd..dfdeccf77a 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4256,8 +4256,8 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) for (y = 0; y < src->h; y += pixel_size) { for (x = 0; x < src->w; x += pixel_size) { unsigned char r, g, b, a; // current - Uint64 ra, ga, ba, aa; // averages - Uint64 size; + Uint32 ra, ga, ba, aa; // averages + Uint16 size; Uint32 color, average; Uint8 *pix; int width = (pixel_size > (src->w - x)) ? src->w - x : pixel_size; @@ -4279,14 +4279,11 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) } } size = width * height; - ra /= size; - ga /= size; - ba /= size; - aa /= size; - average = SDL_MapRGBA(newsurf->format, ra, ga, ba, aa); + average = SDL_MapRGBA(newsurf->format, (Uint8)(ra / size), + (Uint8)(ga / size), (Uint8)(ba / size), + (Uint8)(aa / size)); - printf("%u\n", average); for (int w = 0; w < width; w++) { for (int h = 0; h < height; h++) { SURF_SET_AT(average, newsurf, x + w, y + h, From d5d77e87d214fb189eb1609a306194b1c8bae616 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Sat, 7 Oct 2023 10:54:27 +0100 Subject: [PATCH 222/441] Add pixel size test --- src_c/transform.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src_c/transform.c b/src_c/transform.c index dfdeccf77a..9fb16b51fd 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4240,6 +4240,12 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) newsurf = pgSurface_AsSurface(dstobj); } + if (pixel_size < 1) { + return (SDL_Surface *)(RAISE( + PyExc_ValueError, + "pixel_size must be greater than 0.")); + } + if (newsurf->w != src->w || newsurf->h != src->h) { return (SDL_Surface *)(RAISE( PyExc_ValueError, From e77b27e827820da1c74e90fca5de297d8873d287 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Sat, 7 Oct 2023 10:57:13 +0100 Subject: [PATCH 223/441] Add pixel_size test --- src_c/transform.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 9fb16b51fd..931666837b 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4241,9 +4241,8 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) } if (pixel_size < 1) { - return (SDL_Surface *)(RAISE( - PyExc_ValueError, - "pixel_size must be greater than 0.")); + return (SDL_Surface *)(RAISE(PyExc_ValueError, + "pixel_size must be greater than 0.")); } if (newsurf->w != src->w || newsurf->h != src->h) { From 463eecae32f4ccccee4f4215b70acb783f52fd0b Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Sat, 7 Oct 2023 11:00:07 +0100 Subject: [PATCH 224/441] Add pixel_size test --- src_c/transform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/transform.c b/src_c/transform.c index 931666837b..4b2919830f 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4244,7 +4244,7 @@ pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) return (SDL_Surface *)(RAISE(PyExc_ValueError, "pixel_size must be greater than 0.")); } - + if (newsurf->w != src->w || newsurf->h != src->h) { return (SDL_Surface *)(RAISE( PyExc_ValueError, From 88d3efffc908459b51557d81d8d8403626870310 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 17 Dec 2023 22:12:28 -0600 Subject: [PATCH 225/441] rewrote transform.pixelate and wrote tests --- src_c/transform.c | 113 ++++++++++------------------------------- test/transform_test.py | 31 +++++++++++ 2 files changed, 59 insertions(+), 85 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 4b2919830f..f736b6532b 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -32,6 +32,7 @@ #include #include +#include #include "simd_shared.h" #include "simd_transform.h" @@ -4225,89 +4226,6 @@ surf_invert(PyObject *self, PyObject *args, PyObject *kwargs) return (PyObject *)pgSurface_New(newsurf); } -SDL_Surface * -pixelate(pgSurfaceObject *srcobj, pgSurfaceObject *dstobj, int pixel_size) -{ - SDL_Surface *src = pgSurface_AsSurface(srcobj); - SDL_Surface *newsurf; - - if (!dstobj) { - newsurf = newsurf_fromsurf(src, srcobj->surf->w, srcobj->surf->h); - if (!newsurf) - return NULL; - } - else { - newsurf = pgSurface_AsSurface(dstobj); - } - - if (pixel_size < 1) { - return (SDL_Surface *)(RAISE(PyExc_ValueError, - "pixel_size must be greater than 0.")); - } - - if (newsurf->w != src->w || newsurf->h != src->h) { - return (SDL_Surface *)(RAISE( - PyExc_ValueError, - "Destination surface must be the same size as source surface.")); - } - - if (src->format->BytesPerPixel != newsurf->format->BytesPerPixel) { - return (SDL_Surface *)(RAISE( - PyExc_ValueError, - "Source and destination surfaces need the same format.")); - } - - int x, y; - for (y = 0; y < src->h; y += pixel_size) { - for (x = 0; x < src->w; x += pixel_size) { - unsigned char r, g, b, a; // current - Uint32 ra, ga, ba, aa; // averages - Uint16 size; - Uint32 color, average; - Uint8 *pix; - int width = (pixel_size > (src->w - x)) ? src->w - x : pixel_size; - int height = (pixel_size > (src->h - y)) ? src->h - y : pixel_size; - - ra = 0; - ga = 0; - ba = 0; - aa = 0; - for (int w = 0; w < width; w++) { - for (int h = 0; h < height; h++) { - SURF_GET_AT(color, src, x + w, y + h, (Uint8 *)src->pixels, - src->format, pix); - SDL_GetRGBA(color, src->format, &r, &g, &b, &a); - ra += r; - ga += g; - ba += b; - aa += a; - } - } - size = width * height; - - average = SDL_MapRGBA(newsurf->format, (Uint8)(ra / size), - (Uint8)(ga / size), (Uint8)(ba / size), - (Uint8)(aa / size)); - - for (int w = 0; w < width; w++) { - for (int h = 0; h < height; h++) { - SURF_SET_AT(average, newsurf, x + w, y + h, - (Uint8 *)newsurf->pixels, newsurf->format, - pix); - } - } - } - } - - SDL_UnlockSurface(newsurf); - - return newsurf; -} - -/* - * anticipated API: pygame.transform.pixelate(surface, pixel_size, dest_surface - * = None) - */ static PyObject * surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) { @@ -4315,6 +4233,7 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) pgSurfaceObject *dst = NULL; int pixel_size; SDL_Surface *new_surf; + pgSurfaceObject *intermediate; static char *kwds[] = {"surface", "pixel_size", "dest_surface", NULL}; @@ -4324,12 +4243,36 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - new_surf = pixelate(src, dst, pixel_size); + double testWidth = round((double)src->surf->w / pixel_size); + double testHeight = round((double)src->surf->h / pixel_size); - if (!new_surf) { + if (testWidth > INT_MAX || testWidth <= 0) + { + PyErr_SetString(PyExc_OverflowError, "Cannot scale width outside the range [0, INT_MAX]"); + return NULL; + } + + if (testHeight > INT_MAX || testHeight <= 0) + { + PyErr_SetString(PyExc_OverflowError, "Cannot scale height outside the range [0, INT_MAX]"); return NULL; } + int width = (int)testWidth; + int height = (int)testHeight; + + SDL_Surface* temp = scale_to(src, NULL, width, height); + intermediate = pgSurface_New(temp); + if (intermediate == NULL) + { + return NULL; /* Exception already set in scale_to */ + } + new_surf = scale_to(intermediate, dst, src->surf->w, src->surf->h); + if (new_surf == NULL) + { + return NULL; /* Exception already set in scale_to */ + } + if (dst) { Py_INCREF(dst); return (PyObject *)dst; diff --git a/test/transform_test.py b/test/transform_test.py index 580bfdc66e..efe71bafeb 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -8,6 +8,16 @@ from pygame.tests import test_utils from pygame.tests.test_utils import example_path +def surfaces_have_same_pixels(surf1, surf2): + if surf1.get_size() != surf2.get_size(): + return False + + for row in range(surf1.get_height()): + for col in range(surf1.get_width()): + if surf1.get_at((col, row)) != surf2.get_at((col, row)): + return False + + return True def show_image(s, images=[]): # pygame.display.init() @@ -1759,7 +1769,28 @@ def smoothscale_invalid_scale(): smaller_surface.get_at(((k // 2), 0)), pygame.Color(127, 127, 127) ) self.assertEqual(smaller_surface.get_size(), (k, 1)) + + def test_pixelate(self): + """Test pygame.transform.pixelate""" + # test that pixelating the original with a pixel_size of 1 yields the original back + data_fname = example_path("data") + path = os.path.join(data_fname, "alien3.png") + image = pygame.image.load(path) # Get an indexed surface. + + no_change = pygame.transform.pixelate(image, 1) + + self.assertTrue(surfaces_have_same_pixels(image, no_change)) + + # test that pixelating a square image with a pixel_size equal to the side length + # yields a surface of a single color, which is the average of the surf + square = pygame.transform.scale(image, (50, 50)) + square_pixelated = pygame.transform.pixelate(square, 50) + square_resized = pygame.transform.scale( + pygame.transform.scale(square, (1, 1)), + square.get_size() + ) + self.assertTrue(surfaces_have_same_pixels(square_pixelated, square_resized)) class TransformDisplayModuleTest(unittest.TestCase): def setUp(self): From 4021ee0acf0a392476056014d0bbad5ab077cf19 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 17 Dec 2023 22:14:06 -0600 Subject: [PATCH 226/441] formatting --- src_c/transform.c | 20 +++++++++----------- test/transform_test.py | 14 ++++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index f736b6532b..34f4ceff52 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4246,30 +4246,28 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) double testWidth = round((double)src->surf->w / pixel_size); double testHeight = round((double)src->surf->h / pixel_size); - if (testWidth > INT_MAX || testWidth <= 0) - { - PyErr_SetString(PyExc_OverflowError, "Cannot scale width outside the range [0, INT_MAX]"); + if (testWidth > INT_MAX || testWidth <= 0) { + PyErr_SetString(PyExc_OverflowError, + "Cannot scale width outside the range [0, INT_MAX]"); return NULL; } - if (testHeight > INT_MAX || testHeight <= 0) - { - PyErr_SetString(PyExc_OverflowError, "Cannot scale height outside the range [0, INT_MAX]"); + if (testHeight > INT_MAX || testHeight <= 0) { + PyErr_SetString(PyExc_OverflowError, + "Cannot scale height outside the range [0, INT_MAX]"); return NULL; } int width = (int)testWidth; int height = (int)testHeight; - SDL_Surface* temp = scale_to(src, NULL, width, height); + SDL_Surface *temp = scale_to(src, NULL, width, height); intermediate = pgSurface_New(temp); - if (intermediate == NULL) - { + if (intermediate == NULL) { return NULL; /* Exception already set in scale_to */ } new_surf = scale_to(intermediate, dst, src->surf->w, src->surf->h); - if (new_surf == NULL) - { + if (new_surf == NULL) { return NULL; /* Exception already set in scale_to */ } diff --git a/test/transform_test.py b/test/transform_test.py index efe71bafeb..ac5c613c26 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -8,17 +8,19 @@ from pygame.tests import test_utils from pygame.tests.test_utils import example_path + def surfaces_have_same_pixels(surf1, surf2): if surf1.get_size() != surf2.get_size(): return False - + for row in range(surf1.get_height()): for col in range(surf1.get_width()): if surf1.get_at((col, row)) != surf2.get_at((col, row)): return False - + return True + def show_image(s, images=[]): # pygame.display.init() size = s.get_rect()[2:] @@ -1769,7 +1771,7 @@ def smoothscale_invalid_scale(): smaller_surface.get_at(((k // 2), 0)), pygame.Color(127, 127, 127) ) self.assertEqual(smaller_surface.get_size(), (k, 1)) - + def test_pixelate(self): """Test pygame.transform.pixelate""" # test that pixelating the original with a pixel_size of 1 yields the original back @@ -1780,18 +1782,18 @@ def test_pixelate(self): no_change = pygame.transform.pixelate(image, 1) self.assertTrue(surfaces_have_same_pixels(image, no_change)) - + # test that pixelating a square image with a pixel_size equal to the side length # yields a surface of a single color, which is the average of the surf square = pygame.transform.scale(image, (50, 50)) square_pixelated = pygame.transform.pixelate(square, 50) square_resized = pygame.transform.scale( - pygame.transform.scale(square, (1, 1)), - square.get_size() + pygame.transform.scale(square, (1, 1)), square.get_size() ) self.assertTrue(surfaces_have_same_pixels(square_pixelated, square_resized)) + class TransformDisplayModuleTest(unittest.TestCase): def setUp(self): pygame.display.init() From d2ca0b5066dbe278a2206516cca9b62833fb7f58 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 2 Jun 2025 22:51:13 -0500 Subject: [PATCH 227/441] Update docs, update error message, pin astroid version to a non-broken version --- buildconfig/stubs/pygame/transform.pyi | 2 +- pyproject.toml | 1 + src_c/doc/transform_doc.h | 1 + src_c/transform.c | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index c1666ba1c9..4a5707b1c3 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -463,7 +463,7 @@ def hsl( def pixelate( surface: Surface, pixel_size: int, - dest_surface: Optional[Surface] = None + dest_surface: Optional[Surface] = None, ) -> Surface: """Returns a pixelated version of the original surface. diff --git a/pyproject.toml b/pyproject.toml index be0b18dfa0..9b510ddba2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ requires = [ "sphinx<=8.1.3", "sphinx-autoapi<=3.3.2", "pyproject-metadata!=0.9.1", + "astroid<=3.3.8", ] build-backend = 'mesonpy' diff --git a/src_c/doc/transform_doc.h b/src_c/doc/transform_doc.h index 3ab15a7ec4..36c2bdb300 100644 --- a/src_c/doc/transform_doc.h +++ b/src_c/doc/transform_doc.h @@ -21,3 +21,4 @@ #define DOC_TRANSFORM_SOLIDOVERLAY "solid_overlay(surface, color, dest_surface=None, keep_alpha=False) -> Surface\nReplaces non transparent pixels with the provided color." #define DOC_TRANSFORM_THRESHOLD "threshold(dest_surface, surface, search_color, threshold=(0, 0, 0, 0), set_color=(0, 0, 0, 0), set_behavior=1, search_surf=None, inverse_set=False) -> int\nFinds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'." #define DOC_TRANSFORM_HSL "hsl(surface, hue=0, saturation=0, lightness=0, dest_surface=None) -> Surface\nChange the hue, saturation, and lightness of a surface." +#define DOC_TRANSFORM_PIXELATE "pixelate(surface, pixel_size, dest_surface=None) -> Surface\nReturns a pixelated version of the original surface." diff --git a/src_c/transform.c b/src_c/transform.c index 34f4ceff52..a3a06929fe 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4248,13 +4248,13 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) if (testWidth > INT_MAX || testWidth <= 0) { PyErr_SetString(PyExc_OverflowError, - "Cannot scale width outside the range [0, INT_MAX]"); + "Cannot scale width outside the range (0, INT_MAX]"); return NULL; } if (testHeight > INT_MAX || testHeight <= 0) { PyErr_SetString(PyExc_OverflowError, - "Cannot scale height outside the range [0, INT_MAX]"); + "Cannot scale height outside the range (0, INT_MAX]"); return NULL; } From d580376fb260c098387dc8c0b2300c0d40a69b89 Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 3 Jun 2025 11:20:05 +0530 Subject: [PATCH 228/441] Fix dst palette in modify_hsl --- src_c/transform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/transform.c b/src_c/transform.c index 8869607b33..e7f1794c6f 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -2703,7 +2703,7 @@ modify_hsl(SDL_Surface *surf, PG_PixelFormat *fmt, SDL_Surface *dst, Uint8 *srcp8 = (Uint8 *)surf->pixels; Uint8 *dstp8 = (Uint8 *)dst->pixels; SDL_Palette *surf_palette = PG_GetSurfacePalette(surf); - SDL_Palette *dst_palette = PG_GetSurfacePalette(surf); + SDL_Palette *dst_palette = PG_GetSurfacePalette(dst); if (PG_FORMAT_BytesPerPixel(fmt) == 4 || PG_FORMAT_BytesPerPixel(fmt) == 3) { From 46edd4e74a96f2c4f2411d7bae648516aee6f91d Mon Sep 17 00:00:00 2001 From: Ankith Date: Wed, 4 Jun 2025 22:24:06 +0530 Subject: [PATCH 229/441] Fix windowevent translation in sdl2-compat --- src_c/event.c | 53 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src_c/event.c b/src_c/event.c index 35ac437d4e..214f72b61f 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -470,19 +470,40 @@ _pg_pgevent_deproxify(Uint32 type) return _pg_pgevent_proxify_helper(type, 0); } +/* Get type of an event, handling WINDOWEVENT translation on SDL2. + * On SDL3 this function is trivial */ +static Uint32 +_pg_pgevent_type(SDL_Event *event) +{ #if !SDL_VERSION_ATLEAST(3, 0, 0) -/* We don't need to do window event translation because in SDL3 each window - * event is its own thing anyways */ -static int -_pg_translate_windowevent(void *_, SDL_Event *event) + if (event->type == SDL_WINDOWEVENT) { + return PGE_WINDOWSHOWN + event->window.event - 1; + } +#endif + return event->type; +} + +/* Handle blocking of pseudo-blocked events. + * Currently this only includes WINDOWEVENT, but can be expanded in the + * future. + */ +#if SDL_VERSION_ATLEAST(3, 0, 0) +static bool SDLCALL +#else +static int SDLCALL +#endif +_pg_filter_blocked_events(void *_, SDL_Event *event) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type >= SDL_EVENT_WINDOW_FIRST && + event->type <= SDL_EVENT_WINDOW_LAST) { +#else if (event->type == SDL_WINDOWEVENT) { - event->type = PGE_WINDOWSHOWN + event->window.event - 1; - return PG_EventEnabled(_pg_pgevent_proxify(event->type)); +#endif + return PG_EventEnabled(_pg_pgevent_proxify(_pg_pgevent_type(event))); } return 1; } -#endif #if SDL_VERSION_ATLEAST(3, 0, 0) static bool SDLCALL @@ -709,6 +730,14 @@ pg_event_filter(void *_, SDL_Event *event) return RAISE(pgExc_SDLError, SDL_GetError()), 0; */ } + /* TODO: + * Any event that gets blocked here will not be visible to the event + * watchers. So things like WINDOWEVENT should never be blocked here. + * This is taken care of in SDL2 codepaths already but needs to also + * be verified in SDL3 porting. + * If the user requests a block on WINDOWEVENTs we are going to handle + * it specially and call it a "pseudo-block", where the filtering will + * happen in a _pg_filter_blocked_events call. */ return PG_EventEnabled(_pg_pgevent_proxify(event->type)); } @@ -1747,6 +1776,7 @@ pgEvent_New(SDL_Event *event) } if (event) { + event->type = _pg_pgevent_type(event); e->type = _pg_pgevent_deproxify(event->type); e->dict = dict_from_event(event); } @@ -1846,14 +1876,7 @@ _pg_event_pump(int dopump) SDL_PumpEvents(); } - /* WINDOWEVENT translation needed only on SDL2 */ -#if !SDL_VERSION_ATLEAST(3, 0, 0) - /* We need to translate WINDOWEVENTS. But if we do that from the - * from event filter, internal SDL stuff that rely on WINDOWEVENT - * might break. So after every event pump, we translate events from - * here */ - SDL_FilterEvents(_pg_translate_windowevent, NULL); -#endif + SDL_FilterEvents(_pg_filter_blocked_events, NULL); } static int From a917110ce1622271bee0e8255766057ffbdc21e7 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 3 Jun 2025 01:02:43 -0700 Subject: [PATCH 230/441] Add tests that transform functions keep palettes Adds tests for two selected transform functions (scale and invert) to check some palette behavior, most importantly that the output surfaces have the same palettes as the input ones. --- test/transform_test.py | 66 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/test/transform_test.py b/test/transform_test.py index 1c674f9ee4..1aff18e456 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -173,6 +173,44 @@ def test_scale__alpha(self): self.assertEqual(s.get_alpha(), s3.get_alpha()) self.assertEqual(s.get_alpha(), s2.get_alpha()) + def test_scale__palette(self): + """see if palette information from source is kept. + + Test for newsurf_fromsurf regression reported in + https://github.com/pygame-community/pygame-ce/issues/3463""" + + s = pygame.Surface((32, 32), depth=8) + s.fill("red", [0, 0, 32, 16]) + s.fill("purple", [0, 16, 32, 16]) + self.assertTrue(len(s.get_palette()) > 0) + + s2 = pygame.transform.scale(s, (64, 64)) + self.assertEqual(s.get_palette()[0], s2.get_palette()[0]) + self.assertEqual(s.get_at_mapped((0, 0)), s2.get_at_mapped((0, 0))) + self.assertEqual(s.get_at_mapped((0, 17)), s2.get_at_mapped((0, 35))) + + # Also test with a custom palette to make sure the output doesn't just + # have a default palette. + s = pygame.Surface((32, 32), depth=8) + s.set_palette( + [ + pygame.Color("red"), + pygame.Color("purple"), + pygame.Color("gold"), + pygame.Color("blue"), + pygame.Color("lightgreen"), + ] + ) + s.fill("red", [0, 0, 32, 16]) + s.fill("purple", [0, 16, 32, 16]) + self.assertTrue(len(s.get_palette()) > 0) + + s2 = pygame.transform.scale(s, (64, 64)) + self.assertEqual(s.get_palette()[0], s2.get_palette()[0]) + self.assertEqual(s.get_palette(), s2.get_palette()) + self.assertEqual(s.get_at_mapped((0, 0)), s2.get_at_mapped((0, 0))) + self.assertEqual(s.get_at_mapped((0, 17)), s2.get_at_mapped((0, 35))) + def test_scale__destination(self): """see if the destination surface can be passed in to use.""" @@ -1727,6 +1765,34 @@ def test_invert(self): pygame.Surface((10, 10), depth=8), ) + def test_invert__palette(self): + """see if palette information from source is kept. + + Test for newsurf_fromsurf regression reported in + https://github.com/pygame-community/pygame-ce/issues/3463""" + + s = pygame.Surface((32, 32), depth=8) + s.set_palette([pygame.Color("orange") for _ in range(256)]) + s.set_palette( + [ + pygame.Color("red"), + pygame.Color("purple"), + pygame.Color("gold"), + pygame.Color("blue"), + pygame.Color("lightgreen"), + ] + ) + s.fill("red", [0, 0, 32, 16]) + s.fill("blue", [0, 16, 32, 16]) + self.assertTrue(len(s.get_palette()) > 0) + + s2 = pygame.transform.invert(s) + self.assertEqual(s.get_palette()[0], s2.get_palette()[0]) + self.assertEqual(s.get_palette(), s2.get_palette()) + + self.assertEqual(s2.get_at((0, 0)), pygame.Color("lightgreen")) + self.assertEqual(s2.get_at((0, 17)), pygame.Color("gold")) + def test_smoothscale(self): """Tests the stated boundaries, sizing, and color blending of smoothscale function""" # __doc__ (as of 2008-08-02) for pygame.transform.smoothscale: From 38b19e1f17d937d742d4d462b24da1950d0cd0df Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 5 Jun 2025 01:12:56 +0530 Subject: [PATCH 231/441] Add skip to set_gamma tests --- test/display_test.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/display_test.py b/test/display_test.py index 881304b878..3d7b91641f 100644 --- a/test/display_test.py +++ b/test/display_test.py @@ -515,6 +515,10 @@ def test_quit__multiple(self): os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, "Needs a non-null videodriver", ) + @unittest.skipIf( + pygame.version.SDL >= (2, 32, 50), + "set_gamma is removed in SDL3, does not work in sdl2-compat either", + ) def test_set_gamma(self): pygame.display.set_mode((1, 1)) @@ -529,6 +533,10 @@ def test_set_gamma(self): os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, "Needs a non-null videodriver", ) + @unittest.skipIf( + pygame.version.SDL >= (2, 32, 50), + "set_gamma is removed in SDL3, does not work in sdl2-compat either", + ) def test_set_gamma__tuple(self): pygame.display.set_mode((1, 1)) @@ -538,8 +546,8 @@ def test_set_gamma__tuple(self): self.assertEqual(pygame.display.set_gamma(r, g, b), True) @unittest.skipIf( - not hasattr(pygame.display, "set_gamma_ramp"), - "Not all systems and hardware support gamma ramps", + pygame.version.SDL >= (2, 32, 50), + "set_gamma_ramp is removed in SDL3, does not work in sdl2-compat either", ) def test_set_gamma_ramp(self): # __doc__ (as of 2008-08-02) for pygame.display.set_gamma_ramp: @@ -872,6 +880,10 @@ def test_set_icon_interactive(self): self.assertTrue(response) pygame.display.quit() + @unittest.skipIf( + pygame.version.SDL >= (2, 32, 50), + "set_gamma_ramp is removed in SDL3, does not work in sdl2-compat either", + ) def test_set_gamma_ramp(self): os.environ["SDL_VIDEO_WINDOW_POS"] = "100,250" pygame.display.quit() From 36e0989298b4efe0683fcf060539000b417075d9 Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 5 Jun 2025 00:29:17 +0530 Subject: [PATCH 232/441] Fix key repeat in sdl2-compat --- src_c/_pygame.h | 2 -- src_c/event.c | 16 ++++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index d2d747dc23..fa16c3e5fa 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -403,8 +403,6 @@ typedef enum { PGE_MIDIIN, PGE_MIDIOUT, - PGE_KEYREPEAT, /* Special internal pygame event, for managing key-presses - */ /* DO NOT CHANGE THE ORDER OF EVENTS HERE */ PGE_WINDOWSHOWN, diff --git a/src_c/event.c b/src_c/event.c index 214f72b61f..e01c26c601 100644 --- a/src_c/event.c +++ b/src_c/event.c @@ -152,7 +152,7 @@ _pg_repeat_callback(Uint32 interval, void *param) int repeat_interval_copy = pg_key_repeat_interval; PG_UNLOCK_EVFILTER_MUTEX - repeat_event_copy.type = PGE_KEYREPEAT; + repeat_event_copy.type = SDL_KEYDOWN; #if SDL_VERSION_ATLEAST(3, 0, 0) repeat_event_copy.key.down = true; repeat_event_copy.key.repeat = true; @@ -160,7 +160,13 @@ _pg_repeat_callback(Uint32 interval, void *param) repeat_event_copy.key.state = SDL_PRESSED; repeat_event_copy.key.repeat = 1; #endif - SDL_PushEvent(&repeat_event_copy); + /* Use SDL_PeepEvents and not SDL_PushEvent because we don't want + * this to go through our event filter. + * Because this doesn't go through our filter we have to check event + * blocking beforehand. */ + if (PG_EventEnabled(_pg_pgevent_proxify(repeat_event_copy.type))) { + SDL_PeepEvents(&repeat_event_copy, 1, SDL_ADDEVENT, 0, 0); + } return repeat_interval_copy; } @@ -634,10 +640,6 @@ pg_event_filter(void *_, SDL_Event *event) PG_UNLOCK_EVFILTER_MUTEX } - else if (event->type == PGE_KEYREPEAT) { - event->type = SDL_KEYDOWN; - } - else if (event->type == SDL_KEYUP) { PG_LOCK_EVFILTER_MUTEX /* Actual keyup is blocked, so clear unneeded cache if it exists */ @@ -2481,8 +2483,6 @@ pg_event_set_blocked(PyObject *self, PyObject *obj) /* Never block SDL_WINDOWEVENT on SDL2, we need them for translation */ PG_SetEventEnabled(SDL_WINDOWEVENT, SDL_TRUE); #endif - /* Never block PGE_KEYREPEAT too, its needed for pygame internal use */ - PG_SetEventEnabled(PGE_KEYREPEAT, SDL_TRUE); Py_RETURN_NONE; } From b7b099265a9495c19ae373524df08b8d6b19faa8 Mon Sep 17 00:00:00 2001 From: Antonis Date: Thu, 5 Jun 2025 18:35:24 +0300 Subject: [PATCH 233/441] better test --- test/color_test.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/test/color_test.py b/test/color_test.py index 9da2990a94..addb2d6591 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -849,12 +849,23 @@ def test_from_normalized(self): ) def test_from_hex(self): - hex = pygame.Color.from_hex("#FFFFFF") - - expected_hex = (255, 255, 255, 255) - - self.assertEqual(expected_hex, hex) - + color1 = pygame.Color.from_hex("#FFFFFF") # White + color2 = pygame.Color.from_hex("#000000") # Black + color3 = pygame.Color.from_hex("#AAFF00") # Random + color4 = pygame.Color.from_hex("#FF000080") # Red (50% opacity) + + expected_color1 = (255, 255, 255, 255) + expected_color2 = (0, 0, 0, 255) + expected_color3 = (170, 255, 0, 255) + expected_color4 = (255, 0, 0, 128) + + self.assertEqual(color1, expected_color1) + self.assertEqual(color2, expected_color2) + self.assertEqual(color3, expected_color3) + self.assertEqual(color4, expected_color4) + + self.assertRaises(ValueError, lambda: pygame.Color.from_hex("#FFFFFG")) + self.assertRaises(ValueError, lambda: pygame.Color.from_hex("#FFFFFFF")) self.assertRaises(ValueError, lambda: pygame.Color.from_hex("not-a-color")) self.assertRaises( TypeError, lambda: pygame.Color.from_hex("not-a-color", "lel") From 94f71fcc750940c69384c28cc7a624298cb6cd21 Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 5 Jun 2025 22:20:49 +0530 Subject: [PATCH 234/441] Fix and improve `pygame.Window` tests --- src_c/window.c | 5 +++++ test/window_test.py | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src_c/window.c b/src_c/window.c index f2976df502..f9ff6f4cf1 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -911,6 +911,11 @@ window_get_opengl(pgWindowObject *self, void *v) hasGL = self->context != NULL; } else { + /* This is not a reliable way to test that OPENGL was requested by the + * user. SDL can implicitly create and use an opengl context in some + * platforms and in that case hasGL=1 even when the user didn't + * request for it. As borrowed windows are deprecated functionality we + * can ignore this issue. */ hasGL = (SDL_GetWindowFlags(self->_win) & SDL_WINDOW_OPENGL) > 0; } return PyBool_FromLong(hasGL); diff --git a/test/window_test.py b/test/window_test.py index 5212b97b9c..693da90ac9 100644 --- a/test/window_test.py +++ b/test/window_test.py @@ -150,8 +150,9 @@ def test_size(self): self.win.size = (640, 480) def test_position(self): - self.win.position = (12, 34) - self.assertTupleEqual(self.win.position, (12, 34)) + new_pos = (self.win.position[0] + 20, self.win.position[1] + 10) + self.win.position = new_pos + self.assertTupleEqual(self.win.position, new_pos) self.win.position = pygame.WINDOWPOS_CENTERED @@ -323,13 +324,13 @@ def test_window_object_repr(self): pygame.init() def test_from_display_module(self): - pygame.display.set_mode((640, 480)) + surf = pygame.display.set_mode((640, 480)) win1 = Window.from_display_module() win2 = Window.from_display_module() self.assertIs(win1, win2) - self.assertFalse(win1.opengl) + self.assertIs(win1.get_surface(), surf) pygame.display.quit() pygame.init() From 48c458fdbbdc36ca194d79bc8db1d1eea101649a Mon Sep 17 00:00:00 2001 From: Ankith Date: Fri, 6 Jun 2025 13:23:37 +0530 Subject: [PATCH 235/441] Add conditional skip to testSavePaletteAsPNG8 --- test/image_test.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/image_test.py b/test/image_test.py index eab5cc06fc..a8750e7df9 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -268,6 +268,11 @@ def testSavePNG8(self): del reader os.remove(f_path) + @unittest.skipIf( + "PG_DEPS_FROM_SYSTEM" in os.environ, + "If we are using system dependencies, we don't know the backend used " + "for PNG saving, and this test only works with libpng.", + ) def testSavePaletteAsPNG8(self): """see if we can save a png with color values in the proper channels.""" # Create a PNG file with known colors From 2714d4e314afee4ad2b492daa0f14a2c3205f8d5 Mon Sep 17 00:00:00 2001 From: Ankith Date: Fri, 6 Jun 2025 15:46:55 +0530 Subject: [PATCH 236/441] Never skip important CI on non-source changes --- .github/workflows/build-macos.yml | 21 +-------------------- .github/workflows/build-manylinux.yml | 21 +-------------------- .github/workflows/build-ubuntu-sdist.yml | 21 +-------------------- .github/workflows/build-windows.yml | 21 +-------------------- 4 files changed, 4 insertions(+), 80 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 9f5acaa5cc..7f4a007931 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -1,32 +1,13 @@ name: macOS # Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes -# from running on CI +# to main. on: push: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-macos.yml' pull_request: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-macos.yml' # the github release drafter can call this workflow workflow_call: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 0421e63163..bf05a982de 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -1,32 +1,13 @@ name: ManyLinux # Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes -# from running on CI +# to main. on: push: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-manylinux.yml' pull_request: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-manylinux.yml' # the github release drafter can call this workflow workflow_call: diff --git a/.github/workflows/build-ubuntu-sdist.yml b/.github/workflows/build-ubuntu-sdist.yml index 64ec5ef716..d5123e7ede 100644 --- a/.github/workflows/build-ubuntu-sdist.yml +++ b/.github/workflows/build-ubuntu-sdist.yml @@ -8,32 +8,13 @@ name: Ubuntu sdist # Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes -# from running on CI +# to main. on: push: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-sdist.yml' pull_request: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-sdist.yml' # the github release drafter can call this workflow workflow_call: diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 3fc0f9b206..abdf3c099b 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -1,32 +1,13 @@ name: Windows # Run CI only when a release is created, on changes to main branch, or any PR -# to main. Do not run CI on any other branch. Also, skip any non-source changes -# from running on CI +# to main. on: push: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-windows.yml' pull_request: branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # re-include current file to not be excluded - - '!.github/workflows/build-windows.yml' # the github release drafter can call this workflow workflow_call: From e50bde79e02b54aee6e3bff7ec2bccdb9e1f6bbf Mon Sep 17 00:00:00 2001 From: Ankith Date: Fri, 6 Jun 2025 15:50:22 +0530 Subject: [PATCH 237/441] Re exclude tutorials in release wheels --- docs/meson.build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/meson.build b/docs/meson.build index 81416b0216..9b46b42c84 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -1,9 +1,13 @@ if fs.is_dir('generated') # TODO: remove everything in exclude_directories except for 'doctrees' + # These should probably go in a separate package that the main pygame-ce + # package can depend on as optional extras + # https://github.com/pygame-community/pygame-ce/issues/3468 install_subdir( 'generated', exclude_directories: [ 'doctrees', + 'tutorials', '_sources/tutorials', '_sources/c_api', ], From 54fbba67fd06b77d347735d7a924e353b25eaa01 Mon Sep 17 00:00:00 2001 From: Ankith Date: Fri, 6 Jun 2025 16:45:37 +0530 Subject: [PATCH 238/441] Exclude only korean tutorials in release wheels --- docs/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/meson.build b/docs/meson.build index 9b46b42c84..d9ec3650f8 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -7,7 +7,7 @@ if fs.is_dir('generated') 'generated', exclude_directories: [ 'doctrees', - 'tutorials', + 'tutorials/ko', '_sources/tutorials', '_sources/c_api', ], From 8bc5be1e1270091c2184194e8955220fda0c7cd8 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 6 Jun 2025 23:51:30 -0700 Subject: [PATCH 239/441] Start 2.5.6 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index be0b18dfa0..63ed8649f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pygame-ce" -version = "2.5.5.dev1" +version = "2.5.6.dev1" description = "Python Game Development" readme = "README.rst" # for long description requires-python = ">=3.9" From e26d314bcd480332060a1a89f29fd59bb1eb69ee Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 7 Jun 2025 01:50:18 -0700 Subject: [PATCH 240/441] Update to SDL 2.32.8 --- buildconfig/download_win_prebuilt.py | 8 ++++---- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../manylinux-build/docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 489d6ddd93..94f197ea33 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,8 +78,8 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.6/SDL2-devel-2.32.6-VC.zip', - 'beab1beb38b0c5a4cc6ebd2d059431e1de631b35', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.8/SDL2-devel-2.32.8-VC.zip', + 'ec8bbf2a2d2bf754fe04b6ffc647f78aa7f4c2a1', ], [ 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-VC.zip', @@ -269,12 +269,12 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL2-devel-2.32.6-VC/SDL2-2.32.6' + 'SDL2-devel-2.32.8-VC/SDL2-2.32.8' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.32.6' + 'SDL2-2.32.8' ) ) copy( diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index bf9b51ffe2..9c0f812670 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.32.6" +SDL2_VER="2.32.8" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.8" IMG2="SDL2_image-$IMG2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index b884de0ad9..bd4567c695 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -2dae8ae9f10e160a50f625daddad891d25e782130e5a5e3f02079d94ab8858aca92ab8871ab19fdf5be6aca83ffeb9c1ea03949841c2506066f12d2bf2332d47 SDL2-2.32.6.tar.gz +484c33638e7bd1002815bb1f6a47a292d1eaf0b963598dde65f4a3e077dfe75ee35b9ea4b3b767365b3ef4f613c4d69ce55b5e96675de562994344e83a978272 SDL2-2.32.8.tar.gz 5c521ae6a053e1eb6b42dce3ccccdbdb353eb7e9d1bd89392b1913bfc9fbb6b8a9d5506c80e5b7924b51637bb95cd270657ca87dafe60edd5534e333524bc901 SDL2_image-2.8.8.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index f58ab5b4ff..9f5efdeffb 100644 --- a/meson.build +++ b/meson.build @@ -109,7 +109,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.6' + sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.8' sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' From 3e13a32afcdbe91f5717a677541356f2c7b9bc0a Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 7 Jun 2025 02:05:53 -0700 Subject: [PATCH 241/441] Remove redundant tp_getattro sets tp_getattro = PyObject_GenericGetAttr is the default, so we don't need to set it to that explicitly. See https://docs.python.org/3/c-api/typeobj.html#c.PyTypeObject.tp_getattro --- src_c/math.c | 1 - src_c/pixelarray.c | 1 - 2 files changed, 2 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index 918fa12d43..0e60af07e7 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -3732,7 +3732,6 @@ static PyTypeObject pgVectorIter_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "pygame.math.VectorIterator", .tp_basicsize = sizeof(vectoriter), .tp_dealloc = (destructor)vectoriter_dealloc, - .tp_getattro = PyObject_GenericGetAttr, /* VectorIterator is not subtypable for now, no Py_TPFLAGS_BASETYPE */ .tp_flags = Py_TPFLAGS_DEFAULT, .tp_iter = PyObject_SelfIter, diff --git a/src_c/pixelarray.c b/src_c/pixelarray.c index 539b3ae6e7..9523b05e36 100644 --- a/src_c/pixelarray.c +++ b/src_c/pixelarray.c @@ -1941,7 +1941,6 @@ MODINIT_DEFINE(pixelarray) Py_DECREF(module); return NULL; } - pgPixelArray_Type.tp_getattro = PyObject_GenericGetAttr; c_api[0] = &pgPixelArray_Type; c_api[1] = pgPixelArray_New; From 7142f56020005fe2aff9ab9d0571256524a68be1 Mon Sep 17 00:00:00 2001 From: Antonis Date: Sat, 7 Jun 2025 15:05:51 +0300 Subject: [PATCH 242/441] update version added --- docs/reST/ref/color.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/color.rst b/docs/reST/ref/color.rst index 4983261032..05effd8888 100644 --- a/docs/reST/ref/color.rst +++ b/docs/reST/ref/color.rst @@ -300,7 +300,7 @@ Creates a Color object from the given Hexadecimal components. Refer to :attr:`Color.hex` for more information. - .. versionadded:: 2.5.5 + .. versionadded:: 2.5.6 .. ## Color.from_hex ## From d4b6d76c7e3233bd8186ef5537045c41daf0f706 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 7 Jun 2025 18:49:31 +0530 Subject: [PATCH 243/441] Combine all "checks" CI into a single workflow --- .github/workflows/build-ubuntu-coverage.yml | 97 ------------------- .github/workflows/cppcheck.yml | 41 -------- ...debug-python.yml => run-ubuntu-checks.yml} | 65 +++++++++++-- 3 files changed, 57 insertions(+), 146 deletions(-) delete mode 100644 .github/workflows/build-ubuntu-coverage.yml delete mode 100644 .github/workflows/cppcheck.yml rename .github/workflows/{build-ubuntu-debug-python.yml => run-ubuntu-checks.yml} (58%) diff --git a/.github/workflows/build-ubuntu-coverage.yml b/.github/workflows/build-ubuntu-coverage.yml deleted file mode 100644 index 680481ba82..0000000000 --- a/.github/workflows/build-ubuntu-coverage.yml +++ /dev/null @@ -1,97 +0,0 @@ -# This workflow generates C code coverage information from the unit test -# suite. Note that for intrinsics, it only runs what gets compiled -# and would naturally run. It also is limited to what can run in -# a CI environment -# IMPORTANT: binaries are not to be uploaded from this workflow! - -name: Ubuntu coverage - -# Run CI only on changes to main branch, or any PR to main. -# Do not run CI on any other branch. Also, skip any non-source changes -# from running on CI -on: - push: - branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # gcov/lcov only gets C coverage - - 'src_py/**' - # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-coverage.yml' - - pull_request: - branches: main - paths-ignore: - - 'docs/**' - - 'examples/**' - - '.gitignore' - - '*.rst' - - '*.md' - - '.github/workflows/*.yml' - # gcov/lcov only gets C coverage - - 'src_py/**' - # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-coverage.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-ubuntu-coverage - cancel-in-progress: true - -jobs: - gen_coverage: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false # if a particular matrix build fails, don't skip the rest - matrix: - os: [ubuntu-24.04] - - env: - # Pip now forces us to either make a venv or set this flag, so we will do - # this - PIP_BREAK_SYSTEM_PACKAGES: 1 - # We are using dependencies installed from apt - PG_DEPS_FROM_SYSTEM: 1 - - steps: - - uses: actions/checkout@v4.2.2 - - - name: Install deps - # https://github.com/actions/runner-images/issues/7192 - # https://github.com/orgs/community/discussions/47863 - run: | - sudo apt-get update --fix-missing - sudo apt-get install lcov -y - sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libfreetype6-dev libportmidi-dev python3-dev -y - - - name: Build with coverage hooks and install - id: build - run: | - python3 dev.py build --coverage - - - name: Run tests - env: - SDL_VIDEODRIVER: "dummy" - SDL_AUDIODRIVER: "disk" - run: python3 -m pygame.tests -v --exclude opengl,music,timing --time_out 300 - - - name: Generate coverage - id: gen-coverage - # want to continue regardless of whether a test failed or not as long as the job wasn't cancelled - if: ${{ steps.build.conclusion == 'success' && !cancelled() }} - run: | - lcov --capture --directory . --output-file ./coverage.info - genhtml ./coverage.info --output-directory ./out - - # We upload the generated files under github actions assets - - name: Upload coverage html - # want to continue only if the coverage generation was successful - if: ${{ steps.gen-coverage.conclusion == 'success' && !cancelled() }} - uses: actions/upload-artifact@v4 - with: - name: pygame-wheels-coverage - path: ./out diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml deleted file mode 100644 index 2594db25d7..0000000000 --- a/.github/workflows/cppcheck.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: cppcheck Static Analysis - -# Run cppcheck on src_c changes to main branch, or any PR to main. -on: - push: - branches: main - paths: - - 'src_c/**' - - pull_request: - branches: main - paths: - - 'src_c/**' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-cppcheck - cancel-in-progress: true - -# TODO: Any more static checkers can be added here -jobs: - run-cppcheck: - runs-on: ubuntu-24.04 - - steps: - - uses: actions/checkout@v4.2.2 - - - name: Install deps - # https://github.com/actions/runner-images/issues/7192 - # https://github.com/orgs/community/discussions/47863 - run: | - sudo apt-get update --fix-missing - sudo apt install cppcheck - - - name: Run Static Checker - # skip cppcheck on SDL_gfx, scrap, scale_mm* and ft_cache for now - # suppress missingReturn and syntaxError because it gives many false positives - run: cppcheck src_c --enable=performance,portability,warning \ - --suppress=*:src_c/freetype/ft_cache.c --suppress=*:src_c/scrap* \ - --suppress=*:src_c/scale_mmx*.c --suppress=*:src_c/SDL_gfx/* \ - --suppress=missingReturn --suppress=syntaxError -DWITH_THREAD -j $(nproc) \ - -DPG_MAJOR_VERSION -DPG_MINOR_VERSION -DPG_PATCH_VERSION -DPG_VERSION_TAG diff --git a/.github/workflows/build-ubuntu-debug-python.yml b/.github/workflows/run-ubuntu-checks.yml similarity index 58% rename from .github/workflows/build-ubuntu-debug-python.yml rename to .github/workflows/run-ubuntu-checks.yml index b1c24766e5..8cda715b09 100644 --- a/.github/workflows/build-ubuntu-debug-python.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -1,10 +1,13 @@ -# This workflow runs a build with a python version that has debug symbols +# This workflow runs a build with a python version that has debug symbols. +# Also generates coverage information from unit tests. Note that for intrinsics, +# it only runs what gets compiled and would naturally run. It also is limited to +# what can run in a CI environment. # Update this workflow when our min/max python minor versions update # This workflow is necessary to ensure that we can build and run with # a debug python build without too much worrying about SIGABRT being thrown # IMPORTANT: binaries are not to be uploaded from this workflow! -name: Ubuntu debug python +name: Ubuntu Checks defaults: run: shell: bash -leo pipefail {0} @@ -23,7 +26,7 @@ on: - '*.md' - '.github/workflows/*.yml' # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-debug-python.yml' + - '!.github/workflows/run-ubuntu-checks.yml' pull_request: branches: main @@ -35,14 +38,14 @@ on: - '*.md' - '.github/workflows/*.yml' # re-include current file to not be excluded - - '!.github/workflows/build-ubuntu-debug-python.yml' + - '!.github/workflows/run-ubuntu-checks.yml' concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-ubuntu-debug-python + group: ${{ github.workflow }}-${{ github.ref }}-ubuntu-checks cancel-in-progress: true jobs: - debug_python: + debug_coverage: runs-on: ${{ matrix.os }} strategy: fail-fast: false # if a particular matrix build fails, don't skip the rest @@ -69,7 +72,7 @@ jobs: # https://github.com/orgs/community/discussions/47863 run: | sudo apt-get update --fix-missing - + sudo apt-get install lcov -y sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libfreetype6-dev libportmidi-dev -y - name: Install pyenv @@ -98,7 +101,7 @@ jobs: id: build-pygame-ce run: | pyenv global ${{ matrix.python }}-debug - python dev.py build --lax + python dev.py build --lax --coverage - name: Run tests env: @@ -107,3 +110,49 @@ jobs: run: | pyenv global ${{ matrix.python }}-debug python -m pygame.tests -v --exclude opengl,music,timing --time_out 300 + + - name: Generate coverage + id: gen-coverage + # want to continue regardless of whether a test failed or not as long as the job wasn't cancelled + if: ${{ steps.build-pygame-ce.conclusion == 'success' && !cancelled() }} + run: | + lcov --capture --directory . --output-file ./coverage.info + genhtml ./coverage.info --output-directory ./out + + # We upload the generated files under github actions assets + - name: Upload coverage html + # want to continue only if the coverage generation was successful + if: ${{ steps.gen-coverage.conclusion == 'success' && !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: pygame-wheels-coverage + path: ./out + + # Run cppcheck static analysis on src_c changes + run-cppcheck: + runs-on: ubuntu-24.04 + needs: debug_coverage + + steps: + - uses: actions/checkout@v4.2.2 + + - name: Check if any src_c files changed + id: check-changes + run: | + git fetch origin ${{ github.base_ref }} --depth=1 || true + CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) + echo "$CHANGED_FILES" | grep '^src_c/' || echo "::set-output name=skip::true" + + - name: Install cppcheck + if: steps.check-changes.outputs.skip != 'true' + run: | + sudo apt-get update --fix-missing + sudo apt install cppcheck + + - name: Run Static Checker + if: steps.check-changes.outputs.skip != 'true' + run: cppcheck src_c --enable=performance,portability,warning \ + --suppress=*:src_c/freetype/ft_cache.c --suppress=*:src_c/scrap* \ + --suppress=*:src_c/scale_mmx*.c --suppress=*:src_c/SDL_gfx/* \ + --suppress=missingReturn --suppress=syntaxError -DWITH_THREAD -j $(nproc) \ + -DPG_MAJOR_VERSION -DPG_MINOR_VERSION -DPG_PATCH_VERSION -DPG_VERSION_TAG From b9439b0aa76aa1348dd4b78fe87d6910d61d2594 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 7 Jun 2025 20:21:15 +0530 Subject: [PATCH 244/441] Fix upload artifact name --- .github/workflows/run-ubuntu-checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index 8cda715b09..f60ba24514 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -125,7 +125,7 @@ jobs: if: ${{ steps.gen-coverage.conclusion == 'success' && !cancelled() }} uses: actions/upload-artifact@v4 with: - name: pygame-wheels-coverage + name: pygame-coverage-${{ matrix.os }}-${{ matrix.python }} path: ./out # Run cppcheck static analysis on src_c changes From e7d8c17dff4db0624bba58216ae8d54dc38c94b0 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 7 Jun 2025 21:32:56 +0530 Subject: [PATCH 245/441] Fix checkout issue and warning --- .github/workflows/run-ubuntu-checks.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index f60ba24514..06eb1ccbd6 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -140,8 +140,9 @@ jobs: id: check-changes run: | git fetch origin ${{ github.base_ref }} --depth=1 || true + git checkout ${{ github.base_ref }} CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) - echo "$CHANGED_FILES" | grep '^src_c/' || echo "::set-output name=skip::true" + echo "$CHANGED_FILES" | grep '^src_c/' || echo "skip=true" >> "$GITHUB_OUTPUT" - name: Install cppcheck if: steps.check-changes.outputs.skip != 'true' From 34528fc5b9356658c7e2c1922630d7f51312a545 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 7 Jun 2025 23:47:49 +0530 Subject: [PATCH 246/441] Add versionchanged note to Mask.to_surface --- docs/reST/ref/mask.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/reST/ref/mask.rst b/docs/reST/ref/mask.rst index a3ef716742..d5c4d8f066 100644 --- a/docs/reST/ref/mask.rst +++ b/docs/reST/ref/mask.rst @@ -641,6 +641,8 @@ to store which parts collide. .. versionaddedold:: 2.0.0 + .. versionchanged:: 2.5.6 Added the area keyword argument. + .. ## Mask.to_surface ## .. ## pygame.mask.Mask ## From c20a9ba9e7f36fc1d46c50033f95498f8a79759a Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:24:53 -0700 Subject: [PATCH 247/441] Update versionchanged of lazy imports --- docs/reST/ref/sndarray.rst | 2 +- docs/reST/ref/surfarray.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reST/ref/sndarray.rst b/docs/reST/ref/sndarray.rst index caf2f81c0a..06a1e8e1e7 100644 --- a/docs/reST/ref/sndarray.rst +++ b/docs/reST/ref/sndarray.rst @@ -23,7 +23,7 @@ Each sample is an 8-bit or 16-bit integer, depending on the data format. A stereo sound file has two values per sample, while a mono sound file only has one. -.. versionchanged:: 2.5.4 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary +.. versionchanged:: 2.5.6 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array diff --git a/docs/reST/ref/surfarray.rst b/docs/reST/ref/surfarray.rst index 5c0e3b5f19..ee582af3e2 100644 --- a/docs/reST/ref/surfarray.rst +++ b/docs/reST/ref/surfarray.rst @@ -35,7 +35,7 @@ pixels from the surface and any changes performed to the array will make changes in the surface. As this last functions share memory with the surface, this one will be locked during the lifetime of the array. -.. versionchanged:: 2.5.4 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary +.. versionchanged:: 2.5.6 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array2d From fd2bcae13cbdb8177321d408fdeed96d00741dbe Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 8 Jun 2025 12:32:03 +0530 Subject: [PATCH 248/441] FIx PySequence_AsVectorCoords and discourage usage --- src_c/math.c | 65 +++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src_c/math.c b/src_c/math.c index bd6869dddc..fa6f7b198b 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -125,8 +125,8 @@ RealNumber_Check(PyObject *obj); static double PySequence_GetItem_AsDouble(PyObject *seq, Py_ssize_t index); static int -PySequence_AsVectorCoords(PyObject *seq, double *const coords, - const Py_ssize_t size); +pg_VectorCoordsFromObjOldDontUseInNewCode(PyObject *seq, double *const coords, + Py_ssize_t size); static int pgVectorCompatible_Check(PyObject *obj, Py_ssize_t dim); static int @@ -397,13 +397,26 @@ PySequence_GetItem_AsDouble(PyObject *seq, Py_ssize_t index) return value; } +/* Use pg_VectorCoordsFromObj instead of this function. That does exact dim + * checking. + * Note that this function sets a python exception on failures */ static int -PySequence_AsVectorCoords(PyObject *seq, double *const coords, - const Py_ssize_t size) +pg_VectorCoordsFromObjOldDontUseInNewCode(PyObject *seq, double *const coords, + Py_ssize_t size) { Py_ssize_t i; + /* This codepath does not do exact size checking, but for compat reasons + * we are gonna keep it as it is */ if (pgVector_Check(seq)) { + Py_ssize_t seq_dim = ((pgVector *)seq)->dim; + if (size > seq_dim) { + /* Prevent undefined behaviour by consistently 0-ing extra dims */ + for (i = seq_dim; i < size; ++i) { + coords[i] = 0.0; + } + size = seq_dim; + } memcpy(coords, ((pgVector *)seq)->coords, sizeof(double) * size); return 1; } @@ -464,8 +477,7 @@ pgVectorCompatible_Check(PyObject *obj, Py_ssize_t dim) // copies vector coordinates into "coords" array of size >= dim // managed by caller. Returns 0 if obj is not compatible or an error // occurred. If 0 is returned, the error flag will not normally be set. -// Callers should set error themselves. This function is a combo of -// pgVectorCompatible_Check and PySequence_AsVectorCoords +// Callers should set error themselves. static int pg_VectorCoordsFromObj(PyObject *obj, Py_ssize_t dim, double *const coords) { @@ -1129,7 +1141,7 @@ vector_SetSlice(pgVector *self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) } len = ihigh - ilow; - if (!PySequence_AsVectorCoords(v, new_coords, len)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(v, new_coords, len)) { return -1; } @@ -1250,7 +1262,8 @@ vector_ass_subscript(pgVector *self, PyObject *key, PyObject *value) double seqitems[VECTOR_MAX_SIZE]; Py_ssize_t cur, i; - if (!PySequence_AsVectorCoords(value, seqitems, slicelength)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(value, seqitems, + slicelength)) { return -1; } for (cur = start, i = 0; i < slicelength; cur += step, i++) { @@ -1381,7 +1394,7 @@ vector_richcompare(PyObject *o1, PyObject *o2, int op) vec = (pgVector *)o2; other = o1; } - if (!pgVectorCompatible_Check(other, vec->dim)) { + if (!pg_VectorCoordsFromObj(other, vec->dim, other_coords)) { if (op == Py_EQ) { Py_RETURN_FALSE; } @@ -1394,10 +1407,6 @@ vector_richcompare(PyObject *o1, PyObject *o2, int op) } } - if (!PySequence_AsVectorCoords(other, other_coords, vec->dim)) { - return NULL; - } - switch (op) { case Py_EQ: for (i = 0; i < vec->dim; i++) { @@ -1493,7 +1502,8 @@ static PyObject * vector_dot(pgVector *self, PyObject *other) { double other_coords[VECTOR_MAX_SIZE]; - if (!PySequence_AsVectorCoords(other, other_coords, self->dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords, + self->dim)) { return RAISE(PyExc_TypeError, "Cannot perform dot product with this type."); } @@ -1630,7 +1640,8 @@ vector_slerp(pgVector *self, PyObject *args) if (!PyArg_ParseTuple(args, "Od:slerp", &other, &t)) { return NULL; } - if (!PySequence_AsVectorCoords(other, other_coords, self->dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords, + self->dim)) { return RAISE(PyExc_TypeError, "Argument 1 must be a vector."); } if (fabs(t) > 1) { @@ -1701,7 +1712,8 @@ vector_lerp(pgVector *self, PyObject *args) if (!PyArg_ParseTuple(args, "Od:Vector.lerp", &other, &t)) { return NULL; } - if (!PySequence_AsVectorCoords(other, other_coords, self->dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords, + self->dim)) { return RAISE(PyExc_TypeError, "Expected Vector as argument 1"); } if (t < 0 || t > 1) { @@ -1730,7 +1742,8 @@ vector_smoothstep(pgVector *self, PyObject *args) if (!PyArg_ParseTuple(args, "Od:Vector.smoothstep", &other, &t)) { return NULL; } - if (!PySequence_AsVectorCoords(other, other_coords, self->dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords, + self->dim)) { return RAISE(PyExc_TypeError, "Expected Vector as argument 1"); } @@ -1765,7 +1778,7 @@ _vector_reflect_helper(double *dst_coords, const double *src_coords, double norm_coords[VECTOR_MAX_SIZE]; /* normalize the normal */ - if (!PySequence_AsVectorCoords(normal, norm_coords, dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(normal, norm_coords, dim)) { return 0; } @@ -1992,7 +2005,8 @@ vector_project_onto(pgVector *self, PyObject *other) double a_dot_b; double b_dot_b; - if (!PySequence_AsVectorCoords(other, other_coords, self->dim)) { + if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords, + self->dim)) { return RAISE(PyExc_TypeError, "Expected Vector as argument 1"); } @@ -3795,12 +3809,8 @@ vector_elementwiseproxy_richcompare(PyObject *o1, PyObject *o2, int op) } dim = vec->dim; - if (pgVectorCompatible_Check(other, dim)) { - double other_coords[VECTOR_MAX_SIZE]; - - if (!PySequence_AsVectorCoords(other, other_coords, dim)) { - return NULL; - } + double other_coords[VECTOR_MAX_SIZE]; + if (pg_VectorCoordsFromObj(other, dim, other_coords)) { /* use diff == diff to check for NaN */ /* TODO: how should NaN be handled with LT/LE/GT/GE? */ switch (op) { @@ -3955,11 +3965,8 @@ vector_elementwiseproxy_generic_math(PyObject *o1, PyObject *o2, int op) other = (PyObject *)((vector_elementwiseproxy *)other)->vec; } - if (pgVectorCompatible_Check(other, dim)) { + if (pg_VectorCoordsFromObj(other, dim, other_coords)) { op |= OP_ARG_VECTOR; - if (!PySequence_AsVectorCoords(other, other_coords, dim)) { - return NULL; - } } else { other_value = PyFloat_AsDouble(other); From fcfd235956edfca8b46179ddbdccd9385765716e Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 8 Jun 2025 01:44:19 -0700 Subject: [PATCH 249/441] Update libdrm version to fix build Previous one failed hash checks because they renamed a folder (apparently?). --- .../manylinux-build/docker_base/mesa/libdrm/build-libdrm.sh | 6 +++--- .../docker_base/mesa/libdrm/libdrm.sha512sum | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildconfig/manylinux-build/docker_base/mesa/libdrm/build-libdrm.sh b/buildconfig/manylinux-build/docker_base/mesa/libdrm/build-libdrm.sh index 4d2fe8a054..58972d90c7 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/libdrm/build-libdrm.sh +++ b/buildconfig/manylinux-build/docker_base/mesa/libdrm/build-libdrm.sh @@ -6,10 +6,10 @@ cd $(dirname `readlink -f "$0"`) # The drm already available on manylinux docker images is too old for mesa, so # we need to compile the latest from source -DRM_VER="libdrm-2.4.123" -DRM="drm-$DRM_VER" +DRM_VER="libdrm-2.4.124" +DRM="libdrm-$DRM_VER" -curl -sL --retry 10 https://gitlab.freedesktop.org/mesa/drm/-/archive/$DRM_VER/$DRM.tar.gz > $DRM.tar.gz +curl -sL --retry 10 https://gitlab.freedesktop.org/mesa/libdrm/-/archive/$DRM_VER/$DRM.tar.gz > $DRM.tar.gz sha512sum -c libdrm.sha512sum tar xzf $DRM.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mesa/libdrm/libdrm.sha512sum b/buildconfig/manylinux-build/docker_base/mesa/libdrm/libdrm.sha512sum index 71a0ac9ba5..1666d67034 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/libdrm/libdrm.sha512sum +++ b/buildconfig/manylinux-build/docker_base/mesa/libdrm/libdrm.sha512sum @@ -1 +1 @@ -b593eb26be0f4e3aac44dfe8ec4e37d9e1a2666f9c86f2dcd3c32bd3e6fe376bfce7bd1c47af4d39b85b3d6f43ebf12f02704f055106872fb35f1d85b45286f3 drm-libdrm-2.4.123.tar.gz +8052839ffb2c81bc8c65e0e8e810e197ca6532fafdaf1acc181b97763068e68ba921035bb0e5675eb9c8d2ff6f32731e10d4a16f307c915e3b680453dd0e9ebd libdrm-libdrm-2.4.124.tar.gz From b5f50d192a08f14959a24d0dc4cb3fb365a561af Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:14:39 +0100 Subject: [PATCH 250/441] Remove __init__ from _SupportsSprite --- buildconfig/stubs/pygame/sprite.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 3d27f65889..aab6c15d35 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -33,7 +33,6 @@ class _SupportsSprite(Protocol): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def __init__(self, *groups: _Group) -> None: ... def add_internal(self, group: _Group) -> None: ... def remove_internal(self, group: _Group) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... From 7f878673b0fa81ea8385b0ceb3af2214df6c8871 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:18:14 +0100 Subject: [PATCH 251/441] handle older versions of python --- buildconfig/stubs/pygame/sprite.pyi | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index aab6c15d35..7d2c6ec8a1 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -1,3 +1,4 @@ +import sys import types from collections.abc import Callable, Iterable, Iterator from typing import ( @@ -10,10 +11,21 @@ from typing import ( Union, ) +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated + +if sys.version_info >= (3, 11): + from typing import Self +else: + from typing_extensions import Self + from pygame.mask import Mask from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike + from typing_extensions import deprecated # added in 3.13 # non-generic Group, used in Sprite @@ -152,7 +164,7 @@ class AbstractGroup(Generic[_TSprite]): def add_internal(self, sprite: _TSprite, layer: None = None) -> None: ... def remove_internal(self, sprite: _TSprite) -> None: ... def has_internal(self, sprite: _TSprite) -> bool: ... - def copy(self: _TGroup) -> _TGroup: ... # typing.Self is py3.11+ + def copy(self) -> Self: ... def sprites(self) -> list[_TSprite]: ... def add( self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] From 6494f0b3458a1d3190bd7911e75f1708f58a100e Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:28:51 +0100 Subject: [PATCH 252/441] Make _HasRect generic in sprite functions --- buildconfig/stubs/pygame/sprite.pyi | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 7d2c6ec8a1..7b1604a185 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -28,6 +28,9 @@ from pygame.typing import Point, RectLike from typing_extensions import deprecated # added in 3.13 +# generic for _HasRect, used in sprite collide functions +_THasRect = TypeVar("_THasRect", bound=_HasRect) + # non-generic Group, used in Sprite _Group = AbstractGroup[_SpriteSupportsGroup] @@ -291,10 +294,10 @@ def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... def spritecollide( - sprite: _HasRect, + sprite: _THasRect, group: AbstractGroup[_TSprite], dokill: bool, - collided: Optional[Callable[[_TSprite, _TSprite2], Any]] = None, + collided: Optional[Callable[[_THasRect, _TSprite], Any]] = None, ) -> list[_TSprite]: ... def groupcollide( groupa: AbstractGroup[_TSprite], @@ -304,7 +307,7 @@ def groupcollide( collided: Optional[Callable[[_TSprite, _TSprite2], Any]] = None, ) -> dict[_TSprite, list[_TSprite2]]: ... def spritecollideany( - sprite: _HasRect, + sprite: _THasRect, group: AbstractGroup[_TSprite], - collided: Optional[Callable[[_TSprite, _TSprite2], Any]] = None, + collided: Optional[Callable[[_THasRect, _TSprite], Any]] = None, ) -> Optional[_TSprite]: ... From 984c780254d8ced877e1c08c9f0475085fd9b10f Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:40:50 +0100 Subject: [PATCH 253/441] specify upper bound for __class_getitem__ --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 7b1604a185..3e3fea20c8 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -158,7 +158,7 @@ _TDirtySprite = TypeVar("_TDirtySprite", bound=_DirtySpriteSupportsGroup) class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] - def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ... + def __class_getitem__(cls, item: type[_SupportsSpriteGroup], /) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[_TSprite]: ... From e54924404276ace3854526005185106d2cb6f4be Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:54:43 +0100 Subject: [PATCH 254/441] simplify group init and sprite operations with recursive _SpriteOrIterable type --- buildconfig/stubs/pygame/sprite.pyi | 45 +++++++++-------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 3e3fea20c8..d03c04a979 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -135,6 +135,8 @@ _TSprite2 = TypeVar("_TSprite2", bound=_SpriteSupportsGroup) # almost the same as _TSprite but bound to DirtySprite _TDirtySprite = TypeVar("_TDirtySprite", bound=_DirtySpriteSupportsGroup) +_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable]] + # Below code demonstrates the advantages of the _SpriteSupportsGroup protocol # typechecker should error, regular Sprite does not support Group.draw due to @@ -158,7 +160,9 @@ _TDirtySprite = TypeVar("_TDirtySprite", bound=_DirtySpriteSupportsGroup) class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] - def __class_getitem__(cls, item: type[_SupportsSpriteGroup], /) -> types.GenericAlias: ... + def __class_getitem__( + cls, item: type[_SupportsSpriteGroup], / + ) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[_TSprite]: ... @@ -169,15 +173,9 @@ class AbstractGroup(Generic[_TSprite]): def has_internal(self, sprite: _TSprite) -> bool: ... def copy(self) -> Self: ... def sprites(self) -> list[_TSprite]: ... - def add( - self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] - ) -> None: ... - def remove( - self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] - ) -> None: ... - def has( - self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] - ) -> bool: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... + def remove(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... + def has(self, *sprites: _SpriteOrIterable[_TSprite]) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def draw( self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 @@ -190,16 +188,14 @@ class AbstractGroup(Generic[_TSprite]): def empty(self) -> None: ... class Group(AbstractGroup[_TSprite]): - def __init__( - self, *sprites: Union[_TSprite, AbstractGroup[_TSprite], Iterable[_TSprite]] - ) -> None: ... + def __init__(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") -class RenderPlain(Group): ... +class RenderPlain(Group[_TSprite]): ... @deprecated("Use `pygame.sprite.Group` instead") -class RenderClear(Group): ... +class RenderClear(Group[_TSprite]): ... class RenderUpdates(Group[_TSprite]): ... @@ -208,23 +204,9 @@ class OrderedUpdates(RenderUpdates[_TSprite]): ... class LayeredUpdates(AbstractGroup[_TSprite]): def __init__( - self, - *sprites: Union[ - _TSprite, - AbstractGroup[_TSprite], - Iterable[Union[_TSprite, AbstractGroup[_TSprite]]], - ], - **kwargs: Any, - ) -> None: ... - def add( - self, - *sprites: Union[ - _TSprite, - AbstractGroup[_TSprite], - Iterable[Union[_TSprite, AbstractGroup[_TSprite]]], - ], - **kwargs: Any, + self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any ) -> None: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any) -> None: ... def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... def get_sprite(self, idx: int) -> _TSprite: ... def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ... @@ -240,7 +222,6 @@ class LayeredUpdates(AbstractGroup[_TSprite]): def switch_layer(self, layer1_nr: int, layer2_nr: int) -> None: ... class LayeredDirty(LayeredUpdates[_TDirtySprite]): - def __init__(self, *sprites: _TDirtySprite, **kwargs: Any) -> None: ... def draw( self, surface: Surface, From 0569dbefc57e9f8e382fde091270e448d1547818 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 16:56:06 +0100 Subject: [PATCH 255/441] remove old "deprecated" import --- buildconfig/stubs/pygame/sprite.pyi | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index d03c04a979..acd34c8be0 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -26,8 +26,6 @@ from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike -from typing_extensions import deprecated # added in 3.13 - # generic for _HasRect, used in sprite collide functions _THasRect = TypeVar("_THasRect", bound=_HasRect) From 1ef86f2a5e80662b2963c8968e1fa8c90d64198b Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 17:03:34 +0100 Subject: [PATCH 256/441] simplify protocols by making _SupportsSprite inherit from _HasImageAndRect --- buildconfig/stubs/pygame/sprite.pyi | 59 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index acd34c8be0..742646b06c 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -30,10 +30,30 @@ from pygame.typing import Point, RectLike _THasRect = TypeVar("_THasRect", bound=_HasRect) # non-generic Group, used in Sprite -_Group = AbstractGroup[_SpriteSupportsGroup] +_Group = AbstractGroup[_SupportsSprite] + +# define some useful protocols first, which sprite functions accept +# sprite functions don't need all sprite attributes to be present in the +# arguments passed, they only use a few which are marked in the below protocols +class _HasRect(Protocol): + @property + def rect(self) -> Optional[Union[FRect, Rect]]: ... + +# image in addition to rect +class _HasImageAndRect(_HasRect, Protocol): + @property + def image(self) -> Optional[Surface]: ... + +# mask in addition to rect +class _HasMaskAndRect(_HasRect, Protocol): + mask: Mask + +# radius in addition to rect +class _HasRadiusAndRect(_HasRect, Protocol): + radius: float # protocol helps with structural subtyping for typevars in sprite group generics -class _SupportsSprite(Protocol): +class _SupportsSprite(_HasImageAndRect, Protocol): @property def image(self) -> Optional[Surface]: ... @image.setter @@ -102,40 +122,17 @@ class DirtySprite(_SupportsDirtySprite): # used as a workaround for typing.Self because it is added in python 3.11 _TGroup = TypeVar("_TGroup", bound=AbstractGroup) -# define some useful protocols first, which sprite functions accept -# sprite functions don't need all sprite attributes to be present in the -# arguments passed, they only use a few which are marked in the below protocols -class _HasRect(Protocol): - @property - def rect(self) -> Optional[Union[FRect, Rect]]: ... - -# image in addition to rect -class _HasImageAndRect(_HasRect, Protocol): - @property - def image(self) -> Optional[Surface]: ... - -# mask in addition to rect -class _HasMaskAndRect(_HasRect, Protocol): - mask: Mask - -# radius in addition to rect -class _HasRadiusAndRect(_HasRect, Protocol): - radius: float - -class _SpriteSupportsGroup(_SupportsSprite, _HasImageAndRect, Protocol): ... -class _DirtySpriteSupportsGroup(_SupportsDirtySprite, _HasImageAndRect, Protocol): ... - -# typevar bound to Sprite, _SpriteSupportsGroup Protocol ensures sprite +# typevar bound to Sprite, _SupportsSprite Protocol ensures sprite # subclass passed to group has image and rect attributes -_TSprite = TypeVar("_TSprite", bound=_SpriteSupportsGroup) -_TSprite2 = TypeVar("_TSprite2", bound=_SpriteSupportsGroup) +_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) +_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) # almost the same as _TSprite but bound to DirtySprite -_TDirtySprite = TypeVar("_TDirtySprite", bound=_DirtySpriteSupportsGroup) +_TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) _SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable]] -# Below code demonstrates the advantages of the _SpriteSupportsGroup protocol +# Below code demonstrates the advantages of the _SupportsSprite protocol # typechecker should error, regular Sprite does not support Group.draw due to # missing image and rect attributes @@ -159,7 +156,7 @@ class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] def __class_getitem__( - cls, item: type[_SupportsSpriteGroup], / + cls, item: type[_SupportsSprite], / ) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... From 333e9219eaa96e9aeb982e717c9a28ae3a951bc7 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 17:04:21 +0100 Subject: [PATCH 257/441] move _THasRect definition to where it's used --- buildconfig/stubs/pygame/sprite.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 742646b06c..7bf01980fb 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -26,9 +26,6 @@ from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike -# generic for _HasRect, used in sprite collide functions -_THasRect = TypeVar("_THasRect", bound=_HasRect) - # non-generic Group, used in Sprite _Group = AbstractGroup[_SupportsSprite] @@ -266,6 +263,9 @@ class collide_circle_ratio: # addition to mandatorily having a rect attribute _SupportsCollideMask = Union[_HasImageAndRect, _HasMaskAndRect] +# generic for _HasRect, used in sprite collide functions +_THasRect = TypeVar("_THasRect", bound=_HasRect) + def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... From 412858987ebda8499f3bba24dfff18105e57b711 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 17:13:58 +0100 Subject: [PATCH 258/441] sprites are now generic to the groups they are contained in --- buildconfig/stubs/pygame/sprite.pyi | 35 +++++++++++++++-------------- src_py/sprite.py | 2 ++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 7bf01980fb..583882b7c2 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -26,8 +26,8 @@ from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike -# non-generic Group, used in Sprite -_Group = AbstractGroup[_SupportsSprite] +# generic Group, used in Sprite +_TGroup = TypeVar("_TGroup", bound=AbstractGroup) # define some useful protocols first, which sprite functions accept # sprite functions don't need all sprite attributes to be present in the @@ -50,7 +50,8 @@ class _HasRadiusAndRect(_HasRect, Protocol): radius: float # protocol helps with structural subtyping for typevars in sprite group generics -class _SupportsSprite(_HasImageAndRect, Protocol): +class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol): + def __class_getitem__(cls, item: type[AbstractGroup], /) -> types.GenericAlias: ... @property def image(self) -> Optional[Surface]: ... @image.setter @@ -63,17 +64,17 @@ class _SupportsSprite(_HasImageAndRect, Protocol): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def add_internal(self, group: _Group) -> None: ... - def remove_internal(self, group: _Group) -> None: ... + def add_internal(self, group: _TGroup) -> None: ... + def remove_internal(self, group: _TGroup) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _Group) -> None: ... - def remove(self, *groups: _Group) -> None: ... + def add(self, *groups: _TGroup) -> None: ... + def remove(self, *groups: _TGroup) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[_Group]: ... + def groups(self) -> list[_TGroup]: ... # also a protocol -class _SupportsDirtySprite(_SupportsSprite, Protocol): +class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol): dirty: int blendmode: int source_rect: Union[FRect, Rect] @@ -83,7 +84,7 @@ class _SupportsDirtySprite(_SupportsSprite, Protocol): def _get_visible(self) -> int: ... # concrete sprite implementation class -class Sprite(_SupportsSprite): +class Sprite(_SupportsSprite[_TGroup]): @property def image(self) -> Optional[Surface]: ... @image.setter @@ -96,18 +97,18 @@ class Sprite(_SupportsSprite): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def __init__(self, *groups: _Group) -> None: ... - def add_internal(self, group: _Group) -> None: ... - def remove_internal(self, group: _Group) -> None: ... + def __init__(self, *groups: _TGroup) -> None: ... + def add_internal(self, group: _TGroup) -> None: ... + def remove_internal(self, group: _TGroup) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _Group) -> None: ... - def remove(self, *groups: _Group) -> None: ... + def add(self, *groups: _TGroup) -> None: ... + def remove(self, *groups: _TGroup) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[_Group]: ... + def groups(self) -> list[_TGroup]: ... # concrete dirty sprite implementation class -class DirtySprite(_SupportsDirtySprite): +class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]): dirty: int blendmode: int source_rect: Union[FRect, Rect] diff --git a/src_py/sprite.py b/src_py/sprite.py index 9e72c3f2e1..b74f73d839 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -109,6 +109,8 @@ class Sprite: """ + __class_getitem__ = classmethod(types.GenericAlias) + def __init__(self, *groups): self.__g = {} # The groups the sprite is in self.__image: Optional[pygame.surface.Surface] = None From 1c18a81fde7f4264b78911ba3f53d41aa667405f Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 17:16:15 +0100 Subject: [PATCH 259/441] removed duplicated Group TypeVar definition --- buildconfig/stubs/pygame/sprite.pyi | 3 --- 1 file changed, 3 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 583882b7c2..219e1bcd62 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -117,9 +117,6 @@ class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]): def _set_visible(self, val: int) -> None: ... def _get_visible(self) -> int: ... -# used as a workaround for typing.Self because it is added in python 3.11 -_TGroup = TypeVar("_TGroup", bound=AbstractGroup) - # typevar bound to Sprite, _SupportsSprite Protocol ensures sprite # subclass passed to group has image and rect attributes _TSprite = TypeVar("_TSprite", bound=_SupportsSprite) From 3e94823997715e1f0619334d52c297defeba27be Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Sun, 8 Jun 2025 17:36:27 +0100 Subject: [PATCH 260/441] formatting and quality pass --- buildconfig/stubs/pygame/sprite.pyi | 40 ++++++++--------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 219e1bcd62..3c10a76f38 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -11,6 +11,7 @@ from typing import ( Union, ) +# use typing_extensions for compatibility with older Python versions if sys.version_info >= (3, 13): from warnings import deprecated else: @@ -26,9 +27,6 @@ from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike -# generic Group, used in Sprite -_TGroup = TypeVar("_TGroup", bound=AbstractGroup) - # define some useful protocols first, which sprite functions accept # sprite functions don't need all sprite attributes to be present in the # arguments passed, they only use a few which are marked in the below protocols @@ -49,7 +47,11 @@ class _HasMaskAndRect(_HasRect, Protocol): class _HasRadiusAndRect(_HasRect, Protocol): radius: float +# generic Group, used in Sprite +_TGroup = TypeVar("_TGroup", bound=AbstractGroup) + # protocol helps with structural subtyping for typevars in sprite group generics +# and allows the use of any class with the required attributes and methods class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol): def __class_getitem__(cls, item: type[AbstractGroup], /) -> types.GenericAlias: ... @property @@ -125,28 +127,9 @@ _TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) # almost the same as _TSprite but bound to DirtySprite _TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) +# typevar for sprite or iterable of sprites, used in Group init, add and remove _SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable]] -# Below code demonstrates the advantages of the _SupportsSprite protocol - -# typechecker should error, regular Sprite does not support Group.draw due to -# missing image and rect attributes -# a = Group(Sprite()) - -# typechecker should error, other Sprite attributes are also needed for Group -# class MySprite: -# image: Surface -# rect: Rect -# -# b = Group(MySprite()) - -# typechecker should pass -# class MySprite(Sprite): -# image: Surface -# rect: Rect -# -# b = Group(MySprite()) - class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] @@ -223,9 +206,7 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite]): def repaint_rect(self, screen_rect: RectLike) -> None: ... def set_clip(self, screen_rect: Optional[RectLike] = None) -> None: ... def get_clip(self) -> Union[FRect, Rect]: ... - def set_timing_threshold( - self, time_ms: SupportsFloat - ) -> None: ... # This actually accept any value + def set_timing_threshold(self, time_ms: SupportsFloat) -> None: ... @deprecated( "since 2.1.1. Use `pygame.sprite.LayeredDirty.set_timing_threshold` instead" ) @@ -261,12 +242,13 @@ class collide_circle_ratio: # addition to mandatorily having a rect attribute _SupportsCollideMask = Union[_HasImageAndRect, _HasMaskAndRect] -# generic for _HasRect, used in sprite collide functions -_THasRect = TypeVar("_THasRect", bound=_HasRect) - def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... + +# generic for _HasRect, used in sprite collide functions +_THasRect = TypeVar("_THasRect", bound=_HasRect) + def spritecollide( sprite: _THasRect, group: AbstractGroup[_TSprite], From f9298f6044d962b44cf3f39b379e2edf9dc55006 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 9 Jun 2025 01:00:26 +0530 Subject: [PATCH 261/441] Fix cppcheck skip logic on CI --- .github/workflows/run-ubuntu-checks.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index 06eb1ccbd6..49e03ec045 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -135,13 +135,19 @@ jobs: steps: - uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 # fetch full history - name: Check if any src_c files changed id: check-changes + continue-on-error: true run: | - git fetch origin ${{ github.base_ref }} --depth=1 || true - git checkout ${{ github.base_ref }} - CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) + else + CHANGED_FILES=$(git diff --name-only HEAD^1...HEAD) + fi + echo "Changed files: $CHANGED_FILES" echo "$CHANGED_FILES" | grep '^src_c/' || echo "skip=true" >> "$GITHUB_OUTPUT" - name: Install cppcheck From db8983f12e3ec1bddb09494b602a3caaec7fc348 Mon Sep 17 00:00:00 2001 From: damusss Date: Sun, 8 Jun 2025 22:31:07 +0200 Subject: [PATCH 262/441] Add versionadded --- buildconfig/stubs/pygame/display.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index 8aed5fea80..c46189eadc 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -730,6 +730,8 @@ def get_window_position() -> tuple[int, int]: Coordinates could be negative or outside the desktop size bounds. The position is relative to the topleft of the primary monitor and the y coordinate ignores the window frame. + + .. versionadded:: 2.5.0 """ def set_window_position(position: Point) -> None: @@ -742,6 +744,8 @@ def set_window_position(position: Point) -> None: ignore the window frame (y = 0 means the frame is hidden). The user will still be able to move the window after this call. See also :func:`pygame.display.get_window_position()`. + + .. versionadded:: 2.5.0 """ def get_allow_screensaver() -> bool: From 17bdf85ffa29d33b69dcf18c4b3973544a43c943 Mon Sep 17 00:00:00 2001 From: damusss Date: Mon, 9 Jun 2025 09:22:00 +0200 Subject: [PATCH 263/441] Fix space for other versionadded --- buildconfig/stubs/pygame/surface.pyi | 2 +- docs/reST/ref/mixer.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildconfig/stubs/pygame/surface.pyi b/buildconfig/stubs/pygame/surface.pyi index 847a03222b..bf5b52e831 100644 --- a/buildconfig/stubs/pygame/surface.pyi +++ b/buildconfig/stubs/pygame/surface.pyi @@ -773,7 +773,7 @@ class Surface: rectangle for the Surface centered at a given position. Size attributes such as ``size`` or ``w`` can also be applied to resize the FRect. - ..versionadded:: 2.3.0 + .. versionadded:: 2.3.0 """ def get_bitsize(self) -> int: diff --git a/docs/reST/ref/mixer.rst b/docs/reST/ref/mixer.rst index 6d009b2f47..37976873c0 100644 --- a/docs/reST/ref/mixer.rst +++ b/docs/reST/ref/mixer.rst @@ -526,7 +526,7 @@ The following file formats are supported This simply returns the channel id used to create the ``Channel`` instance as a read-only attribute - ..versionadded:: 2.4.0 + .. versionadded:: 2.4.0 .. ## Channel.id ## From 33f6abb0f85a024c39ebe9115649a9e86ce861d0 Mon Sep 17 00:00:00 2001 From: Nacho Maiz Date: Mon, 9 Jun 2025 10:52:06 +0100 Subject: [PATCH 264/441] Add missing TypeVar to _SpriteOrIterable Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 3c10a76f38..1d90e70908 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -128,7 +128,7 @@ _TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) _TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) # typevar for sprite or iterable of sprites, used in Group init, add and remove -_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable]] +_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable[_TSprite]]] class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] From d5e66d8b9e7a1859f6a34350a5645d206d0ef17d Mon Sep 17 00:00:00 2001 From: Marko Zivic <92328096+mzivic7@users.noreply.github.com> Date: Mon, 9 Jun 2025 16:07:52 +0200 Subject: [PATCH 265/441] New draw.aaline width algorithm (#3191) Co-authored-by: Dan Lawrence --- .../ref/code_examples/draw_module_example.png | Bin 13220 -> 13444 bytes src_c/draw.c | 360 ++++++++++++++++-- test/draw_test.py | 36 +- 3 files changed, 345 insertions(+), 51 deletions(-) diff --git a/docs/reST/ref/code_examples/draw_module_example.png b/docs/reST/ref/code_examples/draw_module_example.png index 6e3e6af13cc0b21b83d1f9f54e94843e8dfe3634..7997a68a1b3989d1c2dc313a398bc0daa2810f11 100644 GIT binary patch delta 9723 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 F{{!p%@v{H` delta 9627 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 diff --git a/src_c/draw.c b/src_c/draw.c index a63aea97cc..a5667b8c94 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -44,10 +44,6 @@ draw_line_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, static void draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, int y2, Uint32 color, int *drawn_area); -void -line_width_corners(float from_x, float from_y, float to_x, float to_y, - int width, float *x1, float *y1, float *x2, float *y2, - float *x3, float *y3, float *x4, float *y4); static void draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, PG_PixelFormat *surf_format, Uint32 color, float startx, @@ -55,6 +51,11 @@ draw_aaline(SDL_Surface *surf, SDL_Rect surf_clip_rect, int disable_first_endpoint, int disable_second_endpoint, int extra_pixel_for_aalines); static void +draw_aaline_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, Uint32 color, float from_x, + float from_y, float to_x, float to_y, int width, + int *drawn_area); +static void draw_arc(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x_center, int y_center, int radius1, int radius2, int width, double angle_start, double angle_stop, Uint32 color, int *drawn_area); @@ -188,15 +189,8 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) } if (width > 1) { - float x1, y1, x2, y2, x3, y3, x4, y4; - line_width_corners(startx, starty, endx, endy, width, &x1, &y1, &x2, - &y2, &x3, &y3, &x4, &y4); - draw_line_width(surf, surf_clip_rect, color, (int)startx, (int)starty, - (int)endx, (int)endy, width, drawn_area); - draw_aaline(surf, surf_clip_rect, surf_format, color, x1, y1, x2, y2, - drawn_area, 0, 0, 0); - draw_aaline(surf, surf_clip_rect, surf_format, color, x3, y3, x4, y4, - drawn_area, 0, 0, 0); + draw_aaline_width(surf, surf_clip_rect, surf_format, color, startx, + starty, endx, endy, width, drawn_area); } else { draw_aaline(surf, surf_clip_rect, surf_format, color, startx, starty, @@ -1831,6 +1825,37 @@ drawhorzlineclipbounding(SDL_Surface *surf, SDL_Rect surf_clip_rect, drawhorzline(surf, color, x1, y1, x2); } +static void +drawvertlineclipbounding(SDL_Surface *surf, SDL_Rect surf_clip_rect, + Uint32 color, int y1, int x1, int y2, int *pts) +{ + if (x1 < surf_clip_rect.x || x1 >= surf_clip_rect.x + surf_clip_rect.w) { + return; + } + + if (y2 < y1) { + int temp = y1; + y1 = y2; + y2 = temp; + } + + y1 = MAX(y1, surf_clip_rect.y); + y2 = MIN(y2, surf_clip_rect.y + surf_clip_rect.h - 1); + + if (y2 < surf_clip_rect.y || y1 >= surf_clip_rect.y + surf_clip_rect.h) { + return; + } + + if (y1 == y2) { + set_and_check_rect(surf, surf_clip_rect, x1, y1, color, pts); + return; + } + + add_line_to_drawn_list(x1, y1, x1, y2, pts); + + drawvertline(surf, color, y1, x1, y2); +} + void swap_coordinates(int *x1, int *y1, int *x2, int *y2) { @@ -1986,36 +2011,295 @@ draw_line_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, Uint32 color, } } -// Calculates 4 points, representing corners of draw_line_width() -// first two points assemble left line and second two - right line -void -line_width_corners(float from_x, float from_y, float to_x, float to_y, - int width, float *x1, float *y1, float *x2, float *y2, - float *x3, float *y3, float *x4, float *y4) +static void +draw_aaline_width(SDL_Surface *surf, SDL_Rect surf_clip_rect, + PG_PixelFormat *surf_format, Uint32 color, float from_x, + float from_y, float to_x, float to_y, int width, + int *drawn_area) { - float aa_width = (float)width / 2; - float extra_width = (1.0f - (width % 2)) / 2; - int steep = fabs(to_x - from_x) <= fabs(to_y - from_y); + float gradient, dx, dy, intersect_y, brightness; + int x, x_pixel_start, x_pixel_end, start_draw, end_draw; + Uint32 pixel_color; + float y_endpoint, clip_left, clip_right, clip_top, clip_bottom; + int steep, y; + int extra_width = 1 - (width % 2); + + width = (width / 2); + + dx = to_x - from_x; + dy = to_y - from_y; + steep = fabs(dx) < fabs(dy); + + /* Single point. + * A line with length 0 is drawn as a single pixel at full brightness. */ + if (fabs(dx) < 0.0001 && fabs(dy) < 0.0001) { + x = (int)floor(from_x + 0.5); + y = (int)floor(from_y + 0.5); + pixel_color = get_antialiased_color(surf, surf_clip_rect, surf_format, + x, y, color, 1); + set_and_check_rect(surf, surf_clip_rect, x, y, pixel_color, + drawn_area); + if (dx != 0 && dy != 0) { + if (steep) { + start_draw = (int)(x - width + extra_width); + end_draw = (int)(x + width) - 1; + drawhorzlineclipbounding(surf, surf_clip_rect, color, + start_draw, y, end_draw, drawn_area); + } + else { + start_draw = (int)(y - width + extra_width); + end_draw = (int)(y + width) - 1; + drawvertlineclipbounding(surf, surf_clip_rect, color, + start_draw, x, end_draw, drawn_area); + } + } + return; + } + + /* To draw correctly the pixels at the border of the clipping area when + * the line crosses it, we need to clip it one pixel wider in all four + * directions, and add width */ + clip_left = (float)surf_clip_rect.x - 1.0f; + clip_right = (float)clip_left + surf_clip_rect.w + 1.0f; + clip_top = (float)surf_clip_rect.y - 1.0f; + clip_bottom = (float)clip_top + surf_clip_rect.h + 1.0f; if (steep) { - *x1 = from_x + extra_width + aa_width; - *y1 = from_y; - *x2 = to_x + extra_width + aa_width; - *y2 = to_y; - *x3 = from_x + extra_width - aa_width; - *y3 = from_y; - *x4 = to_x + extra_width - aa_width; - *y4 = to_y; + swap(&from_x, &from_y); + swap(&to_x, &to_y); + swap(&dx, &dy); + swap(&clip_left, &clip_top); + swap(&clip_right, &clip_bottom); + } + if (dx < 0) { + swap(&from_x, &to_x); + swap(&from_y, &to_y); + dx = -dx; + dy = -dy; + } + + if (to_x <= clip_left || from_x >= clip_right) { + /* The line is completely to the side of the surface */ + return; + } + + /* Note. There is no need to guard against a division by zero here. If dx + * was zero then either we had a single point (and we've returned) or it + * has been swapped with a non-zero dy. */ + gradient = dy / dx; + + /* No need to waste CPU cycles on pixels not on the surface. */ + if (from_x < clip_left + 1) { + from_y += gradient * (clip_left + 1 - from_x); + from_x = clip_left + 1; + } + if (to_x > clip_right - 1) { + to_y += gradient * (clip_right - 1 - to_x); + to_x = clip_right - 1; + } + + if (gradient > 0.0f) { + if (from_x < clip_left + 1) { + /* from_ is the topmost endpoint */ + if (to_y <= clip_top || from_y >= clip_bottom) { + /* The line does not enter the surface */ + return; + } + if (from_y < clip_top - width) { + from_x += (clip_top - width - from_y) / gradient; + from_y = clip_top - width; + } + if (to_y > clip_bottom + width) { + to_x += (clip_bottom + width - to_y) / gradient; + to_y = clip_bottom + width; + } + } } else { - *x1 = from_x; - *y1 = from_y + extra_width + aa_width; - *x2 = to_x; - *y2 = to_y + extra_width + aa_width; - *x3 = from_x; - *y3 = from_y + extra_width - aa_width; - *x4 = to_x; - *y4 = to_y + extra_width - aa_width; + if (to_x > clip_right - 1) { + /* to_ is the topmost endpoint */ + if (from_y <= clip_top || to_y >= clip_bottom) { + /* The line does not enter the surface */ + return; + } + if (to_y < clip_top - width) { + to_x += (clip_top - width - to_y) / gradient; + to_y = clip_top - width; + } + if (from_y > clip_bottom + width) { + from_x += (clip_bottom + width - from_y) / gradient; + from_y = clip_bottom + width; + } + } + } + + /* By moving the points one pixel down, we can assume y is never negative. + * That permit us to use (int)y to round down instead of having to use + * floor(y). We then draw the pixels one higher.*/ + from_y += 1.0f; + to_y += 1.0f; + + /* Handle endpoints separately */ + /* First endpoint */ + x_pixel_start = (int)from_x; + y_endpoint = intersect_y = from_y + gradient * (x_pixel_start - from_x); + if (to_x > clip_left + 1.0f) { + brightness = y_endpoint - (int)y_endpoint; + if (steep) { + x = (int)y_endpoint; + y = x_pixel_start; + } + else { + x = x_pixel_start; + y = (int)y_endpoint; + } + if ((int)y_endpoint < y_endpoint) { + if (steep) { + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, + x + width, y, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x + width, y, + pixel_color, drawn_area); + } + else { + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y + width, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, y + width, + pixel_color, drawn_area); + } + } + brightness = 1 - brightness; + if (steep) { + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, + x - width, y, color, brightness); + set_and_check_rect(surf, surf_clip_rect, + x - width + extra_width - 1, y, pixel_color, + drawn_area); + start_draw = (int)(x - width + extra_width); + end_draw = (int)(x + width) - 1; + drawhorzlineclipbounding(surf, surf_clip_rect, color, start_draw, + y, end_draw, drawn_area); + } + else { + pixel_color = get_antialiased_color( + surf, surf_clip_rect, surf_format, x, + y - width + extra_width - 1, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, + y - width + extra_width - 1, pixel_color, + drawn_area); + start_draw = (int)(y - width + extra_width); + end_draw = (int)(y + width) - 1; + drawvertlineclipbounding(surf, surf_clip_rect, color, start_draw, + x, end_draw, drawn_area); + } + intersect_y += gradient; + x_pixel_start++; + } + + /* Second endpoint */ + x_pixel_end = (int)ceil(to_x); + if (from_x < clip_right - 1.0f) { + y_endpoint = to_y + gradient * (x_pixel_end - to_x); + brightness = y_endpoint - (int)y_endpoint; + if (steep) { + x = (int)y_endpoint; + y = x_pixel_end; + } + else { + x = x_pixel_end; + y = (int)y_endpoint; + } + if ((int)y_endpoint < y_endpoint) { + if (steep) { + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, + x + width, y, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x + width, y, + pixel_color, drawn_area); + } + else { + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y + width, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, y + width, + pixel_color, drawn_area); + } + } + brightness = 1 - brightness; + if (steep) { + pixel_color = get_antialiased_color( + surf, surf_clip_rect, surf_format, x - width + extra_width - 1, + y, color, brightness); + set_and_check_rect(surf, surf_clip_rect, + x - width + extra_width - 1, y, pixel_color, + drawn_area); + start_draw = (int)(x - width); + end_draw = (int)(x + width) - 1; + drawhorzlineclipbounding(surf, surf_clip_rect, color, start_draw, + y, end_draw, drawn_area); + } + else { + pixel_color = get_antialiased_color( + surf, surf_clip_rect, surf_format, x, + y - width + extra_width - 1, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, + y - width + extra_width - 1, pixel_color, + drawn_area); + start_draw = (int)(y - width + extra_width); + end_draw = (int)(y + width) - 1; + drawvertlineclipbounding(surf, surf_clip_rect, color, start_draw, + x, end_draw, drawn_area); + } + } + + /* main line drawing loop */ + for (x = x_pixel_start; x < x_pixel_end; x++) { + y = (int)intersect_y; + if (steep) { + brightness = 1 - intersect_y + y; + pixel_color = get_antialiased_color( + surf, surf_clip_rect, surf_format, y - width + extra_width - 1, + x, color, brightness); + set_and_check_rect(surf, surf_clip_rect, + y - width + extra_width - 1, x, pixel_color, + drawn_area); + if (y < intersect_y) { + brightness = 1 - brightness; + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, + y + width, x, color, brightness); + set_and_check_rect(surf, surf_clip_rect, y + width, x, + pixel_color, drawn_area); + } + start_draw = (int)(y - width + extra_width); + end_draw = (int)(y + width) - 1; + drawhorzlineclipbounding(surf, surf_clip_rect, color, start_draw, + x, end_draw, drawn_area); + } + else { + brightness = 1 - intersect_y + y; + pixel_color = get_antialiased_color( + surf, surf_clip_rect, surf_format, x, + y - width + extra_width - 1, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, + y - width + extra_width - 1, pixel_color, + drawn_area); + if (y < intersect_y) { + brightness = 1 - brightness; + pixel_color = + get_antialiased_color(surf, surf_clip_rect, surf_format, x, + y + width, color, brightness); + set_and_check_rect(surf, surf_clip_rect, x, y + width, + pixel_color, drawn_area); + } + start_draw = (int)(y - width + extra_width); + end_draw = (int)(y + width) - 1; + drawvertlineclipbounding(surf, surf_clip_rect, color, start_draw, + x, end_draw, drawn_area); + } + intersect_y += gradient; } } diff --git a/test/draw_test.py b/test/draw_test.py index 86c54541c0..cb72452fdf 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -2878,20 +2878,22 @@ def test_aaline__gaps(self): pos = (x, 0) self.assertEqual(surface.get_at(pos), expected_color, f"pos={pos}") - def test_line__gaps_with_thickness(self): + def test_aaline__gaps_with_thickness(self): """Ensures a thick aaline is drawn without any gaps.""" - expected_color = (255, 255, 255) + background_color = (0, 0, 0) thickness = 5 for surface in self._create_surfaces(): width = surface.get_width() - 1 h = width // 5 w = h * 5 - self.draw_aaline(surface, expected_color, (0, 5), (w, 5 + h), thickness) + self.draw_aaline(surface, (255, 255, 255), (0, 5), (w, 5 + h), thickness) for x in range(w + 1): for y in range(3, 8): pos = (x, y + ((x + 2) // 5)) - self.assertEqual(surface.get_at(pos), expected_color, f"pos={pos}") + self.assertNotEqual( + surface.get_at(pos), background_color, f"pos={pos}" + ) def test_aaline__bounding_rect(self): """Ensures draw aaline returns the correct bounding rect. @@ -2939,9 +2941,7 @@ def test_aaline__bounding_rect(self): self.assertEqual( bounding_rect, expected_rect, - "start={}, end={}, size={}, thickness={}".format( - start, end, size, thickness - ), + f"start={start}, end={end}, size={size}, thickness={thickness}", ) def test_aaline__surface_clip(self): @@ -2961,6 +2961,8 @@ def test_aaline__surface_clip(self): # drawing the aaline over the clip_rect's bounds. for center in rect_corners_mids_and_center(clip_rect): pos_rect.center = center + start = pos_rect.midtop + end = pos_rect.midbottom # Get the expected points by drawing the aaline without the # clip area set. @@ -2969,8 +2971,8 @@ def test_aaline__surface_clip(self): self.draw_aaline( surface, aaline_color, - pos_rect.midtop, - pos_rect.midbottom, + start, + end, thickness, ) @@ -2986,8 +2988,8 @@ def test_aaline__surface_clip(self): self.draw_aaline( surface, aaline_color, - pos_rect.midtop, - pos_rect.midbottom, + start, + end, thickness, ) @@ -2997,9 +2999,17 @@ def test_aaline__surface_clip(self): # are not surface_color. for pt in ((x, y) for x in range(surfw) for y in range(surfh)): if pt in expected_pts: - self.assertNotEqual(surface.get_at(pt), surface_color, pt) + self.assertNotEqual( + surface.get_at(pt), + surface_color, + f"start={start}, end={end}, thickness={thickness}, point={pt}", + ) else: - self.assertEqual(surface.get_at(pt), surface_color, pt) + self.assertEqual( + surface.get_at(pt), + surface_color, + f"start={start}, end={end}, thickness={thickness}, point={pt}", + ) surface.unlock() From ed733bd075d9a73dd7981670147cb089bf35f1b8 Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 10 Jun 2025 00:00:54 +0530 Subject: [PATCH 266/441] Add sanitize and quiet options to dev.py build --- dev.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dev.py b/dev.py index d334178c04..d9651d2e7f 100644 --- a/dev.py +++ b/dev.py @@ -204,9 +204,11 @@ def __init__(self) -> None: def cmd_build(self): wheel_dir = self.args.get("wheel", DIST_DIR) + quiet = self.args.get("quiet", False) debug = self.args.get("debug", False) lax = self.args.get("lax", False) sdl3 = self.args.get("sdl3", False) + sanitize = self.args.get("sanitize") coverage = self.args.get("coverage", False) if wheel_dir and coverage: pprint("Cannot pass --wheel and --coverage together", Colors.RED) @@ -228,6 +230,8 @@ def cmd_build(self): if not wheel_dir: # editable install + if not quiet: + install_args.append("-Ceditable-verbose=true") install_args.append("--editable") install_args.append(".") @@ -245,6 +249,9 @@ def cmd_build(self): if coverage: install_args.extend(COVERAGE_ARGS) + if sanitize: + install_args.append(f"-Csetup-args=-Db_sanitize={sanitize}") + info_str = f"with {debug=}, {lax=}, {sdl3=}, and {coverage=}" if wheel_dir: pprint(f"Building wheel at '{wheel_dir}' ({info_str})") @@ -352,6 +359,11 @@ def parse_args(self): f"wheel (if not passed, '{DIST_DIR}' is used)" ), ) + build_parser.add_argument( + "--quiet", + action="store_true", + help="Silence build log in editable install (doing editable-verbose=false)", + ) build_parser.add_argument( "--debug", action="store_true", @@ -367,6 +379,20 @@ def parse_args(self): action="store_true", help="Build against SDL3 instead of the default SDL2", ) + build_parser.add_argument( + "--sanitize", + choices=[ + "address", + "undefined", + "address,undefined", + "leak", + "thread", + "memory", + "none", + ], + default="none", + help="Enable compiler sanitizers. Defaults to 'none'.", + ) build_parser.add_argument( "--coverage", action="store_true", From 333f3bb31169346c5200e32f9974582b024257be Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 10 Jun 2025 00:02:33 +0530 Subject: [PATCH 267/441] Fix UBSAN issues, run it on CI --- .github/workflows/run-ubuntu-checks.yml | 2 +- src_c/SDL_gfx/SDL_gfxPrimitives.c | 4 ++-- src_c/alphablit.c | 2 +- src_c/color.c | 4 ++-- src_c/freetype/ft_wrap.h | 4 ++-- src_c/mask.c | 3 ++- src_c/pixelcopy.c | 2 +- src_c/rotozoom.c | 4 ++-- src_c/surface.c | 32 ++++++++++++------------- src_c/surface.h | 32 ++++++++++++------------- 10 files changed, 45 insertions(+), 44 deletions(-) diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index 49e03ec045..a428955efd 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -101,7 +101,7 @@ jobs: id: build-pygame-ce run: | pyenv global ${{ matrix.python }}-debug - python dev.py build --lax --coverage + python dev.py build --lax --coverage --sanitize undefined - name: Run tests env: diff --git a/src_c/SDL_gfx/SDL_gfxPrimitives.c b/src_c/SDL_gfx/SDL_gfxPrimitives.c index 15371eba5d..66c8bdddc3 100644 --- a/src_c/SDL_gfx/SDL_gfxPrimitives.c +++ b/src_c/SDL_gfx/SDL_gfxPrimitives.c @@ -2782,7 +2782,7 @@ _aalineColor(SDL_Surface *dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, /* * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; */ - erradj = ((dx << 16) / dy) << 16; + erradj = (Uint32)((dx << 16) / dy) << 16; /* * draw all pixels other than the first and last @@ -2819,7 +2819,7 @@ _aalineColor(SDL_Surface *dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, /* * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; */ - erradj = ((dy << 16) / dx) << 16; + erradj = (Uint32)((dy << 16) / dx) << 16; /* * draw all pixels other than the first and last diff --git a/src_c/alphablit.c b/src_c/alphablit.c index f279c50b4b..e7fbad010a 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -2448,7 +2448,7 @@ alphablit_alpha(SDL_BlitInfo *info) int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; + Uint32 dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; Uint32 modulateA = info->src_blanket_alpha; Uint32 pixel; diff --git a/src_c/color.c b/src_c/color.c index 653cc93070..b7cea27266 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -1737,7 +1737,7 @@ _color_inv(pgColorObject *color) static PyObject * _color_int(pgColorObject *color) { - Uint32 tmp = (color->data[0] << 24) + (color->data[1] << 16) + + Uint32 tmp = ((Uint32)color->data[0] << 24) + (color->data[1] << 16) + (color->data[2] << 8) + color->data[3]; return PyLong_FromUnsignedLong(tmp); } @@ -1748,7 +1748,7 @@ _color_int(pgColorObject *color) static PyObject * _color_float(pgColorObject *color) { - Uint32 tmp = ((color->data[0] << 24) + (color->data[1] << 16) + + Uint32 tmp = (((Uint32)color->data[0] << 24) + (color->data[1] << 16) + (color->data[2] << 8) + color->data[3]); return PyFloat_FromDouble((double)tmp); } diff --git a/src_c/freetype/ft_wrap.h b/src_c/freetype/ft_wrap.h index 0bba50fc91..0ecff0c450 100644 --- a/src_c/freetype/ft_wrap.h +++ b/src_c/freetype/ft_wrap.h @@ -41,8 +41,8 @@ #define FX6_TRUNC(x) ((x) >> 6) #define FX16_CEIL_TO_FX6(x) (((x) + 1023L) >> 10) #define FX16_ROUND_TO_INT(x) (((x) + 32768L) >> 16) -#define INT_TO_FX6(i) ((FT_Fixed)((i) << 6)) -#define INT_TO_FX16(i) ((FT_Fixed)((i) << 16)) +#define INT_TO_FX6(i) ((FT_Fixed)((unsigned long long)(i) << 6)) +#define INT_TO_FX16(i) ((FT_Fixed)((unsigned long long)(i) << 16)) #define FX16_TO_DBL(x) ((x) * 1.52587890625e-5 /* 2.0^-16 */) #define DBL_TO_FX16(d) ((FT_Fixed)((d) * 65536.0)) #define FX6_TO_DBL(x) ((x) * 1.5625e-2 /* 2.0^-6 */) diff --git a/src_c/mask.c b/src_c/mask.c index 803dc6bff6..901e6e219a 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -763,7 +763,8 @@ set_pixel_color(Uint8 *pixel, Uint8 bpp, Uint32 color) case 3: #if SDL_BYTEORDER == SDL_LIL_ENDIAN - *(Uint16 *)pixel = color; + pixel[0] = color; + pixel[1] = color >> 8; pixel[2] = color >> 16; #else /* != SDL_LIL_ENDIAN */ pixel[2] = color; diff --git a/src_c/pixelcopy.c b/src_c/pixelcopy.c index 0304d7ebce..e9f1a327c9 100644 --- a/src_c/pixelcopy.c +++ b/src_c/pixelcopy.c @@ -734,7 +734,7 @@ array_to_surface(PyObject *self, PyObject *arg) else { Uint32 alpha = 0; if (format->Amask) { - alpha = 255 >> Aloss << Ashift; + alpha = 255u >> Aloss << Ashift; } switch (view_p->itemsize) { case sizeof(Uint8): diff --git a/src_c/rotozoom.c b/src_c/rotozoom.c index b888a84963..f0db4c6866 100644 --- a/src_c/rotozoom.c +++ b/src_c/rotozoom.c @@ -236,8 +236,8 @@ transformSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst, int cx, int cy, /* * Variable setup */ - xd = ((src->w - dst->w) << 15); - yd = ((src->h - dst->h) << 15); + xd = ((unsigned long long)(src->w - dst->w) << 15); + yd = ((unsigned long long)(src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); sw = src->w - 1; diff --git a/src_c/surface.c b/src_c/surface.c index 80cc21119f..e8ffc6b29e 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -717,16 +717,16 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) if (flags & PGS_SRCALPHA) { switch (bpp) { case 16: - Rmask = 0xF << 8; - Gmask = 0xF << 4; - Bmask = 0xF; - Amask = 0xF << 12; + Rmask = 0xFu << 8; + Gmask = 0xFu << 4; + Bmask = 0xFu; + Amask = 0xFu << 12; break; case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; - Amask = 0xFF << 24; + Rmask = 0xFFu << 16; + Gmask = 0xFFu << 8; + Bmask = 0xFFu; + Amask = 0xFFu << 24; break; default: PyErr_SetString( @@ -793,20 +793,20 @@ surface_init(pgSurfaceObject *self, PyObject *args, PyObject *kwds) if (flags & PGS_SRCALPHA) { switch (bpp) { case 16: - Rmask = 0xF << 8; - Gmask = 0xF << 4; - Bmask = 0xF; - Amask = 0xF << 12; + Rmask = 0xFu << 8; + Gmask = 0xFu << 4; + Bmask = 0xFu; + Amask = 0xFu << 12; break; case 24: bpp = 32; // we automatically step up to 32 if video is 24, fall // through to case below case 32: - Rmask = 0xFF << 16; - Gmask = 0xFF << 8; - Bmask = 0xFF; - Amask = 0xFF << 24; + Rmask = 0xFFu << 16; + Gmask = 0xFFu << 8; + Bmask = 0xFFu; + Amask = 0xFFu << 24; break; default: PyErr_SetString( diff --git a/src_c/surface.h b/src_c/surface.h index d3cf9e322b..fb8ac2ede3 100644 --- a/src_c/surface.h +++ b/src_c/surface.h @@ -142,22 +142,22 @@ } #endif -#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ - switch (bp) { \ - case 2: \ - *((Uint16 *)(buf)) = \ - ((r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ - ((g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ - ((b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ - ((a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ - break; \ - case 4: \ - *((Uint32 *)(buf)) = \ - ((r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ - ((g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ - ((b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ - ((a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ - break; \ +#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ + switch (bp) { \ + case 2: \ + *((Uint16 *)(buf)) = \ + ((r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ + ((g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ + ((b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ + ((a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ + break; \ + case 4: \ + *((Uint32 *)(buf)) = \ + ((Uint32)(r >> PG_FORMAT_R_LOSS(ft)) << ft->Rshift) | \ + ((Uint32)(g >> PG_FORMAT_G_LOSS(ft)) << ft->Gshift) | \ + ((Uint32)(b >> PG_FORMAT_B_LOSS(ft)) << ft->Bshift) | \ + ((Uint32)(a >> PG_FORMAT_A_LOSS(ft)) << ft->Ashift); \ + break; \ } /* Pretty good idea from Tom Duff :-). */ From 26754f4711b783e9034714b2f578e925b2bc7f0d Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Mon, 9 Jun 2025 19:51:06 +0100 Subject: [PATCH 268/441] Revert generic Sprite, fixing typing issue with Sprite.add and Sprite.remove --- buildconfig/stubs/pygame/sprite.pyi | 102 ++++++++++++++-------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 1d90e70908..4b1fc3019a 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -47,13 +47,12 @@ class _HasMaskAndRect(_HasRect, Protocol): class _HasRadiusAndRect(_HasRect, Protocol): radius: float -# generic Group, used in Sprite -_TGroup = TypeVar("_TGroup", bound=AbstractGroup) +# non-generic Group, used in Sprite +_Group = AbstractGroup[_SupportsSprite] # protocol helps with structural subtyping for typevars in sprite group generics # and allows the use of any class with the required attributes and methods -class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol): - def __class_getitem__(cls, item: type[AbstractGroup], /) -> types.GenericAlias: ... +class _SupportsSprite(_HasImageAndRect, Protocol): @property def image(self) -> Optional[Surface]: ... @image.setter @@ -66,17 +65,17 @@ class _SupportsSprite(Generic[_TGroup], _HasImageAndRect, Protocol): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def add_internal(self, group: _TGroup) -> None: ... - def remove_internal(self, group: _TGroup) -> None: ... + def add_internal(self, group: _Group) -> None: ... + def remove_internal(self, group: _Group) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _TGroup) -> None: ... - def remove(self, *groups: _TGroup) -> None: ... + def add(self, *groups: _Group) -> None: ... + def remove(self, *groups: _Group) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[_TGroup]: ... + def groups(self) -> list[_Group]: ... # also a protocol -class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol): +class _SupportsDirtySprite(_SupportsSprite, Protocol): dirty: int blendmode: int source_rect: Union[FRect, Rect] @@ -86,7 +85,7 @@ class _SupportsDirtySprite(_SupportsSprite[_TGroup], Protocol): def _get_visible(self) -> int: ... # concrete sprite implementation class -class Sprite(_SupportsSprite[_TGroup]): +class Sprite(_SupportsSprite): @property def image(self) -> Optional[Surface]: ... @image.setter @@ -99,18 +98,18 @@ class Sprite(_SupportsSprite[_TGroup]): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def __init__(self, *groups: _TGroup) -> None: ... - def add_internal(self, group: _TGroup) -> None: ... - def remove_internal(self, group: _TGroup) -> None: ... + def __init__(self, *groups: _Group) -> None: ... + def add_internal(self, group: _Group) -> None: ... + def remove_internal(self, group: _Group) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _TGroup) -> None: ... - def remove(self, *groups: _TGroup) -> None: ... + def add(self, *groups: _Group) -> None: ... + def remove(self, *groups: _Group) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[_TGroup]: ... + def groups(self) -> list[_Group]: ... # concrete dirty sprite implementation class -class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]): +class DirtySprite(Sprite, _SupportsDirtySprite): dirty: int blendmode: int source_rect: Union[FRect, Rect] @@ -122,33 +121,32 @@ class DirtySprite(Sprite[_TGroup], _SupportsDirtySprite[_TGroup]): # typevar bound to Sprite, _SupportsSprite Protocol ensures sprite # subclass passed to group has image and rect attributes _TSprite = TypeVar("_TSprite", bound=_SupportsSprite) +_TSprite_co = TypeVar("_TSprite_co", bound=_SupportsSprite, covariant=True) _TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) # almost the same as _TSprite but bound to DirtySprite -_TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) +_TDirtySprite_co = TypeVar("_TDirtySprite_co", bound=_SupportsDirtySprite, covariant=True) # typevar for sprite or iterable of sprites, used in Group init, add and remove -_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable[_TSprite]]] +_SpriteOrIterable = Union[_TSprite_co, Iterable[_SpriteOrIterable[_TSprite_co]]] -class AbstractGroup(Generic[_TSprite]): - spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] +class AbstractGroup(Generic[_TSprite_co]): + spritedict: dict[_TSprite_co, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] - def __class_getitem__( - cls, item: type[_SupportsSprite], / - ) -> types.GenericAlias: ... + def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... - def __iter__(self) -> Iterator[_TSprite]: ... + def __iter__(self) -> Iterator[_TSprite_co]: ... def __bool__(self) -> bool: ... def __contains__(self, item: Any) -> bool: ... - def add_internal(self, sprite: _TSprite, layer: None = None) -> None: ... - def remove_internal(self, sprite: _TSprite) -> None: ... - def has_internal(self, sprite: _TSprite) -> bool: ... + def add_internal(self, sprite: _SupportsSprite, layer: None = None) -> None: ... + def remove_internal(self, sprite: _SupportsSprite) -> None: ... + def has_internal(self, sprite: _SupportsSprite) -> bool: ... def copy(self) -> Self: ... - def sprites(self) -> list[_TSprite]: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... - def remove(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... - def has(self, *sprites: _SpriteOrIterable[_TSprite]) -> bool: ... + def sprites(self) -> list[_TSprite_co]: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... + def remove(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... + def has(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def draw( self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 @@ -160,41 +158,41 @@ class AbstractGroup(Generic[_TSprite]): ) -> None: ... def empty(self) -> None: ... -class Group(AbstractGroup[_TSprite]): - def __init__(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... +class Group(AbstractGroup[_TSprite_co]): + def __init__(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") -class RenderPlain(Group[_TSprite]): ... +class RenderPlain(Group[_TSprite_co]): ... @deprecated("Use `pygame.sprite.Group` instead") -class RenderClear(Group[_TSprite]): ... +class RenderClear(Group[_TSprite_co]): ... -class RenderUpdates(Group[_TSprite]): ... +class RenderUpdates(Group[_TSprite_co]): ... @deprecated("Use `pygame.sprite.RenderUpdates` instead") -class OrderedUpdates(RenderUpdates[_TSprite]): ... +class OrderedUpdates(RenderUpdates[_TSprite_co]): ... -class LayeredUpdates(AbstractGroup[_TSprite]): +class LayeredUpdates(AbstractGroup[_TSprite_co]): def __init__( - self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any + self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any ) -> None: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any) -> None: ... - def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... - def get_sprite(self, idx: int) -> _TSprite: ... - def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any) -> None: ... + def get_sprites_at(self, pos: Point) -> list[_TSprite_co]: ... + def get_sprite(self, idx: int) -> _TSprite_co: ... + def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite_co]: ... def layers(self) -> list[int]: ... - def change_layer(self, sprite: _TSprite, new_layer: int) -> None: ... - def get_layer_of_sprite(self, sprite: _TSprite) -> int: ... + def change_layer(self, sprite: _SupportsSprite, new_layer: int) -> None: ... + def get_layer_of_sprite(self, sprite: _SupportsSprite) -> int: ... def get_top_layer(self) -> int: ... def get_bottom_layer(self) -> int: ... - def move_to_front(self, sprite: _TSprite) -> None: ... - def move_to_back(self, sprite: _TSprite) -> None: ... - def get_top_sprite(self) -> _TSprite: ... - def get_sprites_from_layer(self, layer: int) -> list[_TSprite]: ... + def move_to_front(self, sprite: _SupportsSprite) -> None: ... + def move_to_back(self, sprite: _SupportsSprite) -> None: ... + def get_top_sprite(self) -> _TSprite_co: ... + def get_sprites_from_layer(self, layer: int) -> list[_TSprite_co]: ... def switch_layer(self, layer1_nr: int, layer2_nr: int) -> None: ... -class LayeredDirty(LayeredUpdates[_TDirtySprite]): +class LayeredDirty(LayeredUpdates[_TDirtySprite_co]): def draw( self, surface: Surface, From 41cb285ec242e6f0ef63565015b30ad7b52aac58 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Mon, 9 Jun 2025 19:53:02 +0100 Subject: [PATCH 269/441] remove __class_getitem__ from Sprite --- src_py/sprite.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src_py/sprite.py b/src_py/sprite.py index b74f73d839..9e72c3f2e1 100644 --- a/src_py/sprite.py +++ b/src_py/sprite.py @@ -109,8 +109,6 @@ class Sprite: """ - __class_getitem__ = classmethod(types.GenericAlias) - def __init__(self, *groups): self.__g = {} # The groups the sprite is in self.__image: Optional[pygame.surface.Surface] = None From 6ec4728ae15f76fc04ddf877bfededa820d04ddc Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Mon, 9 Jun 2025 20:53:35 +0100 Subject: [PATCH 270/441] checks and quality pass --- buildconfig/stubs/pygame/sprite.pyi | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 4b1fc3019a..41fce5e0b1 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -118,14 +118,14 @@ class DirtySprite(Sprite, _SupportsDirtySprite): def _set_visible(self, val: int) -> None: ... def _get_visible(self) -> int: ... -# typevar bound to Sprite, _SupportsSprite Protocol ensures sprite +# covariant typevar bound to Sprite, _SupportsSprite Protocol ensures sprite # subclass passed to group has image and rect attributes -_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) +# covariant is required for _Group to work with any AbstractGroup +# otherwise Sprite.add/remove do not accept AbstractGroup as arguments _TSprite_co = TypeVar("_TSprite_co", bound=_SupportsSprite, covariant=True) -_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) - -# almost the same as _TSprite but bound to DirtySprite -_TDirtySprite_co = TypeVar("_TDirtySprite_co", bound=_SupportsDirtySprite, covariant=True) +_TDirtySprite_co = TypeVar( + "_TDirtySprite_co", bound=_SupportsDirtySprite, covariant=True +) # typevar for sprite or iterable of sprites, used in Group init, add and remove _SpriteOrIterable = Union[_TSprite_co, Iterable[_SpriteOrIterable[_TSprite_co]]] @@ -210,9 +210,9 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite_co]): ) def set_timing_treshold(self, time_ms: SupportsFloat) -> None: ... -class GroupSingle(AbstractGroup[_TSprite]): - sprite: _TSprite - def __init__(self, sprite: Optional[_TSprite] = None) -> None: ... +class GroupSingle(AbstractGroup[_TSprite_co]): + sprite: _TSprite_co + def __init__(self, sprite: Optional[_TSprite_co] = None) -> None: ... # argument to collide_rect must have rect attribute def collide_rect(left: _HasRect, right: _HasRect) -> bool: ... @@ -244,7 +244,9 @@ def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... -# generic for _HasRect, used in sprite collide functions +# typevars for sprite collide functions +_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) +_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) _THasRect = TypeVar("_THasRect", bound=_HasRect) def spritecollide( From 52b441d924c9d9dd05522b7a95fc3b2675f601e6 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Mon, 9 Jun 2025 21:55:15 +0100 Subject: [PATCH 271/441] Revert group's TypeVar to invariant --- buildconfig/stubs/pygame/sprite.pyi | 83 ++++++++++++++--------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 41fce5e0b1..0322369141 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -48,7 +48,7 @@ class _HasRadiusAndRect(_HasRect, Protocol): radius: float # non-generic Group, used in Sprite -_Group = AbstractGroup[_SupportsSprite] +_Group = AbstractGroup[Any] # protocol helps with structural subtyping for typevars in sprite group generics # and allows the use of any class with the required attributes and methods @@ -118,35 +118,32 @@ class DirtySprite(Sprite, _SupportsDirtySprite): def _set_visible(self, val: int) -> None: ... def _get_visible(self) -> int: ... -# covariant typevar bound to Sprite, _SupportsSprite Protocol ensures sprite +# typevar bound to Sprite, _SupportsSprite Protocol ensures sprite # subclass passed to group has image and rect attributes -# covariant is required for _Group to work with any AbstractGroup -# otherwise Sprite.add/remove do not accept AbstractGroup as arguments -_TSprite_co = TypeVar("_TSprite_co", bound=_SupportsSprite, covariant=True) -_TDirtySprite_co = TypeVar( - "_TDirtySprite_co", bound=_SupportsDirtySprite, covariant=True -) +_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) +_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) +_TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) # typevar for sprite or iterable of sprites, used in Group init, add and remove -_SpriteOrIterable = Union[_TSprite_co, Iterable[_SpriteOrIterable[_TSprite_co]]] +_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable[_TSprite]]] -class AbstractGroup(Generic[_TSprite_co]): - spritedict: dict[_TSprite_co, Optional[Union[FRect, Rect]]] +class AbstractGroup(Generic[_TSprite]): + spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... - def __iter__(self) -> Iterator[_TSprite_co]: ... + def __iter__(self) -> Iterator[_TSprite]: ... def __bool__(self) -> bool: ... def __contains__(self, item: Any) -> bool: ... - def add_internal(self, sprite: _SupportsSprite, layer: None = None) -> None: ... - def remove_internal(self, sprite: _SupportsSprite) -> None: ... - def has_internal(self, sprite: _SupportsSprite) -> bool: ... + def add_internal(self, sprite: _TSprite, layer: None = None) -> None: ... + def remove_internal(self, sprite: _TSprite) -> None: ... + def has_internal(self, sprite: _TSprite) -> bool: ... def copy(self) -> Self: ... - def sprites(self) -> list[_TSprite_co]: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... - def remove(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... - def has(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> bool: ... + def sprites(self) -> list[_TSprite]: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... + def remove(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... + def has(self, *sprites: _SpriteOrIterable[_TSprite]) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def draw( self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 @@ -158,41 +155,41 @@ class AbstractGroup(Generic[_TSprite_co]): ) -> None: ... def empty(self) -> None: ... -class Group(AbstractGroup[_TSprite_co]): - def __init__(self, *sprites: _SpriteOrIterable[_TSprite_co]) -> None: ... +class Group(AbstractGroup[_TSprite]): + def __init__(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") -class RenderPlain(Group[_TSprite_co]): ... +class RenderPlain(Group[_TSprite]): ... @deprecated("Use `pygame.sprite.Group` instead") -class RenderClear(Group[_TSprite_co]): ... +class RenderClear(Group[_TSprite]): ... -class RenderUpdates(Group[_TSprite_co]): ... +class RenderUpdates(Group[_TSprite]): ... @deprecated("Use `pygame.sprite.RenderUpdates` instead") -class OrderedUpdates(RenderUpdates[_TSprite_co]): ... +class OrderedUpdates(RenderUpdates[_TSprite]): ... -class LayeredUpdates(AbstractGroup[_TSprite_co]): +class LayeredUpdates(AbstractGroup[_TSprite]): def __init__( - self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any + self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any ) -> None: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite_co], **kwargs: Any) -> None: ... - def get_sprites_at(self, pos: Point) -> list[_TSprite_co]: ... - def get_sprite(self, idx: int) -> _TSprite_co: ... - def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite_co]: ... + def add(self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any) -> None: ... + def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... + def get_sprite(self, idx: int) -> _TSprite: ... + def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ... def layers(self) -> list[int]: ... - def change_layer(self, sprite: _SupportsSprite, new_layer: int) -> None: ... - def get_layer_of_sprite(self, sprite: _SupportsSprite) -> int: ... + def change_layer(self, sprite: _TSprite, new_layer: int) -> None: ... + def get_layer_of_sprite(self, sprite: _TSprite) -> int: ... def get_top_layer(self) -> int: ... def get_bottom_layer(self) -> int: ... - def move_to_front(self, sprite: _SupportsSprite) -> None: ... - def move_to_back(self, sprite: _SupportsSprite) -> None: ... - def get_top_sprite(self) -> _TSprite_co: ... - def get_sprites_from_layer(self, layer: int) -> list[_TSprite_co]: ... + def move_to_front(self, sprite: _TSprite) -> None: ... + def move_to_back(self, sprite: _TSprite) -> None: ... + def get_top_sprite(self) -> _TSprite: ... + def get_sprites_from_layer(self, layer: int) -> list[_TSprite]: ... def switch_layer(self, layer1_nr: int, layer2_nr: int) -> None: ... -class LayeredDirty(LayeredUpdates[_TDirtySprite_co]): +class LayeredDirty(LayeredUpdates[_TDirtySprite]): def draw( self, surface: Surface, @@ -210,9 +207,9 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite_co]): ) def set_timing_treshold(self, time_ms: SupportsFloat) -> None: ... -class GroupSingle(AbstractGroup[_TSprite_co]): - sprite: _TSprite_co - def __init__(self, sprite: Optional[_TSprite_co] = None) -> None: ... +class GroupSingle(AbstractGroup[_TSprite]): + sprite: _TSprite + def __init__(self, sprite: Optional[_TSprite] = None) -> None: ... # argument to collide_rect must have rect attribute def collide_rect(left: _HasRect, right: _HasRect) -> bool: ... @@ -244,9 +241,7 @@ def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... -# typevars for sprite collide functions -_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) -_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) +# _HasRect typevar for sprite collide functions _THasRect = TypeVar("_THasRect", bound=_HasRect) def spritecollide( From ac03a984287990cf4e79072210c16237bc1f62a0 Mon Sep 17 00:00:00 2001 From: Ignacio Maiz Date: Mon, 9 Jun 2025 22:00:06 +0100 Subject: [PATCH 272/441] specify a more correct Sprite.groups return type --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 0322369141..25f5986f07 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -106,7 +106,7 @@ class Sprite(_SupportsSprite): def remove(self, *groups: _Group) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[_Group]: ... + def groups(self) -> list[AbstractGroup[_SupportsSprite]]: ... # concrete dirty sprite implementation class class DirtySprite(Sprite, _SupportsDirtySprite): From 4fd09ebd8da32a264cec9d2984cb47392b6e5f1e Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 10 Jun 2025 09:41:36 +0530 Subject: [PATCH 273/441] Fix minor bug in dev.py --wheel flag --- dev.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev.py b/dev.py index d9651d2e7f..8858ad527a 100644 --- a/dev.py +++ b/dev.py @@ -15,6 +15,8 @@ from pathlib import Path from typing import Any, Union +from buildconfig.get_version import version + MOD_NAME = "pygame-ce" DIST_DIR = "dist" @@ -259,8 +261,9 @@ def cmd_build(self): [self.py, "-m", "pip", "wheel", "-v", "-w", wheel_dir, *install_args] ) pprint("Installing wheel") + mod_name = f"{MOD_NAME}=={version}" pip_install( - self.py, ["--no-index", "--force", "--find-links", wheel_dir, MOD_NAME] + self.py, ["--no-index", "--force", "--find-links", wheel_dir, mod_name] ) else: pprint(f"Installing in editable mode ({info_str})") From b1457991ea5ff9095670912475b139a37deb5b1d Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 00:49:46 +0200 Subject: [PATCH 274/441] wasm 3.13 build --- src_c/static.c | 127 +++++++++++++++++++++++++++++++++------------ src_c/surface.c | 60 ++++++++++++++++++++- src_py/__init__.py | 42 +++++++++------ 3 files changed, 179 insertions(+), 50 deletions(-) diff --git a/src_c/static.c b/src_c/static.c index 87c0264d14..306f819c07 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -24,7 +24,7 @@ #undef WITH_THREAD #endif -#if defined(BUILD_STATIC) +#if 1 // defined(BUILD_STATIC) #undef import_pygame_base #undef import_pygame_rect #undef import_pygame_surface @@ -33,56 +33,84 @@ #undef import_pygame_bufferproxy #undef import_pygame_rwobject #undef import_pygame_event +#undef import_pygame_imageext +#undef import_pygame_image +#undef import_pygame_font void import_pygame_base(void) { + puts("import_pygame_base"); } void import_pygame_rect(void) { + puts("import_pygame_rect"); } void import_pygame_surface(void) { + puts("import_pygame_surface"); +} + + +void +import_pygame_window(void) +{ + puts("import_pygame_window"); } void import_pygame_geometry(void) { + puts("import_pygame_geometry"); } void import_pygame_color(void) { +puts("import_pygame_color"); +} + +void +import_pygame_font(void) +{ + puts("import_pygame_font"); } +void +import_pygame_freetype(void) +{ + puts("import_pygame_freetype"); +} + + void import_pygame_bufferproxy(void) { + puts("import_pygame_bufferproxy"); } void import_pygame_rwobject(void) { + puts("import_pygame_rwobject"); } void import_pygame_event(void) { + puts("import_pygame_event"); } void import_pygame_joystick(void) { + puts("import_pygame_joystick"); } -void -import_pygame_window(void) -{ -} PyMODINIT_FUNC PyInit_base(void); @@ -198,24 +226,28 @@ void load_submodule(const char *parent, PyObject *mod, const char *alias) { char fqn[1024]; - snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); - - PyObject *modules = PyImport_GetModuleDict(); - - PyObject *pmod = PyDict_GetItemString(modules, parent); - if (!mod) { - snprintf(fqn, sizeof(fqn), "ERROR: %s.%s", parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, parent, alias); puts(fqn); PyErr_Print(); PyErr_Clear(); } else { - PyDict_SetItemString(modules, fqn, mod); - PyDict_SetItemString(PyModule_GetDict(mod), "__name__", - PyUnicode_FromString(fqn)); - PyModule_AddObjectRef(pmod, alias, mod); - Py_XDECREF(mod); + snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); + puts(fqn); + PyObject *modules = PyImport_GetModuleDict(); + + PyObject *pmod = PyDict_GetItemString(modules, parent); + if (!pmod) { + snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", parent, parent, alias); + puts(fqn); + } else { + PyDict_SetItemString(modules, fqn, mod); + PyDict_SetItemString(PyModule_GetDict(mod), "__name__", + PyUnicode_FromString(fqn)); + PyModule_AddObjectRef(pmod, alias, mod); + Py_XDECREF(mod); + } } } @@ -225,6 +257,7 @@ load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, { char fqn[1024]; snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); +puts(fqn); PyObject *modules = PyImport_GetModuleDict(); Py_DECREF(PyObject_GetAttrString(spec, "name")); @@ -255,7 +288,10 @@ load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, static PyObject * mod_pygame_import_cython(PyObject *self, PyObject *spec) { +#if 1 //PY_VERSION_HEX <= 0x030C0000 + load_submodule_mphase("pygame._sdl2", PyInit_sdl2(), spec, "sdl2"); + load_submodule_mphase("pygame._sdl2", PyInit_mixer(), spec, "mixer"); #if defined(CONTROLLER_NOPYX) load_submodule("pygame._sdl2", PyInit_controller(), "controller"); @@ -265,7 +301,7 @@ mod_pygame_import_cython(PyObject *self, PyObject *spec) #endif load_submodule_mphase("pygame._sdl2", PyInit_audio(), spec, "audio"); load_submodule_mphase("pygame._sdl2", PyInit_video(), spec, "video"); - +#endif Py_RETURN_NONE; } @@ -288,47 +324,74 @@ PyInit_pygame_static() SDL_SetHint("SDL_EMSCRIPTEN_KEYBOARD_ELEMENT", "1"); load_submodule("pygame", PyInit_base(), "base"); + + // load_submodule("pygame", PyInit_constants(), "constants"); - load_submodule("pygame", PyInit_surflock(), "surflock"); - load_submodule("pygame", PyInit_rwobject(), "rwobject"); + // load_submodule("pygame", PyInit_pg_math(), "math"); - load_submodule("pygame", PyInit_display(), "display"); - load_submodule("pygame", PyInit_surface(), "surface"); - load_submodule("pygame", PyInit_system(), "system"); - load_submodule("pygame", PyInit_key(), "key"); + // base, pygame.colordict + load_submodule("pygame", PyInit_color(), "color"); + + // base load_submodule("pygame", PyInit_rect(), "rect"); + + // base, rect load_submodule("pygame", PyInit_geometry(), "geometry"); - load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); - load_submodule("pygame", PyInit_pg_time(), "time"); - load_submodule("pygame", PyInit__freetype(), "_freetype"); - load_submodule("pygame", PyInit_imageext(), "imageext"); + load_submodule("pygame", PyInit_bufferproxy(), "bufferproxy"); + load_submodule("pygame", PyInit_surflock(), "surflock"); + // base, color, rect, bufferproxy, surflock + load_submodule("pygame", PyInit_surface(), "surface"); + + load_submodule("pygame", PyInit_rwobject(), "rwobject"); + + // base, color, rect, bufferproxy, surflock, surface, rwobject + load_submodule("pygame", PyInit_imageext(), "imageext"); + // base, color, rect, bufferproxy, surflock, surface, rwobject load_submodule("pygame", PyInit_image(), "image"); + + load_submodule("pygame", PyInit__freetype(), "_freetype"); load_submodule("pygame", PyInit_font(), "font"); load_submodule("pygame", PyInit_pixelcopy(), "pixelcopy"); load_submodule("pygame", PyInit_newbuffer(), "newbuffer"); - load_submodule("pygame", PyInit_color(), "color"); - load_submodule("pygame", PyInit_bufferproxy(), "bufferproxy"); + // base + load_submodule("pygame", PyInit_joystick(), "joystick"); + // base, joystick + load_submodule("pygame", PyInit_event(), "event"); + + // base, rect, event + load_submodule("pygame", PyInit_key(), "key"); + // base, event + load_submodule("pygame", PyInit_pg_time(), "time"); + load_submodule("pygame", PyInit_transform(), "transform"); load_submodule("pygame", PyInit_draw(), "draw"); load_submodule("pygame", PyInit_mask(), "mask"); load_submodule("pygame", PyInit_mouse(), "mouse"); - load_submodule("pygame", PyInit_event(), "event"); - load_submodule("pygame", PyInit_joystick(), "joystick"); + load_submodule("pygame", PyInit_pg_mixer(), "mixer"); load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); + // base, color, rect, bufferproxy, surflock, surface load_submodule("pygame", PyInit_window(), "window"); + + // base, color, rect, surflock, surface, window + load_submodule("pygame", PyInit_display(), "display"); load_submodule("pygame", PyInit__render(), "_render"); load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); + // base, color, rect, bufferproxy, surflock, surface + load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); + + //load_submodule("pygame", PyInit_system(), "system"); + return PyModule_Create(&mod_pygame_static); } diff --git a/src_c/surface.c b/src_c/surface.c index e8ffc6b29e..a88c50bf2e 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4595,7 +4595,7 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, } static PyMethodDef _surface_methods[] = {{NULL, NULL, 0, NULL}}; - +#if !defined(BUILD_STATIC) int exec_surface(PyObject *module) { @@ -4688,3 +4688,61 @@ MODINIT_DEFINE(surface) return PyModuleDef_Init(&_module); } +#else +MODINIT_DEFINE(surface) +{ + PyObject *module; + + static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, + "surface", + DOC_SURFACE, + -1, + _surface_methods, + NULL, + NULL, + NULL, + NULL}; + + module = PyModule_Create(&_module); + if (module == NULL) { + return NULL; + } + + _IMPORT_PYGAME_MODULE(surflock); + if (PyErr_Occurred()) { + return NULL; + } + + /* type preparation */ + if (PyType_Ready(&pgSurface_Type) < 0) { + return NULL; + } + + PyObject *apiobj; + static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; + + if (PyModule_AddObjectRef(module, "SurfaceType", (PyObject *)&pgSurface_Type)) { + return NULL; + } + + if (PyModule_AddObjectRef(module, "Surface", (PyObject *)&pgSurface_Type)) { + return NULL; + } + + /* export the c api */ + c_api[0] = &pgSurface_Type; + c_api[1] = pgSurface_New2; + c_api[2] = pgSurface_Blit; + c_api[3] = pgSurface_SetSurface; + apiobj = encapsulate_api(c_api, "surface"); + if (PyModule_Add(module, PYGAMEAPI_LOCAL_ENTRY, apiobj) < 0) { + return NULL; + } + + if (PyModule_AddObjectRef(module, "_dict", pgSurface_Type.tp_dict)) { + return NULL; + } + + return module; +} +#endif diff --git a/src_py/__init__.py b/src_py/__init__.py index c227a9e55e..a5c265206e 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -114,14 +114,16 @@ def warn(self): if pygame_static: pygame = sys.modules[__name__] - pygame.Color = pygame.color.Color + # pygame.Color = pygame.color.Color - Vector2 = pygame.math.Vector2 - Vector3 = pygame.math.Vector3 + #Vector2 = pygame.math.Vector2 + #Vector3 = pygame.math.Vector3 + #Rect = pygame.rect.Rect + #BufferProxy = pygame.bufferproxy.BufferProxy - Rect = pygame.rect.Rect + # for pygame.surface.Surface type in sprite.py ? + # surface = sys.modules["pygame.surface"] - BufferProxy = pygame.bufferproxy.BufferProxy # cython modules use multiphase initialisation when not in builtin Inittab. @@ -144,20 +146,25 @@ def warn(self): from pygame.base import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] from pygame.constants import * # now has __all__ pylint: disable=wildcard-import; lgtm[py/polluting-import] from pygame.version import * # pylint: disable=wildcard-import; lgtm[py/polluting-import] -from pygame.rect import Rect, FRect from pygame.rwobject import encode_string, encode_file_path -import pygame.surflock -import pygame.color + +import pygame.rect +Rect = pygame.rect.Rect +FRect = pygame.rect.FRect + + +import pygame.color Color = pygame.color.Color -import pygame.bufferproxy +import pygame.bufferproxy BufferProxy = pygame.bufferproxy.BufferProxy -import pygame.math +import pygame.math Vector2 = pygame.math.Vector2 Vector3 = pygame.math.Vector3 + from pygame.base import __version__ # next, the "standard" modules @@ -208,13 +215,6 @@ def warn(self): def Cursor(*args): # pylint: disable=unused-argument _attribute_undefined("pygame.Cursor") - -try: - import pygame.sprite -except (ImportError, OSError): - sprite = MissingModule("sprite", urgent=1) - - try: import pygame.pixelcopy except (ImportError, OSError): @@ -222,6 +222,7 @@ def Cursor(*args): # pylint: disable=unused-argument try: + import pygame.surflock from pygame.surface import Surface, SurfaceType except (ImportError, OSError): @@ -230,6 +231,13 @@ def Surface(size, flags, depth, masks): # pylint: disable=unused-argument SurfaceType = Surface +# sprite.py is using pygame.surface.Surface type +try: + import pygame.sprite +except (ImportError, OSError): + sprite = MissingModule("sprite", urgent=1) + + try: import pygame.mask from pygame.mask import Mask From 55296f19b6a8393a80e6a4f42951f7bda8b3e9a4 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 00:51:30 +0200 Subject: [PATCH 275/441] typo --- src_c/static.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/static.c b/src_c/static.c index 306f819c07..0d5beb0656 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -24,7 +24,7 @@ #undef WITH_THREAD #endif -#if 1 // defined(BUILD_STATIC) +#if defined(BUILD_STATIC) #undef import_pygame_base #undef import_pygame_rect #undef import_pygame_surface From b43f0dd37f0d924f706d3c88027f35bdecb7f2a8 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 00:56:18 +0200 Subject: [PATCH 276/441] cleanup --- src_c/static.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src_c/static.c b/src_c/static.c index 0d5beb0656..d883690486 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -33,84 +33,89 @@ #undef import_pygame_bufferproxy #undef import_pygame_rwobject #undef import_pygame_event -#undef import_pygame_imageext -#undef import_pygame_image -#undef import_pygame_font void import_pygame_base(void) { - puts("import_pygame_base"); } void import_pygame_rect(void) { - puts("import_pygame_rect"); } void import_pygame_surface(void) { - puts("import_pygame_surface"); } void import_pygame_window(void) { - puts("import_pygame_window"); } void import_pygame_geometry(void) { - puts("import_pygame_geometry"); } void import_pygame_color(void) { -puts("import_pygame_color"); } void import_pygame_font(void) { - puts("import_pygame_font"); } void import_pygame_freetype(void) { - puts("import_pygame_freetype"); } void import_pygame_bufferproxy(void) { - puts("import_pygame_bufferproxy"); } void import_pygame_rwobject(void) { - puts("import_pygame_rwobject"); } void import_pygame_event(void) { - puts("import_pygame_event"); } void import_pygame_joystick(void) { - puts("import_pygame_joystick"); } +#undef import_pygame_imageext +#undef import_pygame_render +#undef import_pygame_pixelarray + +void +import_pygame_imageext(void) +{ +} + +void +import_pygame_render(void) +{ +} + +void +import_pygame_pixelarray(void) +{ +} + + PyMODINIT_FUNC PyInit_base(void); From cffb75df0a045717cfcb45a423c5c67bdbba4257 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 01:05:01 +0200 Subject: [PATCH 277/441] format --- src_c/static.c | 21 +++++++++------------ src_c/surface.c | 6 ++++-- src_py/__init__.py | 14 +++++++++----- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src_c/static.c b/src_c/static.c index d883690486..843c4a4716 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -49,7 +49,6 @@ import_pygame_surface(void) { } - void import_pygame_window(void) { @@ -75,7 +74,6 @@ import_pygame_freetype(void) { } - void import_pygame_bufferproxy(void) { @@ -115,8 +113,6 @@ import_pygame_pixelarray(void) { } - - PyMODINIT_FUNC PyInit_base(void); PyMODINIT_FUNC @@ -232,7 +228,8 @@ load_submodule(const char *parent, PyObject *mod, const char *alias) { char fqn[1024]; if (!mod) { - snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, + parent, alias); puts(fqn); PyErr_Print(); PyErr_Clear(); @@ -244,9 +241,11 @@ load_submodule(const char *parent, PyObject *mod, const char *alias) PyObject *pmod = PyDict_GetItemString(modules, parent); if (!pmod) { - snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", parent, parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", + parent, parent, alias); puts(fqn); - } else { + } + else { PyDict_SetItemString(modules, fqn, mod); PyDict_SetItemString(PyModule_GetDict(mod), "__name__", PyUnicode_FromString(fqn)); @@ -262,7 +261,7 @@ load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, { char fqn[1024]; snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); -puts(fqn); + puts(fqn); PyObject *modules = PyImport_GetModuleDict(); Py_DECREF(PyObject_GetAttrString(spec, "name")); @@ -293,7 +292,7 @@ puts(fqn); static PyObject * mod_pygame_import_cython(PyObject *self, PyObject *spec) { -#if 1 //PY_VERSION_HEX <= 0x030C0000 +#if 1 // PY_VERSION_HEX <= 0x030C0000 load_submodule_mphase("pygame._sdl2", PyInit_sdl2(), spec, "sdl2"); @@ -372,14 +371,12 @@ PyInit_pygame_static() // base, event load_submodule("pygame", PyInit_pg_time(), "time"); - load_submodule("pygame", PyInit_transform(), "transform"); load_submodule("pygame", PyInit_draw(), "draw"); load_submodule("pygame", PyInit_mask(), "mask"); load_submodule("pygame", PyInit_mouse(), "mouse"); - load_submodule("pygame", PyInit_pg_mixer(), "mixer"); load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); @@ -395,7 +392,7 @@ PyInit_pygame_static() // base, color, rect, bufferproxy, surflock, surface load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); - //load_submodule("pygame", PyInit_system(), "system"); + // load_submodule("pygame", PyInit_system(), "system"); return PyModule_Create(&mod_pygame_static); } diff --git a/src_c/surface.c b/src_c/surface.c index a88c50bf2e..eff053cbe8 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4721,11 +4721,13 @@ MODINIT_DEFINE(surface) PyObject *apiobj; static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; - if (PyModule_AddObjectRef(module, "SurfaceType", (PyObject *)&pgSurface_Type)) { + if (PyModule_AddObjectRef(module, "SurfaceType", + (PyObject *)&pgSurface_Type)) { return NULL; } - if (PyModule_AddObjectRef(module, "Surface", (PyObject *)&pgSurface_Type)) { + if (PyModule_AddObjectRef(module, "Surface", + (PyObject *)&pgSurface_Type)) { return NULL; } diff --git a/src_py/__init__.py b/src_py/__init__.py index a5c265206e..ccfe90b597 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -116,15 +116,14 @@ def warn(self): # pygame.Color = pygame.color.Color - #Vector2 = pygame.math.Vector2 - #Vector3 = pygame.math.Vector3 - #Rect = pygame.rect.Rect - #BufferProxy = pygame.bufferproxy.BufferProxy + # Vector2 = pygame.math.Vector2 + # Vector3 = pygame.math.Vector3 + # Rect = pygame.rect.Rect + # BufferProxy = pygame.bufferproxy.BufferProxy # for pygame.surface.Surface type in sprite.py ? # surface = sys.modules["pygame.surface"] - # cython modules use multiphase initialisation when not in builtin Inittab. from pygame import _sdl2 @@ -150,17 +149,21 @@ def warn(self): import pygame.rect + Rect = pygame.rect.Rect FRect = pygame.rect.FRect import pygame.color + Color = pygame.color.Color import pygame.bufferproxy + BufferProxy = pygame.bufferproxy.BufferProxy import pygame.math + Vector2 = pygame.math.Vector2 Vector3 = pygame.math.Vector3 @@ -215,6 +218,7 @@ def warn(self): def Cursor(*args): # pylint: disable=unused-argument _attribute_undefined("pygame.Cursor") + try: import pygame.pixelcopy except (ImportError, OSError): From d93163d6fad9c9a3aacafb9b7ce5f48252a5b3e3 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 01:27:02 +0200 Subject: [PATCH 278/441] put pygame.system back ? --- src_c/static.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src_c/static.c b/src_c/static.c index 843c4a4716..e1d80ab472 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -49,6 +49,7 @@ import_pygame_surface(void) { } + void import_pygame_window(void) { @@ -74,6 +75,7 @@ import_pygame_freetype(void) { } + void import_pygame_bufferproxy(void) { @@ -113,6 +115,8 @@ import_pygame_pixelarray(void) { } + + PyMODINIT_FUNC PyInit_base(void); PyMODINIT_FUNC @@ -228,24 +232,20 @@ load_submodule(const char *parent, PyObject *mod, const char *alias) { char fqn[1024]; if (!mod) { - snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, - parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, parent, alias); puts(fqn); PyErr_Print(); PyErr_Clear(); } else { snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); - puts(fqn); PyObject *modules = PyImport_GetModuleDict(); PyObject *pmod = PyDict_GetItemString(modules, parent); if (!pmod) { - snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", - parent, parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", parent, parent, alias); puts(fqn); - } - else { + } else { PyDict_SetItemString(modules, fqn, mod); PyDict_SetItemString(PyModule_GetDict(mod), "__name__", PyUnicode_FromString(fqn)); @@ -261,7 +261,7 @@ load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, { char fqn[1024]; snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); - puts(fqn); + PyObject *modules = PyImport_GetModuleDict(); Py_DECREF(PyObject_GetAttrString(spec, "name")); @@ -292,8 +292,6 @@ load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, static PyObject * mod_pygame_import_cython(PyObject *self, PyObject *spec) { -#if 1 // PY_VERSION_HEX <= 0x030C0000 - load_submodule_mphase("pygame._sdl2", PyInit_sdl2(), spec, "sdl2"); load_submodule_mphase("pygame._sdl2", PyInit_mixer(), spec, "mixer"); @@ -305,7 +303,7 @@ mod_pygame_import_cython(PyObject *self, PyObject *spec) #endif load_submodule_mphase("pygame._sdl2", PyInit_audio(), spec, "audio"); load_submodule_mphase("pygame._sdl2", PyInit_video(), spec, "video"); -#endif + Py_RETURN_NONE; } @@ -371,12 +369,14 @@ PyInit_pygame_static() // base, event load_submodule("pygame", PyInit_pg_time(), "time"); + load_submodule("pygame", PyInit_transform(), "transform"); load_submodule("pygame", PyInit_draw(), "draw"); load_submodule("pygame", PyInit_mask(), "mask"); load_submodule("pygame", PyInit_mouse(), "mouse"); + load_submodule("pygame", PyInit_pg_mixer(), "mixer"); load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); @@ -392,7 +392,7 @@ PyInit_pygame_static() // base, color, rect, bufferproxy, surflock, surface load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); - // load_submodule("pygame", PyInit_system(), "system"); + load_submodule("pygame", PyInit_system(), "system"); return PyModule_Create(&mod_pygame_static); } From a12844e8ef25cb1ee76d1a8f9d1afe30d374f6c5 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 11 Jun 2025 10:07:26 +0200 Subject: [PATCH 279/441] dedup code block --- src_c/static.c | 15 ++++----- src_c/surface.c | 81 ++++++++++++------------------------------------- 2 files changed, 25 insertions(+), 71 deletions(-) diff --git a/src_c/static.c b/src_c/static.c index e1d80ab472..d40c30189c 100644 --- a/src_c/static.c +++ b/src_c/static.c @@ -49,7 +49,6 @@ import_pygame_surface(void) { } - void import_pygame_window(void) { @@ -75,7 +74,6 @@ import_pygame_freetype(void) { } - void import_pygame_bufferproxy(void) { @@ -115,8 +113,6 @@ import_pygame_pixelarray(void) { } - - PyMODINIT_FUNC PyInit_base(void); PyMODINIT_FUNC @@ -232,7 +228,8 @@ load_submodule(const char *parent, PyObject *mod, const char *alias) { char fqn[1024]; if (!mod) { - snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, + parent, alias); puts(fqn); PyErr_Print(); PyErr_Clear(); @@ -243,9 +240,11 @@ load_submodule(const char *parent, PyObject *mod, const char *alias) PyObject *pmod = PyDict_GetItemString(modules, parent); if (!pmod) { - snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", parent, parent, alias); + snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", + parent, parent, alias); puts(fqn); - } else { + } + else { PyDict_SetItemString(modules, fqn, mod); PyDict_SetItemString(PyModule_GetDict(mod), "__name__", PyUnicode_FromString(fqn)); @@ -369,14 +368,12 @@ PyInit_pygame_static() // base, event load_submodule("pygame", PyInit_pg_time(), "time"); - load_submodule("pygame", PyInit_transform(), "transform"); load_submodule("pygame", PyInit_draw(), "draw"); load_submodule("pygame", PyInit_mask(), "mask"); load_submodule("pygame", PyInit_mouse(), "mouse"); - load_submodule("pygame", PyInit_pg_mixer(), "mixer"); load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); diff --git a/src_c/surface.c b/src_c/surface.c index eff053cbe8..35b0ef1786 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4595,7 +4595,7 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, } static PyMethodDef _surface_methods[] = {{NULL, NULL, 0, NULL}}; -#if !defined(BUILD_STATIC) + int exec_surface(PyObject *module) { @@ -4630,11 +4630,11 @@ exec_surface(PyObject *module) PyObject *apiobj; static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; - +#ifndef BUILD_STATIC if (pg_warn_simd_at_runtime_but_uncompiled() < 0) { return -1; } - +#endif if (PyModule_AddObjectRef(module, "SurfaceType", (PyObject *)&pgSurface_Type)) { return -1; @@ -4664,6 +4664,7 @@ exec_surface(PyObject *module) MODINIT_DEFINE(surface) { +#ifndef BUILD_STATIC static PyModuleDef_Slot surf_slots[] = { {Py_mod_exec, &exec_surface}, #if PY_VERSION_HEX >= 0x030c0000 @@ -4675,76 +4676,32 @@ MODINIT_DEFINE(surface) {Py_mod_gil, Py_MOD_GIL_USED}, // TODO: support this later #endif {0, NULL}}; - +#endif static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "surface", DOC_SURFACE, 0, _surface_methods, +#ifndef BUILD_STATIC surf_slots, - NULL, - NULL, - NULL}; - - return PyModuleDef_Init(&_module); -} #else -MODINIT_DEFINE(surface) -{ - PyObject *module; - - static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, - "surface", - DOC_SURFACE, - -1, - _surface_methods, NULL, +#endif NULL, NULL, NULL}; - - module = PyModule_Create(&_module); - if (module == NULL) { - return NULL; - } - - _IMPORT_PYGAME_MODULE(surflock); - if (PyErr_Occurred()) { - return NULL; - } - - /* type preparation */ - if (PyType_Ready(&pgSurface_Type) < 0) { - return NULL; - } - - PyObject *apiobj; - static void *c_api[PYGAMEAPI_SURFACE_NUMSLOTS]; - - if (PyModule_AddObjectRef(module, "SurfaceType", - (PyObject *)&pgSurface_Type)) { - return NULL; - } - - if (PyModule_AddObjectRef(module, "Surface", - (PyObject *)&pgSurface_Type)) { - return NULL; - } - - /* export the c api */ - c_api[0] = &pgSurface_Type; - c_api[1] = pgSurface_New2; - c_api[2] = pgSurface_Blit; - c_api[3] = pgSurface_SetSurface; - apiobj = encapsulate_api(c_api, "surface"); - if (PyModule_Add(module, PYGAMEAPI_LOCAL_ENTRY, apiobj) < 0) { - return NULL; - } - - if (PyModule_AddObjectRef(module, "_dict", pgSurface_Type.tp_dict)) { - return NULL; +#ifndef BUILD_STATIC + return PyModuleDef_Init(&_module); +#else + // in static mode with want surface module to be ready before python types + // are evaluated eg pygame.surface.Surface in sprite.py + PyObject *module = PyModule_Create(&_module); + if (module) { + if (exec_surface(module) != 0) { + Py_DECREF(module); + return NULL; + } } - return module; -} #endif +} From 9478d266f7df35d2addf2a0923aa1e483e5e722a Mon Sep 17 00:00:00 2001 From: Ankith Date: Wed, 11 Jun 2025 15:39:00 +0530 Subject: [PATCH 280/441] Fix ASAN issues in surface scroll tests --- src_c/surface.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index e8ffc6b29e..05a90afd27 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -2780,12 +2780,12 @@ scroll_repeat(int h, int dx, int dy, int pitch, int span, int xoffset, while (h--) { if (dx > 0) { memcpy(tempbuf, linesrc + span - xoffset, xoffset); - memcpy(linesrc + xoffset, linesrc, span - xoffset); + memmove(linesrc + xoffset, linesrc, span - xoffset); memcpy(linesrc, tempbuf, xoffset); } else if (dx < 0) { memcpy(tempbuf, linesrc, -xoffset); - memcpy(linesrc, linesrc - xoffset, span + xoffset); + memmove(linesrc, linesrc - xoffset, span + xoffset); memcpy(linesrc + span + xoffset, tempbuf, -xoffset); } linesrc += pitch; @@ -2835,13 +2835,13 @@ scroll_default(int h, int dx, int dy, int pitch, int span, int xoffset, // No y-shifting, we only need to move pixels on the same line while (h--) { if (dx > 0) { - memcpy(linesrc + xoffset, linesrc, span - xoffset); + memmove(linesrc + xoffset, linesrc, span - xoffset); if (erase) { memset(linesrc, 0, xoffset); } } else if (dx < 0) { - memcpy(linesrc, linesrc - xoffset, span + xoffset); + memmove(linesrc, linesrc - xoffset, span + xoffset); if (erase) { memset(linesrc + span + xoffset, 0, -xoffset); } From bb721ed45964648d24ad5fd6baa5a46d74ff6143 Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 10 Jun 2025 18:14:11 +0530 Subject: [PATCH 281/441] Add stripped option to dev.py --- dev.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dev.py b/dev.py index 8858ad527a..7ed720a134 100644 --- a/dev.py +++ b/dev.py @@ -210,6 +210,7 @@ def cmd_build(self): debug = self.args.get("debug", False) lax = self.args.get("lax", False) sdl3 = self.args.get("sdl3", False) + stripped = self.args.get("stripped", False) sanitize = self.args.get("sanitize") coverage = self.args.get("coverage", False) if wheel_dir and coverage: @@ -248,13 +249,18 @@ def cmd_build(self): if sdl3: install_args.extend(SDL3_ARGS) + if stripped: + install_args.append("-Csetup-args=-Dstripped=true") + if coverage: install_args.extend(COVERAGE_ARGS) if sanitize: install_args.append(f"-Csetup-args=-Db_sanitize={sanitize}") - info_str = f"with {debug=}, {lax=}, {sdl3=}, and {coverage=}" + info_str = ( + f"with {debug=}, {lax=}, {sdl3=}, {stripped=}, {coverage=} and {sanitize=}" + ) if wheel_dir: pprint(f"Building wheel at '{wheel_dir}' ({info_str})") cmd_run( @@ -382,6 +388,11 @@ def parse_args(self): action="store_true", help="Build against SDL3 instead of the default SDL2", ) + build_parser.add_argument( + "--stripped", + action="store_true", + help="Generate a stripped pygame-ce build (no docs/examples/tests/stubs)", + ) build_parser.add_argument( "--sanitize", choices=[ From 070455180f0be7680938bf5f7a2255c6bd9b9cf4 Mon Sep 17 00:00:00 2001 From: Wade Cheng <86323079+wade-cheng@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:03:43 -0400 Subject: [PATCH 282/441] grammar, add "of" --- docs/reST/ref/event.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/event.rst b/docs/reST/ref/event.rst index 319f256c3e..9364dff647 100644 --- a/docs/reST/ref/event.rst +++ b/docs/reST/ref/event.rst @@ -62,7 +62,7 @@ display of its type and members. The function :func:`pygame.event.event_name()` can be used to get a string representing the name of the event type. Events that come from the system will have a guaranteed set of member -attributes based on the type. The following is a list event types with their +attributes based on the type. The following is a list of event types with their specific attributes. :: From 37c9848c9a2a576dd177f91a0906228318e57fdf Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 14 Jun 2025 10:36:51 +0530 Subject: [PATCH 283/441] Fix indentation in docs mouse example Co-authored-by: aatle <168398276+aatle@users.noreply.github.com> --- buildconfig/stubs/pygame/mouse.pyi | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/buildconfig/stubs/pygame/mouse.pyi b/buildconfig/stubs/pygame/mouse.pyi index b040d871d8..e8e32d6188 100644 --- a/buildconfig/stubs/pygame/mouse.pyi +++ b/buildconfig/stubs/pygame/mouse.pyi @@ -50,19 +50,19 @@ scroll, such as ``which`` (it will tell you what exact mouse device trigger the clock = pygame.time.Clock() def main(): - while True: - for event in pygame.event.get(): + while True: + for event in pygame.event.get(): if event.type == QUIT: - pygame.quit() - return + pygame.quit() + return elif event.type == MOUSEWHEEL: - print(event) - print(event.x, event.y) - print(event.flipped) - print(event.which) - # can access properties with - # proper notation(ex: event.y) - clock.tick(60) + print(event) + print(event.x, event.y) + print(event.flipped) + print(event.which) + # can access properties with + # proper notation(ex: event.y) + clock.tick(60) # Execute game: main() From ba59f2e4d4a76c2e467a4034661913c4ea0045b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 14 Jun 2025 11:17:29 +0200 Subject: [PATCH 284/441] Refactor alphablit --- src_c/alphablit.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 0276b813d3..80832af663 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -1189,16 +1189,16 @@ BLIT_BLEND_OP( /* --------------------------------------------------------- */ -#define SETUP_ALPHABLIT() \ - SETUP_BASE() \ - int dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ +#define SETUP_ALPHABLIT() \ + SETUP_BASE() \ + Uint32 dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ int alpha = info->src_blanket_alpha; static void alphablit_alpha(SDL_BlitInfo *info) { SETUP_ALPHABLIT() - int sAi; + Uint32 sAi; if (srcbpp == 1) { if (dstbpp == 1) { @@ -1292,7 +1292,7 @@ static void alphablit_colorkey(SDL_BlitInfo *info) { SETUP_ALPHABLIT() - int sAi; + Uint32 sAi; Uint32 colorkey = info->src_colorkey; assert(info->src_has_colorkey); From 58e4ead83084311c0a6044fb4f6444cf379898b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 14 Jun 2025 12:22:55 +0200 Subject: [PATCH 285/441] Refactor alphablit --- src_c/alphablit.c | 725 ++++++++++++++++++++++++---------------------- 1 file changed, 384 insertions(+), 341 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 80832af663..26211bf461 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -621,146 +621,165 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ - static void blit_blend_rgba_##operation(SDL_BlitInfo *info) \ - { \ - SETUP_BLIT_BLEND(tmp_variable) \ - if (!dstppa) { \ - blit_blend_##operation(info); \ - return; \ - } \ - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ - srcfmt->Gmask == dstfmt->Gmask && \ - srcfmt->Bmask == dstfmt->Bmask && \ - srcfmt->Amask == dstfmt->Amask && \ - info->src_blend != SDL_BLENDMODE_NONE) { \ - int incr = srcpxskip > 0 ? 1 : -1; \ - if (incr < 0) { \ - src += 3; \ - dst += 3; \ - } \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - REPEAT_4({ \ - code src += incr; \ - dst += incr; \ - }); \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - return; \ - } \ - if (srcbpp == 1) { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* dstbpp > 1 */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - } \ - else /* srcbpp > 1 */ \ - { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* dstbpp > 1 */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - } \ +#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ + SETUP_BLIT_BLEND(tmp_variable) \ + if (!dstppa) { \ + blit_blend_##operation(info); \ + return; \ + } \ + if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ + srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && \ + srcfmt->Amask == dstfmt->Amask && \ + info->src_blend != SDL_BLENDMODE_NONE) { \ + int incr = srcpxskip > 0 ? 1 : -1; \ + if (incr < 0) { \ + src += 3; \ + dst += 3; \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + REPEAT_4({ \ + code; \ + src += incr; \ + dst += incr; \ + }); \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ } -BLIT_BLEND_RGBA_OP(add, Uint32 tmp, - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = (*dst) + (*src); - (*dst) = (tmp <= 255 ? tmp : 255);); +static void +blit_blend_rgba_add(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = (*dst) + (*src); + (*dst) = (tmp <= 255 ? tmp : 255); + }); +} -BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, - BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = (*dst) - (*src); - (*dst) = (tmp >= 0 ? tmp : 0);); +static void +blit_blend_rgba_sub(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = (*dst) - (*src); + (*dst) = (tmp >= 0 ? tmp : 0); + }); +} -BLIT_BLEND_RGBA_OP(mul, Uint32 tmp, - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), - tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 - : 0; - (*dst) = (tmp <= 255 ? tmp : 255);); +static void +blit_blend_rgba_mul(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP( + mul, Sint32 tmp, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; + (*dst) = (tmp <= 255 ? tmp : 255); + }); +} -BLIT_BLEND_RGBA_OP( - min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), - if ((*src) < (*dst)) { (*dst) = (*src); }); +static void +blit_blend_rgba_min(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + if ((*src) < (*dst)) { + (*dst) = (*src); + } + }); +} -BLIT_BLEND_RGBA_OP( - max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), - if ((*src) > (*dst)) { (*dst) = (*src); }); +static void +blit_blend_rgba_max(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + if ((*src) > (*dst)) { + (*dst) = (*src); + } + }); +} static void blit_blend_premultiplied(SDL_BlitInfo *info) @@ -956,236 +975,260 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ #define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ - static void blit_blend_##operation(SDL_BlitInfo *info) \ - { \ - int n; \ - int width = info->width; \ - int height = info->height; \ - Uint8 *src = info->s_pixels; \ - int srcpxskip = info->s_pxskip; \ - int srcskip = info->s_skip; \ - Uint8 *dst = info->d_pixels; \ - int dstpxskip = info->d_pxskip; \ - int dstskip = info->d_skip; \ - PG_PixelFormat *srcfmt = info->src; \ - SDL_Palette *srcpal = info->src_palette; \ - PG_PixelFormat *dstfmt = info->dst; \ - SDL_Palette *dstpal = info->dst_palette; \ - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ - Uint32 pixel; \ - tmp_variable; \ - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ - if (srcbpp >= 3 && dstbpp >= 3 && \ - info->src_blend == SDL_BLENDMODE_NONE) { \ - size_t srcoffsetR, srcoffsetG, srcoffsetB; \ - size_t dstoffsetR, dstoffsetG, dstoffsetB; \ - if (srcbpp == 3) { \ - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ - } \ - else { \ - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ - } \ - if (dstbpp == 3) { \ - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ - } \ - else { \ - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ + Uint32 pixel; \ + tmp_variable; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ + int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ + if (srcbpp >= 3 && dstbpp >= 3 && \ + info->src_blend == SDL_BLENDMODE_NONE) { \ + size_t srcoffsetR, srcoffsetG, srcoffsetB; \ + size_t dstoffsetR, dstoffsetG, dstoffsetB; \ + if (srcbpp == 3) { \ + SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + else { \ + SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + if (dstbpp == 3) { \ + SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + else { \ + SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + code; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ while (height--) { \ LOOP_UNROLLED4( \ { \ - code src += srcpxskip; \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ dst += dstpxskip; \ }, \ n, width); \ src += srcskip; \ dst += dstskip; \ } \ - return; \ } \ - if (srcbpp == 1) { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ - dA); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ - else if (dstbpp == 3) { \ - size_t offsetR, offsetG, offsetB; \ - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - dst[offsetR] = dR; \ - dst[offsetG] = dG; \ - dst[offsetB] = dB; \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ - else /* even dstbpp */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ } \ - else /* srcbpp > 1 */ \ + else /* even dstbpp */ \ { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ - dA); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else if (dstbpp == 3) { \ - size_t offsetR, offsetG, offsetB; \ - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - dst[offsetR] = dR; \ - dst[offsetG] = dG; \ - dst[offsetB] = dB; \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* even dstbpp */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ } \ } -BLIT_BLEND_OP(add, Uint32 tmp, BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); - -BLIT_BLEND_OP(sub, Sint32 tmp, BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp >= 0 ? tmp : 0);); - -BLIT_BLEND_OP(mul, Uint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), - tmp = ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); - -BLIT_BLEND_OP( - min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), - if (src[srcoffsetR] < dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } if (src[srcoffsetG] < dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } if (src[srcoffsetB] < dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; +static void +blit_blend_add(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(add, Uint32 tmp, + BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); +} + +static void +blit_blend_sub(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(sub, Sint32 tmp, + BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); + }); +} + +static void +blit_blend_mul(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP( + mul, Sint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); +} + +static void +blit_blend_min(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + if (src[srcoffsetR] < dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } + if (src[srcoffsetG] < dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } + if (src[srcoffsetB] < dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + } }); +} -BLIT_BLEND_OP( - max, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), - if (src[srcoffsetR] > dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } if (src[srcoffsetG] > dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } if (src[srcoffsetB] > dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; +static void +blit_blend_max(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(min, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + if (src[srcoffsetR] > dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } + if (src[srcoffsetG] > dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } + if (src[srcoffsetB] > dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + } }); +} /* --------------------------------------------------------- */ From 9a13d0e5075cddfb82f1e30f4dc2156d46633014 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sat, 14 Jun 2025 21:22:09 +0530 Subject: [PATCH 286/441] Pull windows deps on update in meson buildconfig --- meson.build | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/meson.build b/meson.build index 9f5efdeffb..890336cdcf 100644 --- a/meson.build +++ b/meson.build @@ -94,12 +94,38 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # yes, this is a bit ugly and hardcoded but it is what it is # TODO (middle-term goal) - Should migrate away from this # consider meson wraps? Hopefully can also get the same build path as below + sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.8' + sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' + sdl_mixer_ver = '2.8.1' + sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' + arch_suffix = 'x' + host_machine.cpu_family().substring(-2) base_dir = meson.current_source_dir() prebuilt_dir = base_dir / 'prebuilt-' + arch_suffix - # download prebuilts (uses legacy builconfig code) - if not fs.is_dir(prebuilt_dir) + sdl_dir = prebuilt_dir / '@0@-@1@'.format(sdl, sdl_ver) + sdl_image_dir = prebuilt_dir / '@0@-@1@'.format(sdl_image, sdl_image_ver) + sdl_mixer_dir = prebuilt_dir / '@0@-@1@'.format(sdl_mixer, sdl_mixer_ver) + sdl_ttf_dir = prebuilt_dir / '@0@-@1@'.format(sdl_ttf, sdl_ttf_ver) + common_lib_dir = prebuilt_dir / 'lib' + + # download prebuilts (uses legacy buildconfig code) + required_dirs = [ + prebuilt_dir, + sdl_dir, + sdl_image_dir, + sdl_mixer_dir, + sdl_ttf_dir, + common_lib_dir, + ] + any_missing = false + foreach d : required_dirs + if not fs.is_dir(d) + any_missing = true + break + endif + endforeach + if any_missing run_command( [ find_program('python3', 'python'), @@ -109,15 +135,9 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') ) endif - sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.8' - sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' - sdl_mixer_ver = '2.8.1' - sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' - dlls = [] # SDL - sdl_dir = prebuilt_dir / '@0@-@1@'.format(sdl, sdl_ver) sdl_lib_dir = sdl_dir / 'lib' / arch_suffix pg_inc_dirs += fs.relative_to(sdl_dir / 'include', base_dir) pg_lib_dirs += sdl_lib_dir @@ -125,7 +145,6 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # SDL_image if get_option('image').enabled() - sdl_image_dir = prebuilt_dir / '@0@-@1@'.format(sdl_image, sdl_image_ver) sdl_image_lib_dir = sdl_image_dir / 'lib' / arch_suffix pg_inc_dirs += fs.relative_to(sdl_image_dir / 'include', base_dir) pg_lib_dirs += sdl_image_lib_dir @@ -147,7 +166,6 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # SDL_mixer if get_option('mixer').enabled() - sdl_mixer_dir = prebuilt_dir / '@0@-@1@'.format(sdl_mixer, sdl_mixer_ver) sdl_mixer_lib_dir = sdl_mixer_dir / 'lib' / arch_suffix pg_inc_dirs += fs.relative_to(sdl_mixer_dir / 'include', base_dir) pg_lib_dirs += sdl_mixer_lib_dir @@ -163,7 +181,6 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # SDL_ttf if get_option('font').enabled() - sdl_ttf_dir = prebuilt_dir / '@0@-@1@'.format(sdl_ttf, sdl_ttf_ver) sdl_ttf_lib_dir = sdl_ttf_dir / 'lib' / arch_suffix pg_inc_dirs += fs.relative_to(sdl_ttf_dir / 'include', base_dir) pg_lib_dirs += sdl_ttf_lib_dir @@ -172,7 +189,6 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # freetype, portmidi and porttime if get_option('freetype').enabled() and get_option('midi').enabled() - common_lib_dir = prebuilt_dir / 'lib' pg_inc_dirs += fs.relative_to(prebuilt_dir / 'include', base_dir) pg_lib_dirs += common_lib_dir dlls += [common_lib_dir / 'freetype.dll', common_lib_dir / 'portmidi.dll'] From a93e75122961aed63f3374c1cc1e9f8742380e11 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 14 Jun 2025 01:19:22 -0700 Subject: [PATCH 287/441] Use PyModule_AddType Not exhaustive, but gets in most places it's immediately practical to. --- src_c/_freetype.c | 8 +------- src_c/_sdl2/controller.c | 9 +-------- src_c/bufferproxy.c | 8 +------- src_c/color.c | 7 +------ src_c/geometry.c | 12 ++---------- src_c/newbuffer.c | 14 ++------------ src_c/pixelarray.c | 8 +------- src_c/time.c | 7 +------ src_c/window.c | 6 +----- 9 files changed, 11 insertions(+), 68 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 512693dfb6..a9a0fc503c 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2368,11 +2368,6 @@ MODINIT_DEFINE(_freetype) return NULL; } - /* type preparation */ - if (PyType_Ready(&pgFont_Type) < 0) { - return NULL; - } - module = PyModule_Create(&_freetypemodule); if (!module) { @@ -2383,8 +2378,7 @@ MODINIT_DEFINE(_freetype) FREETYPE_MOD_STATE(module)->cache_size = 0; FREETYPE_MOD_STATE(module)->resolution = PGFT_DEFAULT_RESOLUTION; - if (PyModule_AddObjectRef(module, FONT_TYPE_NAME, - (PyObject *)&pgFont_Type)) { + if (PyModule_AddType(module, &pgFont_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/_sdl2/controller.c b/src_c/_sdl2/controller.c index 648af64a09..282694b826 100644 --- a/src_c/_sdl2/controller.c +++ b/src_c/_sdl2/controller.c @@ -584,14 +584,7 @@ MODINIT_DEFINE(controller) return NULL; } - if (PyType_Ready(&pgController_Type) < 0) { - return NULL; - } - - Py_INCREF(&pgController_Type); - if (PyModule_AddObject(module, "Controller", - (PyObject *)&pgController_Type)) { - Py_DECREF(&pgController_Type); + if (PyModule_AddType(module, &pgController_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/bufferproxy.c b/src_c/bufferproxy.c index 7e06e9b939..6041757fee 100644 --- a/src_c/bufferproxy.c +++ b/src_c/bufferproxy.c @@ -591,11 +591,6 @@ MODINIT_DEFINE(bufferproxy) return NULL; } - /* prepare exported types */ - if (PyType_Ready(&pgBufferProxy_Type) < 0) { - return NULL; - } - #define bufferproxy_docs "" /* create the module */ @@ -604,8 +599,7 @@ MODINIT_DEFINE(bufferproxy) return NULL; } - if (PyModule_AddObjectRef(module, "BufferProxy", - (PyObject *)&pgBufferProxy_Type)) { + if (PyModule_AddType(module, &pgBufferProxy_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/color.c b/src_c/color.c index b7cea27266..694a7853d9 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -2516,18 +2516,13 @@ MODINIT_DEFINE(color) return NULL; } - /* type preparation */ - if (PyType_Ready(&pgColor_Type) < 0) { - goto error; - } - /* create the module */ module = PyModule_Create(&_module); if (!module) { goto error; } - if (PyModule_AddObjectRef(module, "Color", (PyObject *)&pgColor_Type)) { + if (PyModule_AddType(module, &pgColor_Type)) { goto error; } if (PyModule_AddObjectRef(module, "THECOLORS", _COLORDICT)) { diff --git a/src_c/geometry.c b/src_c/geometry.c index b7164da6fe..f935168e5d 100644 --- a/src_c/geometry.c +++ b/src_c/geometry.c @@ -27,25 +27,17 @@ MODINIT_DEFINE(geometry) return NULL; } - if (PyType_Ready(&pgCircle_Type) < 0) { - return NULL; - } - - if (PyType_Ready(&pgLine_Type) < 0) { - return NULL; - } - module = PyModule_Create(&_module); if (!module) { return NULL; } - if (PyModule_AddObjectRef(module, "Circle", (PyObject *)&pgCircle_Type)) { + if (PyModule_AddType(module, &pgCircle_Type)) { Py_DECREF(module); return NULL; } - if (PyModule_AddObjectRef(module, "Line", (PyObject *)&pgLine_Type)) { + if (PyModule_AddType(module, &pgLine_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/newbuffer.c b/src_c/newbuffer.c index fdba603c88..d2416a81ac 100644 --- a/src_c/newbuffer.c +++ b/src_c/newbuffer.c @@ -853,14 +853,6 @@ MODINIT_DEFINE(newbuffer) NULL, NULL}; - /* prepare exported types */ - if (PyType_Ready(&Py_buffer_Type) < 0) { - return NULL; - } - if (PyType_Ready(&BufferMixin_Type) < 0) { - return NULL; - } - #define bufferproxy_docs "" /* create the module */ @@ -869,13 +861,11 @@ MODINIT_DEFINE(newbuffer) return NULL; } - if (PyModule_AddObjectRef(module, "BufferMixin", - (PyObject *)&BufferMixin_Type)) { + if (PyModule_AddType(module, &BufferMixin_Type)) { Py_DECREF(module); return NULL; } - if (PyModule_AddObjectRef(module, "Py_buffer", - (PyObject *)&Py_buffer_Type)) { + if (PyModule_AddType(module, &Py_buffer_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/pixelarray.c b/src_c/pixelarray.c index 9523b05e36..447b63787e 100644 --- a/src_c/pixelarray.c +++ b/src_c/pixelarray.c @@ -1926,18 +1926,12 @@ MODINIT_DEFINE(pixelarray) return NULL; } - /* type preparation */ - if (PyType_Ready(&pgPixelArray_Type)) { - return NULL; - } - /* create the module */ module = PyModule_Create(&_module); if (!module) { return NULL; } - if (PyModule_AddObjectRef(module, "PixelArray", - (PyObject *)&pgPixelArray_Type)) { + if (PyModule_AddType(module, &pgPixelArray_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/time.c b/src_c/time.c index e0b8d955c8..3bc180e8a4 100644 --- a/src_c/time.c +++ b/src_c/time.c @@ -743,18 +743,13 @@ MODINIT_DEFINE(time) return NULL; } - /* type preparation */ - if (PyType_Ready(&PyClock_Type) < 0) { - return NULL; - } - /* create the module */ module = PyModule_Create(&_module); if (!module) { return NULL; } - if (PyModule_AddObjectRef(module, "Clock", (PyObject *)&PyClock_Type)) { + if (PyModule_AddType(module, &PyClock_Type)) { Py_DECREF(module); return NULL; } diff --git a/src_c/window.c b/src_c/window.c index f2976df502..5c0b88e1e8 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -1491,17 +1491,13 @@ MODINIT_DEFINE(window) return NULL; } - if (PyType_Ready(&pgWindow_Type) < 0) { - return NULL; - } - /* create the module */ module = PyModule_Create(&_module); if (module == 0) { return NULL; } - if (PyModule_AddObjectRef(module, "Window", (PyObject *)&pgWindow_Type)) { + if (PyModule_AddType(module, &pgWindow_Type)) { Py_DECREF(module); return NULL; } From 5795334435fa48acd38f92cd119822bfa9ac046d Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 18:41:30 +0300 Subject: [PATCH 288/441] Test Check visually if everything is correct, to continue the translation. --- docs/readmes/README.gr.rst | 225 +++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 docs/readmes/README.gr.rst diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst new file mode 100644 index 0000000000..8f991fe924 --- /dev/null +++ b/docs/readmes/README.gr.rst @@ -0,0 +1,225 @@ +.. image:: https://raw.githubusercontent.com/pygame-community/pygame-ce/main/docs/reST/_static/pygame_ce_logo.svg + :width: 800 + :alt: pygame + :target: https://pyga.me/ + + +|DocsStatus| +|PyPiVersion| |PyPiLicense| +|Python3| |GithubCommits| |BlackFormatBadge| + +**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά_` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. +Χρησιμοποιεί το `Simple DirectMedia Layer library`_ και πολλές άλλες +δημοφιλείς βιβλιοθήκες για να χρησιμοποιήσει αφαιρετικά τις περισσότερες βασικές συναρτήσεις, +έτσι κάνοντας τη γραφή αυτών των προγραμμάτων μια πιο διαισθητική εργασία. + +Αυτή η διανομή ονομάζεται **'pygame - Έκδοση Κοινότητας'** ('pygame-ce' για συντομία). + +Είναι μια διακλάδωση από το αποθετήριο προέλευσης του έργου pygame από τους πρώην κεντρικούς προγραμματιστές, +και δημιουργήθηκε μετά από απίθανες προκλήσεις που τους απέτρεψαν να συνεχίσουν την ανάπτυξη στο αποθετήριο προέλευσης. +Η νέα διανομή στοχεύει στο να προσφέρει πιο συνεχή εκδόσεις, πολλαπλές διορθώσεις προβλημάτων και βελτιώσεις, +και ένα πιο δημοκρατικό μοντέλο διακυβέρνησης. + +Νέοι συνεισφέροντες είναι ευπρόσδεκτοι! + + +Εγκατάσταση +------------ + +:: + + pip install pygame-ce + + +Help +Βοήθεια +---- + +If you are just getting started with pygame, you should be able to +get started fairly quickly. Pygame comes with many tutorials and +introductions. There is also full reference documentation for the +entire library. Browse the documentation on the `docs page`_. You +can also browse the documentation locally by running +``python -m pygame.docs`` in your terminal. If the docs aren't found +locally, it'll launch the online website instead. + +The online documentation stays up to date with the development version +of pygame on github. This may be a bit newer than the version of pygame +you are using. To upgrade to the latest full release, run +``pip install pygame-ce --upgrade`` in your terminal. + +Best of all, the examples directory has many playable small programs +which can get you started playing with the code right away. + + +Building From Source +-------------------- + +If you want to use features that are currently in development, +or you want to contribute to pygame-ce, you will need to build pygame-ce +locally from its source code, rather than pip installing it. + +Installing from source is fairly automated. The most work will +involve compiling and installing all the pygame dependencies. Once +that is done, run the ``setup.py`` script which will attempt to +auto-configure, build, and install pygame. + +Much more information about installing and compiling is available +on the `Compilation wiki page`_. + + +Credits +------- + +Thanks to everyone who has helped contribute to this library. +Special thanks are also in order. + +* Marcus Von Appen: many changes, and fixes, 1.7.1+ freebsd maintainer +* Lenard Lindstrom: the 1.8+ windows maintainer, many changes, and fixes +* Brian Fisher for svn auto builder, bug tracker and many contributions +* Rene Dudfield: many changes, and fixes, 1.7+ release manager/maintainer +* Phil Hassey for his work on the pygame.org website +* DR0ID for his work on the sprite module +* Richard Goedeken for his smoothscale function +* Ulf Ekström for his pixel perfect collision detection code +* Pete Shinners: original author +* David Clark for filling the right-hand-man position +* Ed Boraas and Francis Irving: Debian packages +* Maxim Sobolev: FreeBSD packaging +* Bob Ippolito: macOS and OS X porting (much work!) +* Jan Ekhol, Ray Kelm, and Peter Nicolai: putting up with early design ideas +* Nat Pryce for starting our unit tests +* Dan Richter for documentation work +* TheCorruptor for his incredible logos and graphics +* Nicholas Dudfield: many test improvements +* Alex Folkner for pygame-ctypes + +Thanks to those sending in patches and fixes: Niki Spahiev, Gordon +Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman, +Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Herve Cauwelier, +James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias +Spiller, Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya, +Eyal Lotem, Regis Desgroppes, Emmanuel Hainry, Randy Kaelber, +Matthew L Daniel, Nirav Patel, Forrest Voight, Charlie Nolan, +Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine, +Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske, +Cambell Barton. + +And our bug hunters above and beyond: Angus, Guillaume Proux, Frank +Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck, +Michael Benfield, David Lau + +There's many more folks out there who've submitted helpful ideas, kept +this project going, and basically made our life easier. Thanks! + +Many thank you's for people making documentation comments, and adding to the +`pygame documentation`_ and the `pygame-ce documentation`_. + +Also many thanks for people creating games and putting them on the +pygame.org website for others to learn from and enjoy. + +Lots of thanks to James Paige for hosting the pygame bugzilla. + +Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our +excellent hosting. + +Dependencies +------------ + +Pygame is obviously strongly dependent on SDL and Python. It also +links to and embeds several other smaller libraries. The font +module relies on SDL_ttf, which is dependent on freetype. The mixer +(and mixer.music) modules depend on SDL_mixer. The image module +depends on SDL_image. Transform.rotozoom has an embedded version +of SDL_rotozoom, and gfxdraw has an embedded version of SDL_gfx. +Dependency versions: + + ++----------+------------------------+ +| CPython | >= 3.9 (Or use PyPy3) | ++----------+------------------------+ +| SDL | >= 2.0.14 | ++----------+------------------------+ +| SDL_mixer| >= 2.0.4 | ++----------+------------------------+ +| SDL_image| >= 2.0.4 | ++----------+------------------------+ +| SDL_ttf | >= 2.0.15 | ++----------+------------------------+ + +How to Contribute +----------------- +First of all, thank you for considering contributing to pygame-ce! It's people like you that make pygame-ce a great library. Please follow these steps to get started: + +1. Read the `Contribution Guidelines`_ and the `Many Ways to Contribute`_ wiki pages. +2. Read the documentataion on `Opening A Pull Request`_ and `Opening a Great Pull Request`_. +3. Read how to `label and link reported issues`_. +4. Check the `issue tracker`_ for open issues that interest you or open a new issue to start a discussion about your idea. + +There are many more resources throughout the `wiki pages`_ that can help you get started. + +If you have any questions, please feel free to ask in the `Pygame Community Discord Server`_ or open an issue. + +License +------- +**License Identifier:** LGPL-2.1-or-later + +This library is distributed under `GNU LGPL version 2.1`_, which can +be found in the file ``docs/LGPL.txt``. We reserve the right to place +future versions of this library under a different license. + +This basically means you can use pygame in any project you want, +but if you make any changes or additions to pygame itself, those +must be released with a compatible license (preferably submitted +back to the pygame-ce project). Closed source and commercial games are fine. + +The programs in the ``examples`` subdirectory are in the public domain. + +See docs/licenses for licenses of dependencies. + + +.. |PyPiVersion| image:: https://img.shields.io/pypi/v/pygame-ce.svg?v=1 + :target: https://pypi.python.org/pypi/pygame-ce + +.. |PyPiLicense| image:: https://img.shields.io/pypi/l/pygame-ce.svg?v=1 + :target: https://pypi.python.org/pypi/pygame-ce + +.. |Python3| image:: https://img.shields.io/badge/python-3-blue.svg?v=1 + +.. |GithubCommits| image:: https://img.shields.io/github.amrom.workers.devmits-since/pygame-community/pygame-ce/2.5.2.svg + :target: https://github.com/pygame-community/pygame-ce/compare/2.5.3...main + +.. |DocsStatus| image:: https://img.shields.io/website?down_message=offline&label=docs&up_message=online&url=https%3A%2F%2Fpyga.me%2Fdocs%2F + :target: https://pyga.me/docs/ + +.. |BlackFormatBadge| image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + +.. _Pygame: https://pyga.me +.. _pygame-ce documentation: https://pyga.me/docs/ +.. _pygame documentation: https://www.pygame.org/docs/ +.. _Simple DirectMedia Layer library: https://www.libsdl.org +.. _Compilation wiki page: https://github.com/pygame-community/pygame-ce/wiki#compiling +.. _docs page: https://pyga.me/docs +.. _GNU LGPL version 2.1: https://www.gnu.org/copyleft/lesser.html +.. _Contribution Guidelines: https://github.com/pygame-community/pygame-ce/wiki/Contribution-guidelines +.. _Many Ways to Contribute: https://github.com/pygame-community/pygame-ce/wiki/Many-ways-to-contribute +.. _Opening A Pull Request: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-pull-request +.. _Opening a Great Pull Request: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-great-pull-request +.. _issue tracker: https://github.com/pygame-community/pygame-ce/issues +.. _label and link reported issues: https://github.com/pygame-community/pygame-ce/wiki/Labelling-&-linking-reported-issues +.. _Pygame Community Discord Server: https://discord.gg/pygame +.. _wiki pages: https://github.com/pygame-community/pygame-ce/wiki + +.. _简体中文: ./docs/readmes/README.zh-cn.rst +.. _繁體中文: ./docs/readmes/README.zh-tw.rst +.. _Français: ./docs/readmes/README.fr.rst +.. _فارسی: ./docs/readmes/README.fa.rst +.. _Español: ./docs/readmes/README.es.rst +.. _日本語: ./docs/readmes/README.ja.rst +.. _Italiano: ./docs/readmes/README.it.rst +.. _Русский: ./docs/readmes/README.ru.rst +.. _Ελληνικά: ./docs/readmes/README.gr.rst From 447d6862b8e813dfd72d0d4a50d9cb9ae78e0bc5 Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 19:07:49 +0300 Subject: [PATCH 289/441] add references --- README.rst | 3 ++- docs/readmes/README.es.rst | 3 ++- docs/readmes/README.fa.rst | 3 ++- docs/readmes/README.fr.rst | 3 ++- docs/readmes/README.gr.rst | 19 +++++++++---------- docs/readmes/README.it.rst | 3 ++- docs/readmes/README.ja.rst | 3 ++- docs/readmes/README.ru.rst | 3 ++- docs/readmes/README.zh-cn.rst | 4 ++-- docs/readmes/README.zh-tw.rst | 5 ++++- 10 files changed, 29 insertions(+), 20 deletions(-) diff --git a/README.rst b/README.rst index 946991bedd..f1f4bc426b 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ +**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ is a free and open-source cross-platform library @@ -222,3 +222,4 @@ See docs/licenses for licenses of dependencies. .. _日本語: ./docs/readmes/README.ja.rst .. _Italiano: ./docs/readmes/README.it.rst .. _Русский: ./docs/readmes/README.ru.rst +.. _Ελληνικά: ./docs/readmes/README.gr.rst diff --git a/docs/readmes/README.es.rst b/docs/readmes/README.es.rst index 205ea5b14c..5f1f28f9ff 100644 --- a/docs/readmes/README.es.rst +++ b/docs/readmes/README.es.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ **Español** `日本語`_ `Italiano`_ `Русский`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ **Español** `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ --------------------------------------------------------------------------------------------------------------------------------------------------- @@ -173,3 +173,4 @@ Consulta docs/licenses para ver las licencias de dependencia. .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.fa.rst b/docs/readmes/README.fa.rst index 99c70fdcba..72fc571c83 100644 --- a/docs/readmes/README.fa.rst +++ b/docs/readmes/README.fa.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ **فارسی** `Español`_ `日本語`_ `Italiano`_ `Русский`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ **فارسی** `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ --------------------------------------------------------------------------------------------------- کتابخانه @@ -259,3 +259,4 @@ LGPL-2.1-or-later **شناسه مجوز:** .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.fr.rst b/docs/readmes/README.fr.rst index e77a2376c6..ed7372b7d3 100644 --- a/docs/readmes/README.fr.rst +++ b/docs/readmes/README.fr.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ **Français** `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ +`English`_ `简体中文`_ `繁體中文`_ **Français** `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ --------------------------------------------------------------------------------------------------------------------------------------------------- @@ -213,3 +213,4 @@ Voir les docs/licences pour les licences des dépendances. .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index 8f991fe924..d6a146baf9 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά_` +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ **Ελληνικά** ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. @@ -214,12 +214,11 @@ See docs/licenses for licenses of dependencies. .. _Pygame Community Discord Server: https://discord.gg/pygame .. _wiki pages: https://github.com/pygame-community/pygame-ce/wiki -.. _简体中文: ./docs/readmes/README.zh-cn.rst -.. _繁體中文: ./docs/readmes/README.zh-tw.rst -.. _Français: ./docs/readmes/README.fr.rst -.. _فارسی: ./docs/readmes/README.fa.rst -.. _Español: ./docs/readmes/README.es.rst -.. _日本語: ./docs/readmes/README.ja.rst -.. _Italiano: ./docs/readmes/README.it.rst -.. _Русский: ./docs/readmes/README.ru.rst -.. _Ελληνικά: ./docs/readmes/README.gr.rst +.. _简体中文: README.zh-cn.rst +.. _繁體中文: README.zh-tw.rst +.. _English: ./../../README.rst +.. _فارسی: README.fa.rst +.. _Español: README.es.rst +.. _日本語: README.ja.rst +.. _Italiano: README.it.rst +.. _Русский: README.ru.rst diff --git a/docs/readmes/README.it.rst b/docs/readmes/README.it.rst index 496eeb8b11..12986fa12a 100644 --- a/docs/readmes/README.it.rst +++ b/docs/readmes/README.it.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ **Italiano** `Русский`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ **Italiano** `Русский`_ `Ελληνικά`_ --------------------------------------------------------------------------------------------------- Pygame_ è una libreria open source gratuita e multipiattaforma @@ -227,3 +227,4 @@ Controlla docs/licenses per le licenze dei requisiti. .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.ja.rst b/docs/readmes/README.ja.rst index be55955dcc..fb473cbff8 100644 --- a/docs/readmes/README.ja.rst +++ b/docs/readmes/README.ja.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English` `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ **日本語** `Italiano`_ `Русский`_ +`English` `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ **日本語** `Italiano`_ `Русский`_ `Ελληνικά`_ --------------------------------------------------------------------------------------------------- @@ -241,3 +241,4 @@ gfxdraw には SDL_gfx の埋め込みバージョンが含まれています。 .. _Español: README.es.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.ru.rst b/docs/readmes/README.ru.rst index 2a7d12f084..8ff8cb2b16 100644 --- a/docs/readmes/README.ru.rst +++ b/docs/readmes/README.ru.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ **Русский** +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ **Русский** `Ελληνικά`_ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ - бесплатная кроссплатформенная библиотека с открытым исходным кодом @@ -222,3 +222,4 @@ License .. _Español: README.es.rst .. _日本語: README.ja.rst .. _Italiano: README.it.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.zh-cn.rst b/docs/readmes/README.zh-cn.rst index 98fec8dadd..b9924f1970 100644 --- a/docs/readmes/README.zh-cn.rst +++ b/docs/readmes/README.zh-cn.rst @@ -7,8 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ **简体中文** `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ - +`English`_ **简体中文** `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ ---- Pygame_ 是一款自由且开源的跨平台库,用于开发电子游戏等多媒体应用。Pygame基于 `Simple DirectMedia Layer library`_ 以及其他几个广受欢迎的库,汲取其中最常见的函数,让编写游戏成为更加符合直觉的事情。 @@ -163,3 +162,4 @@ pygame显然依赖于SDL和Python。此外pygame还嵌入了几个较小的库 .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst diff --git a/docs/readmes/README.zh-tw.rst b/docs/readmes/README.zh-tw.rst index 30cbb6d6eb..aee049be8e 100644 --- a/docs/readmes/README.zh-tw.rst +++ b/docs/readmes/README.zh-tw.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ +`English`_ `繁體中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ ---- Pygame_ 是一款自由且開源的跨平台程式庫,用於開發電子遊戲等多媒體應用。Pygame基於 `Simple DirectMedia Layer library`_ 以及其他幾個廣受歡迎的程式庫,提取其中最常見的函數,讓編寫遊戲成為更符合直覺的事情。 @@ -178,3 +178,6 @@ pygame顯然依賴SDL和Python。此外pygame也嵌入了幾個較小的函式 .. _Français: README.fr.rst .. _فارسی: README.fa.rst .. _Español: README.es.rst +.. _日本語: README.ja.rst +.. _Italiano: README.it.rst +.. _Ελληνικά: README.gr.rst From 52e36158a2345cb0f7982c83f2d1e8cb2a312011 Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 19:18:21 +0300 Subject: [PATCH 290/441] typo --- docs/readmes/README.gr.rst | 5 ++--- docs/readmes/README.zh-tw.rst | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index d6a146baf9..b1acb9cc53 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -14,9 +14,9 @@ Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. Χρησιμοποιεί το `Simple DirectMedia Layer library`_ και πολλές άλλες δημοφιλείς βιβλιοθήκες για να χρησιμοποιήσει αφαιρετικά τις περισσότερες βασικές συναρτήσεις, -έτσι κάνοντας τη γραφή αυτών των προγραμμάτων μια πιο διαισθητική εργασία. +κάνοντας έτσι τη γραφή αυτών των προγραμμάτων μια πιο διαισθητική εργασία. -Αυτή η διανομή ονομάζεται **'pygame - Έκδοση Κοινότητας'** ('pygame-ce' για συντομία). +Αυτή η διανομή ονομάζεται **'pygame - Community Edition'** ('pygame-ce' για συντομία). Είναι μια διακλάδωση από το αποθετήριο προέλευσης του έργου pygame από τους πρώην κεντρικούς προγραμματιστές, και δημιουργήθηκε μετά από απίθανες προκλήσεις που τους απέτρεψαν να συνεχίσουν την ανάπτυξη στο αποθετήριο προέλευσης. @@ -34,7 +34,6 @@ Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα pip install pygame-ce -Help Βοήθεια ---- diff --git a/docs/readmes/README.zh-tw.rst b/docs/readmes/README.zh-tw.rst index aee049be8e..ba05c7203f 100644 --- a/docs/readmes/README.zh-tw.rst +++ b/docs/readmes/README.zh-tw.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `繁體中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ ---- Pygame_ 是一款自由且開源的跨平台程式庫,用於開發電子遊戲等多媒體應用。Pygame基於 `Simple DirectMedia Layer library`_ 以及其他幾個廣受歡迎的程式庫,提取其中最常見的函數,讓編寫遊戲成為更符合直覺的事情。 From 403d8bfe8b07a1f6384af7f53ee27f052141e878 Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 19:23:55 +0300 Subject: [PATCH 291/441] refrence fix --- docs/readmes/README.gr.rst | 1 + docs/readmes/README.zh-tw.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index b1acb9cc53..9ac901ef9e 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -216,6 +216,7 @@ See docs/licenses for licenses of dependencies. .. _简体中文: README.zh-cn.rst .. _繁體中文: README.zh-tw.rst .. _English: ./../../README.rst +.. _Français: README.fr.rst .. _فارسی: README.fa.rst .. _Español: README.es.rst .. _日本語: README.ja.rst diff --git a/docs/readmes/README.zh-tw.rst b/docs/readmes/README.zh-tw.rst index ba05c7203f..3c8f8d2e58 100644 --- a/docs/readmes/README.zh-tw.rst +++ b/docs/readmes/README.zh-tw.rst @@ -180,4 +180,5 @@ pygame顯然依賴SDL和Python。此外pygame也嵌入了幾個較小的函式 .. _Español: README.es.rst .. _日本語: README.ja.rst .. _Italiano: README.it.rst +.. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst From f6292123e0495692e778230b19a1e95e17cfc308 Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 23:09:24 +0300 Subject: [PATCH 292/441] translation --- docs/readmes/README.gr.rst | 138 +++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 68 deletions(-) diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index 9ac901ef9e..44c67b729a 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -11,16 +11,16 @@ `English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ **Ελληνικά** ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. +To Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. Χρησιμοποιεί το `Simple DirectMedia Layer library`_ και πολλές άλλες δημοφιλείς βιβλιοθήκες για να χρησιμοποιήσει αφαιρετικά τις περισσότερες βασικές συναρτήσεις, κάνοντας έτσι τη γραφή αυτών των προγραμμάτων μια πιο διαισθητική εργασία. -Αυτή η διανομή ονομάζεται **'pygame - Community Edition'** ('pygame-ce' για συντομία). +Αυτή η διανομή(distribution) ονομάζεται **'pygame - Community Edition'** ('pygame-ce' για συντομία). -Είναι μια διακλάδωση από το αποθετήριο προέλευσης του έργου pygame από τους πρώην κεντρικούς προγραμματιστές, -και δημιουργήθηκε μετά από απίθανες προκλήσεις που τους απέτρεψαν να συνεχίσουν την ανάπτυξη στο αποθετήριο προέλευσης. -Η νέα διανομή στοχεύει στο να προσφέρει πιο συνεχή εκδόσεις, πολλαπλές διορθώσεις προβλημάτων και βελτιώσεις, +Είναι μια διακλάδωση(fork) από το αποθετήριο προέλευσης(upstream) του project pygame από τους πρώην κεντρικούς προγραμματιστές, +και δημιουργήθηκε μετά από απίθανες προκλήσεις που τους απέτρεψαν να συνεχίσουν την ανάπτυξη στο αποθετήριο προέλευσης(upstream). +Η νέα διανομή(distribution) στοχεύει στο να προσφέρει πιο συνεχή εκδόσεις, πολλαπλές διορθώσεις σφαλμάτων και βελτιώσεις, και ένα πιο δημοκρατικό μοντέλο διακυβέρνησης. Νέοι συνεισφέροντες είναι ευπρόσδεκτοι! @@ -37,44 +37,45 @@ Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα Βοήθεια ---- -If you are just getting started with pygame, you should be able to -get started fairly quickly. Pygame comes with many tutorials and -introductions. There is also full reference documentation for the -entire library. Browse the documentation on the `docs page`_. You -can also browse the documentation locally by running -``python -m pygame.docs`` in your terminal. If the docs aren't found -locally, it'll launch the online website instead. +Αν μόλις ξεκινάτε με το pygame, θα πρέπει να +ξεκινήσετε σχετικά εύκολα. Το pygame έρχεται με αρκετά βοηθητικά υλικά +και εισαγωγές. Επίσης υπάρχουν αρκετές αναφορές στις τεκμηριώσεις +όλης της βιβλιοθήκης. Ξεφυλλίστε τις τεκμηριώσεις στο `docs page`_. Επιπλέον +μπορείτε να ξεφυλλίσετε τις τεκμηριώσεις τοπικά εκτελώντας +``python -m pygame.docs`` στο τερματικό σας. Αν οι τεκμηριώσεις δεν βρεθούν +τοπικά, θα ανοίξει την διαδικτυακή ιστοσελίδα. -The online documentation stays up to date with the development version -of pygame on github. This may be a bit newer than the version of pygame -you are using. To upgrade to the latest full release, run -``pip install pygame-ce --upgrade`` in your terminal. +Η διαδικτυακή τεκμηρίωση παραμένει ενημερωμένη με την έκδοση ανάπτυξης +του pygame στο github. Ίσως είναι λίγο νεότερη από την έκδοση του pygame +που χρησιμοποιείς. Για να αναβαθμίσεις στην τελευταία έκδοση, εκτελέστε +``pip install pygame-ce --upgrade`` στο τερματικό σας. -Best of all, the examples directory has many playable small programs -which can get you started playing with the code right away. +Το καλύτερο από όλα, ο κατάλογος με τα παραδείγματα έχει αρκετά εκτελέσιμα μικρά προγράμματα. +όπου μπορούν να σε κάνουν να αρχίσεις να ασχολείσαι κατευθείαν με τον κώδικα. -Building From Source +Μεταγλώττιση από τον πηγαίο κώδικα -------------------- -If you want to use features that are currently in development, -or you want to contribute to pygame-ce, you will need to build pygame-ce -locally from its source code, rather than pip installing it. +Αν θέλεις να χρησιμοποιείς χαρακτηριστικά τα οποία είναι σε ανάπτυξη +ή θέλεις να συνεισφέρεις στο pygame-ce, θα πρέπει να μεταγλωττίσεις το pygame-ce +τοπικά από τον πηγαίο κώδικα, αντί για την εγκατάσταση μέσω pip. -Installing from source is fairly automated. The most work will -involve compiling and installing all the pygame dependencies. Once -that is done, run the ``setup.py`` script which will attempt to -auto-configure, build, and install pygame. +Η εγκατάσταση απο τον πηγαίο κώδικα είναι κυρίος αυτοματοποίημένη. Η περισώτερη δουλέια θα +εμπλέκει μεταγλώττιση και εγκατάσταση των εξαρτήσεων του pygame. Μόλις +ολοκληρωθεί, τρέξτε το setup.py script που θα προσπαθήσει να +προσαρμοστή αυτόματα, μεταγλωττίσει και εγκαταστήσει το pygame. -Much more information about installing and compiling is available -on the `Compilation wiki page`_. +Περισσότερες πληροφορίες σχετικά με την εγκατάσταση και τη μεταγλώττιση είναι διαθέσιμες +στο `Compilation wiki page`_. -Credits +Ευχαριστίες ------- -Thanks to everyone who has helped contribute to this library. -Special thanks are also in order. +Ευχαριστούμε όλους όσους έχουν βοηθήσει συνεισφέροντας στην βιβλιοθήκη. +Ιδιαίτερες ευχαριστίες είναι επίσης στη σειρά. + * Marcus Von Appen: many changes, and fixes, 1.7.1+ freebsd maintainer * Lenard Lindstrom: the 1.8+ windows maintainer, many changes, and fixes @@ -96,7 +97,7 @@ Special thanks are also in order. * Nicholas Dudfield: many test improvements * Alex Folkner for pygame-ctypes -Thanks to those sending in patches and fixes: Niki Spahiev, Gordon +Ευχαριστούμε όσους στέλνουν διορθώσεις και επιδιορθώσεις: Niki Spahiev, Gordon Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman, Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Herve Cauwelier, James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias @@ -107,34 +108,35 @@ Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine, Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske, Cambell Barton. -And our bug hunters above and beyond: Angus, Guillaume Proux, Frank +Και στους κυνηγούς σφαλμάτων μας που ξεπερνούν κάθε προσδοκία: Angus, Guillaume Proux, Frank Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck, Michael Benfield, David Lau -There's many more folks out there who've submitted helpful ideas, kept -this project going, and basically made our life easier. Thanks! +Είναι αρκετοί άλλοι που έχουν υποβάλει βοηθητικές ιδέες, κρατώντας +το project να συνεχίσει, και βασικά έχουν κάνει τη ζωή μας πιο εύκολη. Ευχαριστούμε! + +Πολλές ευχαριστίες σε όσους κάνουν σχόλια στην τεκμηρίωση και προσθέτουν στο +`pygame documentation`_ και στο `pygame-ce documentation`_. -Many thank you's for people making documentation comments, and adding to the -`pygame documentation`_ and the `pygame-ce documentation`_. +Επίσης πολλές ευχαριστίες σε όσους δημιουργούν παιχνίδια και τα ανεβάζουν στην +pygame.org ιστοσελίδα ώστε άλλοι να μάθουν και να τα απολαύσουν. -Also many thanks for people creating games and putting them on the -pygame.org website for others to learn from and enjoy. +Πολλές ευχαριστίες στον James Paige για τη φιλοξενία του pygame bugzilla. -Lots of thanks to James Paige for hosting the pygame bugzilla. +Επίσης ένα μεγάλο ευχαριστώ στον Roger Dingledine και την ομάδα στο SEUL.ORG για την εξαιρετική +φιλοξενία μας. -Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our -excellent hosting. -Dependencies +Εξαρτήσεις ------------ -Pygame is obviously strongly dependent on SDL and Python. It also -links to and embeds several other smaller libraries. The font -module relies on SDL_ttf, which is dependent on freetype. The mixer -(and mixer.music) modules depend on SDL_mixer. The image module -depends on SDL_image. Transform.rotozoom has an embedded version -of SDL_rotozoom, and gfxdraw has an embedded version of SDL_gfx. -Dependency versions: +Το pygame είναι προφανώς δυνατά εξαρτημένο από SDL και Python. Επίσης +συνδέει και ενσωματώνει διάφορες άλλες μικρές βιβλιοθήκες. Το πρόγραμμα +της γραμματοσειράς βασίζεται στο SDL_ttf, το οποίο είναι εξαρτημένο από το freetype. Τα mixer +(και mixer.music) προγράμματα βασίζονται στο SDL_mixer. Το πρόγραμμα της εικόνας +βασίζεται στο SDL_image. Το Transform.rotozoom έχει μια ενσωματωμένη έκδοση +του SDL_rotozoom, και το gfxdraw έχει μια ενσωματωμένη έκδοση του SDL_gfx. +Έκδοσεις εξαρτήσεων: +----------+------------------------+ @@ -149,35 +151,35 @@ Dependency versions: | SDL_ttf | >= 2.0.15 | +----------+------------------------+ -How to Contribute +Πώς να συνεισφέρεται ----------------- -First of all, thank you for considering contributing to pygame-ce! It's people like you that make pygame-ce a great library. Please follow these steps to get started: +Πρώτα απ’ όλα, σας ευχαριστούμε που σκέφτεστε να συνεισφέρετε στο pygame-ce! Είναι άνθρωποι σαν κι εσάς που κάνουν το pygame-ce μια εξαιρετική βιβλιοθήκη. Παρακαλούμε ακολουθήστε τα παρακάτω βήματα για να ξεκινήσετε: -1. Read the `Contribution Guidelines`_ and the `Many Ways to Contribute`_ wiki pages. -2. Read the documentataion on `Opening A Pull Request`_ and `Opening a Great Pull Request`_. -3. Read how to `label and link reported issues`_. -4. Check the `issue tracker`_ for open issues that interest you or open a new issue to start a discussion about your idea. +1. Διαβάστε τις `Contribution Guidelines`_ και `Many Ways to Contribute`_ wiki σελίδες. +2. Διαβάστε τις τεκμηριώσεις στο `Opening A Pull Request`_ και `Opening a Great Pull Request`_. +3. Διαβάστε το πως να `label and link reported issues`_. +4. Τσεκάρετε το `issue tracker`_ για ανοιχτά προβλήματα που σας ενδιαφέρουν ή ανοίξτε δικό σας πρόβλημα για να ξεκινήσετε μια συζήτηση σχετικά με την ιδέα σας. -There are many more resources throughout the `wiki pages`_ that can help you get started. +Υπάρχουν πολλά ακόμα μέσα στο `wiki pages`_ που μπορούν να σας βοηθήσουν να ξεκινήσετε. -If you have any questions, please feel free to ask in the `Pygame Community Discord Server`_ or open an issue. +Αν έχετε οποιεσδήποτε ερωτήσεις, μη διστάσετε να ρωτήσετε στο `Pygame Community Discord Server`_ ή να ανοίξετε ένα θέμα. -License +Άδεια ------- **License Identifier:** LGPL-2.1-or-later -This library is distributed under `GNU LGPL version 2.1`_, which can -be found in the file ``docs/LGPL.txt``. We reserve the right to place -future versions of this library under a different license. +Αυτή η βιβλιοθήκη διανέμεται υπό την άδεια `GNU LGPL version 2.1`_, η οποία +βρίσκεται στο αρχείο ``docs/LGPL.txt``. Διατηρούμε το δικαίωμα να θέσουμε +μελλοντικές εκδόσεις αυτής της βιβλιοθήκης υπό διαφορετική άδεια. -This basically means you can use pygame in any project you want, -but if you make any changes or additions to pygame itself, those -must be released with a compatible license (preferably submitted -back to the pygame-ce project). Closed source and commercial games are fine. +Αυτό σημαίνει ουσιαστικά ότι μπορείτε να χρησιμοποιείτε το pygame σε οποιοδήποτε project θέλετε, +αλλά αν κάνετε οποιεσδήποτε αλλαγές ή προσθήκες στο ίδιο το pygame, αυτές πρέπει να +κυκλοφορήσουν με συμβατή άδεια (κατά προτίμηση να υποβληθούν πίσω στο pygame-ce project). Τα +κλειστά προγράμματα και τα εμπορικά παιχνίδια είναι αποδεκτά. -The programs in the ``examples`` subdirectory are in the public domain. +Τα προγράμματα στο ``examples`` υποφάκελο βρίσκονται στο δημόσιο τομέα. -See docs/licenses for licenses of dependencies. +Δείτε τα docs/licenses για τις άδειες των εξαρτήσεων. .. |PyPiVersion| image:: https://img.shields.io/pypi/v/pygame-ce.svg?v=1 From 97fb9242248d67a1fc869cafec85a9828f687140 Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 23:35:42 +0300 Subject: [PATCH 293/441] typo --- docs/readmes/README.gr.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index 44c67b729a..587d8eef89 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -61,7 +61,7 @@ To Pygame_ είναι μια ελεύθερη και ανοικτού κώδικ ή θέλεις να συνεισφέρεις στο pygame-ce, θα πρέπει να μεταγλωττίσεις το pygame-ce τοπικά από τον πηγαίο κώδικα, αντί για την εγκατάσταση μέσω pip. -Η εγκατάσταση απο τον πηγαίο κώδικα είναι κυρίος αυτοματοποίημένη. Η περισώτερη δουλέια θα +Η εγκατάσταση απο τον πηγαίο κώδικα είναι κυρίως αυτοματοποίημένη. Η περισσότερη δουλέια θα εμπλέκει μεταγλώττιση και εγκατάσταση των εξαρτήσεων του pygame. Μόλις ολοκληρωθεί, τρέξτε το setup.py script που θα προσπαθήσει να προσαρμοστή αυτόματα, μεταγλωττίσει και εγκαταστήσει το pygame. From 3a5566a8f9c98499c018f1435a7cdb33a7e2f97e Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 15 Jun 2025 23:40:47 +0300 Subject: [PATCH 294/441] typo2 --- docs/readmes/README.gr.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index 587d8eef89..b898029b5a 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -155,7 +155,7 @@ pygame.org ιστοσελίδα ώστε άλλοι να μάθουν και ν ----------------- Πρώτα απ’ όλα, σας ευχαριστούμε που σκέφτεστε να συνεισφέρετε στο pygame-ce! Είναι άνθρωποι σαν κι εσάς που κάνουν το pygame-ce μια εξαιρετική βιβλιοθήκη. Παρακαλούμε ακολουθήστε τα παρακάτω βήματα για να ξεκινήσετε: -1. Διαβάστε τις `Contribution Guidelines`_ και `Many Ways to Contribute`_ wiki σελίδες. +1. Διαβάστε το `Contribution Guidelines`_ και `Many Ways to Contribute`_ wiki σελίδες. 2. Διαβάστε τις τεκμηριώσεις στο `Opening A Pull Request`_ και `Opening a Great Pull Request`_. 3. Διαβάστε το πως να `label and link reported issues`_. 4. Τσεκάρετε το `issue tracker`_ για ανοιχτά προβλήματα που σας ενδιαφέρουν ή ανοίξτε δικό σας πρόβλημα για να ξεκινήσετε μια συζήτηση σχετικά με την ιδέα σας. From 9e95ede97b71f263a70e51ec58f17e0c9b19ad74 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 15 Jun 2025 17:51:04 -0700 Subject: [PATCH 295/441] Simplify alphablit.c macros --- src_c/alphablit.c | 116 +++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 26211bf461..d1e2b82709 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -594,7 +594,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define SETUP_BASE() \ +#define SETUP_BASE \ int n; \ int width = info->width; \ int height = info->height; \ @@ -613,16 +613,15 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; -#define SETUP_BLIT_BLEND(...) \ - SETUP_BASE() \ - __VA_ARGS__; \ +#define SETUP_BLIT_BLEND \ + SETUP_BASE \ int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ - SETUP_BLIT_BLEND(tmp_variable) \ +#define BLIT_BLEND_RGBA_OP(operation, blend_function, code) \ + SETUP_BLIT_BLEND \ if (!dstppa) { \ blit_blend_##operation(info); \ return; \ @@ -734,7 +733,8 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, static void blit_blend_rgba_add(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + Uint32 tmp; + BLIT_BLEND_RGBA_OP(add, BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { tmp = (*dst) + (*src); (*dst) = (tmp <= 255 ? tmp : 255); @@ -744,7 +744,8 @@ blit_blend_rgba_add(SDL_BlitInfo *info) static void blit_blend_rgba_sub(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + Sint32 tmp; + BLIT_BLEND_RGBA_OP(sub, BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { tmp = (*dst) - (*src); (*dst) = (tmp >= 0 ? tmp : 0); @@ -754,17 +755,17 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) static void blit_blend_rgba_mul(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP( - mul, Sint32 tmp, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; - (*dst) = (tmp <= 255 ? tmp : 255); - }); + Sint32 tmp; + BLIT_BLEND_RGBA_OP(mul, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; + (*dst) = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_rgba_min(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_RGBA_OP(min, BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { if ((*src) < (*dst)) { (*dst) = (*src); } @@ -774,7 +775,7 @@ blit_blend_rgba_min(SDL_BlitInfo *info) static void blit_blend_rgba_max(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_RGBA_OP(max, BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { if ((*src) > (*dst)) { (*dst) = (*src); } @@ -784,7 +785,7 @@ blit_blend_rgba_max(SDL_BlitInfo *info) static void blit_blend_premultiplied(SDL_BlitInfo *info) { - SETUP_BLIT_BLEND() + SETUP_BLIT_BLEND if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; @@ -974,7 +975,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ +#define BLIT_BLEND_OP(blend_function, code) \ int n; \ int width = info->width; \ int height = info->height; \ @@ -992,7 +993,6 @@ blit_blend_premultiplied(SDL_BlitInfo *info) int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; \ - tmp_variable; \ int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ if (srcbpp >= 3 && dstbpp >= 3 && \ @@ -1153,55 +1153,55 @@ blit_blend_premultiplied(SDL_BlitInfo *info) static void blit_blend_add(SDL_BlitInfo *info) { - BLIT_BLEND_OP(add, Uint32 tmp, - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - }); + Uint32 tmp; + BLIT_BLEND_OP(BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_sub(SDL_BlitInfo *info) { - BLIT_BLEND_OP(sub, Sint32 tmp, - BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); - }); + Sint32 tmp; + BLIT_BLEND_OP(BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); + }); } static void blit_blend_mul(SDL_BlitInfo *info) { - BLIT_BLEND_OP( - mul, Sint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - }); + Sint32 tmp; + BLIT_BLEND_OP(BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_min(SDL_BlitInfo *info) { - BLIT_BLEND_OP(min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_OP(BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { if (src[srcoffsetR] < dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } @@ -1217,7 +1217,7 @@ blit_blend_min(SDL_BlitInfo *info) static void blit_blend_max(SDL_BlitInfo *info) { - BLIT_BLEND_OP(min, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_OP(BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { if (src[srcoffsetR] > dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } @@ -1232,15 +1232,15 @@ blit_blend_max(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define SETUP_ALPHABLIT() \ - SETUP_BASE() \ +#define SETUP_ALPHABLIT \ + SETUP_BASE \ Uint32 dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ int alpha = info->src_blanket_alpha; static void alphablit_alpha(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT Uint32 sAi; if (srcbpp == 1) { @@ -1334,7 +1334,7 @@ alphablit_alpha(SDL_BlitInfo *info) static void alphablit_colorkey(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT Uint32 sAi; Uint32 colorkey = info->src_colorkey; @@ -1463,7 +1463,7 @@ alphablit_colorkey(SDL_BlitInfo *info) static void alphablit_solid(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT if (srcbpp == 1) { if (dstbpp == 1) { From 4bbeccf19f78651d04add3cce97f2bf0bd43d57f Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 15 Jun 2025 18:44:44 -0700 Subject: [PATCH 296/441] Rename alphablit.c macro args --- src_c/alphablit.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index d1e2b82709..c8e4ba67c5 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -620,7 +620,8 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, blend_function, code) \ +#define BLIT_BLEND_RGBA_OP(operation, BLEND_CODE, \ + BLEND_CODE_32BIT_SPECIALIZED) \ SETUP_BLIT_BLEND \ if (!dstppa) { \ blit_blend_##operation(info); \ @@ -639,7 +640,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, LOOP_UNROLLED4( \ { \ REPEAT_4({ \ - code; \ + BLEND_CODE_32BIT_SPECIALIZED \ src += incr; \ dst += incr; \ }); \ @@ -657,7 +658,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, { \ GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -676,7 +677,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -697,7 +698,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ srcppa); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -718,7 +719,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -975,7 +976,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define BLIT_BLEND_OP(blend_function, code) \ +#define BLIT_BLEND_OP(BLEND_CODE, BLEND_CODE_32BIT_SPECIALIZED) \ int n; \ int width = info->width; \ int height = info->height; \ @@ -1014,7 +1015,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) while (height--) { \ LOOP_UNROLLED4( \ { \ - code; \ + BLEND_CODE_32BIT_SPECIALIZED \ src += srcpxskip; \ dst += dstpxskip; \ }, \ @@ -1031,7 +1032,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) { \ GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1051,7 +1052,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ dst[offsetR] = dR; \ dst[offsetG] = dG; \ dst[offsetB] = dB; \ @@ -1072,7 +1073,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1093,7 +1094,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ srcppa); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1115,7 +1116,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ dst[offsetR] = dR; \ dst[offsetG] = dG; \ dst[offsetB] = dB; \ @@ -1138,7 +1139,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ From c94eff221d4e92e4760f0a503c9be6e32d05106c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 06:45:47 +0000 Subject: [PATCH 297/441] Bump pypa/cibuildwheel from 2.23.2 to 3.0.0 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 2.23.2 to 3.0.0. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v2.23.2...v3.0.0) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 7f4a007931..6aa04d85e6 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -118,7 +118,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.2 + uses: pypa/cibuildwheel@v3.0.0 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index bf05a982de..540f1aa8f2 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -74,7 +74,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v2.23.2 + uses: pypa/cibuildwheel@v3.0.0 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index abdf3c099b..66a53bd2fc 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -43,7 +43,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v2.23.2 + uses: pypa/cibuildwheel@v3.0.0 - uses: actions/upload-artifact@v4 with: From c825dcb6f0f65f03d8c4163b1963afb03263c1c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 06:46:19 +0000 Subject: [PATCH 298/441] Bump actions/attest-build-provenance from 2.3.0 to 2.4.0 Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/actions/attest-build-provenance/releases) - [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest-build-provenance/compare/v2.3.0...v2.4.0) --- updated-dependencies: - dependency-name: actions/attest-build-provenance dependency-version: 2.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-gh-draft.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index 5f21601dba..51c22ac642 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -41,7 +41,7 @@ jobs: run: echo "VER=${GITHUB_REF_NAME#'release/'}" >> $GITHUB_OUTPUT - name: Generate release attestation - uses: actions/attest-build-provenance@v2.3.0 + uses: actions/attest-build-provenance@v2.4.0 with: subject-path: "pygame-wheels/*" From ab26b5ca4615413f564c9efaff54edd8323d67cc Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 16 Jun 2025 21:42:50 -0500 Subject: [PATCH 299/441] Added Joystick.set_led --- docs/reST/ref/joystick.rst | 15 +++++++++++++++ src_c/doc/joystick_doc.h | 1 + src_c/joystick.c | 24 ++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/docs/reST/ref/joystick.rst b/docs/reST/ref/joystick.rst index 555c549489..738091b11b 100644 --- a/docs/reST/ref/joystick.rst +++ b/docs/reST/ref/joystick.rst @@ -356,6 +356,21 @@ variable. See :ref:`environment variables ` for more deta .. ## Joystick.stop_rumble ## + .. method:: set_led + + | :sl:`Set the LED color of the joystick` + | :sg:`set_led(color_arg) -> bool` + + Set the color of the LED on the joystick. The argument is a ``pygame.Color`` + instance or a tuple of RGB(A) values (alpha being ignored). The color + will be set to the joystick's LED, if it has one. If the joystick does + not have an LED, then this method will do nothing and return False. + Returns True if the LED was set successfully. + + .. versionadded:: 2.5.6 + + .. ## Joystick.set_led ## + .. ## pygame.joystick.Joystick ## .. ## pygame.joystick ## diff --git a/src_c/doc/joystick_doc.h b/src_c/doc/joystick_doc.h index e022a47337..a98635580f 100644 --- a/src_c/doc/joystick_doc.h +++ b/src_c/doc/joystick_doc.h @@ -23,3 +23,4 @@ #define DOC_JOYSTICK_JOYSTICK_GETHAT "get_hat(hat_number, /) -> x, y\nget the position of a joystick hat" #define DOC_JOYSTICK_JOYSTICK_RUMBLE "rumble(low_frequency, high_frequency, duration) -> bool\nStart a rumbling effect" #define DOC_JOYSTICK_JOYSTICK_STOPRUMBLE "stop_rumble() -> None\nStop any rumble effect playing" +#define DOC_JOYSTICK_JOYSTICK_SETLED "set_led(color_arg) -> bool\nSet the LED color of the joystick" diff --git a/src_c/joystick.c b/src_c/joystick.c index 518e25756e..c94270003c 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -531,6 +531,29 @@ joy_get_hat(PyObject *self, PyObject *args) return pg_tuple_couple_from_values_int(px, py); } +static PyObject * +joy_set_led(PyObject *self, PyObject *arg) +{ + SDL_Joystick *joy = pgJoystick_AsSDL(self); + + JOYSTICK_INIT_CHECK(); + if (!joy) { + return RAISE(pgExc_SDLError, "Joystick not initialized"); + } + + Uint8 colors[4] = {0, 0, 0, 0}; + + if (!pg_RGBAFromObj(arg, colors)) { + return RAISE(PyExc_TypeError, + "set_led must be passed in a Color-compatible argument"); + } + + if (SDL_JoystickSetLED(joy, colors[0], colors[1], colors[2]) < 0) { + Py_RETURN_FALSE; + } + Py_RETURN_TRUE; +} + static PyMethodDef joy_methods[] = { {"init", joy_init, METH_NOARGS, DOC_JOYSTICK_JOYSTICK_INIT}, {"quit", joy_quit, METH_NOARGS, DOC_JOYSTICK_JOYSTICK_QUIT}, @@ -560,6 +583,7 @@ static PyMethodDef joy_methods[] = { {"get_numhats", joy_get_numhats, METH_NOARGS, DOC_JOYSTICK_JOYSTICK_GETNUMHATS}, {"get_hat", joy_get_hat, METH_VARARGS, DOC_JOYSTICK_JOYSTICK_GETHAT}, + {"set_led", joy_set_led, METH_O, DOC_JOYSTICK_JOYSTICK_SETLED}, {NULL, NULL, 0, NULL}}; From 53c0310261f84c4442ee8f747b1aa31bca24e3b8 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 16 Jun 2025 22:02:46 -0500 Subject: [PATCH 300/441] SDL3 compat for joy_set_led --- src_c/joystick.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src_c/joystick.c b/src_c/joystick.c index c94270003c..c9d19874d2 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -548,10 +548,19 @@ joy_set_led(PyObject *self, PyObject *arg) "set_led must be passed in a Color-compatible argument"); } +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (SDL_JoystickSetLED(joy, colors[0], colors[1], colors[2]) < 0) { Py_RETURN_FALSE; } Py_RETURN_TRUE; +#else + // SDL3 renames the function and sets an error message on failure + bool result = SDL_SetJoystickLED(joy, colors[0], colors[1], colors[2]); + if (!result) { + printf("%s\n", SDL_GetError()); + } + return PyBool_FromLong(result); +#endif } static PyMethodDef joy_methods[] = { From 6cb9bd94135ae11144cfccdcb6110161b255bbe1 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Mon, 16 Jun 2025 22:09:41 -0500 Subject: [PATCH 301/441] Stubs for Joystick.set_led --- buildconfig/stubs/pygame/joystick.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildconfig/stubs/pygame/joystick.pyi b/buildconfig/stubs/pygame/joystick.pyi index a04e212636..0dbb55a496 100644 --- a/buildconfig/stubs/pygame/joystick.pyi +++ b/buildconfig/stubs/pygame/joystick.pyi @@ -1,5 +1,6 @@ from typing import final +from pygame import Color from typing_extensions import deprecated # added in 3.13 def init() -> None: ... @@ -31,6 +32,7 @@ class JoystickType: self, low_frequency: float, high_frequency: float, duration: int ) -> bool: ... def stop_rumble(self) -> None: ... + def set_led(self, color: Color | tuple[int, int, int]) -> bool: ... # according to the current implementation, Joystick is a function that returns # a JoystickType instance. In the future, when the C implementation is fixed to From fc8c84965cc94c449b02a8251945bbc74fac6552 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Mon, 16 Jun 2025 23:13:53 -0700 Subject: [PATCH 302/441] Remove unused code in mask/alphablit The mask module C API is undocumented and unused within pygame-ce. Also removes two strange extern declarations in alphablit.c for functions that are not referenced in the codebase. --- src_c/alphablit.c | 4 ---- src_c/include/pygame_mask.h | 13 ------------- src_c/mask.c | 11 +---------- src_c/mask.h | 1 - 4 files changed, 1 insertion(+), 28 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index e7fbad010a..73b2c6097c 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -61,10 +61,6 @@ blit_blend_premultiplied(SDL_BlitInfo *info); static int SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect, int blend_flags); -extern int -SDL_RLESurface(SDL_Surface *surface); -extern void -SDL_UnRLESurface(SDL_Surface *surface, int recode); static int SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, diff --git a/src_c/include/pygame_mask.h b/src_c/include/pygame_mask.h index 6cad8aed30..70919672bf 100644 --- a/src_c/include/pygame_mask.h +++ b/src_c/include/pygame_mask.h @@ -29,17 +29,4 @@ typedef struct { #define pgMask_AsBitmap(x) (((pgMaskObject *)x)->mask) -#ifndef PYGAMEAPI_MASK_INTERNAL - -#include "pgimport.h" - -PYGAMEAPI_DEFINE_SLOTS(mask); - -#define pgMask_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(mask, 0)) -#define pgMask_Check(x) ((x)->ob_type == &pgMask_Type) - -#define import_pygame_mask() _IMPORT_PYGAME_MODULE(mask) - -#endif /* ~PYGAMEAPI_MASK_INTERNAL */ - #endif /* ~PGMASK_H */ diff --git a/src_c/mask.c b/src_c/mask.c index 901e6e219a..f5e83f75f1 100644 --- a/src_c/mask.c +++ b/src_c/mask.c @@ -2667,8 +2667,7 @@ static PyMethodDef _mask_methods[] = { MODINIT_DEFINE(mask) { - PyObject *module, *apiobj; - static void *c_api[PYGAMEAPI_MASK_NUMSLOTS]; + PyObject *module; static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "mask", @@ -2720,13 +2719,5 @@ MODINIT_DEFINE(mask) return NULL; } - /* export the c api */ - c_api[0] = &pgMask_Type; - apiobj = encapsulate_api(c_api, "mask"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { - Py_XDECREF(apiobj); - Py_DECREF(module); - return NULL; - } return module; } diff --git a/src_c/mask.h b/src_c/mask.h index 45ad8c515e..05a2369a25 100644 --- a/src_c/mask.h +++ b/src_c/mask.h @@ -2,6 +2,5 @@ #define PGMASK_INTERNAL_H #include "include/pygame_mask.h" -#define PYGAMEAPI_MASK_NUMSLOTS 1 #endif /* ~PGMASK_INTERNAL_H */ From d8e0768b882e491ee98d71be20c622bb620e5f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 17 Jun 2025 10:37:49 +0200 Subject: [PATCH 303/441] Fix init functions with SDL3 build --- src_c/_pygame.h | 7 +++++++ src_c/_sdl2/controller.c | 2 +- src_c/display.c | 2 +- src_c/joystick.c | 2 +- src_c/mixer.c | 2 +- src_c/time.c | 10 +++++----- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index d2d747dc23..c46211e888 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -151,6 +151,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_EventEnabled(type) SDL_EventEnabled(type) #define PG_SetJoystickEventsEnabled(enabled) \ SDL_SetJoystickEventsEnabled(enabled) +#define PG_InitSubSystem(flags) SDL_InitSubSystem(flags) #define PG_FIND_VNUM_MAJOR(ver) SDL_VERSIONNUM_MAJOR(ver) #define PG_FIND_VNUM_MINOR(ver) SDL_VERSIONNUM_MINOR(ver) @@ -316,6 +317,12 @@ PG_MapRGB(PG_PixelFormat *format, const SDL_Palette *palette, Uint8 r, Uint8 g, return SDL_MapRGB(format, r, g, b); } +static inline bool +PG_InitSubSystem(Uint32 flags) +{ + return SDL_InitSubSystem(flags) == 0; +} + /* Mask to test if surface flags are in a fullscreen window. * SDL_WINDOW_FULLSCREEN_DESKTOP works here because it also contains * SDL_WINDOW_FULLSCREEN. */ diff --git a/src_c/_sdl2/controller.c b/src_c/_sdl2/controller.c index 282694b826..9819d1aa71 100644 --- a/src_c/_sdl2/controller.c +++ b/src_c/_sdl2/controller.c @@ -26,7 +26,7 @@ static PyObject * controller_module_init(PyObject *module, PyObject *_null) { if (!SDL_WasInit(SDL_INIT_GAMECONTROLLER)) { - if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER)) { + if (!PG_InitSubSystem(SDL_INIT_GAMECONTROLLER)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } diff --git a/src_c/display.c b/src_c/display.c index 8f72dcbcc6..6934ca808d 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -242,7 +242,7 @@ pg_display_init(PyObject *self, PyObject *_null) return NULL; } - if (SDL_InitSubSystem(SDL_INIT_VIDEO)) { + if (!PG_InitSubSystem(SDL_INIT_VIDEO)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } diff --git a/src_c/joystick.c b/src_c/joystick.c index 518e25756e..ce3c763cf2 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -39,7 +39,7 @@ static PyObject * init(PyObject *self, PyObject *_null) { if (!SDL_WasInit(SDL_INIT_JOYSTICK)) { - if (SDL_InitSubSystem(SDL_INIT_JOYSTICK)) { + if (!PG_InitSubSystem(SDL_INIT_JOYSTICK)) { return RAISE(pgExc_SDLError, SDL_GetError()); } PG_SetJoystickEventsEnabled(SDL_TRUE); diff --git a/src_c/mixer.c b/src_c/mixer.c index 19872ec9ea..fedce77bd3 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -444,7 +444,7 @@ _init(int freq, int size, int channels, int chunk, char *devicename, SDL_setenv("SDL_AUDIODRIVER", "directsound", 1); } - if (SDL_InitSubSystem(SDL_INIT_AUDIO)) { + if (!PG_InitSubSystem(SDL_INIT_AUDIO)) { return RAISE(pgExc_SDLError, SDL_GetError()); } diff --git a/src_c/time.c b/src_c/time.c index 3bc180e8a4..349f8bd8d3 100644 --- a/src_c/time.c +++ b/src_c/time.c @@ -325,7 +325,7 @@ accurate_delay(Sint64 ticks) #if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_WasInit(SDL_INIT_TIMER)) { - if (SDL_InitSubSystem(SDL_INIT_TIMER)) { + if (!PG_InitSubSystem(SDL_INIT_TIMER)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } @@ -389,7 +389,7 @@ time_wait(PyObject *self, PyObject *arg) #if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_WasInit(SDL_INIT_TIMER)) { - if (SDL_InitSubSystem(SDL_INIT_TIMER)) { + if (!PG_InitSubSystem(SDL_INIT_TIMER)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } @@ -479,7 +479,7 @@ time_set_timer(PyObject *self, PyObject *args, PyObject *kwargs) #if !SDL_VERSION_ATLEAST(3, 0, 0) /* just doublecheck that timer is initialized */ if (!SDL_WasInit(SDL_INIT_TIMER)) { - if (SDL_InitSubSystem(SDL_INIT_TIMER)) { + if (!PG_InitSubSystem(SDL_INIT_TIMER)) { ecode = PG_TIMER_SDL_ERROR; goto end; } @@ -549,7 +549,7 @@ clock_tick_base(pgClockObject *self, PyObject *arg, int use_accurate_delay) #if !SDL_VERSION_ATLEAST(3, 0, 0) /*just doublecheck that timer is initialized*/ if (!SDL_WasInit(SDL_INIT_TIMER)) { - if (SDL_InitSubSystem(SDL_INIT_TIMER)) { + if (!PG_InitSubSystem(SDL_INIT_TIMER)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } @@ -671,7 +671,7 @@ clock_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) #if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_WasInit(SDL_INIT_TIMER)) { - if (SDL_InitSubSystem(SDL_INIT_TIMER)) { + if (!PG_InitSubSystem(SDL_INIT_TIMER)) { return RAISE(pgExc_SDLError, SDL_GetError()); } } From 2299db02044d55ba11398be71d4547ef55ba0b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 17 Jun 2025 11:30:30 +0200 Subject: [PATCH 304/441] Fix init functions with SDL3 build --- src_c/base.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src_c/base.c b/src_c/base.c index 654e73404a..a3f189cf4c 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -348,10 +348,11 @@ pg_init(PyObject *self, PyObject *_null) /*nice to initialize timer, so startup time will reflec pg_init() time*/ #if defined(WITH_THREAD) && !defined(MS_WIN32) && defined(SDL_INIT_EVENTTHREAD) - pg_sdl_was_init = SDL_Init(SDL_INIT_EVENTTHREAD | PG_INIT_TIMER | - PG_INIT_NOPARACHUTE) == 0; + pg_sdl_was_init = PG_InitSubSystem(SDL_INIT_EVENTTHREAD | PG_INIT_TIMER | + PG_INIT_NOPARACHUTE) == 0; #else - pg_sdl_was_init = SDL_Init(PG_INIT_TIMER | PG_INIT_NOPARACHUTE) == 0; + pg_sdl_was_init = + PG_InitSubSystem(PG_INIT_TIMER | PG_INIT_NOPARACHUTE) == 0; #endif pg_env_blend_alpha_SDL2 = SDL_getenv("PYGAME_BLEND_ALPHA_SDL2") != NULL; From 5b6ecba8f5085e6bf728d26e78d5837789a50236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Tue, 17 Jun 2025 12:11:44 +0200 Subject: [PATCH 305/441] Fix init functions with SDL3 build --- src_c/base.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src_c/base.c b/src_c/base.c index a3f189cf4c..4d3ac2a906 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -78,7 +78,7 @@ static PyObject *pgExc_BufferError = NULL; /* Only one instance of the state per process. */ static PyObject *pg_quit_functions = NULL; static int pg_is_init = 0; -static int pg_sdl_was_init = 0; +static bool pg_sdl_was_init = 0; SDL_Window *pg_default_window = NULL; pgSurfaceObject *pg_default_screen = NULL; static int pg_env_blend_alpha_SDL2 = 0; @@ -349,10 +349,9 @@ pg_init(PyObject *self, PyObject *_null) /*nice to initialize timer, so startup time will reflec pg_init() time*/ #if defined(WITH_THREAD) && !defined(MS_WIN32) && defined(SDL_INIT_EVENTTHREAD) pg_sdl_was_init = PG_InitSubSystem(SDL_INIT_EVENTTHREAD | PG_INIT_TIMER | - PG_INIT_NOPARACHUTE) == 0; + PG_INIT_NOPARACHUTE); #else - pg_sdl_was_init = - PG_InitSubSystem(PG_INIT_TIMER | PG_INIT_NOPARACHUTE) == 0; + pg_sdl_was_init = PG_InitSubSystem(PG_INIT_TIMER | PG_INIT_NOPARACHUTE); #endif pg_env_blend_alpha_SDL2 = SDL_getenv("PYGAME_BLEND_ALPHA_SDL2") != NULL; @@ -383,7 +382,7 @@ pg_atexit_quit(void) successful SDL_Init. */ if (pg_sdl_was_init) { - pg_sdl_was_init = 0; + pg_sdl_was_init = false; SDL_Quit(); } } From 21ca2b0a53e785400524361f4657b1c9cad586ff Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 17 Jun 2025 21:43:16 -0500 Subject: [PATCH 306/441] Add Controller.set_led, remove print-on-failure-for-sdl3 for Joystick.set_led, and use pg_RGBAFromObjEx instead of pg_RGBAFromObj --- docs/reST/ref/joystick.rst | 11 +++++----- docs/reST/ref/sdl2_controller.rst | 16 ++++++++++++++ src_c/_sdl2/controller.c | 35 +++++++++++++++++++++++++++++++ src_c/doc/sdl2_controller_doc.h | 1 + src_c/joystick.c | 11 ++++++++-- 5 files changed, 67 insertions(+), 7 deletions(-) diff --git a/docs/reST/ref/joystick.rst b/docs/reST/ref/joystick.rst index 738091b11b..a91ad6bfa4 100644 --- a/docs/reST/ref/joystick.rst +++ b/docs/reST/ref/joystick.rst @@ -361,11 +361,12 @@ variable. See :ref:`environment variables ` for more deta | :sl:`Set the LED color of the joystick` | :sg:`set_led(color_arg) -> bool` - Set the color of the LED on the joystick. The argument is a ``pygame.Color`` - instance or a tuple of RGB(A) values (alpha being ignored). The color - will be set to the joystick's LED, if it has one. If the joystick does - not have an LED, then this method will do nothing and return False. - Returns True if the LED was set successfully. + Set the color of the LED on the joystick. The argument is a + ``pygame.Color``-compatible value (alpha being ignored). The + joystick's LED, if it has one, will be set to the input color. + If the joystick does not have an addressable LED, then this + method will do nothing and return False. Returns True if the + LED was set successfully. .. versionadded:: 2.5.6 diff --git a/docs/reST/ref/sdl2_controller.rst b/docs/reST/ref/sdl2_controller.rst index e6ff3ef4bd..839a1f72a7 100644 --- a/docs/reST/ref/sdl2_controller.rst +++ b/docs/reST/ref/sdl2_controller.rst @@ -288,4 +288,20 @@ events related to controllers. .. ## Controller.stop_rumble ## + .. method:: set_led + + | :sl:`Set the LED color of the controller` + | :sg:`set_led(color_arg) -> bool` + + Set the color of the LED on the controller. The argument is a + ``pygame.Color``-compatible value (alpha being ignored). The + controller's LED, if it has one, will be set to the input color. + If the controller does not have an addressable LED, then this + method will do nothing and return False. Returns True if the + LED was set successfully. + + .. versionadded:: 2.5.6 + + .. ## Controller.set_led ## + .. ## pygame._sdl2.controller ## diff --git a/src_c/_sdl2/controller.c b/src_c/_sdl2/controller.c index 282694b826..c886fa4a61 100644 --- a/src_c/_sdl2/controller.c +++ b/src_c/_sdl2/controller.c @@ -388,6 +388,35 @@ controller_stop_rumble(pgControllerObject *self, PyObject *_null) Py_RETURN_NONE; } +static PyObject* +controller_set_led(pgControllerObject *self, PyObject *arg) +{ + CONTROLLER_INIT_CHECK(); + + Uint8 colors[4] = {0, 0, 0, 0}; + + if (!pg_RGBAFromObjEx(arg, colors, PG_COLOR_HANDLE_ALL)) { + return RAISE(PyExc_TypeError, + "set_led must be passed in a Color-compatible argument"); + } + +#if !SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_GameControllerSetLED(self->controller, colors[0], colors[1], colors[2]) < 0) { + Py_RETURN_FALSE; + } + Py_RETURN_TRUE; +#else + // SDL3 renames the function and sets an error message on failure + bool result = SDL_SetGamepadLED(self->controller, colors[0], colors[1], colors[2]); + if (!result) { + // Clear the SDL error message that SDL set, for example if it didn't + // have an addressable LED + (void)SDL_GetError(); + } + return PyBool_FromLong(result); +#endif +} + static PyMethodDef controller_methods[] = { {"from_joystick", (PyCFunction)controller_from_joystick, METH_CLASS | METH_VARARGS | METH_KEYWORDS, @@ -414,6 +443,7 @@ static PyMethodDef controller_methods[] = { DOC_SDL2_CONTROLLER_CONTROLLER_RUMBLE}, {"stop_rumble", (PyCFunction)controller_stop_rumble, METH_NOARGS, DOC_SDL2_CONTROLLER_CONTROLLER_STOPRUMBLE}, + {"set_led", (PyCFunction)controller_set_led, METH_O, DOC_SDL2_CONTROLLER_CONTROLLER_SETLED}, {NULL, NULL, 0, NULL}}; static PyMemberDef controller_members[] = { @@ -569,6 +599,11 @@ MODINIT_DEFINE(controller) return NULL; } + import_pygame_color(); + if (PyErr_Occurred()) { + return NULL; + } + import_pygame_joystick(); if (PyErr_Occurred()) { return NULL; diff --git a/src_c/doc/sdl2_controller_doc.h b/src_c/doc/sdl2_controller_doc.h index adcbc429c2..4fff846ae6 100644 --- a/src_c/doc/sdl2_controller_doc.h +++ b/src_c/doc/sdl2_controller_doc.h @@ -21,3 +21,4 @@ #define DOC_SDL2_CONTROLLER_CONTROLLER_SETMAPPING "set_mapping(mapping) -> int\nAssign a mapping to the controller" #define DOC_SDL2_CONTROLLER_CONTROLLER_RUMBLE "rumble(low_frequency, high_frequency, duration) -> bool\nStart a rumbling effect" #define DOC_SDL2_CONTROLLER_CONTROLLER_STOPRUMBLE "stop_rumble() -> None\nStop any rumble effect playing" +#define DOC_SDL2_CONTROLLER_CONTROLLER_SETLED "set_led(color_arg) -> bool\nSet the LED color of the controller" diff --git a/src_c/joystick.c b/src_c/joystick.c index c9d19874d2..e3b2648402 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -543,7 +543,7 @@ joy_set_led(PyObject *self, PyObject *arg) Uint8 colors[4] = {0, 0, 0, 0}; - if (!pg_RGBAFromObj(arg, colors)) { + if (!pg_RGBAFromObjEx(arg, colors, PG_COLOR_HANDLE_ALL)) { return RAISE(PyExc_TypeError, "set_led must be passed in a Color-compatible argument"); } @@ -557,7 +557,9 @@ joy_set_led(PyObject *self, PyObject *arg) // SDL3 renames the function and sets an error message on failure bool result = SDL_SetJoystickLED(joy, colors[0], colors[1], colors[2]); if (!result) { - printf("%s\n", SDL_GetError()); + // Clear the SDL error message that SDL set, for example if it didn't + // have an addressable LED + (void)SDL_GetError(); } return PyBool_FromLong(result); #endif @@ -698,6 +700,11 @@ MODINIT_DEFINE(joystick) return NULL; } + import_pygame_color(); + if (PyErr_Occurred()) { + return NULL; + } + /* type preparation */ if (PyType_Ready(&pgJoystick_Type) == -1) { return NULL; From b4a9f62a45de8b366070493f71fe6384e0822cc6 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 17 Jun 2025 21:52:05 -0500 Subject: [PATCH 307/441] Stubs --- buildconfig/stubs/pygame/_sdl2/controller.pyi | 2 ++ buildconfig/stubs/pygame/joystick.pyi | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/buildconfig/stubs/pygame/_sdl2/controller.pyi b/buildconfig/stubs/pygame/_sdl2/controller.pyi index c6fbca29d3..db9f45d889 100644 --- a/buildconfig/stubs/pygame/_sdl2/controller.pyi +++ b/buildconfig/stubs/pygame/_sdl2/controller.pyi @@ -1,6 +1,7 @@ from typing import final from pygame.joystick import JoystickType +from pygame.typing import ColorLike def init() -> None: ... def get_init() -> bool: ... @@ -30,3 +31,4 @@ class Controller: self, low_frequency: float, high_frequency: float, duration: int ) -> bool: ... def stop_rumble(self) -> None: ... + def set_led(self, color: ColorLike) -> bool: ... diff --git a/buildconfig/stubs/pygame/joystick.pyi b/buildconfig/stubs/pygame/joystick.pyi index 0dbb55a496..90154bdd2c 100644 --- a/buildconfig/stubs/pygame/joystick.pyi +++ b/buildconfig/stubs/pygame/joystick.pyi @@ -1,6 +1,6 @@ from typing import final -from pygame import Color +from pygame.typing import ColorLike from typing_extensions import deprecated # added in 3.13 def init() -> None: ... @@ -32,7 +32,7 @@ class JoystickType: self, low_frequency: float, high_frequency: float, duration: int ) -> bool: ... def stop_rumble(self) -> None: ... - def set_led(self, color: Color | tuple[int, int, int]) -> bool: ... + def set_led(self, color: ColorLike) -> bool: ... # according to the current implementation, Joystick is a function that returns # a JoystickType instance. In the future, when the C implementation is fixed to From d408e1ddb6368e0727b6bb9b0e8662e64c04df36 Mon Sep 17 00:00:00 2001 From: Ankith Date: Wed, 18 Jun 2025 13:17:28 +0530 Subject: [PATCH 308/441] Fix aaline width and blend conflict --- buildconfig/stubs/pygame/draw.pyi | 7 ++++--- src_c/draw.c | 10 +++++----- test/draw_test.py | 29 +++++++++++++++-------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index c3c88aca81..50f57741c5 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -508,7 +508,7 @@ def aaline( :param int width: (optional) used for line thickness | if width >= 1, used for line thickness (default is 1) - | if width < 1, nothing will be drawn + | if width < 1, a line of width == 1 will be drawn :returns: a rect bounding the changed pixels, if nothing is drawn the bounding rect's position will be the ``start_pos`` parameter value (float @@ -521,8 +521,9 @@ def aaline( .. versionchangedold:: 2.0.0 Added support for keyword arguments. .. versionchanged:: 2.4.0 Removed deprecated 'blend' argument .. versionchanged:: 2.5.0 ``blend`` argument re-added for backcompat, but will - always raise a deprecation exception when used - .. versionchanged:: 2.5.3 Added line width + do nothing different and always raise a deprecation exception when used. + .. versionchanged:: 2.5.6 Added ``width`` in place of the deprecated + ``blend`` argument in a way that doesn't break backcompat too much. """ def aalines( diff --git a/src_c/draw.c b/src_c/draw.c index a5667b8c94..7f2745c940 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -135,7 +135,9 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) static char *keywords[] = {"surface", "color", "start_pos", "end_pos", "width", "blend", NULL}; - if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O!OOO|iO", keywords, + // blend argument is keyword only for backcompat. + // if it is passed as a positional argument, it will be handled in width + if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O!OOO|i$O", keywords, &pgSurface_Type, &surfobj, &colorobj, &start, &end, &width, &blend)) { return NULL; /* Exception already set. */ @@ -180,10 +182,6 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) return RAISE(PyExc_TypeError, "invalid end_pos argument"); } - if (width < 1) { - return pgRect_New4((int)startx, (int)starty, 0, 0); - } - if (!pgSurface_Lock(surfobj)) { return RAISE(PyExc_RuntimeError, "error locking surface"); } @@ -193,6 +191,8 @@ aaline(PyObject *self, PyObject *arg, PyObject *kwargs) starty, endx, endy, width, drawn_area); } else { + // For all width <= 1 treat it as width == 1, this helps compat + // with the old blend argument draw_aaline(surf, surf_clip_rect, surf_format, color, startx, starty, endx, endy, drawn_area, 0, 0, 0); } diff --git a/test/draw_test.py b/test/draw_test.py index cb72452fdf..82099e51d8 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -2447,19 +2447,27 @@ def test_aaline__args(self): def test_aaline__blend_warning(self): """Using the blend argument should raise a DeprecationWarning""" - faulty_blend_values = [0, 1, True, False, None, "", [], type] + faulty_blend_values = [0, 1, True, False] with warnings.catch_warnings(record=True) as w: for count, blend in enumerate(faulty_blend_values): # Cause all warnings to always be triggered. warnings.simplefilter("always") # Trigger DeprecationWarning. - self.draw_aaline( - pygame.Surface((2, 2)), (0, 0, 0, 50), (0, 0), (2, 2), 1, blend + bounding1 = self.draw_aaline( + pygame.Surface((2, 2)), (0, 0, 0, 50), (0, 0), (2, 2), blend=blend + ) + # Doesn't trigger DeprecationWarning, interepreted as width + bounding2 = self.draw_aaline( + pygame.Surface((2, 2)), (0, 0, 0, 50), (0, 0), (2, 2), blend ) # Check if there is only one warning and is a DeprecationWarning. self.assertEqual(len(w), count + 1) self.assertTrue(issubclass(w[-1].category, DeprecationWarning)) + # check that the line gets drawn + self.assertEqual(bounding1, bounding2) + self.assertEqual(bounding1, (0, 0, 2, 2)) + def test_aaline__kwargs(self): """Ensures draw aaline accepts the correct kwargs""" surface = pygame.Surface((4, 4)) @@ -2681,11 +2689,10 @@ def test_aaline__valid_width_values(self): for width in (-100, -10, -1, 0, 1, 10, 100): surface.fill(surface_color) # Clear for each test. kwargs["width"] = width - expected_color = line_color if width > 0 else surface_color bounds_rect = self.draw_aaline(**kwargs) - self.assertEqual(surface.get_at(pos), expected_color) + self.assertEqual(surface.get_at(pos), line_color) self.assertIsInstance(bounds_rect, pygame.Rect) def test_aaline__valid_start_pos_formats(self): @@ -2928,15 +2935,9 @@ def test_aaline__bounding_rect(self): surface, line_color, start, end, thickness ) - if 0 < thickness: - # Calculating the expected_rect after the line is - # drawn (it uses what is actually drawn). - expected_rect = create_bounding_rect( - surface, surf_color, start - ) - else: - # Nothing drawn. - expected_rect = pygame.Rect(start, (0, 0)) + # Calculating the expected_rect after the line is + # drawn (it uses what is actually drawn). + expected_rect = create_bounding_rect(surface, surf_color, start) self.assertEqual( bounding_rect, From 81dc704a5c4a71218120e1e16274c65917b19bc4 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:56:52 +0200 Subject: [PATCH 309/441] Delete .clangd unimportant file --- .clangd | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .clangd diff --git a/.clangd b/.clangd deleted file mode 100644 index e4a68e17b5..0000000000 --- a/.clangd +++ /dev/null @@ -1,2 +0,0 @@ -CompileFlags: - CompilationDatabase: ./.mesonpy-build/ From 924ded944c892081d803c874817fa9335f22e107 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Thu, 19 Jun 2025 23:01:22 -0700 Subject: [PATCH 310/441] Simplify key code Removes unnecessary null checks (PyBool_FromLong always succeeds), stores directly into PyTuple_SET_ITEM (which steals reference), and moves the index declaration into the for loop -- we're not on C89 anymore. --- src_c/key.c | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/src_c/key.c b/src_c/key.c index a4bd1cf1d0..2540e59980 100644 --- a/src_c/key.c +++ b/src_c/key.c @@ -178,7 +178,6 @@ key_get_pressed(PyObject *self, PyObject *_null) #endif PyObject *ret_obj = NULL; PyObject *key_tuple; - int i; VIDEO_INIT_CHECK(); @@ -192,14 +191,8 @@ key_get_pressed(PyObject *self, PyObject *_null) return NULL; } - for (i = 0; i < num_keys; i++) { - PyObject *key_elem; - key_elem = PyBool_FromLong(key_state[i]); - if (!key_elem) { - Py_DECREF(key_tuple); - return NULL; - } - PyTuple_SET_ITEM(key_tuple, i, key_elem); + for (int i = 0; i < num_keys; i++) { + PyTuple_SET_ITEM(key_tuple, i, PyBool_FromLong(key_state[i])); } ret_obj = @@ -221,15 +214,8 @@ get_just_pressed(PyObject *self, PyObject *_null) return NULL; } - int i; - for (i = 0; i < SDL_NUM_SCANCODES; i++) { - PyObject *key_elem; - key_elem = PyBool_FromLong(pressed_keys[i]); - if (!key_elem) { - Py_DECREF(key_tuple); - return NULL; - } - PyTuple_SET_ITEM(key_tuple, i, key_elem); + for (int i = 0; i < SDL_NUM_SCANCODES; i++) { + PyTuple_SET_ITEM(key_tuple, i, PyBool_FromLong(pressed_keys[i])); } ret_obj = PyObject_CallOneArg((PyObject *)&pgScancodeWrapper_Type, key_tuple); @@ -250,15 +236,8 @@ get_just_released(PyObject *self, PyObject *_null) return NULL; } - int i; - for (i = 0; i < SDL_NUM_SCANCODES; i++) { - PyObject *key_elem; - key_elem = PyBool_FromLong(released_keys[i]); - if (!key_elem) { - Py_DECREF(key_tuple); - return NULL; - } - PyTuple_SET_ITEM(key_tuple, i, key_elem); + for (int i = 0; i < SDL_NUM_SCANCODES; i++) { + PyTuple_SET_ITEM(key_tuple, i, PyBool_FromLong(released_keys[i])); } ret_obj = PyObject_CallOneArg((PyObject *)&pgScancodeWrapper_Type, key_tuple); From 70dc960579ff2969e8f4e584074cde68d800df17 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:00:33 +0200 Subject: [PATCH 311/441] Update buildconfig/stubs/pygame/geometry.pyi Co-authored-by: Ankith --- buildconfig/stubs/pygame/geometry.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/geometry.pyi b/buildconfig/stubs/pygame/geometry.pyi index 985d6050cb..a9995cd795 100644 --- a/buildconfig/stubs/pygame/geometry.pyi +++ b/buildconfig/stubs/pygame/geometry.pyi @@ -197,4 +197,4 @@ class Line: def scale_ip(self, factor_and_origin: Point, /) -> None: ... def flip_ab(self) -> Line: ... def flip_ab_ip(self) -> None: ... - def project(self, point: Point, /, clamp: bool = False) -> tuple[float, float]: ... + def project(self, point: Point, clamp: bool = False) -> tuple[float, float]: ... From 82c43c9cb6d017f92ca9adbc1d6d6a8d373224c7 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:03:09 +0200 Subject: [PATCH 312/441] Update geometry.rst --- docs/reST/ref/geometry.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index 032f01dcdb..33e55c9a33 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -764,6 +764,6 @@ WARNING: This method has to have some length or the clamp parameter must be true for it to work and not throw a `ValueError` - .. versionadded:: 2.5.4 + .. versionadded:: 2.5.6 .. ## Line.project ## From 32ae36918a2c8064a245c73b6babc2c322c56d0a Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:05:57 +0200 Subject: [PATCH 313/441] Update src_c/line.c Co-authored-by: Ankith --- src_c/line.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/line.c b/src_c/line.c index f03c5874b6..bd05525a6d 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -248,7 +248,7 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) double dot_product = (vector_from_line_start_to_point[0] * line_vector[0] + vector_from_line_start_to_point[1] * line_vector[1]) / - (line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]); + squared_line_length; double projection[2] = {dot_product * line_vector[0], dot_product * line_vector[1]}; From 1a8d9f62202b4795784d1231c158645cbeb301f5 Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:13:32 +0200 Subject: [PATCH 314/441] Update src_c/line.c Co-authored-by: Ankith --- src_c/line.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index bd05525a6d..bee084e19a 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -260,8 +260,7 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) } else if (projection[0] * projection[0] + projection[1] * projection[1] > - line_vector[0] * line_vector[0] + - line_vector[1] * line_vector[1]) { + squared_line_length) { projection[0] = line_vector[0]; projection[1] = line_vector[1]; } From 24014144860473b268ddd938f9e26d287c2ddeaf Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:13:41 +0200 Subject: [PATCH 315/441] Update src_c/line.c Co-authored-by: Ankith --- src_c/line.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/line.c b/src_c/line.c index bee084e19a..33559b5ad9 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -224,7 +224,7 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) { // this is a vector that goes from one point of the line to another double line_vector[2] = {line->bx - line->ax, line->by - line->ay}; - double squred_line_length = + double squared_line_length = line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]; if (squred_line_length == 0.0 && clamp) { From 4194dceb6ed4e3a65081f34a293b74ff6504899e Mon Sep 17 00:00:00 2001 From: Rudolf Vrbensky <89221002+XFajk@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:19:43 +0200 Subject: [PATCH 316/441] Fix typo in variable name for squared line length in _line_project_helper in src_c/line.c --- src_c/line.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/line.c b/src_c/line.c index 33559b5ad9..1c3b48c002 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -227,14 +227,14 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) double squared_line_length = line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]; - if (squred_line_length == 0.0 && clamp) { + if (squared_line_length == 0.0 && clamp) { double projected_point[2]; projected_point[0] = line->ax; projected_point[1] = line->ay; return pg_tuple_couple_from_values_double(projected_point[0], projected_point[1]); } - else if (squred_line_length == 0.0) { + else if (squared_line_length == 0.0) { return RAISE(PyExc_ValueError, "The Line has to have some length or this method has to " "be clamped to work"); From c6d08771b20f844f81d50513baa192bf35c905c4 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 21 Jun 2025 13:59:17 -0700 Subject: [PATCH 317/441] Port SDL_SetColorKey --- src_c/_pygame.h | 7 +++++++ src_c/rotozoom.c | 4 ++-- src_c/surface.c | 24 ++++++++++++------------ src_c/transform.c | 2 +- src_c/window.c | 9 ++------- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index c46211e888..62a1460a59 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -132,6 +132,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_GetSurfacePalette SDL_GetSurfacePalette #define PG_SetPaletteColors SDL_SetPaletteColors +#define PG_SetSurfaceColorKey SDL_SetSurfaceColorKey #define PG_SetSurfaceBlendMode SDL_SetSurfaceBlendMode #define PG_GetSurfaceBlendMode SDL_GetSurfaceBlendMode #define PG_GetSurfaceAlphaMod SDL_GetSurfaceAlphaMod @@ -248,6 +249,12 @@ PG_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, return SDL_SetPaletteColors(palette, colors, firstcolor, ncolors) == 0; } +static inline bool +PG_SetSurfaceColorKey(SDL_Surface *surface, bool enabled, Uint32 key) +{ + return SDL_SetColorKey(surface, enabled, key) == 0; +} + static inline bool PG_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode) { diff --git a/src_c/rotozoom.c b/src_c/rotozoom.c index f0db4c6866..1dc7b9163e 100644 --- a/src_c/rotozoom.c +++ b/src_c/rotozoom.c @@ -589,7 +589,7 @@ rotozoomSurface(SDL_Surface *src, double angle, double zoom, int smooth) PG_CreateSurface(dstwidth, dstheight, PG_SURF_FORMATENUM(rz_src)); if (SDL_HasColorKey(src)) { SDL_GetColorKey(src, &colorkey); - if (SDL_SetColorKey(rz_dst, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(rz_dst, SDL_TRUE, colorkey)) { SDL_FreeSurface(rz_dst); return NULL; } @@ -649,7 +649,7 @@ rotozoomSurface(SDL_Surface *src, double angle, double zoom, int smooth) PG_CreateSurface(dstwidth, dstheight, PG_SURF_FORMATENUM(rz_src)); if (SDL_HasColorKey(src)) { SDL_GetColorKey(src, &colorkey); - if (SDL_SetColorKey(rz_dst, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(rz_dst, SDL_TRUE, colorkey)) { SDL_FreeSurface(rz_dst); return NULL; } diff --git a/src_c/surface.c b/src_c/surface.c index 35b0ef1786..0cf4a3d3c1 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1417,7 +1417,6 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args) SDL_Surface *surf = pgSurface_AsSurface(self); Uint32 flags = 0, color = 0; PyObject *rgba_obj = NULL; - int result; int hascolor = SDL_FALSE; if (!PyArg_ParseTuple(args, "|Oi", &rgba_obj, &flags)) { @@ -1436,22 +1435,23 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args) } pgSurface_Prep(self); - result = 0; + bool success = true; if (hascolor && PG_SURF_BytesPerPixel(surf) == 1) { /* For an indexed surface, remove the previous colorkey first. */ - result = SDL_SetColorKey(surf, SDL_FALSE, color); + success = PG_SetSurfaceColorKey(surf, SDL_FALSE, color); } - if (result == 0 && hascolor) { - result = SDL_SetSurfaceRLE( - surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); + if (success && hascolor) { + success = + SDL_SetSurfaceRLE( + surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE) == 0; } - if (result == 0) { - result = SDL_SetColorKey(surf, hascolor, color); + if (success) { + success = PG_SetSurfaceColorKey(surf, hascolor, color); } pgSurface_Unprep(self); - if (result == -1) { + if (!success) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -1814,7 +1814,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) if (has_colorkey) { colorkey = SDL_MapSurfaceRGBA(newsurf, key_r, key_g, key_b, key_a); - if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(newsurf, SDL_TRUE, colorkey)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; @@ -1977,7 +1977,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) if (has_colorkey) { colorkey = SDL_MapRGBA(newsurf->format, key_r, key_g, key_b, key_a); - if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(newsurf, SDL_TRUE, colorkey)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; @@ -3259,7 +3259,7 @@ surf_subsurface(PyObject *self, PyObject *args) } if (SDL_HasColorKey(surf)) { SDL_GetColorKey(surf, &colorkey); - if (SDL_SetColorKey(sub, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(sub, SDL_TRUE, colorkey)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(sub); return NULL; diff --git a/src_c/transform.c b/src_c/transform.c index 810c32865b..1bdea76ca1 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -197,7 +197,7 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) if (SDL_HasColorKey(surf)) { SDL_GetColorKey(surf, &colorkey); - if (SDL_SetColorKey(newsurf, SDL_TRUE, colorkey) != 0) { + if (!PG_SetSurfaceColorKey(newsurf, SDL_TRUE, colorkey)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; diff --git a/src_c/window.c b/src_c/window.c index 5c0b88e1e8..594c0321d2 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -1251,13 +1251,8 @@ window_init(pgWindowObject *self, PyObject *args, PyObject *kwargs) return -1; } if (icon_colorkey != -1) { -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_SetColorKey(pgSurface_AsSurface(icon), SDL_TRUE, - icon_colorkey)) { -#else - if (SDL_SetColorKey(pgSurface_AsSurface(icon), SDL_TRUE, - icon_colorkey) < 0) { -#endif + if (!PG_SetSurfaceColorKey(pgSurface_AsSurface(icon), SDL_TRUE, + icon_colorkey)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } From 872c3dcb5b87e56db4173f2f909aa98b357b5e42 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:06:40 -0700 Subject: [PATCH 318/441] Port SDL_SetSurfaceRLE --- src_c/_pygame.h | 7 +++++++ src_c/rotozoom.c | 6 ++---- src_c/surface.c | 17 ++++++++--------- src_c/transform.c | 3 +-- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 62a1460a59..3b8f3a15c8 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -82,6 +82,7 @@ #define PG_PixelFormatEnum SDL_PixelFormat #define PG_SurfaceHasRLE SDL_SurfaceHasRLE +#define PG_SetSurfaceRLE SDL_SetSurfaceRLE #define PG_SoftStretchNearest(src, srcrect, dst, dstrect) \ SDL_StretchSurface(src, srcrect, dst, dstrect, SDL_SCALEMODE_NEAREST) @@ -350,6 +351,12 @@ PG_InitSubSystem(Uint32 flags) #define PG_SurfaceHasRLE SDL_HasSurfaceRLE +static inline bool +PG_SetSurfaceRLE(SDL_Surface *surface, bool enabled) +{ + return SDL_SetSurfaceRLE(surface, enabled) == 0; +} + static inline bool PG_GetSurfaceClipRect(SDL_Surface *surface, SDL_Rect *rect) { diff --git a/src_c/rotozoom.c b/src_c/rotozoom.c index 1dc7b9163e..ae146989ed 100644 --- a/src_c/rotozoom.c +++ b/src_c/rotozoom.c @@ -593,8 +593,7 @@ rotozoomSurface(SDL_Surface *src, double angle, double zoom, int smooth) SDL_FreeSurface(rz_dst); return NULL; } - if (PG_SurfaceHasRLE(src) && - SDL_SetSurfaceRLE(rz_dst, SDL_TRUE) != 0) { + if (PG_SurfaceHasRLE(src) && !PG_SetSurfaceRLE(rz_dst, SDL_TRUE)) { SDL_FreeSurface(rz_dst); return NULL; } @@ -653,8 +652,7 @@ rotozoomSurface(SDL_Surface *src, double angle, double zoom, int smooth) SDL_FreeSurface(rz_dst); return NULL; } - if (PG_SurfaceHasRLE(src) && - SDL_SetSurfaceRLE(rz_dst, SDL_TRUE) != 0) { + if (PG_SurfaceHasRLE(src) && !PG_SetSurfaceRLE(rz_dst, SDL_TRUE)) { SDL_FreeSurface(rz_dst); return NULL; } diff --git a/src_c/surface.c b/src_c/surface.c index 0cf4a3d3c1..44b2e5d78d 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1442,9 +1442,8 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args) success = PG_SetSurfaceColorKey(surf, SDL_FALSE, color); } if (success && hascolor) { - success = - SDL_SetSurfaceRLE( - surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE) == 0; + success = PG_SetSurfaceRLE( + surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); } if (success) { success = PG_SetSurfaceColorKey(surf, hascolor, color); @@ -1496,7 +1495,7 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) Uint32 flags = 0; PyObject *alpha_obj = NULL, *intobj = NULL; Uint8 alpha; - int result, alphaval = 255; + int alphaval = 255; SDL_Rect sdlrect; SDL_Surface *surface; @@ -1544,8 +1543,8 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) } } pgSurface_Prep(self); - result = - SDL_SetSurfaceRLE(surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); + bool success = + PG_SetSurfaceRLE(surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); /* HACK HACK HACK */ if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) { /* hack to strip SDL_RLEACCEL flag off surface immediately when @@ -1561,12 +1560,12 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) SDL_FreeSurface(surface); } /* HACK HACK HACK */ - if (result == 0) { - result = !PG_SetSurfaceAlphaMod(surf, alpha); + if (success) { + success = PG_SetSurfaceAlphaMod(surf, alpha); } pgSurface_Unprep(self); - if (result != 0) { + if (!success) { return RAISE(pgExc_SDLError, SDL_GetError()); } diff --git a/src_c/transform.c b/src_c/transform.c index 1bdea76ca1..a13f040021 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -202,8 +202,7 @@ newsurf_fromsurf(SDL_Surface *surf, int width, int height) SDL_FreeSurface(newsurf); return NULL; } - if (PG_SurfaceHasRLE(surf) && - SDL_SetSurfaceRLE(newsurf, SDL_TRUE) != 0) { + if (PG_SurfaceHasRLE(surf) && !PG_SetSurfaceRLE(newsurf, SDL_TRUE)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreeSurface(newsurf); return NULL; From ef726d9d3d89777e960d049fac7a16d1581b8e0d Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 21 Jun 2025 15:03:11 -0700 Subject: [PATCH 319/441] Port SDL_SetSurfacePalette --- src_c/_pygame.h | 7 +++++++ src_c/image.c | 7 ++----- src_c/surface.c | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 3b8f3a15c8..e3381053ae 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -133,6 +133,7 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_GetSurfacePalette SDL_GetSurfacePalette #define PG_SetPaletteColors SDL_SetPaletteColors +#define PG_SetSurfacePalette SDL_SetSurfacePalette #define PG_SetSurfaceColorKey SDL_SetSurfaceColorKey #define PG_SetSurfaceBlendMode SDL_SetSurfaceBlendMode #define PG_GetSurfaceBlendMode SDL_GetSurfaceBlendMode @@ -250,6 +251,12 @@ PG_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, return SDL_SetPaletteColors(palette, colors, firstcolor, ncolors) == 0; } +static inline bool +PG_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette) +{ + return SDL_SetSurfacePalette(surface, palette) == 0; +} + static inline bool PG_SetSurfaceColorKey(SDL_Surface *surface, bool enabled, Uint32 key) { diff --git a/src_c/image.c b/src_c/image.c index e4f9cf70f9..1de25f8dda 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -1795,12 +1795,9 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) } if (h.has_cmap) { -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (!SDL_SetSurfacePalette(linebuf, surf_palette)) -#else - if (SDL_SetSurfacePalette(linebuf, surf_palette) < 0) -#endif + if (!PG_SetSurfacePalette(linebuf, surf_palette)) { goto error; /* SDL error already set. */ + } } if (rle) { diff --git a/src_c/surface.c b/src_c/surface.c index 44b2e5d78d..408a96e08a 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -3236,7 +3236,7 @@ surf_subsurface(PyObject *self, PyObject *args) SDL_FreeSurface(sub); return NULL; } - if (SDL_SetSurfacePalette(sub, pal) != 0) { + if (!PG_SetSurfacePalette(sub, pal)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); SDL_FreePalette(pal); SDL_FreeSurface(sub); From 78296a345a77b741184b9b55c2f9a9dd51134891 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 24 Jun 2025 20:37:31 -0500 Subject: [PATCH 320/441] Proper refcounting and cleanup in transform.pixelate, update versionadded tag --- buildconfig/stubs/pygame/transform.pyi | 2 +- src_c/transform.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index 4a5707b1c3..60abf02e34 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -480,5 +480,5 @@ def pixelate( :returns: A new surface that's been pixelated. - ..versionadded:: 2.5.5 + ..versionadded:: 2.5.6 """ diff --git a/src_c/transform.c b/src_c/transform.c index dbf2fc0c1b..761286b598 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4264,17 +4264,23 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) SDL_Surface *temp = scale_to(src, NULL, width, height); intermediate = pgSurface_New(temp); if (intermediate == NULL) { + SDL_FreeSurface(temp); return NULL; /* Exception already set in scale_to */ } new_surf = scale_to(intermediate, dst, src->surf->w, src->surf->h); if (new_surf == NULL) { + Py_DECREF(intermediate); return NULL; /* Exception already set in scale_to */ } if (dst) { Py_INCREF(dst); + Py_DECREF(intermediate); return (PyObject *)dst; } + + Py_DECREF(intermediate); + return (PyObject *)pgSurface_New(new_surf); } From 3b79bb41ee79b526cc8227d3aa371c09ba042536 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 24 Jun 2025 20:52:07 -0500 Subject: [PATCH 321/441] Remove redundant overflow checks, properly handle pixel_size < 1, and implement test for invalid arguments --- src_c/transform.c | 12 +++--------- test/transform_test.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 761286b598..6668e0296b 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4246,15 +4246,9 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) double testWidth = round((double)src->surf->w / pixel_size); double testHeight = round((double)src->surf->h / pixel_size); - if (testWidth > INT_MAX || testWidth <= 0) { - PyErr_SetString(PyExc_OverflowError, - "Cannot scale width outside the range (0, INT_MAX]"); - return NULL; - } - - if (testHeight > INT_MAX || testHeight <= 0) { - PyErr_SetString(PyExc_OverflowError, - "Cannot scale height outside the range (0, INT_MAX]"); + if (pixel_size < 1) { + PyErr_SetString(PyExc_ValueError, + "Pixel size must be a nonnegative integer"); return NULL; } diff --git a/test/transform_test.py b/test/transform_test.py index 92f6472f8f..160e7f3dab 100644 --- a/test/transform_test.py +++ b/test/transform_test.py @@ -1892,6 +1892,21 @@ def test_pixelate(self): self.assertTrue(surfaces_have_same_pixels(square_pixelated, square_resized)) + # test a variety of arguments raise an exception + for arg in (0, -1): + with self.assertRaises(ValueError, msg=f"Running with pixel_size = {arg}"): + pygame.transform.pixelate(image, arg) + + for arg in (-1_000_000_000_000_000_000, 1_000_000_000_000_000_000): + with self.assertRaises( + OverflowError, msg=f"Running with pixel_size = {arg}" + ): + pygame.transform.pixelate(image, arg) + + for arg in ("one", 1.0, None): + with self.assertRaises(TypeError, msg=f"Running with pixel_size = {arg}"): + pygame.transform.pixelate(image, arg) + class TransformDisplayModuleTest(unittest.TestCase): def setUp(self): From 026ed2e7ca3f5a836d546eafc4996a1873f9deb1 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Wed, 25 Jun 2025 18:37:06 -0500 Subject: [PATCH 322/441] Use pre-set exceptions in Joystick.set_led and Controller.set_led --- src_c/_sdl2/controller.c | 4 ++-- src_c/joystick.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src_c/_sdl2/controller.c b/src_c/_sdl2/controller.c index 8959d25139..13cea06cdf 100644 --- a/src_c/_sdl2/controller.c +++ b/src_c/_sdl2/controller.c @@ -396,8 +396,8 @@ controller_set_led(pgControllerObject *self, PyObject *arg) Uint8 colors[4] = {0, 0, 0, 0}; if (!pg_RGBAFromObjEx(arg, colors, PG_COLOR_HANDLE_ALL)) { - return RAISE(PyExc_TypeError, - "set_led must be passed in a Color-compatible argument"); + // Exception already set + return NULL; } #if !SDL_VERSION_ATLEAST(3, 0, 0) diff --git a/src_c/joystick.c b/src_c/joystick.c index 07ad516909..4b7eef21a3 100644 --- a/src_c/joystick.c +++ b/src_c/joystick.c @@ -544,8 +544,8 @@ joy_set_led(PyObject *self, PyObject *arg) Uint8 colors[4] = {0, 0, 0, 0}; if (!pg_RGBAFromObjEx(arg, colors, PG_COLOR_HANDLE_ALL)) { - return RAISE(PyExc_TypeError, - "set_led must be passed in a Color-compatible argument"); + // Exception already set + return NULL; } #if !SDL_VERSION_ATLEAST(3, 0, 0) From 48ca8c5b507a74293387b63ce23224bd0fb229ee Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Wed, 25 Jun 2025 18:59:10 -0500 Subject: [PATCH 323/441] transform.pixelate: Removed unused variables, single decref, reorder error check --- src_c/transform.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 6668e0296b..b870dc422c 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4243,17 +4243,14 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - double testWidth = round((double)src->surf->w / pixel_size); - double testHeight = round((double)src->surf->h / pixel_size); - if (pixel_size < 1) { PyErr_SetString(PyExc_ValueError, "Pixel size must be a nonnegative integer"); return NULL; } - int width = (int)testWidth; - int height = (int)testHeight; + int width = (int)round((double)src->surf->w / pixel_size); + int height = (int)round((double)src->surf->h / pixel_size); SDL_Surface *temp = scale_to(src, NULL, width, height); intermediate = pgSurface_New(temp); @@ -4261,20 +4258,19 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) SDL_FreeSurface(temp); return NULL; /* Exception already set in scale_to */ } + new_surf = scale_to(intermediate, dst, src->surf->w, src->surf->h); + Py_DECREF(intermediate); + if (new_surf == NULL) { - Py_DECREF(intermediate); return NULL; /* Exception already set in scale_to */ } if (dst) { Py_INCREF(dst); - Py_DECREF(intermediate); return (PyObject *)dst; } - Py_DECREF(intermediate); - return (PyObject *)pgSurface_New(new_surf); } From 049bcf003aadde540a0383f65e813a89c9ea1aa4 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 30 Jun 2025 19:01:00 +0530 Subject: [PATCH 324/441] `(F)Rect.inflate(_ip)` FASTCALL --- src_c/rect.c | 9 +++++---- src_c/rect_impl.h | 17 +++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src_c/rect.c b/src_c/rect.c index 2817fc20f3..155f97faf5 100644 --- a/src_c/rect.c +++ b/src_c/rect.c @@ -471,13 +471,13 @@ static struct PyMethodDef pg_rect_methods[] = { {"fit", (PyCFunction)pg_rect_fit, METH_FASTCALL, DOC_RECT_FIT}, {"move", (PyCFunction)pg_rect_move, METH_FASTCALL, DOC_RECT_MOVE}, {"update", (PyCFunction)pg_rect_update, METH_FASTCALL, DOC_RECT_UPDATE}, - {"inflate", (PyCFunction)pg_rect_inflate, METH_VARARGS, DOC_RECT_INFLATE}, + {"inflate", (PyCFunction)pg_rect_inflate, METH_FASTCALL, DOC_RECT_INFLATE}, {"union", (PyCFunction)pg_rect_union, METH_FASTCALL, DOC_RECT_UNION}, {"unionall", (PyCFunction)pg_rect_unionall, METH_O, DOC_RECT_UNIONALL}, {"move_ip", (PyCFunction)pg_rect_move_ip, METH_FASTCALL, DOC_RECT_MOVEIP}, {"move_to", (PyCFunction)pg_rect_move_to, METH_FASTCALL | METH_KEYWORDS, DOC_RECT_MOVETO}, - {"inflate_ip", (PyCFunction)pg_rect_inflate_ip, METH_VARARGS, + {"inflate_ip", (PyCFunction)pg_rect_inflate_ip, METH_FASTCALL, DOC_RECT_INFLATEIP}, {"scale_by", (PyCFunction)pg_rect_scale_by, METH_VARARGS | METH_KEYWORDS, DOC_RECT_SCALEBY}, @@ -522,13 +522,14 @@ static struct PyMethodDef pg_frect_methods[] = { {"fit", (PyCFunction)pg_frect_fit, METH_FASTCALL, DOC_RECT_FIT}, {"move", (PyCFunction)pg_frect_move, METH_FASTCALL, DOC_RECT_MOVE}, {"update", (PyCFunction)pg_frect_update, METH_FASTCALL, DOC_RECT_UPDATE}, - {"inflate", (PyCFunction)pg_frect_inflate, METH_VARARGS, DOC_RECT_INFLATE}, + {"inflate", (PyCFunction)pg_frect_inflate, METH_FASTCALL, + DOC_RECT_INFLATE}, {"union", (PyCFunction)pg_frect_union, METH_FASTCALL, DOC_RECT_UNION}, {"unionall", (PyCFunction)pg_frect_unionall, METH_O, DOC_RECT_UNIONALL}, {"move_ip", (PyCFunction)pg_frect_move_ip, METH_FASTCALL, DOC_RECT_MOVEIP}, {"move_to", (PyCFunction)pg_frect_move_to, METH_FASTCALL | METH_KEYWORDS, DOC_RECT_MOVETO}, - {"inflate_ip", (PyCFunction)pg_frect_inflate_ip, METH_VARARGS, + {"inflate_ip", (PyCFunction)pg_frect_inflate_ip, METH_FASTCALL, DOC_RECT_INFLATEIP}, {"scale_by", (PyCFunction)pg_frect_scale_by, METH_VARARGS | METH_KEYWORDS, DOC_RECT_SCALEBY}, diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index cc611f949f..8bb5379258 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -465,9 +465,10 @@ static PyObject * RectExport_moveTo(RectObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); static PyObject * -RectExport_inflate(RectObject *self, PyObject *args); +RectExport_inflate(RectObject *self, PyObject *const *args, Py_ssize_t nargs); static PyObject * -RectExport_inflateIp(RectObject *self, PyObject *args); +RectExport_inflateIp(RectObject *self, PyObject *const *args, + Py_ssize_t nargs); static PyObject * RectExport_scalebyIp(RectObject *self, PyObject *args, PyObject *kwargs); static PyObject * @@ -1052,12 +1053,12 @@ RectExport_moveTo(RectObject *self, PyObject *const *args, Py_ssize_t nargs, } static PyObject * -RectExport_inflate(RectObject *self, PyObject *args) +RectExport_inflate(RectObject *self, PyObject *const *args, Py_ssize_t nargs) { PrimitiveType x, y; - if (!twoPrimitivesFromObj(args, &x, &y)) { - return RAISE(PyExc_TypeError, "argument must contain two numbers"); + if (!pgTwoValuesFromFastcallArgs(args, nargs, &x, &y)) { + return NULL; } return RectExport_subtypeNew4(Py_TYPE(self), self->r.x - x / 2, @@ -1066,12 +1067,12 @@ RectExport_inflate(RectObject *self, PyObject *args) } static PyObject * -RectExport_inflateIp(RectObject *self, PyObject *args) +RectExport_inflateIp(RectObject *self, PyObject *const *args, Py_ssize_t nargs) { PrimitiveType x, y; - if (!twoPrimitivesFromObj(args, &x, &y)) { - return RAISE(PyExc_TypeError, "argument must contain two numbers"); + if (!pgTwoValuesFromFastcallArgs(args, nargs, &x, &y)) { + return NULL; } self->r.x -= x / 2; self->r.y -= y / 2; From 1b78cbae2112084ba798adbf01e958039d837b5f Mon Sep 17 00:00:00 2001 From: Michael Lamertz Date: Mon, 30 Jun 2025 19:50:27 +0200 Subject: [PATCH 325/441] docs: logical_size might be (0, 0) When Renderer.logical_size hasn't been changed before, it will contain (0, 0) and not the size of the window as one might expect. This bit me, and I only by chance found a remark pointing that out in the SDL2 docs. This adds a similar remark to the pygame-ce docs. --- docs/reST/ref/sdl2_video.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/reST/ref/sdl2_video.rst b/docs/reST/ref/sdl2_video.rst index 99ce737c7f..b1ccee1db1 100644 --- a/docs/reST/ref/sdl2_video.rst +++ b/docs/reST/ref/sdl2_video.rst @@ -378,6 +378,10 @@ | :sl:`Get or set the logical Renderer size (a device independent resolution for rendering)` | :sg:`logical_size -> (int width, int height)` + Note: When the rendering target is the main window, and ``logical_size`` + has not been set before, it will contain ``(0, 0)`` and not the size of + the window. + .. attribute:: scale | :sl:`Get the drawing scale for the current rendering target` From ae95a81d22808e762021395211c2968221f06d27 Mon Sep 17 00:00:00 2001 From: Tomatofu <99457089+tomatophu@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:43:50 -0700 Subject: [PATCH 326/441] fixed incredibly small grammar error --- docs/reST/ref/mixer.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/mixer.rst b/docs/reST/ref/mixer.rst index 37976873c0..69f34e5f10 100644 --- a/docs/reST/ref/mixer.rst +++ b/docs/reST/ref/mixer.rst @@ -597,7 +597,7 @@ The following file formats are supported Set the position (angle, distance) of a playing channel. - `angle`: Angle is in degrees. + `angle`: Angle in degrees. `distance`: Range from 0 to 255. From cdb24a75ea8785746025f5f8036d8f01bc39f1fa Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 1 Jul 2025 23:38:15 +0530 Subject: [PATCH 327/441] Fix math.lerp docs, improve code --- docs/reST/ref/math.rst | 2 +- src_c/math.c | 21 ++++++--------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/docs/reST/ref/math.rst b/docs/reST/ref/math.rst index 96532b9f4e..0fd3fffdab 100644 --- a/docs/reST/ref/math.rst +++ b/docs/reST/ref/math.rst @@ -119,7 +119,7 @@ Conversion can be combined with swizzling or slicing to create a new order The formula is: - ``a * value + (1 - value) * b``. + ``a + (b - a) * value``. .. versionadded:: 2.4.0 diff --git a/src_c/math.c b/src_c/math.c index bd6869dddc..b76d2e5084 100644 --- a/src_c/math.c +++ b/src_c/math.c @@ -4494,12 +4494,12 @@ math_lerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) PyObject *max = args[1]; PyObject *value = args[2]; - if (PyNumber_Check(args[2]) != 1) { - return RAISE(PyExc_TypeError, - "lerp requires the interpolation amount to be number"); - } - + double a = PyFloat_AsDouble(min); + RAISE_ARG_TYPE_ERROR("min") + double b = PyFloat_AsDouble(max); + RAISE_ARG_TYPE_ERROR("max") double t = PyFloat_AsDouble(value); + RAISE_ARG_TYPE_ERROR("value") if (nargs == 4 && !PyObject_IsTrue(args[3])) { ; // pass if do_clamp is false @@ -4513,16 +4513,7 @@ math_lerp(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } } - if (PyNumber_Check(min) && PyNumber_Check(max)) { - return PyFloat_FromDouble(PyFloat_AsDouble(min) * (1 - t) + - PyFloat_AsDouble(max) * t); - } - else { - return RAISE( - PyExc_TypeError, - "math.lerp requires all the arguments to be numbers. To lerp " - "between two vectors, please use the Vector class methods."); - } + return PyFloat_FromDouble(lerp(a, b, t)); } static PyObject * From 78df4eda3d22439873196c9ca49764170fae067e Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:46:42 -0700 Subject: [PATCH 328/441] Type color parameter of set_led as positional-only --- buildconfig/stubs/pygame/_sdl2/controller.pyi | 2 +- buildconfig/stubs/pygame/joystick.pyi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildconfig/stubs/pygame/_sdl2/controller.pyi b/buildconfig/stubs/pygame/_sdl2/controller.pyi index db9f45d889..b924986e91 100644 --- a/buildconfig/stubs/pygame/_sdl2/controller.pyi +++ b/buildconfig/stubs/pygame/_sdl2/controller.pyi @@ -31,4 +31,4 @@ class Controller: self, low_frequency: float, high_frequency: float, duration: int ) -> bool: ... def stop_rumble(self) -> None: ... - def set_led(self, color: ColorLike) -> bool: ... + def set_led(self, color: ColorLike, /) -> bool: ... diff --git a/buildconfig/stubs/pygame/joystick.pyi b/buildconfig/stubs/pygame/joystick.pyi index 90154bdd2c..4ebc8e80bd 100644 --- a/buildconfig/stubs/pygame/joystick.pyi +++ b/buildconfig/stubs/pygame/joystick.pyi @@ -32,7 +32,7 @@ class JoystickType: self, low_frequency: float, high_frequency: float, duration: int ) -> bool: ... def stop_rumble(self) -> None: ... - def set_led(self, color: ColorLike) -> bool: ... + def set_led(self, color: ColorLike, /) -> bool: ... # according to the current implementation, Joystick is a function that returns # a JoystickType instance. In the future, when the C implementation is fixed to From 763aa7ed497ecedbcc05dc6e6a325a6c75c1525e Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:12:02 -0700 Subject: [PATCH 329/441] Remove redunant _HasRadiusAndRect protocol --- buildconfig/stubs/pygame/sprite.pyi | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 25f5986f07..1b56bc2e19 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -43,10 +43,6 @@ class _HasImageAndRect(_HasRect, Protocol): class _HasMaskAndRect(_HasRect, Protocol): mask: Mask -# radius in addition to rect -class _HasRadiusAndRect(_HasRect, Protocol): - radius: float - # non-generic Group, used in Sprite _Group = AbstractGroup[Any] @@ -220,7 +216,7 @@ class collide_rect_ratio: def __call__(self, left: _HasRect, right: _HasRect) -> bool: ... # must have rect attribute, may optionally have radius attribute -_SupportsCollideCircle = Union[_HasRect, _HasRadiusAndRect] +_SupportsCollideCircle = _HasRect def collide_circle( left: _SupportsCollideCircle, right: _SupportsCollideCircle From fa42eb9b46217bf3400e6e177841338f57eac9d0 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:13:01 -0700 Subject: [PATCH 330/441] Fix GroupSingle.sprite optional type --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 1b56bc2e19..5a56a382ac 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -204,7 +204,7 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite]): def set_timing_treshold(self, time_ms: SupportsFloat) -> None: ... class GroupSingle(AbstractGroup[_TSprite]): - sprite: _TSprite + sprite: Optional[_TSprite] def __init__(self, sprite: Optional[_TSprite] = None) -> None: ... # argument to collide_rect must have rect attribute From ecbf7bdc21284cd71f1408ec4775f63b2f3a1f6d Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:20:55 -0700 Subject: [PATCH 331/441] Type _GroupOrGroups, rename _SpriteOrIterable --- buildconfig/stubs/pygame/sprite.pyi | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 5a56a382ac..dec265b7a8 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -64,8 +64,8 @@ class _SupportsSprite(_HasImageAndRect, Protocol): def add_internal(self, group: _Group) -> None: ... def remove_internal(self, group: _Group) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _Group) -> None: ... - def remove(self, *groups: _Group) -> None: ... + def add(self, *groups: _GroupOrGroups[Any]) -> None: ... + def remove(self, *groups: _GroupOrGroups[Any]) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... def groups(self) -> list[_Group]: ... @@ -94,12 +94,12 @@ class Sprite(_SupportsSprite): def layer(self) -> int: ... @layer.setter def layer(self, value: int) -> None: ... - def __init__(self, *groups: _Group) -> None: ... + def __init__(self, *groups: _GroupOrGroups[Any]) -> None: ... def add_internal(self, group: _Group) -> None: ... def remove_internal(self, group: _Group) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _Group) -> None: ... - def remove(self, *groups: _Group) -> None: ... + def add(self, *groups: _GroupOrGroups[Any]) -> None: ... + def remove(self, *groups: _GroupOrGroups[Any]) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... def groups(self) -> list[AbstractGroup[_SupportsSprite]]: ... @@ -120,8 +120,8 @@ _TSprite = TypeVar("_TSprite", bound=_SupportsSprite) _TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) _TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) -# typevar for sprite or iterable of sprites, used in Group init, add and remove -_SpriteOrIterable = Union[_TSprite, Iterable[_SpriteOrIterable[_TSprite]]] +_GroupOrGroups = Union[AbstractGroup[_TSprite], Iterable[_GroupOrGroups[_TSprite]]] +_SpriteOrSprites = Union[_TSprite, Iterable[_SpriteOrSprites[_TSprite]]] class AbstractGroup(Generic[_TSprite]): spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] @@ -137,9 +137,9 @@ class AbstractGroup(Generic[_TSprite]): def has_internal(self, sprite: _TSprite) -> bool: ... def copy(self) -> Self: ... def sprites(self) -> list[_TSprite]: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... - def remove(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... - def has(self, *sprites: _SpriteOrIterable[_TSprite]) -> bool: ... + def add(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... + def remove(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... + def has(self, *sprites: _SpriteOrSprites[_TSprite]) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def draw( self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 @@ -152,7 +152,7 @@ class AbstractGroup(Generic[_TSprite]): def empty(self) -> None: ... class Group(AbstractGroup[_TSprite]): - def __init__(self, *sprites: _SpriteOrIterable[_TSprite]) -> None: ... + def __init__(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") @@ -167,10 +167,8 @@ class RenderUpdates(Group[_TSprite]): ... class OrderedUpdates(RenderUpdates[_TSprite]): ... class LayeredUpdates(AbstractGroup[_TSprite]): - def __init__( - self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any - ) -> None: ... - def add(self, *sprites: _SpriteOrIterable[_TSprite], **kwargs: Any) -> None: ... + def __init__(self, *sprites: _SpriteOrSprites[_TSprite], **kwargs: Any) -> None: ... + def add(self, *sprites: _SpriteOrSprites[_TSprite], **kwargs: Any) -> None: ... def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... def get_sprite(self, idx: int) -> _TSprite: ... def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ... From 0aded362a231a24ebe53ccd49efd93d45e081b99 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:25:21 -0700 Subject: [PATCH 332/441] Remove _SupportsSprite and _SupportsDirtySprite protocols --- buildconfig/stubs/pygame/sprite.pyi | 50 ++++------------------------- 1 file changed, 6 insertions(+), 44 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index dec265b7a8..0caca647f8 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -46,42 +46,7 @@ class _HasMaskAndRect(_HasRect, Protocol): # non-generic Group, used in Sprite _Group = AbstractGroup[Any] -# protocol helps with structural subtyping for typevars in sprite group generics -# and allows the use of any class with the required attributes and methods -class _SupportsSprite(_HasImageAndRect, Protocol): - @property - def image(self) -> Optional[Surface]: ... - @image.setter - def image(self, value: Optional[Surface]) -> None: ... - @property - def rect(self) -> Optional[Union[FRect, Rect]]: ... - @rect.setter - def rect(self, value: Optional[Union[FRect, Rect]]) -> None: ... - @property - def layer(self) -> int: ... - @layer.setter - def layer(self, value: int) -> None: ... - def add_internal(self, group: _Group) -> None: ... - def remove_internal(self, group: _Group) -> None: ... - def update(self, *args: Any, **kwargs: Any) -> None: ... - def add(self, *groups: _GroupOrGroups[Any]) -> None: ... - def remove(self, *groups: _GroupOrGroups[Any]) -> None: ... - def kill(self) -> None: ... - def alive(self) -> bool: ... - def groups(self) -> list[_Group]: ... - -# also a protocol -class _SupportsDirtySprite(_SupportsSprite, Protocol): - dirty: int - blendmode: int - source_rect: Union[FRect, Rect] - visible: int - _layer: int - def _set_visible(self, val: int) -> None: ... - def _get_visible(self) -> int: ... - -# concrete sprite implementation class -class Sprite(_SupportsSprite): +class Sprite: @property def image(self) -> Optional[Surface]: ... @image.setter @@ -102,10 +67,9 @@ class Sprite(_SupportsSprite): def remove(self, *groups: _GroupOrGroups[Any]) -> None: ... def kill(self) -> None: ... def alive(self) -> bool: ... - def groups(self) -> list[AbstractGroup[_SupportsSprite]]: ... + def groups(self) -> list[AbstractGroup[Sprite]]: ... -# concrete dirty sprite implementation class -class DirtySprite(Sprite, _SupportsDirtySprite): +class DirtySprite(Sprite): dirty: int blendmode: int source_rect: Union[FRect, Rect] @@ -114,11 +78,9 @@ class DirtySprite(Sprite, _SupportsDirtySprite): def _set_visible(self, val: int) -> None: ... def _get_visible(self) -> int: ... -# typevar bound to Sprite, _SupportsSprite Protocol ensures sprite -# subclass passed to group has image and rect attributes -_TSprite = TypeVar("_TSprite", bound=_SupportsSprite) -_TSprite2 = TypeVar("_TSprite2", bound=_SupportsSprite) -_TDirtySprite = TypeVar("_TDirtySprite", bound=_SupportsDirtySprite) +_TSprite = TypeVar("_TSprite", bound=Sprite) +_TSprite2 = TypeVar("_TSprite2", bound=Sprite) +_TDirtySprite = TypeVar("_TDirtySprite", bound=DirtySprite) _GroupOrGroups = Union[AbstractGroup[_TSprite], Iterable[_GroupOrGroups[_TSprite]]] _SpriteOrSprites = Union[_TSprite, Iterable[_SpriteOrSprites[_TSprite]]] From 66885ce2a477803aa46350287064ae1b5725a844 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:26:45 -0700 Subject: [PATCH 333/441] Undocument private _set_visible and _get_visible accessor methods --- buildconfig/stubs/pygame/sprite.pyi | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 0caca647f8..5f854359c9 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -75,8 +75,6 @@ class DirtySprite(Sprite): source_rect: Union[FRect, Rect] visible: int _layer: int - def _set_visible(self, val: int) -> None: ... - def _get_visible(self) -> int: ... _TSprite = TypeVar("_TSprite", bound=Sprite) _TSprite2 = TypeVar("_TSprite2", bound=Sprite) From db62783b0e7c5471a0edbbe929b4ba8087e0b037 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:42:04 -0700 Subject: [PATCH 334/441] Misc sprite stub improvements --- buildconfig/stubs/pygame/sprite.pyi | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 5f854359c9..f40c80fd66 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -43,9 +43,6 @@ class _HasImageAndRect(_HasRect, Protocol): class _HasMaskAndRect(_HasRect, Protocol): mask: Mask -# non-generic Group, used in Sprite -_Group = AbstractGroup[Any] - class Sprite: @property def image(self) -> Optional[Surface]: ... @@ -60,8 +57,8 @@ class Sprite: @layer.setter def layer(self, value: int) -> None: ... def __init__(self, *groups: _GroupOrGroups[Any]) -> None: ... - def add_internal(self, group: _Group) -> None: ... - def remove_internal(self, group: _Group) -> None: ... + def add_internal(self, group: AbstractGroup[Any]) -> None: ... + def remove_internal(self, group: AbstractGroup[Any]) -> None: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def add(self, *groups: _GroupOrGroups[Any]) -> None: ... def remove(self, *groups: _GroupOrGroups[Any]) -> None: ... @@ -165,7 +162,6 @@ class GroupSingle(AbstractGroup[_TSprite]): sprite: Optional[_TSprite] def __init__(self, sprite: Optional[_TSprite] = None) -> None: ... -# argument to collide_rect must have rect attribute def collide_rect(left: _HasRect, right: _HasRect) -> bool: ... class collide_rect_ratio: @@ -173,7 +169,7 @@ class collide_rect_ratio: def __init__(self, ratio: float) -> None: ... def __call__(self, left: _HasRect, right: _HasRect) -> bool: ... -# must have rect attribute, may optionally have radius attribute +# Must have rect attribute, may optionally have radius attribute _SupportsCollideCircle = _HasRect def collide_circle( @@ -187,7 +183,7 @@ class collide_circle_ratio: self, left: _SupportsCollideCircle, right: _SupportsCollideCircle ) -> bool: ... -# argument to collide_mask must either have mask or have image attribute, in +# Argument to collide_mask must either have mask or have image attribute, in # addition to mandatorily having a rect attribute _SupportsCollideMask = Union[_HasImageAndRect, _HasMaskAndRect] @@ -195,7 +191,6 @@ def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... -# _HasRect typevar for sprite collide functions _THasRect = TypeVar("_THasRect", bound=_HasRect) def spritecollide( From 131b5dce8a432141bdaf2432bf580f7422b03637 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:44:03 -0700 Subject: [PATCH 335/441] Remove sprite type vars to follow pep 8 --- buildconfig/stubs/pygame/sprite.pyi | 102 ++++++++++++++-------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index f40c80fd66..71c0b41f0d 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -73,30 +73,30 @@ class DirtySprite(Sprite): visible: int _layer: int -_TSprite = TypeVar("_TSprite", bound=Sprite) -_TSprite2 = TypeVar("_TSprite2", bound=Sprite) -_TDirtySprite = TypeVar("_TDirtySprite", bound=DirtySprite) +_SpriteT = TypeVar("_SpriteT", bound=Sprite) +_SpriteT2 = TypeVar("_SpriteT2", bound=Sprite) +_DirtySpriteT = TypeVar("_DirtySpriteT", bound=DirtySprite) -_GroupOrGroups = Union[AbstractGroup[_TSprite], Iterable[_GroupOrGroups[_TSprite]]] -_SpriteOrSprites = Union[_TSprite, Iterable[_SpriteOrSprites[_TSprite]]] +_GroupOrGroups = Union[AbstractGroup[_SpriteT], Iterable[_GroupOrGroups[_SpriteT]]] +_SpriteOrSprites = Union[_SpriteT, Iterable[_SpriteOrSprites[_SpriteT]]] -class AbstractGroup(Generic[_TSprite]): - spritedict: dict[_TSprite, Optional[Union[FRect, Rect]]] +class AbstractGroup(Generic[_SpriteT]): + spritedict: dict[_SpriteT, Optional[Union[FRect, Rect]]] lostsprites: list[Union[FRect, Rect]] def __class_getitem__(cls, item: Any, /) -> types.GenericAlias: ... def __init__(self) -> None: ... def __len__(self) -> int: ... - def __iter__(self) -> Iterator[_TSprite]: ... + def __iter__(self) -> Iterator[_SpriteT]: ... def __bool__(self) -> bool: ... def __contains__(self, item: Any) -> bool: ... - def add_internal(self, sprite: _TSprite, layer: None = None) -> None: ... - def remove_internal(self, sprite: _TSprite) -> None: ... - def has_internal(self, sprite: _TSprite) -> bool: ... + def add_internal(self, sprite: _SpriteT, layer: None = None) -> None: ... + def remove_internal(self, sprite: _SpriteT) -> None: ... + def has_internal(self, sprite: _SpriteT) -> bool: ... def copy(self) -> Self: ... - def sprites(self) -> list[_TSprite]: ... - def add(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... - def remove(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... - def has(self, *sprites: _SpriteOrSprites[_TSprite]) -> bool: ... + def sprites(self) -> list[_SpriteT]: ... + def add(self, *sprites: _SpriteOrSprites[_SpriteT]) -> None: ... + def remove(self, *sprites: _SpriteOrSprites[_SpriteT]) -> None: ... + def has(self, *sprites: _SpriteOrSprites[_SpriteT]) -> bool: ... def update(self, *args: Any, **kwargs: Any) -> None: ... def draw( self, surface: Surface, bgd: Optional[Surface] = None, special_flags: int = 0 @@ -108,39 +108,39 @@ class AbstractGroup(Generic[_TSprite]): ) -> None: ... def empty(self) -> None: ... -class Group(AbstractGroup[_TSprite]): - def __init__(self, *sprites: _SpriteOrSprites[_TSprite]) -> None: ... +class Group(AbstractGroup[_SpriteT]): + def __init__(self, *sprites: _SpriteOrSprites[_SpriteT]) -> None: ... # these are aliased in the code too @deprecated("Use `pygame.sprite.Group` instead") -class RenderPlain(Group[_TSprite]): ... +class RenderPlain(Group[_SpriteT]): ... @deprecated("Use `pygame.sprite.Group` instead") -class RenderClear(Group[_TSprite]): ... +class RenderClear(Group[_SpriteT]): ... -class RenderUpdates(Group[_TSprite]): ... +class RenderUpdates(Group[_SpriteT]): ... @deprecated("Use `pygame.sprite.RenderUpdates` instead") -class OrderedUpdates(RenderUpdates[_TSprite]): ... - -class LayeredUpdates(AbstractGroup[_TSprite]): - def __init__(self, *sprites: _SpriteOrSprites[_TSprite], **kwargs: Any) -> None: ... - def add(self, *sprites: _SpriteOrSprites[_TSprite], **kwargs: Any) -> None: ... - def get_sprites_at(self, pos: Point) -> list[_TSprite]: ... - def get_sprite(self, idx: int) -> _TSprite: ... - def remove_sprites_of_layer(self, layer_nr: int) -> list[_TSprite]: ... +class OrderedUpdates(RenderUpdates[_SpriteT]): ... + +class LayeredUpdates(AbstractGroup[_SpriteT]): + def __init__(self, *sprites: _SpriteOrSprites[_SpriteT], **kwargs: Any) -> None: ... + def add(self, *sprites: _SpriteOrSprites[_SpriteT], **kwargs: Any) -> None: ... + def get_sprites_at(self, pos: Point) -> list[_SpriteT]: ... + def get_sprite(self, idx: int) -> _SpriteT: ... + def remove_sprites_of_layer(self, layer_nr: int) -> list[_SpriteT]: ... def layers(self) -> list[int]: ... - def change_layer(self, sprite: _TSprite, new_layer: int) -> None: ... - def get_layer_of_sprite(self, sprite: _TSprite) -> int: ... + def change_layer(self, sprite: _SpriteT, new_layer: int) -> None: ... + def get_layer_of_sprite(self, sprite: _SpriteT) -> int: ... def get_top_layer(self) -> int: ... def get_bottom_layer(self) -> int: ... - def move_to_front(self, sprite: _TSprite) -> None: ... - def move_to_back(self, sprite: _TSprite) -> None: ... - def get_top_sprite(self) -> _TSprite: ... - def get_sprites_from_layer(self, layer: int) -> list[_TSprite]: ... + def move_to_front(self, sprite: _SpriteT) -> None: ... + def move_to_back(self, sprite: _SpriteT) -> None: ... + def get_top_sprite(self) -> _SpriteT: ... + def get_sprites_from_layer(self, layer: int) -> list[_SpriteT]: ... def switch_layer(self, layer1_nr: int, layer2_nr: int) -> None: ... -class LayeredDirty(LayeredUpdates[_TDirtySprite]): +class LayeredDirty(LayeredUpdates[_DirtySpriteT]): def draw( self, surface: Surface, @@ -158,9 +158,9 @@ class LayeredDirty(LayeredUpdates[_TDirtySprite]): ) def set_timing_treshold(self, time_ms: SupportsFloat) -> None: ... -class GroupSingle(AbstractGroup[_TSprite]): - sprite: Optional[_TSprite] - def __init__(self, sprite: Optional[_TSprite] = None) -> None: ... +class GroupSingle(AbstractGroup[_SpriteT]): + sprite: Optional[_SpriteT] + def __init__(self, sprite: Optional[_SpriteT] = None) -> None: ... def collide_rect(left: _HasRect, right: _HasRect) -> bool: ... @@ -191,23 +191,23 @@ def collide_mask( left: _SupportsCollideMask, right: _SupportsCollideMask ) -> Optional[tuple[int, int]]: ... -_THasRect = TypeVar("_THasRect", bound=_HasRect) +_HasRectT = TypeVar("_HasRectT", bound=_HasRect) def spritecollide( - sprite: _THasRect, - group: AbstractGroup[_TSprite], + sprite: _HasRectT, + group: AbstractGroup[_SpriteT], dokill: bool, - collided: Optional[Callable[[_THasRect, _TSprite], Any]] = None, -) -> list[_TSprite]: ... + collided: Optional[Callable[[_HasRectT, _SpriteT], Any]] = None, +) -> list[_SpriteT]: ... def groupcollide( - groupa: AbstractGroup[_TSprite], - groupb: AbstractGroup[_TSprite2], + groupa: AbstractGroup[_SpriteT], + groupb: AbstractGroup[_SpriteT2], dokilla: bool, dokillb: bool, - collided: Optional[Callable[[_TSprite, _TSprite2], Any]] = None, -) -> dict[_TSprite, list[_TSprite2]]: ... + collided: Optional[Callable[[_SpriteT, _SpriteT2], Any]] = None, +) -> dict[_SpriteT, list[_SpriteT2]]: ... def spritecollideany( - sprite: _THasRect, - group: AbstractGroup[_TSprite], - collided: Optional[Callable[[_THasRect, _TSprite], Any]] = None, -) -> Optional[_TSprite]: ... + sprite: _HasRectT, + group: AbstractGroup[_SpriteT], + collided: Optional[Callable[[_HasRectT, _SpriteT], Any]] = None, +) -> Optional[_SpriteT]: ... From dd12ade807b0c60c07c014d63ffb1f15c7137e18 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:45:41 -0700 Subject: [PATCH 336/441] Make mask of _HasMaskAndRect protocol read-only --- buildconfig/stubs/pygame/sprite.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 71c0b41f0d..b1e3173f64 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -41,7 +41,8 @@ class _HasImageAndRect(_HasRect, Protocol): # mask in addition to rect class _HasMaskAndRect(_HasRect, Protocol): - mask: Mask + @property + def mask(self) -> Mask: ... class Sprite: @property From c31a63c2f5630ccad78555c1b722e4eba1bbeeb0 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:51:36 -0700 Subject: [PATCH 337/441] Small sprite stub improvements --- buildconfig/stubs/pygame/sprite.pyi | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index b1e3173f64..992536b974 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -27,9 +27,7 @@ from pygame.rect import FRect, Rect from pygame.surface import Surface from pygame.typing import Point, RectLike -# define some useful protocols first, which sprite functions accept -# sprite functions don't need all sprite attributes to be present in the -# arguments passed, they only use a few which are marked in the below protocols +# Some sprite functions only need objects with certain attributes, not always a sprite class _HasRect(Protocol): @property def rect(self) -> Optional[Union[FRect, Rect]]: ... @@ -44,7 +42,7 @@ class _HasMaskAndRect(_HasRect, Protocol): @property def mask(self) -> Mask: ... -class Sprite: +class Sprite(_HasImageAndRect): @property def image(self) -> Optional[Surface]: ... @image.setter @@ -112,7 +110,7 @@ class AbstractGroup(Generic[_SpriteT]): class Group(AbstractGroup[_SpriteT]): def __init__(self, *sprites: _SpriteOrSprites[_SpriteT]) -> None: ... -# these are aliased in the code too +# These deprecated types are just aliases in the code too @deprecated("Use `pygame.sprite.Group` instead") class RenderPlain(Group[_SpriteT]): ... @@ -184,7 +182,7 @@ class collide_circle_ratio: self, left: _SupportsCollideCircle, right: _SupportsCollideCircle ) -> bool: ... -# Argument to collide_mask must either have mask or have image attribute, in +# Arguments to collide_mask must either have mask or have image attribute, in # addition to mandatorily having a rect attribute _SupportsCollideMask = Union[_HasImageAndRect, _HasMaskAndRect] From a7712bc1c6be22f1a6fe21d6467761ab30f1296e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 07:44:22 +0000 Subject: [PATCH 338/441] Bump pypa/cibuildwheel from 3.0.0 to 3.0.1 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 6aa04d85e6..896d840434 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -118,7 +118,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.0.0 + uses: pypa/cibuildwheel@v3.0.1 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 540f1aa8f2..01575dcb7d 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -74,7 +74,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v3.0.0 + uses: pypa/cibuildwheel@v3.0.1 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 66a53bd2fc..1138ee12d2 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -43,7 +43,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.0.0 + uses: pypa/cibuildwheel@v3.0.1 - uses: actions/upload-artifact@v4 with: From 368fefa93d09c8193ad46cc49109f599cf3a1b1c Mon Sep 17 00:00:00 2001 From: Damiano Ricciardi Date: Sat, 12 Jul 2025 19:41:48 +0200 Subject: [PATCH 339/441] Alias build and add test modules to all --- dev.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/dev.py b/dev.py index 7ed720a134..13ec327b07 100644 --- a/dev.py +++ b/dev.py @@ -203,6 +203,7 @@ def __init__(self) -> None: self.deps["all"] = set() for k in self.deps.values(): self.deps["all"] |= k + self.deps["install"] = self.deps["build"] def cmd_build(self): wheel_dir = self.args.get("wheel", DIST_DIR) @@ -275,6 +276,8 @@ def cmd_build(self): pprint(f"Installing in editable mode ({info_str})") pip_install(self.py, install_args) + cmd_install = cmd_build + def cmd_docs(self): full = self.args.get("full", False) @@ -355,7 +358,9 @@ def parse_args(self): ) # Build command - build_parser = subparsers.add_parser("build", help="Build the project") + build_parser = subparsers.add_parser( + "build", help="Build the project", aliases=["install"] + ) build_parser.add_argument( "--wheel", nargs="?", @@ -445,13 +450,20 @@ def parse_args(self): subparsers.add_parser("format", help="Format code") # All command - subparsers.add_parser( + all_parser = subparsers.add_parser( "all", help=( "Run all the subcommands. This is handy for checking that your work is " "ready to be submitted" ), ) + all_parser.add_argument( + "mod", + nargs="*", + help=( + "Name(s) of sub-module(s) to test. If no args are given all are tested" + ), + ) args = parser.parse_args() self.args = vars(args) From 39c61e44f5cc6730aeab33e1a2a6794eb22900d5 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Mon, 14 Jul 2025 01:29:09 -0500 Subject: [PATCH 340/441] Add pypy 3.11 support (#3527) * Add pypy 3.11 support * Upgrade cython version * Allow for numpy prerelease for pypy 3.11 * Numpy DOES have a full pypy 3.11 release... * drop pypy 3.9 Co-authored-by: Ankith * Skip numpy on manylinux x86_64 pypy 3.11 --------- Co-authored-by: Ankith --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9de9b63a1b..98afd16cea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ requires = [ "meson-python<=0.17.1", "meson<=1.7.0", "ninja<=1.12.1", - "cython<=3.0.11", + "cython<=3.1.2", "sphinx<=8.1.3", "sphinx-autoapi<=3.3.2", "pyproject-metadata!=0.9.1", @@ -75,7 +75,7 @@ install = ['--tags=runtime,python-runtime,pg-tag'] # dependencies. Here is where uv comes into the picture. It is an "installer" like pip, # but faster. It has been observed to save a couple of minutes of CI time. build-frontend = "build[uv]" -build = "cp3{9,10,11,12,13}-* pp3{9,10}-*" +build = "cp3{9,10,11,12,13}-* pp3{10,11}-*" skip = "*-musllinux_*" # build[uv] is verbose by default, so below flag is not needed here # build-verbosity = 3 @@ -123,5 +123,5 @@ only-binary = ["numpy"] # 1. skip all 32-bit manylinux (i686) # 2. skip all pypy+arm combinations [[tool.cibuildwheel.overrides]] -select = "{*-manylinux_i686,pp*-*{arm64,aarch64}}" +select = "{*-manylinux_i686,pp*-*{arm64,aarch64},pp311-manylinux_x86_64}" test-requires = [] From 32453bec5ddcee8c2ae92afb0a2de456270a0fb4 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 21 May 2025 22:53:13 -0700 Subject: [PATCH 341/441] Get surface.c compiling in SDL3 --- src_c/meson.build | 3 --- src_c/surface.c | 47 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src_c/meson.build b/src_c/meson.build index 0c1479a812..6eae222633 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -84,8 +84,6 @@ rwobject = py.extension_module( subdir: pg, ) -# TODO: support SDL3 -if sdl_api != 3 simd_blitters_avx2 = static_library( 'simd_blitters_avx2', 'simd_blitters_avx2.c', @@ -132,7 +130,6 @@ surface = py.extension_module( install: true, subdir: pg, ) -endif surflock = py.extension_module( 'surflock', diff --git a/src_c/surface.c b/src_c/surface.c index 408a96e08a..895060dfb5 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1546,7 +1546,12 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) bool success = PG_SetSurfaceRLE(surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); /* HACK HACK HACK */ - if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_SurfaceHasRLE(surf) && (!(flags & PGS_RLEACCEL))) +#else + if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) +#endif + { /* hack to strip SDL_RLEACCEL flag off surface immediately when it is not requested */ sdlrect.x = 0; @@ -3016,9 +3021,15 @@ surf_get_flags(PyObject *self, PyObject *_null) if (PG_SurfaceHasRLE(surf)) { flags |= PGS_RLEACCELOK; } +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_SurfaceHasRLE(surf)) { + flags |= PGS_RLEACCEL; + } +#else if ((sdl_flags & SDL_RLEACCEL)) { flags |= PGS_RLEACCEL; } +#endif if (is_window_surf) { if (window_flags & PG_WINDOW_FULLSCREEN_INCLUSIVE) { flags |= PGS_FULLSCREEN; @@ -4370,8 +4381,8 @@ surf_get_pixels_address(PyObject *self, PyObject *closure) } static int -surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, - SDL_Rect *dstrect) +surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Rect *srcclip, + SDL_Surface *dst, SDL_Rect *dstrect) { Uint8 *srcpixels; Uint8 *dstpixels; @@ -4380,7 +4391,6 @@ surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, int x, y; int w = srcrect->w, h = srcrect->h; int maxw, maxh; - SDL_Rect *clip = &dst->clip_rect; int span; int dstoffset; @@ -4406,23 +4416,23 @@ surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, } /* clip the destination rectangle against the clip rectangle */ - x = clip->x - dstx; + x = srcclip->x - dstx; if (x > 0) { w -= x; dstx += x; srcx += x; } - x = dstx + w - clip->x - clip->w; + x = dstx + w - srcclip->x - srcclip->w; if (x > 0) { w -= x; } - y = clip->y - dsty; + y = srcclip->y - dsty; if (y > 0) { h -= y; dsty += y; srcy += y; } - y = dsty + h - clip->y - clip->h; + y = dsty + h - srcclip->y - srcclip->h; if (y > 0) { h -= y; } @@ -4460,8 +4470,15 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, SDL_Surface *dst = pgSurface_AsSurface(dstobj); SDL_Surface *subsurface = NULL; int result, suboffsetx = 0, suboffsety = 0; - SDL_Rect orig_clip, sub_clip; + SDL_Rect orig_clip, sub_clip, srcclip; +#if !SDL_VERSION_ATLEAST(3, 0, 0) Uint8 alpha; +#endif + + if (!PG_GetSurfaceClipRect(src, &srcclip)) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return 0; + } /* passthrough blits to the real surface */ if (((pgSurfaceObject *)dstobj)->subsurface) { @@ -4506,11 +4523,13 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, owner is locked. */ dst->pixels == src->pixels && srcrect != NULL && - surface_do_overlap(src, srcrect, dst, dstrect))) { + surface_do_overlap(src, srcrect, &srcclip, dst, dstrect))) { /* Py_BEGIN_ALLOW_THREADS */ result = pygame_Blit(src, srcrect, dst, dstrect, blend_flags); /* Py_END_ALLOW_THREADS */ } +// TODO SDL3: port the below bit of code. Skipping for initial surface port. +#if !SDL_VERSION_ATLEAST(3, 0, 0) /* can't blit alpha to 8bit, crashes SDL */ else if (PG_SURF_BytesPerPixel(dst) == 1 && (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(src)) || @@ -4554,6 +4573,7 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, } /* Py_END_ALLOW_THREADS */ } +#endif else if (blend_flags != PYGAME_BLEND_ALPHA_SDL2 && !(pg_EnvShouldBlendAlphaSDL2()) && !SDL_HasColorKey(src) && (PG_SURF_BytesPerPixel(dst) == 4 || @@ -4561,7 +4581,12 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, _PgSurface_SrcAlpha(src) && (SDL_ISPIXELFORMAT_ALPHA(PG_SURF_FORMATENUM(src))) && !PG_SurfaceHasRLE(src) && !PG_SurfaceHasRLE(dst) && - !(src->flags & SDL_RLEACCEL) && !(dst->flags & SDL_RLEACCEL)) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + 1 +#else + !(src->flags & SDL_RLEACCEL) && !(dst->flags & SDL_RLEACCEL) +#endif + ) { /* If we have a 32bit source surface with per pixel alpha and no RLE we'll use pygame_Blit so we can mimic how SDL1 behaved */ From 09651b6d90ef72da5fd83797a0480403834f26f9 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 02:09:04 -0700 Subject: [PATCH 342/441] Get surface_fill system compiling SDL3 --- src_c/simd_fill.h | 80 ++++++++----- src_c/simd_surface_fill_avx2.c | 92 ++++++++------- src_c/simd_surface_fill_sse2.c | 92 ++++++++------- src_c/surface_fill.c | 208 ++++++++++++++++----------------- 4 files changed, 249 insertions(+), 223 deletions(-) diff --git a/src_c/simd_fill.h b/src_c/simd_fill.h index db80008c1d..9f19e4076a 100644 --- a/src_c/simd_fill.h +++ b/src_c/simd_fill.h @@ -40,64 +40,84 @@ _pg_HasSSE_NEON(); // AVX2 functions int -surface_fill_blend_add_avx2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_add_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_add_avx2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_add_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_sub_avx2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_sub_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_sub_avx2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_sub_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_mult_avx2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_mult_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_mult_avx2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_mult_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_min_avx2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_min_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_min_avx2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_min_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_max_avx2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_max_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_max_avx2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_max_avx2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); // SSE2 functions int -surface_fill_blend_add_sse2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_add_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_add_sse2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_add_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_sub_sse2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_sub_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_sub_sse2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_sub_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_mult_sse2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_mult_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_mult_sse2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_mult_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_min_sse2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_min_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_min_sse2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_min_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); int -surface_fill_blend_max_sse2(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_max_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, SDL_Rect *rect, Uint32 color); int -surface_fill_blend_rgba_max_sse2(SDL_Surface *surface, SDL_Rect *rect, - Uint32 color); +surface_fill_blend_rgba_max_sse2(SDL_Surface *surface, + PG_PixelFormat *surface_format, + SDL_Rect *rect, Uint32 color); diff --git a/src_c/simd_surface_fill_avx2.c b/src_c/simd_surface_fill_avx2.c index 0c0d27ef21..4b3389b9a7 100644 --- a/src_c/simd_surface_fill_avx2.c +++ b/src_c/simd_surface_fill_avx2.c @@ -47,7 +47,7 @@ _pg_has_avx2() pxl_excess > 2 ? -1 : 0, pxl_excess > 1 ? -1 : 0, \ pxl_excess > 0 ? -1 : 0); \ /* prep and load the color */ \ - Uint32 amask = surface->format->Amask; \ + Uint32 amask = surface_format->Amask; \ if (amask) { \ { \ COLOR_PROCESS_CODE \ @@ -105,52 +105,58 @@ _pg_has_avx2() /* ==== recombine A and B pixels ==== */ \ mm256_dst = _mm256_packus_epi16(_shuff16_temp, shuff_dst); -#define FILLERS(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ - int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_AVX2_FILLER(COLOR_PROCESS_CODE) \ - RUN_AVX2_FILLER(FILL_CODE) \ - return 0; \ - } \ - int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_AVX2_FILLER({}) \ - RUN_AVX2_FILLER(FILL_CODE) \ - return 0; \ +#define FILLERS(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ + int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_AVX2_FILLER(COLOR_PROCESS_CODE) \ + RUN_AVX2_FILLER(FILL_CODE) \ + return 0; \ + } \ + int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_AVX2_FILLER({}) \ + RUN_AVX2_FILLER(FILL_CODE) \ + return 0; \ } -#define FILLERS_SHUFF(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ - int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_AVX2_FILLER(COLOR_PROCESS_CODE) \ - SETUP_SHUFFLE \ - RUN_AVX2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ - return 0; \ - } \ - int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_AVX2_FILLER({}) \ - SETUP_SHUFFLE \ - RUN_AVX2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ - return 0; \ +#define FILLERS_SHUFF(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ + int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_AVX2_FILLER(COLOR_PROCESS_CODE) \ + SETUP_SHUFFLE \ + RUN_AVX2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ + return 0; \ + } \ + int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_AVX2_FILLER({}) \ + SETUP_SHUFFLE \ + RUN_AVX2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ + return 0; \ } -#define INVALID_DEFS(NAME) \ - int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - BAD_AVX2_FUNCTION_CALL; \ - return -1; \ - } \ - int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - BAD_AVX2_FUNCTION_CALL; \ - return -1; \ +#define INVALID_DEFS(NAME) \ + int surface_fill_blend_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + BAD_AVX2_FUNCTION_CALL; \ + return -1; \ + } \ + int surface_fill_blend_rgba_##NAME##_avx2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + BAD_AVX2_FUNCTION_CALL; \ + return -1; \ } #define ADD_CODE mm256_dst = _mm256_adds_epu8(mm256_dst, mm256_color); diff --git a/src_c/simd_surface_fill_sse2.c b/src_c/simd_surface_fill_sse2.c index 7e4a80b030..851f4d3559 100644 --- a/src_c/simd_surface_fill_sse2.c +++ b/src_c/simd_surface_fill_sse2.c @@ -41,7 +41,7 @@ _pg_HasSSE_NEON() \ __m128i mm128_dst; \ /* prep and load the color */ \ - Uint32 amask = surface->format->Amask; \ + Uint32 amask = surface_format->Amask; \ if (amask) { \ { \ COLOR_PROCESS_CODE \ @@ -96,52 +96,58 @@ _pg_HasSSE_NEON() /* ==== recombine A and B pixels ==== */ \ mm128_dst = _mm_packus_epi16(_shuff16_temp, shuff_dst); -#define FILLERS(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ - int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_SSE2_FILLER(COLOR_PROCESS_CODE) \ - RUN_SSE2_FILLER(FILL_CODE) \ - return 0; \ - } \ - int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_SSE2_FILLER({}) \ - RUN_SSE2_FILLER(FILL_CODE) \ - return 0; \ +#define FILLERS(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ + int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_SSE2_FILLER(COLOR_PROCESS_CODE) \ + RUN_SSE2_FILLER(FILL_CODE) \ + return 0; \ + } \ + int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_SSE2_FILLER({}) \ + RUN_SSE2_FILLER(FILL_CODE) \ + return 0; \ } -#define FILLERS_SHUFF(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ - int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_SSE2_FILLER(COLOR_PROCESS_CODE) \ - SETUP_SHUFFLE \ - RUN_SSE2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ - return 0; \ - } \ - int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - SETUP_SSE2_FILLER({}) \ - SETUP_SHUFFLE \ - RUN_SSE2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ - return 0; \ +#define FILLERS_SHUFF(NAME, COLOR_PROCESS_CODE, FILL_CODE) \ + int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_SSE2_FILLER(COLOR_PROCESS_CODE) \ + SETUP_SHUFFLE \ + RUN_SSE2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ + return 0; \ + } \ + int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + SETUP_SSE2_FILLER({}) \ + SETUP_SHUFFLE \ + RUN_SSE2_FILLER(RUN_16BIT_SHUFFLE_OUT(FILL_CODE)) \ + return 0; \ } -#define INVALID_DEFS(NAME) \ - int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - BAD_SSE2_FUNCTION_CALL; \ - return -1; \ - } \ - int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ - SDL_Rect *rect, Uint32 color) \ - { \ - BAD_SSE2_FUNCTION_CALL; \ - return -1; \ +#define INVALID_DEFS(NAME) \ + int surface_fill_blend_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + BAD_SSE2_FUNCTION_CALL; \ + return -1; \ + } \ + int surface_fill_blend_rgba_##NAME##_sse2(SDL_Surface *surface, \ + PG_PixelFormat *surface_format, \ + SDL_Rect *rect, Uint32 color) \ + { \ + BAD_SSE2_FUNCTION_CALL; \ + return -1; \ } #define ADD_CODE mm128_dst = _mm_adds_epu8(mm128_dst, mm128_color); diff --git a/src_c/surface_fill.c b/src_c/surface_fill.c index ad4e084069..5f3873b2be 100644 --- a/src_c/surface_fill.c +++ b/src_c/surface_fill.c @@ -90,7 +90,8 @@ surface_respect_clip_rect(SDL_Surface *surface, SDL_Rect *rect) } static int -surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_add(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -105,11 +106,7 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -182,7 +179,8 @@ surface_fill_blend_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_sub(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -197,11 +195,7 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -274,7 +268,8 @@ surface_fill_blend_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_mult(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -288,11 +283,7 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -365,7 +356,8 @@ surface_fill_blend_mult(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_min(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -379,11 +371,7 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -456,7 +444,8 @@ surface_fill_blend_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_max(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -470,11 +459,7 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -549,7 +534,8 @@ surface_fill_blend_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) /* ------------------------- */ static int -surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_rgba_add(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -564,15 +550,11 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { - return surface_fill_blend_add(surface, rect, color); + return surface_fill_blend_add(surface, fmt, palette, rect, color); } pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -623,7 +605,8 @@ surface_fill_blend_rgba_add(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_rgba_sub(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -638,15 +621,11 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { - return surface_fill_blend_sub(surface, rect, color); + return surface_fill_blend_sub(surface, fmt, palette, rect, color); } pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -697,7 +676,8 @@ surface_fill_blend_rgba_sub(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, +surface_fill_blend_rgba_mult(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; @@ -712,15 +692,11 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { - return surface_fill_blend_mult(surface, rect, color); + return surface_fill_blend_mult(surface, fmt, palette, rect, color); } pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -771,7 +747,8 @@ surface_fill_blend_rgba_mult(SDL_Surface *surface, SDL_Rect *rect, } static int -surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_rgba_min(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -785,15 +762,11 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { - return surface_fill_blend_min(surface, rect, color); + return surface_fill_blend_min(surface, fmt, palette, rect, color); } pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -844,7 +817,8 @@ surface_fill_blend_rgba_min(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) } static int -surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) +surface_fill_blend_rgba_max(SDL_Surface *surface, PG_PixelFormat *fmt, + SDL_Palette *palette, SDL_Rect *rect, Uint32 color) { Uint8 *pixels; int width = rect->w; @@ -858,15 +832,11 @@ surface_fill_blend_rgba_max(SDL_Surface *surface, SDL_Rect *rect, Uint32 color) int ppa; SDL_BlendMode mode; SDL_GetSurfaceBlendMode(surface, &mode); - PG_PixelFormat *fmt; - SDL_Palette *palette; - if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { - return -1; - } + ppa = (fmt->Amask && mode != SDL_BLENDMODE_NONE); if (!ppa) { - return surface_fill_blend_max(surface, rect, color); + return surface_fill_blend_max(surface, fmt, palette, rect, color); } pixels = (Uint8 *)surface->pixels + (Uint16)rect->y * surface->pitch + @@ -933,25 +903,34 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, locked = 1; } + PG_PixelFormat *fmt; + SDL_Palette *palette; + if (!PG_GetSurfaceDetails(surface, &fmt, &palette)) { + return -1; + } + switch (blendargs) { case PYGAME_BLEND_ADD: { #if !defined(__EMSCRIPTEN__) #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = surface_fill_blend_add_avx2(surface, rect, color); + result = + surface_fill_blend_add_avx2(surface, fmt, rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = surface_fill_blend_add_sse2(surface, rect, color); + result = + surface_fill_blend_add_sse2(surface, fmt, rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_add(surface, rect, color); + result = + surface_fill_blend_add(surface, fmt, palette, rect, color); break; } case PYGAME_BLEND_SUB: { @@ -959,19 +938,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = surface_fill_blend_sub_avx2(surface, rect, color); + result = + surface_fill_blend_sub_avx2(surface, fmt, rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = surface_fill_blend_sub_sse2(surface, rect, color); + result = + surface_fill_blend_sub_sse2(surface, fmt, rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_sub(surface, rect, color); + result = + surface_fill_blend_sub(surface, fmt, palette, rect, color); break; } case PYGAME_BLEND_MULT: { @@ -979,21 +961,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = - surface_fill_blend_mult_avx2(surface, rect, color); + result = surface_fill_blend_mult_avx2(surface, fmt, rect, + color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = - surface_fill_blend_mult_sse2(surface, rect, color); + result = surface_fill_blend_mult_sse2(surface, fmt, rect, + color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_mult(surface, rect, color); + result = + surface_fill_blend_mult(surface, fmt, palette, rect, color); break; } case PYGAME_BLEND_MIN: { @@ -1001,19 +984,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = surface_fill_blend_min_avx2(surface, rect, color); + result = + surface_fill_blend_min_avx2(surface, fmt, rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = surface_fill_blend_min_sse2(surface, rect, color); + result = + surface_fill_blend_min_sse2(surface, fmt, rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_min(surface, rect, color); + result = + surface_fill_blend_min(surface, fmt, palette, rect, color); break; } case PYGAME_BLEND_MAX: { @@ -1021,19 +1007,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = surface_fill_blend_max_avx2(surface, rect, color); + result = + surface_fill_blend_max_avx2(surface, fmt, rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = surface_fill_blend_max_sse2(surface, rect, color); + result = + surface_fill_blend_max_sse2(surface, fmt, rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_max(surface, rect, color); + result = + surface_fill_blend_max(surface, fmt, palette, rect, color); break; } @@ -1042,21 +1031,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = - surface_fill_blend_rgba_add_avx2(surface, rect, color); + result = surface_fill_blend_rgba_add_avx2(surface, fmt, + rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = - surface_fill_blend_rgba_add_sse2(surface, rect, color); + result = surface_fill_blend_rgba_add_sse2(surface, fmt, + rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_rgba_add(surface, rect, color); + result = surface_fill_blend_rgba_add(surface, fmt, palette, rect, + color); break; } case PYGAME_BLEND_RGBA_SUB: { @@ -1064,21 +1054,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = - surface_fill_blend_rgba_sub_avx2(surface, rect, color); + result = surface_fill_blend_rgba_sub_avx2(surface, fmt, + rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = - surface_fill_blend_rgba_sub_sse2(surface, rect, color); + result = surface_fill_blend_rgba_sub_sse2(surface, fmt, + rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_rgba_sub(surface, rect, color); + result = surface_fill_blend_rgba_sub(surface, fmt, palette, rect, + color); break; } case PYGAME_BLEND_RGBA_MULT: { @@ -1086,21 +1077,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = surface_fill_blend_rgba_mult_avx2(surface, rect, - color); + result = surface_fill_blend_rgba_mult_avx2(surface, fmt, + rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = surface_fill_blend_rgba_mult_sse2(surface, rect, - color); + result = surface_fill_blend_rgba_mult_sse2(surface, fmt, + rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_rgba_mult(surface, rect, color); + result = surface_fill_blend_rgba_mult(surface, fmt, palette, rect, + color); break; } case PYGAME_BLEND_RGBA_MIN: { @@ -1108,21 +1100,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = - surface_fill_blend_rgba_min_avx2(surface, rect, color); + result = surface_fill_blend_rgba_min_avx2(surface, fmt, + rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = - surface_fill_blend_rgba_min_sse2(surface, rect, color); + result = surface_fill_blend_rgba_min_sse2(surface, fmt, + rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_rgba_min(surface, rect, color); + result = surface_fill_blend_rgba_min(surface, fmt, palette, rect, + color); break; } case PYGAME_BLEND_RGBA_MAX: { @@ -1130,21 +1123,22 @@ surface_fill_blend(SDL_Surface *surface, SDL_Rect *rect, Uint32 color, #if SDL_BYTEORDER == SDL_LIL_ENDIAN if (PG_SURF_BytesPerPixel(surface) == 4) { if (_pg_has_avx2()) { - result = - surface_fill_blend_rgba_max_avx2(surface, rect, color); + result = surface_fill_blend_rgba_max_avx2(surface, fmt, + rect, color); break; } #if PG_ENABLE_SSE_NEON if (_pg_HasSSE_NEON()) { - result = - surface_fill_blend_rgba_max_sse2(surface, rect, color); + result = surface_fill_blend_rgba_max_sse2(surface, fmt, + rect, color); break; } #endif /* PG_ENABLE_SSE_NEON */ } #endif /* SDL_BYTEORDER == SDL_LIL_ENDIAN */ #endif /* __EMSCRIPTEN__ */ - result = surface_fill_blend_rgba_max(surface, rect, color); + result = surface_fill_blend_rgba_max(surface, fmt, palette, rect, + color); break; } From 68367cfdeebed1ab0fbbae9e0740dc39bfdc9417 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 02:22:09 -0700 Subject: [PATCH 343/441] Get surface_blit system compiling with SDL3 --- src_c/alphablit.c | 6 +++--- src_c/simd_blitters.h | 6 ++++-- src_c/simd_blitters_avx2.c | 16 +++++++++------- src_c/simd_blitters_sse2.c | 15 +++++++-------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 8e7d8df919..f1a2a667e8 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -1715,18 +1715,18 @@ premul_surf_color_by_alpha(SDL_Surface *src, SDL_Surface *dst) #if !defined(__EMSCRIPTEN__) #if SDL_BYTEORDER == SDL_LIL_ENDIAN if ((PG_SURF_BytesPerPixel(src) == 4) && pg_has_avx2()) { - premul_surf_color_by_alpha_avx2(src, dst); + premul_surf_color_by_alpha_avx2(src, src_format, dst); return 0; } #if defined(__SSE2__) if ((PG_SURF_BytesPerPixel(src) == 4) && SDL_HasSSE2()) { - premul_surf_color_by_alpha_sse2(src, dst); + premul_surf_color_by_alpha_sse2(src, src_format, dst); return 0; } #endif /* __SSE2__*/ #if PG_ENABLE_ARM_NEON if ((PG_SURF_BytesPerPixel(src) == 4) && SDL_HasNEON()) { - premul_surf_color_by_alpha_sse2(src, dst); + premul_surf_color_by_alpha_sse2(src, src_format, dst); return 0; } #endif /* PG_ENABLE_ARM_NEON */ diff --git a/src_c/simd_blitters.h b/src_c/simd_blitters.h index 0c02207c26..aa53b26a28 100644 --- a/src_c/simd_blitters.h +++ b/src_c/simd_blitters.h @@ -55,7 +55,8 @@ premul_surf_color_by_alpha_non_simd(SDL_Surface *src, PG_PixelFormat *dst_format, SDL_Palette *dst_palette); void -premul_surf_color_by_alpha_sse2(SDL_Surface *src, SDL_Surface *dst); +premul_surf_color_by_alpha_sse2(SDL_Surface *src, PG_PixelFormat *srcfmt, + SDL_Surface *dst); void alphablit_alpha_avx2_argb_no_surf_alpha_opaque_dst(SDL_BlitInfo *info); @@ -86,4 +87,5 @@ blit_blend_rgb_min_avx2(SDL_BlitInfo *info); void blit_blend_premultiplied_avx2(SDL_BlitInfo *info); void -premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst); +premul_surf_color_by_alpha_avx2(SDL_Surface *src, PG_PixelFormat *src_format, + SDL_Surface *dst); diff --git a/src_c/simd_blitters_avx2.c b/src_c/simd_blitters_avx2.c index d113b2b87e..aaf686c81d 100644 --- a/src_c/simd_blitters_avx2.c +++ b/src_c/simd_blitters_avx2.c @@ -1561,7 +1561,8 @@ blit_blend_premultiplied_avx2(SDL_BlitInfo *info) #if defined(__AVX2__) && defined(HAVE_IMMINTRIN_H) && \ !defined(SDL_DISABLE_IMMINTRIN_H) void -premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst) +premul_surf_color_by_alpha_avx2(SDL_Surface *src, PG_PixelFormat *src_format, + SDL_Surface *dst) { int i, height = src->h; const int width = src->w; @@ -1578,7 +1579,7 @@ premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst) __m256i mm_src, mm_dst, alphaA, alphaB, mm_alpha_in; __m256i mm_srcA, mm_srcB; - const __m256i mm256_amask = _mm256_set1_epi32(src->format->Amask); + const __m256i mm256_amask = _mm256_set1_epi32(src_format->Amask); const __m256i mm_zero = _mm256_setzero_si256(); const __m256i partial_mask = _mm256_set_epi32(0, pxl_excess > 6 ? -1 : 0, pxl_excess > 5 ? -1 : 0, @@ -1587,10 +1588,10 @@ premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst) pxl_excess > 0 ? -1 : 0); const __m256i mm256_ones = _mm256_set1_epi16(0x0001); - char _a_off = ((src->format->Amask >> 8) == 0) ? 0 - : ((src->format->Amask >> 16) == 0) ? 1 - : ((src->format->Amask >> 24) == 0) ? 2 - : 3; + char _a_off = ((src_format->Amask >> 8) == 0) ? 0 + : ((src_format->Amask >> 16) == 0) ? 1 + : ((src_format->Amask >> 24) == 0) ? 2 + : 3; /* masks for shuffling the alpha to the RGB channels for multiplication */ const __m256i shuffle_maskA = _mm256_set_epi8( @@ -1637,7 +1638,8 @@ premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst) } #else void -premul_surf_color_by_alpha_avx2(SDL_Surface *src, SDL_Surface *dst) +premul_surf_color_by_alpha_avx2(SDL_Surface *src, PG_PixelFormat *src_format, + SDL_Surface *dst) { BAD_AVX2_FUNCTION_CALL; } diff --git a/src_c/simd_blitters_sse2.c b/src_c/simd_blitters_sse2.c index 65bb926721..573861580c 100644 --- a/src_c/simd_blitters_sse2.c +++ b/src_c/simd_blitters_sse2.c @@ -151,8 +151,8 @@ alphablit_alpha_sse2_argb_surf_alpha(SDL_BlitInfo *info) Uint32 *dstp = (Uint32 *)info->d_pixels; int dstskip = info->d_skip >> 2; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; // int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); // int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); @@ -293,8 +293,8 @@ alphablit_alpha_sse2_argb_no_surf_alpha(SDL_BlitInfo *info) int height = info->height; int srcskip = info->s_skip >> 2; int dstskip = info->d_skip >> 2; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + PG_PixelFormat *srcfmt = info->src; + PG_PixelFormat *dstfmt = info->dst; /* Original 'Straight Alpha' blending equation: -------------------------------------------- @@ -719,7 +719,7 @@ blit_blend_premultiplied_sse2(SDL_BlitInfo *info) int srcskip = info->s_skip >> 2; Uint32 *dstp = (Uint32 *)info->d_pixels; int dstskip = info->d_skip >> 2; - SDL_PixelFormat *srcfmt = info->src; + PG_PixelFormat *srcfmt = info->src; Uint32 amask = srcfmt->Amask; // Uint64 multmask; Uint64 ones; @@ -787,15 +787,14 @@ blit_blend_premultiplied_sse2(SDL_BlitInfo *info) } void -premul_surf_color_by_alpha_sse2(SDL_Surface *src, SDL_Surface *dst) +premul_surf_color_by_alpha_sse2(SDL_Surface *src, PG_PixelFormat *srcfmt, + SDL_Surface *dst) { int n; int width = src->w; int height = src->h; Uint32 *srcp = (Uint32 *)src->pixels; Uint32 *dstp = (Uint32 *)dst->pixels; - - SDL_PixelFormat *srcfmt = src->format; Uint32 amask = srcfmt->Amask; Uint64 ones; From f844ee7fbb971038334e53d1440d39f207de9d67 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 31 May 2025 02:34:56 -0700 Subject: [PATCH 344/441] Centralize and expand SDL3 SIMD compat --- src_c/_surface.h | 24 ++++++++++++++++++++++++ src_c/simd_transform.h | 18 ------------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src_c/_surface.h b/src_c/_surface.h index bb07437d0f..909ab5942e 100644 --- a/src_c/_surface.h +++ b/src_c/_surface.h @@ -27,4 +27,28 @@ #include "_pygame.h" #include "surface.h" +// Some simd compat stuff going here for now. +#if PG_SDL3 +// SDL3 no longer includes intrinsics by default, we need to do it explicitly +#include + +/* If SDL_AVX2_INTRINSICS is defined by SDL3, we need to set macros that our + * code checks for avx2 build time support */ +#ifdef SDL_AVX2_INTRINSICS +#ifndef HAVE_IMMINTRIN_H +#define HAVE_IMMINTRIN_H 1 +#endif /* HAVE_IMMINTRIN_H*/ +#ifndef __AVX2__ +#define __AVX2__ +#endif /* __AVX2__*/ +#endif /* SDL_AVX2_INTRINSICS*/ + +// TODO reenable this to test best +#ifdef SDL_SSE2_INTRINSICS +#ifndef __SSE2__ +#define __SSE2__ +#endif /* __SSE2__*/ +#endif /* SDL_SSE2_INTRINSICS*/ +#endif /* PG_SDL3 */ + #endif diff --git a/src_c/simd_transform.h b/src_c/simd_transform.h index 30f0379568..3b01f925c3 100644 --- a/src_c/simd_transform.h +++ b/src_c/simd_transform.h @@ -1,24 +1,6 @@ #define NO_PYGAME_C_API #include "_surface.h" -/* TODO: This compat code should probably go in some place like simd_shared.h - * That header file however is inconsistently used at the moment and not - * included wherever it should be. - * this block will be needed by simd_blitters and simd_fill */ - -#if PG_SDL3 -// SDL3 no longer includes intrinsics by default, we need to do it explicitly -#include - -/* If SDL_AVX2_INTRINSICS is defined by SDL3, we need to set macros that our - * code checks for avx2 build time support */ -#ifdef SDL_AVX2_INTRINSICS -#ifndef HAVE_IMMINTRIN_H -#define HAVE_IMMINTRIN_H 1 -#endif /* HAVE_IMMINTRIN_H*/ -#endif /* SDL_AVX2_INTRINSICS*/ -#endif /* PG_SDL3 */ - /** * MACRO borrowed from SSE2NEON - useful for making the shuffling family of * intrinsics easier to understand by indicating clearly what will go where. From 2901dfa704da8f1f2cfca0a8b629915ac062c0b0 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 21 Jun 2025 02:16:51 -0700 Subject: [PATCH 345/441] Restrict set_alpha RLE hack to SDL2 We'll figure out SDL3 relevance later, right now it's just important to get Surface compiling. --- src_c/surface.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index 895060dfb5..eeabd29965 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1496,8 +1496,6 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) PyObject *alpha_obj = NULL, *intobj = NULL; Uint8 alpha; int alphaval = 255; - SDL_Rect sdlrect; - SDL_Surface *surface; if (!PyArg_ParseTuple(args, "|Oi", &alpha_obj, &flags)) { return NULL; @@ -1546,24 +1544,24 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) bool success = PG_SetSurfaceRLE(surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); /* HACK HACK HACK */ -#if SDL_VERSION_ATLEAST(3, 0, 0) - if (SDL_SurfaceHasRLE(surf) && (!(flags & PGS_RLEACCEL))) -#else - if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) -#endif - { + // TODO: SDL3: figure out how to port this or if it's relevant to SDL3. +#if !SDL_VERSION_ATLEAST(3, 0, 0) + if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) { /* hack to strip SDL_RLEACCEL flag off surface immediately when it is not requested */ + SDL_Rect sdlrect; sdlrect.x = 0; sdlrect.y = 0; sdlrect.h = 0; sdlrect.w = 0; - surface = PG_CreateSurface(1, 1, PG_SURF_FORMATENUM(surf)); + SDL_Surface *surface = + PG_CreateSurface(1, 1, PG_SURF_FORMATENUM(surf)); SDL_LowerBlit(surf, &sdlrect, surface, &sdlrect); SDL_FreeSurface(surface); } +#endif /* HACK HACK HACK */ if (success) { success = PG_SetSurfaceAlphaMod(surf, alpha); From 20440c33b9d242aeec4b9bf810fe50b0e3d5ea0e Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 21 Jun 2025 13:18:33 -0700 Subject: [PATCH 346/441] Fix incorrect clip rect port, add TODO SDL3 comment Update surface.c --- src_c/surface.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src_c/surface.c b/src_c/surface.c index eeabd29965..42e5963365 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1544,7 +1544,7 @@ surf_set_alpha(pgSurfaceObject *self, PyObject *args) bool success = PG_SetSurfaceRLE(surf, (flags & PGS_RLEACCEL) ? SDL_TRUE : SDL_FALSE); /* HACK HACK HACK */ - // TODO: SDL3: figure out how to port this or if it's relevant to SDL3. + // TODO SDL3: figure out how to port this or if it's relevant to SDL3. #if !SDL_VERSION_ATLEAST(3, 0, 0) if ((surf->flags & SDL_RLEACCEL) && (!(flags & PGS_RLEACCEL))) { /* hack to strip SDL_RLEACCEL flag off surface immediately when @@ -3019,6 +3019,8 @@ surf_get_flags(PyObject *self, PyObject *_null) if (PG_SurfaceHasRLE(surf)) { flags |= PGS_RLEACCELOK; } + // TODO SDL3: figure out how to properly emulate SDL2 check/relevance + // Current implementation is just a placeholder. #if SDL_VERSION_ATLEAST(3, 0, 0) if (SDL_SurfaceHasRLE(surf)) { flags |= PGS_RLEACCEL; @@ -4379,8 +4381,8 @@ surf_get_pixels_address(PyObject *self, PyObject *closure) } static int -surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Rect *srcclip, - SDL_Surface *dst, SDL_Rect *dstrect) +surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, + SDL_Rect *dstrect, SDL_Rect *clip) { Uint8 *srcpixels; Uint8 *dstpixels; @@ -4414,23 +4416,23 @@ surface_do_overlap(SDL_Surface *src, SDL_Rect *srcrect, SDL_Rect *srcclip, } /* clip the destination rectangle against the clip rectangle */ - x = srcclip->x - dstx; + x = clip->x - dstx; if (x > 0) { w -= x; dstx += x; srcx += x; } - x = dstx + w - srcclip->x - srcclip->w; + x = dstx + w - clip->x - clip->w; if (x > 0) { w -= x; } - y = srcclip->y - dsty; + y = clip->y - dsty; if (y > 0) { h -= y; dsty += y; srcy += y; } - y = dsty + h - srcclip->y - srcclip->h; + y = dsty + h - clip->y - clip->h; if (y > 0) { h -= y; } @@ -4468,12 +4470,12 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, SDL_Surface *dst = pgSurface_AsSurface(dstobj); SDL_Surface *subsurface = NULL; int result, suboffsetx = 0, suboffsety = 0; - SDL_Rect orig_clip, sub_clip, srcclip; + SDL_Rect orig_clip, sub_clip, dstclip; #if !SDL_VERSION_ATLEAST(3, 0, 0) Uint8 alpha; #endif - if (!PG_GetSurfaceClipRect(src, &srcclip)) { + if (!PG_GetSurfaceClipRect(dst, &dstclip)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return 0; } @@ -4521,7 +4523,7 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, owner is locked. */ dst->pixels == src->pixels && srcrect != NULL && - surface_do_overlap(src, srcrect, &srcclip, dst, dstrect))) { + surface_do_overlap(src, srcrect, dst, dstrect, &dstclip))) { /* Py_BEGIN_ALLOW_THREADS */ result = pygame_Blit(src, srcrect, dst, dstrect, blend_flags); /* Py_END_ALLOW_THREADS */ From 2061b1161138b18dad333d028f24fded47776067 Mon Sep 17 00:00:00 2001 From: zoldalma <46655437+zoldalma999@users.noreply.github.com> Date: Mon, 14 Jul 2025 21:50:45 +0200 Subject: [PATCH 347/441] Add stubs as dependencies to doc pages --- docs/reST/ext/documenters.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/reST/ext/documenters.py b/docs/reST/ext/documenters.py index 9ecec61f38..3c9438edae 100644 --- a/docs/reST/ext/documenters.py +++ b/docs/reST/ext/documenters.py @@ -74,6 +74,18 @@ def get_doc(env, obj): class AutopgDocumenter(autoapi.documenters.AutoapiDocumenter): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + stub_path = self.env.srcdir.parent.parent / "buildconfig" / "stubs" / "pygame" + stub_file = stub_path / f"{self.env.docname.removeprefix('ref/')}.pyi" + if stub_file.exists(): + self.env.note_dependency(stub_file.as_posix()) + + src_path = self.env.srcdir.parent.parent / "src_py" + src_file = src_path / f"{self.env.docname.removeprefix('ref/')}.py" + if src_file.exists(): + self.env.note_dependency(src_file.as_posix()) + def format_signature(self, **kwargs): return "" From 279db571a48c2c381fd817154c556e13d3bf186a Mon Sep 17 00:00:00 2001 From: Damiano <97639432+damusss@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:22:52 +0200 Subject: [PATCH 348/441] update build command message Co-authored-by: Ankith --- dev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev.py b/dev.py index 13ec327b07..f09192f7be 100644 --- a/dev.py +++ b/dev.py @@ -359,7 +359,7 @@ def parse_args(self): # Build command build_parser = subparsers.add_parser( - "build", help="Build the project", aliases=["install"] + "build", help="Build and install the project", aliases=["install"] ) build_parser.add_argument( "--wheel", From 3f627077d54088e40d2f980c27d1e2fd371703a3 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Thu, 24 Jul 2025 00:20:14 -0700 Subject: [PATCH 349/441] Fix refcount tests for Python 3.14 See https://docs.python.org/3.14/whatsnew/3.14.html#whatsnew314-refcount --- test/freetype_test.py | 7 +++--- test/mask_test.py | 56 +++++++++++++++++++++---------------------- test/rwobject_test.py | 31 ++++++++++-------------- 3 files changed, 45 insertions(+), 49 deletions(-) diff --git a/test/freetype_test.py b/test/freetype_test.py index dcc85c9b1b..56044d9d4c 100644 --- a/test/freetype_test.py +++ b/test/freetype_test.py @@ -4,6 +4,7 @@ import os import pathlib import platform +import sys import unittest import weakref @@ -1611,16 +1612,16 @@ def ref_items(seq): else: array = arrinter.Array(rect.size, "u", 1) o = font.render_raw(text) - self.assertEqual(getrefcount(o), 2) + self.assertIn(getrefcount(o), (1, 2)) self.assertEqual(getrefcount(o[0]), 2) self.assertEqual(getrefcount(o[1]), 2) self.assertEqual(getrefcount(font.render_raw_to(array, text)), 1) o = font.get_metrics("AB") - self.assertEqual(getrefcount(o), 2) + self.assertIn(getrefcount(o), (1, 2)) for i in range(len(o)): self.assertEqual(getrefcount(o[i]), 2, "refcount fail for item %d" % i) o = font.get_sizes() - self.assertEqual(getrefcount(o), 2) + self.assertIn(getrefcount(o), (1, 2)) for i in range(len(o)): self.assertEqual(getrefcount(o[i]), 2, "refcount fail for item %d" % i) diff --git a/test/mask_test.py b/test/mask_test.py index 7a024caad7..9b7235e219 100644 --- a/test/mask_test.py +++ b/test/mask_test.py @@ -2569,7 +2569,7 @@ def test_get_bounding_rects(self): @unittest.skipIf(IS_PYPY, "Segfaults on pypy") def test_to_surface(self): """Ensures empty and full masks can be drawn onto surfaces.""" - expected_ref_count = 3 + expected_ref_count = (2, 3) size = (33, 65) surface = pygame.Surface(size, SRCALPHA, 32) surface_color = pygame.Color("red") @@ -2583,13 +2583,13 @@ def test_to_surface(self): self.assertIs(to_surface, surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertEqual(to_surface.get_size(), size) assertSurfaceFilled(self, to_surface, expected_color) def test_to_surface__create_surface(self): """Ensures empty and full masks can be drawn onto a created surface.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 size = (33, 65) @@ -2606,7 +2606,7 @@ def test_to_surface__create_surface(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2614,7 +2614,7 @@ def test_to_surface__create_surface(self): def test_to_surface__surface_param(self): """Ensures to_surface accepts a surface arg/kwarg.""" - expected_ref_count = 4 + expected_ref_count = (3, 4) expected_color = pygame.Color("white") surface_color = pygame.Color("red") size = (5, 3) @@ -2632,13 +2632,13 @@ def test_to_surface__surface_param(self): self.assertIs(to_surface, surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertEqual(to_surface.get_size(), size) assertSurfaceFilled(self, to_surface, expected_color) def test_to_surface__setsurface_param(self): """Ensures to_surface accepts a setsurface arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("red") @@ -2657,7 +2657,7 @@ def test_to_surface__setsurface_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2665,7 +2665,7 @@ def test_to_surface__setsurface_param(self): def test_to_surface__unsetsurface_param(self): """Ensures to_surface accepts a unsetsurface arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("red") @@ -2683,7 +2683,7 @@ def test_to_surface__unsetsurface_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2691,7 +2691,7 @@ def test_to_surface__unsetsurface_param(self): def test_to_surface__setcolor_param(self): """Ensures to_surface accepts a setcolor arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("red") @@ -2707,7 +2707,7 @@ def test_to_surface__setcolor_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2728,7 +2728,7 @@ def test_to_surface__setcolor_default(self): def test_to_surface__unsetcolor_param(self): """Ensures to_surface accepts an unsetcolor arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("red") @@ -2746,7 +2746,7 @@ def test_to_surface__unsetcolor_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2767,7 +2767,7 @@ def test_to_surface__unsetcolor_default(self): def test_to_surface__dest_param(self): """Ensures to_surface accepts a dest arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 default_surface_color = (0, 0, 0, 0) @@ -2791,7 +2791,7 @@ def test_to_surface__dest_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -2822,7 +2822,7 @@ def test_to_surface__dest_default(self): def test_to_surface__area_param(self): """Ensures to_surface accepts an area arg/kwarg.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 default_surface_color = (0, 0, 0, 0) @@ -2845,7 +2845,7 @@ def test_to_surface__area_param(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), size) @@ -3594,7 +3594,7 @@ def test_to_surface__default_surface_with_param_combinations(self): This tests many parameter combinations with full and empty masks. """ - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 size = (5, 3) @@ -3661,7 +3661,7 @@ def test_to_surface__default_surface_with_param_combinations(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual( + self.assertIn( sys.getrefcount(to_surface), expected_ref_count ) self.assertTrue(to_surface.get_flags() & expected_flag) @@ -3678,7 +3678,7 @@ def test_to_surface__surface_with_param_combinations(self): This tests many parameter combinations with full and empty masks. """ - expected_ref_count = 4 + expected_ref_count = (3, 4) expected_flag = SRCALPHA expected_depth = 32 size = (5, 3) @@ -3748,7 +3748,7 @@ def test_to_surface__surface_with_param_combinations(self): self.assertIs(to_surface, surface) if not IS_PYPY: - self.assertEqual( + self.assertIn( sys.getrefcount(to_surface), expected_ref_count ) self.assertTrue(to_surface.get_flags() & expected_flag) @@ -5529,7 +5529,7 @@ def test_to_surface__area_off_mask_with_setsurface_unsetsurface(self): def test_to_surface__surface_with_zero_size(self): """Ensures zero sized surfaces are handled correctly.""" - expected_ref_count = 3 + expected_ref_count = (2, 3) size = (0, 0) surface = pygame.Surface(size) mask = pygame.mask.Mask((3, 4), fill=True) @@ -5538,12 +5538,12 @@ def test_to_surface__surface_with_zero_size(self): self.assertIs(to_surface, surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertEqual(to_surface.get_size(), size) def test_to_surface__setsurface_with_zero_size(self): """Ensures zero sized setsurfaces are handled correctly.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("white") # Default setcolor. @@ -5555,7 +5555,7 @@ def test_to_surface__setsurface_with_zero_size(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), mask_size) @@ -5563,7 +5563,7 @@ def test_to_surface__setsurface_with_zero_size(self): def test_to_surface__unsetsurface_with_zero_size(self): """Ensures zero sized unsetsurfaces are handled correctly.""" - expected_ref_count = 2 + expected_ref_count = (1, 2) expected_flag = SRCALPHA expected_depth = 32 expected_color = pygame.Color("black") # Default unsetcolor. @@ -5575,7 +5575,7 @@ def test_to_surface__unsetsurface_with_zero_size(self): self.assertIsInstance(to_surface, pygame.Surface) if not IS_PYPY: - self.assertEqual(sys.getrefcount(to_surface), expected_ref_count) + self.assertIn(sys.getrefcount(to_surface), expected_ref_count) self.assertTrue(to_surface.get_flags() & expected_flag) self.assertEqual(to_surface.get_bitsize(), expected_depth) self.assertEqual(to_surface.get_size(), mask_size) diff --git a/test/rwobject_test.py b/test/rwobject_test.py index e12cb2b2f2..a827724bf5 100644 --- a/test/rwobject_test.py +++ b/test/rwobject_test.py @@ -1,12 +1,14 @@ import pathlib +import platform +import sys import unittest from pygame import encode_file_path, encode_string +IS_PYPY = "PyPy" == platform.python_implementation() -class RWopsEncodeStringTest(unittest.TestCase): - global getrefcount +class RWopsEncodeStringTest(unittest.TestCase): def test_obj_None(self): encoded_string = encode_string(None) @@ -68,22 +70,15 @@ def test_string_with_null_bytes(self): self.assertIs(encoded_string, b) self.assertEqual(encoded_decode_string, b) - try: - from sys import getrefcount as _g - - getrefcount = _g # This nonsense is for Python 3.x - except ImportError: - pass - else: - - def test_refcount(self): - bpath = b" This is a string that is not cached."[1:] - upath = bpath.decode("ascii") - before = getrefcount(bpath) - bpath = encode_string(bpath) - self.assertEqual(getrefcount(bpath), before) - bpath = encode_string(upath) - self.assertEqual(getrefcount(bpath), before) + @unittest.skipIf(IS_PYPY, "getrefcount not available on pypy") + def test_refcount(self): + bpath = b" This is a string that is not cached."[1:] + upath = bpath.decode("ascii") + before = sys.getrefcount(bpath) + bpath = encode_string(bpath) + self.assertEqual(sys.getrefcount(bpath), before) + bpath = encode_string(upath) + self.assertIn(sys.getrefcount(bpath), (before, before - 1)) def test_smp(self): utf_8 = b"a\xf0\x93\x82\xa7b" From 921e3a99c5c1247af46e7476da252ca886cde701 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Jul 2025 07:40:20 +0000 Subject: [PATCH 350/441] Bump pypa/cibuildwheel from 3.0.1 to 3.1.1 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.0.1 to 3.1.1. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v3.0.1...v3.1.1) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.1.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 896d840434..d4585be9c6 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -118,7 +118,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.0.1 + uses: pypa/cibuildwheel@v3.1.1 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 01575dcb7d..ce7d93edcc 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -74,7 +74,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v3.0.1 + uses: pypa/cibuildwheel@v3.1.1 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 1138ee12d2..da7667d929 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -43,7 +43,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.0.1 + uses: pypa/cibuildwheel@v3.1.1 - uses: actions/upload-artifact@v4 with: From 26bf5853cb2115f0c20e2e13168e365c85becb4d Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 27 Jul 2025 13:29:09 +0530 Subject: [PATCH 351/441] Add python 3.14, skip freethreaded and numpy test --- pyproject.toml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 98afd16cea..5e167e720a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,8 +75,8 @@ install = ['--tags=runtime,python-runtime,pg-tag'] # dependencies. Here is where uv comes into the picture. It is an "installer" like pip, # but faster. It has been observed to save a couple of minutes of CI time. build-frontend = "build[uv]" -build = "cp3{9,10,11,12,13}-* pp3{10,11}-*" -skip = "*-musllinux_*" +build = "cp3{9,10,11,12,13,14}-* pp3{10,11}-*" +skip = ["*-musllinux_*", "cp31?t-*"] # build[uv] is verbose by default, so below flag is not needed here # build-verbosity = 3 @@ -122,6 +122,8 @@ only-binary = ["numpy"] # 1. skip all 32-bit manylinux (i686) # 2. skip all pypy+arm combinations +# 3. skip pypy 3.11 manylinux and cpython 3.14 manylinux (numpy has newer manylinux +# wheels for this which is incompatible with our manylinux version) [[tool.cibuildwheel.overrides]] -select = "{*-manylinux_i686,pp*-*{arm64,aarch64},pp311-manylinux_x86_64}" +select = "{*-manylinux_i686,pp*-*{arm64,aarch64},pp311-manylinux_x86_64,cp314-manylinux_*}" test-requires = [] From 801a9c200a2c1a6f53628c354c0b3bdae38e59bc Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 27 Jul 2025 13:12:34 +0530 Subject: [PATCH 352/441] Bump manylinux base image --- buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-i686 | 2 +- buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 | 2 +- .../docker_base/libsamplerate/build-libsamplerate.sh | 6 ++++-- buildconfig/manylinux-build/docker_base/ogg/build-ogg.sh | 5 +++-- buildconfig/manylinux-build/docker_base/ogg/ogg.sha512 | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 index 0513259466..b97797b7c1 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-aarch64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_aarch64:2025.03.09-1 +FROM quay.io/pypa/manylinux2014_aarch64:2025.07.25-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 index 46ca8263c0..a51122c001 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-i686 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-i686 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_i686:2025.03.09-1 +FROM quay.io/pypa/manylinux2014_i686:2025.07.25-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 index 8ddf38eee5..2e76e2cbd6 100644 --- a/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 +++ b/buildconfig/manylinux-build/docker_base/Dockerfile-x86_64 @@ -1,5 +1,5 @@ # pin version on image for CI stability -FROM quay.io/pypa/manylinux2014_x86_64:2025.03.09-1 +FROM quay.io/pypa/manylinux2014_x86_64:2025.07.25-1 ENV MAKEFLAGS="-j 4" ENV PG_DEP_PREFIX="/usr/local" diff --git a/buildconfig/manylinux-build/docker_base/libsamplerate/build-libsamplerate.sh b/buildconfig/manylinux-build/docker_base/libsamplerate/build-libsamplerate.sh index 8e4f70915c..a9cadf79c4 100644 --- a/buildconfig/manylinux-build/docker_base/libsamplerate/build-libsamplerate.sh +++ b/buildconfig/manylinux-build/docker_base/libsamplerate/build-libsamplerate.sh @@ -20,7 +20,8 @@ cd ${FFTW} mkdir build cd build -cmake .. $PG_BASE_CMAKE_FLAGS +# CMake 3.5 or higher policy is required for buiding under CMake 4 +cmake .. $PG_BASE_CMAKE_FLAGS -DCMAKE_POLICY_VERSION_MINIMUM=3.5 make make install @@ -32,6 +33,7 @@ cd $LIBSAMPLERATE mkdir build cd build -cmake .. $PG_BASE_CMAKE_FLAGS +# CMake 3.5 or higher policy is required for buiding under CMake 4 +cmake .. $PG_BASE_CMAKE_FLAGS -DCMAKE_POLICY_VERSION_MINIMUM=3.5 make make install diff --git a/buildconfig/manylinux-build/docker_base/ogg/build-ogg.sh b/buildconfig/manylinux-build/docker_base/ogg/build-ogg.sh index 871056019c..5d5bb67ec1 100644 --- a/buildconfig/manylinux-build/docker_base/ogg/build-ogg.sh +++ b/buildconfig/manylinux-build/docker_base/ogg/build-ogg.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -OGG=libogg-1.3.5 +OGG=libogg-1.3.6 VORBIS=libvorbis-1.3.7 curl -sL --retry 10 http://downloads.xiph.org/releases/ogg/${OGG}.tar.gz > ${OGG}.tar.gz @@ -22,6 +22,7 @@ cd .. tar xzf ${VORBIS}.tar.gz cd $VORBIS -cmake . $PG_BASE_CMAKE_FLAGS +# CMake 3.5 or higher policy is required for buiding under CMake 4 +cmake . $PG_BASE_CMAKE_FLAGS -DCMAKE_POLICY_VERSION_MINIMUM=3.5 make make install diff --git a/buildconfig/manylinux-build/docker_base/ogg/ogg.sha512 b/buildconfig/manylinux-build/docker_base/ogg/ogg.sha512 index 59fd7a19e1..8a00c9199d 100644 --- a/buildconfig/manylinux-build/docker_base/ogg/ogg.sha512 +++ b/buildconfig/manylinux-build/docker_base/ogg/ogg.sha512 @@ -1,2 +1,2 @@ -e4d798621bb04a62dcb831e58a444357635ab3bcb9efbdffa009cb0be1cafb5e72bf71cbcad5305aa5268a92076a03a7e564a19c0c8d54b93a05d9b03ad2da6b libogg-1.3.5.tar.gz +5e4a136506a8ce5ca55dfd7426303631285e3e001b52963ac66582cbfb59095a0f07e2df94e733d5f4037cc5416bc091f75a85bee3db6056d806f8fe30a0e28a libogg-1.3.6.tar.gz 8a83ac9e9197f32fad4430946dba3927921320492f9e96cda546e8eb3981e2664da97f77e43cb197577ec056437785168ca7c4138f8bf7f2ba93899846932eb2 libvorbis-1.3.7.tar.gz From 8b80d4c4719eb705aac485afe8d95b4925ba6d7d Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 27 Jul 2025 01:07:58 -0700 Subject: [PATCH 353/441] Show support for Python 3.14 --- pyproject.toml | 1 + setup.py | 1 + 2 files changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 5e167e720a..01c4447201 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Games/Entertainment", diff --git a/setup.py b/setup.py index 001edc3e2c..1bf4831ece 100644 --- a/setup.py +++ b/setup.py @@ -44,6 +44,7 @@ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Games/Entertainment", From 51b061f974a614825b5a112d58f879d56549cc7e Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 27 Jul 2025 13:13:17 +0530 Subject: [PATCH 354/441] Bump build dependencies --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-windows.yml | 2 +- dev.py | 4 ++-- pyproject.toml | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index d4585be9c6..fd3c9c511a 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -115,7 +115,7 @@ jobs: - name: Install uv for speed uses: astral-sh/setup-uv@v6 with: - version: "0.5.26" + version: "0.8.3" - name: Build and test wheels uses: pypa/cibuildwheel@v3.1.1 diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index da7667d929..c08e6a40b7 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -40,7 +40,7 @@ jobs: - name: Install uv for speed uses: astral-sh/setup-uv@v6 with: - version: "0.5.26" + version: "0.8.3" - name: Build and test wheels uses: pypa/cibuildwheel@v3.1.1 diff --git a/dev.py b/dev.py index 7ed720a134..144507b3c1 100644 --- a/dev.py +++ b/dev.py @@ -196,9 +196,9 @@ def __init__(self) -> None: "build": get_build_deps(), "docs": get_build_deps(), "test": {"numpy"}, - "lint": {"pylint==3.3.1", "numpy"}, + "lint": {"pylint==3.3.7", "numpy"}, "stubs": {"mypy==1.13.0", "numpy"}, - "format": {"pre-commit==4.0.1"}, + "format": {"pre-commit==4.2.0"}, } self.deps["all"] = set() for k in self.deps.values(): diff --git a/pyproject.toml b/pyproject.toml index 01c4447201..b1a88d22ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,12 +54,12 @@ pygame_ce = 'pygame.__briefcase.pygame_ce:PygameCEGuiBootstrap' [build-system] requires = [ - "meson-python<=0.17.1", - "meson<=1.7.0", + "meson-python<=0.18.0", + "meson<=1.8.2", "ninja<=1.12.1", "cython<=3.1.2", - "sphinx<=8.1.3", - "sphinx-autoapi<=3.3.2", + "sphinx<=8.2.3", + "sphinx-autoapi<=3.6.0", "pyproject-metadata!=0.9.1", ] build-backend = 'mesonpy' From 96579650381b5b1fbef3ab620f54e0cd35b759f7 Mon Sep 17 00:00:00 2001 From: Ankith Date: Tue, 29 Jul 2025 18:03:20 +0530 Subject: [PATCH 355/441] Bump mac/manylinux dependencies --- buildconfig/macdependencies/build_mac_deps.sh | 3 +++ .../manylinux-build/docker_base/alsa/alsa.sha512 | 2 +- .../manylinux-build/docker_base/alsa/build-alsa.sh | 2 +- .../manylinux-build/docker_base/buildtools/install.sh | 2 +- .../manylinux-build/docker_base/flac/build-flac.sh | 2 +- .../manylinux-build/docker_base/flac/flac.sha512 | 2 +- .../docker_base/fluidsynth/build-fluidsynth.sh | 2 +- .../docker_base/fluidsynth/fluidsynth.sha512 | 2 +- .../docker_base/freetype/build-freetype.sh | 5 ++++- .../docker_base/freetype/freetype.sha512 | 2 +- .../docker_base/libdecor/build-libdecor.sh | 2 +- .../docker_base/libdecor/libdecor.sha512sum | 2 +- .../manylinux-build/docker_base/libffi/build-libffi.sh | 2 +- .../manylinux-build/docker_base/libffi/libffi.sha512 | 2 +- .../docker_base/libjpegturbo/build-jpeg-turbo.sh | 2 +- .../docker_base/libjpegturbo/libjpegturbo.sha512 | 2 +- .../docker_base/libpipewire/build-libpipewire.sh | 1 + .../manylinux-build/docker_base/libpng/build-png.sh | 2 +- .../manylinux-build/docker_base/libpng/png.sha512 | 2 +- .../manylinux-build/docker_base/libtiff/build-tiff.sh | 10 ++++------ .../docker_base/libxml2/build-libxml2.sh | 2 +- .../manylinux-build/docker_base/libxml2/libxml2.sha512 | 2 +- .../manylinux-build/docker_base/libxmp/build-libxmp.sh | 2 +- .../manylinux-build/docker_base/libxmp/libxmp.sha512 | 2 +- .../docker_base/mesa/glslang/build-glslang.sh | 2 +- .../docker_base/mesa/glslang/glslang.sha512sum | 2 +- .../docker_base/mesa/mako/build-mako.sh | 2 +- .../docker_base/mesa/mesa/build-mesa.sh | 2 +- .../docker_base/mesa/mesa/mesa.sha512sum | 2 +- .../manylinux-build/docker_base/mpg123/build-mpg123.sh | 2 +- .../manylinux-build/docker_base/mpg123/mpg123.sha512 | 2 +- .../docker_base/zlib-ng/build-zlib-ng.sh | 2 +- .../manylinux-build/docker_base/zlib-ng/zlib-ng.sha512 | 2 +- 33 files changed, 41 insertions(+), 36 deletions(-) diff --git a/buildconfig/macdependencies/build_mac_deps.sh b/buildconfig/macdependencies/build_mac_deps.sh index e4ddb8c817..95c9f9f9bc 100644 --- a/buildconfig/macdependencies/build_mac_deps.sh +++ b/buildconfig/macdependencies/build_mac_deps.sh @@ -65,6 +65,9 @@ cd ../manylinux-build/docker_base # install some buildtools bash buildtools/install.sh +# sdl dep +bash libsamplerate/build-libsamplerate.sh + # sdl_image deps bash zlib-ng/build-zlib-ng.sh bash libpng/build-png.sh # depends on zlib diff --git a/buildconfig/manylinux-build/docker_base/alsa/alsa.sha512 b/buildconfig/manylinux-build/docker_base/alsa/alsa.sha512 index eef7e8f50e..f34ba2a502 100644 --- a/buildconfig/manylinux-build/docker_base/alsa/alsa.sha512 +++ b/buildconfig/manylinux-build/docker_base/alsa/alsa.sha512 @@ -1 +1 @@ -b0c0666e38e881dca985b61386523c045c71072a88be4952c986ffbe2107ec736da528858ebeffdf439de5c290914bf3facc654100a228c6d26fff9429142ef0 alsa-lib-1.2.13.tar.bz2 +2716cc3a2299da4a1a170d734af082d78dc452b253179d0f1a9ec190140734aecf002b6924eec4ff2699ce88ce1ae5c56821c267f36384910984db726d1f9626 alsa-lib-1.2.14.tar.bz2 diff --git a/buildconfig/manylinux-build/docker_base/alsa/build-alsa.sh b/buildconfig/manylinux-build/docker_base/alsa/build-alsa.sh index a401aadfdf..88e05e4cbd 100644 --- a/buildconfig/manylinux-build/docker_base/alsa/build-alsa.sh +++ b/buildconfig/manylinux-build/docker_base/alsa/build-alsa.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -ALSA=alsa-lib-1.2.13 +ALSA=alsa-lib-1.2.14 curl -sL https://www.alsa-project.org/files/pub/lib/${ALSA}.tar.bz2 > ${ALSA}.tar.bz2 sha512sum -c alsa.sha512 diff --git a/buildconfig/manylinux-build/docker_base/buildtools/install.sh b/buildconfig/manylinux-build/docker_base/buildtools/install.sh index 2b61d4d87f..950e19d6fd 100644 --- a/buildconfig/manylinux-build/docker_base/buildtools/install.sh +++ b/buildconfig/manylinux-build/docker_base/buildtools/install.sh @@ -17,7 +17,7 @@ fi # pin versions for stability (remember to keep updated) python3 -m pip install $PG_PIP_EXTRA_FLAGS \ - setuptools==75.8.0 cmake==3.31.4 meson==1.7.0 ninja==1.11.1.3 + setuptools==80.9.0 meson==1.8.2 ninja==1.11.1.4 if [[ "$OSTYPE" == "linux-gnu"* ]]; then cp /root/.local/bin/* /usr/bin diff --git a/buildconfig/manylinux-build/docker_base/flac/build-flac.sh b/buildconfig/manylinux-build/docker_base/flac/build-flac.sh index fc2de73ee1..37b656f4d7 100644 --- a/buildconfig/manylinux-build/docker_base/flac/build-flac.sh +++ b/buildconfig/manylinux-build/docker_base/flac/build-flac.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -FLAC=flac-1.4.3 +FLAC=flac-1.5.0 curl -sL --retry 10 http://downloads.xiph.org/releases/flac/${FLAC}.tar.xz > ${FLAC}.tar.xz sha512sum -c flac.sha512 diff --git a/buildconfig/manylinux-build/docker_base/flac/flac.sha512 b/buildconfig/manylinux-build/docker_base/flac/flac.sha512 index 76fbbc4ea0..1f051337b8 100644 --- a/buildconfig/manylinux-build/docker_base/flac/flac.sha512 +++ b/buildconfig/manylinux-build/docker_base/flac/flac.sha512 @@ -1 +1 @@ -3cf095720bd590a588be8ccbe187d22e7a1c60ab85b1d510ce5e8a22ab0a51827b9acfeaad59bbd645a17d1f200f559255a640101b0330709a164306c0e9709e flac-1.4.3.tar.xz +34c9193b804e990b0828a5759e4d7ef1d1859174262d3b305d03e65285edb35c7f429e8071d9dd2c6da0c16e842b40b439bf215704636ae15dd5886151f0d17a flac-1.5.0.tar.xz diff --git a/buildconfig/manylinux-build/docker_base/fluidsynth/build-fluidsynth.sh b/buildconfig/manylinux-build/docker_base/fluidsynth/build-fluidsynth.sh index b8d9a6f10a..7e9dd3608a 100644 --- a/buildconfig/manylinux-build/docker_base/fluidsynth/build-fluidsynth.sh +++ b/buildconfig/manylinux-build/docker_base/fluidsynth/build-fluidsynth.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -FSYNTH_VER="2.4.3" +FSYNTH_VER="2.4.7" FSYNTH="fluidsynth-$FSYNTH_VER" curl -sL --retry 10 https://github.com/FluidSynth/fluidsynth/archive/v${FSYNTH_VER}.tar.gz > ${FSYNTH}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/fluidsynth/fluidsynth.sha512 b/buildconfig/manylinux-build/docker_base/fluidsynth/fluidsynth.sha512 index 34ae06b27a..db7fb20b31 100644 --- a/buildconfig/manylinux-build/docker_base/fluidsynth/fluidsynth.sha512 +++ b/buildconfig/manylinux-build/docker_base/fluidsynth/fluidsynth.sha512 @@ -1 +1 @@ -847d2f4529ac1bad735b71b57067c50586df7e2526c6311925c209c0635ee1e1dca1bd77dc6006181fc19a616738c8de1242bfb209707c8dbea9d7e2acc61017 fluidsynth-2.4.3.tar.gz +8f5d9e20ab5a50b966ae9abee349913611a3e4ebb6c4a39c8b0f56aaba06483e82a761e3d38a37af689e45a0940957c9db9d324ff77352b0841da40be1ff3899 fluidsynth-2.4.7.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/freetype/build-freetype.sh b/buildconfig/manylinux-build/docker_base/freetype/build-freetype.sh index a6fe236fb7..a881d29507 100644 --- a/buildconfig/manylinux-build/docker_base/freetype/build-freetype.sh +++ b/buildconfig/manylinux-build/docker_base/freetype/build-freetype.sh @@ -3,8 +3,11 @@ set -e -x cd $(dirname `readlink -f "$0"`) +# TODO: when freetype is updated, we can look into resolving the circular +# dependency between freetype and harfbuzz by using the upcoming freetype +# dynamic harfbuzz loading feature. FREETYPE="freetype-2.13.3" -HARFBUZZ_VER=10.2.0 +HARFBUZZ_VER=11.3.3 HARFBUZZ_NAME="harfbuzz-$HARFBUZZ_VER" curl -sL --retry 10 https://savannah.nongnu.org/download/freetype/${FREETYPE}.tar.gz > ${FREETYPE}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/freetype/freetype.sha512 b/buildconfig/manylinux-build/docker_base/freetype/freetype.sha512 index 0d711aa819..dc70362bfa 100644 --- a/buildconfig/manylinux-build/docker_base/freetype/freetype.sha512 +++ b/buildconfig/manylinux-build/docker_base/freetype/freetype.sha512 @@ -1,2 +1,2 @@ b7e7e67baed421dbe08c48dcde5d5891c0f7e3c1253be8dc27826c60eaa17ca89f888c3d5a6faf5141b02c154e1cf42d4ed6133b9959ddc359fe6bd41615ae89 freetype-2.13.3.tar.gz -522028a5de91a042832b1634fc4b7636b1b42c5ee258882d155bc33fca7b30de19ca714b4f9ea8dc3d3f537142ca2305fcf5af04bec4edbf608f557c12742e54 harfbuzz-10.2.0.tar.xz +56a971c939522bc5edad5f8a578444844b9101321c6bacfb3d96eadf3b13238144d465dd22171b61ef7b3873af88e43297989c289a5fc37e4d390b64c435cff6 harfbuzz-11.3.3.tar.xz diff --git a/buildconfig/manylinux-build/docker_base/libdecor/build-libdecor.sh b/buildconfig/manylinux-build/docker_base/libdecor/build-libdecor.sh index 34d7801260..7902926074 100644 --- a/buildconfig/manylinux-build/docker_base/libdecor/build-libdecor.sh +++ b/buildconfig/manylinux-build/docker_base/libdecor/build-libdecor.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -LIBDECOR_VER=0.2.2 +LIBDECOR_VER=0.2.3 LIBDECOR="libdecor-$LIBDECOR_VER" curl -sL --retry 10 https://gitlab.freedesktop.org/libdecor/libdecor/-/releases/${LIBDECOR_VER}/downloads/${LIBDECOR}.tar.xz > ${LIBDECOR}.tar.xz diff --git a/buildconfig/manylinux-build/docker_base/libdecor/libdecor.sha512sum b/buildconfig/manylinux-build/docker_base/libdecor/libdecor.sha512sum index 98766deff1..041920abe4 100644 --- a/buildconfig/manylinux-build/docker_base/libdecor/libdecor.sha512sum +++ b/buildconfig/manylinux-build/docker_base/libdecor/libdecor.sha512sum @@ -1 +1 @@ -ed1dfb86c28f0c84950ea5653e1ae6a83bf274e5ea51c0977ea134481536dffd31e65146c0a0aa8b67a6cad4fb8bc551b4266b04c93493547d43131dc04ea380 libdecor-0.2.2.tar.xz +546c3224660c593412b916b659c4ea56a0461dd80304c27d001b8fdbabba4f434950c42faf344ce9a63097208386ea17728575c10ecfc29814703d8f2853621a libdecor-0.2.3.tar.xz diff --git a/buildconfig/manylinux-build/docker_base/libffi/build-libffi.sh b/buildconfig/manylinux-build/docker_base/libffi/build-libffi.sh index 05a48a2f7d..916ffb270f 100644 --- a/buildconfig/manylinux-build/docker_base/libffi/build-libffi.sh +++ b/buildconfig/manylinux-build/docker_base/libffi/build-libffi.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -LIBFFI_VER="3.4.6" +LIBFFI_VER="3.5.1" LIBFFI="libffi-$LIBFFI_VER" curl -sL --retry 10 https://github.com/libffi/libffi/releases/download/v${LIBFFI_VER}/${LIBFFI}.tar.gz > ${LIBFFI}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/libffi/libffi.sha512 b/buildconfig/manylinux-build/docker_base/libffi/libffi.sha512 index 7a3f08cfef..9bcb363d62 100644 --- a/buildconfig/manylinux-build/docker_base/libffi/libffi.sha512 +++ b/buildconfig/manylinux-build/docker_base/libffi/libffi.sha512 @@ -1 +1 @@ -033d2600e879b83c6bce0eb80f69c5f32aa775bf2e962c9d39fbd21226fa19d1e79173d8eaa0d0157014d54509ea73315ad86842356fc3a303c0831c94c6ab39 libffi-3.4.6.tar.gz +3da9e21fdb920e7962ceb01ee671ef36196df4d5dad62e0cdd8e87cc60e350f241c204350560ae26ea04cc898161b5585c8a5a5125bdbcc84508efbb7ea61eb8 libffi-3.5.1.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/libjpegturbo/build-jpeg-turbo.sh b/buildconfig/manylinux-build/docker_base/libjpegturbo/build-jpeg-turbo.sh index 863ebfc81f..9bd5d75e4f 100644 --- a/buildconfig/manylinux-build/docker_base/libjpegturbo/build-jpeg-turbo.sh +++ b/buildconfig/manylinux-build/docker_base/libjpegturbo/build-jpeg-turbo.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -JPEG_VERSION=3.1.0 +JPEG_VERSION=3.1.1 JPEG="libjpeg-turbo-${JPEG_VERSION}" curl -sL --retry 10 https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/${JPEG_VERSION}/${JPEG}.tar.gz > ${JPEG}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/libjpegturbo/libjpegturbo.sha512 b/buildconfig/manylinux-build/docker_base/libjpegturbo/libjpegturbo.sha512 index c821081714..28bc940c23 100644 --- a/buildconfig/manylinux-build/docker_base/libjpegturbo/libjpegturbo.sha512 +++ b/buildconfig/manylinux-build/docker_base/libjpegturbo/libjpegturbo.sha512 @@ -1 +1 @@ -63231854529f59a95814cf2414fe384360a4ed96c572764fabc535c3770c559d26943e129c905a63d5949088fa79138b1ffdb175b817f2f4d36329a3cbb23ea7 libjpeg-turbo-3.1.0.tar.gz +d08c8eb77281c1eee2c93ef9f2eefaf79a4b9adff5172ebcb20c845ccad8896a28fc3d622002cc8b28964ff860dca0a491d6b1b921aaa7aedccd21b909aad4cb libjpeg-turbo-3.1.1.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/libpipewire/build-libpipewire.sh b/buildconfig/manylinux-build/docker_base/libpipewire/build-libpipewire.sh index a673d8ee66..dfbabf26f4 100644 --- a/buildconfig/manylinux-build/docker_base/libpipewire/build-libpipewire.sh +++ b/buildconfig/manylinux-build/docker_base/libpipewire/build-libpipewire.sh @@ -3,6 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) +# pipewire 1.4.5 has some compilation issues, stay at an older version for now PIPEWIRE_VER="1.2.7" PIPEWIRE="pipewire-$PIPEWIRE_VER" diff --git a/buildconfig/manylinux-build/docker_base/libpng/build-png.sh b/buildconfig/manylinux-build/docker_base/libpng/build-png.sh index 883d025a34..d76c6f8182 100644 --- a/buildconfig/manylinux-build/docker_base/libpng/build-png.sh +++ b/buildconfig/manylinux-build/docker_base/libpng/build-png.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -PNG=libpng-1.6.46 +PNG=libpng-1.6.50 curl -sL --retry 10 http://download.sourceforge.net/libpng/${PNG}.tar.gz > ${PNG}.tar.gz sha512sum -c png.sha512 diff --git a/buildconfig/manylinux-build/docker_base/libpng/png.sha512 b/buildconfig/manylinux-build/docker_base/libpng/png.sha512 index b0fb51e93c..34d155ebc6 100644 --- a/buildconfig/manylinux-build/docker_base/libpng/png.sha512 +++ b/buildconfig/manylinux-build/docker_base/libpng/png.sha512 @@ -1 +1 @@ -c7af8a3472cd4389e0d5aadca96206023ea5586ce744f852862bce600b2aca4e9641a0875f950a3ba47a2ad5d8857f40af7cd1393f28bc2c39da7bd66eb750e4 libpng-1.6.46.tar.gz +b1efd1675843ec917c595b83a392adc9c1539ab8a65448cc33c24bd89f4b84d2d6b3f577ba3558b486c8662a463a5d68de9e7675a324b8ef7e9da175e8c3abc4 libpng-1.6.50.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/libtiff/build-tiff.sh b/buildconfig/manylinux-build/docker_base/libtiff/build-tiff.sh index 4c22cb5bd0..3fca31493d 100644 --- a/buildconfig/manylinux-build/docker_base/libtiff/build-tiff.sh +++ b/buildconfig/manylinux-build/docker_base/libtiff/build-tiff.sh @@ -11,12 +11,10 @@ sha512sum -c tiff.sha512 tar xzf ${TIFF}.tar.gz cd $TIFF -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - ./configure $PG_BASE_CONFIGURE_FLAGS --disable-lzma --disable-webp --disable-zstd -elif [[ "$OSTYPE" == "darwin"* ]]; then - # Use CMake on macOS because arm64 builds fail with weird errors in ./configure - cmake . $PG_BASE_CMAKE_FLAGS -Dlzma=OFF -Dwebp=OFF -Dzstd=OFF -fi +# turn off lzma, webp and zstd so that cmake does not try to pick them up from +# the system. +cmake . $PG_BASE_CMAKE_FLAGS -Dlzma=OFF -Dwebp=OFF -Dzstd=OFF \ + -Dtiff-tools=OFF -Dtiff-tests=OFF -Dtiff-contrib=OFF -Dtiff-docs=OFF make make install diff --git a/buildconfig/manylinux-build/docker_base/libxml2/build-libxml2.sh b/buildconfig/manylinux-build/docker_base/libxml2/build-libxml2.sh index d0cfa01b56..fabb1f8975 100644 --- a/buildconfig/manylinux-build/docker_base/libxml2/build-libxml2.sh +++ b/buildconfig/manylinux-build/docker_base/libxml2/build-libxml2.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -LIBXML2_VER=2.13 +LIBXML2_VER=2.14 LIBXML2_PATCH=4 LIBXML2="libxml2-$LIBXML2_VER.$LIBXML2_PATCH" diff --git a/buildconfig/manylinux-build/docker_base/libxml2/libxml2.sha512 b/buildconfig/manylinux-build/docker_base/libxml2/libxml2.sha512 index 3634afb7d7..e3f364d661 100644 --- a/buildconfig/manylinux-build/docker_base/libxml2/libxml2.sha512 +++ b/buildconfig/manylinux-build/docker_base/libxml2/libxml2.sha512 @@ -1 +1 @@ -27bfaa63431798d3aa725b36af2005bda70a20b270e601cc3c8a07cc9fd02a080cb3d2b023eb42606a57b9786469488a7c09b71bdff1a518a0b4271c78c3f940 libxml2-2.13.4.tar.xz +5991223bdd6c84886bba8fb81c4e48bf92c8bc3571262ffa8c7673a10efeebceafc1dee362624417dca146982d030ee8d0ccda41f4c82d3074845f74ef6da5d4 libxml2-2.14.4.tar.xz diff --git a/buildconfig/manylinux-build/docker_base/libxmp/build-libxmp.sh b/buildconfig/manylinux-build/docker_base/libxmp/build-libxmp.sh index f813d677dd..ec37c1bf06 100644 --- a/buildconfig/manylinux-build/docker_base/libxmp/build-libxmp.sh +++ b/buildconfig/manylinux-build/docker_base/libxmp/build-libxmp.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -XMP_VERSION=4.6.1 +XMP_VERSION=4.6.3 XMP="libxmp-${XMP_VERSION}" diff --git a/buildconfig/manylinux-build/docker_base/libxmp/libxmp.sha512 b/buildconfig/manylinux-build/docker_base/libxmp/libxmp.sha512 index da1bfa65a6..0dd2db14c4 100644 --- a/buildconfig/manylinux-build/docker_base/libxmp/libxmp.sha512 +++ b/buildconfig/manylinux-build/docker_base/libxmp/libxmp.sha512 @@ -1 +1 @@ -a772a489d8c1bedda378cd36f4f359bc224a1ac16ba12486b675667c76826d1308697f03e2d6502b654e4127eaaf3930684ee4367a73b75432273662af29111d libxmp-4.6.1.tar.gz +fc87fafa392ebd07f6f9823801cdf296d5f5a6216e15a437d0539bc4ebf0f963bb8d868c73499d1ece33a238b71a8da6da303be23d409975a62b166225853bec libxmp-4.6.3.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mesa/glslang/build-glslang.sh b/buildconfig/manylinux-build/docker_base/mesa/glslang/build-glslang.sh index bc4845064c..ddfc01e401 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/glslang/build-glslang.sh +++ b/buildconfig/manylinux-build/docker_base/mesa/glslang/build-glslang.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -GLSLANG_VER=14.3.0 +GLSLANG_VER=15.3.0 GLSLANG="glslang-$GLSLANG_VER" curl -sL --retry 10 https://github.com/KhronosGroup/glslang/archive/refs/tags/${GLSLANG_VER}.tar.gz > ${GLSLANG}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mesa/glslang/glslang.sha512sum b/buildconfig/manylinux-build/docker_base/mesa/glslang/glslang.sha512sum index d7ada85e7d..0cd1f207bf 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/glslang/glslang.sha512sum +++ b/buildconfig/manylinux-build/docker_base/mesa/glslang/glslang.sha512sum @@ -1 +1 @@ -ce6d09cc4d98b01d162ec5a196eec017c4a5f25eaf98c6612695d911f8d136c2f7193ff8f2c07931b2e94182d2c654833adc3b645f0c225e1d07c4e6e7abfd76 glslang-14.3.0.tar.gz +c809caed7e6435ff75674485846f02bd8d7010e4f22911f0ee9d4cc4f703b0b6e6d828609379d4e53e97697f3f198b1ca66318a12be24c49c6800cc39593e577 glslang-15.3.0.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mesa/mako/build-mako.sh b/buildconfig/manylinux-build/docker_base/mesa/mako/build-mako.sh index 555519e75c..2863957afc 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/mako/build-mako.sh +++ b/buildconfig/manylinux-build/docker_base/mesa/mako/build-mako.sh @@ -4,4 +4,4 @@ set -e -x cd $(dirname `readlink -f "$0"`) # pin for build stability, remember to keep updated -python3 -m pip install mako==1.3.5 PyYAML==6.0.2 +python3 -m pip install mako==1.3.10 PyYAML==6.0.2 diff --git a/buildconfig/manylinux-build/docker_base/mesa/mesa/build-mesa.sh b/buildconfig/manylinux-build/docker_base/mesa/mesa/build-mesa.sh index c98311fcbf..577f2c04e5 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/mesa/build-mesa.sh +++ b/buildconfig/manylinux-build/docker_base/mesa/mesa/build-mesa.sh @@ -7,7 +7,7 @@ cd $(dirname `readlink -f "$0"`) # wayland driver needs this) and glx (SDL needs it) # we don't support vulkan yet -MESA_VER="mesa-24.2.3" +MESA_VER="mesa-25.1.3" MESA="mesa-$MESA_VER" # yes mesa comes twice in the name curl -sL --retry 10 https://gitlab.freedesktop.org/mesa/mesa/-/archive/$MESA_VER/$MESA.tar.gz > $MESA.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mesa/mesa/mesa.sha512sum b/buildconfig/manylinux-build/docker_base/mesa/mesa/mesa.sha512sum index 41825beb9e..f56eb50cac 100644 --- a/buildconfig/manylinux-build/docker_base/mesa/mesa/mesa.sha512sum +++ b/buildconfig/manylinux-build/docker_base/mesa/mesa/mesa.sha512sum @@ -1 +1 @@ -be99f38318509a864212c600a8b14e9615ef7d2cfbda8d020b0059585d05dcb850601200a139b2adaf04d8d7df9c4e2661014fafab15647f3d02e3db1196c998 mesa-mesa-24.2.3.tar.gz +f2867600fb15a6d8699d0370d4a130784dc738a54c33a69175bfc1ca3178f9cdf9e888702ec64c1ff6970adb2dd4be8c3000dfbde587229c545612ac9b4dfee2 mesa-mesa-25.1.3.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/mpg123/build-mpg123.sh b/buildconfig/manylinux-build/docker_base/mpg123/build-mpg123.sh index 8cd3a369bc..8b48e2973b 100644 --- a/buildconfig/manylinux-build/docker_base/mpg123/build-mpg123.sh +++ b/buildconfig/manylinux-build/docker_base/mpg123/build-mpg123.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -MPG123="mpg123-1.32.10" +MPG123="mpg123-1.33.0" curl -sL --retry 10 https://downloads.sourceforge.net/sourceforge/mpg123/${MPG123}.tar.bz2 > ${MPG123}.tar.bz2 sha512sum -c mpg123.sha512 diff --git a/buildconfig/manylinux-build/docker_base/mpg123/mpg123.sha512 b/buildconfig/manylinux-build/docker_base/mpg123/mpg123.sha512 index 2e32410862..4f8d4613e8 100644 --- a/buildconfig/manylinux-build/docker_base/mpg123/mpg123.sha512 +++ b/buildconfig/manylinux-build/docker_base/mpg123/mpg123.sha512 @@ -1 +1 @@ -4df3e76cafe642b1df8befaff3d3530150c13446ca7f07b8d527af5b6522e4d2dedd025a3f095f23a51e2318d17e1395de6e55c70e3a90f80017ea0955fe8c1f mpg123-1.32.10.tar.bz2 +c2c6a3536f18334e310337dc2cc7d4af141c1f7fffb02fc079d645f46113581d457587c562cf353d39375d721af6716cb4db6a964ef83284e390b597744c52ea mpg123-1.33.0.tar.bz2 diff --git a/buildconfig/manylinux-build/docker_base/zlib-ng/build-zlib-ng.sh b/buildconfig/manylinux-build/docker_base/zlib-ng/build-zlib-ng.sh index a3d7751440..8762626d9e 100644 --- a/buildconfig/manylinux-build/docker_base/zlib-ng/build-zlib-ng.sh +++ b/buildconfig/manylinux-build/docker_base/zlib-ng/build-zlib-ng.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -ZLIB_NG_VER=2.2.3 +ZLIB_NG_VER=2.2.4 ZLIB_NG_NAME="zlib-ng-$ZLIB_NG_VER" curl -sL --retry 10 https://github.com/zlib-ng/zlib-ng/archive/refs/tags/${ZLIB_NG_VER}.tar.gz > ${ZLIB_NG_NAME}.tar.gz diff --git a/buildconfig/manylinux-build/docker_base/zlib-ng/zlib-ng.sha512 b/buildconfig/manylinux-build/docker_base/zlib-ng/zlib-ng.sha512 index 2b02f0052c..ca0a974a50 100644 --- a/buildconfig/manylinux-build/docker_base/zlib-ng/zlib-ng.sha512 +++ b/buildconfig/manylinux-build/docker_base/zlib-ng/zlib-ng.sha512 @@ -1 +1 @@ -e71e8972ec2c4dec9eaa2c8f550185f13d0f5c411c38061d1aaf78ca8e522fa3d53f005296e574af7f152e7da3a78adf97ae4bb638b7fd277ef57bba26370b7d zlib-ng-2.2.3.tar.gz +f49a89497988db55a2f2375f79443e7e2c57470dbd94b35ae38a39d988eb42f8ecc295a1bd68845fc273b59ea508d0e74b142585d85b7e869dd3c01cc6923d8d zlib-ng-2.2.4.tar.gz From 370fe4ecf45690e103f0ab4e109fbc0538463dbf Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Tue, 29 Jul 2025 21:41:15 -0700 Subject: [PATCH 356/441] Fix some Surface and Window tests on SDL3 --- src_c/_pygame.h | 8 ++++++++ src_c/display.c | 6 +++--- src_c/surface.c | 8 ++++++++ src_c/window.c | 13 +++++++++---- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index e3381053ae..d49aa3e6f3 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -87,6 +87,8 @@ #define PG_SoftStretchNearest(src, srcrect, dst, dstrect) \ SDL_StretchSurface(src, srcrect, dst, dstrect, SDL_SCALEMODE_NEAREST) +#define PG_UpdateWindowSurface SDL_UpdateWindowSurface + /* Emulating SDL2 SDL_LockMutex API. In SDL3, it returns void. */ static inline int PG_LockMutex(SDL_mutex *mutex) @@ -198,6 +200,12 @@ PG_GetSurfaceFormat(SDL_Surface *surf) #define PG_SoftStretchNearest(src, srcrect, dst, dstrect) \ SDL_SoftStretch(src, srcrect, dst, dstrect) +static inline bool +PG_UpdateWindowSurface(SDL_Window *window) +{ + return SDL_UpdateWindowSurface(window) == 0; +} + static inline int PG_LockMutex(SDL_mutex *mutex) { diff --git a/src_c/display.c b/src_c/display.c index 6934ca808d..acd754b561 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -1691,7 +1691,7 @@ static int pg_flip_internal(_DisplayState *state) { SDL_Window *win = pg_GetDefaultWindow(); - int status = 0; + bool success = true; /* Same check as VIDEO_INIT_CHECK() but returns -1 instead of NULL on * fail. */ @@ -1729,12 +1729,12 @@ pg_flip_internal(_DisplayState *state) if (new_surface != ((pgSurfaceObject *)screen)->surf) { screen->surf = new_surface; } - status = SDL_UpdateWindowSurface(win); + success = PG_UpdateWindowSurface(win); } } Py_END_ALLOW_THREADS; - if (status < 0) { + if (!success) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } diff --git a/src_c/surface.c b/src_c/surface.c index 408a96e08a..2835e16c90 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -4545,7 +4545,11 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, newfmt.Bloss = fmt->Bloss; src = PG_ConvertSurface(src, &newfmt); if (src) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = SDL_BlitSurface(src, srcrect, dst, dstrect) ? 0 : -1; +#else result = SDL_BlitSurface(src, srcrect, dst, dstrect); +#endif SDL_FreeSurface(src); } else { @@ -4569,7 +4573,11 @@ pgSurface_Blit(pgSurfaceObject *dstobj, pgSurfaceObject *srcobj, } else { /* Py_BEGIN_ALLOW_THREADS */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = SDL_BlitSurface(src, srcrect, dst, dstrect) ? 0 : -1; +#else result = SDL_BlitSurface(src, srcrect, dst, dstrect); +#endif /* Py_END_ALLOW_THREADS */ } diff --git a/src_c/window.c b/src_c/window.c index 594c0321d2..ada2d4d05e 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -201,7 +201,7 @@ window_get_surface(pgWindowObject *self, PyObject *_null) static PyObject * window_flip(pgWindowObject *self, PyObject *_null) { - int result; + bool success; if (self->context == NULL) { if (!self->surf) { @@ -211,9 +211,9 @@ window_flip(pgWindowObject *self, PyObject *_null) } Py_BEGIN_ALLOW_THREADS; - result = SDL_UpdateWindowSurface(self->_win); + success = PG_UpdateWindowSurface(self->_win); Py_END_ALLOW_THREADS; - if (result) { + if (!success) { return RAISE(pgExc_SDLError, SDL_GetError()); } } @@ -879,7 +879,12 @@ window_set_opacity(pgWindowObject *self, PyObject *arg, void *v) if (PyErr_Occurred()) { return -1; } - if (SDL_SetWindowOpacity(self->_win, opacity)) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (!SDL_SetWindowOpacity(self->_win, opacity)) +#else + if (SDL_SetWindowOpacity(self->_win, opacity)) +#endif + { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } From 62794f45c176f9389c3b3bc99f182e83347cbede Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 1 Aug 2025 20:55:31 -0700 Subject: [PATCH 357/441] Update SDL3 from 3.2.10 to 3.2.18 --- buildconfig/download_win_prebuilt.py | 8 ++++---- meson.build | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 94f197ea33..79a12d2f02 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -82,8 +82,8 @@ def get_urls(x86=True, x64=True): 'ec8bbf2a2d2bf754fe04b6ffc647f78aa7f4c2a1', ], [ - 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-VC.zip', - '7a17d6fc7aa509c0c020e16ca10f82d6b5c2fc57' + 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.18/SDL3-devel-3.2.18-VC.zip', + '96246e328e2da7c2bd2c5734d5cb98953aca8229' ], [ 'https://github.com/pygame-community/SDL_image/releases/download/2.8.8-pgce/SDL2_image-devel-2.8.8-VCpgce.zip', @@ -280,12 +280,12 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL3-devel-3.2.10-VC/SDL3-3.2.10' + 'SDL3-devel-3.2.18-VC/SDL3-3.2.18' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3-3.2.10' + 'SDL3-3.2.18' ) ) diff --git a/meson.build b/meson.build index 890336cdcf..011ed5f06a 100644 --- a/meson.build +++ b/meson.build @@ -94,7 +94,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # yes, this is a bit ugly and hardcoded but it is what it is # TODO (middle-term goal) - Should migrate away from this # consider meson wraps? Hopefully can also get the same build path as below - sdl_ver = (sdl_api == 3) ? '3.2.10' : '2.32.8' + sdl_ver = (sdl_api == 3) ? '3.2.18' : '2.32.8' sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' From 10bc90e8bb486ac1170daa17484909dcd6b465b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sun, 3 Aug 2025 15:59:23 +0200 Subject: [PATCH 358/441] Port Texture to C code (#3330) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Add interface for _sdl2.video classes * Squashed commit of the following: commit 813f3848e07d268892a4081a9939bb9ab0895a23 Author: Josip Komljenović Date: Wed Jan 29 15:43:45 2025 +0100 Add interface for _sdl2.video classes commit 702958c883149d4321fe96eab6de2ecbbae5cf31 Author: Josip Komljenović Date: Wed Jan 29 15:38:01 2025 +0100 Add interface for _sdl2.video classes commit 081b032255cbcc5ce32c39bebe0a5187765c5d04 Author: Josip Komljenović Date: Wed Jan 29 15:33:20 2025 +0100 Add interface for _sdl2.video classes commit c9ffd1c5517cdd61d3ac00f82d50930d7965cdb3 Author: Josip Komljenović Date: Wed Jan 29 15:25:10 2025 +0100 Add interface for _sdl2.video classes * Port Renderer to C code * Port Renderer to C code * Squashed commit of the following: commit 813f3848e07d268892a4081a9939bb9ab0895a23 Author: Josip Komljenović Date: Wed Jan 29 15:43:45 2025 +0100 Add interface for _sdl2.video classes commit 702958c883149d4321fe96eab6de2ecbbae5cf31 Author: Josip Komljenović Date: Wed Jan 29 15:38:01 2025 +0100 Add interface for _sdl2.video classes commit 081b032255cbcc5ce32c39bebe0a5187765c5d04 Author: Josip Komljenović Date: Wed Jan 29 15:33:20 2025 +0100 Add interface for _sdl2.video classes commit c9ffd1c5517cdd61d3ac00f82d50930d7965cdb3 Author: Josip Komljenović Date: Wed Jan 29 15:25:10 2025 +0100 Add interface for _sdl2.video classes * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code * Port Texture to C code --- buildconfig/stubs/pygame/__init__.pyi | 6 + buildconfig/stubs/pygame/_render.pyi | 73 ++- buildconfig/stubs/pygame/constants.pyi | 6 + buildconfig/stubs/pygame/locals.pyi | 6 + src_c/constants.c | 7 + src_c/render.c | 625 ++++++++++++++++++++++++- test/render_test.py | 260 +++++++++- 7 files changed, 962 insertions(+), 21 deletions(-) diff --git a/buildconfig/stubs/pygame/__init__.pyi b/buildconfig/stubs/pygame/__init__.pyi index ba617180f4..bf79ffaf71 100644 --- a/buildconfig/stubs/pygame/__init__.pyi +++ b/buildconfig/stubs/pygame/__init__.pyi @@ -204,6 +204,9 @@ from .constants import ( FLASH_BRIEFLY as FLASH_BRIEFLY, FLASH_CANCEL as FLASH_CANCEL, FLASH_UNTIL_FOCUSED as FLASH_UNTIL_FOCUSED, + FLIP_HORIZONTAL as FLIP_HORIZONTAL, + FLIP_NONE as FLIP_NONE, + FLIP_VERTICAL as FLIP_VERTICAL, FONT_CENTER as FONT_CENTER, FONT_LEFT as FONT_LEFT, FONT_RIGHT as FONT_RIGHT, @@ -643,6 +646,9 @@ from .constants import ( SYSWMEVENT as SYSWMEVENT, TEXTEDITING as TEXTEDITING, TEXTINPUT as TEXTINPUT, + TEXTUREACCESS_STATIC as TEXTUREACCESS_STATIC, + TEXTUREACCESS_STREAMING as TEXTUREACCESS_STREAMING, + TEXTUREACCESS_TARGET as TEXTUREACCESS_TARGET, TIMER_RESOLUTION as TIMER_RESOLUTION, USEREVENT as USEREVENT, USEREVENT_DROPFILE as USEREVENT_DROPFILE, diff --git a/buildconfig/stubs/pygame/_render.pyi b/buildconfig/stubs/pygame/_render.pyi index 2a76653dec..b5eb1c6d68 100644 --- a/buildconfig/stubs/pygame/_render.pyi +++ b/buildconfig/stubs/pygame/_render.pyi @@ -1,11 +1,11 @@ -from typing import Optional, Protocol, Union, final +from collections.abc import Iterable +from typing import Any, Optional, Protocol, Union, final from pygame.color import Color from pygame.rect import Rect from pygame.surface import Surface from pygame.typing import ColorLike, IntPoint, Point, RectLike, SequenceLike from pygame.window import Window -from typing_extensions import deprecated # added in 3.13 class _DrawableClass(Protocol): # Object that has the draw method that accepts area and dest arguments @@ -74,7 +74,74 @@ class Renderer: @final class Texture: - pass + def __init__( + self, + renderer: Renderer, + size: Iterable[int], + depth: int = 0, + static: bool = False, + streaming: bool = False, + target: bool = False, + scale_quality: Optional[int] = None, + ) -> None: ... + @property + def alpha(self) -> int: ... + @alpha.setter + def alpha(self, value: int) -> None: ... + @property + def blend_mode(self) -> int: ... + @blend_mode.setter + def blend_mode(self, value: int) -> None: ... + @property + def color(self) -> Color: ... + @color.setter + def color(self, value: ColorLike) -> None: ... + @property + def width(self) -> int: ... + @property + def height(self) -> int: ... + @property + def renderer(self) -> Renderer: ... + @classmethod + def from_surface(cls, renderer: Renderer, surface: Surface) -> Texture: ... + def draw( + self, + srcrect: Optional[RectLike] = None, + dstrect: Optional[RectLike] = None, + angle: float = 0.0, + origin: Optional[Iterable[int]] = None, + flip_x: bool = False, + flip_y: bool = False, + ) -> None: ... + def draw_triangle( + self, + p1_xy: Point, + p2_xy: Point, + p3_xy: Point, + p1_uv: Point = (0.0, 0.0), + p2_uv: Point = (1.0, 1.0), + p3_uv: Point = (0.0, 1.0), + p1_mod: ColorLike = (255, 255, 255, 255), + p2_mod: ColorLike = (255, 255, 255, 255), + p3_mod: ColorLike = (255, 255, 255, 255), + ) -> None: ... + def draw_quad( + self, + p1_xy: Point, + p2_xy: Point, + p3_xy: Point, + p4_xy: Point, + p1_uv: Point = (0.0, 0.0), + p2_uv: Point = (1.0, 0.0), + p3_uv: Point = (1.0, 1.0), + p4_uv: Point = (0.0, 1.0), + p1_mod: ColorLike = (255, 255, 255, 255), + p2_mod: ColorLike = (255, 255, 255, 255), + p3_mod: ColorLike = (255, 255, 255, 255), + p4_mod: ColorLike = (255, 255, 255, 255), + ) -> None: ... + def get_rect(self, **kwargs: Any) -> Rect: ... + def update(self, surface: Surface, area: Optional[RectLike] = None) -> None: ... @final class Image: diff --git a/buildconfig/stubs/pygame/constants.pyi b/buildconfig/stubs/pygame/constants.pyi index a824f88bb5..c0714ebff9 100644 --- a/buildconfig/stubs/pygame/constants.pyi +++ b/buildconfig/stubs/pygame/constants.pyi @@ -126,6 +126,9 @@ FINGERUP: int FLASH_BRIEFLY: int FLASH_CANCEL: int FLASH_UNTIL_FOCUSED: int +FLIP_HORIZONTAL: int +FLIP_NONE: int +FLIP_VERTICAL: int FONT_CENTER: int FONT_LEFT: int FONT_RIGHT: int @@ -565,6 +568,9 @@ SYSTEM_CURSOR_WAITARROW: int SYSWMEVENT: int TEXTEDITING: int TEXTINPUT: int +TEXTUREACCESS_STATIC: int +TEXTUREACCESS_STREAMING: int +TEXTUREACCESS_TARGET: int TIMER_RESOLUTION: int USEREVENT: int USEREVENT_DROPFILE: int diff --git a/buildconfig/stubs/pygame/locals.pyi b/buildconfig/stubs/pygame/locals.pyi index 329bda5c2b..f11f7e2aab 100644 --- a/buildconfig/stubs/pygame/locals.pyi +++ b/buildconfig/stubs/pygame/locals.pyi @@ -127,6 +127,9 @@ FINGERUP: int FLASH_BRIEFLY: int FLASH_CANCEL: int FLASH_UNTIL_FOCUSED: int +FLIP_HORIZONTAL: int +FLIP_NONE: int +FLIP_VERTICAL: int FONT_CENTER: int FONT_LEFT: int FONT_RIGHT: int @@ -567,6 +570,9 @@ SYSTEM_CURSOR_WAITARROW: int SYSWMEVENT: int TEXTEDITING: int TEXTINPUT: int +TEXTUREACCESS_STATIC: int +TEXTUREACCESS_STREAMING: int +TEXTUREACCESS_TARGET: int TIMER_RESOLUTION: int USEREVENT: int USEREVENT_DROPFILE: int diff --git a/src_c/constants.c b/src_c/constants.c index 07ae11b90a..cbbaf5c97d 100644 --- a/src_c/constants.c +++ b/src_c/constants.c @@ -328,6 +328,13 @@ MODINIT_DEFINE(constants) DEC_CONSTS(WINDOWICCPROFCHANGED, PGE_WINDOWICCPROFCHANGED); DEC_CONSTS(WINDOWDISPLAYCHANGED, PGE_WINDOWDISPLAYCHANGED); + DEC_CONST(TEXTUREACCESS_STATIC); + DEC_CONST(TEXTUREACCESS_STREAMING); + DEC_CONST(TEXTUREACCESS_TARGET); + DEC_CONST(FLIP_NONE); + DEC_CONST(FLIP_HORIZONTAL); + DEC_CONST(FLIP_VERTICAL); + DEC_CONST(CONTROLLERAXISMOTION); DEC_CONST(CONTROLLERBUTTONDOWN); DEC_CONST(CONTROLLERBUTTONUP); diff --git a/src_c/render.c b/src_c/render.c index d237ced3e7..5b90dd2822 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -35,10 +35,29 @@ static PyTypeObject pgImage_Type; return RAISE(PyExc_TypeError, "invalid " #name " argument"); \ } -static void +#define PARSE_COLOR(obj, rgba) \ + if (Py_IsNone(obj)) { \ + rgba[0] = 255; \ + rgba[1] = 255; \ + rgba[2] = 255; \ + rgba[3] = 255; \ + } \ + else { \ + if (!pg_RGBAFromObjEx(obj, rgba, PG_COLOR_HANDLE_ALL)) { \ + return NULL; \ + } \ + } + +#define SET_VERTEX_COLOR(vertex, texture_mods, vertex_mods) \ + vertex.color.r = (Uint8)(texture_mods[0] * vertex_mods[0]); \ + vertex.color.g = (Uint8)(texture_mods[1] * vertex_mods[1]); \ + vertex.color.b = (Uint8)(texture_mods[2] * vertex_mods[2]); \ + vertex.color.a = (Uint8)(texture_mods[3] * vertex_mods[3]); + +static int texture_renderer_draw(pgTextureObject *self, PyObject *area, PyObject *dest); -static void +static int image_renderer_draw(pgImageObject *self, PyObject *area, PyObject *dest); /* Renderer implementation */ @@ -361,10 +380,16 @@ renderer_blit(pgRendererObject *self, PyObject *args, PyObject *kwargs) } if (pgTexture_Check(sourceobj)) { - texture_renderer_draw((pgTextureObject *)sourceobj, areaobj, destobj); + if (!texture_renderer_draw((pgTextureObject *)sourceobj, areaobj, + destobj)) { + return NULL; + } } else if (pgImage_Check(sourceobj)) { - image_renderer_draw((pgImageObject *)sourceobj, areaobj, destobj); + if (!image_renderer_draw((pgImageObject *)sourceobj, areaobj, + destobj)) { + return NULL; + } } else { if (!PyObject_CallFunctionObjArgs( @@ -475,6 +500,7 @@ renderer_get_target(pgRendererObject *self, void *closure) static int renderer_set_target(pgRendererObject *self, PyObject *arg, void *closure) { + Py_XDECREF(self->target); if (Py_IsNone(arg)) { self->target = NULL; RENDERER_PROPERTY_ERROR_CHECK( @@ -483,6 +509,7 @@ renderer_set_target(pgRendererObject *self, PyObject *arg, void *closure) } else if (pgTexture_Check(arg)) { self->target = (pgTextureObject *)arg; + Py_XINCREF(self->target); RENDERER_PROPERTY_ERROR_CHECK( SDL_SetRenderTarget(self->renderer, self->target->texture)) return 0; @@ -543,17 +570,558 @@ renderer_dealloc(pgRendererObject *self, PyObject *_null) } /* Texture implementation */ -static void +static int texture_renderer_draw(pgTextureObject *self, PyObject *area, PyObject *dest) { - return; + SDL_Rect srcrect, *srcrectptr = NULL; + SDL_FRect dstrect, *dstrectptr = NULL; + if (!Py_IsNone(area)) { + if (!(srcrectptr = pgRect_FromObject(area, &srcrect))) { + PyErr_SetString(PyExc_ValueError, + "srcrect must be a Rect or None"); + return 0; + } + } + if (!Py_IsNone(dest)) { + if (!(dstrectptr = pgFRect_FromObject(dest, &dstrect))) { + if (!pg_TwoFloatsFromObj(dest, &dstrect.x, &dstrect.y)) { + PyErr_SetString(PyExc_ValueError, + "dstrect must be a point, Rect, or None"); + return 0; + } + dstrect.w = (float)self->width; + dstrect.h = (float)self->height; + } + } + if (SDL_RenderCopyExF(self->renderer->renderer, self->texture, srcrectptr, + dstrectptr, 0, NULL, SDL_FLIP_NONE) < 0) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return 0; + } + return 1; +} + +static PyObject * +texture_from_surface(PyObject *self, PyObject *args, PyObject *kwargs) +{ + pgRendererObject *renderer; + pgSurfaceObject *surfobj; + pgTextureObject *new_texture; + SDL_Texture *texture; + SDL_Surface *surf = NULL; + static char *keywords[] = {"renderer", "surface", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO!", keywords, &renderer, + &pgSurface_Type, &surfobj)) { + return NULL; /* Exception already set. */ + } + surf = pgSurface_AsSurface(surfobj); + SURF_INIT_CHECK(surf) + texture = SDL_CreateTextureFromSurface(renderer->renderer, surf); + if (!texture) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + new_texture = + (pgTextureObject *)(&(pgTexture_Type))->tp_alloc(&pgTexture_Type, 0); + new_texture->texture = texture; + new_texture->renderer = renderer; + Py_XINCREF(new_texture->renderer); + new_texture->width = surf->w; + new_texture->height = surf->h; + return (PyObject *)new_texture; +} + +static PyObject * +texture_get_rect(pgTextureObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwargs) +{ + PyObject *rect = pgRect_New4(0, 0, self->width, self->height); + return pgObject_getRectHelper(rect, args, nargs, kwargs, "rect"); +} + +static PyObject * +texture_draw(pgTextureObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *srcrectobj = Py_None, *dstrectobj = Py_None, + *originobj = Py_None; + SDL_Rect srcrect, *srcrectptr = NULL; + SDL_FRect dstrect, *dstrectptr = NULL; + SDL_FPoint origin, *originptr = NULL; + double angle = 0; + int flip_x = 0; + int flip_y = 0; + SDL_RendererFlip flip = SDL_FLIP_NONE; + static char *keywords[] = {"srcrect", "dstrect", "angle", "origin", + "flip_x", "flip_y", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOdOpp", keywords, + &srcrectobj, &dstrectobj, &angle, + &originobj, &flip_x, &flip_y)) { + return NULL; /* Exception already set. */ + } + if (!Py_IsNone(srcrectobj)) { + if (!(srcrectptr = pgRect_FromObject(srcrectobj, &srcrect))) { + return RAISE(PyExc_ValueError, "srcrect must be a Rect or None"); + } + } + if (!Py_IsNone(dstrectobj)) { + if (!(dstrectptr = pgFRect_FromObject(dstrectobj, &dstrect))) { + if (!pg_TwoFloatsFromObj(dstrectobj, &dstrect.x, &dstrect.y)) { + return RAISE(PyExc_ValueError, + "dstrect must be a point, Rect, or None"); + } + dstrect.w = (float)self->width; + dstrect.h = (float)self->height; + } + } + if (!Py_IsNone(originobj)) { + if (!pg_TwoFloatsFromObj(originobj, &origin.x, &origin.y)) { + return RAISE(PyExc_ValueError, "origin must be a point or None"); + } + originptr = &origin; + } + if (flip_x) { + flip |= SDL_FLIP_HORIZONTAL; + } + if (flip_y) { + flip |= SDL_FLIP_VERTICAL; + } + RENDERER_ERROR_CHECK(SDL_RenderCopyExF(self->renderer->renderer, + self->texture, srcrectptr, + dstrectptr, angle, originptr, flip)) + Py_RETURN_NONE; +} + +static PyObject * +texture_draw_triangle(pgTextureObject *self, PyObject *args, PyObject *kwargs) +{ +#if SDL_VERSION_ATLEAST(2, 0, 18) + PyObject *p1_xyobj, *p2_xyobj, *p3_xyobj, + *p1_uvobj = Py_None, *p2_uvobj = Py_None, *p3_uvobj = Py_None, + *p1_modobj = Py_None, *p2_modobj = Py_None, *p3_modobj = Py_None; + Uint8 texture_mods[4]; + float mods[4]; + Uint8 p1_mod[4], p2_mod[4], p3_mod[4]; + SDL_Vertex vertices[3]; + static char *keywords[] = {"p1_xy", "p2_xy", "p3_xy", "p1_uv", "p2_uv", + "p3_uv", "p1_mod", "p2_mod", "p3_mod", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|OOOOOO", keywords, + &p1_xyobj, &p2_xyobj, &p3_xyobj, + &p1_uvobj, &p2_uvobj, &p3_uvobj, + &p1_modobj, &p2_modobj, &p3_modobj)) { + return NULL; /* Exception already set. */ + } + /* Parse position */ + PARSE_POINT(p1_xyobj, vertices[0].position.x, vertices[0].position.y, + "p1_xy") + PARSE_POINT(p2_xyobj, vertices[1].position.x, vertices[1].position.y, + "p2_xy") + PARSE_POINT(p3_xyobj, vertices[2].position.x, vertices[2].position.y, + "p3_xy") + /* Parse tex_coord */ + if (Py_IsNone(p1_uvobj)) { + vertices[0].tex_coord.x = 0.0; + vertices[0].tex_coord.y = 0.0; + } + else { + PARSE_POINT(p1_uvobj, vertices[0].tex_coord.x, vertices[0].tex_coord.y, + "p1_uv") + } + if (Py_IsNone(p2_uvobj)) { + vertices[1].tex_coord.x = 1.0; + vertices[1].tex_coord.y = 1.0; + } + else { + PARSE_POINT(p2_uvobj, vertices[1].tex_coord.x, vertices[1].tex_coord.y, + "p2_uv") + } + if (Py_IsNone(p3_uvobj)) { + vertices[2].tex_coord.x = 0.0; + vertices[2].tex_coord.y = 1.0; + } + else { + PARSE_POINT(p3_uvobj, vertices[2].tex_coord.x, vertices[2].tex_coord.y, + "p3_uv") + } + /* Parse color */ + PARSE_COLOR(p1_modobj, p1_mod) + PARSE_COLOR(p2_modobj, p2_mod) + PARSE_COLOR(p3_modobj, p3_mod) + RENDERER_ERROR_CHECK(SDL_GetTextureColorMod( + self->texture, &texture_mods[0], &texture_mods[1], &texture_mods[2])); + RENDERER_ERROR_CHECK( + SDL_GetTextureAlphaMod(self->texture, &texture_mods[3])); + mods[0] = texture_mods[0] / (float)255.0; + mods[1] = texture_mods[1] / (float)255.0; + mods[2] = texture_mods[2] / (float)255.0; + mods[3] = texture_mods[3] / (float)255.0; + SET_VERTEX_COLOR(vertices[0], mods, p1_mod); + SET_VERTEX_COLOR(vertices[1], mods, p2_mod); + SET_VERTEX_COLOR(vertices[2], mods, p3_mod); + RENDERER_ERROR_CHECK(SDL_RenderGeometry( + self->renderer->renderer, self->texture, vertices, 3, NULL, 0)) + Py_RETURN_NONE; +#else + RAISE(PyExc_TypeError, "draw_triangle() requires SDL 2.0.18 or newer"); + Py_RETURN_NONE; +#endif +} + +static PyObject * +texture_draw_quad(pgTextureObject *self, PyObject *args, PyObject *kwargs) +{ +#if SDL_VERSION_ATLEAST(2, 0, 18) + PyObject *p1_xyobj, *p2_xyobj, *p3_xyobj, *p4_xyobj, + *p1_uvobj = Py_None, *p2_uvobj = Py_None, *p3_uvobj = Py_None, + *p4_uvobj = Py_None, *p1_modobj = Py_None, *p2_modobj = Py_None, + *p3_modobj = Py_None, *p4_modobj = Py_None; + Uint8 texture_mods[4]; + float mods[4]; + Uint8 p1_mod[4], p2_mod[4], p3_mod[4], p4_mod[4]; + SDL_Vertex vertices[6]; + static char *keywords[] = {"p1_xy", "p2_xy", "p3_xy", "p4_xy", "p1_uv", + "p2_uv", "p3_uv", "p4_uv", "p1_mod", "p2_mod", + "p3_mod", "p4_mod", NULL}; + if (!PyArg_ParseTupleAndKeywords( + args, kwargs, "OOOO|OOOOOOOO", keywords, &p1_xyobj, &p2_xyobj, + &p3_xyobj, &p4_xyobj, &p1_uvobj, &p2_uvobj, &p3_uvobj, &p4_uvobj, + &p1_modobj, &p2_modobj, &p3_modobj, &p4_modobj)) { + return NULL; /* Exception already set. */ + } + /* Parse position */ + PARSE_POINT(p1_xyobj, vertices[0].position.x, vertices[0].position.y, + "p1_xy") + PARSE_POINT(p2_xyobj, vertices[1].position.x, vertices[1].position.y, + "p2_xy") + PARSE_POINT(p3_xyobj, vertices[2].position.x, vertices[2].position.y, + "p3_xy") + vertices[3].position = vertices[2].position; + PARSE_POINT(p4_xyobj, vertices[4].position.x, vertices[4].position.y, + "p4_xy") + vertices[5].position = vertices[0].position; + /* Parse tex_coord */ + if (Py_IsNone(p1_uvobj)) { + vertices[0].tex_coord.x = 0.0; + vertices[0].tex_coord.y = 0.0; + } + else { + PARSE_POINT(p1_uvobj, vertices[0].tex_coord.x, vertices[0].tex_coord.y, + "p1_uv") + } + if (Py_IsNone(p2_uvobj)) { + vertices[1].tex_coord.x = 1.0; + vertices[1].tex_coord.y = 0.0; + } + else { + PARSE_POINT(p2_uvobj, vertices[1].tex_coord.x, vertices[1].tex_coord.y, + "p2_uv") + } + if (Py_IsNone(p3_uvobj)) { + vertices[2].tex_coord.x = 1.0; + vertices[2].tex_coord.y = 1.0; + } + else { + PARSE_POINT(p3_uvobj, vertices[2].tex_coord.x, vertices[2].tex_coord.y, + "p3_uv") + } + vertices[3].tex_coord = vertices[2].tex_coord; + if (Py_IsNone(p4_uvobj)) { + vertices[4].tex_coord.x = 0.0; + vertices[4].tex_coord.y = 1.0; + } + else { + PARSE_POINT(p4_uvobj, vertices[4].tex_coord.x, vertices[4].tex_coord.y, + "p4_uv") + } + vertices[5].tex_coord = vertices[0].tex_coord; + /* Parse color */ + PARSE_COLOR(p1_modobj, p1_mod) + PARSE_COLOR(p2_modobj, p2_mod) + PARSE_COLOR(p3_modobj, p3_mod) + PARSE_COLOR(p4_modobj, p4_mod) + RENDERER_ERROR_CHECK(SDL_GetTextureColorMod( + self->texture, &texture_mods[0], &texture_mods[1], &texture_mods[2])); + RENDERER_ERROR_CHECK( + SDL_GetTextureAlphaMod(self->texture, &texture_mods[3])); + mods[0] = texture_mods[0] / (float)255.0; + mods[1] = texture_mods[1] / (float)255.0; + mods[2] = texture_mods[2] / (float)255.0; + mods[3] = texture_mods[3] / (float)255.0; + SET_VERTEX_COLOR(vertices[0], mods, p1_mod); + SET_VERTEX_COLOR(vertices[1], mods, p2_mod); + SET_VERTEX_COLOR(vertices[2], mods, p3_mod); + vertices[3].color = vertices[2].color; + SET_VERTEX_COLOR(vertices[4], mods, p4_mod); + vertices[5].color = vertices[0].color; + RENDERER_ERROR_CHECK(SDL_RenderGeometry( + self->renderer->renderer, self->texture, vertices, 6, NULL, 0)) + Py_RETURN_NONE; +#else + RAISE(PyExc_TypeError, "draw_triangle() requires SDL 2.0.18 or newer"); + Py_RETURN_NONE; +#endif +} + +static PyObject * +texture_update(pgTextureObject *self, PyObject *args, PyObject *kwargs) +{ + pgSurfaceObject *surfobj; + PyObject *rectobj = Py_None; + SDL_Surface *surf = NULL; + SDL_Rect area, *areaptr = NULL; + SDL_Surface *converted_surf = NULL; + SDL_PixelFormat *pixel_format = NULL; + SDL_BlendMode blend; + Uint32 format; + int res; + int dst_width, dst_height; + static char *keywords[] = {"surface", "area", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O", keywords, + &pgSurface_Type, &surfobj, &rectobj)) { + return NULL; /* Exception already set. */ + } + surf = pgSurface_AsSurface(surfobj); + SURF_INIT_CHECK(surf) + area.x = 0; + area.y = 0; + if (!Py_IsNone(rectobj)) { + if (!(areaptr = pgRect_FromObject(rectobj, &area))) { + return RAISE(PyExc_ValueError, "area must be a rectangle or None"); + } + } + if (areaptr == NULL) { + dst_width = self->width; + dst_height = self->height; + } + else { + dst_width = area.w; + dst_height = area.h; + } + if (dst_width > surf->w || dst_height > surf->h) { + areaptr = &area; + area.w = surf->w; + area.h = surf->h; + } + RENDERER_ERROR_CHECK( + SDL_QueryTexture(self->texture, &format, NULL, NULL, NULL)) + if (format != surf->format->format) { + RENDERER_ERROR_CHECK(SDL_GetSurfaceBlendMode(surf, &blend)) + pixel_format = SDL_AllocFormat(format); + if (pixel_format == NULL) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + converted_surf = SDL_ConvertSurface(surf, pixel_format, 0); + if (SDL_SetSurfaceBlendMode(converted_surf, blend) < 0) { + SDL_FreeSurface(converted_surf); + SDL_FreeFormat(pixel_format); + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + res = SDL_UpdateTexture(self->texture, areaptr, converted_surf->pixels, + converted_surf->pitch); + SDL_FreeSurface(converted_surf); + SDL_FreeFormat(pixel_format); + } + else { + res = SDL_UpdateTexture(self->texture, areaptr, surf->pixels, + surf->pitch); + } + if (res < 0) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + Py_RETURN_NONE; +} + +static PyObject * +texture_get_renderer(pgTextureObject *self, void *closure) +{ + Py_INCREF(self->renderer); + return (PyObject *)self->renderer; +} + +static PyObject * +texture_get_width(pgTextureObject *self, void *closure) +{ + return PyLong_FromLong(self->width); +} + +static PyObject * +texture_get_height(pgTextureObject *self, void *closure) +{ + return PyLong_FromLong(self->height); +} + +static PyObject * +texture_get_alpha(pgTextureObject *self, void *closure) +{ + Uint8 alpha; + RENDERER_ERROR_CHECK(SDL_GetTextureAlphaMod(self->texture, &alpha)); + return PyLong_FromLong(alpha); +} + +static int +texture_set_alpha(pgTextureObject *self, PyObject *arg, void *closure) +{ + if (PyLong_Check(arg)) { + unsigned long longval = PyLong_AsUnsignedLong(arg); + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetTextureAlphaMod(self->texture, (Uint8)longval)) + return 0; + } + return -1; +} + +static PyObject * +texture_get_blend_mode(pgTextureObject *self, void *closure) +{ + SDL_BlendMode blend_mode; + RENDERER_ERROR_CHECK(SDL_GetTextureBlendMode(self->texture, &blend_mode)); + return PyLong_FromLong((long)blend_mode); +} + +static int +texture_set_blend_mode(pgTextureObject *self, PyObject *arg, void *closure) +{ + long longval = PyLong_AsLong(arg); + if (longval == -1 && PyErr_Occurred()) { + return -1; + } + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetTextureBlendMode(self->texture, (int)longval)) + return 0; +} + +static PyObject * +texture_get_color(pgTextureObject *self, void *closure) +{ + Uint8 color[4]; + RENDERER_ERROR_CHECK(SDL_GetTextureColorMod(self->texture, &color[0], + &color[1], &color[2])); + color[3] = 255; + return pgColor_NewLength(color, 4); +} + +static int +texture_set_color(pgTextureObject *self, PyObject *arg, void *closure) +{ + Uint8 color[4]; + if (!pg_RGBAFromObjEx(arg, color, PG_COLOR_HANDLE_ALL)) { + return -1; + } + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetTextureColorMod(self->texture, color[0], color[1], color[2])) + return 0; +} + +static int +texture_init(pgTextureObject *self, PyObject *args, PyObject *kwargs) +{ + pgRendererObject *renderer; + PyObject *sizeobj; + int width; + int height; + int depth = 0; + int staticc = 0; + int streaming = 0; + int target = 0; + int scale_quality = -1; + int access = SDL_TEXTUREACCESS_STATIC; + Uint32 Rmask, Gmask, Bmask, Amask; + Uint32 format; + + char *keywords[] = {"renderer", "size", "depth", "static", + "streaming", "target", "scale_quality", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|ipppi", keywords, + &renderer, &sizeobj, &depth, &staticc, + &streaming, &target, &scale_quality)) { + return -1; + } + if (depth == 0 || depth == 32) { + Rmask = 0xFF << 16; + Gmask = 0xFF << 8; + Bmask = 0xFF; + Amask = 0xFF << 24; + } + else if (depth == 16) { + Rmask = 0xF << 8; + Gmask = 0xF << 4; + Bmask = 0xF; + Amask = 0xF << 12; + } + else { + RAISERETURN(PyExc_ValueError, + "no standard masks exist for given bitdepth with alpha", + -1) + } + format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask); + if (!pg_TwoIntsFromObj(sizeobj, &width, &height)) { + RAISERETURN(PyExc_TypeError, "invalid size argument", -1) + } + if (width <= 0 || height <= 0) { + RAISERETURN(PyExc_ValueError, "size must contain two positive values", + -1) + } + if (streaming) { + if (staticc || target) { + RAISERETURN(PyExc_ValueError, + "only one of static, streaming, or target can be true", + -1) + } + access = SDL_TEXTUREACCESS_STREAMING; + } + else if (target) { + if (staticc) { + RAISERETURN(PyExc_ValueError, + "only one of static, streaming, or target can be true", + -1) + } + access = SDL_TEXTUREACCESS_TARGET; + } + else { + access = SDL_TEXTUREACCESS_STATIC; + } + self->renderer = renderer; + Py_XINCREF(self->renderer); + self->texture = + SDL_CreateTexture(renderer->renderer, format, access, width, height); + if (!self->texture) { + RAISERETURN(pgExc_SDLError, SDL_GetError(), -1) + } + if (scale_quality != -1) { +#if SDL_VERSION_ATLEAST(2, 0, 12) + RENDERER_PROPERTY_ERROR_CHECK( + SDL_SetTextureScaleMode(self->texture, scale_quality)) +#else + switch (scale_quality) { + case 0: + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); + break; + case 1: + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); + break; + case 2: + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); + break; + } +#endif + } + self->width = width; + self->height = height; + return 0; } -/* Image implementation */ static void +texture_dealloc(pgTextureObject *self, PyObject *_null) +{ + if (self->texture) { + SDL_DestroyTexture(self->texture); + } + Py_TYPE(self)->tp_free(self); +} + +/* Image implementation */ +static int image_renderer_draw(pgImageObject *self, PyObject *area, PyObject *dest) { - return; + return 1; } /* Module definition */ @@ -610,9 +1178,36 @@ static PyGetSetDef renderer_getset[] = { DOC_SDL2_VIDEO_RENDERER_TARGET, NULL}, {NULL, 0, NULL, NULL, NULL}}; -static PyMethodDef texture_methods[] = {{NULL, NULL, 0, NULL}}; +static PyMethodDef texture_methods[] = { + {"get_rect", (PyCFunction)texture_get_rect, METH_FASTCALL | METH_KEYWORDS, + DOC_SDL2_VIDEO_TEXTURE_GETRECT}, + {"draw", (PyCFunction)texture_draw, METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_TEXTURE_DRAW}, + {"draw_triangle", (PyCFunction)texture_draw_triangle, + METH_VARARGS | METH_KEYWORDS, DOC_SDL2_VIDEO_TEXTURE_DRAWTRIANGLE}, + {"draw_quad", (PyCFunction)texture_draw_quad, METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_TEXTURE_DRAWQUAD}, + {"update", (PyCFunction)texture_update, METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_TEXTURE_UPDATE}, + {"from_surface", (PyCFunction)texture_from_surface, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + DOC_SDL2_VIDEO_TEXTURE_FROMSURFACE}, + {NULL, NULL, 0, NULL}}; -static PyGetSetDef texture_getset[] = {{NULL, 0, NULL, NULL, NULL}}; +static PyGetSetDef texture_getset[] = { + {"renderer", (getter)texture_get_renderer, (setter)NULL, + DOC_SDL2_VIDEO_TEXTURE_RENDERER, NULL}, + {"width", (getter)texture_get_width, (setter)NULL, + DOC_SDL2_VIDEO_TEXTURE_WIDTH, NULL}, + {"height", (getter)texture_get_height, (setter)NULL, + DOC_SDL2_VIDEO_TEXTURE_HEIGHT, NULL}, + {"alpha", (getter)texture_get_alpha, (setter)texture_set_alpha, + DOC_SDL2_VIDEO_TEXTURE_ALPHA, NULL}, + {"blend_mode", (getter)texture_get_blend_mode, + (setter)texture_set_blend_mode, DOC_SDL2_VIDEO_TEXTURE_BLENDMODE, NULL}, + {"color", (getter)texture_get_color, (setter)texture_set_color, + DOC_SDL2_VIDEO_TEXTURE_COLOR, NULL}, + {NULL, 0, NULL, NULL, NULL}}; static PyMethodDef image_methods[] = {{NULL, NULL, 0, NULL}}; @@ -631,10 +1226,12 @@ static PyTypeObject pgRenderer_Type = { static PyTypeObject pgTexture_Type = { 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, - //.tp_init = (initproc)texture_init, - .tp_new = PyType_GenericNew, .tp_getset = texture_getset}; + .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._render.Image", diff --git a/test/render_test.py b/test/render_test.py index b04a635ddd..55fd1b5370 100644 --- a/test/render_test.py +++ b/test/render_test.py @@ -45,15 +45,21 @@ def test_to_surface(self): self.renderer.to_surface(small_surf) def test_blit(self): - texture = _render.Texture(self.renderer, (20, 20)) + surface = pygame.Surface((10, 10)) + surface.fill((80, 120, 160, 200)) + texture = _render.Texture.from_surface(self.renderer, surface) image = _render.Image(texture) drawable_object = DrawableObject() dest = pygame.Rect(10, 10, 20, 20) area = pygame.Rect(0, 0, 15, 15) - self.renderer.blit( - texture, dest, area - ) # TODO Assert after Texture implementation + self.renderer.blit(texture, dest, area) + result = self.renderer.to_surface() + self.assertEqual(pygame.Color(0, 0, 0, 255), result.get_at((9, 20))) + for x in range(10, 30): + self.assertEqual(pygame.Color(80, 120, 160, 255), result.get_at((x, 20))) + self.assertEqual(pygame.Color(0, 0, 0, 255), result.get_at((30, 20))) + self.renderer.clear() self.renderer.blit(image, dest, area) # TODO Assert after Image implementation @@ -212,3 +218,249 @@ def test_draw_color(self): self.assertEqual(self.renderer.draw_color, pygame.Color(0, 0, 0, 0)) self.renderer.draw_color = "YELLOW" self.assertEqual(self.renderer.draw_color, pygame.Color(255, 255, 0, 255)) + + +class TextureTest(unittest.TestCase): + def setUp(self): + self.window = pygame.Window(size=(100, 100)) + self.renderer = _render.Renderer(self.window) + self.texture = _render.Texture(self.renderer, (80, 60)) + + def create_texture_from_surface(self): + surface = pygame.Surface((100, 100)) + surface.fill(pygame.Color(80, 120, 160, 128)) + return _render.Texture.from_surface(self.renderer, surface) + + def test_init(self): + _render.Texture(self.renderer, (100, 100)) + _render.Texture(self.renderer, (100, 100), depth=32) + with self.assertRaises(ValueError): + _render.Texture(self.renderer, (100, 100), depth=33) + _render.Texture(self.renderer, (100, 100), depth=32, static=True) + _render.Texture(self.renderer, (100, 100), depth=32, streaming=True) + _render.Texture(self.renderer, (100, 100), depth=32, target=True) + with self.assertRaises(ValueError): + _render.Texture( + self.renderer, (100, 100), depth=32, static=True, target=True + ) + with self.assertRaises(ValueError): + _render.Texture( + self.renderer, (100, 100), depth=32, target=True, streaming=True + ) + with self.assertRaises(ValueError): + _render.Texture( + self.renderer, (100, 100), depth=32, static=True, streaming=True + ) + + def test_alpha(self): + self.assertEqual(255, self.texture.alpha) + self.texture.alpha = 128 + self.assertEqual(128, self.texture.alpha) + + def test_blend_mode(self): + self.assertEqual(pygame.BLENDMODE_NONE, self.texture.blend_mode) + self.texture.blend_mode = pygame.BLENDMODE_BLEND + self.assertEqual(pygame.BLENDMODE_BLEND, self.texture.blend_mode) + + def test_color(self): + self.assertEqual(pygame.Color(255, 255, 255, 255), self.texture.color) + self.texture.color = pygame.Color(100, 110, 120, 130) + self.assertEqual(pygame.Color(100, 110, 120, 255), self.texture.color) + + def test_width(self): + self.assertEqual(80, self.texture.width) + with self.assertRaises(AttributeError): + self.texture.width = 100 + + def test_height(self): + self.assertEqual(60, self.texture.height) + with self.assertRaises(AttributeError): + self.texture.height = 100 + + def test_renderer(self): + self.assertEqual(self.renderer, self.texture.renderer) + window2 = pygame.Window(size=(128, 128)) + renderer2 = _render.Renderer(window2) + with self.assertRaises(AttributeError): + self.texture.renderer = renderer2 + + def test_get_rect(self): + self.assertEqual(pygame.Rect(0, 0, 80, 60), self.texture.get_rect()) + self.assertEqual( + pygame.Rect(10, 20, 80, 60), self.texture.get_rect(center=(50, 50)) + ) + + def test_from_surface(self): + surf_size = (50, 40) + surface = pygame.Surface(surf_size) + texture2 = _render.Texture.from_surface(self.renderer, surface) + self.assertEqual(surf_size, (texture2.width, texture2.height)) + + def test_draw_triangle(self): + texture2 = self.create_texture_from_surface() + texture2.draw_triangle( + (50, 10), + (10, 90), + (90, 90), + (0.5, 0.5), + (0.8, 0.2), + (1, 1), + (100, 100, 100, 100), + (80, 60, 40, 20), + (150, 170, 190, 210), + ) + result = self.renderer.to_surface() + expected = [ + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (28, 38, 45), + (29, 39, 46), + (29, 39, 47), + (29, 40, 48), + (29, 41, 49), + (30, 41, 50), + (30, 42, 52), + (30, 43, 53), + (31, 43, 54), + (31, 44, 55), + (31, 44, 56), + (31, 45, 57), + (32, 46, 59), + (32, 46, 60), + (32, 47, 61), + (32, 48, 62), + (33, 48, 63), + (33, 49, 65), + (33, 50, 66), + (34, 50, 67), + (34, 51, 68), + (34, 52, 69), + (34, 52, 70), + (35, 53, 72), + (35, 54, 73), + (35, 54, 74), + (35, 55, 75), + (36, 55, 76), + (36, 56, 78), + (36, 57, 79), + (37, 57, 80), + (37, 58, 81), + (37, 59, 82), + (37, 59, 83), + (38, 60, 85), + (38, 61, 86), + (38, 61, 87), + (39, 62, 88), + (39, 63, 89), + (39, 63, 90), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + ] + start = 25 + for x in range(start, start + len(expected)): + value = result.get_at((x, 50)) + for color_index in range(3): + expected_value = expected[x - start][color_index] + self.assertTrue( + expected_value - 1 <= value[color_index] <= expected_value + 1 + ) + + def test_draw_quad(self): + texture2 = self.create_texture_from_surface() + texture2.draw_quad( + (10, 10), + (90, 10), + (90, 90), + (10, 90), + (0.5, 0.5), + (0.8, 0.2), + (0.2, 0.8), + (0.9, 0.9), + (100, 100, 100, 100), + (80, 60, 40, 20), + (150, 170, 190, 210), + (128, 128, 128, 128), + ) + result = self.renderer.to_surface() + expected = [ + (37, 58, 79), + (37, 58, 80), + (37, 58, 80), + (37, 58, 81), + (37, 59, 81), + (38, 59, 82), + (38, 59, 82), + (38, 59, 83), + (38, 60, 83), + (38, 60, 84), + (38, 60, 84), + (38, 60, 84), + (38, 61, 85), + (38, 61, 85), + (38, 61, 86), + (38, 61, 86), + (39, 62, 87), + (39, 62, 87), + (39, 62, 88), + (39, 62, 88), + (39, 62, 89), + (39, 63, 89), + (39, 63, 90), + (39, 63, 90), + (39, 63, 91), + (39, 64, 91), + (39, 63, 91), + (39, 63, 90), + (39, 63, 90), + (39, 63, 89), + (39, 63, 89), + (39, 62, 88), + (39, 62, 88), + (39, 62, 88), + (39, 62, 87), + (38, 61, 87), + (38, 61, 86), + (38, 61, 86), + (38, 61, 85), + (38, 60, 85), + (38, 60, 84), + (38, 60, 84), + (38, 60, 83), + (38, 59, 83), + (38, 59, 82), + (38, 59, 82), + (38, 59, 81), + (38, 59, 81), + (37, 58, 80), + (37, 58, 80), + ] + start = 25 + for x in range(start, start + len(expected)): + value = result.get_at((x, 50)) + for color_index in range(3): + expected_value = expected[x - start][color_index] + self.assertTrue( + expected_value - 1 <= value[color_index] <= expected_value + 1 + ) + + def test_draw(self): + texture2 = self.create_texture_from_surface() + texture2.draw(pygame.Rect(10, 20, 40, 40), pygame.Rect(50, 30, 35, 20), 45) + result = self.renderer.to_surface() + for x in range(64, 82): + self.assertEqual(pygame.Color(80, 120, 160, 255), result.get_at((x, 50))) + + def test_update(self): + surface = pygame.Surface((100, 100)) + surface.fill(pygame.Color(80, 120, 160, 128)) + self.texture.update(surface, pygame.Rect(10, 10, 80, 80)) + self.texture.draw() + result = self.renderer.to_surface() + for x in range(25, 75): + self.assertEqual(pygame.Color(80, 120, 160, 255), result.get_at((x, 50))) From dec3aa0667e4c333afef6e834e1a39e635199d09 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 19:24:35 +0530 Subject: [PATCH 359/441] sdl3(display): remove all gamma ramp related code --- src_c/display.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src_c/display.c b/src_c/display.c index 6934ca808d..a1ae793cb1 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -44,7 +44,9 @@ static SDL_Texture *pg_texture = NULL; typedef struct _display_state_s { char *title; PyObject *icon; +#if !SDL_VERSION_ATLEAST(3, 0, 0) Uint16 *gamma_ramp; +#endif SDL_GLContext gl_context; int toggle_windowed_w; int toggle_windowed_h; @@ -87,10 +89,12 @@ _display_state_cleanup(_DisplayState *state) SDL_GL_DeleteContext(state->gl_context); state->gl_context = NULL; } +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (state->gamma_ramp) { free(state->gamma_ramp); state->gamma_ramp = NULL; } +#endif } // prevent this code block from being linked twice @@ -1342,6 +1346,8 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) surf = SDL_GetWindowSurface(win); } } + +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (state->gamma_ramp) { int result = SDL_SetWindowGammaRamp(win, state->gamma_ramp, state->gamma_ramp + 256, @@ -1356,6 +1362,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) goto DESTROY_WINDOW; } } +#endif if (state->using_gl && pg_renderer != NULL) { _display_state_cleanup(state); @@ -2011,6 +2018,24 @@ pg_set_palette(PyObject *self, PyObject *args) Py_RETURN_NONE; } +#if SDL_VERSION_ATLEAST(3, 0, 0) +static PyObject * +pg_set_gamma(PyObject *self, PyObject *arg) +{ + return RAISE(pgExc_SDLError, + "set_gamma not supported with SDL3, this functionality has " + "been removed."); +} + +static PyObject * +pg_set_gamma_ramp(PyObject *self, PyObject *arg) +{ + return RAISE( + pgExc_SDLError, + "pg_set_gamma_ramp not supported with SDL3, this functionality has " + "been removed."); +} +#else static PyObject * pg_set_gamma(PyObject *self, PyObject *arg) { @@ -2150,6 +2175,7 @@ pg_set_gamma_ramp(PyObject *self, PyObject *arg) } return PyBool_FromLong(result == 0); } +#endif static PyObject * pg_set_caption(PyObject *self, PyObject *arg) @@ -3207,7 +3233,9 @@ MODINIT_DEFINE(display) state = DISPLAY_MOD_STATE(module); state->title = NULL; state->icon = NULL; +#if !SDL_VERSION_ATLEAST(3, 0, 0) state->gamma_ramp = NULL; +#endif state->using_gl = 0; state->auto_resize = SDL_TRUE; From 6a389a0f9feacc920eedc6074dc89a2ba5f0055f Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:01:12 +0530 Subject: [PATCH 360/441] sdl3(display): handle SDL_GL_* updates --- src_c/display.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src_c/display.c b/src_c/display.c index a1ae793cb1..76fa9c2224 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -2370,12 +2370,25 @@ pg_is_vsync(PyObject *self, PyObject *_null) } if (state->using_gl) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + int interval; + if (!SDL_GL_GetSwapInterval(&interval)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + if (interval != 0) { + Py_RETURN_TRUE; + } + else { + Py_RETURN_FALSE; + } +#else if (SDL_GL_GetSwapInterval() != 0) { Py_RETURN_TRUE; } else { Py_RETURN_FALSE; } +#endif } Py_RETURN_FALSE; @@ -2534,7 +2547,11 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) */ if (state->using_gl) { p_glViewport = (GL_glViewport_Func)SDL_GL_GetProcAddress("glViewport"); +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_GetWindowSizeInPixels(win, &w, &h); +#else SDL_GL_GetDrawableSize(win, &w, &h); +#endif } else { w = display_surface->surf->w; From ac352fb50f2f1fb2ee961a363c146279a9136bae Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:02:41 +0530 Subject: [PATCH 361/441] sdl3(display): handle SDL_RendererInfo changes --- src_c/display.c | 71 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 7 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 76fa9c2224..9f4e5363b8 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -1279,8 +1279,6 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (flags & PGS_SCALED || state->unscaled_render) { if (pg_renderer == NULL) { - SDL_RendererInfo info; - SDL_SetHintWithPriority(SDL_HINT_RENDER_SCALE_QUALITY, "nearest", SDL_HINT_DEFAULT); @@ -1319,6 +1317,26 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) SDL_SetWindowMinimumSize(win, w, h); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + int has_vsync = 0; + SDL_GetRenderVSync(pg_renderer, &has_vsync); + if (vsync && has_vsync) { + PyErr_SetString(pgExc_SDLError, + "could not enable vsync"); + _display_state_cleanup(state); + goto DESTROY_WINDOW; + } + const char *name = SDL_GetRendererName(pg_renderer); + if (name && !strcmp(name, SDL_SOFTWARE_RENDERER)) { + if (PyErr_WarnEx(PyExc_Warning, + "no fast renderer available", + 1) != 0) { + _display_state_cleanup(state); + goto DESTROY_WINDOW; + } + } +#else + SDL_RendererInfo info; SDL_GetRendererInfo(pg_renderer, &info); if (vsync && !(info.flags & SDL_RENDERER_PRESENTVSYNC)) { PyErr_SetString(pgExc_SDLError, @@ -1334,6 +1352,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) goto DESTROY_WINDOW; } } +#endif pg_texture = SDL_CreateTexture( pg_renderer, SDL_PIXELFORMAT_ARGB8888, @@ -2272,6 +2291,21 @@ pg_iconify(PyObject *self, PyObject *_null) static PyObject * pg_get_scaled_renderer_info(PyObject *self, PyObject *_null) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + VIDEO_INIT_CHECK(); + if (!pg_renderer) { + Py_RETURN_NONE; + } + + const char *name = SDL_GetRendererName(pg_renderer); + if (!name) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + /* flags are not being handled here but it shouldn't matter as this is + * undocumented API */ + return Py_BuildValue("(si)", name, 0); +#else SDL_RendererInfo r_info; VIDEO_INIT_CHECK(); @@ -2284,6 +2318,7 @@ pg_get_scaled_renderer_info(PyObject *self, PyObject *_null) } return Py_BuildValue("(si)", r_info.name, r_info.flags); +#endif } static PyObject * @@ -2355,6 +2390,19 @@ pg_is_vsync(PyObject *self, PyObject *_null) } if (pg_renderer != NULL) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + int has_vsync = 0; + if (!SDL_GetRenderVSync(pg_renderer, &has_vsync)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + + if (has_vsync) { + Py_RETURN_TRUE; + } + else { + Py_RETURN_FALSE; + } +#else SDL_RendererInfo info; if (SDL_GetRendererInfo(pg_renderer, &info) != 0) { @@ -2367,6 +2415,7 @@ pg_is_vsync(PyObject *self, PyObject *_null) else { Py_RETURN_FALSE; } +#endif } if (state->using_gl) { @@ -2465,7 +2514,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) _DisplayState *state = DISPLAY_MOD_STATE(self); GL_glViewport_Func p_glViewport = NULL; SDL_SysWMinfo wm_info; - SDL_RendererInfo r_info; + int is_renderer_software = 0; VIDEO_INIT_CHECK(); if (!win) { @@ -2485,9 +2534,19 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } if (pg_renderer != NULL) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const char *r_name; + if (!(r_name = SDL_GetRendererName(pg_renderer))) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + is_renderer_software = !strcmp(r_name, SDL_SOFTWARE_RENDERER); +#else + SDL_RendererInfo r_info; if (SDL_GetRendererInfo(pg_renderer, &r_info) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } + is_renderer_software = r_info.flags & SDL_RENDERER_SOFTWARE; +#endif } switch (wm_info.subsystem) { @@ -2583,8 +2642,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } SDL_SetWindowSize(win, w * scale, h * scale); - if (r_info.flags & SDL_RENDERER_SOFTWARE && - wm_info.subsystem == SDL_SYSWM_X11) { + if (is_renderer_software && wm_info.subsystem == SDL_SYSWM_X11) { /* display surface lost? */ SDL_DestroyTexture(pg_texture); SDL_DestroyRenderer(pg_renderer); @@ -2720,8 +2778,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } - if (r_info.flags & SDL_RENDERER_SOFTWARE && - wm_info.subsystem == SDL_SYSWM_X11) { + if (is_renderer_software && wm_info.subsystem == SDL_SYSWM_X11) { if (PyErr_WarnEx( PyExc_Warning, "recreating software renderer in toggle_fullscreen", From fede184934d69d0a7a994793a44c37da5182166a Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:07:44 +0530 Subject: [PATCH 362/441] sdl3(display): handle MessageBox changes --- src_c/display.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src_c/display.c b/src_c/display.c index 9f4e5363b8..0f98c3fd86 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -718,7 +718,13 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) _DisplayState *state; SDL_Window *window; - if (event->type != SDL_WINDOWEVENT) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type >= SDL_EVENT_WINDOW_FIRST && + event->type <= SDL_EVENT_WINDOW_LAST) +#else + if (event->type == SDL_WINDOWEVENT) +#endif + { return 0; } @@ -3067,7 +3073,11 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) if (buttons == NULL) { buttons_data = malloc(sizeof(SDL_MessageBoxButtonData)); buttons_data->flags = 0; +#if SDL_VERSION_ATLEAST(3, 0, 0) + buttons_data->buttonID = 0; +#else buttons_data->buttonid = 0; +#endif buttons_data->text = "OK"; msgbox_data.numbuttons = 1; @@ -3141,6 +3151,19 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) } buttons_data[i].text = btn_name; +#if SDL_VERSION_ATLEAST(3, 0, 0) + buttons_data[i].buttonID = (int)i; + buttons_data[i].flags = 0; + if (return_button_index == buttons_data[i].buttonID) { + buttons_data[i].flags |= + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT; + } + if (escape_button_used && + escape_button_index == buttons_data[i].buttonID) { + buttons_data[i].flags |= + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; + } +#else buttons_data[i].buttonid = (int)i; buttons_data[i].flags = 0; if (return_button_index == buttons_data[i].buttonid) { @@ -3152,6 +3175,7 @@ pg_message_box(PyObject *self, PyObject *arg, PyObject *kwargs) buttons_data[i].flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; } +#endif } } From fd7636f5033957794f45327d7f7bbb5f375d2f51 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:11:27 +0530 Subject: [PATCH 363/441] sdl3(display): handle pixelformat/surface changes --- src_c/display.c | 28 +++++++++++++++++++++------- src_c/include/_pygame.h | 6 ++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 0f98c3fd86..3a918b7fdf 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -335,8 +335,10 @@ pg_vidinfo_getattr(PyObject *self, char *name) info->vfmt->Bshift, info->vfmt->Ashift); } else if (!strcmp(name, "losses")) { - return Py_BuildValue("(iiii)", info->vfmt->Rloss, info->vfmt->Gloss, - info->vfmt->Bloss, info->vfmt->Aloss); + return Py_BuildValue("(iiii)", PG_FORMAT_R_LOSS(info->vfmt), + PG_FORMAT_G_LOSS(info->vfmt), + PG_FORMAT_B_LOSS(info->vfmt), + PG_FORMAT_A_LOSS(info->vfmt)); } else if (!strcmp(name, "current_h")) { return PyLong_FromLong(info->current_h); @@ -382,8 +384,9 @@ pg_vidinfo_str(PyObject *self) PG_FORMAT_BytesPerPixel(info->vfmt), info->vfmt->Rmask, info->vfmt->Gmask, info->vfmt->Bmask, info->vfmt->Amask, info->vfmt->Rshift, info->vfmt->Gshift, info->vfmt->Bshift, - info->vfmt->Ashift, info->vfmt->Rloss, info->vfmt->Gloss, - info->vfmt->Bloss, info->vfmt->Aloss, info->current_w, info->current_h, + info->vfmt->Ashift, PG_FORMAT_R_LOSS(info->vfmt), + PG_FORMAT_G_LOSS(info->vfmt), PG_FORMAT_B_LOSS(info->vfmt), + PG_FORMAT_A_LOSS(info->vfmt), info->current_w, info->current_h, pixel_format_name); } @@ -415,7 +418,7 @@ static pg_VideoInfo * pg_GetVideoInfo(pg_VideoInfo *info) { SDL_DisplayMode mode; - SDL_PixelFormat *tempformat; + PG_PixelFormat *tempformat; Uint32 formatenum; pgSurfaceObject *winsurfobj; SDL_Surface *winsurf; @@ -431,7 +434,12 @@ pg_GetVideoInfo(pg_VideoInfo *info) winsurf = pgSurface_AsSurface(winsurfobj); info->current_w = winsurf->w; info->current_h = winsurf->h; - info->vfmt_data = *(winsurf->format); + PG_PixelFormat *fmt = PG_GetSurfaceFormat(winsurf); + if (!fmt) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return (pg_VideoInfo *)NULL; + } + info->vfmt_data = *fmt; info->vfmt = &info->vfmt_data; } else { @@ -449,7 +457,9 @@ pg_GetVideoInfo(pg_VideoInfo *info) if ((tempformat = SDL_AllocFormat(formatenum))) { info->vfmt_data = *tempformat; info->vfmt = &info->vfmt_data; +#if !SDL_VERSION_ATLEAST(3, 0, 0) SDL_FreeFormat(tempformat); +#endif } else { PyErr_SetString(pgExc_SDLError, SDL_GetError()); @@ -1423,7 +1433,11 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) Py_DECREF(surface); /* ensure window is always black after a set_mode call */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_FillRect(surf, NULL, SDL_MapSurfaceRGB(surf, 0, 0, 0)); +#else SDL_FillRect(surf, NULL, SDL_MapRGB(surf->format, 0, 0, 0)); +#endif } /*set the window icon*/ @@ -1968,7 +1982,7 @@ pg_set_palette(PyObject *self, PyObject *args) Py_INCREF(surface); surf = pgSurface_AsSurface(surface); - pal = surf->format->palette; + pal = PG_GetSurfacePalette(surf); if (PG_SURF_BytesPerPixel(surf) != 1 || !pal) { Py_DECREF(surface); return RAISE(pgExc_SDLError, "Display mode is not colormapped"); diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index c3bcc5ec55..03f4e8b772 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -284,8 +284,14 @@ typedef struct { Uint32 blit_sw_A : 1; Uint32 blit_fill : 1; Uint32 video_mem; +#if PG_SDL3 + /* We cannot use PG_PixelFormat here because it aliases to const */ + SDL_PixelFormatDetails *vfmt; + SDL_PixelFormatDetails vfmt_data; +#else SDL_PixelFormat *vfmt; SDL_PixelFormat vfmt_data; +#endif int current_w; int current_h; } pg_VideoInfo; From fb13d26cfb59d238da79e7b537c36106faf9fe36 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:17:31 +0530 Subject: [PATCH 364/441] sdl3(display): handle display mode/id changes --- src_c/display.c | 203 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 168 insertions(+), 35 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 3a918b7fdf..f04f041877 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -417,7 +417,11 @@ pgVidInfo_New(const pg_VideoInfo *i) static pg_VideoInfo * pg_GetVideoInfo(pg_VideoInfo *info) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *mode_ptr; +#else SDL_DisplayMode mode; +#endif PG_PixelFormat *tempformat; Uint32 formatenum; pgSurfaceObject *winsurfobj; @@ -443,11 +447,19 @@ pg_GetVideoInfo(pg_VideoInfo *info) info->vfmt = &info->vfmt_data; } else { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if ((mode_ptr = SDL_GetCurrentDisplayMode(0))) { + info->current_w = mode_ptr->w; + info->current_h = mode_ptr->h; + formatenum = mode_ptr->format; + } +#else if (SDL_GetCurrentDisplayMode(0, &mode) == 0) { info->current_w = mode.w; info->current_h = mode.h; formatenum = mode.format; } +#endif else { info->current_w = -1; info->current_h = -1; @@ -864,6 +876,24 @@ _get_display(SDL_Window *win) int num_displays, i; SDL_Rect display_bounds; SDL_Point mouse_position; +#if SDL_VERSION_ATLEAST(3, 0, 0) + float x, y; + SDL_GetGlobalMouseState(&x, &y); + mouse_position.x = (int)x; + mouse_position.y = (int)y; + SDL_DisplayID *displays = SDL_GetDisplays(&num_displays); + if (displays) { + for (i = 0; i < num_displays; i++) { + if (SDL_GetDisplayBounds(displays[i], &display_bounds)) { + if (SDL_PointInRect(&mouse_position, &display_bounds)) { + display = displays[i]; + break; + } + } + } + SDL_free(displays); + } +#else SDL_GetGlobalMouseState(&mouse_position.x, &mouse_position.y); num_displays = SDL_GetNumVideoDisplays(); @@ -875,6 +905,7 @@ _get_display(SDL_Window *win) } } } +#endif } return display; } @@ -996,19 +1027,28 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) { Uint32 sdl_flags = 0; - SDL_DisplayMode display_mode; - if (SDL_GetDesktopDisplayMode(display, &display_mode) != 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *display_mode; + if (!(display_mode = SDL_GetDesktopDisplayMode(display))) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#else + SDL_DisplayMode display_mode_local; + SDL_DisplayMode *display_mode = &display_mode_local; + + if (SDL_GetDesktopDisplayMode(display, display_mode) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif if (w == 0 && h == 0 && !(flags & PGS_SCALED)) { /* We are free to choose a resolution in this case, so we can avoid changing the physical resolution. This used to default to the max supported by the monitor, but we can use current desktop resolution without breaking compatibility. */ - w = display_mode.w; - h = display_mode.h; + w = display_mode->w; + h = display_mode->h; zero_size = 1; } @@ -1016,7 +1056,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (flags & PGS_SCALED) { sdl_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; } - else if (w == display_mode.w && h == display_mode.h) { + else if (w == display_mode->w && h == display_mode->h) { /* No need to change physical resolution. Borderless fullscreen is preferred when possible */ sdl_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; @@ -1603,7 +1643,11 @@ pg_mode_ok(PyObject *self, PyObject *args, PyObject *kwds) { SDL_DisplayMode desired, closest; int bpp = 0; +#if SDL_VERSION_ATLEAST(3, 0, 0) + int flags = 0; +#else int flags = SDL_SWSURFACE; +#endif int display_index = 0; char *keywords[] = {"size", "flags", "depth", "display", NULL}; @@ -1615,14 +1659,17 @@ pg_mode_ok(PyObject *self, PyObject *args, PyObject *kwds) &display_index)) { return NULL; } +#if !SDL_VERSION_ATLEAST(3, 0, 0) + /* Display ID is not bounded by number of displays in SDL3 */ if (display_index < 0 || display_index >= SDL_GetNumVideoDisplays()) { return RAISE(PyExc_ValueError, "The display index must be between 0" " and the number of displays."); } + desired.driverdata = 0; +#endif #pragma PG_WARN(Ignoring most flags) - desired.driverdata = 0; desired.refresh_rate = 0; if (bpp == 0) { @@ -1637,7 +1684,14 @@ pg_mode_ok(PyObject *self, PyObject *args, PyObject *kwds) desired.format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, 0); } + +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (!SDL_GetClosestFullscreenDisplayMode(display_index, desired.w, + desired.h, desired.refresh_rate, + 1, &closest)) { +#else if (!SDL_GetClosestDisplayMode(display_index, &desired, &closest)) { +#endif if (flags & PGS_FULLSCREEN) { return PyLong_FromLong((long)0); } @@ -1671,13 +1725,32 @@ pg_list_modes(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } +#if !SDL_VERSION_ATLEAST(3, 0, 0) + /* Display ID is not bounded by number of displays in SDL3 */ if (display_index < 0 || display_index >= SDL_GetNumVideoDisplays()) { return RAISE(PyExc_ValueError, "The display index must be between 0" " and the number of displays."); } +#endif + #pragma PG_WARN(Ignoring flags) +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (bpp == 0) { + const SDL_DisplayMode *curmode; + if (!(curmode = SDL_GetCurrentDisplayMode(display_index))) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + bpp = SDL_BITSPERPIXEL(curmode->format); + } + + SDL_DisplayMode **modes = + SDL_GetFullscreenDisplayModes(display_index, &nummodes); + if (nummodes < 0) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#else if (bpp == 0) { SDL_DisplayMode curmode; if (SDL_GetCurrentDisplayMode(display_index, &curmode)) { @@ -1690,16 +1763,21 @@ pg_list_modes(PyObject *self, PyObject *args, PyObject *kwds) if (nummodes < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif if (!(list = PyList_New(0))) { return NULL; } for (i = 0; i < nummodes; i++) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + mode = *modes[i]; +#else if (SDL_GetDisplayMode(display_index, i, &mode) < 0) { Py_DECREF(list); return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif /* use reasonable defaults (cf. SDL_video.c) */ if (!mode.format) { mode.format = SDL_PIXELFORMAT_XRGB8888; @@ -1730,6 +1808,9 @@ pg_list_modes(PyObject *self, PyObject *args, PyObject *kwds) } Py_DECREF(size); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_free(modes); +#endif return list; } @@ -1800,7 +1881,12 @@ pg_flip(PyObject *self, PyObject *_null) static PyObject * pg_num_displays(PyObject *self, PyObject *_null) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + int ret = -1; + SDL_free(SDL_GetDisplays(&ret)); +#else int ret = SDL_GetNumVideoDisplays(); +#endif if (ret < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -2345,15 +2431,21 @@ static PyObject * pg_get_desktop_screen_sizes(PyObject *self, PyObject *_null) { int display_count, i; - SDL_DisplayMode dm; PyObject *result, *size_tuple; VIDEO_INIT_CHECK(); +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_DisplayID *displays = SDL_GetDisplays(&display_count); + if (!displays) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#else display_count = SDL_GetNumVideoDisplays(); if (display_count < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif result = PyList_New(display_count); if (!result) { @@ -2361,12 +2453,21 @@ pg_get_desktop_screen_sizes(PyObject *self, PyObject *_null) } for (i = 0; i < display_count; i++) { - if (SDL_GetDesktopDisplayMode(i, &dm)) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(displays[i]); + if (!dm) { Py_DECREF(result); return RAISE(pgExc_SDLError, SDL_GetError()); } - - size_tuple = pg_tuple_couple_from_values_int(dm.w, dm.h); +#else + SDL_DisplayMode dm_local; + SDL_DisplayMode *dm = &dm_local; + if (SDL_GetDesktopDisplayMode(i, dm)) { + Py_DECREF(result); + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#endif + size_tuple = pg_tuple_couple_from_values_int(dm->w, dm->h); if (!size_tuple) { Py_DECREF(result); return NULL; @@ -2374,6 +2475,9 @@ pg_get_desktop_screen_sizes(PyObject *self, PyObject *_null) PyList_SET_ITEM(result, i, size_tuple); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_free(displays); +#endif return result; } @@ -2467,7 +2571,6 @@ static PyObject * pg_current_refresh_rate(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); - SDL_DisplayMode mode; int display_index; VIDEO_INIT_CHECK(); @@ -2480,26 +2583,42 @@ pg_current_refresh_rate(PyObject *self, PyObject *_null) return RAISE(pgExc_SDLError, SDL_GetError()); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *mode = SDL_GetCurrentDisplayMode(display_index); + if (!mode) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + /* TODO: Consider returning a float here in an API breaking release */ + return PyLong_FromLong((long)mode->refresh_rate); +#else + SDL_DisplayMode mode; if (SDL_GetCurrentDisplayMode(display_index, &mode) != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } return PyLong_FromLong(mode.refresh_rate); +#endif } static PyObject * pg_desktop_refresh_rates(PyObject *self, PyObject *_null) { int display_count, i; - SDL_DisplayMode dm; PyObject *result, *refresh_rate; VIDEO_INIT_CHECK(); +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_DisplayID *displays = SDL_GetDisplays(&display_count); + if (!displays) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#else display_count = SDL_GetNumVideoDisplays(); if (display_count < 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif result = PyList_New(display_count); if (!result) { @@ -2507,12 +2626,23 @@ pg_desktop_refresh_rates(PyObject *self, PyObject *_null) } for (i = 0; i < display_count; i++) { - if (SDL_GetDesktopDisplayMode(i, &dm)) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(displays[i]); + if (!dm) { Py_DECREF(result); return RAISE(pgExc_SDLError, SDL_GetError()); } +#else + SDL_DisplayMode dm_local; + SDL_DisplayMode *dm = &dm_local; + if (SDL_GetDesktopDisplayMode(i, dm)) { + Py_DECREF(result); + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#endif - refresh_rate = PyLong_FromLong(dm.refresh_rate); + /* TODO: Consider returning a float here in an API breaking release */ + refresh_rate = PyLong_FromLong((long)dm->refresh_rate); if (!refresh_rate) { Py_DECREF(result); return NULL; @@ -2520,6 +2650,9 @@ pg_desktop_refresh_rates(PyObject *self, PyObject *_null) PyList_SET_ITEM(result, i, refresh_rate); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_free(displays); +#endif return result; } @@ -2529,7 +2662,6 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) SDL_Window *win = pg_GetDefaultWindow(); int result, flags; int window_w, window_h, w, h, window_display, x, y; - SDL_DisplayMode display_mode; pgSurfaceObject *display_surface; _DisplayState *state = DISPLAY_MOD_STATE(self); GL_glViewport_Func p_glViewport = NULL; @@ -2615,10 +2747,19 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) SDL_GetWindowSize(win, &window_w, &window_h); SDL_GetWindowPosition(win, &x, &y); window_display = SDL_GetWindowDisplayIndex(win); - if (SDL_GetDesktopDisplayMode(window_display, &display_mode) != 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + const SDL_DisplayMode *display_mode = + SDL_GetDesktopDisplayMode(window_display); + if (!display_mode) { return RAISE(pgExc_SDLError, SDL_GetError()); } - +#else + SDL_DisplayMode dm_local; + SDL_DisplayMode *display_mode = &dm_local; + if (SDL_GetDesktopDisplayMode(window_display, display_mode)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#endif /* if (pg_renderer != NULL) { SDL_RenderGetLogicalSize(pg_renderer, &w, &h); @@ -2695,7 +2836,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) ((float)state->toggle_windowed_w) / (float)state->toggle_windowed_h; float window_aspect_ratio = - ((float)display_mode.w) / (float)display_mode.h; + ((float)display_mode->w) / (float)display_mode->h; if (window_aspect_ratio > saved_aspect_ratio) { int width = (int)(state->toggle_windowed_h * @@ -2829,23 +2970,23 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) float saved_aspect_ratio = ((float)state->scaled_gl_w) / (float)state->scaled_gl_h; float window_aspect_ratio = - ((float)display_mode.w) / (float)display_mode.h; + ((float)display_mode->w) / (float)display_mode->h; if (window_aspect_ratio > saved_aspect_ratio) { - int width = (int)(display_mode.h * saved_aspect_ratio); - p_glViewport((display_mode.w - width) / 2, 0, width, - display_mode.h); + int width = (int)(display_mode->h * saved_aspect_ratio); + p_glViewport((display_mode->w - width) / 2, 0, width, + display_mode->h); } else { - p_glViewport(0, 0, display_mode.w, - (int)(display_mode.w / saved_aspect_ratio)); + p_glViewport(0, 0, display_mode->w, + (int)(display_mode->w / saved_aspect_ratio)); } } else { - p_glViewport(0, 0, display_mode.w, display_mode.h); + p_glViewport(0, 0, display_mode->w, display_mode->h); } } - else if (w == display_mode.w && h == display_mode.h) { + else if (w == display_mode->w && h == display_mode->h) { result = SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); if (result != 0) { @@ -2908,8 +3049,7 @@ pg_display_resize_event(PyObject *self, PyObject *event) int hnew = PyLong_AsLong(PyObject_GetAttrString(event, "h")); SDL_Window *win = pg_GetDefaultWindow(); int flags; - int window_w, window_h, w, h, window_display, result; - SDL_DisplayMode display_mode; + int w, h, result; _DisplayState *state = DISPLAY_MOD_STATE(self); GL_glViewport_Func p_glViewport = NULL; @@ -2925,13 +3065,6 @@ pg_display_resize_event(PyObject *self, PyObject *event) return PyLong_FromLong(-1); } - // could also take the size of the old display surface - SDL_GetWindowSize(win, &window_w, &window_h); - window_display = SDL_GetWindowDisplayIndex(win); - if (SDL_GetDesktopDisplayMode(window_display, &display_mode) != 0) { - return RAISE(pgExc_SDLError, SDL_GetError()); - } - if (state->using_gl) { p_glViewport = (GL_glViewport_Func)SDL_GL_GetProcAddress("glViewport"); SDL_SetWindowSize(win, wnew, hnew); From 90e8f441222ae0ac379ee92c306a89c799dae1f2 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:27:09 +0530 Subject: [PATCH 365/441] sdl3(display): handle event/env api changes --- src_c/display.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index f04f041877..c1279efd05 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -239,7 +239,11 @@ pg_display_init(PyObject *self, PyObject *_null) drivername = SDL_getenv("SDL_VIDEODRIVER"); if (drivername && !SDL_strncasecmp("windib", drivername, SDL_strlen(drivername))) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_setenv_unsafe("SDL_VIDEODRIVER", "windows", 1); +#else SDL_setenv("SDL_VIDEODRIVER", "windows", 1); +#endif } if (!SDL_WasInit(SDL_INIT_VIDEO)) { if (!_pg_mac_display_init()) { @@ -733,7 +737,11 @@ _get_video_window_pos(int *x, int *y, int *center_window) return 0; } +#if SDL_VERSION_ATLEAST(3, 0, 0) +static bool +#else static int SDLCALL +#endif pg_ResizeEventWatch(void *userdata, SDL_Event *event) { SDL_Window *pygame_window; @@ -759,7 +767,11 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) } if (state->unscaled_render && pg_renderer != NULL) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type == SDL_WINDOWEVENT_SIZE_CHANGED) { +#else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { +#endif int w = event->window.data1; int h = event->window.data2; pgSurfaceObject *display_surface = pg_GetDefaultWindowSurface(); @@ -779,10 +791,18 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) } if (pg_renderer != NULL) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type == SDL_WINDOWEVENT_MAXIMIZED) { +#else if (event->window.event == SDL_WINDOWEVENT_MAXIMIZED) { +#endif SDL_RenderSetIntegerScale(pg_renderer, SDL_FALSE); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type == SDL_WINDOWEVENT_RESTORED) { +#else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { +#endif SDL_RenderSetIntegerScale( pg_renderer, !(SDL_GetHintBoolean( "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE))); @@ -791,7 +811,11 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) } if (state->using_gl) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type == SDL_WINDOWEVENT_SIZE_CHANGED) { +#else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { +#endif GL_glViewport_Func p_glViewport = (GL_glViewport_Func)SDL_GL_GetProcAddress("glViewport"); int wnew = event->window.data1; @@ -817,7 +841,11 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) return 0; } +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (event->type == SDL_WINDOWEVENT_SIZE_CHANGED) { +#else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { +#endif SDL_Surface *sdl_surface = SDL_GetWindowSurface(window); pgSurfaceObject *old_surface = pg_GetDefaultWindowSurface(); if (sdl_surface != old_surface->surf) { @@ -853,7 +881,7 @@ pg_display_set_autoresize(PyObject *self, PyObject *arg) int _get_display(SDL_Window *win) { - char *display_env = SDL_getenv("PYGAME_DISPLAY"); + const char *display_env = SDL_getenv("PYGAME_DISPLAY"); int display = 0; /* default display 0 */ if (win != NULL) { @@ -932,7 +960,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) screen as the old one */ int display = _get_display(win); char *title = state->title; - char *scale_env, *winid_env; + const char *scale_env, *winid_env; SDL_SysWMinfo wm_info; SDL_VERSION(&wm_info.version); From a1acefcd2c375d8ae7f6049b0a0083a4bd0fbcb3 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 20:31:32 +0530 Subject: [PATCH 366/441] sdl3(display): handle renderer API changes --- src_c/display.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index c1279efd05..1ad5663751 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -737,6 +737,25 @@ _get_video_window_pos(int *x, int *y, int *center_window) return 0; } +static inline int +PG_RenderSetIntegerScale(SDL_Renderer *renderer, int enable) +{ +#if SDL_VERSION_ATLEAST(3, 0, 0) + int w = 0, h = 0; + if (!SDL_GetRenderLogicalPresentation(renderer, &w, &h, NULL)) { + return -1; + } + return SDL_SetRenderLogicalPresentation( + renderer, w, h, + enable ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE + : SDL_LOGICAL_PRESENTATION_LETTERBOX) + ? 0 + : -1; +#else + return SDL_RenderSetIntegerScale(renderer, enable); +#endif +} + #if SDL_VERSION_ATLEAST(3, 0, 0) static bool #else @@ -796,14 +815,14 @@ pg_ResizeEventWatch(void *userdata, SDL_Event *event) #else if (event->window.event == SDL_WINDOWEVENT_MAXIMIZED) { #endif - SDL_RenderSetIntegerScale(pg_renderer, SDL_FALSE); + PG_RenderSetIntegerScale(pg_renderer, SDL_FALSE); } #if SDL_VERSION_ATLEAST(3, 0, 0) if (event->type == SDL_WINDOWEVENT_RESTORED) { #else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { #endif - SDL_RenderSetIntegerScale( + PG_RenderSetIntegerScale( pg_renderer, !(SDL_GetHintBoolean( "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE))); } @@ -981,10 +1000,13 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (scale_env != NULL) { flags |= PGS_SCALED; + /* TODO: figure out SDL3 equivalent */ +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (strcmp(scale_env, "photo") == 0) { SDL_SetHintWithPriority(SDL_HINT_RENDER_SCALE_QUALITY, "best", SDL_HINT_NORMAL); } +#endif } if (size != NULL) { @@ -1363,8 +1385,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (flags & PGS_SCALED || state->unscaled_render) { if (pg_renderer == NULL) { +#if !SDL_VERSION_ATLEAST(3, 0, 0) + /* TODO: check if this behaviour is still to be retained + * in SDL3 */ SDL_SetHintWithPriority(SDL_HINT_RENDER_SCALE_QUALITY, "nearest", SDL_HINT_DEFAULT); +#endif #if SDL_VERSION_ATLEAST(2, 28, 0) /* If the window has a surface associated with it already, @@ -1375,6 +1401,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) } #endif +#if SDL_VERSION_ATLEAST(3, 0, 0) + pg_renderer = SDL_CreateRenderer(win, NULL); + if (vsync && pg_renderer) { + SDL_SetRenderVSync(pg_renderer, 1); + } +#else if (vsync) { pg_renderer = SDL_CreateRenderer( win, -1, SDL_RENDERER_PRESENTVSYNC); @@ -1382,6 +1414,7 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) else { pg_renderer = SDL_CreateRenderer(win, -1, 0); } +#endif if (pg_renderer == NULL) { return RAISE(pgExc_SDLError, SDL_GetError()); @@ -1391,12 +1424,24 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) /* use whole screen with uneven pixels on fullscreen, exact scale otherwise. we chose the window size for this to work */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + int enable_intscale = + !(flags & PGS_FULLSCREEN || + SDL_GetHintBoolean( + "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE)); + SDL_SetRenderLogicalPresentation( + pg_renderer, w, h, + enable_intscale + ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE + : SDL_LOGICAL_PRESENTATION_LETTERBOX); +#else SDL_RenderSetIntegerScale( pg_renderer, !(flags & PGS_FULLSCREEN || SDL_GetHintBoolean( "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE))); SDL_RenderSetLogicalSize(pg_renderer, w, h); +#endif /* this must be called after creating the renderer!*/ SDL_SetWindowMinimumSize(win, w, h); } @@ -2835,18 +2880,31 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) /* display surface lost? */ SDL_DestroyTexture(pg_texture); SDL_DestroyRenderer(pg_renderer); +#if SDL_VERSION_ATLEAST(3, 0, 0) + pg_renderer = SDL_CreateRenderer(win, SDL_SOFTWARE_RENDERER); +#else pg_renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE); +#endif pg_texture = SDL_CreateTexture(pg_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + int enable_intscale = !SDL_GetHintBoolean( + "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE); + SDL_SetRenderLogicalPresentation( + pg_renderer, w, h, + enable_intscale ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE + : SDL_LOGICAL_PRESENTATION_LETTERBOX); +#else SDL_RenderSetLogicalSize(pg_renderer, w, h); /* use exact integer scale in windowed mode */ SDL_RenderSetIntegerScale( pg_renderer, !SDL_GetHintBoolean( "SDL_HINT_RENDER_SCALE_QUALITY", SDL_FALSE)); +#endif SDL_SetWindowMinimumSize(win, w, h); } else if (state->using_gl) { @@ -2977,15 +3035,24 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) /* display surface lost? only on x11? */ SDL_DestroyTexture(pg_texture); SDL_DestroyRenderer(pg_renderer); +#if SDL_VERSION_ATLEAST(3, 0, 0) + pg_renderer = SDL_CreateRenderer(win, SDL_SOFTWARE_RENDERER); +#else pg_renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE); +#endif pg_texture = SDL_CreateTexture(pg_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_SetRenderLogicalPresentation( + pg_renderer, w, h, SDL_LOGICAL_PRESENTATION_LETTERBOX); +#else SDL_RenderSetLogicalSize(pg_renderer, w, h); SDL_RenderSetIntegerScale(pg_renderer, SDL_FALSE); +#endif } else if (state->using_gl) { result = @@ -3115,9 +3182,18 @@ pg_display_resize_event(PyObject *self, PyObject *event) } } else if (pg_renderer != NULL) { + /* TODO: verify why this block exists and whether SDL3 port is + * equivalent */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_RendererLogicalPresentation mode; + SDL_GetRenderLogicalPresentation(pg_renderer, &w, &h, &mode); + SDL_SetWindowSize(win, (w > wnew) ? w : wnew, (h > hnew) ? h : hnew); + result = SDL_SetRenderLogicalPresentation(pg_renderer, w, h, mode); +#else SDL_RenderGetLogicalSize(pg_renderer, &w, &h); SDL_SetWindowSize(win, (w > wnew) ? w : wnew, (h > hnew) ? h : hnew); result = SDL_RenderSetLogicalSize(pg_renderer, w, h); +#endif if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } From caafa9be49ee12957824ca1d0b3f5080cfa11d72 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 21:27:18 +0530 Subject: [PATCH 367/441] sdl3(display): syswm porting --- src_c/display.c | 204 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 192 insertions(+), 12 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 1ad5663751..7cbe8d85fc 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -31,7 +31,9 @@ #include "doc/display_doc.h" +#ifndef PG_SDL3 #include +#endif static PyTypeObject pgVidInfo_Type; @@ -499,12 +501,14 @@ pg_get_wm_info(PyObject *self, PyObject *_null) { PyObject *dict; PyObject *tmp; - SDL_SysWMinfo info; SDL_Window *win; VIDEO_INIT_CHECK(); +#if !SDL_VERSION_ATLEAST(3, 0, 0) + SDL_SysWMinfo info; SDL_VERSION(&(info.version)) +#endif dict = PyDict_New(); if (!dict) { return NULL; @@ -514,12 +518,32 @@ pg_get_wm_info(PyObject *self, PyObject *_null) if (!win) { return dict; } +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (!SDL_GetWindowWMInfo(win, &info)) { return dict; } +#endif (void)tmp; #if defined(SDL_VIDEO_DRIVER_WINDOWS) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyLong_FromLongLong((long long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_WIN32_HWND_POINTER, + NULL)); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLongLong((long long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_WIN32_HDC_POINTER, + NULL)); + PyDict_SetItemString(dict, "hdc", tmp); + Py_DECREF(tmp); + tmp = PyLong_FromLongLong((long long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER, + NULL)); + PyDict_SetItemString(dict, "hinstance", tmp); + Py_DECREF(tmp); +#else tmp = PyLong_FromLongLong((long long)info.info.win.window); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); @@ -531,12 +555,26 @@ pg_get_wm_info(PyObject *self, PyObject *_null) PyDict_SetItemString(dict, "hinstance", tmp); Py_DECREF(tmp); #endif -#if defined(SDL_VIDEO_DRIVER_WINRT) +#endif +#if defined(SDL_VIDEO_DRIVER_WINRT) && !SDL_VERSION_ATLEAST(3, 0, 0) tmp = PyCapsule_New(info.info.winrt.window, "window", NULL); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); #endif #if defined(SDL_VIDEO_DRIVER_X11) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyLong_FromLong(SDL_GetNumberProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0)); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); + + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_X11_DISPLAY_POINTER, NULL), + "display", NULL); + PyDict_SetItemString(dict, "display", tmp); + Py_DECREF(tmp); +#else tmp = PyLong_FromLong(info.info.x11.window); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); @@ -545,7 +583,8 @@ pg_get_wm_info(PyObject *self, PyObject *_null) PyDict_SetItemString(dict, "display", tmp); Py_DECREF(tmp); #endif -#if defined(SDL_VIDEO_DRIVER_DIRECTFB) +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) && !SDL_VERSION_ATLEAST(3, 0, 0) tmp = PyCapsule_New(info.info.dfb.dfb, "dfb", NULL); PyDict_SetItemString(dict, "dfb", tmp); Py_DECREF(tmp); @@ -559,11 +598,46 @@ pg_get_wm_info(PyObject *self, PyObject *_null) Py_DECREF(tmp); #endif #if defined(SDL_VIDEO_DRIVER_COCOA) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, NULL), + "window", NULL); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); +#else tmp = PyCapsule_New(info.info.cocoa.window, "window", NULL); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); #endif +#endif #if defined(SDL_VIDEO_DRIVER_UIKIT) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER, NULL), + "window", NULL); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLong(SDL_GetPointerNumber( + SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER, 0)); + PyDict_SetItemString(dict, "framebuffer", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLong(SDL_GetPointerNumber( + SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER, 0)); + PyDict_SetItemString(dict, "colorbuffer", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLong(SDL_GetPointerNumber( + SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER, 0)); + PyDict_SetItemString(dict, "resolveFramebuffer", tmp); + Py_DECREF(tmp); +#else tmp = PyCapsule_New(info.info.uikit.window, "window", NULL); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); @@ -580,7 +654,23 @@ pg_get_wm_info(PyObject *self, PyObject *_null) PyDict_SetItemString(dict, "resolveFramebuffer", tmp); Py_DECREF(tmp); #endif +#endif #if defined(SDL_VIDEO_DRIVER_WAYLAND) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, NULL), + "display", NULL); + PyDict_SetItemString(dict, "display", tmp); + Py_DECREF(tmp); + + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, NULL), + "surface", NULL); + PyDict_SetItemString(dict, "surface", tmp); + Py_DECREF(tmp); +#else tmp = PyCapsule_New(info.info.wl.display, "display", NULL); PyDict_SetItemString(dict, "display", tmp); Py_DECREF(tmp); @@ -593,7 +683,22 @@ pg_get_wm_info(PyObject *self, PyObject *_null) PyDict_SetItemString(dict, "shell_surface", tmp); Py_DECREF(tmp); #endif +#endif #if defined(SDL_VIDEO_DRIVER_ANDROID) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyCapsule_New( + SDL_GetPointerProperty(SDL_GetWindowProperties(win), + SDL_PROP_WINDOW_ANDROID_WINDOW_POINTER, NULL), + "window", NULL); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLong((long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_ANDROID_SURFACE_POINTER, + NULL)); + PyDict_SetItemString(dict, "surface", tmp); + Py_DECREF(tmp); +#else tmp = PyCapsule_New(info.info.android.window, "window", NULL); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); @@ -602,7 +707,21 @@ pg_get_wm_info(PyObject *self, PyObject *_null) PyDict_SetItemString(dict, "surface", tmp); Py_DECREF(tmp); #endif +#endif #if defined(SDL_VIDEO_DRIVER_VIVANTE) +#if SDL_VERSION_ATLEAST(3, 0, 0) + tmp = PyLong_FromLong((long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER, + NULL)); + PyDict_SetItemString(dict, "display", tmp); + Py_DECREF(tmp); + + tmp = PyLong_FromLong((long)SDL_GetPointerProperty( + SDL_GetWindowProperties(win), SDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER, + NULL)); + PyDict_SetItemString(dict, "window", tmp); + Py_DECREF(tmp); +#else tmp = PyLong_FromLong((long)info.info.vivante.display); PyDict_SetItemString(dict, "display", tmp); Py_DECREF(tmp); @@ -610,6 +729,7 @@ pg_get_wm_info(PyObject *self, PyObject *_null) tmp = PyLong_FromLong((long)info.info.vivante.window); PyDict_SetItemString(dict, "window", tmp); Py_DECREF(tmp); +#endif #endif return dict; @@ -980,9 +1100,6 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) int display = _get_display(win); char *title = state->title; const char *scale_env, *winid_env; - SDL_SysWMinfo wm_info; - - SDL_VERSION(&wm_info.version); char *keywords[] = {"size", "flags", "depth", "display", "vsync", NULL}; @@ -2729,6 +2846,63 @@ pg_desktop_refresh_rates(PyObject *self, PyObject *_null) return result; } +#if SDL_VERSION_ATLEAST(3, 0, 0) +typedef enum { + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, + SDL_SYSWM_X11, + SDL_SYSWM_DIRECTFB, + SDL_SYSWM_COCOA, + SDL_SYSWM_UIKIT, + SDL_SYSWM_WAYLAND, + SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. */ + SDL_SYSWM_WINRT, + SDL_SYSWM_ANDROID, + SDL_SYSWM_VIVANTE, + SDL_SYSWM_OS2, + SDL_SYSWM_HAIKU, + SDL_SYSWM_KMSDRM, + SDL_SYSWM_RISCOS +} SDL_SYSWM_TYPE; + +static SDL_SYSWM_TYPE +get_syswm_type() +{ + const char *driver = SDL_GetCurrentVideoDriver(); + if (!driver) { + return SDL_SYSWM_UNKNOWN; + } + + if (strcmp(driver, "android") == 0) { + return SDL_SYSWM_ANDROID; + } + else if (strcmp(driver, "cocoa") == 0) { + return SDL_SYSWM_COCOA; + } + else if (strcmp(driver, "kmsdrm") == 0) { + return SDL_SYSWM_KMSDRM; + } + else if (strcmp(driver, "uikit") == 0) { + return SDL_SYSWM_UIKIT; + } + else if (strcmp(driver, "vivante") == 0) { + return SDL_SYSWM_VIVANTE; + } + else if (strcmp(driver, "wayland") == 0) { + return SDL_SYSWM_WAYLAND; + } + else if (strcmp(driver, "windows") == 0) { + return SDL_SYSWM_WINDOWS; + } + else if (strcmp(driver, "x11") == 0) { + return SDL_SYSWM_X11; + } + else { + return SDL_SYSWM_UNKNOWN; + } +} +#endif + static PyObject * pg_toggle_fullscreen(PyObject *self, PyObject *_null) { @@ -2738,7 +2912,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) pgSurfaceObject *display_surface; _DisplayState *state = DISPLAY_MOD_STATE(self); GL_glViewport_Func p_glViewport = NULL; - SDL_SysWMinfo wm_info; + SDL_SYSWM_TYPE subsystem; int is_renderer_software = 0; VIDEO_INIT_CHECK(); @@ -2748,10 +2922,16 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) flags = SDL_GetWindowFlags(win); +#if SDL_VERSION_ATLEAST(3, 0, 0) + subsystem = get_syswm_type(); +#else + SDL_SysWMinfo wm_info; SDL_VERSION(&wm_info.version); if (!SDL_GetWindowWMInfo(win, &wm_info)) { return RAISE(pgExc_SDLError, SDL_GetError()); } + subsystem = wm_info.subsystem; +#endif if (state->using_gl && pg_renderer != NULL) { return RAISE(pgExc_SDLError, @@ -2774,7 +2954,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) #endif } - switch (wm_info.subsystem) { + switch (subsystem) { // if we get this to work correctly with more systems, move them here case SDL_SYSWM_WINDOWS: case SDL_SYSWM_X11: @@ -2876,7 +3056,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } SDL_SetWindowSize(win, w * scale, h * scale); - if (is_renderer_software && wm_info.subsystem == SDL_SYSWM_X11) { + if (is_renderer_software && subsystem == SDL_SYSWM_X11) { /* display surface lost? */ SDL_DestroyTexture(pg_texture); SDL_DestroyRenderer(pg_renderer); @@ -2950,7 +3130,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } display_surface->surf = SDL_GetWindowSurface(win); } - else if (wm_info.subsystem == SDL_SYSWM_X11) { + else if (subsystem == SDL_SYSWM_X11) { /* This is a HACK, specifically to work around faulty behaviour of * SDL_SetWindowFullscreen on X11 when switching out of fullscreen * would change the physical resolution of the display back to the @@ -3025,7 +3205,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } - if (is_renderer_software && wm_info.subsystem == SDL_SYSWM_X11) { + if (is_renderer_software && subsystem == SDL_SYSWM_X11) { if (PyErr_WarnEx( PyExc_Warning, "recreating software renderer in toggle_fullscreen", @@ -3089,7 +3269,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } display_surface->surf = SDL_GetWindowSurface(win); } - else if (wm_info.subsystem == SDL_SYSWM_WAYLAND) { + else if (subsystem == SDL_SYSWM_WAYLAND) { /* This only happens AFTER other options have been exhausted. * with GL, Renderer, or the correct window size, toggling works. * Only entering a hard fullscreen state is unsupported. */ From c5d239bb3f6dd4f696f42151293ddd517113d0f4 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 22:50:28 +0530 Subject: [PATCH 368/441] sdl3(display): handle window API changes --- src_c/display.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++-- src_c/window.c | 4 ++ 2 files changed, 168 insertions(+), 7 deletions(-) diff --git a/src_c/display.c b/src_c/display.c index 7cbe8d85fc..28d7c9d838 100644 --- a/src_c/display.c +++ b/src_c/display.c @@ -279,9 +279,15 @@ pg_get_init(PyObject *self, PyObject *_null) static PyObject * pg_get_active(PyObject *self, PyObject *_null) { - Uint32 flags = SDL_GetWindowFlags(pg_GetDefaultWindow()); + SDL_WindowFlags flags = SDL_GetWindowFlags(pg_GetDefaultWindow()); + +#if SDL_VERSION_ATLEAST(3, 0, 0) + return PyBool_FromLong(!(flags & SDL_WINDOW_HIDDEN) && + !(flags & SDL_WINDOW_MINIMIZED)); +#else return PyBool_FromLong((flags & SDL_WINDOW_SHOWN) && !(flags & SDL_WINDOW_MINIMIZED)); +#endif } /* vidinfo object */ @@ -1077,6 +1083,82 @@ _get_display(SDL_Window *win) return display; } +/* Based on code from sdl2-compat */ +static SDL_Window * +PG_CreateWindowCompat(const char *title, int x, int y, int w, int h, + SDL_WindowFlags flags) +{ +#if SDL_VERSION_ATLEAST(3, 0, 0) + SDL_Window *window = NULL; + + SDL_PropertiesID props = SDL_CreateProperties(); + if (!props) { + return NULL; + } + + if (title && *title) { + SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, + title); + } + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X_NUMBER, x); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, y); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, w); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, h); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_FLAGS_NUMBER, flags); + SDL_SetBooleanProperty( + props, SDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN, + SDL_GetHintBoolean("SDL_VIDEO_EXTERNAL_CONTEXT", false)); + + window = SDL_CreateWindowWithProperties(props); + SDL_DestroyProperties(props); + return window; +#else + return SDL_CreateWindow(title, x, y, w, h, flags); +#endif +} + +#if SDL_VERSION_ATLEAST(3, 0, 0) +/* Returns 0 on success, negative on failure. */ +static int +PG_SetWindowFullscreen(SDL_Window *window, bool fullscreen, + bool non_desktop_fullscreen) +{ + int ret = -1; + SDL_DisplayMode **modes = NULL; + SDL_DisplayMode *chosen_mode = NULL; + if (!SDL_SetWindowFullscreen(window, fullscreen)) { + goto end; + } + if (fullscreen) { + if (non_desktop_fullscreen) { + /* if not desktop fullscreen, get the first display mode available + */ + SDL_DisplayID disp = SDL_GetDisplayForWindow(window); + if (!disp) { + goto end; + } + modes = SDL_GetFullscreenDisplayModes(disp, NULL); + if (!modes) { + goto end; + } + chosen_mode = modes[0]; + if (!chosen_mode) { + SDL_SetError("Could not get fullscreen display mode"); + goto end; + } + } + if (!SDL_SetWindowFullscreenMode(window, chosen_mode)) { + goto end; + } + } + + ret = 0; +end: + SDL_free(modes); + return ret; +} +#endif + static PyObject * pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) { @@ -1100,6 +1182,9 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) int display = _get_display(win); char *title = state->title; const char *scale_env, *winid_env; +#if SDL_VERSION_ATLEAST(3, 0, 0) + int non_desktop_fullscreen = 0; +#endif char *keywords[] = {"size", "flags", "depth", "display", "vsync", NULL}; @@ -1221,12 +1306,22 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (flags & PGS_FULLSCREEN) { if (flags & PGS_SCALED) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + sdl_flags |= SDL_WINDOW_FULLSCREEN; + non_desktop_fullscreen = 1; +#else sdl_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; +#endif } else if (w == display_mode->w && h == display_mode->h) { /* No need to change physical resolution. Borderless fullscreen is preferred when possible */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + sdl_flags |= SDL_WINDOW_FULLSCREEN; + non_desktop_fullscreen = 1; +#else sdl_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; +#endif } else { sdl_flags |= SDL_WINDOW_FULLSCREEN; @@ -1252,15 +1347,19 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) SDL_AddEventWatch(pg_ResizeEventWatch, self); } } +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (flags & PGS_SHOWN) { sdl_flags |= SDL_WINDOW_SHOWN; } +#endif if (flags & PGS_HIDDEN) { sdl_flags |= SDL_WINDOW_HIDDEN; } +#if !SDL_VERSION_ATLEAST(3, 0, 0) if (!(sdl_flags & SDL_WINDOW_HIDDEN)) { sdl_flags |= SDL_WINDOW_SHOWN; } +#endif if (flags & PGS_OPENGL) { /* Must be called before creating context */ if (flags & PGS_DOUBLEBUF) { @@ -1289,9 +1388,14 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (win) { if (SDL_GetWindowDisplayIndex(win) == display) { // fullscreen windows don't hold window x and y as needed + +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_GetWindowFlags(win) & SDL_WINDOW_FULLSCREEN) { +#else if (SDL_GetWindowFlags(win) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)) { +#endif x = state->fullscreen_backup_x; y = state->fullscreen_backup_y; @@ -1380,8 +1484,12 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) // SDL doesn't preserve window position in fullscreen mode // However, windows coming out of fullscreen need these to go back // into the correct position +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (sdl_flags & SDL_WINDOW_FULLSCREEN) { +#else if (sdl_flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)) { +#endif state->fullscreen_backup_x = x; state->fullscreen_backup_y = y; } @@ -1389,10 +1497,14 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) if (!win) { /*open window*/ if (hwnd != 0) { +/* TODO: figure SDL3 equivalent */ +#if !SDL_VERSION_ATLEAST(3, 0, 0) win = SDL_CreateWindowFrom((void *)hwnd); +#endif } else { - win = SDL_CreateWindow(title, x, y, w_1, h_1, sdl_flags); + win = PG_CreateWindowCompat(title, x, y, w_1, h_1, + sdl_flags); w_actual = w_1; h_actual = h_1; } @@ -1417,12 +1529,20 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) * resize/bordered/hidden changes due to SDL ignoring those * changes if the window is fullscreen * See https://github.com/pygame/pygame/issues/2711 */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (0 != PG_SetWindowFullscreen( + win, sdl_flags & SDL_WINDOW_FULLSCREEN, + non_desktop_fullscreen)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } +#else if (0 != SDL_SetWindowFullscreen( win, sdl_flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP))) { return RAISE(pgExc_SDLError, SDL_GetError()); } +#endif SDL_SetWindowResizable(win, flags & PGS_RESIZABLE); SDL_SetWindowBordered(win, (flags & PGS_NOFRAME) == 0); @@ -1713,7 +1833,11 @@ pg_set_mode(PyObject *self, PyObject *arg, PyObject *kwds) !vsync && (((flags & PGS_RESIZABLE) == 0) || !zero_size)) { if (((surface->surf->w != w_actual) || (surface->surf->h != h_actual)) && +#if SDL_VERSION_ATLEAST(3, 0, 0) + ((surface->surf->flags & SDL_WINDOW_FULLSCREEN) != 0)) { +#else ((surface->surf->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0)) { +#endif char buffer[150]; char *format_string = "Requested window was forcibly resized by the OS.\n\t" @@ -2675,14 +2799,18 @@ static PyObject * pg_is_fullscreen(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); - int flags; + SDL_WindowFlags flags; VIDEO_INIT_CHECK(); if (!win) { return RAISE(pgExc_SDLError, "No open window"); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + flags = SDL_GetWindowFlags(win); +#else flags = SDL_GetWindowFlags(win) & SDL_WINDOW_FULLSCREEN_DESKTOP; +#endif if (flags & SDL_WINDOW_FULLSCREEN) { Py_RETURN_TRUE; @@ -2907,7 +3035,8 @@ static PyObject * pg_toggle_fullscreen(PyObject *self, PyObject *_null) { SDL_Window *win = pg_GetDefaultWindow(); - int result, flags; + int result; + SDL_WindowFlags flags; int window_w, window_h, w, h, window_display, x, y; pgSurfaceObject *display_surface; _DisplayState *state = DISPLAY_MOD_STATE(self); @@ -3122,8 +3251,12 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } } } +#if SDL_VERSION_ATLEAST(3, 0, 0) + else if ((flags & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN) { +#else else if ((flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { +#endif result = SDL_SetWindowFullscreen(win, 0); if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); @@ -3144,9 +3277,13 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) 1) != 0) { return NULL; } +#if SDL_VERSION_ATLEAST(3, 0, 0) + flags &= ~SDL_WINDOW_FULLSCREEN; +#else flags &= ~SDL_WINDOW_FULLSCREEN_DESKTOP; +#endif /* SDL_WINDOW_FULLSCREEN_DESKTOP includes SDL_WINDOW_FULLSCREEN */ - win = SDL_CreateWindow(state->title, wx, wy, w, h, flags); + win = PG_CreateWindowCompat(state->title, wx, wy, w, h, flags); if (win == NULL) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3193,15 +3330,23 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) state->fullscreen_backup_y = y; if (state->unscaled_render) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = PG_SetWindowFullscreen(win, 1, 0); +#else result = SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } } else if (pg_renderer != NULL) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = PG_SetWindowFullscreen(win, 1, 0); +#else result = SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3235,8 +3380,12 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) #endif } else if (state->using_gl) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = PG_SetWindowFullscreen(win, 1, 0); +#else result = SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3262,8 +3411,12 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) } } else if (w == display_mode->w && h == display_mode->h) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = PG_SetWindowFullscreen(win, 1, 0); +#else result = SDL_SetWindowFullscreen(win, SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (result != 0) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3290,7 +3443,7 @@ pg_toggle_fullscreen(PyObject *self, PyObject *_null) h != display_surface->surf->h) { int wx = SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display); int wy = SDL_WINDOWPOS_UNDEFINED_DISPLAY(window_display); - win = SDL_CreateWindow(state->title, wx, wy, w, h, flags); + win = PG_CreateWindowCompat(state->title, wx, wy, w, h, flags); if (win == NULL) { return RAISE(pgExc_SDLError, SDL_GetError()); } @@ -3323,7 +3476,7 @@ pg_display_resize_event(PyObject *self, PyObject *event) int wnew = PyLong_AsLong(PyObject_GetAttrString(event, "w")); int hnew = PyLong_AsLong(PyObject_GetAttrString(event, "h")); SDL_Window *win = pg_GetDefaultWindow(); - int flags; + SDL_WindowFlags flags; int w, h, result; _DisplayState *state = DISPLAY_MOD_STATE(self); GL_glViewport_Func p_glViewport = NULL; @@ -3332,10 +3485,14 @@ pg_display_resize_event(PyObject *self, PyObject *event) if (!win) { return RAISE(pgExc_SDLError, "No open window"); } +#if SDL_VERSION_ATLEAST(3, 0, 0) + flags = SDL_GetWindowFlags(win) & SDL_WINDOW_FULLSCREEN; +#else flags = SDL_GetWindowFlags(win) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP); +#endif if (flags) { return PyLong_FromLong(-1); } diff --git a/src_c/window.c b/src_c/window.c index 594c0321d2..702c47c375 100644 --- a/src_c/window.c +++ b/src_c/window.c @@ -331,6 +331,10 @@ pg_window_set_fullscreen(SDL_Window *window, int desktop) goto end; } } + + if (!SDL_SetWindowFullscreen(window, 1)) { + goto end; + } if (!SDL_SetWindowFullscreenMode(window, chosen_mode)) { goto end; } From e495f2cecb2af7248bd3f64e8b1bd5cf34fda557 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 18 May 2025 23:21:37 +0530 Subject: [PATCH 369/441] sdl3(display): start compiling --- src_c/meson.build | 3 --- 1 file changed, 3 deletions(-) diff --git a/src_c/meson.build b/src_c/meson.build index 6eae222633..a8f1bb39fc 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -27,8 +27,6 @@ constants = py.extension_module( subdir: pg, ) -# TODO: support SDL3 -if sdl_api != 3 display = py.extension_module( 'display', 'display.c', @@ -37,7 +35,6 @@ display = py.extension_module( install: true, subdir: pg, ) -endif event = py.extension_module( 'event', From c6e81a0effaa699ff5799bb471f17beb5e205322 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Sun, 3 Aug 2025 11:21:30 -0500 Subject: [PATCH 370/441] Base header (#3486) * Split off declarations of base module to header and exposed everything externally for potential unit tests * Split off base declarations to base.h, and remove static linkage for future unit test purposes * Should fix WASM build * Test a static.c change * WASM compatibility, courtesy of pmp-p Co-authored-by: pmp-p * re-include base.h for declarations to exist * Moved static.c to base.c * Removed (probably) unnecessary declaration of pgExc_SDLError * for meson build test * wasm meson build test ( no _sdl2 ) * ok no _sdl2 * fence _sdl2, in for non-meson * _sdl2 ok * Fix volatile linkage for c_api * Fix Emscripten build * WASM fixes * remove unnecessary preprocessing in mixer module definition --------- Co-authored-by: pmp-p --- buildconfig/Setup.Emscripten.SDL2.in | 9 +- src_c/base.c | 966 +++++++++++++++++---------- src_c/base.h | 357 ++++++++++ src_c/include/_pygame.h | 1 + src_c/mixer.c | 5 - src_c/static.c | 509 -------------- src_c/surface.h | 4 +- src_py/__init__.py | 12 +- 8 files changed, 978 insertions(+), 885 deletions(-) create mode 100644 src_c/base.h delete mode 100644 src_c/static.c diff --git a/buildconfig/Setup.Emscripten.SDL2.in b/buildconfig/Setup.Emscripten.SDL2.in index 9c465102f1..e03f2e133e 100644 --- a/buildconfig/Setup.Emscripten.SDL2.in +++ b/buildconfig/Setup.Emscripten.SDL2.in @@ -25,24 +25,22 @@ _sdl2.video = src_c/void.c _sdl2.mixer src_c/_sdl2/mixer.c $(SDL) $(MIXER) $(DEBUG) -Isrc_c -constants src_c/constants.c $(SDL) $(DEBUG) mask src_c/bitmask.c -math src_c/math.c $(SDL) $(DEBUG) #GFX = src_c/SDL_gfx/SDL_gfxBlitFunc.c src_c/SDL_gfx/SDL_gfxPrimitives.c GFX = src_c/SDL_gfx/SDL_gfxPrimitives.c -static src_c/static.c $(SDL) $(FREETYPE) $(FONT) $(MIXER) $(IMAGE) $(PNG) $(JPEG) $(DEBUG) +static src_c/base.c $(SDL) $(FREETYPE) $(FONT) $(MIXER) $(IMAGE) $(PNG) $(JPEG) $(DEBUG) -# these should not be altered they already are in static.c merging file above +# these should not be altered they already are in base.c merging file above time src_c/void.c _freetype src_c/void.c imageext src_c/void.c image src_c/void.c -base src_c/void.c bufferproxy src_c/void.c color src_c/void.c +constants src_c/void.c controller src_c/void.c controller_old src_c/void.c display src_c/void.c @@ -53,6 +51,7 @@ gfxdraw src_c/void.c joystick src_c/void.c key src_c/void.c newbuffer src_c/void.c +math src_c/void.c mixer_music src_c/void.c mixer src_c/void.c mouse src_c/void.c diff --git a/src_c/base.c b/src_c/base.c index 4d3ac2a906..c4f7597a4f 100644 --- a/src_c/base.c +++ b/src_c/base.c @@ -19,61 +19,25 @@ Pete Shinners pete@shinners.org */ -#define NO_PYGAME_C_API -#define PYGAMEAPI_BASE_INTERNAL - -#include "pygame.h" - -#include -#include "doc/pygame_doc.h" -#include "pgarrinter.h" -#include "pgcompat.h" -/* This file controls all the initialization of - * the module and the various SDL subsystems - */ - -/*platform specific init stuff*/ - -#ifdef MS_WIN32 /*python gives us MS_WIN32*/ -#define WIN32_LEAN_AND_MEAN -#define VC_EXTRALEAN -#include -extern int -SDL_RegisterApp(const char *, Uint32, void *); -#endif - -#if defined(macintosh) -#if (!defined(__MWERKS__) && !TARGET_API_MAC_CARBON) -QDGlobals pg_qd; -#endif -#endif - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define PAI_MY_ENDIAN '<' -#define PAI_OTHER_ENDIAN '>' -#define BUF_OTHER_ENDIAN '>' -#else -#define PAI_MY_ENDIAN '>' -#define PAI_OTHER_ENDIAN '<' -#define BUF_OTHER_ENDIAN '<' +#if defined(BUILD_STATIC) +#define PYGAMEAPI_RECT_INTERNAL +#define PYGAMEAPI_EVENT_INTERNAL +#define PYGAMEAPI_JOYSTICK_INTERNAL +#define PYGAMEAPI_BASE_INTERNAL +#define PYGAMEAPI_SURFACE_INTERNAL +#define PYGAMEAPI_BUFFERPROXY_INTERNAL +#define PYGAMEAPI_WINDOW_INTERNAL +#define PYGAMEAPI_RENDER_INTERNAL #endif -#define BUF_MY_ENDIAN '=' -/* Extended array struct */ -typedef struct pg_capsule_interface_s { - PyArrayInterface inter; - Py_intptr_t imem[1]; -} pgCapsuleInterface; +#include "base.h" -/* Py_buffer internal data for an array interface/struct */ -typedef struct pg_view_internals_s { - char format[4]; /* make 4 byte word sized */ - Py_ssize_t imem[1]; -} pgViewInternals; +PG_PixelFormatEnum pg_default_convert_format = 0; /* Custom exceptions */ -static PyObject *pgExc_BufferError = NULL; +PyObject *pgExc_BufferError = NULL; +PyObject *pgExc_SDLError = NULL; /* Only one instance of the state per process. */ static PyObject *pg_quit_functions = NULL; @@ -83,101 +47,8 @@ SDL_Window *pg_default_window = NULL; pgSurfaceObject *pg_default_screen = NULL; static int pg_env_blend_alpha_SDL2 = 0; -static void -pg_install_parachute(void); -static void -pg_uninstall_parachute(void); -static void -pg_atexit_quit(void); -static int -pgGetArrayStruct(PyObject *, PyObject **, PyArrayInterface **); -static PyObject * -pgArrayStruct_AsDict(PyArrayInterface *); -static PyObject * -pgBuffer_AsArrayInterface(Py_buffer *); -static PyObject * -pgBuffer_AsArrayStruct(Py_buffer *); -static int -_pg_buffer_is_byteswapped(Py_buffer *); -static void -pgBuffer_Release(pg_buffer *); -static int -pgObject_GetBuffer(PyObject *, pg_buffer *, int); -static inline PyObject * -pgObject_getRectHelper(PyObject *, PyObject *const *, Py_ssize_t, PyObject *, - char *); -static int -pgGetArrayInterface(PyObject **, PyObject *); -static int -pgArrayStruct_AsBuffer(pg_buffer *, PyObject *, PyArrayInterface *, int); -static int -_pg_arraystruct_as_buffer(Py_buffer *, PyObject *, PyArrayInterface *, int); -static int -_pg_arraystruct_to_format(char *, PyArrayInterface *, int); -static int -pgDict_AsBuffer(pg_buffer *, PyObject *, int); -static int -_pg_shape_check(PyObject *); -static int -_pg_typestr_check(PyObject *); -static int -_pg_strides_check(PyObject *); -static int -_pg_data_check(PyObject *); -static int -_pg_is_int_tuple(PyObject *); -static int -_pg_values_as_buffer(Py_buffer *, int, PyObject *, PyObject *, PyObject *, - PyObject *); -static int -_pg_int_tuple_as_ssize_arr(PyObject *, Py_ssize_t *); -static int -_pg_typestr_as_format(PyObject *, char *, Py_ssize_t *); -static PyObject * -pg_view_get_typestr_obj(Py_buffer *); -static PyObject * -pg_view_get_shape_obj(Py_buffer *); -static PyObject * -pg_view_get_strides_obj(Py_buffer *); -static PyObject * -pg_view_get_data_obj(Py_buffer *); -static char -_pg_as_arrayinter_typekind(Py_buffer *); -static char -_pg_as_arrayinter_byteorder(Py_buffer *); -static int -_pg_as_arrayinter_flags(Py_buffer *); -static pgCapsuleInterface * -_pg_new_capsuleinterface(Py_buffer *); -static void -_pg_capsule_PyMem_Free(PyObject *); -static PyObject * -_pg_shape_as_tuple(PyArrayInterface *); -static PyObject * -_pg_typekind_as_str(PyArrayInterface *); -static PyObject * -_pg_strides_as_tuple(PyArrayInterface *); -static PyObject * -_pg_data_as_tuple(PyArrayInterface *); -static PyObject * -pg_get_array_interface(PyObject *, PyObject *); -static void -_pg_release_buffer_array(Py_buffer *); -static void -_pg_release_buffer_generic(Py_buffer *); -static SDL_Window * -pg_GetDefaultWindow(void); -static void -pg_SetDefaultWindow(SDL_Window *); -static pgSurfaceObject * -pg_GetDefaultWindowSurface(void); -static void -pg_SetDefaultWindowSurface(pgSurfaceObject *); -static int -pg_EnvShouldBlendAlphaSDL2(void); - /* compare compiled to linked, raise python error on incompatibility */ -static int +int pg_CheckSDLVersions(void) { #if SDL_VERSION_ATLEAST(3, 0, 0) @@ -246,7 +117,7 @@ pg_RegisterQuit(void (*func)(void)) } } -static PyObject * +PyObject * pg_register_quit(PyObject *self, PyObject *value) { if (!pg_quit_functions) { @@ -263,7 +134,7 @@ pg_register_quit(PyObject *self, PyObject *value) } /* init pygame modules, returns 1 if successful, 0 if fail, with PyErr set*/ -static int +int pg_mod_autoinit(const char *modname) { PyObject *module, *funcobj, *temp; @@ -296,7 +167,7 @@ pg_mod_autoinit(const char *modname) } /* try to quit pygame modules, errors silenced */ -static void +void pg_mod_autoquit(const char *modname) { PyObject *module, *funcobj, *temp; @@ -333,7 +204,7 @@ pg_mod_autoquit(const char *modname) Py_XDECREF(funcobj); } -static PyObject * +PyObject * pg_init(PyObject *self, PyObject *_null) { int i = 0, success = 0, fail = 0; @@ -374,7 +245,7 @@ pg_init(PyObject *self, PyObject *_null) return pg_tuple_couple_from_values_int(success, fail); } -static void +void pg_atexit_quit(void) { /* Maybe it is safe to call SDL_quit more than once after an SDL_Init, @@ -387,7 +258,7 @@ pg_atexit_quit(void) } } -static PyObject * +PyObject * pg_get_sdl_version(PyObject *self, PyObject *args, PyObject *kwargs) { int linked = 1; /* Default is linked version. */ @@ -417,13 +288,13 @@ pg_get_sdl_version(PyObject *self, PyObject *args, PyObject *kwargs) PG_FIND_VNUM_MICRO(version)); } -static PyObject * +PyObject * pg_get_sdl_byteorder(PyObject *self, PyObject *_null) { return PyLong_FromLong(SDL_BYTEORDER); } -static void +void _pg_quit(void) { Py_ssize_t num, i; @@ -491,21 +362,21 @@ _pg_quit(void) Py_END_ALLOW_THREADS; } -static PyObject * +PyObject * pg_quit(PyObject *self, PyObject *_null) { _pg_quit(); Py_RETURN_NONE; } -static PyObject * +PyObject * pg_base_get_init(PyObject *self, PyObject *_null) { return PyBool_FromLong(pg_is_init); } /* internal C API utility functions */ -static int +int pg_IntFromObj(PyObject *obj, int *val) { if (PyFloat_Check(obj)) { @@ -524,7 +395,7 @@ pg_IntFromObj(PyObject *obj, int *val) return 1; } -static int +int pg_IntFromObjIndex(PyObject *obj, int _index, int *val) { int result = 0; @@ -539,7 +410,7 @@ pg_IntFromObjIndex(PyObject *obj, int _index, int *val) return result; } -static int +int pg_TwoIntsFromObj(PyObject *obj, int *val1, int *val2) { // First, lets check the size. This returns -1 if invalid and may set an @@ -602,7 +473,7 @@ pg_TwoIntsFromObj(PyObject *obj, int *val1, int *val2) return 1; } -static int +int pg_FloatFromObj(PyObject *obj, float *val) { if (PyFloat_Check(obj)) { @@ -618,7 +489,7 @@ pg_FloatFromObj(PyObject *obj, float *val) return 1; } -static int +int pg_FloatFromObjIndex(PyObject *obj, int _index, float *val) { int result = 0; @@ -633,7 +504,7 @@ pg_FloatFromObjIndex(PyObject *obj, int _index, float *val) return result; } -static int +int pg_TwoFloatsFromObj(PyObject *obj, float *val1, float *val2) { // First, lets check the size. This returns -1 if invalid and may set an @@ -696,106 +567,7 @@ pg_TwoFloatsFromObj(PyObject *obj, float *val1, float *val2) return 1; } -static inline int -pg_DoubleFromObj(PyObject *obj, double *val) -{ - if (PyFloat_Check(obj)) { - *val = PyFloat_AS_DOUBLE(obj); - return 1; - } - - *val = (double)PyLong_AsLong(obj); - if (PyErr_Occurred()) { - PyErr_Clear(); - return 0; - } - - return 1; -} - -/*Assumes obj is a Sequence, internal or conscious use only*/ -static inline int -_pg_DoubleFromObjIndex(PyObject *obj, int index, double *val) -{ - int result = 0; - - PyObject *item = PySequence_ITEM(obj, index); - if (!item) { - PyErr_Clear(); - return 0; - } - result = pg_DoubleFromObj(item, val); - Py_DECREF(item); - - return result; -} - -static inline int -pg_TwoDoublesFromObj(PyObject *obj, double *val1, double *val2) -{ - Py_ssize_t length; - /*Faster path for tuples and lists*/ - if (pgSequenceFast_Check(obj)) { - length = PySequence_Fast_GET_SIZE(obj); - PyObject **f_arr = PySequence_Fast_ITEMS(obj); - if (length == 2) { - if (!pg_DoubleFromObj(f_arr[0], val1) || - !pg_DoubleFromObj(f_arr[1], val2)) { - return 0; - } - } - else if (length == 1) { - /* Handle case of ((x, y), ) 'nested sequence' */ - return pg_TwoDoublesFromObj(f_arr[0], val1, val2); - } - else { - return 0; - } - } - else if (PySequence_Check(obj)) { - length = PySequence_Length(obj); - if (length == 2) { - if (!_pg_DoubleFromObjIndex(obj, 0, val1)) { - return 0; - } - if (!_pg_DoubleFromObjIndex(obj, 1, val2)) { - return 0; - } - } - else if (length == 1 && !PyUnicode_Check(obj)) { - /* Handle case of ((x, y), ) 'nested sequence' */ - PyObject *tmp = PySequence_ITEM(obj, 0); - int ret = pg_TwoDoublesFromObj(tmp, val1, val2); - Py_DECREF(tmp); - return ret; - } - else { - PyErr_Clear(); - return 0; - } - } - else { - return 0; - } - - return 1; -} - -static inline int -pg_TwoDoublesFromFastcallArgs(PyObject *const *args, Py_ssize_t nargs, - double *val1, double *val2) -{ - if (nargs == 1 && pg_TwoDoublesFromObj(args[0], val1, val2)) { - return 1; - } - else if (nargs == 2 && pg_DoubleFromObj(args[0], val1) && - pg_DoubleFromObj(args[1], val2)) { - return 1; - } - return 0; -} - -static int +int pg_UintFromObj(PyObject *obj, Uint32 *val) { if (PyNumber_Check(obj)) { @@ -816,7 +588,7 @@ pg_UintFromObj(PyObject *obj, Uint32 *val) return 0; } -static int +int pg_UintFromObjIndex(PyObject *obj, int _index, Uint32 *val) { int result = 0; @@ -832,7 +604,7 @@ pg_UintFromObjIndex(PyObject *obj, int _index, Uint32 *val) } /* You probably want to use the pg_RGBAFromObjEx function instead of this. */ -static int +int pg_RGBAFromObj(PyObject *obj, Uint8 *RGBA) { Py_ssize_t length; @@ -872,13 +644,13 @@ pg_RGBAFromObj(PyObject *obj, Uint8 *RGBA) return 1; } -static PyObject * +PyObject * pg_get_error(PyObject *self, PyObject *_null) { return PyUnicode_FromString(SDL_GetError()); } -static PyObject * +PyObject * pg_set_error(PyObject *s, PyObject *args) { char *errstring = NULL; @@ -900,7 +672,7 @@ pg_set_error(PyObject *s, PyObject *args) /*array interface*/ -static int +int pgGetArrayStruct(PyObject *obj, PyObject **cobj_p, PyArrayInterface **inter_p) { PyObject *cobj = PyObject_GetAttrString(obj, "__array_struct__"); @@ -929,7 +701,7 @@ pgGetArrayStruct(PyObject *obj, PyObject **cobj_p, PyArrayInterface **inter_p) return 0; } -static PyObject * +PyObject * pgArrayStruct_AsDict(PyArrayInterface *inter_p) { PyObject *dictobj = Py_BuildValue("{sisNsNsNsN}", "version", (int)3, @@ -957,7 +729,7 @@ pgArrayStruct_AsDict(PyArrayInterface *inter_p) return dictobj; } -static PyObject * +PyObject * pgBuffer_AsArrayInterface(Py_buffer *view_p) { return Py_BuildValue("{sisNsNsNsN}", "version", (int)3, "typestr", @@ -967,7 +739,7 @@ pgBuffer_AsArrayInterface(Py_buffer *view_p) pg_view_get_data_obj(view_p)); } -static PyObject * +PyObject * pgBuffer_AsArrayStruct(Py_buffer *view_p) { void *cinter_p = _pg_new_capsuleinterface(view_p); @@ -984,7 +756,7 @@ pgBuffer_AsArrayStruct(Py_buffer *view_p) return capsule; } -static pgCapsuleInterface * +pgCapsuleInterface * _pg_new_capsuleinterface(Py_buffer *view_p) { int ndim = view_p->ndim; @@ -1021,13 +793,13 @@ _pg_new_capsuleinterface(Py_buffer *view_p) return cinter_p; } -static void +void _pg_capsule_PyMem_Free(PyObject *capsule) { PyMem_Free(PyCapsule_GetPointer(capsule, 0)); } -static int +int _pg_as_arrayinter_flags(Py_buffer *view_p) { int inter_flags = PAI_ALIGNED; /* atomic int types always aligned */ @@ -1045,7 +817,7 @@ _pg_as_arrayinter_flags(Py_buffer *view_p) return inter_flags; } -static PyObject * +PyObject * pg_view_get_typestr_obj(Py_buffer *view) { return PyUnicode_FromFormat("%c%c%i", _pg_as_arrayinter_byteorder(view), @@ -1053,7 +825,7 @@ pg_view_get_typestr_obj(Py_buffer *view) (int)view->itemsize); } -static PyObject * +PyObject * pg_view_get_shape_obj(Py_buffer *view) { PyObject *shapeobj = PyTuple_New(view->ndim); @@ -1074,7 +846,7 @@ pg_view_get_shape_obj(Py_buffer *view) return shapeobj; } -static PyObject * +PyObject * pg_view_get_strides_obj(Py_buffer *view) { PyObject *shapeobj = PyTuple_New(view->ndim); @@ -1095,14 +867,14 @@ pg_view_get_strides_obj(Py_buffer *view) return shapeobj; } -static PyObject * +PyObject * pg_view_get_data_obj(Py_buffer *view) { return Py_BuildValue("NN", PyLong_FromVoidPtr(view->buf), PyBool_FromLong((long)view->readonly)); } -static char +char _pg_as_arrayinter_typekind(Py_buffer *view) { char type = view->format ? view->format[0] : 'B'; @@ -1142,7 +914,7 @@ _pg_as_arrayinter_typekind(Py_buffer *view) return typekind; } -static char +char _pg_as_arrayinter_byteorder(Py_buffer *view) { char format_0 = view->format ? view->format[0] : 'B'; @@ -1174,7 +946,7 @@ _pg_as_arrayinter_byteorder(Py_buffer *view) return byteorder; } -static PyObject * +PyObject * _pg_shape_as_tuple(PyArrayInterface *inter_p) { PyObject *shapeobj = PyTuple_New((Py_ssize_t)inter_p->nd); @@ -1195,7 +967,7 @@ _pg_shape_as_tuple(PyArrayInterface *inter_p) return shapeobj; } -static PyObject * +PyObject * _pg_typekind_as_str(PyArrayInterface *inter_p) { return PyUnicode_FromFormat( @@ -1207,7 +979,7 @@ _pg_typekind_as_str(PyArrayInterface *inter_p) inter_p->typekind, inter_p->itemsize); } -static PyObject * +PyObject * _pg_strides_as_tuple(PyArrayInterface *inter_p) { PyObject *stridesobj = PyTuple_New((Py_ssize_t)inter_p->nd); @@ -1228,7 +1000,7 @@ _pg_strides_as_tuple(PyArrayInterface *inter_p) return stridesobj; } -static PyObject * +PyObject * _pg_data_as_tuple(PyArrayInterface *inter_p) { long readonly = (inter_p->flags & PAI_WRITEABLE) == 0; @@ -1237,7 +1009,7 @@ _pg_data_as_tuple(PyArrayInterface *inter_p) PyBool_FromLong(readonly)); } -static PyObject * +PyObject * pg_get_array_interface(PyObject *self, PyObject *arg) { PyObject *cobj; @@ -1252,7 +1024,7 @@ pg_get_array_interface(PyObject *self, PyObject *arg) return dictobj; } -static int +int pgObject_GetBuffer(PyObject *obj, pg_buffer *pg_view_p, int flags) { Py_buffer *view_p = (Py_buffer *)pg_view_p; @@ -1385,33 +1157,7 @@ pgObject_GetBuffer(PyObject *obj, pg_buffer *pg_view_p, int flags) return 0; } -static inline PyObject * -pgObject_getRectHelper(PyObject *rect, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwnames, char *type) -{ - if (nargs > 0) { - Py_DECREF(rect); - return PyErr_Format(PyExc_TypeError, - "get_%s only accepts keyword arguments", type); - } - - if (rect && kwnames) { - Py_ssize_t i, sequence_len; - PyObject **sequence_items; - sequence_items = PySequence_Fast_ITEMS(kwnames); - sequence_len = PyTuple_GET_SIZE(kwnames); - - for (i = 0; i < sequence_len; ++i) { - if ((PyObject_SetAttr(rect, sequence_items[i], args[i]) == -1)) { - Py_DECREF(rect); - return NULL; - } - } - } - return rect; -} - -static void +void pgBuffer_Release(pg_buffer *pg_view_p) { assert(pg_view_p && pg_view_p->release_buffer); @@ -1423,7 +1169,7 @@ pgBuffer_Release(pg_buffer *pg_view_p) PyErr_Restore(type, value, traceback); } -static void +void _pg_release_buffer_generic(Py_buffer *view_p) { if (view_p->obj) { @@ -1432,7 +1178,7 @@ _pg_release_buffer_generic(Py_buffer *view_p) } } -static void +void _pg_release_buffer_array(Py_buffer *view_p) { /* This is deliberately made safe for use on an uninitialized *view_p */ @@ -1443,7 +1189,7 @@ _pg_release_buffer_array(Py_buffer *view_p) _pg_release_buffer_generic(view_p); } -static int +int _pg_buffer_is_byteswapped(Py_buffer *view) { if (view->format) { @@ -1468,7 +1214,7 @@ _pg_buffer_is_byteswapped(Py_buffer *view) return 0; } -static int +int pgGetArrayInterface(PyObject **dict, PyObject *obj) { PyObject *inter = PyObject_GetAttrString(obj, "__array_interface__"); @@ -1491,7 +1237,7 @@ pgGetArrayInterface(PyObject **dict, PyObject *obj) return 0; } -static int +int pgArrayStruct_AsBuffer(pg_buffer *pg_view_p, PyObject *cobj, PyArrayInterface *inter_p, int flags) { @@ -1504,7 +1250,7 @@ pgArrayStruct_AsBuffer(pg_buffer *pg_view_p, PyObject *cobj, return 0; } -static int +int _pg_arraystruct_as_buffer(Py_buffer *view_p, PyObject *cobj, PyArrayInterface *inter_p, int flags) { @@ -1599,7 +1345,7 @@ _pg_arraystruct_as_buffer(Py_buffer *view_p, PyObject *cobj, return 0; } -static int +int _pg_arraystruct_to_format(char *format, PyArrayInterface *inter_p, int max_format_len) { @@ -1724,7 +1470,7 @@ _pg_arraystruct_to_format(char *format, PyArrayInterface *inter_p, return 0; } -static int +int pgDict_AsBuffer(pg_buffer *pg_view_p, PyObject *dict, int flags) { PyObject *shape = PyDict_GetItemString(dict, "shape"); @@ -1753,7 +1499,7 @@ pgDict_AsBuffer(pg_buffer *pg_view_p, PyObject *dict, int flags) return 0; } -static int +int _pg_shape_check(PyObject *op) { if (!op) { @@ -1773,7 +1519,7 @@ _pg_shape_check(PyObject *op) return 0; } -static int +int _pg_typestr_check(PyObject *op) { if (!op) { @@ -1803,7 +1549,7 @@ _pg_typestr_check(PyObject *op) return 0; } -static int +int _pg_data_check(PyObject *op) { PyObject *item; @@ -1830,7 +1576,7 @@ _pg_data_check(PyObject *op) return 0; } -static int +int _pg_strides_check(PyObject *op) { if (op && !_pg_is_int_tuple(op) /* Conditional && */) { @@ -1841,7 +1587,7 @@ _pg_strides_check(PyObject *op) return 0; } -static int +int _pg_is_int_tuple(PyObject *op) { Py_ssize_t i; @@ -1861,7 +1607,7 @@ _pg_is_int_tuple(PyObject *op) return 1; } -static int +int _pg_values_as_buffer(Py_buffer *view_p, int flags, PyObject *typestr, PyObject *shape, PyObject *data, PyObject *strides) { @@ -1976,7 +1722,7 @@ _pg_values_as_buffer(Py_buffer *view_p, int flags, PyObject *typestr, return 0; } -static int +int _pg_int_tuple_as_ssize_arr(PyObject *tp, Py_ssize_t *arr) { Py_ssize_t i; @@ -1991,7 +1737,7 @@ _pg_int_tuple_as_ssize_arr(PyObject *tp, Py_ssize_t *arr) return 0; } -static int +int _pg_typestr_as_format(PyObject *sp, char *format, Py_ssize_t *itemsize_p) { const char *typestr; @@ -2167,13 +1913,13 @@ _pg_typestr_as_format(PyObject *sp, char *format, Py_ssize_t *itemsize_p) } /*Default window(display)*/ -static SDL_Window * +SDL_Window * pg_GetDefaultWindow(void) { return pg_default_window; } -static void +void pg_SetDefaultWindow(SDL_Window *win) { /*Allows a window to be replaced by itself*/ @@ -2186,14 +1932,14 @@ pg_SetDefaultWindow(SDL_Window *win) pg_default_window = win; } -static pgSurfaceObject * +pgSurfaceObject * pg_GetDefaultWindowSurface(void) { /* return a borrowed reference*/ return pg_default_screen; } -static void +void pg_SetDefaultWindowSurface(pgSurfaceObject *screen) { /*a screen surface can be replaced with itself*/ @@ -2205,9 +1951,7 @@ pg_SetDefaultWindowSurface(pgSurfaceObject *screen) pg_default_screen = screen; } -PG_PixelFormatEnum pg_default_convert_format = 0; - -static PG_PixelFormatEnum +PG_PixelFormatEnum pg_GetDefaultConvertFormat(void) { if (pg_default_screen) { @@ -2216,20 +1960,20 @@ pg_GetDefaultConvertFormat(void) return pg_default_convert_format; } -static void +void pg_SetDefaultConvertFormat(PG_PixelFormatEnum format) { pg_default_convert_format = format; } -static int +int pg_EnvShouldBlendAlphaSDL2(void) { return pg_env_blend_alpha_SDL2; } /*error signal handlers(replacing SDL parachute)*/ -static void +void pygame_parachute(int sig) { #ifdef HAVE_SIGNAL_H @@ -2282,7 +2026,7 @@ static int fatal_signals[] = { }; static int parachute_installed = 0; -static void +void pg_install_parachute(void) { #ifdef HAVE_SIGNAL_H @@ -2306,7 +2050,7 @@ pg_install_parachute(void) return; } -static void +void pg_uninstall_parachute(void) { #ifdef HAVE_SIGNAL_H @@ -2328,6 +2072,15 @@ pg_uninstall_parachute(void) #endif } +#if defined(BUILD_STATIC) +static PyObject * +mod_pygame_import_cython(PyObject *self, PyObject *spec); +void +PyInit_pygame_static(); +PyObject * +load_submodule(const char *parent, PyObject *mod, const char *alias); +#endif + /* bind functions to python */ static PyMethodDef _base_methods[] = { @@ -2341,28 +2094,21 @@ static PyMethodDef _base_methods[] = { METH_VARARGS | METH_KEYWORDS, DOC_GETSDLVERSION}, {"get_sdl_byteorder", (PyCFunction)pg_get_sdl_byteorder, METH_NOARGS, DOC_GETSDLBYTEORDER}, - {"get_array_interface", (PyCFunction)pg_get_array_interface, METH_O, "return an array struct interface as an interface dictionary"}, +#if defined(BUILD_STATIC) + {"import_cython", (PyCFunction)mod_pygame_import_cython, METH_O, + "pygame._sdl2.*"}, +#endif {NULL, NULL, 0, NULL}}; -#if defined(BUILD_STATIC) && defined(NO_PYGAME_C_API) -// in case of wasm+dynamic loading it could be a trampoline in the globals -// generated at runtime. -// when building static make global accessible symbol directly. -static PyObject *pgExc_SDLError; -#endif +static void *c_api[PYGAMEAPI_BASE_NUMSLOTS]; MODINIT_DEFINE(base) { - PyObject *module, *apiobj, *atexit; - PyObject *atexit_register; -#if !(defined(BUILD_STATIC) && defined(NO_PYGAME_C_API)) - // only pointer via C-api will be used, no need to keep global. - PyObject *pgExc_SDLError; +#if !defined(BUILD_STATIC) + PyObject *atexit, *atexit_register; #endif - static void *c_api[PYGAMEAPI_BASE_NUMSLOTS]; - static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "base", "", @@ -2373,9 +2119,13 @@ MODINIT_DEFINE(base) NULL, NULL}; + PyObject *module, *apiobj; + /* import need modules. Do this first so if there is an error the module is not loaded. */ + +#if !defined(BUILD_STATIC) atexit = PyImport_ImportModule("atexit"); if (!atexit) { return NULL; @@ -2386,13 +2136,19 @@ MODINIT_DEFINE(base) if (!atexit_register) { return NULL; } +#endif /* create the module */ module = PyModule_Create(&_module); + if (!module) { goto error; } +#if defined(BUILD_STATIC) + load_submodule("pygame", module, "base"); +#endif + /* create the exceptions */ pgExc_SDLError = PyErr_NewException("pygame.error", PyExc_RuntimeError, NULL); @@ -2467,6 +2223,7 @@ MODINIT_DEFINE(base) goto error; } +#if !defined(BUILD_STATIC) /*some initialization*/ PyObject *quit = PyObject_GetAttrString(module, "quit"); PyObject *rval; @@ -2474,6 +2231,7 @@ MODINIT_DEFINE(base) if (!quit) { /* assertion */ goto error; } + rval = PyObject_CallOneArg(atexit_register, quit); Py_DECREF(atexit_register); Py_DECREF(quit); @@ -2495,12 +2253,514 @@ MODINIT_DEFINE(base) #ifdef MS_WIN32 SDL_RegisterApp("pygame", 0, GetModuleHandle(NULL)); #endif - +#else // !BUILD_STATIC + PyInit_pygame_static(); +#endif // BUILD_STATIC return module; error: Py_XDECREF(pgExc_BufferError); - Py_XDECREF(atexit_register); Py_XDECREF(module); +#if !defined(BUILD_STATIC) + Py_XDECREF(atexit_register); +#endif return NULL; } + +#if defined(BUILD_STATIC) + +#include + +#undef WITH_THREAD + +#undef import_pygame_base +#undef import_pygame_rect +#undef import_pygame_surface +#undef import_pygame_geometry +#undef import_pygame_color +#undef import_pygame_bufferproxy +#undef import_pygame_rwobject +#undef import_pygame_event + +void +import_pygame_base(void) +{ +} + +void +import_pygame_rect(void) +{ +} + +void +import_pygame_surface(void) +{ +} + +#ifdef import_pygame_window +#undef import_pygame_window +#endif + +void +import_pygame_window(void) +{ +} + +void +import_pygame_geometry(void) +{ +} + +void +import_pygame_color(void) +{ +} + +void +import_pygame_font(void) +{ +} + +void +import_pygame_freetype(void) +{ +} + +void +import_pygame_bufferproxy(void) +{ +} + +void +import_pygame_rwobject(void) +{ +} + +void +import_pygame_event(void) +{ +} + +#ifdef import_pygame_joystick +#undef import_pygame_joystick +#endif + +void +import_pygame_joystick(void) +{ +} + +#undef import_pygame_imageext +#undef import_pygame_render +#undef import_pygame_pixelarray + +void +import_pygame_imageext(void) +{ +} + +void +import_pygame_render(void) +{ +} + +void +import_pygame_pixelarray(void) +{ +} + +PyMODINIT_FUNC +PyInit_base(void); +PyMODINIT_FUNC +PyInit_color(void); +PyMODINIT_FUNC +PyInit_constants(void); +PyMODINIT_FUNC +PyInit_version(void); +PyMODINIT_FUNC +PyInit_rect(void); +PyMODINIT_FUNC +PyInit_geometry(void); +PyMODINIT_FUNC +PyInit_surflock(void); +PyMODINIT_FUNC +PyInit_rwobject(void); +PyMODINIT_FUNC +PyInit_bufferproxy(void); + +PyMODINIT_FUNC +PyInit_surface(void); +PyMODINIT_FUNC +PyInit_display(void); +PyMODINIT_FUNC +PyInit__freetype(void); +PyMODINIT_FUNC +PyInit_font(void); + +PyMODINIT_FUNC +PyInit_draw(void); +PyMODINIT_FUNC +PyInit_mouse(void); +PyMODINIT_FUNC +PyInit_key(void); +PyMODINIT_FUNC +PyInit_event(void); + +PyMODINIT_FUNC +PyInit_joystick(void); + +PyMODINIT_FUNC +PyInit_imageext(void); + +PyMODINIT_FUNC +PyInit_image(void); + +PyMODINIT_FUNC +PyInit_mask(void); + +PyMODINIT_FUNC +PyInit_mixer_music(void); + +PyMODINIT_FUNC +PyInit_mixer(void); + +PyMODINIT_FUNC +PyInit_pg_math(void); + +PyMODINIT_FUNC +PyInit_pg_time(void); + +PyMODINIT_FUNC +PyInit_system(void); + +PyMODINIT_FUNC +PyInit_transform(void); + +PyMODINIT_FUNC +PyInit__sprite(void); + +PyMODINIT_FUNC +PyInit_pixelcopy(void); + +PyMODINIT_FUNC +PyInit_newbuffer(void); + +PyMODINIT_FUNC +PyInit_gfxdraw(void); + +PyMODINIT_FUNC +PyInit_pixelarray(void); + +PyMODINIT_FUNC +PyInit_window(void); + +PyMODINIT_FUNC +PyInit__render(void); + +// pygame _sdl2 +#if !defined(NO_SDL2) + +PyMODINIT_FUNC +PyInit_sdl2(void); + +PyMODINIT_FUNC +PyInit_sdl2_controller(void); + +PyMODINIT_FUNC +PyInit_sdl2_mixer(void); + +PyMODINIT_FUNC +PyInit_sdl2_audio(void); + +PyMODINIT_FUNC +PyInit_sdl2_video(void); + +#endif + +// pygame_static module + +PyObject * +load_submodule(const char *parent, PyObject *mod, const char *alias) +{ + char fqn[1024]; + if (!mod) { + snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, + parent, alias); + puts(fqn); + PyErr_Print(); + PyErr_Clear(); + } + else { + snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); + PyObject *modules = PyImport_GetModuleDict(); + + PyObject *pmod = PyDict_GetItemString(modules, parent); + if (!pmod) { + snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", + parent, parent, alias); + puts(fqn); + } + else { + PyDict_SetItemString(modules, fqn, mod); + PyDict_SetItemString(PyModule_GetDict(mod), "__name__", + PyUnicode_FromString(fqn)); + PyModule_AddObjectRef(pmod, alias, mod); + Py_XDECREF(mod); + } + } + return mod; +} + +void +load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, + const char *alias) +{ + char fqn[1024]; + snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); + + PyObject *modules = PyImport_GetModuleDict(); + + Py_DECREF(PyObject_GetAttrString(spec, "name")); + PyObject_SetAttrString(spec, "name", PyUnicode_FromString(alias)); + PyObject *pmod = PyDict_GetItemString(modules, parent); + PyObject *mod = PyModule_FromDefAndSpec((PyModuleDef *)mdef, spec); + PyDict_SetItemString(PyModule_GetDict(mod), "__package__", + PyUnicode_FromString(parent)); + // TODO SET PACKAGE + PyModule_ExecDef(mod, (PyModuleDef *)mdef); + + if (pmod) { + PyDict_SetItemString(modules, fqn, mod); + PyDict_SetItemString(PyModule_GetDict(mod), "__name__", + PyUnicode_FromString(fqn)); + PyModule_AddObjectRef(pmod, alias, mod); + Py_XDECREF(mod); + } + if (!pmod || PyErr_Occurred()) { + snprintf(fqn, sizeof(fqn), "Error after init in : %s.%s\n", parent, + alias); + fputs(fqn, stderr); + PyErr_Print(); + PyErr_Clear(); + } +} + +static PyObject * +mod_pygame_import_cython(PyObject *self, PyObject *spec) +{ +#if defined(NO_SDL2) +#pragma message "WARNING: pygame._sdl2.* are disabled" +#else + load_submodule_mphase("pygame._sdl2", PyInit_sdl2(), spec, "sdl2"); + load_submodule_mphase("pygame._sdl2", PyInit_sdl2_mixer(), spec, "mixer"); + load_submodule("pygame._sdl2", PyInit_sdl2_controller(), "controller"); + load_submodule_mphase("pygame._sdl2", PyInit_sdl2_audio(), spec, "audio"); + load_submodule_mphase("pygame._sdl2", PyInit_sdl2_video(), spec, "video"); +#endif + + Py_RETURN_NONE; +} + +void +PyInit_pygame_static() +{ + // cannot fail here, and font_initialized is already set to 1 in font.c . + TTF_Init(); + + // for correct input in wasm worker + SDL_SetHint("SDL_EMSCRIPTEN_KEYBOARD_ELEMENT", "1"); + + // base module is including current file + // all globals are accessible from here. + // load_submodule("pygame", PyInit_base(), "base"); + + load_submodule("pygame", PyInit_constants(), "constants"); + // + load_submodule("pygame", PyInit_pg_math(), "math"); + + // base, pygame.colordict + load_submodule("pygame", PyInit_color(), "color"); + + // base + load_submodule("pygame", PyInit_rect(), "rect"); + + // base, rect + load_submodule("pygame", PyInit_geometry(), "geometry"); + + load_submodule("pygame", PyInit_bufferproxy(), "bufferproxy"); + load_submodule("pygame", PyInit_surflock(), "surflock"); + + // base, color, rect, bufferproxy, surflock + load_submodule("pygame", PyInit_surface(), "surface"); + + load_submodule("pygame", PyInit_rwobject(), "rwobject"); + + // base, color, rect, bufferproxy, surflock, surface, rwobject + load_submodule("pygame", PyInit_imageext(), "imageext"); + // base, color, rect, bufferproxy, surflock, surface, rwobject + load_submodule("pygame", PyInit_image(), "image"); + + load_submodule("pygame", PyInit__freetype(), "_freetype"); + load_submodule("pygame", PyInit_font(), "font"); + load_submodule("pygame", PyInit_pixelcopy(), "pixelcopy"); + load_submodule("pygame", PyInit_newbuffer(), "newbuffer"); + + // base + load_submodule("pygame", PyInit_joystick(), "joystick"); + // base, joystick + load_submodule("pygame", PyInit_event(), "event"); + + // base, rect, event + load_submodule("pygame", PyInit_key(), "key"); + // base, event + load_submodule("pygame", PyInit_pg_time(), "time"); + + load_submodule("pygame", PyInit_transform(), "transform"); + load_submodule("pygame", PyInit_draw(), "draw"); + + load_submodule("pygame", PyInit_mask(), "mask"); + load_submodule("pygame", PyInit_mouse(), "mouse"); + + load_submodule("pygame", PyInit_mixer(), "mixer"); + load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); + + // base, color, rect, bufferproxy, surflock, surface + load_submodule("pygame", PyInit_window(), "window"); + + // base, color, rect, surflock, surface, window + load_submodule("pygame", PyInit_display(), "display"); + load_submodule("pygame", PyInit__render(), "_render"); + + load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); + + // base, color, rect, bufferproxy, surflock, surface + load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); + + load_submodule("pygame", PyInit_system(), "system"); + + // return PyModule_Create(&mod_pygame_static); +} + +// meson static support + +#include "constants.c" + +#include "rect.c" +#include "pgcompat_rect.c" + +#undef pgSurface_Lock +#undef pgSurface_Unlock +#undef pgSurface_LockBy +#undef pgSurface_UnlockBy +#undef pgSurface_Prep +#undef pgSurface_Unprep + +#include "surflock.c" + +#undef pgColor_New +#undef pgColor_NewLength +#undef pg_RGBAFromObjEx +#undef pg_MappedColorFromObj +#undef pgColor_Type + +#include "color.c" + +#undef pgBufferProxy_New + +#include "bufferproxy.c" + +#undef pgSurface_Blit +#undef pgSurface_New +#undef pgSurface_Type +#undef pgSurface_SetSurface + +#include "surface.c" +#include "simd_blitters_avx2.c" +#include "simd_blitters_sse2.c" + +#include "window.c" + +#undef pgVidInfo_Type +#undef pgVidInfo_New + +#include "display.c" + +#include "draw.c" + +#undef pg_EncodeString +#undef pg_EncodeFilePath +#undef pgRWops_IsFileObject +#undef pgRWops_GetFileExtension +#undef pgRWops_FromFileObject +#undef pgRWops_FromObject + +#include "rwobject.c" + +#define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) +#include "render.c" +#include "image.c" + +#include "imageext.c" + +#include "mask.c" + +#undef pg_EnableKeyRepeat +#undef pg_GetKeyRepeat +#undef pgEvent_FillUserEvent +#undef pgEvent_Type +#undef pgEvent_New + +#include "joystick.c" + +#include "event.c" + +#include "mouse.c" + +#include "key.c" + +#include "time.c" + +#include "system.c" +#include "geometry.c" + +#if defined(DEC_CONST) +#undef DEC_CONST +#endif +#include "_freetype.c" +#include "freetype/ft_wrap.c" +#include "freetype/ft_render.c" +#include "freetype/ft_render_cb.c" +#include "freetype/ft_cache.c" +#include "freetype/ft_layout.c" +#include "freetype/ft_unicode.c" + +#include "font.c" + +#include "mixer.c" + +#include "music.c" + +#include "gfxdraw.c" + +#include "alphablit.c" + +#include "surface_fill.c" +#include "pixelarray.c" +#include "pixelcopy.c" +#include "newbuffer.c" + +#include "_sdl2/controller.c" +// #include "_sdl2/controller_old.c" +// #include "_sdl2/mixer.c" +#include "_sdl2/touch.c" +// #include "_sdl2/sdl2.c" + +#include "transform.c" +// that remove some warnings +#undef MAX +#undef MIN +#include "scale2x.c" + +#include "math.c" + +#endif // BUILD_STATIC diff --git a/src_c/base.h b/src_c/base.h new file mode 100644 index 0000000000..f67ae22a96 --- /dev/null +++ b/src_c/base.h @@ -0,0 +1,357 @@ +#ifndef BASE_H +#define BASE_H + +#define NO_PYGAME_C_API +#define PYGAMEAPI_BASE_INTERNAL + +#include "pygame.h" + +#include +#include "doc/pygame_doc.h" +#include "pgarrinter.h" +#include "pgcompat.h" + +/* This file controls all the initialization of + * the module and the various SDL subsystems + */ + +/*platform specific init stuff*/ + +#ifdef MS_WIN32 /*python gives us MS_WIN32*/ +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#include +extern int +SDL_RegisterApp(const char *, Uint32, void *); +#endif + +#if defined(macintosh) +#if (!defined(__MWERKS__) && !TARGET_API_MAC_CARBON) +QDGlobals pg_qd; +#endif +#endif + +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define PAI_MY_ENDIAN '<' +#define PAI_OTHER_ENDIAN '>' +#define BUF_OTHER_ENDIAN '>' +#else +#define PAI_MY_ENDIAN '>' +#define PAI_OTHER_ENDIAN '<' +#define BUF_OTHER_ENDIAN '<' +#endif +#define BUF_MY_ENDIAN '=' + +/* Extended array struct */ +typedef struct pg_capsule_interface_s { + PyArrayInterface inter; + Py_intptr_t imem[1]; +} pgCapsuleInterface; + +/* Py_buffer internal data for an array interface/struct */ +typedef struct pg_view_internals_s { + char format[4]; /* make 4 byte word sized */ + Py_ssize_t imem[1]; +} pgViewInternals; + +extern PG_PixelFormatEnum pg_default_convert_format; +extern PyObject *pgExc_BufferError; +extern PyObject *pgExc_SDLError; +extern SDL_Window *pg_default_window; +extern pgSurfaceObject *pg_default_screen; + +void +pg_install_parachute(void); +void +pg_uninstall_parachute(void); +void +pg_atexit_quit(void); +int +pgGetArrayStruct(PyObject *, PyObject **, PyArrayInterface **); +PyObject * +pgArrayStruct_AsDict(PyArrayInterface *); +PyObject * +pgBuffer_AsArrayInterface(Py_buffer *); +PyObject * +pgBuffer_AsArrayStruct(Py_buffer *); +int +_pg_buffer_is_byteswapped(Py_buffer *); +void +pgBuffer_Release(pg_buffer *); +int +pgObject_GetBuffer(PyObject *, pg_buffer *, int); +static inline PyObject * +pgObject_getRectHelper(PyObject *, PyObject *const *, Py_ssize_t, PyObject *, + char *); +int +pgGetArrayInterface(PyObject **, PyObject *); +int +pgArrayStruct_AsBuffer(pg_buffer *, PyObject *, PyArrayInterface *, int); +int +_pg_arraystruct_as_buffer(Py_buffer *, PyObject *, PyArrayInterface *, int); +int +_pg_arraystruct_to_format(char *, PyArrayInterface *, int); +int +pgDict_AsBuffer(pg_buffer *, PyObject *, int); +int +_pg_shape_check(PyObject *); +int +_pg_typestr_check(PyObject *); +int +_pg_strides_check(PyObject *); +int +_pg_data_check(PyObject *); +int +_pg_is_int_tuple(PyObject *); +int +_pg_values_as_buffer(Py_buffer *, int, PyObject *, PyObject *, PyObject *, + PyObject *); +int +_pg_int_tuple_as_ssize_arr(PyObject *, Py_ssize_t *); +int +_pg_typestr_as_format(PyObject *, char *, Py_ssize_t *); +PyObject * +pg_view_get_typestr_obj(Py_buffer *); +PyObject * +pg_view_get_shape_obj(Py_buffer *); +PyObject * +pg_view_get_strides_obj(Py_buffer *); +PyObject * +pg_view_get_data_obj(Py_buffer *); +char +_pg_as_arrayinter_typekind(Py_buffer *); +char +_pg_as_arrayinter_byteorder(Py_buffer *); +int +_pg_as_arrayinter_flags(Py_buffer *); +pgCapsuleInterface * +_pg_new_capsuleinterface(Py_buffer *); +void +_pg_capsule_PyMem_Free(PyObject *); +PyObject * +_pg_shape_as_tuple(PyArrayInterface *); +PyObject * +_pg_typekind_as_str(PyArrayInterface *); +PyObject * +_pg_strides_as_tuple(PyArrayInterface *); +PyObject * +_pg_data_as_tuple(PyArrayInterface *); +PyObject * +pg_get_array_interface(PyObject *, PyObject *); +void +_pg_release_buffer_array(Py_buffer *); +void +_pg_release_buffer_generic(Py_buffer *); +SDL_Window * +pg_GetDefaultWindow(void); +void +pg_SetDefaultWindow(SDL_Window *); +pgSurfaceObject * +pg_GetDefaultWindowSurface(void); +void +pg_SetDefaultWindowSurface(pgSurfaceObject *); +int +pg_EnvShouldBlendAlphaSDL2(void); +int +pg_CheckSDLVersions(void); +void +pg_RegisterQuit(void (*func)(void)); +PyObject * +pg_register_quit(PyObject *self, PyObject *value); +int +pg_mod_autoinit(const char *modname); +void +pg_mod_autoquit(const char *modname); +PyObject * +pg_init(PyObject *self, PyObject *_null); +PyObject * +pg_get_sdl_version(PyObject *self, PyObject *args, PyObject *kwargs); +PyObject * +pg_get_sdl_byteorder(PyObject *self, PyObject *_null); +void +_pg_quit(void); +PyObject * +pg_quit(PyObject *self, PyObject *_null); +PyObject * +pg_base_get_init(PyObject *self, PyObject *_null); +/* internal C API utility functions */ +int +pg_IntFromObj(PyObject *obj, int *val); +int +pg_IntFromObjIndex(PyObject *obj, int _index, int *val); +int +pg_TwoIntsFromObj(PyObject *obj, int *val1, int *val2); +int +pg_FloatFromObj(PyObject *obj, float *val); +int +pg_FloatFromObjIndex(PyObject *obj, int _index, float *val); +int +pg_TwoFloatsFromObj(PyObject *obj, float *val1, float *val2); +static inline int +pg_DoubleFromObj(PyObject *obj, double *val); +/*Assumes obj is a Sequence, internal or conscious use only*/ +static inline int +_pg_DoubleFromObjIndex(PyObject *obj, int index, double *val); +static inline int +pg_TwoDoublesFromObj(PyObject *obj, double *val1, double *val2); +static inline int +pg_TwoDoublesFromFastcallArgs(PyObject *const *args, Py_ssize_t nargs, + double *val1, double *val2); +int +pg_UintFromObj(PyObject *obj, Uint32 *val); +int +pg_UintFromObjIndex(PyObject *obj, int _index, Uint32 *val); +/* You probably want to use the pg_RGBAFromObjEx function instead of this. */ +int +pg_RGBAFromObj(PyObject *obj, Uint8 *RGBA); +PyObject * +pg_get_error(PyObject *self, PyObject *_null); +PyObject * +pg_set_error(PyObject *s, PyObject *args); + +/*error signal handlers(replacing SDL parachute)*/ +void +pygame_parachute(int sig); + +void +pg_SetDefaultConvertFormat(PG_PixelFormatEnum format); + +PG_PixelFormatEnum +pg_GetDefaultConvertFormat(void); + +#if defined(BUILD_STATIC) && defined(NO_PYGAME_C_API) +// in case of wasm+dynamic loading it could be a trampoline in the globals +// generated at runtime. +// when building static make global accessible symbol directly. +extern PyObject *pgExc_SDLError; +#endif + +MODINIT_DEFINE(base); + +/*=======static inline function definitions=======*/ +static inline PyObject * +pgObject_getRectHelper(PyObject *rect, PyObject *const *args, Py_ssize_t nargs, + PyObject *kwnames, char *type) +{ + if (nargs > 0) { + Py_DECREF(rect); + return PyErr_Format(PyExc_TypeError, + "get_%s only accepts keyword arguments", type); + } + + if (rect && kwnames) { + Py_ssize_t i, sequence_len; + PyObject **sequence_items; + sequence_items = PySequence_Fast_ITEMS(kwnames); + sequence_len = PyTuple_GET_SIZE(kwnames); + + for (i = 0; i < sequence_len; ++i) { + if ((PyObject_SetAttr(rect, sequence_items[i], args[i]) == -1)) { + Py_DECREF(rect); + return NULL; + } + } + } + return rect; +} + +static inline int +pg_DoubleFromObj(PyObject *obj, double *val) +{ + if (PyFloat_Check(obj)) { + *val = PyFloat_AS_DOUBLE(obj); + return 1; + } + + *val = (double)PyLong_AsLong(obj); + if (PyErr_Occurred()) { + PyErr_Clear(); + return 0; + } + + return 1; +} + +/*Assumes obj is a Sequence, internal or conscious use only*/ +static inline int +_pg_DoubleFromObjIndex(PyObject *obj, int index, double *val) +{ + int result = 0; + + PyObject *item = PySequence_ITEM(obj, index); + if (!item) { + PyErr_Clear(); + return 0; + } + result = pg_DoubleFromObj(item, val); + Py_DECREF(item); + + return result; +} + +static inline int +pg_TwoDoublesFromObj(PyObject *obj, double *val1, double *val2) +{ + Py_ssize_t length; + /*Faster path for tuples and lists*/ + if (pgSequenceFast_Check(obj)) { + length = PySequence_Fast_GET_SIZE(obj); + PyObject **f_arr = PySequence_Fast_ITEMS(obj); + if (length == 2) { + if (!pg_DoubleFromObj(f_arr[0], val1) || + !pg_DoubleFromObj(f_arr[1], val2)) { + return 0; + } + } + else if (length == 1) { + /* Handle case of ((x, y), ) 'nested sequence' */ + return pg_TwoDoublesFromObj(f_arr[0], val1, val2); + } + else { + return 0; + } + } + else if (PySequence_Check(obj)) { + length = PySequence_Length(obj); + if (length == 2) { + if (!_pg_DoubleFromObjIndex(obj, 0, val1)) { + return 0; + } + if (!_pg_DoubleFromObjIndex(obj, 1, val2)) { + return 0; + } + } + else if (length == 1 && !PyUnicode_Check(obj)) { + /* Handle case of ((x, y), ) 'nested sequence' */ + PyObject *tmp = PySequence_ITEM(obj, 0); + int ret = pg_TwoDoublesFromObj(tmp, val1, val2); + Py_DECREF(tmp); + return ret; + } + else { + PyErr_Clear(); + return 0; + } + } + else { + return 0; + } + + return 1; +} + +static inline int +pg_TwoDoublesFromFastcallArgs(PyObject *const *args, Py_ssize_t nargs, + double *val1, double *val2) +{ + if (nargs == 1 && pg_TwoDoublesFromObj(args[0], val1, val2)) { + return 1; + } + else if (nargs == 2 && pg_DoubleFromObj(args[0], val1) && + pg_DoubleFromObj(args[1], val2)) { + return 1; + } + return 0; +} + +#endif // #ifndef BASE_H diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index c3bcc5ec55..4ae29da25a 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -208,6 +208,7 @@ typedef struct { #define pgRect_AsRect(x) (((pgRectObject *)x)->r) #define pgFRect_AsRect(x) (((pgFRectObject *)x)->r) + #ifndef PYGAMEAPI_RECT_INTERNAL #define pgRect_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(rect, 0)) diff --git a/src_c/mixer.c b/src_c/mixer.c index fedce77bd3..a31db5454e 100644 --- a/src_c/mixer.c +++ b/src_c/mixer.c @@ -2049,12 +2049,7 @@ pgChannel_New(int channelnum) return (PyObject *)chanobj; } -#if BUILD_STATIC -// avoid conflict with PyInit_mixer in _sdl2/mixer.c -MODINIT_DEFINE(pg_mixer) -#else MODINIT_DEFINE(mixer) -#endif { PyObject *module, *apiobj, *music = NULL; static void *c_api[PYGAMEAPI_MIXER_NUMSLOTS]; diff --git a/src_c/static.c b/src_c/static.c deleted file mode 100644 index d40c30189c..0000000000 --- a/src_c/static.c +++ /dev/null @@ -1,509 +0,0 @@ -#define NO_PYGAME_C_API - -#define CONTROLLER_NOPYX - -#define PYGAMEAPI_RECT_INTERNAL -#define PYGAMEAPI_EVENT_INTERNAL -#define PYGAMEAPI_JOYSTICK_INTERNAL -#define PYGAMEAPI_BASE_INTERNAL -#define PYGAMEAPI_SURFACE_INTERNAL -#define PYGAMEAPI_BUFFERPROXY_INTERNAL -#define PYGAMEAPI_WINDOW_INTERNAL -#define PYGAMEAPI_RENDER_INTERNAL - -#define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) -#define pgSurface_NewNoOwn(surface) \ - (pgSurfaceObject *)pgSurface_New2((surface), 0) - -#include "pygame.h" -#include "Python.h" - -#include - -#if defined(__EMSCRIPTEN__) -#undef WITH_THREAD -#endif - -#if defined(BUILD_STATIC) -#undef import_pygame_base -#undef import_pygame_rect -#undef import_pygame_surface -#undef import_pygame_geometry -#undef import_pygame_color -#undef import_pygame_bufferproxy -#undef import_pygame_rwobject -#undef import_pygame_event - -void -import_pygame_base(void) -{ -} - -void -import_pygame_rect(void) -{ -} - -void -import_pygame_surface(void) -{ -} - -void -import_pygame_window(void) -{ -} - -void -import_pygame_geometry(void) -{ -} - -void -import_pygame_color(void) -{ -} - -void -import_pygame_font(void) -{ -} - -void -import_pygame_freetype(void) -{ -} - -void -import_pygame_bufferproxy(void) -{ -} - -void -import_pygame_rwobject(void) -{ -} - -void -import_pygame_event(void) -{ -} - -void -import_pygame_joystick(void) -{ -} - -#undef import_pygame_imageext -#undef import_pygame_render -#undef import_pygame_pixelarray - -void -import_pygame_imageext(void) -{ -} - -void -import_pygame_render(void) -{ -} - -void -import_pygame_pixelarray(void) -{ -} - -PyMODINIT_FUNC -PyInit_base(void); -PyMODINIT_FUNC -PyInit_color(void); -PyMODINIT_FUNC -PyInit_constants(void); -PyMODINIT_FUNC -PyInit_version(void); -PyMODINIT_FUNC -PyInit_rect(void); -PyMODINIT_FUNC -PyInit_geometry(void); -PyMODINIT_FUNC -PyInit_surflock(void); -PyMODINIT_FUNC -PyInit_rwobject(void); -PyMODINIT_FUNC -PyInit_bufferproxy(void); - -PyMODINIT_FUNC -PyInit_surface(void); -PyMODINIT_FUNC -PyInit_display(void); -PyMODINIT_FUNC -PyInit__freetype(void); -PyMODINIT_FUNC -PyInit_font(void); - -PyMODINIT_FUNC -PyInit_draw(void); -PyMODINIT_FUNC -PyInit_mouse(void); -PyMODINIT_FUNC -PyInit_key(void); -PyMODINIT_FUNC -PyInit_event(void); - -PyMODINIT_FUNC -PyInit_joystick(void); - -PyMODINIT_FUNC -PyInit_imageext(void); - -PyMODINIT_FUNC -PyInit_image(void); - -PyMODINIT_FUNC -PyInit_mask(void); - -PyMODINIT_FUNC -PyInit_mixer_music(void); - -PyMODINIT_FUNC -PyInit_pg_mixer(void); - -PyMODINIT_FUNC -PyInit_pg_math(void); - -PyMODINIT_FUNC -PyInit_pg_time(void); - -PyMODINIT_FUNC -PyInit_sdl2(void); - -PyMODINIT_FUNC -PyInit_mixer(void); - -PyMODINIT_FUNC -PyInit_system(void); - -#if defined(CONTROLLER_NOPYX) -PyMODINIT_FUNC -PyInit_controller(void); -#else -PyMODINIT_FUNC -PyInit_controller_old(void); -#endif - -PyMODINIT_FUNC -PyInit_transform(void); - -PyMODINIT_FUNC -PyInit_video(void); - -PyMODINIT_FUNC -PyInit__sprite(void); - -PyMODINIT_FUNC -PyInit_pixelcopy(void); - -PyMODINIT_FUNC -PyInit_newbuffer(void); - -PyMODINIT_FUNC -PyInit_gfxdraw(void); - -PyMODINIT_FUNC -PyInit_audio(void); - -PyMODINIT_FUNC -PyInit_pixelarray(void); - -PyMODINIT_FUNC -PyInit_window(void); - -PyMODINIT_FUNC -PyInit__render(void); - -// pygame_static module - -void -load_submodule(const char *parent, PyObject *mod, const char *alias) -{ - char fqn[1024]; - if (!mod) { - snprintf(fqn, sizeof(fqn), "ERROR: PyInit_%s failed for %s.%s", alias, - parent, alias); - puts(fqn); - PyErr_Print(); - PyErr_Clear(); - } - else { - snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); - PyObject *modules = PyImport_GetModuleDict(); - - PyObject *pmod = PyDict_GetItemString(modules, parent); - if (!pmod) { - snprintf(fqn, sizeof(fqn), "ERROR: Parent %s not found for %s.%s", - parent, parent, alias); - puts(fqn); - } - else { - PyDict_SetItemString(modules, fqn, mod); - PyDict_SetItemString(PyModule_GetDict(mod), "__name__", - PyUnicode_FromString(fqn)); - PyModule_AddObjectRef(pmod, alias, mod); - Py_XDECREF(mod); - } - } -} - -void -load_submodule_mphase(const char *parent, PyObject *mdef, PyObject *spec, - const char *alias) -{ - char fqn[1024]; - snprintf(fqn, sizeof(fqn), "%s.%s", parent, alias); - - PyObject *modules = PyImport_GetModuleDict(); - - Py_DECREF(PyObject_GetAttrString(spec, "name")); - PyObject_SetAttrString(spec, "name", PyUnicode_FromString(alias)); - PyObject *pmod = PyDict_GetItemString(modules, parent); - PyObject *mod = PyModule_FromDefAndSpec((PyModuleDef *)mdef, spec); - PyDict_SetItemString(PyModule_GetDict(mod), "__package__", - PyUnicode_FromString(parent)); - // TODO SET PACKAGE - PyModule_ExecDef(mod, (PyModuleDef *)mdef); - - if (pmod) { - PyDict_SetItemString(modules, fqn, mod); - PyDict_SetItemString(PyModule_GetDict(mod), "__name__", - PyUnicode_FromString(fqn)); - PyModule_AddObjectRef(pmod, alias, mod); - Py_XDECREF(mod); - } - if (!pmod || PyErr_Occurred()) { - snprintf(fqn, sizeof(fqn), "Error after init in : %s.%s\n", parent, - alias); - fputs(fqn, stderr); - PyErr_Print(); - PyErr_Clear(); - } -} - -static PyObject * -mod_pygame_import_cython(PyObject *self, PyObject *spec) -{ - load_submodule_mphase("pygame._sdl2", PyInit_sdl2(), spec, "sdl2"); - - load_submodule_mphase("pygame._sdl2", PyInit_mixer(), spec, "mixer"); -#if defined(CONTROLLER_NOPYX) - load_submodule("pygame._sdl2", PyInit_controller(), "controller"); -#else - load_submodule_mphase("pygame._sdl2", PyInit_controller_old(), spec, - "controller_old"); -#endif - load_submodule_mphase("pygame._sdl2", PyInit_audio(), spec, "audio"); - load_submodule_mphase("pygame._sdl2", PyInit_video(), spec, "video"); - - Py_RETURN_NONE; -} - -static PyMethodDef mod_pygame_static_methods[] = { - {"import_cython", (PyCFunction)mod_pygame_import_cython, METH_O, - "pygame._sdl2.sdl2"}, - {NULL, NULL, 0, NULL}}; - -static struct PyModuleDef mod_pygame_static = {PyModuleDef_HEAD_INIT, - "pygame_static", NULL, -1, - mod_pygame_static_methods}; - -PyMODINIT_FUNC -PyInit_pygame_static() -{ - // cannot fail here, and font_initialized is already set to 1 in font.c . - TTF_Init(); - - // for correct input in wasm worker - SDL_SetHint("SDL_EMSCRIPTEN_KEYBOARD_ELEMENT", "1"); - - load_submodule("pygame", PyInit_base(), "base"); - - // - load_submodule("pygame", PyInit_constants(), "constants"); - // - load_submodule("pygame", PyInit_pg_math(), "math"); - - // base, pygame.colordict - load_submodule("pygame", PyInit_color(), "color"); - - // base - load_submodule("pygame", PyInit_rect(), "rect"); - - // base, rect - load_submodule("pygame", PyInit_geometry(), "geometry"); - - load_submodule("pygame", PyInit_bufferproxy(), "bufferproxy"); - load_submodule("pygame", PyInit_surflock(), "surflock"); - - // base, color, rect, bufferproxy, surflock - load_submodule("pygame", PyInit_surface(), "surface"); - - load_submodule("pygame", PyInit_rwobject(), "rwobject"); - - // base, color, rect, bufferproxy, surflock, surface, rwobject - load_submodule("pygame", PyInit_imageext(), "imageext"); - // base, color, rect, bufferproxy, surflock, surface, rwobject - load_submodule("pygame", PyInit_image(), "image"); - - load_submodule("pygame", PyInit__freetype(), "_freetype"); - load_submodule("pygame", PyInit_font(), "font"); - load_submodule("pygame", PyInit_pixelcopy(), "pixelcopy"); - load_submodule("pygame", PyInit_newbuffer(), "newbuffer"); - - // base - load_submodule("pygame", PyInit_joystick(), "joystick"); - // base, joystick - load_submodule("pygame", PyInit_event(), "event"); - - // base, rect, event - load_submodule("pygame", PyInit_key(), "key"); - // base, event - load_submodule("pygame", PyInit_pg_time(), "time"); - - load_submodule("pygame", PyInit_transform(), "transform"); - load_submodule("pygame", PyInit_draw(), "draw"); - - load_submodule("pygame", PyInit_mask(), "mask"); - load_submodule("pygame", PyInit_mouse(), "mouse"); - - load_submodule("pygame", PyInit_pg_mixer(), "mixer"); - load_submodule("pygame.mixer", PyInit_mixer_music(), "music"); - - // base, color, rect, bufferproxy, surflock, surface - load_submodule("pygame", PyInit_window(), "window"); - - // base, color, rect, surflock, surface, window - load_submodule("pygame", PyInit_display(), "display"); - load_submodule("pygame", PyInit__render(), "_render"); - - load_submodule("pygame", PyInit_pixelarray(), "pixelarray"); - - // base, color, rect, bufferproxy, surflock, surface - load_submodule("pygame", PyInit_gfxdraw(), "gfxdraw"); - - load_submodule("pygame", PyInit_system(), "system"); - - return PyModule_Create(&mod_pygame_static); -} - -#endif // defined(BUILD_STATIC) - -#include "base.c" - -#include "rect.c" -#include "pgcompat_rect.c" - -#undef pgSurface_Lock -#undef pgSurface_Unlock -#undef pgSurface_LockBy -#undef pgSurface_UnlockBy -#undef pgSurface_Prep -#undef pgSurface_Unprep - -#include "surflock.c" - -#undef pgColor_New -#undef pgColor_NewLength -#undef pg_RGBAFromObjEx -#undef pg_MappedColorFromObj -#undef pgColor_Type - -#include "color.c" - -#undef pgBufferProxy_New - -#include "bufferproxy.c" - -#undef pgSurface_Blit -#undef pgSurface_New -#undef pgSurface_Type -#undef pgSurface_SetSurface - -#include "surface.c" -#include "simd_blitters_avx2.c" -#include "simd_blitters_sse2.c" - -#include "window.c" - -#undef pgVidInfo_Type -#undef pgVidInfo_New - -#include "display.c" - -#include "draw.c" - -#undef pg_EncodeString -#undef pg_EncodeFilePath -#undef pgRWops_IsFileObject -#undef pgRWops_GetFileExtension -#undef pgRWops_FromFileObject -#undef pgRWops_FromObject - -#include "rwobject.c" - -#define pgSurface_New(surface) (pgSurfaceObject *)pgSurface_New2((surface), 1) -#include "render.c" -#include "image.c" - -#include "imageext.c" - -#include "mask.c" - -#undef pg_EnableKeyRepeat -#undef pg_GetKeyRepeat -#undef pgEvent_FillUserEvent -#undef pgEvent_Type -#undef pgEvent_New - -#include "joystick.c" - -#include "event.c" - -#include "mouse.c" - -#include "key.c" - -#include "time.c" - -#include "system.c" -#include "geometry.c" - -#include "_freetype.c" -#include "freetype/ft_wrap.c" -#include "freetype/ft_render.c" -#include "freetype/ft_render_cb.c" -#include "freetype/ft_cache.c" -#include "freetype/ft_layout.c" -#include "freetype/ft_unicode.c" - -#include "font.c" - -#include "mixer.c" - -#include "music.c" - -#include "gfxdraw.c" - -#include "alphablit.c" - -#include "surface_fill.c" -#include "pixelarray.c" -#include "pixelcopy.c" -#include "newbuffer.c" - -#include "_sdl2/controller.c" -#include "_sdl2/controller_old.c" -#include "_sdl2/touch.c" -#include "transform.c" -// that remove some warnings -#undef MAX -#undef MIN -#include "scale2x.c" diff --git a/src_c/surface.h b/src_c/surface.h index fb8ac2ede3..48512bc9d7 100644 --- a/src_c/surface.h +++ b/src_c/surface.h @@ -36,7 +36,7 @@ #endif #include "pygame.h" - +#if !defined(BUILD_STATIC) /* Blend modes */ #define PYGAME_BLEND_ADD 0x1 #define PYGAME_BLEND_SUB 0x2 @@ -57,7 +57,7 @@ #define PYGAME_BLEND_RGBA_MAX 0x10 #define PYGAME_BLEND_PREMULTIPLIED 0x11 #define PYGAME_BLEND_ALPHA_SDL2 0x12 - +#endif #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16)) #else diff --git a/src_py/__init__.py b/src_py/__init__.py index ccfe90b597..94b759add5 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -107,23 +107,13 @@ def warn(self): # mixing single phase (C) and multiphase modules (cython) if sys.platform in ("wasi", "emscripten"): try: - import pygame_static + import pygame.base as pygame_static except ModuleNotFoundError: pygame_static = None if pygame_static: pygame = sys.modules[__name__] - # pygame.Color = pygame.color.Color - - # Vector2 = pygame.math.Vector2 - # Vector3 = pygame.math.Vector3 - # Rect = pygame.rect.Rect - # BufferProxy = pygame.bufferproxy.BufferProxy - - # for pygame.surface.Surface type in sprite.py ? - # surface = sys.modules["pygame.surface"] - # cython modules use multiphase initialisation when not in builtin Inittab. from pygame import _sdl2 From da7830795d72a8e63eeeac8ad21a6807221d1953 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sun, 3 Aug 2025 23:49:29 +0300 Subject: [PATCH 371/441] implement the __bytes__ method and add a test case --- src_c/color.c | 15 +++++++++++++++ test/color_test.py | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/src_c/color.c b/src_c/color.c index 694a7853d9..f157956c46 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -181,6 +181,9 @@ _color_int(pgColorObject *); static PyObject * _color_float(pgColorObject *); +static PyObject * +_color_bytes(pgColorObject *); + /* Sequence protocol methods */ static Py_ssize_t _color_length(pgColorObject *); @@ -256,6 +259,8 @@ static PyMethodDef _color_methods[] = { {"premul_alpha", (PyCFunction)_premul_alpha, METH_NOARGS, DOC_COLOR_PREMULALPHA}, {"update", (PyCFunction)_color_update, METH_FASTCALL, DOC_COLOR_UPDATE}, + {"__bytes__", (PyCFunction)_color_bytes, METH_NOARGS, + "Get a byte representation of the color"}, {NULL, NULL, 0, NULL}}; /** @@ -1753,6 +1758,16 @@ _color_float(pgColorObject *color) return PyFloat_FromDouble((double)tmp); } +/** + * bytes(color) + */ +static PyObject * +_color_bytes(pgColorObject *color) +{ + return PyBytes_FromFormat("%c%c%c%c", color->data[0], color->data[1], + color->data[2], color->data[3]); +} + /* Sequence protocol methods */ /** diff --git a/test/color_test.py b/test/color_test.py index addb2d6591..5662ef0a43 100644 --- a/test/color_test.py +++ b/test/color_test.py @@ -773,6 +773,17 @@ def test_long(self): self.assertEqual(c.a, 146) self.assertEqual(int(c), int(0x33727592)) + def test_bytes(self): + c = pygame.Color(0x00012345) + self.assertEqual(c.r, 0x00) + self.assertEqual(c.g, 0x01) + self.assertEqual(c.b, 0x23) + self.assertEqual(c.a, 0x45) + + as_bytes = bytes(c) + self.assertEqual(as_bytes, bytes([0x00, 0x01, 0x23, 0x45])) + self.assertEqual(len(as_bytes), 4) + def test_from_cmy(self): cmy = pygame.Color.from_cmy(0.5, 0.5, 0.5) cmy_tuple = pygame.Color.from_cmy((0.5, 0.5, 0.5)) From e0bf78a1e2a2eae6862b772b81c75286f38773c4 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Sun, 3 Aug 2025 23:54:34 +0300 Subject: [PATCH 372/441] add Color.__bytes__ to the stubs --- buildconfig/stubs/pygame/color.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/buildconfig/stubs/pygame/color.pyi b/buildconfig/stubs/pygame/color.pyi index 10980f347c..fc2fb489fb 100644 --- a/buildconfig/stubs/pygame/color.pyi +++ b/buildconfig/stubs/pygame/color.pyi @@ -42,6 +42,7 @@ class Color(Collection[int]): def __mod__(self, other: Color) -> Color: ... def __int__(self) -> int: ... def __float__(self) -> float: ... + def __bytes__(self) -> bytes: ... def __len__(self) -> int: ... def __index__(self) -> int: ... def __invert__(self) -> Color: ... From bfd014733b6a377e0f88d4e928fea16b582d1b3a Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 3 Aug 2025 22:54:17 -0700 Subject: [PATCH 373/441] Fix font test segfault on SDL3 --- src_c/font.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src_c/font.c b/src_c/font.c index 3f46279511..11b7b20530 100644 --- a/src_c/font.c +++ b/src_c/font.c @@ -1210,6 +1210,17 @@ font_dealloc(PyFontObject *self) { TTF_Font *font = PyFont_AsFont(self); if (font && font_initialized) { + // In SDL3_ttf, it seems that closing a font after its library was + // destroyed segfaults. So only close if same generation. + // TODO SDL3: + // TTF docs say "A well-written program should call TTF_CloseFont() + // on any open fonts before calling this function!" +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (self->ttf_init_generation == current_ttf_generation) { + TTF_CloseFont(font); + } + self->font = NULL; +#else if (self->ttf_init_generation != current_ttf_generation) { // Since TTF_Font is a private structure // it's impossible to access face field in a common way. @@ -1218,6 +1229,7 @@ font_dealloc(PyFontObject *self) } TTF_CloseFont(font); self->font = NULL; +#endif } if (self->weakreflist) { From eeec672f4749fb04e3068e7cc53da4151aaa9619 Mon Sep 17 00:00:00 2001 From: Ankith Date: Mon, 4 Aug 2025 12:52:01 +0530 Subject: [PATCH 374/441] Fix rwops and some image stuff on SDL3 --- src_c/image.c | 8 ++++++++ src_c/imageext.c | 12 ++++++++++-- src_c/rwobject.c | 9 ++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src_c/image.c b/src_c/image.c index 1de25f8dda..74f5d60299 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -197,10 +197,14 @@ image_save(PyObject *self, PyObject *arg, PyObject *kwarg) SDL_RWops *rw = pgRWops_FromFileObject(obj); if (rw != NULL) { if (!strcasecmp(ext, "bmp")) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = (SDL_SaveBMP_IO(surf, rw, 0) ? 0 : -1); +#else /* The SDL documentation didn't specify which negative * number is returned upon error. We want to be sure that * result is either 0 or -1: */ result = (SDL_SaveBMP_RW(surf, rw, 0) == 0 ? 0 : -1); +#endif } else { result = SaveTGA_RW(surf, rw, 1); @@ -213,10 +217,14 @@ image_save(PyObject *self, PyObject *arg, PyObject *kwarg) else { if (!strcasecmp(ext, "bmp")) { Py_BEGIN_ALLOW_THREADS; +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = (SDL_SaveBMP(surf, name) ? 0 : -1); +#else /* The SDL documentation didn't specify which negative number * is returned upon error. We want to be sure that result is * either 0 or -1: */ result = (SDL_SaveBMP(surf, name) == 0 ? 0 : -1); +#endif Py_END_ALLOW_THREADS; } else { diff --git a/src_c/imageext.c b/src_c/imageext.c index b13a6859c7..3ab183a2df 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -333,26 +333,34 @@ image_save_ext(PyObject *self, PyObject *arg, PyObject *kwarg) if (!strcasecmp(ext, "jpeg") || !strcasecmp(ext, "jpg")) { if (rw != NULL) { #if SDL_VERSION_ATLEAST(3, 0, 0) - result = IMG_SaveJPG_IO(surf, rw, 0, JPEG_QUALITY); + result = IMG_SaveJPG_IO(surf, rw, 0, JPEG_QUALITY) ? 0 : -1; #else result = IMG_SaveJPG_RW(surf, rw, 0, JPEG_QUALITY); #endif } else { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = IMG_SaveJPG(surf, name, JPEG_QUALITY) ? 0 : -1; +#else result = IMG_SaveJPG(surf, name, JPEG_QUALITY); +#endif } } else if (!strcasecmp(ext, "png")) { /*Py_BEGIN_ALLOW_THREADS; */ if (rw != NULL) { #if SDL_VERSION_ATLEAST(3, 0, 0) - result = IMG_SavePNG_IO(surf, rw, 0); + result = IMG_SavePNG_IO(surf, rw, 0) ? 0 : -1; #else result = IMG_SavePNG_RW(surf, rw, 0); #endif } else { +#if SDL_VERSION_ATLEAST(3, 0, 0) + result = IMG_SavePNG(surf, name) ? 0 : -1; +#else result = IMG_SavePNG(surf, name); +#endif } /*Py_END_ALLOW_THREADS; */ } diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 61e05b9428..1a47d32738 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -500,6 +500,7 @@ pgRWops_FromFileObject(PyObject *obj) #if SDL_VERSION_ATLEAST(3, 0, 0) SDL_IOStreamInterface iface; + SDL_INIT_INTERFACE(&iface); iface.size = _pg_rw_size; iface.seek = _pg_rw_seek; iface.read = _pg_rw_read; @@ -513,24 +514,26 @@ pgRWops_FromFileObject(PyObject *obj) rw = SDL_OpenIO(&iface, helper); if (rw == NULL) { iface.close(helper); - PyMem_Free(helper); return (SDL_RWops *)RAISE(PyExc_IOError, SDL_GetError()); } SDL_PropertiesID props = SDL_GetIOProperties(rw); if (!props) { - PyMem_Free(helper); + iface.close(helper); return (SDL_RWops *)RAISE(PyExc_IOError, SDL_GetError()); } if (!SDL_SetBooleanProperty(props, "_pygame_is_file_object", 1)) { - PyMem_Free(helper); + iface.close(helper); return (SDL_RWops *)RAISE(PyExc_IOError, SDL_GetError()); } #else rw = SDL_AllocRW(); if (rw == NULL) { + /* TODO: here member attributes of helper are getting leaked and close + * isn't being called. Refactor to use _pg_rw_close logic on helper + * here */ PyMem_Free(helper); return (SDL_RWops *)PyErr_NoMemory(); } From 8ffdf3fd4e56aa6a7bf5df58e0f8d1df2341c0a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 09:08:11 +0000 Subject: [PATCH 375/441] Bump docker/metadata-action from 5.7.0 to 5.8.0 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5.7.0 to 5.8.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/902fa8ec7d6ecbf8d84d538b9b233a880e428804...c1e51972afc2121e065aed6d45c65596fe445f3f) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-version: 5.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index ce7d93edcc..866bb778fe 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -49,7 +49,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f with: images: ghcr.io/${{ github.repository }}_${{ matrix.arch }} tags: type=raw,value=${{ hashFiles('buildconfig/manylinux-build/**') }} From 44b1d292f3188b81fc393282c0e7289208a43c77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 09:08:19 +0000 Subject: [PATCH 376/441] Bump pypa/cibuildwheel from 3.1.1 to 3.1.3 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.1.1 to 3.1.3. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v3.1.1...v3.1.3) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.1.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index d4585be9c6..8c1b007932 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -118,7 +118,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.1.1 + uses: pypa/cibuildwheel@v3.1.3 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index ce7d93edcc..350fa4161a 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -74,7 +74,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v3.1.1 + uses: pypa/cibuildwheel@v3.1.3 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index da7667d929..80a0a45732 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -43,7 +43,7 @@ jobs: version: "0.5.26" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.1.1 + uses: pypa/cibuildwheel@v3.1.3 - uses: actions/upload-artifact@v4 with: From a6acbe6b6b8ac4641b8208b34c668a5aec9be385 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Thu, 7 Aug 2025 02:15:19 +0300 Subject: [PATCH 377/441] Update src_c/color.c Co-authored-by: Ankith --- src_c/color.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_c/color.c b/src_c/color.c index f157956c46..7c86ac7253 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -1764,8 +1764,7 @@ _color_float(pgColorObject *color) static PyObject * _color_bytes(pgColorObject *color) { - return PyBytes_FromFormat("%c%c%c%c", color->data[0], color->data[1], - color->data[2], color->data[3]); + return PyBytes_FromStringAndSize((char *)color->data, 4); } /* Sequence protocol methods */ From ae96a239c01952ac635969db35b83809240de13f Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Thu, 7 Aug 2025 02:33:40 +0300 Subject: [PATCH 378/441] add comment clarifying why the magic dunder is defined as part of methods (as opposed to through a special struct slot) --- src_c/color.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src_c/color.c b/src_c/color.c index 7c86ac7253..83908ebc90 100644 --- a/src_c/color.c +++ b/src_c/color.c @@ -259,8 +259,17 @@ static PyMethodDef _color_methods[] = { {"premul_alpha", (PyCFunction)_premul_alpha, METH_NOARGS, DOC_COLOR_PREMULALPHA}, {"update", (PyCFunction)_color_update, METH_FASTCALL, DOC_COLOR_UPDATE}, + + /** + * While object.__bytes__(self) is listed in the Data Model reference (see: + * https://docs.python.org/3/reference/datamodel.html#object.__bytes__) it + * does not appear to have a PyTypeObject struct analog (see: + * https://docs.python.org/3/c-api/typeobj.html), so we declare it for the + * type as any other custom method. + */ {"__bytes__", (PyCFunction)_color_bytes, METH_NOARGS, "Get a byte representation of the color"}, + {NULL, NULL, 0, NULL}}; /** From 68e8f05c64d6b7b4cde5534ca2aee329b57d9728 Mon Sep 17 00:00:00 2001 From: Matiiss <83066658+Matiiss@users.noreply.github.com> Date: Thu, 7 Aug 2025 02:53:09 +0300 Subject: [PATCH 379/441] add a versionchanged note --- docs/reST/ref/color.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/reST/ref/color.rst b/docs/reST/ref/color.rst index 05effd8888..114559ebba 100644 --- a/docs/reST/ref/color.rst +++ b/docs/reST/ref/color.rst @@ -92,6 +92,11 @@ :returns: a newly created :class:`Color` object :rtype: Color + .. versionchanged:: 2.5.6 + ``bytes(Color(...))`` (assuming `bytes `_ is + the built-in type) now returns a ``bytes`` object (of length 4) with the RGBA values of the color, + as opposed to :class:`Color` being interpreted as an integer (think ``int(Color(...))``) causing it + to return a ``bytes`` object filled with 0s the length of said integer. .. versionchangedold:: 2.0.0 Support for tuples, lists, and :class:`Color` objects when creating :class:`Color` objects. From 94370b6278824f1b95ec4384e0f09cd26628ed67 Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Thu, 7 Aug 2025 18:29:25 -0500 Subject: [PATCH 380/441] Update python versions in `run-ubuntu-checks` workflow, and fix faulty refcounting in rect clipline (#3548) * Updated patch versions of 3.9 and 3.13 in run-ubuntu-checks and added 3.14.0rc1 * Removed faulty xdecref for rect/frect * Re-added XDECREF in rect clipline, but decref'ing the correct object --- .github/workflows/run-ubuntu-checks.yml | 5 +++-- src_c/rect_impl.h | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index a428955efd..14878830b5 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -53,8 +53,9 @@ jobs: os: [ ubuntu-24.04 ] # check our min python (minor) version and our max python (minor) version python: [ - 3.9.21, - 3.13.1 + 3.9.23, + 3.13.5, + 3.14.0rc1 ] env: diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index 8bb5379258..adfcb7e61e 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -1869,6 +1869,7 @@ RectExport_clip(RectObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * RectExport_clipline(RectObject *self, PyObject *const *args, Py_ssize_t nargs) { + PyObject *outer_rect = NULL; InnerRect *rect = &self->r, *rect_copy = NULL; PrimitiveType x1, y1, x2, y2; @@ -1918,7 +1919,8 @@ RectExport_clipline(RectObject *self, PyObject *const *args, Py_ssize_t nargs) if ((self->r.w < 0) || (self->r.h < 0)) { /* Make a copy of the rect so it can be normalized. */ - rect_copy = &pgRectAsRect(RectExport_RectNew(&self->r)); + outer_rect = RectExport_RectNew(&self->r); + rect_copy = &pgRectAsRect(outer_rect); if (rect_copy == NULL) { return RAISE(PyExc_MemoryError, "cannot allocate memory for rect"); @@ -1929,11 +1931,11 @@ RectExport_clipline(RectObject *self, PyObject *const *args, Py_ssize_t nargs) } if (!RectImport_IntersectRectAndLine(rect, &x1, &y1, &x2, &y2)) { - Py_XDECREF(rect_copy); + Py_XDECREF(outer_rect); return PyTuple_New(0); } - Py_XDECREF(rect_copy); + Py_XDECREF(outer_rect); PyObject *subtup1, *subtup2; subtup1 = TupleFromTwoPrimitives(x1, y1); From 3d892c1da2a0447eea2c49efdb00ade271ce53a9 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 9 Aug 2025 09:04:57 -0500 Subject: [PATCH 381/441] Updated support prompt to indicate free-threaded builds, and GIL status on free-threaded builds --- src_py/__init__.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index 94b759add5..bc2bfaabc3 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -399,9 +399,20 @@ def __color_reduce(c): copyreg.pickle(Color, __color_reduce, __color_constructor) if "PYGAME_HIDE_SUPPORT_PROMPT" not in os.environ: + python_implementation = sys.version + python_version = platform.python_version() + from packaging import version + + if ( + sys.platform not in ("wasi", "wasm") + and (version.parse(python_version) >= version.parse("3.13.0")) + and "free-threading" in python_implementation + ): + python_version += f"t, {'' if sys._is_gil_enabled() else 'No '}GIL" + print( f"pygame-ce {ver} (SDL {'.'.join(map(str, get_sdl_version()))}, " - f"Python {platform.python_version()})" + f"Python {python_version})" ) # cleanup namespace From 99715767ebf7e324f8dbc3d1ecedb3ce3bebae9f Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 9 Aug 2025 09:17:27 -0500 Subject: [PATCH 382/441] Use sys.version_info instead of packaging.version because packaging.version would require a bunch of CI updates --- src_py/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index bc2bfaabc3..68a09ae953 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -401,11 +401,10 @@ def __color_reduce(c): if "PYGAME_HIDE_SUPPORT_PROMPT" not in os.environ: python_implementation = sys.version python_version = platform.python_version() - from packaging import version if ( sys.platform not in ("wasi", "wasm") - and (version.parse(python_version) >= version.parse("3.13.0")) + and (sys.version_info >= (3, 13, 0)) and "free-threading" in python_implementation ): python_version += f"t, {'' if sys._is_gil_enabled() else 'No '}GIL" From e358e7787f39b9d17246c1036b124fade698409b Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sat, 9 Aug 2025 09:23:02 -0500 Subject: [PATCH 383/441] Clean up local variables to make stubtest happy --- src_py/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src_py/__init__.py b/src_py/__init__.py index 68a09ae953..cac687a61d 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -413,6 +413,7 @@ def __color_reduce(c): f"pygame-ce {ver} (SDL {'.'.join(map(str, get_sdl_version()))}, " f"Python {python_version})" ) + del python_version, python_implementation # cleanup namespace del pygame, os, sys, platform, MissingModule, copyreg, packager_imports From e9382dfe1902abec3f4a571097c454b780c0526a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:39:19 +0000 Subject: [PATCH 384/441] Bump actions/download-artifact from 4 to 5 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-debian-multiarch.yml | 2 +- .github/workflows/release-gh-draft.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian-multiarch.yml b/.github/workflows/build-debian-multiarch.yml index 927b5f841b..86becb6188 100644 --- a/.github/workflows/build-debian-multiarch.yml +++ b/.github/workflows/build-debian-multiarch.yml @@ -121,7 +121,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Download all multiarch artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: pygame-multiarch-armv7-dist path: ~/artifacts diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index 51c22ac642..2f0788282f 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Download all artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: path: pygame-wheels merge-multiple: true From d717d4a7b060d5bd98ab55c200711146177d96e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:47:42 +0000 Subject: [PATCH 385/441] Bump actions/cache from 4.2.3 to 4.2.4 Bumps [actions/cache](https://github.com/actions/cache) from 4.2.3 to 4.2.4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4.2.3...v4.2.4) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.2.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 6 +++--- .github/workflows/run-ubuntu-checks.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 8c1b007932..f6059b1d11 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -32,7 +32,7 @@ jobs: - name: Test for Mac Deps cache hit id: macdep-cache - uses: actions/cache@v4.2.3 + uses: actions/cache@v4.2.4 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} # The hash of all files in buildconfig manylinux-build and macdependencies is @@ -99,14 +99,14 @@ jobs: - uses: actions/checkout@v4.2.2 - name: pip cache - uses: actions/cache@v4.2.3 + uses: actions/cache@v4.2.4 with: path: ~/Library/Caches/pip # This cache path is only right on mac key: pip-cache-${{ matrix.macarch }}-${{ matrix.os }} - name: Fetch Mac deps id: macdep-cache - uses: actions/cache@v4.2.3 + uses: actions/cache@v4.2.4 with: path: ${{ github.workspace }}/pygame_mac_deps_${{ matrix.macarch }} key: macdep-${{ hashFiles('buildconfig/manylinux-build/**') }}-${{ hashFiles('buildconfig/macdependencies/*.sh') }}-${{ matrix.macarch }} diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index 14878830b5..a1c09fc9e5 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -88,7 +88,7 @@ jobs: - name: Cache debug python build id: cache-python - uses: actions/cache@v4.2.3 + uses: actions/cache@v4.2.4 with: key: ${{ matrix.python }} path: ~/.pyenv/versions/${{ matrix.python }}-debug/** From 1c4e6fa1d9d36503c920f087c88b2cd0e9d4bd0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:27:26 +0000 Subject: [PATCH 386/441] Bump docker/login-action from 3.4.0 to 3.5.0 Bumps [docker/login-action](https://github.com/docker/login-action) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/74a5d142397b4f367a81961eba4e8cd7edddf772...184bdaa0721073962dff0199f1fb9940f07167d1) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build-manylinux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index cf42f6d1ed..04e0088754 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -36,7 +36,7 @@ jobs: - uses: actions/checkout@v4.2.2 - name: Log in to the Container registry - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 with: registry: ghcr.io username: ${{ github.actor }} From d6ed697b24204f360f99fdb4b621b4c145e8a40e Mon Sep 17 00:00:00 2001 From: Michael Lamertz <34611868+DickerDackel@users.noreply.github.com> Date: Sun, 17 Aug 2025 08:27:47 +0200 Subject: [PATCH 387/441] Add Renderer.logical_to_window and Renderer.window_to_logical from SDL2 (#3519) * Add logical_to_window and window_to_logical from SDL2 See https://wiki.libsdl.org/SDL2/SDL_RenderLogicalToWindow and https://wiki.libsdl.org/SDL2/SDL_RenderWindowToLogical When setting renderer.logical_size, these two functions offer translation between window space and logical space. * Stubs added, return type of window_to_logical fixed * Fix devcheck by running `dev.py format` * Fix MS build that as warnings -> errors * Try to fix stubs... * tuple instead of *args, SDL3 migration guide follow Both functions now expect a tuple, following the pygame conventions. For SDL3, the ported functions have been renamed and changed. > SDL_RenderWindowToLogical() and SDL_RenderLogicalToWindow() have been > renamed SDL_RenderCoordinatesFromWindow() and > SDL_RenderCoordinatesToWindow() and take floating point coordinates in > both directions. I settled on the following decisions * Regardless of the difference in the windows coordinates being ints in the old, and floats in the new version, I just aliased the new names to the old functions on the python side. * Even on SDL3, the window coordinates will be truncated to int to guarantee future compatibility with old code. * Accept and return floats everywhere, sdl3 aliases removed * double, not float! * Wording of error messages follows review suggestion * modified test according to review * dev.py format * logical_to_window and window_to_logical for _sdl2.video * versionadded added * Moved to SDL3 function names as discussed --- buildconfig/stubs/pygame/_render.pyi | 2 + buildconfig/stubs/pygame/_sdl2/video.pyi | 2 + docs/reST/ref/sdl2_video.rst | 19 ++++++++ src_c/cython/pygame/_sdl2/video.pxd | 16 +++++++ src_c/cython/pygame/_sdl2/video.pyx | 29 +++++++++++ src_c/doc/sdl2_video_doc.h | 2 + src_c/render.c | 61 ++++++++++++++++++++++++ test/render_test.py | 9 ++++ test/video_test.py | 12 +++++ 9 files changed, 152 insertions(+) diff --git a/buildconfig/stubs/pygame/_render.pyi b/buildconfig/stubs/pygame/_render.pyi index b5eb1c6d68..155e0786de 100644 --- a/buildconfig/stubs/pygame/_render.pyi +++ b/buildconfig/stubs/pygame/_render.pyi @@ -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 coordinates_to_window(self, point: Point) -> tuple[float, float]: ... + def coordinates_from_window(self, point: Point) -> tuple[float, float]: ... def present(self) -> None: ... def set_viewport(self, area: Optional[RectLike]) -> None: ... def to_surface( diff --git a/buildconfig/stubs/pygame/_sdl2/video.pyi b/buildconfig/stubs/pygame/_sdl2/video.pyi index e9ce224759..540f139ddc 100644 --- a/buildconfig/stubs/pygame/_sdl2/video.pyi +++ b/buildconfig/stubs/pygame/_sdl2/video.pyi @@ -146,6 +146,8 @@ class Renderer: def get_viewport(self) -> Rect: ... def set_viewport(self, area: Optional[RectLike]) -> None: ... logical_size: Iterable[int] + def coordinates_to_window(self, point: Point) -> tuple[float, float]: ... + def coordinates_from_window(self, point: Point) -> tuple[float, float]: ... scale: Iterable[float] target: Optional[Texture] def blit( diff --git a/docs/reST/ref/sdl2_video.rst b/docs/reST/ref/sdl2_video.rst index b1ccee1db1..42f53e0018 100644 --- a/docs/reST/ref/sdl2_video.rst +++ b/docs/reST/ref/sdl2_video.rst @@ -428,6 +428,25 @@ drawing area on the target, or ``None`` to use the entire area of the current rendering target. + .. method:: coordinates_to_window + + | :sl:`Translates renderer coordinates to window coordinates` + | :sg:`coordinates_to_window(point) -> (float, float)` + + :param point: The coordinates in render space. + + .. versionadded:: 2.5.6 + + + .. method:: coordinates_from_window + + | :sl:`Translates window coordinates to renderer coordinates` + | :sg:`coordinates_from_window(point) -> (float, float)` + + :param point: The coordinates in window space. + + .. versionadded:: 2.5.6 + .. method:: blit | :sl:`Draw textures using a Surface-like API` diff --git a/src_c/cython/pygame/_sdl2/video.pxd b/src_c/cython/pygame/_sdl2/video.pxd index 1d87ba43b2..1fe2fc6354 100644 --- a/src_c/cython/pygame/_sdl2/video.pxd +++ b/src_c/cython/pygame/_sdl2/video.pxd @@ -369,6 +369,8 @@ cdef extern from "SDL.h" nogil: # https://wiki.libsdl.org/SDL_RenderSetLogicalSize # https://wiki.libsdl.org/SDL_RenderGetLogicalSize # https://wiki.libsdl.org/SDL_RenderGetIntegerScale + # https://wiki.libsdl.org/SDL2/SDL_RenderLogicalToWindow + # https://wiki.libsdl.org/SDL2/SDL_RenderWindowToLogical int SDL_RenderSetScale(SDL_Renderer* renderer, float scaleX, float scaleY) @@ -382,6 +384,20 @@ cdef extern from "SDL.h" nogil: int* w, int* h) int SDL_RenderGetIntegerScale(SDL_Renderer* renderer) + # Note: Must be changed to SDL_RenderCoordinatesToWindow for SDL3 + # https://wiki.libsdl.org/SDL3/SDL_RenderCoordinatesToWindow + void SDL_RenderLogicalToWindow(SDL_Renderer* renderer, + float lx, + float ly, + int *wx, + int *wy); + # Note: Must be changed to SDL_RenderCoordinatesFromWindow for SDL3 + # https://wiki.libsdl.org/SDL3/SDL_RenderCoordinatesFromWindow + void SDL_RenderWindowToLogical(SDL_Renderer* renderer, + int wx, + int wy, + float *lx, + float *ly); int SDL_VERSION_ATLEAST(int major, int minor, int patch) diff --git a/src_c/cython/pygame/_sdl2/video.pyx b/src_c/cython/pygame/_sdl2/video.pyx index af8ea28e1e..0f051a6a17 100644 --- a/src_c/cython/pygame/_sdl2/video.pyx +++ b/src_c/cython/pygame/_sdl2/video.pyx @@ -1037,6 +1037,35 @@ cdef class Renderer: if res < 0: raise error() + def coordinates_to_window(self, point): + """Translates renderer coordinates to window coordinates + + :param point: The coordinates in render space. + """ + cdef int wx + cdef int wy + + # Note: Must be changed to SDL_RenderCoordinatesToWindow for SDL3 + # https://wiki.libsdl.org/SDL3/SDL_RenderCoordinatesToWindow + SDL_RenderLogicalToWindow(self._renderer, point[0], point[1], &wx, &wy); + + # Return float for future compatibility with SDL3's RenderCoordinatesToWindow + return (float(wx), float(wy)) + + def coordinates_from_window(self, point): + """Translates window coordinates to renderer coordinates + + :param point: The coordinates in window space. + """ + cdef float lx + cdef float ly + + # Note: Must be changed to SDL_RenderCoordinatesFromWindow for SDL3 + # https://wiki.libsdl.org/SDL3/SDL_RenderCoordinatesFromWindow + SDL_RenderWindowToLogical(self._renderer, point[0], point[1], &lx, &ly); + + return (lx, ly) + def draw_point(self, point): """Draw a point diff --git a/src_c/doc/sdl2_video_doc.h b/src_c/doc/sdl2_video_doc.h index 8ca553bdfc..ce7d0c7696 100644 --- a/src_c/doc/sdl2_video_doc.h +++ b/src_c/doc/sdl2_video_doc.h @@ -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_COORDINATESTOWINDOW "coordinates_to_window(point) -> (float, float)\nTranslates renderer coordinates to window coordinates" +#define DOC_SDL2_VIDEO_RENDERER_COORDINATESFROMWINDOW "coordinates_from_window(point) -> (float, float)\nTranslates window coordinates to renderer 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" diff --git a/src_c/render.c b/src_c/render.c index 5b90dd2822..d76115ecc3 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -468,6 +468,61 @@ renderer_set_logical_size(pgRendererObject *self, PyObject *arg, void *closure) return 0; } +static PyObject * +renderer_coordinates_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, + "point must be a sequence of two numbers"); + } + +#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_coordinates_from_window(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, + "point must be a sequence of two numbers"); + } + +#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) { @@ -1150,6 +1205,12 @@ 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}, + {"coordinates_to_window", (PyCFunction)renderer_coordinates_to_window, + METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_RENDERER_COORDINATESTOWINDOW}, + {"coordinates_from_window", (PyCFunction)renderer_coordinates_from_window, + METH_VARARGS | METH_KEYWORDS, + DOC_SDL2_VIDEO_RENDERER_COORDINATESFROMWINDOW}, {"compose_custom_blend_mode", (PyCFunction)renderer_compose_custom_blend_mode, METH_VARARGS | METH_KEYWORDS | METH_CLASS, diff --git a/test/render_test.py b/test/render_test.py index 55fd1b5370..3654e390aa 100644 --- a/test/render_test.py +++ b/test/render_test.py @@ -172,6 +172,15 @@ def test_logical_size(self): self.renderer.logical_size = (10, 10) self.assertEqual(self.renderer.logical_size, (10, 10)) + def test_logical_window_mapping(self): + self.renderer.logical_size = (10, 10) + self.assertEqual(self.renderer.coordinates_to_window((10, 10)), (100, 100)) + self.assertEqual(self.renderer.coordinates_from_window((100, 100)), (10, 10)) + with self.assertRaises(TypeError): + self.renderer.coordinates_to_window(42, 42) + with self.assertRaises(TypeError): + self.renderer.coordinates_from_window(42, 42) + def test_scale(self): self.assertEqual(self.renderer.scale, (1.0, 1.0)) self.renderer.scale = (0.5, 2) diff --git a/test/video_test.py b/test/video_test.py index f6876bc56c..30ee47104a 100644 --- a/test/video_test.py +++ b/test/video_test.py @@ -24,6 +24,18 @@ def test_renderer_set_viewport(self): renderer.set_viewport(rect) self.assertEqual(renderer.get_viewport(), (0, 0, 1920, 1080)) + def test_logical_window_mapping(self): + window = video.Window(title=self.default_caption, size=(100, 100)) + renderer = video.Renderer(window=window) + renderer.logical_size = (10, 10) + + self.assertEqual(renderer.coordinates_to_window((10, 10)), (100, 100)) + self.assertEqual(renderer.coordinates_from_window((100, 100)), (10, 10)) + with self.assertRaises(TypeError): + renderer.coordinates_to_window(42, 42) + with self.assertRaises(TypeError): + renderer.coordinates_from_window(42, 42) + @unittest.skipIf(IS_PYPY, "PyPy doesn't have sys.getrefcount") def test_renderer_to_surface_refcount(self): """Make sure to_surface doesn't leak memory due to reference counting.""" From 93555b18d77ef6af32f4a462961959f88735389e Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 17 Aug 2025 08:53:44 -0500 Subject: [PATCH 388/441] Swap out sys.version for sysconfig.get_config_var --- src_py/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index cac687a61d..1c3f98ba94 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -399,13 +399,14 @@ def __color_reduce(c): copyreg.pickle(Color, __color_reduce, __color_constructor) if "PYGAME_HIDE_SUPPORT_PROMPT" not in os.environ: - python_implementation = sys.version + import sysconfig + python_version = platform.python_version() if ( sys.platform not in ("wasi", "wasm") and (sys.version_info >= (3, 13, 0)) - and "free-threading" in python_implementation + and sysconfig.get_config_var("Py_GIL_DISABLED") ): python_version += f"t, {'' if sys._is_gil_enabled() else 'No '}GIL" @@ -413,7 +414,7 @@ def __color_reduce(c): f"pygame-ce {ver} (SDL {'.'.join(map(str, get_sdl_version()))}, " f"Python {python_version})" ) - del python_version, python_implementation + del python_version, sysconfig # cleanup namespace del pygame, os, sys, platform, MissingModule, copyreg, packager_imports From 621260ec1a30912ed80d9c65c64842ef4b1e72b6 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Sun, 17 Aug 2025 09:04:27 -0500 Subject: [PATCH 389/441] Oops: wasm -> emscripten --- src_py/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index 1c3f98ba94..96e3cb5907 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -404,7 +404,7 @@ def __color_reduce(c): python_version = platform.python_version() if ( - sys.platform not in ("wasi", "wasm") + sys.platform not in ("wasi", "emscripten") and (sys.version_info >= (3, 13, 0)) and sysconfig.get_config_var("Py_GIL_DISABLED") ): From 2508d15e86dd16cad8706efc01987af0c6fe0d59 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 17 Aug 2025 12:48:57 -0700 Subject: [PATCH 390/441] Fix incorrect module name in docs --- docs/reST/ref/surfarray.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/surfarray.rst b/docs/reST/ref/surfarray.rst index ee582af3e2..3cdfe61e00 100644 --- a/docs/reST/ref/surfarray.rst +++ b/docs/reST/ref/surfarray.rst @@ -35,7 +35,7 @@ pixels from the surface and any changes performed to the array will make changes in the surface. As this last functions share memory with the surface, this one will be locked during the lifetime of the array. -.. versionchanged:: 2.5.6 sndarray module is lazily loaded to avoid an expensive NumPy import when unnecessary +.. versionchanged:: 2.5.6 surfarray module is lazily loaded to avoid an expensive NumPy import when unnecessary .. function:: array2d From 48a0b8d76387c7b839138ab471d749f470dd0017 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 17 Aug 2025 13:19:29 -0700 Subject: [PATCH 391/441] Make lazy_import and MissingModule more resilient --- src_py/__init__.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index b28c9f0ed0..6b358e31bd 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -73,9 +73,13 @@ class MissingModule: def __init__(self, name, urgent=0): self.name = name - exc_type, exc_msg = sys.exc_info()[:2] - self.info = str(exc_msg) - self.reason = f"{exc_type.__name__}: {self.info}" + exc_type, exc_msg, _ = sys.exc_info() + if exc_type is not None: + self.info = str(exc_msg) + self.reason = f"{exc_type.__name__}: {self.info}" + else: + self.info = "" + self.reason = f": {self.info}" self.urgent = urgent if urgent: self.warn() @@ -315,11 +319,14 @@ def lazy_import(name): Lazily imported modules are directly referenced in packager_imports function. """ - spec = find_spec("pygame." + name) + fullname = "pygame." + name + spec = find_spec(fullname) + if spec is None or spec.loader is None: + return MissingModule(name, urgent=0) loader = LazyLoader(spec.loader) spec.loader = loader module = module_from_spec(spec) - sys.modules[spec.name] = module + sys.modules[fullname] = module loader.exec_module(module) return module From 0ef5f777ef1446c34eddc1291404b8730ee571fc Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Sun, 17 Aug 2025 13:24:02 -0700 Subject: [PATCH 392/441] Clarify packager_imports purpose --- src_py/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src_py/__init__.py b/src_py/__init__.py index 6b358e31bd..a32e2e4e7e 100644 --- a/src_py/__init__.py +++ b/src_py/__init__.py @@ -407,7 +407,11 @@ def Window(title="pygame window", size=(640, 480), position=None, **kwargs): # def packager_imports(): - """some additional imports that py2app/py2exe will want to see""" + """Some additional imports that py2app/py2exe will want to see. + + This function is never executed. + Some tools scan the source code for import statements. + """ import atexit import numpy import OpenGL.GL From 24ea0aea9de74a368584cb369b37add847b77671 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 08:38:57 +0000 Subject: [PATCH 393/441] Bump actions/checkout from 4.2.2 to 5.0.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 5.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.2.2...v5.0.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 5.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-debian-multiarch.yml | 2 +- .github/workflows/build-emsdk.yml | 2 +- .github/workflows/build-macos.yml | 4 ++-- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-on-msys2.yml | 2 +- .github/workflows/build-sdl3.yml | 2 +- .github/workflows/build-ubuntu-sdist.yml | 2 +- .github/workflows/build-windows.yml | 2 +- .github/workflows/dev-check.yml | 2 +- .github/workflows/release-gh-draft.yml | 2 +- .github/workflows/release-pypi.yml | 2 +- .github/workflows/run-ubuntu-checks.yml | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-debian-multiarch.yml b/.github/workflows/build-debian-multiarch.yml index 86becb6188..4ac467f8a5 100644 --- a/.github/workflows/build-debian-multiarch.yml +++ b/.github/workflows/build-debian-multiarch.yml @@ -65,7 +65,7 @@ jobs: - { arch: armv7, base_image: 'balenalib/raspberrypi3-debian:bookworm' } steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Build sources and run tests uses: uraimo/run-on-arch-action@v3.0.1 diff --git a/.github/workflows/build-emsdk.yml b/.github/workflows/build-emsdk.yml index d61e0c5420..2163fed78f 100644 --- a/.github/workflows/build-emsdk.yml +++ b/.github/workflows/build-emsdk.yml @@ -41,7 +41,7 @@ jobs: SDKROOT: /opt/python-wasm-sdk steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Regen with latest cython (using system python3) run: | diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 3060be0c65..4ca7692bb4 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -28,7 +28,7 @@ jobs: - { macarch: x86_64, os: macos-13 } steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Test for Mac Deps cache hit id: macdep-cache @@ -96,7 +96,7 @@ jobs: CIBW_BEFORE_TEST: rm -rf ${{ github.workspace }}/pygame_mac_deps steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: pip cache uses: actions/cache@v4.2.4 diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index 04e0088754..cccf66bf39 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -33,7 +33,7 @@ jobs: CIBW_ARCHS: ${{ matrix.arch }} steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Log in to the Container registry uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 diff --git a/.github/workflows/build-on-msys2.yml b/.github/workflows/build-on-msys2.yml index 0845aefce2..d8ea2da084 100644 --- a/.github/workflows/build-on-msys2.yml +++ b/.github/workflows/build-on-msys2.yml @@ -47,7 +47,7 @@ jobs: # - { sys: clangarm64, env: clang-aarch64 } steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} diff --git a/.github/workflows/build-sdl3.yml b/.github/workflows/build-sdl3.yml index ba21795d45..0ee78442b3 100644 --- a/.github/workflows/build-sdl3.yml +++ b/.github/workflows/build-sdl3.yml @@ -52,7 +52,7 @@ jobs: PG_DEPS_FROM_SYSTEM: 1 steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Install pygame deps (linux) if: matrix.os == 'ubuntu-24.04' diff --git a/.github/workflows/build-ubuntu-sdist.yml b/.github/workflows/build-ubuntu-sdist.yml index d5123e7ede..c41a666099 100644 --- a/.github/workflows/build-ubuntu-sdist.yml +++ b/.github/workflows/build-ubuntu-sdist.yml @@ -39,7 +39,7 @@ jobs: PG_DEPS_FROM_SYSTEM: 1 steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Install deps # install numpy from pip and not apt because the one from pip is newer, diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 89bab5e159..23f02bf879 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -31,7 +31,7 @@ jobs: CIBW_ARCHS: ${{ matrix.winarch }} steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - uses: TheMrMilchmann/setup-msvc-dev@v3 # this lets us use the developer command prompt on windows with: diff --git a/.github/workflows/dev-check.yml b/.github/workflows/dev-check.yml index 83d546df84..986381f7e7 100644 --- a/.github/workflows/dev-check.yml +++ b/.github/workflows/dev-check.yml @@ -31,7 +31,7 @@ jobs: SDL_AUDIODRIVER: "disk" steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Install deps run: | diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index 2f0788282f..c0671e714e 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -26,7 +26,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Download all artifacts uses: actions/download-artifact@v5 diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index 8cbdc626ee..9e20a022d9 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -12,7 +12,7 @@ jobs: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Pull all release assets uses: robinraju/release-downloader@v1.12 diff --git a/.github/workflows/run-ubuntu-checks.yml b/.github/workflows/run-ubuntu-checks.yml index a1c09fc9e5..767749acb4 100644 --- a/.github/workflows/run-ubuntu-checks.yml +++ b/.github/workflows/run-ubuntu-checks.yml @@ -66,7 +66,7 @@ jobs: PG_DEPS_FROM_SYSTEM: 1 steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 - name: Install pygame-ce deps # https://github.com/actions/runner-images/issues/7192 @@ -135,7 +135,7 @@ jobs: needs: debug_coverage steps: - - uses: actions/checkout@v4.2.2 + - uses: actions/checkout@v5.0.0 with: fetch-depth: 0 # fetch full history From 4e1858727d9f100c343975fb52bc7d1fb5f4d0de Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Mon, 18 Aug 2025 17:08:49 -0700 Subject: [PATCH 394/441] Change unused AbstractGroup layer argument type to optional int --- buildconfig/stubs/pygame/sprite.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 992536b974..6abf1be214 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -88,7 +88,7 @@ class AbstractGroup(Generic[_SpriteT]): def __iter__(self) -> Iterator[_SpriteT]: ... def __bool__(self) -> bool: ... def __contains__(self, item: Any) -> bool: ... - def add_internal(self, sprite: _SpriteT, layer: None = None) -> None: ... + def add_internal(self, sprite: _SpriteT, layer: Optional[int] = None) -> None: ... def remove_internal(self, sprite: _SpriteT) -> None: ... def has_internal(self, sprite: _SpriteT) -> bool: ... def copy(self) -> Self: ... From a72349b33e113578653bcac42c7055ca3382f121 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Mon, 18 Aug 2025 17:10:44 -0700 Subject: [PATCH 395/441] Type sprite collide functions' callable argument `collided` return type as bool instead of Any --- buildconfig/stubs/pygame/sprite.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/sprite.pyi b/buildconfig/stubs/pygame/sprite.pyi index 6abf1be214..148c54dea2 100644 --- a/buildconfig/stubs/pygame/sprite.pyi +++ b/buildconfig/stubs/pygame/sprite.pyi @@ -196,17 +196,17 @@ def spritecollide( sprite: _HasRectT, group: AbstractGroup[_SpriteT], dokill: bool, - collided: Optional[Callable[[_HasRectT, _SpriteT], Any]] = None, + collided: Optional[Callable[[_HasRectT, _SpriteT], bool]] = None, ) -> list[_SpriteT]: ... def groupcollide( groupa: AbstractGroup[_SpriteT], groupb: AbstractGroup[_SpriteT2], dokilla: bool, dokillb: bool, - collided: Optional[Callable[[_SpriteT, _SpriteT2], Any]] = None, + collided: Optional[Callable[[_SpriteT, _SpriteT2], bool]] = None, ) -> dict[_SpriteT, list[_SpriteT2]]: ... def spritecollideany( sprite: _HasRectT, group: AbstractGroup[_SpriteT], - collided: Optional[Callable[[_HasRectT, _SpriteT], Any]] = None, + collided: Optional[Callable[[_HasRectT, _SpriteT], bool]] = None, ) -> Optional[_SpriteT]: ... From 1923011040a04fe2742dd353624f3c9e5815cdbf Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 19 Aug 2025 19:10:16 -0500 Subject: [PATCH 396/441] Add coderabbit configuration file --- .coderabbit.yaml | 181 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000000..fe253b97a2 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,181 @@ +language: en-US +tone_instructions: '' +early_access: false +enable_free_tier: true +reviews: + profile: chill + request_changes_workflow: false + high_level_summary: false + high_level_summary_placeholder: '@coderabbitai summary' + high_level_summary_in_walkthrough: false + auto_title_placeholder: '@coderabbitai' + auto_title_instructions: '' + review_status: true + commit_status: true + fail_commit_status: false + collapse_walkthrough: false + changed_files_summary: true + sequence_diagrams: true + estimate_code_review_effort: true + assess_linked_issues: true + related_issues: true + related_prs: true + suggested_labels: true + auto_apply_labels: false + suggested_reviewers: true + auto_assign_reviewers: false + poem: true + labeling_instructions: [] + path_filters: [] + path_instructions: [] + abort_on_close: true + disable_cache: false + auto_review: + enabled: true + auto_incremental_review: true + ignore_title_keywords: [] + labels: [] + drafts: false + base_branches: [] + finishing_touches: + docstrings: + enabled: true + unit_tests: + enabled: true + pre_merge_checks: + docstrings: + mode: warning + threshold: 80 + title: + mode: warning + requirements: '' + description: + mode: warning + issue_assessment: + mode: warning + tools: + ast-grep: + rule_dirs: [] + util_dirs: [] + essential_rules: true + packages: [] + shellcheck: + enabled: true + ruff: + enabled: true + markdownlint: + enabled: true + github-checks: + enabled: true + timeout_ms: 90000 + languagetool: + enabled: true + enabled_rules: [] + disabled_rules: [] + enabled_categories: [] + disabled_categories: [] + enabled_only: false + level: default + biome: + enabled: true + hadolint: + enabled: true + swiftlint: + enabled: true + phpstan: + enabled: true + level: default + phpmd: + enabled: true + phpcs: + enabled: true + golangci-lint: + enabled: true + yamllint: + enabled: true + gitleaks: + enabled: true + checkov: + enabled: true + detekt: + enabled: true + eslint: + enabled: true + flake8: + enabled: true + rubocop: + enabled: true + buf: + enabled: true + regal: + enabled: true + actionlint: + enabled: true + pmd: + enabled: true + cppcheck: + enabled: true + semgrep: + enabled: true + circleci: + enabled: true + clippy: + enabled: true + sqlfluff: + enabled: true + prismaLint: + enabled: true + pylint: + enabled: true + oxc: + enabled: true + shopifyThemeCheck: + enabled: true + luacheck: + enabled: true + brakeman: + enabled: true + dotenvLint: + enabled: true + htmlhint: + enabled: true + checkmake: + enabled: true + osvScanner: + enabled: true +chat: + art: true + auto_reply: true + integrations: + jira: + usage: auto + linear: + usage: auto +knowledge_base: + opt_out: false + web_search: + enabled: true + code_guidelines: + enabled: true + filePatterns: [] + learnings: + scope: auto + issues: + scope: auto + jira: + usage: auto + project_keys: [] + linear: + usage: auto + team_keys: [] + pull_requests: + scope: auto + mcp: + usage: auto + disabled_servers: [] +code_generation: + docstrings: + language: en-US + path_instructions: [] + unit_tests: + path_instructions: [] From a3e0de4a45f6013bcdc26d7dc7ba9aa118f6e1b3 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 19 Aug 2025 19:36:54 -0500 Subject: [PATCH 397/441] Modify coderabbit config --- .coderabbit.yaml | 55 ++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index fe253b97a2..dc8b36c004 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -24,11 +24,16 @@ reviews: auto_apply_labels: false suggested_reviewers: true auto_assign_reviewers: false - poem: true + poem: false labeling_instructions: [] - path_filters: [] + path_filters: + - '!src_c/doc/*' # autogenerated C header files + - '!src_c/freetype/*' # freetype vendored files + - '!src_c/include/pythoncapi_compat.h' # vendored python file + - '!docs/LGPL.txt' # license file + - '!docs/licenses/*' # licenses for dependencies path_instructions: [] - abort_on_close: true + abort_on_close: false disable_cache: false auto_review: enabled: true @@ -77,20 +82,20 @@ reviews: enabled_only: false level: default biome: - enabled: true + enabled: false hadolint: - enabled: true + enabled: false swiftlint: - enabled: true + enabled: false phpstan: - enabled: true + enabled: false level: default phpmd: - enabled: true + enabled: false phpcs: - enabled: true + enabled: false golangci-lint: - enabled: true + enabled: false yamllint: enabled: true gitleaks: @@ -98,47 +103,47 @@ reviews: checkov: enabled: true detekt: - enabled: true + enabled: false eslint: - enabled: true + enabled: false flake8: enabled: true rubocop: - enabled: true + enabled: false buf: - enabled: true + enabled: false regal: - enabled: true + enabled: false actionlint: enabled: true pmd: - enabled: true + enabled: false cppcheck: enabled: true semgrep: enabled: true circleci: - enabled: true + enabled: false clippy: - enabled: true + enabled: false sqlfluff: - enabled: true + enabled: false prismaLint: - enabled: true + enabled: false pylint: enabled: true oxc: - enabled: true + enabled: false shopifyThemeCheck: - enabled: true + enabled: false luacheck: - enabled: true + enabled: false brakeman: - enabled: true + enabled: false dotenvLint: enabled: true htmlhint: - enabled: true + enabled: false checkmake: enabled: true osvScanner: From 8cb271447dff4562e551c28ed81dde77a3c3ce50 Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 19 Aug 2025 20:02:17 -0500 Subject: [PATCH 398/441] Re-add walkthrough stuff and make walkthrough collapsible --- .coderabbit.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index dc8b36c004..4cb5620972 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -5,15 +5,15 @@ enable_free_tier: true reviews: profile: chill request_changes_workflow: false - high_level_summary: false + high_level_summary: true high_level_summary_placeholder: '@coderabbitai summary' - high_level_summary_in_walkthrough: false + high_level_summary_in_walkthrough: true auto_title_placeholder: '@coderabbitai' auto_title_instructions: '' review_status: true commit_status: true fail_commit_status: false - collapse_walkthrough: false + collapse_walkthrough: true changed_files_summary: true sequence_diagrams: true estimate_code_review_effort: true From b53cc491d7c0b0c942b871dfa3bdbf57c55040cc Mon Sep 17 00:00:00 2001 From: Andrew Coffey Date: Tue, 19 Aug 2025 20:30:08 -0500 Subject: [PATCH 399/441] Disable high_level_summary --- .coderabbit.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 4cb5620972..a6a903b62c 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -5,7 +5,7 @@ enable_free_tier: true reviews: profile: chill request_changes_workflow: false - high_level_summary: true + high_level_summary: false high_level_summary_placeholder: '@coderabbitai summary' high_level_summary_in_walkthrough: true auto_title_placeholder: '@coderabbitai' From 1aa9cb24b7099b996b082091c027167b5587c7ba Mon Sep 17 00:00:00 2001 From: zep Date: Wed, 20 Aug 2025 20:14:45 +0530 Subject: [PATCH 400/441] documetataion -> documentation typo fix --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 946991bedd..4ecd2274a1 100644 --- a/README.rst +++ b/README.rst @@ -155,7 +155,7 @@ How to Contribute First of all, thank you for considering contributing to pygame-ce! It's people like you that make pygame-ce a great library. Please follow these steps to get started: 1. Read the `Contribution Guidelines`_ and the `Many Ways to Contribute`_ wiki pages. -2. Read the documentataion on `Opening A Pull Request`_ and `Opening a Great Pull Request`_. +2. Read the documentation on `Opening A Pull Request`_ and `Opening a Great Pull Request`_. 3. Read how to `label and link reported issues`_. 4. Check the `issue tracker`_ for open issues that interest you or open a new issue to start a discussion about your idea. From 7e05d3f5e8efe61e4d43fa1a985af822ad21aad8 Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 5 Jun 2025 14:43:33 +0530 Subject: [PATCH 401/441] Fix ascii scrap on sdl2 backend, docs/tests fixes --- docs/reST/ref/scrap.rst | 40 +++----------- src_c/scrap_sdl2.c | 42 +++++++++++--- test/meson.build | 1 - test/scrap_tags.py | 26 --------- test/scrap_test.py | 118 +++++----------------------------------- 5 files changed, 55 insertions(+), 172 deletions(-) delete mode 100644 test/scrap_tags.py diff --git a/docs/reST/ref/scrap.rst b/docs/reST/ref/scrap.rst index e44f6e28f3..27d1cc281a 100644 --- a/docs/reST/ref/scrap.rst +++ b/docs/reST/ref/scrap.rst @@ -77,43 +77,21 @@ data (MIME) types are defined and registered: :: - pygame string - constant value description - -------------------------------------------------- - SCRAP_TEXT "text/plain" plain text - SCRAP_BMP "image/bmp" BMP encoded image data - SCRAP_PBM "image/pbm" PBM encoded image data - SCRAP_PPM "image/ppm" PPM encoded image data - -``pygame.SCRAP_PPM``, ``pygame.SCRAP_PBM`` and ``pygame.SCRAP_BMP`` are -suitable for surface buffers to be shared with other applications. -``pygame.SCRAP_TEXT`` is an alias for the plain text clipboard type. - -Depending on the platform, additional types are automatically registered when -data is placed into the clipboard to guarantee a consistent sharing behaviour -with other applications. The following listed types can be used as strings to -be passed to the respective :mod:`pygame.scrap` module functions. + "text/plain" Plain text (also accessible via the SCRAP_TEXT constant) + "text/plain;charset=utf-8" UTF-8 encoded text For **Windows** platforms, these additional types are supported automatically and resolve to their internal definitions: :: - "text/plain;charset=utf-8" UTF-8 encoded text + "image/bmp" BMP encoded image data (also accessible via the SCRAP_BMP constant) "audio/wav" WAV encoded audio "image/tiff" TIFF encoded image data -For **X11** platforms, these additional types are supported automatically and -resolve to their internal definitions: - -:: - - "text/plain;charset=utf-8" UTF-8 encoded text - "UTF8_STRING" UTF-8 encoded text - "COMPOUND_TEXT" COMPOUND text -User defined types can be used, but the data might not be accessible by other -applications unless they know what data type to look for. +User defined types can be used on **Windows**, but the data might not be +accessible by other applications unless they know what data type to look for. Example: Data placed into the clipboard by ``pygame.scrap.put("my_data_type", byte_data)`` can only be accessed by applications which query the clipboard for the ``"my_data_type"`` data type. @@ -125,9 +103,7 @@ For an example of how the scrap module works refer to the examples page .. versionaddedold:: 1.8 .. note:: - The scrap module is currently only supported for Windows, X11 and Mac OS X. - On Mac OS X only text works at the moment - other types may be supported in - future releases. + Non-text data is only supported on Windows. On other platforms only text is supported. .. function:: init @@ -221,8 +197,8 @@ For an example of how the scrap module works refer to the examples page Places data for a given clipboard type into the clipboard. The data must be a string buffer. The type is a string identifying the type of data to be placed into the clipboard. This can be one of the predefined - ``pygame.SCRAP_PBM``, ``pygame.SCRAP_PPM``, ``pygame.SCRAP_BMP`` or - ``pygame.SCRAP_TEXT`` values or a user defined string identifier. + ``pygame.SCRAP_BMP`` or ``pygame.SCRAP_TEXT`` values or a user defined + string identifier. :param string type: type identifier of the data to be placed into the clipboard diff --git a/src_c/scrap_sdl2.c b/src_c/scrap_sdl2.c index 5de1f4cdbc..754edaf1bf 100644 --- a/src_c/scrap_sdl2.c +++ b/src_c/scrap_sdl2.c @@ -8,31 +8,55 @@ #define PYGAME_SCRAP_FREE_STRING 1 -char *pygame_scrap_plaintext_type = "text/plain;charset=utf-8"; +char *pygame_scrap_plaintext_type = "text/plain"; +char *pygame_scrap_utf8text_type = "text/plain;charset=utf-8"; char **pygame_scrap_types; int pygame_scrap_contains(char *type) { - return (strcmp(type, pygame_scrap_plaintext_type) == 0) && + return (strcmp(type, pygame_scrap_plaintext_type) == 0 || + strcmp(type, pygame_scrap_utf8text_type) == 0) && SDL_HasClipboardText(); } +/* Returns 1 if str is valid ascii, 0 otherwise */ +static int +_pg_validate_ascii_str(const char *str) +{ + while (*str) { + if ((unsigned char)*str > 127) { + return 0; + } + str++; + } + return 1; +} + char * pygame_scrap_get(char *type, size_t *count) { char *retval = NULL; char *clipboard = NULL; + if (count) { + *count = 0; + } + if (!pygame_scrap_initialized()) { return RAISE(pgExc_SDLError, "scrap system not initialized."); } - if (strcmp(type, pygame_scrap_plaintext_type) == 0) { + int is_utf8 = strcmp(type, pygame_scrap_utf8text_type) == 0; + if (is_utf8 || strcmp(type, pygame_scrap_plaintext_type) == 0) { clipboard = SDL_GetClipboardText(); if (clipboard != NULL) { - *count = strlen(clipboard); - retval = strdup(clipboard); + if (is_utf8 || _pg_validate_ascii_str(clipboard)) { + if (count) { + *count = strlen(clipboard); + } + retval = strdup(clipboard); + } SDL_free(clipboard); return retval; } @@ -56,13 +80,14 @@ pygame_scrap_init(void) { SDL_Init(SDL_INIT_VIDEO); - pygame_scrap_types = malloc(sizeof(char *) * 2); + pygame_scrap_types = malloc(sizeof(char *) * 3); if (!pygame_scrap_types) { return 0; } pygame_scrap_types[0] = pygame_scrap_plaintext_type; - pygame_scrap_types[1] = NULL; + pygame_scrap_types[1] = pygame_scrap_utf8text_type; + pygame_scrap_types[2] = NULL; _scrapinitialized = 1; return _scrapinitialized; @@ -82,7 +107,8 @@ pygame_scrap_put(char *type, Py_ssize_t srclen, char *src) return 0; } - if (strcmp(type, pygame_scrap_plaintext_type) == 0) { + if (strcmp(type, pygame_scrap_plaintext_type) == 0 || + strcmp(type, pygame_scrap_utf8text_type) == 0) { if (SDL_SetClipboardText(src) == 0) { return 1; } diff --git a/test/meson.build b/test/meson.build index 1e2cadfa7d..7afcc64e2e 100644 --- a/test/meson.build +++ b/test/meson.build @@ -37,7 +37,6 @@ test_files = files( 'rect_test.py', 'render_test.py', 'rwobject_test.py', - 'scrap_tags.py', 'scrap_test.py', 'sndarray_tags.py', 'sndarray_test.py', diff --git a/test/scrap_tags.py b/test/scrap_tags.py deleted file mode 100644 index 66a18ec2cc..0000000000 --- a/test/scrap_tags.py +++ /dev/null @@ -1,26 +0,0 @@ -# __tags__ = ["ignore", "subprocess_ignore"] - -# TODO: make scrap_test.py work -# This test used to work only on linux and windows. -# Currently it only work in windows, and in linux it throws: -# `pygame.error: content could not be placed in clipboard.` -# The old test and tags kept here for reference when fixing. - -# import sys -# -# exclude = False -# -# if sys.platform == "win32" or sys.platform.startswith("linux"): -# try: -# import pygame -# -# pygame.scrap._NOT_IMPLEMENTED_ -# except AttributeError: -# pass -# else: -# exclude = True -# else: -# exclude = True -# -# if exclude: -# __tags__.extend(["ignore", "subprocess_ignore"]) diff --git a/test/scrap_test.py b/test/scrap_test.py index a62d31c6ea..92f7dbffb5 100644 --- a/test/scrap_test.py +++ b/test/scrap_test.py @@ -1,4 +1,5 @@ import os +import platform import sys import unittest @@ -51,6 +52,10 @@ def todo_test_get(self): """Ensures get works as expected.""" self.fail() + @unittest.skipIf( + platform.system() != "Windows", + "scrap features are broken on non windows platforms", + ) def test_get__owned_empty_type(self): """Ensures get works when there is no data of the requested type in the clipboard and the clipboard is owned by the pygame application. @@ -95,7 +100,10 @@ def test_put__text(self): self.assertEqual(scrap.get(pygame.SCRAP_TEXT), b"Another String") - @unittest.skipIf("pygame.image" not in sys.modules, "requires pygame.image module") + @unittest.skipIf( + platform.system() != "Windows", + "scrap features are broken on non windows platforms", + ) def test_put__bmp_image(self): """Ensures put can place a BMP image into the clipboard.""" sf = pygame.image.load(trunk_relative_path("examples/data/asprite.bmp")) @@ -104,6 +112,10 @@ def test_put__bmp_image(self): self.assertEqual(scrap.get(pygame.SCRAP_BMP), expected_bytes) + @unittest.skipIf( + platform.system() != "Windows", + "scrap features are broken on non windows platforms", + ) def test_put(self): """Ensures put can place data into the clipboard when using a user defined type identifier. @@ -205,109 +217,5 @@ def test_lost__not_owned(self): self.assertTrue(lost) -class X11InteractiveTest(unittest.TestCase): - __tags__ = ["ignore", "subprocess_ignore"] - try: - pygame.display.init() - except Exception: - pass - else: - if pygame.display.get_driver() == "x11": - __tags__ = ["interactive"] - pygame.display.quit() - - def test_issue_223(self): - """PATCH: pygame.scrap on X11, fix copying into PRIMARY selection - - Copying into theX11 PRIMARY selection (mouse copy/paste) would not - work due to a confusion between content type and clipboard type. - - """ - - from pygame import display, event, freetype - from pygame.locals import KEYDOWN, QUIT, SCRAP_SELECTION, SCRAP_TEXT, K_y - - success = False - freetype.init() - font = freetype.Font(None, 24) - display.init() - display.set_caption("Interactive X11 Paste Test") - screen = display.set_mode((600, 200)) - screen.fill(pygame.Color("white")) - text = "Scrap put() succeeded." - msg = ( - "Some text has been placed into the X11 clipboard." - " Please click the center mouse button in an open" - " text window to retrieve it." - '\n\nDid you get "{}"? (y/n)' - ).format(text) - word_wrap(screen, msg, font, 6) - display.flip() - event.pump() - scrap.init() - scrap.set_mode(SCRAP_SELECTION) - scrap.put(SCRAP_TEXT, text.encode("UTF-8")) - while True: - e = event.wait() - if e.type == QUIT: - break - if e.type == KEYDOWN: - success = e.key == K_y - break - pygame.display.quit() - self.assertTrue(success) - - -def word_wrap(surf, text, font, margin=0, color=(0, 0, 0)): - font.origin = True - surf_width, surf_height = surf.get_size() - width = surf_width - 2 * margin - height = surf_height - 2 * margin - line_spacing = int(1.25 * font.get_sized_height()) - x, y = margin, margin + line_spacing - space = font.get_rect(" ") - for word in iwords(text): - if word == "\n": - x, y = margin, y + line_spacing - else: - bounds = font.get_rect(word) - if x + bounds.width + bounds.x >= width: - x, y = margin, y + line_spacing - if x + bounds.width + bounds.x >= width: - raise ValueError("word too wide for the surface") - if y + bounds.height - bounds.y >= height: - raise ValueError("text to long for the surface") - font.render_to(surf, (x, y), None, color) - x += bounds.width + space.width - return x, y - - -def iwords(text): - # r"\n|[^ ]+" - # - head = 0 - tail = head - end = len(text) - while head < end: - if text[head] == " ": - head += 1 - tail = head + 1 - elif text[head] == "\n": - head += 1 - yield "\n" - tail = head + 1 - elif tail == end: - yield text[head:] - head = end - elif text[tail] == "\n": - yield text[head:tail] - head = tail - elif text[tail] == " ": - yield text[head:tail] - head = tail - else: - tail += 1 - - if __name__ == "__main__": unittest.main() From 064910316f7b0790ea8e9d4bad104e55fcd8fdd9 Mon Sep 17 00:00:00 2001 From: Farhan Tariq Date: Thu, 21 Aug 2025 15:21:56 +0500 Subject: [PATCH 402/441] fix: typo in sndarray docs calling it surfarray #3567 Signed-off-by: Farhan Tariq --- docs/reST/ref/sndarray.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/sndarray.rst b/docs/reST/ref/sndarray.rst index 75dbd1b21b..330493c445 100644 --- a/docs/reST/ref/sndarray.rst +++ b/docs/reST/ref/sndarray.rst @@ -10,7 +10,7 @@ Functions to convert between NumPy arrays and Sound objects. This module will only be functional when pygame can use the external NumPy -package. If NumPy can't be imported, ``surfarray`` becomes a ``MissingModule`` +package. If NumPy can't be imported, ``sndarray`` becomes a ``MissingModule`` object. Sound data is made of thousands of samples per second, and each sample is the From 1f728afc4b5ede78fe135d7effba77852fced246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:12:27 +0000 Subject: [PATCH 403/441] Bump pypa/cibuildwheel from 3.1.3 to 3.1.4 Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/v3.1.3...v3.1.4) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.1.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-manylinux.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 4ca7692bb4..9d24eba709 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -118,7 +118,7 @@ jobs: version: "0.8.3" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.1.3 + uses: pypa/cibuildwheel@v3.1.4 - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-manylinux.yml b/.github/workflows/build-manylinux.yml index cccf66bf39..c816f9b38f 100644 --- a/.github/workflows/build-manylinux.yml +++ b/.github/workflows/build-manylinux.yml @@ -74,7 +74,7 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ghcr.io/${{ github.repository }}_aarch64:${{ steps.meta.outputs.version }} - uses: pypa/cibuildwheel@v3.1.3 + uses: pypa/cibuildwheel@v3.1.4 # We upload the generated files under github actions assets - name: Upload dist diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 23f02bf879..e9e2cbe6ac 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -43,7 +43,7 @@ jobs: version: "0.8.3" - name: Build and test wheels - uses: pypa/cibuildwheel@v3.1.3 + uses: pypa/cibuildwheel@v3.1.4 - uses: actions/upload-artifact@v4 with: From eb078bc575237ae41fa031b7d052fd0097df3acf Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 16:29:04 +0100 Subject: [PATCH 404/441] no error on zero length line Removes the error for projecting to a zero length line with no clamping. Instead it behaves just like a clamped line. --- docs/reST/ref/geometry.rst | 2 +- src_c/line.c | 7 +------ test/geometry_test.py | 5 ++--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/docs/reST/ref/geometry.rst b/docs/reST/ref/geometry.rst index 33e55c9a33..53b713fe3a 100644 --- a/docs/reST/ref/geometry.rst +++ b/docs/reST/ref/geometry.rst @@ -762,7 +762,7 @@ Example of what the clamp argument changes. If it is `True`, the point is bounded between the line segment ends. - WARNING: This method has to have some length or the clamp parameter must be true for it to work and not throw a `ValueError` + WARNING: If the line has no length (i.e. the start and end points are the same) then the returned point of this function will be the same point as both ends of the line. .. versionadded:: 2.5.6 diff --git a/src_c/line.c b/src_c/line.c index 1c3b48c002..56a3e321fd 100644 --- a/src_c/line.c +++ b/src_c/line.c @@ -227,18 +227,13 @@ _line_project_helper(pgLineBase *line, double *point, int clamp) double squared_line_length = line_vector[0] * line_vector[0] + line_vector[1] * line_vector[1]; - if (squared_line_length == 0.0 && clamp) { + if (squared_line_length == 0.0) { double projected_point[2]; projected_point[0] = line->ax; projected_point[1] = line->ay; return pg_tuple_couple_from_values_double(projected_point[0], projected_point[1]); } - else if (squared_line_length == 0.0) { - return RAISE(PyExc_ValueError, - "The Line has to have some length or this method has to " - "be clamped to work"); - } // this is a vector that goes from the start of the line to the point we // are projecting onto the line diff --git a/test/geometry_test.py b/test/geometry_test.py index 8d9ab89b08..606fc088f4 100644 --- a/test/geometry_test.py +++ b/test/geometry_test.py @@ -2231,9 +2231,8 @@ def test_meth_project(self): self.assertEqual(math.ceil(projected_point[0]), 0) self.assertEqual(math.ceil(projected_point[1]), 0) - # testing if the method fails when it should - with self.assertRaises(ValueError): - bad_line.project(test_bad_line_point) + projected_point = bad_line.project(test_bad_line_point) + self.assertEqual(math.ceil(projected_point[0]), 0) def test__str__(self): """Checks whether the __str__ method works correctly.""" From 438ed6d5c7b3a8d3a66b7f660764cabe1ff497cb Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:03:23 +0100 Subject: [PATCH 405/441] Updating docs to match implementation --- buildconfig/stubs/pygame/draw.pyi | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index d0d3fee83c..2544060c2a 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -28,7 +28,7 @@ object around the draw calls (see :func:`pygame.Surface.lock` and See the :mod:`pygame.gfxdraw` module for alternative draw methods. """ -from typing import overload +from typing import overload, Union from pygame.rect import Rect from pygame.surface import Surface @@ -571,20 +571,19 @@ def aalines( def flood_fill( surface: Surface, - color: ColorLike, + color: Union[ColorLike, Surface], start_point: Point -) -> Rect: +) -> Rect: """Replace the color of a cluster of connected same-color pixels, beginning from the starting point, with a repeating pattern or solid single color - + :param Surface surface: surface to draw on :param color: color to draw with, the alpha value is optional if using a tuple ``(RGB[A])`` - :type color: Color or string (for :doc:`color_list`) or int or tuple(int, int, int, [int]) - :param pattern_surface: pattern to fill with, as a surface - :param starting_point: starting point as a sequence of 2 ints/floats, + :type color: :data:`pygame.typing.ColorLike` or a pattern to fill with, as a Surface + :param start_point: starting point as a sequence of 2 ints/floats, e.g. ``(x, y)`` - :type starting_point: tuple(int or float, int or float) or + :type start_point: tuple(int or float, int or float) or list(int or float, int or float) or Vector2(int or float, int or float) :returns: a rect bounding the changed pixels, if nothing is drawn the From 19bbcae67645f067e16199240bce0ac7d4bda274 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:04:47 +0100 Subject: [PATCH 406/441] making docs more accurate --- buildconfig/stubs/pygame/draw.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 2544060c2a..37498efa38 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -578,7 +578,7 @@ def aalines( from the starting point, with a repeating pattern or solid single color :param Surface surface: surface to draw on - :param color: color to draw with, the alpha value is optional if using a + :param color: color, or surface pattern, to draw with. The alpha value is optional if using a tuple ``(RGB[A])`` :type color: :data:`pygame.typing.ColorLike` or a pattern to fill with, as a Surface :param start_point: starting point as a sequence of 2 ints/floats, From 2518ee257d4243c6b6be92d97c1dc030bd67b7e4 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:08:38 +0100 Subject: [PATCH 407/441] Update src_c/doc/draw_doc.h Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src_c/doc/draw_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index 6c56cf0c2f..6f87b59ab1 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -10,4 +10,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." -#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, starting_point) -> Rect\nflood_fill(surface, pattern_surface, starting_point) -> Rect\nfill in a connected area of same-color pixels" +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_pos) -> Rect\nflood_fill(surface, pattern_surface, start_pos) -> Rect\nFill a connected area of same-color pixels." From 1c5b761806a9a96150fc777ea0a0059e7a6765da Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:14:02 +0100 Subject: [PATCH 408/441] make it 'start_point' everywhere --- src_c/doc/draw_doc.h | 2 +- src_c/draw.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index 6f87b59ab1..672f4cfa9a 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -10,4 +10,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." -#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_pos) -> Rect\nflood_fill(surface, pattern_surface, start_pos) -> Rect\nFill a connected area of same-color pixels." +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_point) -> Rect\nflood_fill(surface, pattern_surface, start_point) -> Rect\nFill a connected area of same-color pixels." diff --git a/src_c/draw.c b/src_c/draw.c index 61a01b18ed..7cb16db1a0 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1312,7 +1312,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, INT_MIN}; /* Used to store bounding box values */ - static char *keywords[] = {"surface", "color", "start_pos", NULL}; + static char *keywords[] = {"surface", "color", "start_point", NULL}; if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O!OO", keywords, &pgSurface_Type, &surfobj, &colorobj, @@ -1347,7 +1347,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (!pg_TwoIntsFromObj(start, &startx, &starty)) { - return RAISE(PyExc_TypeError, "invalid start_pos argument"); + return RAISE(PyExc_TypeError, "invalid start_point argument"); } if (SDL_MUSTLOCK(surf)) { From e91c585a6e4a43f30707d08851cb275b57e7bcd0 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:23:10 +0100 Subject: [PATCH 409/441] Add small tweaks from AI code review --- src_c/draw.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 7cb16db1a0..7e164736dd 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -29,6 +29,7 @@ #include "doc/draw_doc.h" +#include // for CHAR_BIT #include #include @@ -1394,7 +1395,7 @@ swap(float *a, float *b) *b = temp; } -#define WORD_BITS (8 * sizeof(unsigned int)) +#define WORD_BITS (CHAR_BIT * sizeof(unsigned int)) struct point2d { Uint32 x; @@ -1404,18 +1405,19 @@ struct point2d { static inline void _bitarray_set(unsigned int *bitarray, size_t idx, SDL_bool value) { + const unsigned int mask = (1u << (idx % WORD_BITS)); if (value) { - bitarray[idx / WORD_BITS] |= (1 << (idx % WORD_BITS)); + bitarray[idx / WORD_BITS] |= mask; } else { - bitarray[idx / WORD_BITS] &= (~(1) << (idx % WORD_BITS)); + bitarray[idx / WORD_BITS] &= ~mask; } } static inline SDL_bool _bitarray_get(unsigned int *bitarray, size_t idx) { - if (bitarray[idx / WORD_BITS] & (1 << (idx % WORD_BITS))) + if (bitarray[idx / WORD_BITS] & (1u << (idx % WORD_BITS))) return SDL_TRUE; else return SDL_FALSE; @@ -2502,8 +2504,9 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, // breadth first flood fill, like graph search SDL_Rect cliprect; size_t mask_idx; - - SDL_GetClipRect(surf, &cliprect); + if (!PG_GetSurfaceClipRect(surf, &cliprect)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } size_t frontier_bufsize = 8, frontier_size = 1, next_frontier_size = 0; // Instead of a queue, we use two arrays and swap them between steps. @@ -2524,8 +2527,9 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, // 2D bitmask for queued nodes // we could check drawn color, but that doesnt work for patterns - size_t mask_size = cliprect.w * cliprect.h; - unsigned int *mask = calloc((mask_size) / 8 + 1, sizeof(unsigned int)); + size_t mask_size = (size_t)cliprect.w * (size_t)cliprect.h; + size_t mask_words = (mask_size + WORD_BITS - 1) / WORD_BITS; + unsigned int *mask = calloc(mask_words, sizeof(unsigned int)); if (mask == NULL) { free(frontier); From 7244af0a17b548afde1d7e52e831d3565060ed55 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:32:42 +0100 Subject: [PATCH 410/441] Fix SDL3 build Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src_c/draw.c | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 7e164736dd..ac65b652fd 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1302,13 +1302,14 @@ static PyObject * flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) { pgSurfaceObject *surfobj; - pgSurfaceObject *pat_surfobj; + pgSurfaceObject *pat_surfobj = NULL; PyObject *colorobj, *start; SDL_Surface *surf = NULL; int startx, starty; Uint32 color; SDL_Surface *pattern = NULL; - SDL_bool did_lock = SDL_FALSE; + SDL_bool did_lock_surf = SDL_FALSE; + SDL_bool did_lock_pat = SDL_FALSE; int flood_fill_result; int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, @@ -1331,19 +1332,10 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (pgSurface_Check(colorobj)) { - pat_surfobj = ((pgSurfaceObject *)colorobj); - - pattern = SDL_ConvertSurface(pat_surfobj->surf, surf->format, 0); - - if (pattern == NULL) { - return RAISE(PyExc_RuntimeError, "error converting pattern surf"); - } - - SDL_SetSurfaceRLE(pattern, SDL_FALSE); - - color = 0; - } - else { + pat_surfobj = (pgSurfaceObject *)colorobj; + pattern = pat_surfobj->surf; /* No conversion: we will map per-pixel */ + color = 0; /* new_color unused for pattern path */ + } else { CHECK_LOAD_COLOR(colorobj); } @@ -1352,20 +1344,35 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (SDL_MUSTLOCK(surf)) { - did_lock = SDL_TRUE; + did_lock_surf = SDL_TRUE; if (!pgSurface_Lock(surfobj)) { return RAISE(PyExc_RuntimeError, "error locking surface"); } } + if (pattern && SDL_MUSTLOCK(pattern)) { + did_lock_pat = SDL_TRUE; + if (!pgSurface_Lock(pat_surfobj)) { + if (did_lock_surf) { + pgSurface_Unlock(surfobj); + } + return RAISE(PyExc_RuntimeError, "error locking pattern surface"); + } + } flood_fill_result = flood_fill_inner(surf, startx, starty, color, pattern, drawn_area); - if (pattern != NULL) { - SDL_FreeSurface(pattern); - } + /* no allocated pattern surface to free */ - if (did_lock) { + if (did_lock_pat) { + if (!pgSurface_Unlock(pat_surfobj)) { + if (did_lock_surf) { + pgSurface_Unlock(surfobj); + } + return RAISE(PyExc_RuntimeError, "error unlocking pattern surface"); + } + } + if (did_lock_surf) { if (!pgSurface_Unlock(surfobj)) { return RAISE(PyExc_RuntimeError, "error unlocking surface"); } @@ -1384,7 +1391,6 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) else return pgRect_New4(startx, starty, 0, 0); } - /* Functions used in drawing algorithms */ static void From 03bbbd429128061bfcb09d53d04a7c3bc49393fd Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:37:28 +0100 Subject: [PATCH 411/441] Fix SURF_GET_AT macro for SDL3 --- src_c/draw.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index 7e164736dd..84edc7b8ed 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -2472,9 +2472,8 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, } set_and_check_rect(surf, surf_clip_rect, x2, y2, color, drawn_area); } - -#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_pix) \ - switch (PG_FORMAT_BytesPerPixel(p_format)) { \ +#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_pix) \ + switch (PG_SURF_BytesPerPixel(p_surf)) { \ case 1: \ p_color = (Uint32) * \ ((Uint8 *)(p_pixels) + (p_y) * p_surf->pitch + (p_x)); \ @@ -2549,8 +2548,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, goto flood_fill_finished; } - SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, surf->format, - pix); + SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, pix); if (pattern == NULL && old_color == new_color) { // not an error, but nothing to do here @@ -2573,8 +2571,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, Uint32 current_color = 0; - SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, - surf->format, pix); + SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, pix); if (current_color != old_color) { continue; @@ -2582,7 +2579,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (pattern != NULL) { SURF_GET_AT(new_color, pattern, x % pattern->w, y % pattern->h, - (Uint8 *)pattern->pixels, pattern->format, pix); + (Uint8 *)pattern->pixels, pix); } // clipping and color mapping have already happened here From f2304dd71cd4644361af278b7baf791cbb4f698a Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 20:44:14 +0100 Subject: [PATCH 412/441] Fix raising error in inner_function. --- src_c/draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/draw.c b/src_c/draw.c index 186e805f66..fa10b367ef 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -2510,7 +2510,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, SDL_Rect cliprect; size_t mask_idx; if (!PG_GetSurfaceClipRect(surf, &cliprect)) { - return RAISE(pgExc_SDLError, SDL_GetError()); + return -1; } size_t frontier_bufsize = 8, frontier_size = 1, next_frontier_size = 0; From d1c9e5540cf9dafc9d4820410427197fd5e6b747 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 21:01:30 +0100 Subject: [PATCH 413/441] TRy ifdefing SURF_GET_AT macro to avoid redef error --- src_c/draw.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index fa10b367ef..d8d4f1dd7b 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -2478,8 +2478,9 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, } set_and_check_rect(surf, surf_clip_rect, x2, y2, color, drawn_area); } -#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_pix) \ - switch (PG_SURF_BytesPerPixel(p_surf)) { \ +#ifndef SURF_GET_AT +#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_pix) \ + switch (PG_FORMAT_BytesPerPixel(p_format)) { \ case 1: \ p_color = (Uint32) * \ ((Uint8 *)(p_pixels) + (p_y) * p_surf->pitch + (p_x)); \ @@ -2501,6 +2502,7 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, *((Uint32 *)(p_pixels + (p_y) * p_surf->pitch) + (p_x)); \ break; \ } +#endif //SURF_GET_AT static int flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, @@ -2509,6 +2511,10 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, // breadth first flood fill, like graph search SDL_Rect cliprect; size_t mask_idx; + PG_PixelFormat *format = PG_GetSurfaceFormat(surf); + if (!format) { + return -1; + } if (!PG_GetSurfaceClipRect(surf, &cliprect)) { return -1; } @@ -2554,7 +2560,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, goto flood_fill_finished; } - SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, pix); + SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, format, pix); if (pattern == NULL && old_color == new_color) { // not an error, but nothing to do here @@ -2577,7 +2583,8 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, Uint32 current_color = 0; - SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, pix); + SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, + format, pix); if (current_color != old_color) { continue; @@ -2585,7 +2592,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (pattern != NULL) { SURF_GET_AT(new_color, pattern, x % pattern->w, y % pattern->h, - (Uint8 *)pattern->pixels, pix); + (Uint8 *)pattern->pixels, format, pix); } // clipping and color mapping have already happened here From cb9d5e96199c3b421efc661d616a3d5ed6860b04 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 21:03:23 +0100 Subject: [PATCH 414/441] docs indentation --- buildconfig/stubs/pygame/draw.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 37498efa38..28d3dff489 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -569,7 +569,7 @@ def aalines( always raise a deprecation exception when used """ - def flood_fill( +def flood_fill( surface: Surface, color: Union[ColorLike, Surface], start_point: Point From decc5daae271073f1ffe4045992bcfeec77ae7d1 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 21:03:55 +0100 Subject: [PATCH 415/441] docs indentation --- src_c/doc/draw_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index 672f4cfa9a..e83dbcae12 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -10,4 +10,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." -#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_point) -> Rect\nflood_fill(surface, pattern_surface, start_point) -> Rect\nFill a connected area of same-color pixels." +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_point) -> Rect\nReplace the color of a cluster of connected same-color pixels, beginning" From 84ade6e59c71313c5bdb027dfadefa9de565a61a Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Mon, 25 Aug 2025 21:12:34 +0100 Subject: [PATCH 416/441] formatting --- buildconfig/stubs/pygame/draw.pyi | 44 +++++++++++++++---------------- src_c/draw.c | 29 ++++++++++++-------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 28d3dff489..7dc4062afd 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -28,7 +28,7 @@ object around the draw calls (see :func:`pygame.Surface.lock` and See the :mod:`pygame.gfxdraw` module for alternative draw methods. """ -from typing import overload, Union +from typing import Union, overload from pygame.rect import Rect from pygame.surface import Surface @@ -570,26 +570,24 @@ def aalines( """ def flood_fill( - surface: Surface, - color: Union[ColorLike, Surface], - start_point: Point + surface: Surface, color: Union[ColorLike, Surface], start_point: Point ) -> Rect: - """Replace the color of a cluster of connected same-color pixels, beginning - from the starting point, with a repeating pattern or solid single color - - :param Surface surface: surface to draw on - :param color: color, or surface pattern, to draw with. The alpha value is optional if using a - tuple ``(RGB[A])`` - :type color: :data:`pygame.typing.ColorLike` or a pattern to fill with, as a Surface - :param start_point: starting point as a sequence of 2 ints/floats, - e.g. ``(x, y)`` - :type start_point: tuple(int or float, int or float) or - list(int or float, int or float) or Vector2(int or float, int or float) - - :returns: a rect bounding the changed pixels, if nothing is drawn the - bounding rect's position will be the position of the starting point - and its width and height will be 0 - :rtype: Rect - - .. versionadded:: 2.5.6 - """ + """Replace the color of a cluster of connected same-color pixels, beginning + from the starting point, with a repeating pattern or solid single color + + :param Surface surface: surface to draw on + :param color: color, or surface pattern, to draw with. The alpha value is optional if using a + tuple ``(RGB[A])`` + :type color: :data:`pygame.typing.ColorLike` or a pattern to fill with, as a Surface + :param start_point: starting point as a sequence of 2 ints/floats, + e.g. ``(x, y)`` + :type start_point: tuple(int or float, int or float) or + list(int or float, int or float) or Vector2(int or float, int or float) + + :returns: a rect bounding the changed pixels, if nothing is drawn the + bounding rect's position will be the position of the starting point + and its width and height will be 0 + :rtype: Rect + + .. versionadded:: 2.5.6 + """ diff --git a/src_c/draw.c b/src_c/draw.c index d8d4f1dd7b..8c9210911f 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1333,9 +1333,10 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) if (pgSurface_Check(colorobj)) { pat_surfobj = (pgSurfaceObject *)colorobj; - pattern = pat_surfobj->surf; /* No conversion: we will map per-pixel */ - color = 0; /* new_color unused for pattern path */ - } else { + pattern = pat_surfobj->surf; /* No conversion: we will map per-pixel */ + color = 0; /* new_color unused for pattern path */ + } + else { CHECK_LOAD_COLOR(colorobj); } @@ -1369,7 +1370,8 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) if (did_lock_surf) { pgSurface_Unlock(surfobj); } - return RAISE(PyExc_RuntimeError, "error unlocking pattern surface"); + return RAISE(PyExc_RuntimeError, + "error unlocking pattern surface"); } } if (did_lock_surf) { @@ -1384,12 +1386,14 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) /* Compute return rect. */ if (drawn_area[0] != INT_MAX && drawn_area[1] != INT_MAX && - drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) + drawn_area[2] != INT_MIN && drawn_area[3] != INT_MIN) { return pgRect_New4(drawn_area[0], drawn_area[1], drawn_area[2] - drawn_area[0] + 1, drawn_area[3] - drawn_area[1] + 1); - else + } + else { return pgRect_New4(startx, starty, 0, 0); + } } /* Functions used in drawing algorithms */ @@ -1401,7 +1405,7 @@ swap(float *a, float *b) *b = temp; } -#define WORD_BITS (CHAR_BIT * sizeof(unsigned int)) +#define WORD_BITS (CHAR_BIT * sizeof(unsigned int)) struct point2d { Uint32 x; @@ -1423,10 +1427,12 @@ _bitarray_set(unsigned int *bitarray, size_t idx, SDL_bool value) static inline SDL_bool _bitarray_get(unsigned int *bitarray, size_t idx) { - if (bitarray[idx / WORD_BITS] & (1u << (idx % WORD_BITS))) + if (bitarray[idx / WORD_BITS] & (1u << (idx % WORD_BITS))) { return SDL_TRUE; - else + } + else { return SDL_FALSE; + } } static int @@ -2502,7 +2508,7 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, *((Uint32 *)(p_pixels + (p_y) * p_surf->pitch) + (p_x)); \ break; \ } -#endif //SURF_GET_AT +#endif // SURF_GET_AT static int flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, @@ -2609,8 +2615,9 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, } mask_idx = (ny - cliprect.y) * cliprect.w + (nx - cliprect.x); - if (_bitarray_get(mask, mask_idx)) + if (_bitarray_get(mask, mask_idx)) { continue; + } // only queue node once _bitarray_set(mask, mask_idx, SDL_TRUE); From 148cbb556091112d3efe024cb43e9484fde7f1bf Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 08:45:54 +0100 Subject: [PATCH 417/441] switch start_point to start_pos --- buildconfig/stubs/pygame/draw.pyi | 8 ++++---- src_c/doc/draw_doc.h | 2 +- src_c/draw.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index 7dc4062afd..efe68a8e3b 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -570,18 +570,18 @@ def aalines( """ def flood_fill( - surface: Surface, color: Union[ColorLike, Surface], start_point: Point + surface: Surface, color: Union[ColorLike, Surface], start_pos: Point ) -> Rect: """Replace the color of a cluster of connected same-color pixels, beginning - from the starting point, with a repeating pattern or solid single color + from the starting poosition, with a repeating pattern or solid single color :param Surface surface: surface to draw on :param color: color, or surface pattern, to draw with. The alpha value is optional if using a tuple ``(RGB[A])`` :type color: :data:`pygame.typing.ColorLike` or a pattern to fill with, as a Surface - :param start_point: starting point as a sequence of 2 ints/floats, + :param start_pos: starting position as a sequence of 2 ints/floats, e.g. ``(x, y)`` - :type start_point: tuple(int or float, int or float) or + :type start_pos: tuple(int or float, int or float) or list(int or float, int or float) or Vector2(int or float, int or float) :returns: a rect bounding the changed pixels, if nothing is drawn the diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index e83dbcae12..40b5cf7cb3 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -10,4 +10,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." -#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_point) -> Rect\nReplace the color of a cluster of connected same-color pixels, beginning" +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_pos) -> Rect\nReplace the color of a cluster of connected same-color pixels, beginning" diff --git a/src_c/draw.c b/src_c/draw.c index 8c9210911f..f120a4d92a 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1314,7 +1314,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) int drawn_area[4] = {INT_MAX, INT_MAX, INT_MIN, INT_MIN}; /* Used to store bounding box values */ - static char *keywords[] = {"surface", "color", "start_point", NULL}; + static char *keywords[] = {"surface", "color", "start_pos", NULL}; if (!PyArg_ParseTupleAndKeywords(arg, kwargs, "O!OO", keywords, &pgSurface_Type, &surfobj, &colorobj, @@ -1341,7 +1341,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (!pg_TwoIntsFromObj(start, &startx, &starty)) { - return RAISE(PyExc_TypeError, "invalid start_point argument"); + return RAISE(PyExc_TypeError, "invalid start_pos argument"); } if (SDL_MUSTLOCK(surf)) { From 6bdc0a00621d4afb76cbd1917b34f4ddf662d553 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 09:03:57 +0100 Subject: [PATCH 418/441] Adapt documentation to match other functions --- buildconfig/stubs/pygame/draw.pyi | 6 ++++-- src_c/doc/draw_doc.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/buildconfig/stubs/pygame/draw.pyi b/buildconfig/stubs/pygame/draw.pyi index efe68a8e3b..439a52724f 100644 --- a/buildconfig/stubs/pygame/draw.pyi +++ b/buildconfig/stubs/pygame/draw.pyi @@ -572,8 +572,10 @@ def aalines( def flood_fill( surface: Surface, color: Union[ColorLike, Surface], start_pos: Point ) -> Rect: - """Replace the color of a cluster of connected same-color pixels, beginning - from the starting poosition, with a repeating pattern or solid single color + """Fill an enclosed, same color area, on a surface. + + Replace the color of a cluster of connected same-color pixels, beginning + from the starting position, with a repeating pattern or solid single color. :param Surface surface: surface to draw on :param color: color, or surface pattern, to draw with. The alpha value is optional if using a diff --git a/src_c/doc/draw_doc.h b/src_c/doc/draw_doc.h index 40b5cf7cb3..67b00fa5ca 100644 --- a/src_c/doc/draw_doc.h +++ b/src_c/doc/draw_doc.h @@ -10,4 +10,4 @@ #define DOC_DRAW_LINES "lines(surface, color, closed, points, width=1) -> Rect\nDraw multiple contiguous straight line segments." #define DOC_DRAW_AALINE "aaline(surface, color, start_pos, end_pos, width=1) -> Rect\nDraw a straight antialiased line." #define DOC_DRAW_AALINES "aalines(surface, color, closed, points) -> Rect\nDraw multiple contiguous straight antialiased line segments." -#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_pos) -> Rect\nReplace the color of a cluster of connected same-color pixels, beginning" +#define DOC_DRAW_FLOODFILL "flood_fill(surface, color, start_pos) -> Rect\nFill an enclosed, same color area, on a surface." From 7047eca0b6384790cc1d1d363d5ffa48bffcc0b9 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 09:19:19 +0100 Subject: [PATCH 419/441] Fix conversion and error propagation --- src_c/draw.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src_c/draw.c b/src_c/draw.c index f120a4d92a..7684d19493 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1332,9 +1332,17 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (pgSurface_Check(colorobj)) { - pat_surfobj = (pgSurfaceObject *)colorobj; - pattern = pat_surfobj->surf; /* No conversion: we will map per-pixel */ - color = 0; /* new_color unused for pattern path */ + pat_surfobj = ((pgSurfaceObject *)colorobj); + + pattern = PG_ConvertSurface(pat_surfobj->surf, surf->format); + + if (pattern == NULL) { + return RAISE(PyExc_RuntimeError, "error converting pattern surf"); + } + + SDL_SetSurfaceRLE(pattern, SDL_FALSE); + + color = 0; } else { CHECK_LOAD_COLOR(colorobj); @@ -1381,7 +1389,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) } if (flood_fill_result == -1) { - return PyErr_NoMemory(); + return NULL; /* error already set by flood_fill_inner */ } /* Compute return rect. */ @@ -2484,9 +2492,9 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, } set_and_check_rect(surf, surf_clip_rect, x2, y2, color, drawn_area); } -#ifndef SURF_GET_AT -#define SURF_GET_AT(p_color, p_surf, p_x, p_y, p_pixels, p_format, p_pix) \ - switch (PG_FORMAT_BytesPerPixel(p_format)) { \ + +#define SURF_GET_AT_FORMAT(p_color, p_surf, p_x, p_y, p_pixels, p_pix) \ + switch (PG_SURF_BytesPerPixel(p_surf)) { \ case 1: \ p_color = (Uint32) * \ ((Uint8 *)(p_pixels) + (p_y) * p_surf->pitch + (p_x)); \ @@ -2508,7 +2516,6 @@ draw_line(SDL_Surface *surf, SDL_Rect surf_clip_rect, int x1, int y1, int x2, *((Uint32 *)(p_pixels + (p_y) * p_surf->pitch) + (p_x)); \ break; \ } -#endif // SURF_GET_AT static int flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, @@ -2517,11 +2524,8 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, // breadth first flood fill, like graph search SDL_Rect cliprect; size_t mask_idx; - PG_PixelFormat *format = PG_GetSurfaceFormat(surf); - if (!format) { - return -1; - } if (!PG_GetSurfaceClipRect(surf, &cliprect)) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); return -1; } size_t frontier_bufsize = 8, frontier_size = 1, next_frontier_size = 0; @@ -2531,6 +2535,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, struct point2d *frontier = malloc(frontier_bufsize * sizeof(struct point2d)); if (frontier == NULL) { + PyErr_NoMemory(); return -1; } @@ -2539,6 +2544,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (frontier_next == NULL) { free(frontier); + PyErr_NoMemory(); return -1; } @@ -2551,6 +2557,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, if (mask == NULL) { free(frontier); free(frontier_next); + PyErr_NoMemory(); return -1; } Uint32 old_color = 0; @@ -2566,7 +2573,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, goto flood_fill_finished; } - SURF_GET_AT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, format, pix); + SURF_GET_AT_FORMAT(old_color, surf, x1, y1, (Uint8 *)surf->pixels, pix); if (pattern == NULL && old_color == new_color) { // not an error, but nothing to do here @@ -2589,16 +2596,17 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, Uint32 current_color = 0; - SURF_GET_AT(current_color, surf, x, y, (Uint8 *)surf->pixels, - format, pix); + SURF_GET_AT_FORMAT(current_color, surf, x, y, + (Uint8 *)surf->pixels, pix); if (current_color != old_color) { continue; } if (pattern != NULL) { - SURF_GET_AT(new_color, pattern, x % pattern->w, y % pattern->h, - (Uint8 *)pattern->pixels, format, pix); + SURF_GET_AT_FORMAT(new_color, pattern, x % pattern->w, + y % pattern->h, (Uint8 *)pattern->pixels, + pix); } // clipping and color mapping have already happened here @@ -2635,6 +2643,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, free(mask); free(frontier); free(old_buf); + PyErr_NoMemory(); return -1; } @@ -2645,6 +2654,7 @@ flood_fill_inner(SDL_Surface *surf, int x1, int y1, Uint32 new_color, free(old_buf); free(mask); free(frontier_next); + PyErr_NoMemory(); return -1; } } From 3e410693eaba86c46aa3cc99c6f69466bd2dd7c9 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 10:12:35 +0100 Subject: [PATCH 420/441] fix typo Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- buildconfig/stubs/pygame/transform.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index 60abf02e34..8c1ff79b41 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -469,7 +469,7 @@ def pixelate( ``pixel_size`` is an integer describing how large you want the pixels in the final pixelated image to be. An optional destination surface can be passed which is faster than creating a new Surface. This destination - surface must have the same dimensions (width, height) and smae depth as the source surface. + surface must have the same dimensions (width, height) and same depth and format as the source Surface. :param pygame.Surface surface: the surface to pixelate. From 0cb5398475fd1b96b7c884ab7e5c093a72435333 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 10:13:39 +0100 Subject: [PATCH 421/441] fix sphinx issue and add note to docs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- buildconfig/stubs/pygame/transform.pyi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/transform.pyi b/buildconfig/stubs/pygame/transform.pyi index 8c1ff79b41..8a063ac408 100644 --- a/buildconfig/stubs/pygame/transform.pyi +++ b/buildconfig/stubs/pygame/transform.pyi @@ -480,5 +480,7 @@ def pixelate( :returns: A new surface that's been pixelated. - ..versionadded:: 2.5.6 + .. versionadded:: 2.5.6 + .. note:: + ``pixel_size`` must be >= 1. A ``ValueError`` is raised otherwise. """ From 1732ed738738a8d70bd3defc238cd166141be263 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 10:15:25 +0100 Subject: [PATCH 422/441] remove rogue pyproject.toml change --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7e8126e178..b1a88d22ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,6 @@ requires = [ "sphinx<=8.2.3", "sphinx-autoapi<=3.6.0", "pyproject-metadata!=0.9.1", - "astroid<=3.3.8", ] build-backend = 'mesonpy' From c6869ee495a2ea09f72e2bd133da2dd03ec1f681 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 10:18:54 +0100 Subject: [PATCH 423/441] improve error checking Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src_c/transform.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 33a3096b36..82ae15ebe4 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4244,21 +4244,33 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) if (pixel_size < 1) { PyErr_SetString(PyExc_ValueError, - "Pixel size must be a nonnegative integer"); + "pixel_size must be greater than 0"); return NULL; } - int width = (int)round((double)src->surf->w / pixel_size); - int height = (int)round((double)src->surf->h / pixel_size); + SDL_Surface *src_surf = pgSurface_AsSurface(src); + SURF_INIT_CHECK(src_surf); + + int width = (int)round((double)src_surf->w / pixel_size); + int height = (int)round((double)src_surf->h / pixel_size); + if (width < 1) { + width = 1; + } + if (height < 1) { + height = 1; + } SDL_Surface *temp = scale_to(src, NULL, width, height); + if (!temp) { + return NULL; /* Exception already set in scale_to */ + } intermediate = pgSurface_New(temp); if (intermediate == NULL) { SDL_FreeSurface(temp); return NULL; /* Exception already set in scale_to */ } - new_surf = scale_to(intermediate, dst, src->surf->w, src->surf->h); + new_surf = scale_to(intermediate, dst, src_surf->w, src_surf->h); Py_DECREF(intermediate); if (new_surf == NULL) { From 9ee2c8c63b65c792b253cd626f4f2f9ee08174a9 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 10:27:25 +0100 Subject: [PATCH 424/441] Formatting --- src_c/transform.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_c/transform.c b/src_c/transform.c index 82ae15ebe4..6c9a563c5e 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -4243,8 +4243,7 @@ surf_pixelate(PyObject *self, PyObject *args, PyObject *kwargs) } if (pixel_size < 1) { - PyErr_SetString(PyExc_ValueError, - "pixel_size must be greater than 0"); + PyErr_SetString(PyExc_ValueError, "pixel_size must be greater than 0"); return NULL; } From 7012bdf4d3d3240f345c7016a451632676f95af0 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Tue, 26 Aug 2025 13:30:26 +0200 Subject: [PATCH 425/441] more interesting cases for flood fill tests --- test/draw_test.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/test/draw_test.py b/test/draw_test.py index a215819b8e..433e5c3afa 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -2,6 +2,7 @@ import sys import unittest import warnings +import itertools import pygame from pygame import draw @@ -7312,8 +7313,8 @@ class to add any draw.arc specific tests to. """ -class DrawFloodFillMixin(unittest.TestCase): - """Mixin tests for flood fill.""" +class DrawFloodFillTest(unittest.TestCase): + """Tests for flood fill.""" def test_flood_fill(self): """Ensures flood fill fills with solid color""" @@ -7356,6 +7357,37 @@ def test_flood_pattern(self): for pt in [(0, 0), (0, 1), (1, 0), (1, 1)]: self.assertEqual(surf.get_at(pt), pattern.get_at(pt), pt) + def test_flood_circle(self): + """Ensures flood fill doesn't overdraw""" + surf = pygame.Surface((100, 100)) + surf.fill((0, 0, 0)) + pygame.draw.circle(surf, (255,0,255), (50,50), 40, 2) + pygame.draw.flood_fill(surf, (255,255,255), (10, 50)) + + surf2 = pygame.Surface((100, 100)) + surf2.fill((0, 0, 0)) + pygame.draw.circle(surf2, (255,255,255), (50,50), 40, 2) + + for pt in itertools.product(range(100), range(100)): + self.assertEqual(surf.get_at(pt), surf2.get_at(pt)) + + surf = pygame.Surface((100, 100)) + surf.fill((0, 0, 0)) + pygame.draw.circle(surf, (255,0,255), (50,50), 40, 1) + # fill outside of circle white + pygame.draw.flood_fill(surf, (255,255,255), (1,1)) + # fill inside red + pygame.draw.flood_fill(surf, (255,0,0), (50,50)) + + surf2 = pygame.Surface((100, 100)) + surf2.fill((255,255,255)) + # draw filled circle red + pygame.draw.circle(surf2, (255,0,0), (50,50), 40) + # fill circle hot pink + pygame.draw.circle(surf2, (255,0,255), (50,50), 40, 1) + + for pt in itertools.product(range(100), range(100)): + self.assertEqual(surf.get_at(pt), surf2.get_at(pt)) ### Draw Module Testing ####################################################### From 0d9c7bb43c3d4fed3f6bfafd1aa039b12112c385 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 20:10:19 +0100 Subject: [PATCH 426/441] Formatting --- buildconfig/stubs/pygame/rect.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index b6e9cf1610..9edab76300 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -8,7 +8,6 @@ from typing import ( TypeVar, Union, overload, - Optional, ) from pygame.typing import Point, RectLike, SequenceLike From a47a9f9b5b015669a197c839fcc7436c3749e787 Mon Sep 17 00:00:00 2001 From: Dan Lawrence Date: Tue, 26 Aug 2025 20:18:41 +0100 Subject: [PATCH 427/441] version added update --- docs/reST/ref/rect.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index 97d9013d19..4fcb45f4a8 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -93,7 +93,7 @@ and ``__new__()`` is assumed to take no arguments. So these methods should be overridden if any extra attributes need to be copied. - .. versionadded:: 2.5.2 + .. versionadded:: 2.5.6 ``relcenter`` added to Rect / FRect. This will return you a ``Point`` of the center relative to the topleft of the Rect. Setting a ``Point`` to it will modify the size of the rect to 2 times the ``Point`` used. Below you can find a From d440ba8dd63812cd6188c3507c9c4dd6da626cb9 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Thu, 28 Aug 2025 09:20:15 +0200 Subject: [PATCH 428/441] Better explain test case on comments --- test/draw_test.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/test/draw_test.py b/test/draw_test.py index 433e5c3afa..ed99f0ce96 100644 --- a/test/draw_test.py +++ b/test/draw_test.py @@ -1,8 +1,8 @@ +import itertools import math import sys import unittest import warnings -import itertools import pygame from pygame import draw @@ -7361,34 +7361,40 @@ def test_flood_circle(self): """Ensures flood fill doesn't overdraw""" surf = pygame.Surface((100, 100)) surf.fill((0, 0, 0)) - pygame.draw.circle(surf, (255,0,255), (50,50), 40, 2) - pygame.draw.flood_fill(surf, (255,255,255), (10, 50)) + pygame.draw.circle(surf, (255, 0, 255), (50, 50), 40, 2) + pygame.draw.flood_fill(surf, (255, 255, 255), (10, 50)) surf2 = pygame.Surface((100, 100)) surf2.fill((0, 0, 0)) - pygame.draw.circle(surf2, (255,255,255), (50,50), 40, 2) + pygame.draw.circle(surf2, (255, 255, 255), (50, 50), 40, 2) for pt in itertools.product(range(100), range(100)): self.assertEqual(surf.get_at(pt), surf2.get_at(pt)) surf = pygame.Surface((100, 100)) surf.fill((0, 0, 0)) - pygame.draw.circle(surf, (255,0,255), (50,50), 40, 1) + pygame.draw.circle(surf, (255, 0, 255), (50, 50), 40, 1) # fill outside of circle white - pygame.draw.flood_fill(surf, (255,255,255), (1,1)) + pygame.draw.flood_fill(surf, (255, 255, 255), (1, 1)) # fill inside red - pygame.draw.flood_fill(surf, (255,0,0), (50,50)) + pygame.draw.flood_fill(surf, (255, 0, 0), (50, 50)) surf2 = pygame.Surface((100, 100)) - surf2.fill((255,255,255)) + surf2.fill((255, 255, 255)) # draw filled circle red - pygame.draw.circle(surf2, (255,0,0), (50,50), 40) - # fill circle hot pink - pygame.draw.circle(surf2, (255,0,255), (50,50), 40, 1) + pygame.draw.circle(surf2, (255, 0, 0), (50, 50), 40) + # draw outer edge circle hot pink + pygame.draw.circle(surf2, (255, 0, 255), (50, 50), 40, 1) + + # both should be identical: white outside, thin pink line, red inside + # no black pixels missed, no spillover between inside and outside + # This assumes circle drawing works correctly: + # if circle is broken, this may or may not fail for pt in itertools.product(range(100), range(100)): self.assertEqual(surf.get_at(pt), surf2.get_at(pt)) + ### Draw Module Testing ####################################################### From 570bd98ddec04660aeadd37e803caa3ec2e243dc Mon Sep 17 00:00:00 2001 From: Ankith Date: Thu, 28 Aug 2025 10:17:02 +0530 Subject: [PATCH 429/441] Fix failing tests on non-libpng backends --- src_c/imageext.c | 19 +++++++++++++++++++ test/image_test.py | 14 +++++++++++++- test/surface_test.py | 8 ++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src_c/imageext.c b/src_c/imageext.c index 3ab183a2df..18b2cfef98 100644 --- a/src_c/imageext.c +++ b/src_c/imageext.c @@ -148,6 +148,25 @@ image_load_ext(PyObject *self, PyObject *arg, PyObject *kwarg) return RAISE(pgExc_SDLError, IMG_GetError()); } + /* Vendor in fix from https://github.com/libsdl-org/SDL_image/pull/559. + * When that PR is merged this block can be removed. */ + if (SDL_ISPIXELFORMAT_INDEXED(PG_SURF_FORMATENUM(surf))) { + Uint32 colorkey; +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_GetSurfaceColorKey(surf, &colorkey)) +#else + if (SDL_GetColorKey(surf, &colorkey) == 0) +#endif + { + SDL_Palette *pal = PG_GetSurfacePalette(surf); + if (pal && colorkey < (Uint32)pal->ncolors) { + SDL_Color c = pal->colors[colorkey]; + c.a = SDL_ALPHA_OPAQUE; + SDL_SetPaletteColors(pal, &c, (int)colorkey, 1); + } + } + } + final = (PyObject *)pgSurface_New(surf); if (final == NULL) { SDL_FreeSurface(surf); diff --git a/test/image_test.py b/test/image_test.py index a8750e7df9..2af6db9169 100644 --- a/test/image_test.py +++ b/test/image_test.py @@ -20,6 +20,8 @@ _sdl_image_ver <= (2, 0, 5) and pygame.get_sdl_byteorder() == pygame.BIG_ENDIAN ) +PG_DEPS_FROM_SYSTEM = "PG_DEPS_FROM_SYSTEM" in os.environ + def check_magic(f, magic_hexes): """Tests a given file to see if the magic hex matches.""" @@ -203,6 +205,11 @@ def testSavePNG32(self): pygame.image.get_sdl_image_version() == (2, 0, 5), "SDL image 2.0.5 png saving will save this 24 bit as RGBA, causing reader.asRGB8 to fail", ) + @unittest.skipIf( + PG_DEPS_FROM_SYSTEM, + "If we are using system dependencies, we don't know the backend used " + "for PNG saving, and this test only works with libpng.", + ) def testSavePNG24(self): """see if we can save a png with color values in the proper channels.""" # Create a PNG file with known colors @@ -238,6 +245,11 @@ def testSavePNG24(self): del reader os.remove(f_path) + @unittest.skipIf( + PG_DEPS_FROM_SYSTEM, + "If we are using system dependencies, we don't know the backend used " + "for PNG saving, and this test only works with libpng.", + ) def testSavePNG8(self): """see if we can save an 8 bit png correctly""" # Create an 8-bit PNG file with known colors @@ -269,7 +281,7 @@ def testSavePNG8(self): os.remove(f_path) @unittest.skipIf( - "PG_DEPS_FROM_SYSTEM" in os.environ, + PG_DEPS_FROM_SYSTEM, "If we are using system dependencies, we don't know the backend used " "for PNG saving, and this test only works with libpng.", ) diff --git a/test/surface_test.py b/test/surface_test.py index c3bb3d098a..4272aee0bc 100644 --- a/test/surface_test.py +++ b/test/surface_test.py @@ -1228,8 +1228,12 @@ def test_image_convert_bug_131(self): im = pygame.image.load(example_path(os.path.join("data", "city.png"))) im2 = pygame.image.load(example_path(os.path.join("data", "brick.png"))) - self.assertEqual(im.get_palette(), ((0, 0, 0, 255), (255, 255, 255, 255))) - self.assertEqual(im2.get_palette(), ((0, 0, 0, 255), (0, 0, 0, 255))) + # Only validate the first two entries; stbimage backend gives a 256 + # length palette while libpng doesn't. + self.assertEqual( + im.get_palette()[:2], ((0, 0, 0, 255), (255, 255, 255, 255)) + ) + self.assertEqual(im2.get_palette()[:2], ((0, 0, 0, 255), (0, 0, 0, 255))) self.assertEqual( repr(im.convert(32)), "" From c1b19b1c1e151d38d2aa863967cc42addde01a44 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:22:29 -0700 Subject: [PATCH 430/441] Improve relcenter docs --- docs/reST/ref/rect.rst | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index 4fcb45f4a8..5ee1da78e6 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -47,8 +47,8 @@ top, left, bottom, right topleft, bottomleft, topright, bottomright midtop, midleft, midbottom, midright - center, relcenter, centerx, centery - size, width, height + center, centerx, centery + size, width, height, relcenter w,h All of these attributes can be assigned to: @@ -58,7 +58,7 @@ rect1.right = 10 rect2.center = (20,30) - Assigning to size, width or height changes the dimensions of the rectangle; + Assigning to size, width, height, or relcenter changes the dimensions of the rectangle; all other assignments move the rectangle without resizing it. Notice that some attributes are integers and others are pairs of integers. @@ -94,22 +94,22 @@ overridden if any extra attributes need to be copied. .. versionadded:: 2.5.6 - ``relcenter`` added to Rect / FRect. This will return you a ``Point`` of - the center relative to the topleft of the Rect. Setting a ``Point`` to it will - modify the size of the rect to 2 times the ``Point`` used. Below you can find a - code example of how it should work : + ``relcenter`` added to Rect / FRect. This will return a tuple containing half + the Rect's size; the center relative to the topleft of the Rect. + Setting it to a ``Point`` will modify the size of the rect to 2 times + the ``Point`` given. Below you can find a code example of how it should work: .. code-block:: python - > my_rect = pygame.Rect(0, 0, 2, 2) - > my_rect.relcenter - > (1, 1) - > my_rect.relcenter = (128, 128) - > my_rect.relcenter, my_rect.size - > ((128, 128), (256, 256)) + >>> my_rect = pygame.Rect(0, 0, 2, 2) + >>> my_rect.relcenter + (1, 1) + >>> my_rect.relcenter = (128, 128) + >>> my_rect.size + (256, 256) - Beware of non integer relative centers ! Using a Rect instead of FRect will round down - the values of the returned ``Point``. + Beware of non-integer relative centers! For Rects (but not FRects), ``relcenter`` + will truncate the numbers in the returned tuple. .. method:: copy From 380ad2400f97b1b8f3049257b156e299841ecdf3 Mon Sep 17 00:00:00 2001 From: aatle <168398276+aatle@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:28:32 -0700 Subject: [PATCH 431/441] Minor relcenter typo renames --- src_c/rect_impl.h | 2 +- test/rect_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index 0899ea2c58..af826b636d 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -2836,7 +2836,7 @@ RectExport_getcenter(RectObject *self, void *closure) self->r.y + (self->r.h / 2)); } -/*center*/ +/*relcenter*/ static PyObject * RectExport_getrelcenter(RectObject *self, void *closure) { diff --git a/test/rect_test.py b/test/rect_test.py index 1860f4b0ef..a93c22d829 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -579,7 +579,7 @@ def test_relcenter__invalid_value(self): r.relcenter = value def test_relcenter__del(self): - """Ensures the center attribute can't be deleted.""" + """Ensures the relcenter attribute can't be deleted.""" r = Rect(0, 0, 1, 1) with self.assertRaises(AttributeError): From 6c2e05d834acde1985653f8f0f7bcca6256e57c3 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 30 Aug 2025 22:04:16 -0700 Subject: [PATCH 432/441] Port freetype to SDL3 --- src_c/freetype/ft_pixel.h | 50 ++++++++++++++++++--------------- src_c/freetype/ft_render.c | 50 ++++++++++++++++++++++----------- src_c/freetype/ft_render_cb.c | 53 +++++++++++++++++++---------------- src_c/freetype/ft_wrap.c | 4 +++ src_c/freetype/ft_wrap.h | 3 +- src_c/meson.build | 4 +-- 6 files changed, 98 insertions(+), 66 deletions(-) diff --git a/src_c/freetype/ft_pixel.h b/src_c/freetype/ft_pixel.h index 46c5b47732..7f89fcdb20 100644 --- a/src_c/freetype/ft_pixel.h +++ b/src_c/freetype/ft_pixel.h @@ -22,33 +22,37 @@ #include "../surface.h" -#define GET_RGB_VALS(pixel, fmt, r, g, b, a) \ - (r) = ((pixel) & (fmt)->Rmask) >> (fmt)->Rshift; \ - (r) = ((r) << (fmt)->Rloss) + ((r) >> (8 - ((fmt)->Rloss << 1))); \ - (g) = ((pixel) & (fmt)->Gmask) >> (fmt)->Gshift; \ - (g) = ((g) << (fmt)->Gloss) + ((g) >> (8 - ((fmt)->Gloss << 1))); \ - (b) = ((pixel) & (fmt)->Bmask) >> (fmt)->Bshift; \ - (b) = ((b) << (fmt)->Bloss) + ((b) >> (8 - ((fmt)->Bloss << 1))); \ - if ((fmt)->Amask) { \ - (a) = ((pixel) & (fmt)->Amask) >> (fmt)->Ashift; \ - (a) = ((a) << (fmt)->Aloss) + ((a) >> (8 - ((fmt)->Aloss << 1))); \ - } \ - else { \ - (a) = 255; \ +#define GET_RGB_VALS(pixel, fmt, r, g, b, a) \ + (r) = ((pixel) & (fmt)->Rmask) >> (fmt)->Rshift; \ + (r) = ((r) << PG_FORMAT_R_LOSS(fmt)) + \ + ((r) >> (8 - (PG_FORMAT_R_LOSS(fmt) << 1))); \ + (g) = ((pixel) & (fmt)->Gmask) >> (fmt)->Gshift; \ + (g) = ((g) << PG_FORMAT_G_LOSS(fmt)) + \ + ((g) >> (8 - (PG_FORMAT_G_LOSS(fmt) << 1))); \ + (b) = ((pixel) & (fmt)->Bmask) >> (fmt)->Bshift; \ + (b) = ((b) << PG_FORMAT_B_LOSS(fmt)) + \ + ((b) >> (8 - (PG_FORMAT_B_LOSS(fmt) << 1))); \ + if ((fmt)->Amask) { \ + (a) = ((pixel) & (fmt)->Amask) >> (fmt)->Ashift; \ + (a) = ((a) << PG_FORMAT_A_LOSS(fmt)) + \ + ((a) >> (8 - (PG_FORMAT_A_LOSS(fmt) << 1))); \ + } \ + else { \ + (a) = 255; \ } -#define GET_PALETTE_VALS(pixel, fmt, sr, sg, sb, sa) \ - (sr) = (fmt)->palette->colors[(Uint8)(pixel)].r; \ - (sg) = (fmt)->palette->colors[(Uint8)(pixel)].g; \ - (sb) = (fmt)->palette->colors[(Uint8)(pixel)].b; \ +#define GET_PALETTE_VALS(pixel, palette, sr, sg, sb, sa) \ + (sr) = palette->colors[(Uint8)(pixel)].r; \ + (sg) = palette->colors[(Uint8)(pixel)].g; \ + (sb) = palette->colors[(Uint8)(pixel)].b; \ (sa) = 255; -#define GET_PIXEL_VALS(pixel, fmt, r, g, b, a) \ - if (!(fmt)->palette) { \ - GET_RGB_VALS(pixel, fmt, r, g, b, a); \ - } \ - else { \ - GET_PALETTE_VALS(pixel, fmt, r, g, b, a); \ +#define GET_PIXEL_VALS(pixel, fmt, palette, r, g, b, a) \ + if (!palette) { \ + GET_RGB_VALS(pixel, fmt, r, g, b, a); \ + } \ + else { \ + GET_PALETTE_VALS(pixel, palette, r, g, b, a); \ } #if SDL_BYTEORDER == SDL_LIL_ENDIAN diff --git a/src_c/freetype/ft_render.c b/src_c/freetype/ft_render.c index a7cb54c28d..ed63a5ebd9 100644 --- a/src_c/freetype/ft_render.c +++ b/src_c/freetype/ft_render.c @@ -348,11 +348,16 @@ _PGFT_Render_ExistingSurface(FreeTypeInstance *ft, pgFontObject *fontobj, font_surf.width = surface->w; font_surf.height = surface->h; font_surf.pitch = surface->pitch; - font_surf.format = surface->format; font_surf.render_gray = __SDLrenderFuncs[PG_SURF_BytesPerPixel(surface)]; font_surf.render_mono = __MONOrenderFuncs[PG_SURF_BytesPerPixel(surface)]; font_surf.fill = __RGBfillFuncs[PG_SURF_BytesPerPixel(surface)]; + if (!PG_GetSurfaceDetails(surface, &font_surf.format, + &font_surf.palette)) { + PyErr_SetString(pgExc_SDLError, SDL_GetError()); + return -1; + } + /* * if bg color exists, paint background */ @@ -361,8 +366,9 @@ _PGFT_Render_ExistingSurface(FreeTypeInstance *ft, pgFontObject *fontobj, SDL_Rect bg_fill; FT_UInt32 fillcolor; - fillcolor = SDL_MapRGBA(surface->format, bgcolor->r, bgcolor->g, - bgcolor->b, bgcolor->a); + fillcolor = + PG_MapRGBA(font_surf.format, font_surf.palette, bgcolor->r, + bgcolor->g, bgcolor->b, bgcolor->a); bg_fill.x = (FT_Int16)x; bg_fill.y = (FT_Int16)y; @@ -404,7 +410,6 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, SDL_Surface *surface = 0; int bits_per_pixel = (bgcolor || mode->render_flags & FT_RFLAG_ANTIALIAS) ? 32 : 8; - Uint32 pixelformat; FontSurface font_surf; Layout *font_text; @@ -433,17 +438,26 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, } if (bits_per_pixel == 8) { - pixelformat = SDL_PIXELFORMAT_INDEX8; + surface = PG_CreateSurface(width, height, SDL_PIXELFORMAT_INDEX8); +#if SDL_VERSION_ATLEAST(3, 0, 0) + // We need to explicitly create palettes in SDL3 + SDL_CreateSurfacePalette(surface); +#endif } else { - pixelformat = SDL_PIXELFORMAT_RGBA32; + surface = PG_CreateSurface(width, height, SDL_PIXELFORMAT_RGBA32); } - surface = PG_CreateSurface(width, height, pixelformat); + if (!surface) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); return 0; } + if (!PG_GetSurfaceDetails(surface, &font_surf.format, + &font_surf.palette)) { + return RAISE(pgExc_SDLError, SDL_GetError()); + } + if (SDL_MUSTLOCK(surface)) { if (!PG_LockSurface(surface)) { PyErr_SetString(pgExc_SDLError, SDL_GetError()); @@ -457,7 +471,7 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, font_surf.width = surface->w; font_surf.height = surface->h; font_surf.pitch = surface->pitch; - font_surf.format = surface->format; + if (bits_per_pixel == 32) { FT_UInt32 fillcolor; @@ -468,20 +482,20 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, * Fill our texture with the required bg color */ if (bgcolor) { - fillcolor = SDL_MapRGBA(surface->format, bgcolor->r, bgcolor->g, - bgcolor->b, bgcolor->a); + fillcolor = + PG_MapRGBA(font_surf.format, font_surf.palette, bgcolor->r, + bgcolor->g, bgcolor->b, bgcolor->a); } else { - fillcolor = - SDL_MapRGBA(surface->format, 0, 0, 0, SDL_ALPHA_TRANSPARENT); + fillcolor = PG_MapRGBA(font_surf.format, font_surf.palette, 0, 0, + 0, SDL_ALPHA_TRANSPARENT); } SDL_FillRect(surface, 0, fillcolor); } else { - SDL_Palette *palette = surface->format->palette; SDL_Color colors[2]; - if (!palette) { + if (!font_surf.palette) { SDL_FreeSurface(surface); PyErr_NoMemory(); return 0; @@ -494,7 +508,7 @@ _PGFT_Render_NewSurface(FreeTypeInstance *ft, pgFontObject *fontobj, colors[0].g = ~colors[1].g; colors[0].b = ~colors[1].b; colors[0].a = SDL_ALPHA_OPAQUE; - if (!PG_SetPaletteColors(palette, colors, 0, 2)) { + if (!PG_SetPaletteColors(font_surf.palette, colors, 0, 2)) { PyErr_Format(PyExc_SystemError, "Pygame bug in _PGFT_Render_NewSurface: %.200s", SDL_GetError()); @@ -598,6 +612,7 @@ _PGFT_Render_PixelArray(FreeTypeInstance *ft, pgFontObject *fontobj, surf.height = height; surf.pitch = (int)surf.width; surf.format = 0; + surf.palette = NULL; surf.render_gray = __render_glyph_GRAY1; surf.render_mono = __render_glyph_MONO_as_GRAY1; surf.fill = __fill_glyph_GRAY1; @@ -628,7 +643,6 @@ _PGFT_Render_Array(FreeTypeInstance *ft, pgFontObject *fontobj, FT_Fixed underline_size; FontSurface font_surf; - SDL_PixelFormat format; Layout *font_text; /* Get target buffer */ @@ -696,8 +710,11 @@ _PGFT_Render_Array(FreeTypeInstance *ft, pgFontObject *fontobj, * Setup target surface struct */ #if SDL_VERSION_ATLEAST(3, 0, 0) + // Only BPP and Ashift are needed by functions called here + SDL_PixelFormatDetails format; format.bytes_per_pixel = itemsize; #else + SDL_PixelFormat format; format.BytesPerPixel = itemsize; #endif #if SDL_BYTEORDER == SDL_LIL_ENDIAN @@ -711,6 +728,7 @@ _PGFT_Render_Array(FreeTypeInstance *ft, pgFontObject *fontobj, font_surf.item_stride = (unsigned)view_p->strides[0]; font_surf.pitch = (unsigned)view_p->strides[1]; font_surf.format = &format; + font_surf.palette = NULL; font_surf.render_gray = __render_glyph_INT; font_surf.render_mono = __render_glyph_MONO_as_INT; font_surf.fill = __fill_glyph_INT; diff --git a/src_c/freetype/ft_render_cb.c b/src_c/freetype/ft_render_cb.c index 1c4e6a9e3e..b75cad22c1 100644 --- a/src_c/freetype/ft_render_cb.c +++ b/src_c/freetype/ft_render_cb.c @@ -220,7 +220,7 @@ __render_glyph_INT(int x, int y, FontSurface *surface, const FT_Bitmap *bitmap, { FT_Byte *dst = ((FT_Byte *)surface->buffer + x * surface->item_stride + y * surface->pitch); - int item_size = PG_SURF_BytesPerPixel(surface); + int item_size = PG_FORMAT_BytesPerPixel(surface->format); int item_stride = surface->item_stride; FT_Byte *dst_cpy; @@ -301,7 +301,7 @@ __render_glyph_MONO_as_INT(int x, int y, FontSurface *surface, int i, j, shift; int item_stride = surface->item_stride; - int item_size = PG_SURF_BytesPerPixel(surface); + int item_size = PG_FORMAT_BytesPerPixel(surface->format); unsigned char *src; unsigned char *dst; unsigned char *src_cpy; @@ -380,7 +380,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, { int i, j; FT_Byte *dst; - int itemsize = PG_SURF_BytesPerPixel(surface); + int itemsize = PG_FORMAT_BytesPerPixel(surface->format); int item_stride = surface->item_stride; int byteoffset = surface->format->Ashift / 8; FT_Byte *dst_cpy; @@ -544,7 +544,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, POINTER_ASSERT(_dst) \ \ if (_bpp == 1) { \ - GET_PALETTE_VALS(pixel, surface->format, bgR, bgG, bgB, \ + GET_PALETTE_VALS(pixel, surface->palette, bgR, bgG, bgB, \ bgA); \ } \ else { \ @@ -575,7 +575,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, POINTER_ASSERT(_dst) \ \ if (_bpp == 1) { \ - GET_PALETTE_VALS(pixel, surface->format, bgR, bgG, bgB, \ + GET_PALETTE_VALS(pixel, surface->palette, bgR, bgG, bgB, \ bgA); \ } \ else { \ @@ -607,7 +607,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, POINTER_ASSERT(_dst) \ \ if (_bpp == 1) { \ - GET_PALETTE_VALS(pixel, surface->format, bgR, bgG, bgB, \ + GET_PALETTE_VALS(pixel, surface->palette, bgR, bgG, bgB, \ bgA); \ } \ else { \ @@ -666,8 +666,9 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, dst = (unsigned char *)surface->buffer + (rx * _bpp) + \ (ry * surface->pitch); \ \ - full_color = SDL_MapRGBA(surface->format, (FT_Byte)color->r, \ - (FT_Byte)color->g, (FT_Byte)color->b, 255); \ + full_color = \ + PG_MapRGBA(surface->format, surface->palette, (FT_Byte)color->r, \ + (FT_Byte)color->g, (FT_Byte)color->b, 255); \ \ shift = off_x & 7; \ (void)full_color; \ @@ -679,7 +680,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, FT_UInt32 pixel = (FT_UInt32)_getp; \ \ if (_bpp == 1) { \ - GET_PALETTE_VALS(pixel, surface->format, bgR, bgG, bgB, \ + GET_PALETTE_VALS(pixel, surface->palette, bgR, bgG, bgB, \ bgA); \ } \ else { \ @@ -743,7 +744,7 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, FT_UInt32 pixel = (FT_UInt32)_getp; \ \ if (_bpp == 1) { \ - GET_PALETTE_VALS(pixel, surface->format, bgR, bgG, \ + GET_PALETTE_VALS(pixel, surface->palette, bgR, bgG, \ bgB, bgA); \ } \ else { \ @@ -765,9 +766,10 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, /* These macros removes a gcc unused variable warning for __render_glyph_RGB3 */ -#define _DECLARE_full_color(s, c) \ - const FT_UInt32 full_color = SDL_MapRGBA( \ - (s)->format, (FT_Byte)(c)->r, (FT_Byte)(c)->g, (FT_Byte)(c)->b, 255); +#define _DECLARE_full_color(s, c) \ + const FT_UInt32 full_color = \ + PG_MapRGBA((s)->format, (s)->palette, (FT_Byte)(c)->r, \ + (FT_Byte)(c)->g, (FT_Byte)(c)->b, 255); #define _DECLARE_full_color1(s, c) _DECLARE_full_color(s, c) #define _DECLARE_full_color2(s, c) _DECLARE_full_color(s, c) #define _DECLARE_full_color3(s, c) @@ -780,17 +782,20 @@ __fill_glyph_INT(FT_Fixed x, FT_Fixed y, FT_Fixed w, FT_Fixed h, #define _SET_PIXEL(T) *(T *)_dst = (T)full_color; -#define _BLEND_PIXEL(T) \ - *((T *)_dst) = \ - (T)(((bgR >> surface->format->Rloss) << surface->format->Rshift) | \ - ((bgG >> surface->format->Gloss) << surface->format->Gshift) | \ - ((bgB >> surface->format->Bloss) << surface->format->Bshift) | \ - ((bgA >> surface->format->Aloss) << surface->format->Ashift & \ - surface->format->Amask)) - -#define _BLEND_PIXEL_GENERIC(T) \ - *(T *)_dst = (T)(SDL_MapRGB(surface->format, (FT_Byte)bgR, (FT_Byte)bgG, \ - (FT_Byte)bgB)) +#define _BLEND_PIXEL(T) \ + *((T *)_dst) = (T)(((bgR >> PG_FORMAT_R_LOSS(surface->format)) \ + << surface->format->Rshift) | \ + ((bgG >> PG_FORMAT_G_LOSS(surface->format)) \ + << surface->format->Gshift) | \ + ((bgB >> PG_FORMAT_B_LOSS(surface->format)) \ + << surface->format->Bshift) | \ + ((bgA >> PG_FORMAT_A_LOSS(surface->format)) \ + << surface->format->Ashift & \ + surface->format->Amask)) + +#define _BLEND_PIXEL_GENERIC(T) \ + *(T *)_dst = (T)(PG_MapRGB(surface->format, surface->palette, \ + (FT_Byte)bgR, (FT_Byte)bgG, (FT_Byte)bgB)) #define _GET_PIXEL(T) (*((T *)_dst)) diff --git a/src_c/freetype/ft_wrap.c b/src_c/freetype/ft_wrap.c index 708e9832d5..c6598451e5 100644 --- a/src_c/freetype/ft_wrap.c +++ b/src_c/freetype/ft_wrap.c @@ -479,7 +479,11 @@ RWops_read(FT_Stream stream, unsigned long offset, unsigned char *buffer, return 0; } +#if SDL_VERSION_ATLEAST(3, 0, 0) + return (unsigned long)SDL_ReadIO(src, buffer, count); +#else return (unsigned long)SDL_RWread(src, buffer, 1, (int)count); +#endif } int diff --git a/src_c/freetype/ft_wrap.h b/src_c/freetype/ft_wrap.h index 0ecff0c450..fec033a691 100644 --- a/src_c/freetype/ft_wrap.h +++ b/src_c/freetype/ft_wrap.h @@ -200,7 +200,8 @@ typedef struct fontsurface_ { int item_stride; int pitch; - SDL_PixelFormat *format; + PG_PixelFormat *format; + SDL_Palette *palette; FontRenderPtr render_gray; FontRenderPtr render_mono; diff --git a/src_c/meson.build b/src_c/meson.build index a8f1bb39fc..1dc3d6b764 100644 --- a/src_c/meson.build +++ b/src_c/meson.build @@ -421,6 +421,8 @@ if sdl_mixer_dep.found() ) endif +endif + if freetype_dep.found() _freetype = py.extension_module( '_freetype', @@ -440,8 +442,6 @@ if freetype_dep.found() ) endif -endif - if portmidi_dep.found() pypm = py.extension_module( 'pypm', From 379f5b6453ecee3fc2404f5bae29c409b0f01808 Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 31 Aug 2025 17:57:35 +0530 Subject: [PATCH 433/441] SDL3: mouse+key+rect: runtime fixes --- buildconfig/stubs/pygame/mouse.pyi | 2 ++ src_c/key.c | 6 +++++- src_c/mouse.c | 16 +++++++++++++--- src_c/pgcompat_rect.c | 8 ++++++-- src_c/pgcompat_rect.h | 4 ++-- test/key_test.py | 5 ++++- test/mouse_test.py | 10 ++++++++++ 7 files changed, 42 insertions(+), 9 deletions(-) diff --git a/buildconfig/stubs/pygame/mouse.pyi b/buildconfig/stubs/pygame/mouse.pyi index e8e32d6188..c47d60de90 100644 --- a/buildconfig/stubs/pygame/mouse.pyi +++ b/buildconfig/stubs/pygame/mouse.pyi @@ -292,4 +292,6 @@ def set_relative_mode(enable: bool, /) -> None: ``True`` will exit relative mouse mode. .. versionadded:: 2.4.0 + .. versionchanged:: 2.5.6 calling this function before calling + :func:`pygame.display.set_mode` is deprecated and may error in the future. """ diff --git a/src_c/key.c b/src_c/key.c index 2540e59980..9b249c13c7 100644 --- a/src_c/key.c +++ b/src_c/key.c @@ -389,7 +389,11 @@ static const struct { {1073742054, "right alt"}, /* K_RALT */ {1073742055, "right meta"}, /* K_RGUI, K_RMETA, K_RSUPER */ {1073742081, "alt gr"}, /* K_MODE */ - {1073742094, "AC Back"}, /* K_AC_BACK */ +#if SDL_VERSION_ATLEAST(3, 0, 0) + {1073742106, "AC Back"}, /* K_AC_BACK */ +#else + {1073742094, "AC Back"}, /* K_AC_BACK */ +#endif }; /* Get name from keycode using pygame compat table */ diff --git a/src_c/mouse.c b/src_c/mouse.c index 62d1ea6b77..efe71d1b4a 100644 --- a/src_c/mouse.c +++ b/src_c/mouse.c @@ -324,8 +324,9 @@ mouse_get_visible(PyObject *self, PyObject *_null) #if SDL_VERSION_ATLEAST(3, 0, 0) SDL_Window *win = pg_GetDefaultWindow(); - result = - win ? (PG_CursorVisible() && !SDL_GetWindowRelativeMouseMode(win)) : 0; + + /* If win is NULL, SDL_GetWindowRelativeMouseMode returns false */ + result = (PG_CursorVisible() && !SDL_GetWindowRelativeMouseMode(win)); #else result = (PG_CursorVisible() && !SDL_GetRelativeMouseMode()); #endif @@ -618,8 +619,8 @@ mouse_set_relative_mode(PyObject *self, PyObject *arg) if (mode == -1) { return NULL; } -#if SDL_VERSION_ATLEAST(3, 0, 0) SDL_Window *win = pg_GetDefaultWindow(); +#if SDL_VERSION_ATLEAST(3, 0, 0) if (!win) { return RAISE(pgExc_SDLError, "display.set_mode has not been called yet."); @@ -628,6 +629,15 @@ mouse_set_relative_mode(PyObject *self, PyObject *arg) return RAISE(pgExc_SDLError, SDL_GetError()); } #else + if (!win) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Calling mouse.set_relative_mode before calling " + "display.set_mode has been deprecated and may raise " + "errors in the future.", + 1) == -1) { + return NULL; + } + } if (SDL_SetRelativeMouseMode((SDL_bool)mode)) { return RAISE(pgExc_SDLError, SDL_GetError()); } diff --git a/src_c/pgcompat_rect.c b/src_c/pgcompat_rect.c index 0756da13bc..68548d4bcc 100644 --- a/src_c/pgcompat_rect.c +++ b/src_c/pgcompat_rect.c @@ -1,7 +1,11 @@ #include "pgcompat_rect.h" /* SDL 2.0.22 provides some utility functions for FRects */ -#if !(SDL_VERSION_ATLEAST(2, 0, 22)) +/* SDL3 changed how the edges are handled. Previously right/bottom edges were + * considered excluded from the FRect but now they aren't. + * For now do SDL2 compat, but consider changing this in the future. + * See: https://github.com/pygame-community/pygame-ce/issues/3571 */ +#if !(SDL_VERSION_ATLEAST(2, 0, 22)) || SDL_VERSION_ATLEAST(3, 0, 0) #ifndef CODE_BOTTOM #define CODE_BOTTOM 1 @@ -176,4 +180,4 @@ PG_IntersectFRectAndLine(SDL_FRect *rect, float *X1, float *Y1, float *X2, *Y2 = y2; return SDL_TRUE; } -#endif /* !(SDL_VERSION_ATLEAST(2, 0, 22)) */ +#endif /* !(SDL_VERSION_ATLEAST(2, 0, 22)) || SDL_VERSION_ATLEAST(3, 0, 0) */ diff --git a/src_c/pgcompat_rect.h b/src_c/pgcompat_rect.h index 5bba69dd21..47f7da60ff 100644 --- a/src_c/pgcompat_rect.h +++ b/src_c/pgcompat_rect.h @@ -8,14 +8,14 @@ #endif /* SDL 2.0.22 provides some utility functions for FRects */ -#if !(SDL_VERSION_ATLEAST(2, 0, 22)) +#if !(SDL_VERSION_ATLEAST(2, 0, 22)) || SDL_VERSION_ATLEAST(3, 0, 0) SDL_bool PG_IntersectFRectAndLine(SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); #else #define PG_IntersectFRectAndLine SDL_IntersectFRectAndLine -#endif /* !(SDL_VERSION_ATLEAST(2, 0, 22)) */ +#endif /* !(SDL_VERSION_ATLEAST(2, 0, 22)) || SDL_VERSION_ATLEAST(3, 0, 0) */ #define pg_PyFloat_FromFloat(x) (PyFloat_FromDouble((double)x)) diff --git a/test/key_test.py b/test/key_test.py index 79bd8e1b6f..95176cf57f 100644 --- a/test/key_test.py +++ b/test/key_test.py @@ -8,6 +8,7 @@ # keys that are not tested for const-name match SKIPPED_KEYS = {"K_UNKNOWN"} +SKIPPED_KEYS_NEW = {"K_MODE"} # This is the expected compat output KEY_NAME_COMPAT = { @@ -169,6 +170,7 @@ class KeyModuleTest(unittest.TestCase): @classmethod def setUpClass(cls): + pygame.quit() pygame.init() @classmethod @@ -286,7 +288,8 @@ def test_name_and_key_code(self): # This is a test for an implementation detail of name with use_compat=False # If this test breaks in the future for any key, it is safe to put skips on # failing keys (the implementation detail is documented as being unreliable) - self.assertEqual(pygame.key.key_code(alt_name), const_val) + if const_name not in SKIPPED_KEYS_NEW: + self.assertEqual(pygame.key.key_code(alt_name), const_val) self.assertRaises(TypeError, pygame.key.name, "fizzbuzz") self.assertRaises(TypeError, pygame.key.key_code, pygame.K_a) diff --git a/test/mouse_test.py b/test/mouse_test.py index f7642d6ab6..6a5f2d3df6 100644 --- a/test/mouse_test.py +++ b/test/mouse_test.py @@ -384,6 +384,15 @@ def test_set_visible__invalid_value(self): ) def test_set_relative_mode(self): """Tests that set_relative_mode hides the cursor.""" + for val in (True, False): + if pygame.version.SDL >= (3, 0, 0): + with self.assertRaises(pygame.error): + pygame.mouse.set_relative_mode(val) + else: + with self.assertWarns(DeprecationWarning): + pygame.mouse.set_relative_mode(val) + + pygame.display.set_mode((100, 100)) pygame.mouse.set_visible(True) pygame.mouse.set_relative_mode(True) # sets the mouse invisible visible = pygame.mouse.get_visible() @@ -398,6 +407,7 @@ def test_set_relative_mode(self): ) def test_get_relative_mode(self): """Tests that get_relative_mode correctly reports the relative mode""" + pygame.display.set_mode((100, 100)) pygame.mouse.set_relative_mode(True) self.assertEqual(pygame.mouse.get_relative_mode(), True) pygame.mouse.set_relative_mode(False) From cbcd37b00cc00a6d95ed4235679e7776dadf121f Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 31 Aug 2025 18:00:20 +0530 Subject: [PATCH 434/441] SDL3: image+scrap+transform+debug: runtime fixes --- src_c/image.c | 31 ++++++++++--------------------- src_c/scrap.c | 4 ++++ src_c/scrap_sdl2.c | 4 ++++ src_c/transform.c | 6 +++--- src_py/_debug.py | 21 ++++++++++----------- 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src_c/image.c b/src_c/image.c index 74f5d60299..63ccbcd537 100644 --- a/src_c/image.c +++ b/src_c/image.c @@ -454,17 +454,10 @@ tobytes_surf_32bpp(SDL_Surface *surf, SDL_PixelFormat *format_details, { int w, h; -#if SDL_VERSION_ATLEAST(3, 0, 0) - Uint32 Rloss = format_details->Rbits; - Uint32 Gloss = format_details->Gbits; - Uint32 Bloss = format_details->Bbits; - Uint32 Aloss = format_details->Abits; -#else - Uint32 Rloss = format_details->Rloss; - Uint32 Gloss = format_details->Gloss; - Uint32 Bloss = format_details->Bloss; - Uint32 Aloss = format_details->Aloss; -#endif + Uint32 Rloss = PG_FORMAT_R_LOSS(format_details); + Uint32 Gloss = PG_FORMAT_G_LOSS(format_details); + Uint32 Bloss = PG_FORMAT_B_LOSS(format_details); + Uint32 Aloss = PG_FORMAT_A_LOSS(format_details); Uint32 Rmask = format_details->Rmask; Uint32 Gmask = format_details->Gmask; Uint32 Bmask = format_details->Bmask; @@ -565,19 +558,15 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg) if (!format_details) { return RAISE(pgExc_SDLError, SDL_GetError()); } - SDL_Palette *surf_palette = SDL_GetSurfacePalette(surf); - Rloss = format_details->Rbits; - Gloss = format_details->Gbits; - Bloss = format_details->Bbits; - Aloss = format_details->Abits; + SDL_Palette *surf_palette = PG_GetSurfacePalette(surf); #else SDL_PixelFormat *format_details = surf->format; SDL_Palette *surf_palette = surf->format->palette; - Rloss = format_details->Rloss; - Gloss = format_details->Gloss; - Bloss = format_details->Bloss; - Aloss = format_details->Aloss; #endif + Rloss = PG_FORMAT_R_LOSS(format_details); + Gloss = PG_FORMAT_G_LOSS(format_details); + Bloss = PG_FORMAT_B_LOSS(format_details); + Aloss = PG_FORMAT_A_LOSS(format_details); Rmask = format_details->Rmask; Gmask = format_details->Gmask; Bmask = format_details->Bmask; @@ -1722,7 +1711,7 @@ SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle) } SDL_PixelFormat output_format; - SDL_Palette *surf_palette = SDL_GetSurfacePalette(surface); + SDL_Palette *surf_palette = PG_GetSurfacePalette(surface); #else SDL_PixelFormat *surf_format = surface->format; SDL_Palette *surf_palette = surface->format->palette; diff --git a/src_c/scrap.c b/src_c/scrap.c index 43fd96b915..8f1d2c8fd4 100644 --- a/src_c/scrap.c +++ b/src_c/scrap.c @@ -441,7 +441,11 @@ _scrap_put_text(PyObject *self, PyObject *args) return NULL; } +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (!SDL_SetClipboardText(text)) { +#else if (SDL_SetClipboardText(text)) { +#endif return RAISE(pgExc_SDLError, SDL_GetError()); } diff --git a/src_c/scrap_sdl2.c b/src_c/scrap_sdl2.c index 754edaf1bf..fe75a75213 100644 --- a/src_c/scrap_sdl2.c +++ b/src_c/scrap_sdl2.c @@ -109,7 +109,11 @@ pygame_scrap_put(char *type, Py_ssize_t srclen, char *src) if (strcmp(type, pygame_scrap_plaintext_type) == 0 || strcmp(type, pygame_scrap_utf8text_type) == 0) { +#if SDL_VERSION_ATLEAST(3, 0, 0) + if (SDL_SetClipboardText(src)) { +#else if (SDL_SetClipboardText(src) == 0) { +#endif return 1; } } diff --git a/src_c/transform.c b/src_c/transform.c index 6c9a563c5e..bd09e52375 100644 --- a/src_c/transform.c +++ b/src_c/transform.c @@ -3737,7 +3737,7 @@ surf_average_color(PyObject *self, PyObject *args, PyObject *kwargs) Uint8 r, g, b, a; int x, y, w, h; static char *keywords[] = {"surface", "rect", "consider_alpha", NULL}; - SDL_bool consider_alpha = SDL_FALSE; + int consider_alpha = SDL_FALSE; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|Op", keywords, &pgSurface_Type, &surfobj, &rectobj, @@ -4051,7 +4051,7 @@ surf_box_blur(PyObject *self, PyObject *args, PyObject *kwargs) pgSurfaceObject *dst_surf_obj = NULL; pgSurfaceObject *src_surf_obj; SDL_Surface *new_surf = NULL; - SDL_bool repeat_edge_pixels = SDL_TRUE; + int repeat_edge_pixels = SDL_TRUE; int radius; @@ -4084,7 +4084,7 @@ surf_gaussian_blur(PyObject *self, PyObject *args, PyObject *kwargs) pgSurfaceObject *dst_surf_obj = NULL; pgSurfaceObject *src_surf_obj; SDL_Surface *new_surf = NULL; - SDL_bool repeat_edge_pixels = SDL_TRUE; + int repeat_edge_pixels = SDL_TRUE; int radius; diff --git a/src_py/_debug.py b/src_py/_debug.py index d3d9ee5f5b..a39f599bc4 100644 --- a/src_py/_debug.py +++ b/src_py/_debug.py @@ -63,9 +63,9 @@ def _get_platform_info(): Internal helper to get platform information """ cpu_inst_dict = get_cpu_instruction_sets() - sse2 = 'Yes' if cpu_inst_dict['SSE2'] else 'No' - avx2 = 'Yes' if cpu_inst_dict['AVX2'] else 'No' - neon = 'Yes' if cpu_inst_dict['NEON'] else 'No' + sse2 = "Yes" if cpu_inst_dict["SSE2"] else "No" + avx2 = "Yes" if cpu_inst_dict["AVX2"] else "No" + neon = "Yes" if cpu_inst_dict["NEON"] else "No" ret = f"Platform:\t\t{platform.platform()}\n" ret += f"System:\t\t\t{platform.system()}\n" ret += f"System Version:\t\t{platform.version()}\n" @@ -106,18 +106,17 @@ def default_return(linked=True): get_driver as get_display_driver, get_init as display_init, ) - from pygame.mixer import ( - get_driver as get_mixer_driver, - get_init as mixer_init, - ) + + debug_str, *mixer = attempt_import("pygame.mixer", "get_driver", debug_str) + get_mixer_driver = mixer[1] if mixer[0] else lambda: None + + debug_str, *mixer = attempt_import("pygame.mixer", "get_init", debug_str) + mixer_init = mixer[1] if mixer[0] else lambda: False debug_str, *mixer = attempt_import( "pygame.mixer", "get_sdl_mixer_version", debug_str ) - if not mixer[0]: - get_sdl_mixer_version = default_return - else: - get_sdl_mixer_version = mixer[1] + get_sdl_mixer_version = mixer[1] if mixer[0] else default_return debug_str, *font = attempt_import("pygame.font", "get_sdl_ttf_version", debug_str) if not font[0]: From 833fd08bae25b86be2736440b8f1ff023a91ad68 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:58:33 -0700 Subject: [PATCH 435/441] Fix PG_SURF_BitsPerPixel SDL3 implementation --- src_c/_pygame.h | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src_c/_pygame.h b/src_c/_pygame.h index c9d88a98b2..ea461a6943 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -105,7 +105,32 @@ PG_UnlockMutex(SDL_mutex *mutex) return 0; } -#define PG_SURF_BitsPerPixel(surf) SDL_BITSPERPIXEL(surf->format) +// Implementation from SDL_GetMasksForPixelFormat, which is used by +// SDL_InitPixelFormatDetails in SDL_pixels.c +// Created to match surf->format->BitsPerPixel in SDL2, +// details->bits_per_pixel in SDL3. +static inline int +PG_SURF_BitsPerPixel(SDL_Surface *surf) +{ + if (SDL_ISPIXELFORMAT_FOURCC(surf->format)) { + // however, some of these are packed formats, and can legit declare + // bits-per-pixel! + switch (surf->format) { + case SDL_PIXELFORMAT_YUY2: + case SDL_PIXELFORMAT_UYVY: + case SDL_PIXELFORMAT_YVYU: + return 32; + default: + return 0; // oh well. + } + } + + if (SDL_BYTESPERPIXEL(surf->format) <= 2) { + return SDL_BITSPERPIXEL(surf->format); + } + return SDL_BYTESPERPIXEL(surf->format) * 8; +} + #define PG_SURF_BytesPerPixel(surf) SDL_BYTESPERPIXEL(surf->format) #define PG_FORMAT_BitsPerPixel(format) format->bits_per_pixel #define PG_FORMAT_BytesPerPixel(format) format->bytes_per_pixel From 2b6cd9c7b4eb65f94f6ba9ae427623a16f0a565a Mon Sep 17 00:00:00 2001 From: Ankith Date: Sun, 31 Aug 2025 14:23:50 +0530 Subject: [PATCH 436/441] Add wayland specific skips --- buildconfig/stubs/pygame/display.pyi | 3 +++ buildconfig/stubs/pygame/window.pyi | 12 +++++++++++- test/display_test.py | 9 +++++++++ test/event_test.py | 10 ++++++++-- test/window_test.py | 11 +++++++++-- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/buildconfig/stubs/pygame/display.pyi b/buildconfig/stubs/pygame/display.pyi index c46189eadc..077c3e0c49 100644 --- a/buildconfig/stubs/pygame/display.pyi +++ b/buildconfig/stubs/pygame/display.pyi @@ -745,6 +745,9 @@ def set_window_position(position: Point) -> None: still be able to move the window after this call. See also :func:`pygame.display.get_window_position()`. + .. note:: This function is not supported on some video drivers (like wayland) + and a :exc:`pygame.error` exception may be raised in such cases. + .. versionadded:: 2.5.0 """ diff --git a/buildconfig/stubs/pygame/window.pyi b/buildconfig/stubs/pygame/window.pyi index f671a8ebb0..f92bb3f9b5 100644 --- a/buildconfig/stubs/pygame/window.pyi +++ b/buildconfig/stubs/pygame/window.pyi @@ -222,6 +222,9 @@ class Window: Setting the always-on-top mode requires SDL 2.0.16+. + .. note:: Setting this property is not supported on some video drivers (like wayland) + and a :exc:`pygame.error` exception may be raised in such cases. + .. versionadded:: 2.3.1 """ @@ -296,12 +299,19 @@ class Window: The position may be a tuple of (x, y) coordinates or ``WINDOWPOS_CENTERED`` or ``WINDOWPOS_UNDEFINED``. The origin is the topleft of the main display. + + .. note:: Setting this property is not supported on some video drivers (like wayland) + and a :exc:`pygame.error` exception may be raised in such cases. """ @position.setter def position(self, value: Union[int, Point]) -> None: ... opacity: float - """Get or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque).""" + """Get or set the window opacity, between 0.0 (fully transparent) and 1.0 (fully opaque). + + .. note:: Setting this property is not supported on some video drivers (like wayland) + and a :exc:`pygame.error` exception may be raised in such cases. + """ @property def opengl(self) -> bool: diff --git a/test/display_test.py b/test/display_test.py index 3d7b91641f..4836f251cb 100644 --- a/test/display_test.py +++ b/test/display_test.py @@ -8,6 +8,10 @@ from pygame import display from pygame.tests.test_utils import question +pygame.display.init() +is_wayland = pygame.display.get_driver() == "wayland" +pygame.display.quit() + class DisplayModuleTest(unittest.TestCase): default_caption = "pygame window" @@ -71,6 +75,7 @@ def test_get_active(self): os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, "requires the SDL_VIDEODRIVER to be a non-null value", ) + @unittest.skipIf(is_wayland, "broken on wayland") def test_get_active_iconify(self): """Test the get_active function after an iconify""" @@ -411,6 +416,7 @@ def test_gl_set_attribute(self): os.environ.get("SDL_VIDEODRIVER") in [pygame.NULL_VIDEODRIVER, "android"], "iconify is only supported on some video drivers/platforms", ) + @unittest.skipIf(is_wayland, "broken on wayland") def test_iconify(self): pygame.display.set_mode((640, 480)) @@ -519,6 +525,7 @@ def test_quit__multiple(self): pygame.version.SDL >= (2, 32, 50), "set_gamma is removed in SDL3, does not work in sdl2-compat either", ) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_set_gamma(self): pygame.display.set_mode((1, 1)) @@ -537,6 +544,7 @@ def test_set_gamma(self): pygame.version.SDL >= (2, 32, 50), "set_gamma is removed in SDL3, does not work in sdl2-compat either", ) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_set_gamma__tuple(self): pygame.display.set_mode((1, 1)) @@ -690,6 +698,7 @@ def test_toggle_fullscreen(self): (test_surf.get_width(), test_surf.get_height()), width_height ) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_get_set_window_position(self): pygame.display.set_mode((500, 500)) pygame.display.set_window_position((420, 360)) diff --git a/test/event_test.py b/test/event_test.py index f4ce259232..73da8a85ec 100644 --- a/test/event_test.py +++ b/test/event_test.py @@ -5,6 +5,10 @@ import pygame +pygame.display.init() +is_wayland = pygame.display.get_driver() == "wayland" +pygame.display.quit() + EVENT_TYPES = ( # pygame.NOEVENT, # pygame.ACTIVEEVENT, @@ -837,8 +841,9 @@ def test_pump(self): @unittest.skipIf( os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, - 'requires the SDL_VIDEODRIVER to be a non-null value', + "requires the SDL_VIDEODRIVER to be a non-null value", ) + @unittest.skipIf(is_wayland, "broken on wayland") def test_set_grab__and_get_symmetric(self): """Ensure event grabbing can be enabled and disabled. @@ -905,8 +910,9 @@ def test_get_blocked__event_sequence(self): @unittest.skipIf( os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, - 'requires the SDL_VIDEODRIVER to be a non-null value', + "requires the SDL_VIDEODRIVER to be a non-null value", ) + @unittest.skipIf(is_wayland, "broken on wayland") def test_get_grab(self): """Ensure get_grab() works as expected""" surf = pygame.display.set_mode((10, 10)) diff --git a/test/window_test.py b/test/window_test.py index 693da90ac9..b8dd1f0056 100644 --- a/test/window_test.py +++ b/test/window_test.py @@ -11,6 +11,10 @@ IS_PYPY = "PyPy" == platform.python_implementation() +pygame.display.init() +is_wayland = pygame.display.get_driver() == "wayland" +pygame.display.quit() + class WindowTypeTest(unittest.TestCase): DEFAULT_TITLE = "pygame window" @@ -102,6 +106,7 @@ def test_always_on_top(self): SDL < (2, 0, 16), "requires SDL 2.0.16+", ) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_always_on_top_set(self): self.win.always_on_top = True self.assertTrue(self.win.always_on_top) @@ -149,6 +154,7 @@ def test_size(self): self.win.size = (640, 480) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_position(self): new_pos = (self.win.position[0] + 20, self.win.position[1] + 10) self.win.position = new_pos @@ -160,8 +166,8 @@ def test_position(self): self.assertRaises(TypeError, lambda: setattr(self.win, "position", 123)) # test set position when init - win = Window(position=(20, 48)) - self.assertTupleEqual((20, 48), win.position) + win = Window(position=new_pos) + self.assertTupleEqual(new_pos, win.position) win.destroy() self.assertRaises(TypeError, lambda: Window(position=123)) @@ -255,6 +261,7 @@ def test_opacity(self): os.environ.get("SDL_VIDEODRIVER") == pygame.NULL_VIDEODRIVER, "requires the SDL_VIDEODRIVER to be a non-null value", ) + @unittest.skipIf(is_wayland, "not supported on wayland") def test_opacity_set(self): self.win.opacity = 0.5 self.assertEqual(self.win.opacity, 0.5) From 710a9d75268edc1d262f94ec707dd6c3987bb871 Mon Sep 17 00:00:00 2001 From: Pedro Guedes <148347673+Guedxx@users.noreply.github.com> Date: Sun, 7 Sep 2025 22:15:12 -0300 Subject: [PATCH 437/441] Translate readme to Brazillian Portuguese (#3582) * add: Readme PT_BR * fix: names & wrong file added * Add Portuguese (Brazil) language link to README * Fix formatting of language links in README.pt-br.rst * Update Pygame documentation links in Portuguese README * Fix links to language README files Updated links to language-specific README files for consistency. * Fix formatting of language links in Japanese README * ran format.py --- README.rst | 3 +- docs/readmes/README.es.rst | 3 +- docs/readmes/README.fa.rst | 3 +- docs/readmes/README.fr.rst | 3 +- docs/readmes/README.gr.rst | 3 +- docs/readmes/README.it.rst | 3 +- docs/readmes/README.ja.rst | 3 +- docs/readmes/README.pt-br.rst | 228 ++++++++++++++++++++++++++++++++++ docs/readmes/README.ru.rst | 3 +- docs/readmes/README.zh-cn.rst | 3 +- docs/readmes/README.zh-tw.rst | 3 +- 11 files changed, 248 insertions(+), 10 deletions(-) create mode 100644 docs/readmes/README.pt-br.rst diff --git a/README.rst b/README.rst index f1e43b377d..a1d71cbc42 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +**English** `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ is a free and open-source cross-platform library @@ -223,3 +223,4 @@ See docs/licenses for licenses of dependencies. .. _Italiano: ./docs/readmes/README.it.rst .. _Русский: ./docs/readmes/README.ru.rst .. _Ελληνικά: ./docs/readmes/README.gr.rst +.. _Português (Brasil): ./docs/readmes/README.pt-br.rst diff --git a/docs/readmes/README.es.rst b/docs/readmes/README.es.rst index 5f1f28f9ff..ccefa726b7 100644 --- a/docs/readmes/README.es.rst +++ b/docs/readmes/README.es.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ **Español** `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ **Español** `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ --------------------------------------------------------------------------------------------------------------------------------------------------- @@ -174,3 +174,4 @@ Consulta docs/licenses para ver las licencias de dependencia. .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.fa.rst b/docs/readmes/README.fa.rst index 72fc571c83..3a8663dc17 100644 --- a/docs/readmes/README.fa.rst +++ b/docs/readmes/README.fa.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ **فارسی** `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ **فارسی** `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ --------------------------------------------------------------------------------------------------- کتابخانه @@ -260,3 +260,4 @@ LGPL-2.1-or-later **شناسه مجوز:** .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.fr.rst b/docs/readmes/README.fr.rst index ed7372b7d3..7adae3adfe 100644 --- a/docs/readmes/README.fr.rst +++ b/docs/readmes/README.fr.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ **Français** `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ **Français** `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ --------------------------------------------------------------------------------------------------------------------------------------------------- @@ -214,3 +214,4 @@ Voir les docs/licences pour les licences des dépendances. .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.gr.rst b/docs/readmes/README.gr.rst index b898029b5a..0fa1974079 100644 --- a/docs/readmes/README.gr.rst +++ b/docs/readmes/README.gr.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ **Ελληνικά** +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ **Ελληνικά** `Português (Brasil)`_ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- To Pygame_ είναι μια ελεύθερη και ανοικτού κώδικα βιβλιοθήκη πολλαπλών πλατφορμών. @@ -224,3 +224,4 @@ pygame.org ιστοσελίδα ώστε άλλοι να μάθουν και ν .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Русский: README.ru.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.it.rst b/docs/readmes/README.it.rst index 12986fa12a..e1c5fa3fbb 100644 --- a/docs/readmes/README.it.rst +++ b/docs/readmes/README.it.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ **Italiano** `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ **Italiano** `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ --------------------------------------------------------------------------------------------------- Pygame_ è una libreria open source gratuita e multipiattaforma @@ -228,3 +228,4 @@ Controlla docs/licenses per le licenze dei requisiti. .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.ja.rst b/docs/readmes/README.ja.rst index fb473cbff8..8c9afda883 100644 --- a/docs/readmes/README.ja.rst +++ b/docs/readmes/README.ja.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English` `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ **日本語** `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ **日本語** `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ --------------------------------------------------------------------------------------------------- @@ -242,3 +242,4 @@ gfxdraw には SDL_gfx の埋め込みバージョンが含まれています。 .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.pt-br.rst b/docs/readmes/README.pt-br.rst new file mode 100644 index 0000000000..9c1251acc8 --- /dev/null +++ b/docs/readmes/README.pt-br.rst @@ -0,0 +1,228 @@ +.. image:: https://raw.githubusercontent.com/pygame-community/pygame-ce/main/docs/reST/_static/pygame_ce_logo.svg + :width: 800 + :alt: pygame + :target: https://pyga.me/ + + +|DocsStatus| +|PyPiVersion| |PyPiLicense| +|Python3| |GithubCommits| |BlackFormatBadge| + +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ **Português (Brasil)** +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Pygame_ é uma biblioteca gratuita e de código aberto, multiplataforma, +para o desenvolvimento de aplicações multimídia, como videogames, usando Python. +Ela utiliza a `Simple DirectMedia Layer library`_ e várias outras bibliotecas +populares para abstrair as funções mais comuns, tornando a escrita +desses programas uma tarefa mais intuitiva. + +Essa distribuição é chamada **'pygame - Community Edition'** (abreviado como 'pygame-ce'). + +É um fork do projeto pygame original, criado por antigos desenvolvedores principais, +e surgiu após desafios impossíveis impedirem a continuação do desenvolvimento upstream. +A nova distribuição tem como objetivo oferecer lançamentos mais frequentes, correções e melhorias contínuas, +além de um modelo de governança mais democrático. + +Novos contribuidores são bem-vindos! + + +Instalação +---------- + +:: + + pip install pygame-ce + + +Ajuda +----- + +Se você está começando com pygame, deve conseguir iniciar rapidamente. +O Pygame vem com muitos tutoriais e introduções. +Também há documentação completa de referência para toda a biblioteca. +Consulte a documentação na `página de docs`_. +Você também pode acessar a documentação localmente executando +``python -m pygame.docs`` no terminal. +Se os docs não forem encontrados localmente, será aberto o site oficial. + +A documentação online é atualizada com a versão de desenvolvimento +do pygame no GitHub. Isso pode ser um pouco mais recente que a versão do pygame +que você está usando. Para atualizar para o último lançamento completo, rode: +``pip install pygame-ce --upgrade`` no terminal. + +O melhor de tudo é que o diretório de exemplos contém vários pequenos programas jogáveis +que permitem brincar com o código imediatamente. + + +Compilando do Código-Fonte +-------------------------- + +Se você deseja usar funcionalidades que estão em desenvolvimento, +ou contribuir para o pygame-ce, precisará compilar o pygame-ce +localmente a partir do código-fonte, em vez de instalar via pip. + +A instalação a partir do código-fonte é bastante automatizada. +A maior parte do trabalho envolve compilar e instalar todas as dependências do pygame. +Depois disso, execute o script ``setup.py``, que tentará +auto-configurar, compilar e instalar o pygame. + +Mais informações sobre instalação e compilação estão disponíveis +na `página de compilação do wiki`_. + + +Créditos +-------- + +Obrigado a todos que ajudaram a contribuir com esta biblioteca. +Agradecimentos especiais também são devidos. + +* Marcus Von Appen: muitas mudanças e correções, mantenedor FreeBSD 1.7.1+ +* Lenard Lindstrom: mantenedor Windows 1.8+, muitas mudanças e correções +* Brian Fisher: construtor automático svn, rastreador de bugs e muitas contribuições +* Rene Dudfield: muitas mudanças e correções, gerente de lançamentos/mantenedor 1.7+ +* Phil Hassey: pelo trabalho no site pygame.org +* DR0ID: pelo trabalho no módulo sprite +* Richard Goedeken: pela função smoothscale +* Ulf Ekström: pelo código de detecção de colisão pixel-perfect +* Pete Shinners: autor original +* David Clark: pelo apoio como braço direito +* Ed Boraas e Francis Irving: pacotes Debian +* Maxim Sobolev: empacotamento FreeBSD +* Bob Ippolito: port para macOS e OS X (muito trabalho!) +* Jan Ekhol, Ray Kelm, e Peter Nicolai: por aguentarem ideias de design iniciais +* Nat Pryce: por iniciar nossos testes unitários +* Dan Richter: pelo trabalho de documentação +* TheCorruptor: pelos logos e gráficos incríveis +* Nicholas Dudfield: por muitas melhorias nos testes +* Alex Folkner: pelo pygame-ctypes + +Agradecimentos a todos que enviaram patches e correções: +Niki Spahiev, Gordon Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman, +Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Herve Cauwelier, +James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias Spiller, +Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya, Eyal Lotem, +Regis Desgroppes, Emmanuel Hainry, Randy Kaelber, Matthew L Daniel, Nirav Patel, +Forrest Voight, Charlie Nolan, Frankie Robertson, John Krukoff, Lorenz Quack, +Nick Irvine, Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, +Evan Kroske, Cambell Barton. + +E aos caçadores de bugs que foram além: Angus, Guillaume Proux, Frank Raiser, Austin Henry, +Kaweh Kazemi, Arturo Aldama, Mike Mulcheck, Michael Benfield, David Lau. + +Há muitas outras pessoas que enviaram ideias úteis, mantiveram este projeto vivo e +basicamente tornaram nossa vida mais fácil. Obrigado! + +Muito obrigado também a todos que fizeram comentários na documentação, contribuíram para a +`documentação do pygame`_ e a `documentação do pygame-ce`_. + +E obrigado a todos que criam jogos e os publicam no site pygame.org para que outros possam aprender e se divertir. + +Muitos agradecimentos a James Paige por hospedar o bugzilla do pygame. +E um grande obrigado a Roger Dingledine e à equipe do SEUL.ORG pelo excelente serviço de hospedagem. + + +Dependências +------------ + +O Pygame depende fortemente do SDL e do Python. +Também faz uso e incorpora várias outras bibliotecas menores. +O módulo de fontes depende do SDL_ttf, que depende do freetype. +Os módulos mixer (e mixer.music) dependem do SDL_mixer. +O módulo image depende do SDL_image. +Transform.rotozoom contém uma versão embutida do SDL_rotozoom, +e gfxdraw contém uma versão embutida do SDL_gfx. +Versões de dependências: + ++----------+------------------------+ +| CPython | >= 3.9 (Ou use PyPy3) | ++----------+------------------------+ +| SDL | >= 2.0.14 | ++----------+------------------------+ +| SDL_mixer| >= 2.0.4 | ++----------+------------------------+ +| SDL_image| >= 2.0.4 | ++----------+------------------------+ +| SDL_ttf | >= 2.0.15 | ++----------+------------------------+ + + +Como Contribuir +--------------- + +Antes de tudo, obrigado por considerar contribuir com o pygame-ce! +São pessoas como você que tornam o pygame-ce uma ótima biblioteca. +Siga estes passos para começar: + +1. Leia as `Diretrizes de Contribuição`_ e a página de wiki `Muitas Formas de Contribuir`_. +2. Leia a documentação sobre `Abrindo um Pull Request`_ e `Abrindo um Pull Request de Qualidade`_. +3. Leia como `rotular e vincular issues reportadas`_. +4. Confira o `rastreador de issues`_ para ver as issues abertas que te interessam ou abra uma nova issue para iniciar uma discussão sobre sua ideia. + +Existem muitos outros recursos nas `páginas do wiki`_ que podem ajudar você a começar. + +Se tiver dúvidas, sinta-se à vontade para perguntar no `Servidor Discord da Comunidade Pygame`_ ou abrir uma issue. + + +Licença +------- + +**Identificador de Licença:** LGPL-2.1-or-later + +Esta biblioteca é distribuída sob a `GNU LGPL versão 2.1`_, que pode ser encontrada no arquivo ``docs/LGPL.txt``. +Reservamos o direito de disponibilizar versões futuras desta biblioteca sob uma licença diferente. + +Isso basicamente significa que você pode usar pygame em qualquer projeto que quiser, +mas se fizer alterações ou adições ao próprio pygame, estas +devem ser lançadas com uma licença compatível (de preferência submetidas +de volta ao projeto pygame-ce). Jogos comerciais e de código fechado são permitidos. + +Os programas no subdiretório ``examples`` estão em domínio público. + +Veja em docs/licenses as licenças das dependências. + + +.. |PyPiVersion| image:: https://img.shields.io/pypi/v/pygame-ce.svg?v=1 + :target: https://pypi.python.org/pypi/pygame-ce + +.. |PyPiLicense| image:: https://img.shields.io/pypi/l/pygame-ce.svg?v=1 + :target: https://pypi.python.org/pypi/pygame-ce + +.. |Python3| image:: https://img.shields.io/badge/python-3-blue.svg?v=1 + +.. |GithubCommits| image:: https://img.shields.io/github.amrom.workers.devmits-since/pygame-community/pygame-ce/2.5.2.svg + :target: https://github.com/pygame-community/pygame-ce/compare/2.5.3...main + +.. |DocsStatus| image:: https://img.shields.io/website?down_message=offline&label=docs&up_message=online&url=https%3A%2F%2Fpyga.me%2Fdocs%2F + :target: https://pyga.me/docs/ + +.. |BlackFormatBadge| image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + +.. _Pygame: https://pyga.me +.. _documentação do pygame-ce: https://pyga.me/docs/ +.. _documentação do pygame: https://www.pygame.org/docs/ +.. _Simple DirectMedia Layer library: https://www.libsdl.org +.. _página de compilação do wiki: https://github.com/pygame-community/pygame-ce/wiki#compiling +.. _página de docs: https://pyga.me/docs +.. _GNU LGPL versão 2.1: https://www.gnu.org/copyleft/lesser.html +.. _Diretrizes de Contribuição: https://github.com/pygame-community/pygame-ce/wiki/Contribution-guidelines +.. _Muitas Formas de Contribuir: https://github.com/pygame-community/pygame-ce/wiki/Many-ways-to-contribute +.. _Abrindo um Pull Request: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-pull-request +.. _Abrindo um Pull Request de Qualidade: https://github.com/pygame-community/pygame-ce/wiki/Opening-a-great-pull-request +.. _rastreador de issues: https://github.com/pygame-community/pygame-ce/issues +.. _rotular e vincular issues reportadas: https://github.com/pygame-community/pygame-ce/wiki/Labelling-&-linking-reported-issues +.. _Servidor Discord da Comunidade Pygame: https://discord.gg/pygame +.. _páginas do wiki: https://github.com/pygame-community/pygame-ce/wiki + +.. _English: ./../../README.rst +.. _简体中文: README.zh-cn.rst +.. _繁體中文: README.zh-tw.rst +.. _Français: README.fr.rst +.. _فارسی: README.fa.rst +.. _Español: README.es.rst +.. _日本語: README.ja.rst +.. _Italiano: README.it.rst +.. _Русский: README.ru.rst +.. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.ru.rst b/docs/readmes/README.ru.rst index 8ff8cb2b16..754e7cb4bc 100644 --- a/docs/readmes/README.ru.rst +++ b/docs/readmes/README.ru.rst @@ -8,7 +8,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ **Русский** `Ελληνικά`_ +`English`_ `简体中文`_ `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ **Русский** `Ελληνικά`_ `Português (Brasil)`_ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pygame_ - бесплатная кроссплатформенная библиотека с открытым исходным кодом @@ -223,3 +223,4 @@ License .. _日本語: README.ja.rst .. _Italiano: README.it.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.zh-cn.rst b/docs/readmes/README.zh-cn.rst index b9924f1970..91a812d764 100644 --- a/docs/readmes/README.zh-cn.rst +++ b/docs/readmes/README.zh-cn.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ **简体中文** `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ **简体中文** `繁體中文`_ `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ ---- Pygame_ 是一款自由且开源的跨平台库,用于开发电子游戏等多媒体应用。Pygame基于 `Simple DirectMedia Layer library`_ 以及其他几个广受欢迎的库,汲取其中最常见的函数,让编写游戏成为更加符合直觉的事情。 @@ -163,3 +163,4 @@ pygame显然依赖于SDL和Python。此外pygame还嵌入了几个较小的库 .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst diff --git a/docs/readmes/README.zh-tw.rst b/docs/readmes/README.zh-tw.rst index 3c8f8d2e58..517c70699d 100644 --- a/docs/readmes/README.zh-tw.rst +++ b/docs/readmes/README.zh-tw.rst @@ -7,7 +7,7 @@ |PyPiVersion| |PyPiLicense| |Python3| |GithubCommits| |BlackFormatBadge| -`English`_ `简体中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ +`English`_ `简体中文`_ **繁體中文** `Français`_ `فارسی`_ `Español`_ `日本語`_ `Italiano`_ `Русский`_ `Ελληνικά`_ `Português (Brasil)`_ ---- Pygame_ 是一款自由且開源的跨平台程式庫,用於開發電子遊戲等多媒體應用。Pygame基於 `Simple DirectMedia Layer library`_ 以及其他幾個廣受歡迎的程式庫,提取其中最常見的函數,讓編寫遊戲成為更符合直覺的事情。 @@ -182,3 +182,4 @@ pygame顯然依賴SDL和Python。此外pygame也嵌入了幾個較小的函式 .. _Italiano: README.it.rst .. _Русский: README.ru.rst .. _Ελληνικά: README.gr.rst +.. _Português (Brasil): README.pt-br.rst From 633a9e014b7bb2dc24d2c6e8b4160b3df7aa23b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 06:04:28 +0000 Subject: [PATCH 438/441] Bump actions/attest-build-provenance from 2.4.0 to 3.0.0 Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 2.4.0 to 3.0.0. - [Release notes](https://github.com/actions/attest-build-provenance/releases) - [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest-build-provenance/compare/v2.4.0...v3.0.0) --- updated-dependencies: - dependency-name: actions/attest-build-provenance dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release-gh-draft.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-gh-draft.yml b/.github/workflows/release-gh-draft.yml index c0671e714e..7c6f935e86 100644 --- a/.github/workflows/release-gh-draft.yml +++ b/.github/workflows/release-gh-draft.yml @@ -41,7 +41,7 @@ jobs: run: echo "VER=${GITHUB_REF_NAME#'release/'}" >> $GITHUB_OUTPUT - name: Generate release attestation - uses: actions/attest-build-provenance@v2.4.0 + uses: actions/attest-build-provenance@v3.0.0 with: subject-path: "pygame-wheels/*" From 55b83631014b9762bff28026c7f38ebdc923a8bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 06:04:32 +0000 Subject: [PATCH 439/441] Bump TheMrMilchmann/setup-msvc-dev from 3 to 4 Bumps [TheMrMilchmann/setup-msvc-dev](https://github.com/themrmilchmann/setup-msvc-dev) from 3 to 4. - [Release notes](https://github.com/themrmilchmann/setup-msvc-dev/releases) - [Commits](https://github.com/themrmilchmann/setup-msvc-dev/compare/v3...v4) --- updated-dependencies: - dependency-name: TheMrMilchmann/setup-msvc-dev dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index e9e2cbe6ac..39ff2175bd 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -33,7 +33,7 @@ jobs: steps: - uses: actions/checkout@v5.0.0 - - uses: TheMrMilchmann/setup-msvc-dev@v3 # this lets us use the developer command prompt on windows + - uses: TheMrMilchmann/setup-msvc-dev@v4 # this lets us use the developer command prompt on windows with: arch: ${{ matrix.msvc-dev-arch }} From 5fd18ca722fb8c4805a48abcabfe31d4d23c5b4e Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Wed, 10 Sep 2025 00:44:04 -0700 Subject: [PATCH 440/441] Update to SDL 2.32.10 and 3.2.22 --- buildconfig/download_win_prebuilt.py | 16 ++++++++-------- .../docker_base/sdl_libs/build-sdl2-libs.sh | 2 +- .../docker_base/sdl_libs/sdl2.sha512 | 2 +- meson.build | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/buildconfig/download_win_prebuilt.py b/buildconfig/download_win_prebuilt.py index 79a12d2f02..0706c078a3 100644 --- a/buildconfig/download_win_prebuilt.py +++ b/buildconfig/download_win_prebuilt.py @@ -78,12 +78,12 @@ def get_urls(x86=True, x64=True): url_sha1 = [] url_sha1.extend([ [ - 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.8/SDL2-devel-2.32.8-VC.zip', - 'ec8bbf2a2d2bf754fe04b6ffc647f78aa7f4c2a1', + 'https://github.com/libsdl-org/SDL/releases/download/release-2.32.10/SDL2-devel-2.32.10-VC.zip', + '27f5179346a0b0db80c4dd1769c7c9d62b9a91f3' ], [ - 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.18/SDL3-devel-3.2.18-VC.zip', - '96246e328e2da7c2bd2c5734d5cb98953aca8229' + 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.22/SDL3-devel-3.2.22-VC.zip', + '502313757118a068a6ef8f767d082b95334ca456' ], [ 'https://github.com/pygame-community/SDL_image/releases/download/2.8.8-pgce/SDL2_image-devel-2.8.8-VCpgce.zip', @@ -269,23 +269,23 @@ def copy(src, dst): copy( os.path.join( temp_dir, - 'SDL2-devel-2.32.8-VC/SDL2-2.32.8' + 'SDL2-devel-2.32.10-VC/SDL2-2.32.10' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL2-2.32.8' + 'SDL2-2.32.10' ) ) copy( os.path.join( temp_dir, - 'SDL3-devel-3.2.18-VC/SDL3-3.2.18' + 'SDL3-devel-3.2.22-VC/SDL3-3.2.22' ), os.path.join( move_to_dir, prebuilt_dir, - 'SDL3-3.2.18' + 'SDL3-3.2.22' ) ) diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh index 9c0f812670..5cc7754363 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/build-sdl2-libs.sh @@ -3,7 +3,7 @@ set -e -x cd $(dirname `readlink -f "$0"`) -SDL2_VER="2.32.8" +SDL2_VER="2.32.10" SDL2="SDL2-$SDL2_VER" IMG2_VER="2.8.8" IMG2="SDL2_image-$IMG2_VER" diff --git a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 index bd4567c695..d3a301c900 100644 --- a/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 +++ b/buildconfig/manylinux-build/docker_base/sdl_libs/sdl2.sha512 @@ -1,4 +1,4 @@ -484c33638e7bd1002815bb1f6a47a292d1eaf0b963598dde65f4a3e077dfe75ee35b9ea4b3b767365b3ef4f613c4d69ce55b5e96675de562994344e83a978272 SDL2-2.32.8.tar.gz +b67ebdb46bc3b41c974113937e15445e47a6e115692761e2812c3965e85b9ca4d804633de6369fa3dd36cc77f5d08655570c1707245b2c46f88114aa3238fd1b SDL2-2.32.10.tar.gz 5c521ae6a053e1eb6b42dce3ccccdbdb353eb7e9d1bd89392b1913bfc9fbb6b8a9d5506c80e5b7924b51637bb95cd270657ca87dafe60edd5534e333524bc901 SDL2_image-2.8.8.tar.gz 6148591404b2113bcdb54391821658548acfe380a9cba660113e55e6f2fb7da2a5a59a99fefe51a0d7f8b91160648f11f72750353da88d285a962e3a410aecd7 SDL2_mixer-2.8.1.tar.gz a0f94e26f0387385f13ec1eb08ddca677d4181969073a50af387a0dce9c7bdddf393c028c8084538e01f875e19790ef7ae9a00c5106bf7ca9d21f3fcf9eee885 SDL2_ttf-2.24.0.tar.gz diff --git a/meson.build b/meson.build index 011ed5f06a..fc4a30664b 100644 --- a/meson.build +++ b/meson.build @@ -94,7 +94,7 @@ if plat == 'win' and host_machine.cpu_family().startswith('x86') # yes, this is a bit ugly and hardcoded but it is what it is # TODO (middle-term goal) - Should migrate away from this # consider meson wraps? Hopefully can also get the same build path as below - sdl_ver = (sdl_api == 3) ? '3.2.18' : '2.32.8' + sdl_ver = (sdl_api == 3) ? '3.2.22' : '2.32.10' sdl_image_ver = (sdl_api == 3) ? '3.2.4' : '2.8.8' sdl_mixer_ver = '2.8.1' sdl_ttf_ver = (sdl_api == 3) ? '3.2.2' : '2.24.0' From 35afcc04248225fa115e3379462e1b970d2e4e56 Mon Sep 17 00:00:00 2001 From: Steven Wallace Date: Sat, 20 Sep 2025 13:48:39 -0500 Subject: [PATCH 441/441] Add weak reference support to Texture --- src_c/include/_pygame.h | 1 + src_c/render.c | 5 +++++ test/render_test.py | 9 +++++++++ 3 files changed, 15 insertions(+) diff --git a/src_c/include/_pygame.h b/src_c/include/_pygame.h index b11e884787..430c0cbe4e 100644 --- a/src_c/include/_pygame.h +++ b/src_c/include/_pygame.h @@ -556,6 +556,7 @@ struct pgTextureObject { pgRendererObject *renderer; int width; int height; + PyObject *weakreflist; }; typedef struct { diff --git a/src_c/render.c b/src_c/render.c index d76115ecc3..a994665d1b 100644 --- a/src_c/render.c +++ b/src_c/render.c @@ -682,6 +682,7 @@ texture_from_surface(PyObject *self, PyObject *args, PyObject *kwargs) Py_XINCREF(new_texture->renderer); new_texture->width = surf->w; new_texture->height = surf->h; + new_texture->weakreflist = NULL; return (PyObject *)new_texture; } @@ -1169,6 +1170,9 @@ texture_dealloc(pgTextureObject *self, PyObject *_null) if (self->texture) { SDL_DestroyTexture(self->texture); } + if (self->weakreflist) { + PyObject_ClearWeakRefs((PyObject *)self); + } Py_TYPE(self)->tp_free(self); } @@ -1289,6 +1293,7 @@ static PyTypeObject pgTexture_Type = { .tp_basicsize = sizeof(pgTextureObject), .tp_dealloc = (destructor)texture_dealloc, .tp_doc = DOC_SDL2_VIDEO_TEXTURE, + .tp_weaklistoffset = offsetof(pgTextureObject, weakreflist), .tp_methods = texture_methods, .tp_init = (initproc)texture_init, .tp_new = PyType_GenericNew, diff --git a/test/render_test.py b/test/render_test.py index 3654e390aa..112e93786a 100644 --- a/test/render_test.py +++ b/test/render_test.py @@ -1,4 +1,6 @@ +import gc import unittest +import weakref import pygame import pygame._render as _render @@ -465,6 +467,13 @@ def test_draw(self): for x in range(64, 82): self.assertEqual(pygame.Color(80, 120, 160, 255), result.get_at((x, 50))) + def test_garbage_collection(self): + reference = weakref.ref(self.texture) + self.assertTrue(reference() is self.texture) + del self.texture + gc.collect() + self.assertIsNone(reference()) + def test_update(self): surface = pygame.Surface((100, 100)) surface.fill(pygame.Color(80, 120, 160, 128))

    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⁣&}V2|M`L)jhhk_gH?HF6RGAe2*JN& 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 aToYEx^|lG&|DHxbP_8`Fm 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%0D^By z{m3X`Q*w6_+|*pP{W;!1=dL_%u}D? zV$&TOT5B_<$h~!i()b}6k}Ckj$oc>Up*zv_=fM`<8tk{XrX8$zyd`-|96SM+#lwYy zyQAYDh2vrUVt|#rfN{2#0UhO9V?h8*#o`~A66N;ntd1s-g_y+3*uac9R)l^jdSo*A z%2muRT6H!mE^)Sk<#IZhR3v0!xM#Y`#4b!(Tpi$`>Z>pPFhWdSLVwiAQG2s2;1If3 zM)>%tKAjLiVZ9$p8yEy|>i#OBdh!I(-gAstzqt@e95Z$7?d^rr4wuk24zb~v)W9M} z3Xm)_GwHlB92jmN9v*UFjV#)Z#!>tBPyzdwc3%SGD-lYG(sr46VaH<`tz?0HJgy~0 zMO?rXFkB>TXU8$Gnj2hFl8Zmo1XZSh-x>dn89Ct*CVz!$EMEtVE0*|@`k>(`iIXh) zQ_kmgekBrIXpPpaV0T~|Ftz9}uMc~qfYn#pP+I!UqC;1Pbt%KG4xyhG;9`ETi zpa4w1qsl`1NgV9#%kBtc0|qU~!p@MqDclfOJGOtfhZVSuL^`#w4(f-~2M|_+mc=Y! zN4lNeqL+>^dnpam=L6r@aVVg)cXz~LwY8z>a?vp`mg*&@;?4?v3||8&R+=piDGxH` zr!LISa&9k|RM^ajjJT5#NIyVe5eB$-)T-)tP7g_uJF~!+KS6nUdFh_aqPGGX@P9Rh zxx{hyx*vkV3+S@&Fs>|W`F_hPc?BI^urFq@r!2Um>@pCvnwXlJ4gt;EP+v4}0!`w; zlz$X3368+2*-gN}!Bx-|Fuw`sd2Txp2UFkup8&1}QTjeSZ+W~o?6MiAqkAZj==FN3 zkN{*=?T^qTz9o>G(=asu>xdjGsHsKmi_B-CTvuQOd_BQ?&-P+C|5k!EI5@cc2X=n&c$!9l>Ca5T^c~q~Lg4p=_YKZ?fB41@nTR6ASU6k^YCkzxVh)?l2{qd~!1*5?51_@QR4R2k1-OykhJo+4p`h2H z0+O*Uxd;i3GXOcy58e&GRSx&)D2if!u*0@r79L!cX%~aprO!G@;p$6$+hZySy72kC zFA~0f@lOZjxiW!3DGVGOQ!?dxAZAUuG@=Yz9_*WQ}^qw{W86j zovk!w0|D_2#j-fiHz|iB48Oh_*3Se(^UPeti2#CEP8>7=US}Q;44j@$;7E-nHWZOG zYIXl;u|THJWoAFgJMY7?27)foH)*YmM%c3FFKqDl0T5FMU=YY^uVQFn9bcsj6v&sD2&Kv zvxz`do$L;;XGL5q(DN5qa0RI?b4>sz(YmZQ8bu&i{4guhE{42m0FX^@3G|#{acWR< zY$GN~LYvKI<7fcGQGG%HPzWS8q7WM2E$M;jd0`?@MIsTXtWDe5nrPJ0u*c3I_Uwj{ zWzGO{H@gIerzv2Ur+4jnPcH)R>0_WW02q#1oVpl7qr^s)C>XiTX!I{J+H4|*fL*)v zOFBr&CzmmdC~jfx>=l(-)UZoSnMJqh;^~g9z0~qfDkQN+<^-Gn{ z>IlDo<8l9EbmXppwK1I+3z0P?q*)cVBA7s)*}08QB98Am(t>Mr&D3)xBS(;d(p z)1lYvM@O}wWln5^BB_)-pX*OA9bdWCC8@oW1~b8ffPa895cR{Xdc9ux>y36{*U9M) z!37ONIXp;%J8(oiG!6hxM@L46Z;|2DcvvUME!FCDJ?wnF2LL8!yIW*>X+KUgw)++| zGz<+z(II>SN5t3^8^Ep!aBFDT;0}9q)PU1v1O;h`goeetXJ9qwxe zo>dQFbJ*VLghk5_0I+1Fo!0=to6s=2*!r9Z15UQ_<-EK0I&Emi*~FmcKUYrv*T6s) zHt6b_wlDFbbcr2)Rna=UT?L(KijU^v0)&?0+gl-Qs_QFV1iT#sV@GLrc6@E(Pp6@} zN5|tedFTn}qb=ACMfQ4%YD0rSfVQeX16Ue@6EpT()W15Xn7}4i`Iqmkv5sc z+H5w7fxjgRT@u{e+xcgTLI2+wz%!M?Bip#G7qhT0hGymaZQXis6@Sa(G7yrLmGy6U z`C1rYeD|=ow|9INjbW7@)IVdU+b(3{V)H)7RG* j(?mnRT4V6wvQJ3Z6AJ?HFfpJ{XUXn)LZ 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

    EW}c62Tg#oZM?Uc&W1(qAA6w?m^I2K*)vY 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 UJMN3~C>>a4CRWDvh92?%2YQ9F3jhEB diff --git a/docs/reST/_static/pygame_ce_logo.webp b/docs/reST/_static/pygame_ce_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..d930bd15bd0dd02507da73e150fd16f2c833b678 GIT binary patch literal 127910 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