Skip to content

Commit 23bbb3b

Browse files
authored
Merge pull request #3160 from Starbuck5/color-sdl3
Adjust pg_MappedColorFromObj API for SDL3-porting
2 parents 369fc5a + e062bec commit 23bbb3b

File tree

10 files changed

+40
-46
lines changed

10 files changed

+40
-46
lines changed

docs/reST/c_api/color.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ Header file: src_c/include/pygame.h
4444
instances and tuples. It can also handle integer and string color inputs based
4545
on ``handle_flags``.
4646
47-
.. c:function:: int pg_MappedColorFromObj(PyObject *val, SDL_PixelFormat *format, Uint32 *color, pgColorHandleFlags handle_flags)
47+
.. c:function:: int pg_MappedColorFromObj(PyObject *val, SDL_Surface *surf, Uint32 *color, pgColorHandleFlags handle_flags)
4848
4949
Like above function, but returns mapped color instead. One notable point of difference is
5050
the way in which ints are handled (this function directly interprets the int passed as the
51-
mapped color)
51+
mapped color on the surface ``surf```)

src_c/color.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static int
219219
pg_RGBAFromObjEx(PyObject *color, Uint8 rgba[],
220220
pgColorHandleFlags handle_flags);
221221
static int
222-
pg_MappedColorFromObj(PyObject *val, SDL_PixelFormat *format, Uint32 *color,
222+
pg_MappedColorFromObj(PyObject *val, SDL_Surface *surf, Uint32 *color,
223223
pgColorHandleFlags handle_flags);
224224

225225
/**
@@ -2386,7 +2386,7 @@ pg_RGBAFromObjEx(PyObject *obj, Uint8 *rgba, pgColorHandleFlags handle_flags)
23862386
}
23872387

23882388
static int
2389-
pg_MappedColorFromObj(PyObject *val, SDL_PixelFormat *format, Uint32 *color,
2389+
pg_MappedColorFromObj(PyObject *val, SDL_Surface *surf, Uint32 *color,
23902390
pgColorHandleFlags handle_flags)
23912391
{
23922392
Uint8 rgba[] = {0, 0, 0, 0};
@@ -2401,8 +2401,11 @@ pg_MappedColorFromObj(PyObject *val, SDL_PixelFormat *format, Uint32 *color,
24012401
/* int is already handled, unset it */
24022402
handle_flags &= ~PG_COLOR_HANDLE_INT;
24032403
if (pg_RGBAFromObjEx(val, rgba, handle_flags)) {
2404-
*color =
2405-
(Uint32)SDL_MapRGBA(format, rgba[0], rgba[1], rgba[2], rgba[3]);
2404+
#if SDL_VERSION_ATLEAST(3, 0, 0)
2405+
*color = SDL_MapSurfaceRGBA(surf, rgba[0], rgba[1], rgba[2], rgba[3]);
2406+
#else
2407+
*color = SDL_MapRGBA(surf->format, rgba[0], rgba[1], rgba[2], rgba[3]);
2408+
#endif
24062409
return 1;
24072410
}
24082411
return 0;

src_c/draw.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ draw_round_rect(SDL_Surface *surf, int x1, int y1, int x2, int y2, int radius,
100100
int bottom_left, int bottom_right, int *drawn_area);
101101

102102
// validation of a draw color
103-
#define CHECK_LOAD_COLOR(colorobj) \
104-
if (!pg_MappedColorFromObj((colorobj), surf->format, &color, \
105-
PG_COLOR_HANDLE_ALL)) { \
106-
return NULL; \
103+
#define CHECK_LOAD_COLOR(colorobj) \
104+
if (!pg_MappedColorFromObj((colorobj), surf, &color, \
105+
PG_COLOR_HANDLE_ALL)) { \
106+
return NULL; \
107107
}
108108

109109
/* Definition of functions that get called in Python */

src_c/include/_pygame.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,8 @@ typedef struct pgColorObject pgColorObject;
466466
(*(int (*)(PyObject *, Uint8 *, pgColorHandleFlags))PYGAMEAPI_GET_SLOT( \
467467
color, 2))
468468

469-
#define pg_MappedColorFromObj \
470-
(*(int (*)(PyObject *, SDL_PixelFormat *, Uint32 *, \
469+
#define pg_MappedColorFromObj \
470+
(*(int (*)(PyObject *, SDL_Surface *, Uint32 *, \
471471
pgColorHandleFlags))PYGAMEAPI_GET_SLOT(color, 4))
472472

473473
#define pgColor_AsArray(x) (((pgColorObject *)x)->data)

src_c/mask.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,14 +1129,14 @@ mask_from_threshold(PyObject *self, PyObject *args, PyObject *kwargs)
11291129
surf2 = pgSurface_AsSurface(surfobj2);
11301130
}
11311131

1132-
if (!pg_MappedColorFromObj(rgba_obj_color, surf->format, &color,
1132+
if (!pg_MappedColorFromObj(rgba_obj_color, surf, &color,
11331133
PG_COLOR_HANDLE_INT)) {
11341134
return NULL;
11351135
}
11361136

11371137
if (rgba_obj_threshold) {
1138-
if (!pg_MappedColorFromObj(rgba_obj_threshold, surf->format,
1139-
&color_threshold, PG_COLOR_HANDLE_INT)) {
1138+
if (!pg_MappedColorFromObj(rgba_obj_threshold, surf, &color_threshold,
1139+
PG_COLOR_HANDLE_INT)) {
11401140
return NULL;
11411141
}
11421142
}
@@ -1927,8 +1927,7 @@ extract_color(SDL_Surface *surf, PyObject *color_obj, Uint8 rgba_color[],
19271927
return 1;
19281928
}
19291929

1930-
return pg_MappedColorFromObj(color_obj, surf->format, color,
1931-
PG_COLOR_HANDLE_ALL);
1930+
return pg_MappedColorFromObj(color_obj, surf, color, PG_COLOR_HANDLE_ALL);
19321931
}
19331932

19341933
/* Draws a mask on a surface.

src_c/meson.build

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ base = py.extension_module(
1212
)
1313
endif
1414

15-
# TODO: support SDL3
16-
if sdl_api != 3
1715
color = py.extension_module(
1816
'color',
1917
'color.c',
@@ -22,7 +20,6 @@ color = py.extension_module(
2220
install: true,
2321
subdir: pg,
2422
)
25-
endif
2623

2724
# TODO: support SDL3
2825
if sdl_api != 3

src_c/pixelarray.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,7 +1112,7 @@ _array_assign_sequence(pgPixelArrayObject *array, Py_ssize_t low,
11121112
}
11131113
for (x = 0; x < val_dim0; ++x) {
11141114
item = PySequence_ITEM(val, x);
1115-
if (!_get_color_from_object(item, format, (val_colors + x))) {
1115+
if (!_get_color_from_object(item, surf, (val_colors + x))) {
11161116
Py_DECREF(item);
11171117
free(val_colors);
11181118
return -1;
@@ -1299,7 +1299,7 @@ _pxarray_ass_item(pgPixelArrayObject *array, Py_ssize_t index, PyObject *value)
12991299

13001300
bpp = PG_SURF_BytesPerPixel(surf);
13011301

1302-
if (!_get_color_from_object(value, surf->format, &color)) {
1302+
if (!_get_color_from_object(value, surf, &color)) {
13031303
if (PyTuple_Check(value)) {
13041304
return -1;
13051305
}
@@ -1425,7 +1425,7 @@ _pxarray_ass_slice(pgPixelArrayObject *array, Py_ssize_t low, Py_ssize_t high,
14251425
return _array_assign_array(array, low, high,
14261426
(pgPixelArrayObject *)value);
14271427
}
1428-
if (_get_color_from_object(value, surf->format, &color)) {
1428+
if (_get_color_from_object(value, surf, &color)) {
14291429
return _array_assign_slice(array, low, high, color);
14301430
}
14311431
if (PyTuple_Check(value)) {
@@ -1460,7 +1460,7 @@ _pxarray_contains(pgPixelArrayObject *array, PyObject *value)
14601460

14611461
bpp = PG_SURF_BytesPerPixel(surf);
14621462

1463-
if (!_get_color_from_object(value, surf->format, &color)) {
1463+
if (!_get_color_from_object(value, surf, &color)) {
14641464
return -1;
14651465
}
14661466

src_c/pixelarray_methods.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,14 @@
3636
* Tries to retrieve a valid color for a Surface.
3737
*/
3838
static int
39-
_get_color_from_object(PyObject *val, SDL_PixelFormat *format, Uint32 *color)
39+
_get_color_from_object(PyObject *val, SDL_Surface *surf, Uint32 *color)
4040
{
4141
if (!val) {
4242
return 0;
4343
}
4444

4545
return pg_MappedColorFromObj(
46-
val, format, color,
47-
PG_COLOR_HANDLE_INT | PG_COLOR_HANDLE_RESTRICT_SEQ);
46+
val, surf, color, PG_COLOR_HANDLE_INT | PG_COLOR_HANDLE_RESTRICT_SEQ);
4847
}
4948

5049
/**
@@ -376,8 +375,8 @@ _replace_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds)
376375
format = surf->format;
377376
bpp = PG_SURF_BytesPerPixel(surf);
378377

379-
if (!_get_color_from_object(delcolor, format, &dcolor) ||
380-
!_get_color_from_object(replcolor, format, &rcolor)) {
378+
if (!_get_color_from_object(delcolor, surf, &dcolor) ||
379+
!_get_color_from_object(replcolor, surf, &rcolor)) {
381380
return 0;
382381
}
383382

@@ -582,7 +581,7 @@ _extract_color(pgPixelArrayObject *array, PyObject *args, PyObject *kwds)
582581
black = SDL_MapRGBA(format, 0, 0, 0, 255);
583582
white = SDL_MapRGBA(format, 255, 255, 255, 255);
584583

585-
if (!_get_color_from_object(excolor, format, &color)) {
584+
if (!_get_color_from_object(excolor, surf, &color)) {
586585
Py_DECREF(new_array);
587586
return 0;
588587
}

src_c/surface.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -809,8 +809,7 @@ surf_set_at(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
809809
Py_RETURN_NONE;
810810
}
811811

812-
if (!pg_MappedColorFromObj(rgba_obj, surf->format, &color,
813-
PG_COLOR_HANDLE_ALL)) {
812+
if (!pg_MappedColorFromObj(rgba_obj, surf, &color, PG_COLOR_HANDLE_ALL)) {
814813
return NULL;
815814
}
816815

@@ -1207,7 +1206,7 @@ surf_set_colorkey(pgSurfaceObject *self, PyObject *args)
12071206
SURF_INIT_CHECK(surf)
12081207

12091208
if (rgba_obj && rgba_obj != Py_None) {
1210-
if (!pg_MappedColorFromObj(rgba_obj, surf->format, &color,
1209+
if (!pg_MappedColorFromObj(rgba_obj, surf, &color,
12111210
PG_COLOR_HANDLE_ALL)) {
12121211
return NULL;
12131212
}
@@ -1748,8 +1747,7 @@ surf_fill(pgSurfaceObject *self, PyObject *args, PyObject *keywds)
17481747
return NULL;
17491748
SURF_INIT_CHECK(surf)
17501749

1751-
if (!pg_MappedColorFromObj(rgba_obj, surf->format, &color,
1752-
PG_COLOR_HANDLE_ALL)) {
1750+
if (!pg_MappedColorFromObj(rgba_obj, surf, &color, PG_COLOR_HANDLE_ALL)) {
17531751
return NULL;
17541752
}
17551753

src_c/transform.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,19 +1825,19 @@ Returns 0 if ok, and sets color to the color.
18251825
If rgba_default is NULL, do not use a default color, return -1.
18261826
*/
18271827
int
1828-
_color_from_obj(PyObject *color_obj, SDL_PixelFormat *format,
1829-
Uint8 rgba_default[4], Uint32 *color)
1828+
_color_from_obj(PyObject *color_obj, SDL_Surface *surf, Uint8 rgba_default[4],
1829+
Uint32 *color)
18301830
{
18311831
if (color_obj) {
1832-
if (!pg_MappedColorFromObj(color_obj, format, color,
1832+
if (!pg_MappedColorFromObj(color_obj, surf, color,
18331833
PG_COLOR_HANDLE_INT)) {
18341834
return -1;
18351835
}
18361836
}
18371837
else {
18381838
if (!rgba_default)
18391839
return -1;
1840-
*color = SDL_MapRGBA(format, rgba_default[0], rgba_default[1],
1840+
*color = SDL_MapRGBA(surf->format, rgba_default[0], rgba_default[1],
18411841
rgba_default[2], rgba_default[3]);
18421842
}
18431843
return 0;
@@ -1961,17 +1961,16 @@ surf_threshold(PyObject *self, PyObject *args, PyObject *kwds)
19611961
}
19621962

19631963
if (search_color_obj != Py_None) {
1964-
if (_color_from_obj(search_color_obj, surf->format, NULL,
1965-
&color_search_color))
1964+
if (_color_from_obj(search_color_obj, surf, NULL, &color_search_color))
19661965
return RAISE(PyExc_TypeError, "invalid search_color argument");
19671966
}
1968-
if (_color_from_obj(threshold_obj, surf->format, rgba_threshold_default,
1967+
if (_color_from_obj(threshold_obj, surf, rgba_threshold_default,
19691968
&color_threshold))
19701969
return RAISE(PyExc_TypeError, "invalid threshold argument");
19711970

19721971
if (set_color_obj != Py_None) {
1973-
if (_color_from_obj(set_color_obj, surf->format,
1974-
rgba_set_color_default, &color_set_color))
1972+
if (_color_from_obj(set_color_obj, surf, rgba_set_color_default,
1973+
&color_set_color))
19751974
return RAISE(PyExc_TypeError, "invalid set_color argument");
19761975
}
19771976

@@ -2416,8 +2415,7 @@ surf_solid_overlay(PyObject *self, PyObject *args, PyObject *kwargs)
24162415

24172416
surf = pgSurface_AsSurface(surfobj);
24182417

2419-
if (!pg_MappedColorFromObj(colorobj, surf->format, &color,
2420-
PG_COLOR_HANDLE_ALL)) {
2418+
if (!pg_MappedColorFromObj(colorobj, surf, &color, PG_COLOR_HANDLE_ALL)) {
24212419
return RAISE(PyExc_TypeError, "invalid color argument");
24222420
}
24232421

0 commit comments

Comments
 (0)