/* pygame - Python Game Library Copyright (C) 2000-2001 Pete Shinners 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 */ #ifndef _PYGAME_H #define _PYGAME_H /** This header file includes all the definitions for the ** base pygame extensions. This header only requires ** Python includes (and SDL.h for functions that use SDL types). ** The reason for functions prototyped with #define's is ** to allow for maximum Python portability. It also uses ** Python as the runtime linker, which allows for late binding. '' For more information on this style of development, read ** the Python docs on this subject. ** http://www.python.org/doc/current/ext/using-cobjects.html ** ** If using this to build your own derived extensions, ** you'll see that the functions available here are mainly ** used to help convert between python objects and SDL objects. ** Since this library doesn't add a lot of functionality to ** the SDL library, it doesn't need to offer a lot either. ** ** When initializing your extension module, you must manually ** import the modules you want to use. (this is the part about ** using python as the runtime linker). Each module has its ** own import_xxx() routine. You need to perform this import ** after you have initialized your own module, and before ** you call any routines from that module. Since every module ** in pygame does this, there are plenty of examples. ** ** The base module does include some useful conversion routines ** that you are free to use in your own extension. **/ #include "pgplatform.h" #include /* version macros (defined since version 1.9.5) */ #define PG_MAJOR_VERSION 2 #define PG_MINOR_VERSION 5 #define PG_PATCH_VERSION 2 #define PG_VERSIONNUM(MAJOR, MINOR, PATCH) \ (1000 * (MAJOR) + 100 * (MINOR) + (PATCH)) #define PG_VERSION_ATLEAST(MAJOR, MINOR, PATCH) \ (PG_VERSIONNUM(PG_MAJOR_VERSION, PG_MINOR_VERSION, PG_PATCH_VERSION) >= \ PG_VERSIONNUM(MAJOR, MINOR, PATCH)) #include "pgcompat.h" /* Flag indicating a pg_buffer; used for assertions within callbacks */ #ifndef NDEBUG #define PyBUF_PYGAME 0x4000 #endif #define PyBUF_HAS_FLAG(f, F) (((f) & (F)) == (F)) /* Array information exchange struct C type; inherits from Py_buffer * * Pygame uses its own Py_buffer derived C struct as an internal representation * of an imported array buffer. The extended Py_buffer allows for a * per-instance release callback, */ typedef void (*pybuffer_releaseproc)(Py_buffer *); typedef struct pg_bufferinfo_s { Py_buffer view; PyObject *consumer; /* Input: Borrowed reference */ pybuffer_releaseproc release_buffer; } pg_buffer; #include "pgimport.h" /* * BASE module */ #ifndef PYGAMEAPI_BASE_INTERNAL #define pgExc_SDLError ((PyObject *)PYGAMEAPI_GET_SLOT(base, 0)) #define pg_RegisterQuit \ (*(void (*)(void (*)(void)))PYGAMEAPI_GET_SLOT(base, 1)) /** * \brief Convert number like object *obj* to C int and in *val*. * * \param obj The Python object to convert. * \param val A pointer to the C integer to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. * \note This function will convert floats to integers. */ #define pg_IntFromObj \ (*(int (*)(PyObject *, int *))PYGAMEAPI_GET_SLOT(base, 2)) /** * \brief Convert number like object at position *i* in sequence *obj* * to C int and place in argument *val*. * * \param obj The Python object to convert. * \param i The index of the object to convert. * \param val A pointer to the C integer to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. * \note This function will convert floats to integers. */ #define pg_IntFromObjIndex \ (*(int (*)(PyObject *, int, int *))PYGAMEAPI_GET_SLOT(base, 3)) /** * \brief Convert the two number like objects in length 2 sequence *obj* to C * int and place in arguments *val1* and *val2*. * * \param obj The Python two element sequence object to convert. * \param val A pointer to the C integer to store the result. * \param val2 A pointer to the C integer to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. * \note This function will convert floats to integers. */ #define pg_TwoIntsFromObj \ (*(int (*)(PyObject *, int *, int *))PYGAMEAPI_GET_SLOT(base, 4)) /** * \brief Convert number like object *obj* to C float and in *val*. * * \param obj The Python object to convert. * \param val A pointer to the C float to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. */ #define pg_FloatFromObj \ (*(int (*)(PyObject *, float *))PYGAMEAPI_GET_SLOT(base, 5)) /** * \brief Convert number like object at position *i* in sequence *obj* to C * float and place in argument *val*. * * \param obj The Python object to convert. * \param i The index of the object to convert. * \param val A pointer to the C float to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. */ #define pg_FloatFromObjIndex \ (*(int (*)(PyObject *, int, float *))PYGAMEAPI_GET_SLOT(base, 6)) /** * \brief Convert the two number like objects in length 2 sequence *obj* to C * float and place in arguments *val1* and *val2*. * * \param obj The Python two element sequence object to convert. * \param val A pointer to the C float to store the result. * \param val2 A pointer to the C float to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. */ #define pg_TwoFloatsFromObj \ (*(int (*)(PyObject *, float *, float *))PYGAMEAPI_GET_SLOT(base, 7)) /** * \brief Convert number like object *obj* to C Uint32 and in *val*. * * \param obj The Python object to convert. * \param val A pointer to the C int to store the result. * \returns 1 if the conversion was successful, 0 otherwise. */ #define pg_UintFromObj \ (*(int (*)(PyObject *, Uint32 *))PYGAMEAPI_GET_SLOT(base, 8)) /** * \brief Convert number like object at position *i* in sequence *obj* to C * Uint32 and place in argument *val*. * * \param obj The Python object to convert. * \param i The index of the object to convert. * \param val A pointer to the C int to store the result. * \returns 1 if the conversion was successful, 0 otherwise. */ #define pg_UintFromObjIndex \ (*(int (*)(PyObject *, int, Uint32 *))PYGAMEAPI_GET_SLOT(base, 9)) /** * \brief Initialize all of the pygame modules. * \returns 1 on success, 0 on failure with PyErr set. */ #define pg_mod_autoinit (*(int (*)(const char *))PYGAMEAPI_GET_SLOT(base, 10)) /** * \brief Quit all of the pygame modules. */ #define pg_mod_autoquit (*(void (*)(const char *))PYGAMEAPI_GET_SLOT(base, 11)) /** * \brief Convert the color represented by object *obj* into a red, green, * blue, alpha length 4 C array *RGBA*. * * The object must be a length 3 or 4 sequence of numbers having values between * 0 and 255 inclusive. For a length 3 sequence an alpha value of 255 is * assumed. * * \param obj The Python object to convert. * \param RGBA A pointer to the C array to store the result. * \returns 1 if the conversion was successful, 0 otherwise. */ #define pg_RGBAFromObj \ (*(int (*)(PyObject *, Uint8 *))PYGAMEAPI_GET_SLOT(base, 12)) /** * \brief Given a Py_buffer, return a python dictionary representing the array * interface. * * \param view_p A pointer to the Py_buffer to convert to a dictionary. * * \returns A Python dictionary representing the array interface of the object. */ #define pgBuffer_AsArrayInterface \ (*(PyObject * (*)(Py_buffer *)) PYGAMEAPI_GET_SLOT(base, 13)) /** * \brief Given a Py_buffer, return a python capsule representing the array * interface. * * \param view_p A pointer to the Py_buffer to convert to a capsule. * * \returns A Python capsule representing the array interface of the object. */ #define pgBuffer_AsArrayStruct \ (*(PyObject * (*)(Py_buffer *)) PYGAMEAPI_GET_SLOT(base, 14)) /** * \brief Get a buffer object from a given Python object. * * \param obj The Python object to get the buffer from. * \param pg_view_p A pointer to a pg_buffer struct to store the buffer in. * \param flags The desired buffer access mode. * * \returns 0 on success, -1 on failure. * * \note This function attempts to get a buffer object from a given Python * object. If the object supports the buffer protocol, it will be used to * create the buffer. If not, it will try to get an array interface or * dictionary representation of the object and use that to create the buffer. * If none of these methods work, it will raise a ValueError. * */ #define pgObject_GetBuffer \ (*(int (*)(PyObject *, pg_buffer *, int))PYGAMEAPI_GET_SLOT(base, 15)) /** * \brief Release a pg_buffer object. * * \param pg_view_p The pg_buffer object to release. * * \note This function releases a pg_buffer object. * \note some calls to this function expect this function to not clear * previously set errors. */ #define pgBuffer_Release (*(void (*)(pg_buffer *))PYGAMEAPI_GET_SLOT(base, 16)) /** * \brief Write the array interface dictionary buffer description *dict* into a * Pygame buffer description struct *pg_view_p*. * * \param pg_view_p The Pygame buffer description struct to write into. * \param dict The array interface dictionary to read from. * \param flags The PyBUF flags describing the view type requested. * * \returns 0 on success, or -1 on failure. */ #define pgDict_AsBuffer \ (*(int (*)(pg_buffer *, PyObject *, int))PYGAMEAPI_GET_SLOT(base, 17)) #define pgExc_BufferError ((PyObject *)PYGAMEAPI_GET_SLOT(base, 18)) /** * \brief Get the default SDL window created by a pygame.display.set_mode() * call, or *NULL*. * * \return The default window, or *NULL* if no window has been created. */ #define pg_GetDefaultWindow \ (*(SDL_Window * (*)(void)) PYGAMEAPI_GET_SLOT(base, 19)) /** * \brief Set the default SDL window created by a pygame.display.set_mode() * call. The previous window, if any, is destroyed. Argument *win* may be * *NULL*. This function is called by pygame.display.set_mode(). * * \param win The new default window. May be NULL. */ #define pg_SetDefaultWindow \ (*(void (*)(SDL_Window *))PYGAMEAPI_GET_SLOT(base, 20)) /** * \brief Return a borrowed reference to the Pygame default window display * surface, or *NULL* if no default window is open. * * \return The default renderer, or *NULL* if no renderer has been created. */ #define pg_GetDefaultWindowSurface \ (*(pgSurfaceObject * (*)(void)) PYGAMEAPI_GET_SLOT(base, 21)) /** * \brief Set the Pygame default window display surface. The previous * surface, if any, is destroyed. Argument *screen* may be *NULL*. This * function is called by pygame.display.set_mode(). * * \param screen The new default window display surface. May be NULL. */ #define pg_SetDefaultWindowSurface \ (*(void (*)(pgSurfaceObject *))PYGAMEAPI_GET_SLOT(base, 22)) /** * \returns NULL if the environment variable PYGAME_BLEND_ALPHA_SDL2 is not * set, otherwise returns a pointer to the environment variable. */ #define pg_EnvShouldBlendAlphaSDL2 \ (*(char *(*)(void))PYGAMEAPI_GET_SLOT(base, 23)) /** * \brief Convert number like object *obj* to C double and in *val*. * * \param obj The Python object to convert. * \param val A pointer to the C double to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. */ #define pg_DoubleFromObj \ (*(int (*)(PyObject *, double *))PYGAMEAPI_GET_SLOT(base, 24)) /** * \brief Convert number like object at position *i* in sequence *obj* to C * double and place in argument *val*. * * \param obj The Python object to convert. * \param i The index of the object to convert. * \param val A pointer to the C double to store the result. * \returns 1 if the conversion was successful, 0 otherwise. * * \note This function will clear any Python errors. */ #define pg_DoubleFromObjIndex \ (*(int (*)(PyObject *, int, double *))PYGAMEAPI_GET_SLOT(base, 25)) /** * \brief Convert the two number like objects in length 2 sequence *obj* to C * double and place in arguments *val1* and *val2*. * * \param obj The Python two element sequence object to convert. * \param val A pointer to the C double to store the result. * \param val2 A pointer to the C double to store the result. * \returns 1 if the conversion was successful, 0 otherwise. */ #define pg_TwoDoublesFromObj \ (*(int (*)(PyObject *, double *, double *))PYGAMEAPI_GET_SLOT(base, 26)) #define import_pygame_base() IMPORT_PYGAME_MODULE(base) #endif /* ~PYGAMEAPI_BASE_INTERNAL */ typedef struct { /** * \brief The SDL rect wrapped by this object. */ PyObject_HEAD SDL_Rect r; /** * \brief A list of weak references to this rect. */ PyObject *weakreflist; } pgRectObject; /** * \brief Convert a pgRectObject to an SDL_Rect. * * \param obj A pgRectObject instance. * \returns the SDL_Rect field of *obj*, a pgRect_Type instance. * * \note SDL_Rect pgRect_AsRect(PyObject *obj) */ #define pgRect_AsRect(x) (((pgRectObject *)x)->r) #ifndef PYGAMEAPI_RECT_INTERNAL /** * \brief The Pygame rectangle object type pygame.Rect. */ #define pgRect_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(rect, 0)) /** * \brief Check if *obj* is a `pygame.Rect` instance. * * \returns true if *obj* is a `pygame.Rect` instance */ #define pgRect_Check(obj) ((obj)->ob_type == &pgRect_Type) /** * \brief Create a new `pygame.Rect` instance. * * \param r A pointer to an SDL_Rect struct. * \returns a new `pygame.Rect` object for the SDL_Rect *r*. * Returns *NULL* on error. * * \note PyObject* pgRect_New(SDL_Rect *r) */ #define pgRect_New (*(PyObject * (*)(SDL_Rect *)) PYGAMEAPI_GET_SLOT(rect, 1)) /** * \brief Create a new `pygame.Rect` instance from x, y, w, h. * * \param x The x coordinate of the rectangle. * \param y The y coordinate of the rectangle. * \param w The width of the rectangle. * \param h The height of the rectangle. * \returns a new `pygame.Rect` object. Returns *NULL* on error. * * \note PyObject* pgRect_New4(int x, int y, int w, int h) */ #define pgRect_New4 \ (*(PyObject * (*)(int, int, int, int)) PYGAMEAPI_GET_SLOT(rect, 2)) /** * \brief Convert a Python object to a `pygame.Rect` instance. * * \param obj A Python object. * A rectangle can be a length 4 sequence integers (x, y, w, h), or a length 2 * sequence of position (x, y) and size (w, h), or a length 1 tuple containing * a rectangle representation, or have a method *rect* that returns a * rectangle. * * \param temp A pointer to an SDL_Rect struct to store the result in. * \returns a pointer to the SDL_Rect field of the `pygame.Rect` instance * *obj*. Returns *NULL* on error. * * \note This function will clear any Python errors. * \note SDL_Rect* pgRect_FromObject(PyObject *obj, SDL_Rect *temp) */ #define pgRect_FromObject \ (*(SDL_Rect * (*)(PyObject *, SDL_Rect *)) PYGAMEAPI_GET_SLOT(rect, 3)) /** * \brief Normalize a `pygame.Rect` instance. A rect with a negative size * (negative width and/or height) will be adjusted to have a positive size. * * \param rect A pointer to a `pygame.Rect` instance. * \returns *rect* normalized with positive values only. * * \note void pgRect_Normalize(SDL_Rect *rect) */ #define pgRect_Normalize (*(void (*)(SDL_Rect *))PYGAMEAPI_GET_SLOT(rect, 4)) #define import_pygame_rect() IMPORT_PYGAME_MODULE(rect) #endif /* ~PYGAMEAPI_RECT_INTERNAL */ /* * JOYSTICK module */ typedef struct pgJoystickObject { PyObject_HEAD int id; SDL_Joystick *joy; /* Joysticks form an intrusive linked list. * * Note that we don't maintain refcounts for these so they are weakrefs * from the Python side. */ struct pgJoystickObject *next; struct pgJoystickObject *prev; } pgJoystickObject; #define pgJoystick_AsID(x) (((pgJoystickObject *)x)->id) #define pgJoystick_AsSDL(x) (((pgJoystickObject *)x)->joy) #ifndef PYGAMEAPI_JOYSTICK_INTERNAL #define pgJoystick_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(joystick, 0)) #define pgJoystick_Check(x) ((x)->ob_type == &pgJoystick_Type) #define pgJoystick_New (*(PyObject * (*)(int)) PYGAMEAPI_GET_SLOT(joystick, 1)) #define import_pygame_joystick() IMPORT_PYGAME_MODULE(joystick) #endif /* * DISPLAY module */ typedef struct { Uint32 hw_available : 1; Uint32 wm_available : 1; Uint32 blit_hw : 1; Uint32 blit_hw_CC : 1; Uint32 blit_hw_A : 1; Uint32 blit_sw : 1; Uint32 blit_sw_CC : 1; Uint32 blit_sw_A : 1; Uint32 blit_fill : 1; Uint32 video_mem; SDL_PixelFormat *vfmt; SDL_PixelFormat vfmt_data; int current_w; int current_h; } pg_VideoInfo; /** * A pygame object that wraps an SDL_VideoInfo struct. * The object returned by `pygame.display.Info()` */ typedef struct { PyObject_HEAD pg_VideoInfo info; } pgVidInfoObject; /** * \brief Convert a pgVidInfoObject to an SDL_VideoInfo. * * \note SDL_VideoInfo pgVidInfo_AsVidInfo(PyObject *obj) * * \returns the SDL_VideoInfo field of *obj*, a pgVidInfo_Type instance. * \param obj A pgVidInfo_Type instance. * * \note Does not check that *obj* is not `NULL` or an `pgVidInfoObject` * object. */ #define pgVidInfo_AsVidInfo(x) (((pgVidInfoObject *)x)->info) #ifndef PYGAMEAPI_DISPLAY_INTERNAL /** * \brief The pgVidInfoObject object Python type. * \note pgVideoInfo_Type is used for the `pygame.display.Info()` object. */ #define pgVidInfo_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(display, 0)) /** * \brief Check if *obj* is a pgVidInfoObject. * * \returns true if *x* is a `pgVidInfo_Type` instance * \note Will return false if *x* is a subclass of `pgVidInfo_Type`. * \note This macro does not check that *x* is not ``NULL``. * \note int pgVidInfo_Check(PyObject *x) */ #define pgVidInfo_Check(x) ((x)->ob_type == &pgVidInfo_Type) /** * \brief Create a new pgVidInfoObject. * * \param i A pointer to an SDL_VideoInfo struct. * \returns a new `pgVidInfoObject` object for the SDL_VideoInfo *i*. * * \note PyObject* pgVidInfo_New(SDL_VideoInfo *i) * \note On failure, raise a Python exception and return `NULL`. */ #define pgVidInfo_New \ (*(PyObject * (*)(pg_VideoInfo *)) PYGAMEAPI_GET_SLOT(display, 1)) #define import_pygame_display() IMPORT_PYGAME_MODULE(display) #endif /* ~PYGAMEAPI_DISPLAY_INTERNAL */ /* * SURFACE module */ struct pgSubSurface_Data; struct SDL_Surface; /** * \brief A pygame object that wraps an SDL_Surface. A `pygame.Surface` * instance. */ typedef struct { PyObject_HEAD struct SDL_Surface *surf; /** * \brief If true, the surface will be freed when the python object is * destroyed. */ int owner; /** * \brief The subsurface data for this surface (if a subsurface). */ struct pgSubSurface_Data *subsurface; /** * \brief A list of weak references to this surface. */ PyObject *weakreflist; /** * \brief A list of locks for this surface. */ PyObject *locklist; /** * \brief Usually a buffer object which the surface gets its data from. */ PyObject *dependency; } pgSurfaceObject; /** * \brief Convert a `pygame.Surface` instance to an SDL_Surface. * * \param x A `pygame.Surface` instance. * \returns the SDL_Surface field of *x*, a `pygame.Surface` instance. * * \note SDL_Surface* pgSurface_AsSurface(PyObject *x) */ #define pgSurface_AsSurface(x) (((pgSurfaceObject *)x)->surf) #ifndef PYGAMEAPI_SURFACE_INTERNAL /** * \brief The `pygame.Surface` object Python type. */ #define pgSurface_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(surface, 0)) /** * \brief Check if *x* is a `pygame.Surface` instance. * * \param x The object to check. * \returns true if *x* is a `pygame.Surface` instance * * \note Will return false if *x* is a subclass of `pygame.Surface`. * \note This macro does not check that *x* is not ``NULL``. * \note int pgSurface_Check(PyObject *x) */ #define pgSurface_Check(x) \ (PyObject_IsInstance((x), (PyObject *)&pgSurface_Type)) /** * \brief Create a new `pygame.Surface` instance. * * \param s The SDL surface to wrap in a python object. * \param owner If true, the surface will be freed when the python object is * destroyed. \returns A new new pygame surface instance for SDL surface *s*. * Returns *NULL* on error. * * \note pgSurfaceObject* pgSurface_New2(SDL_Surface *s, int owner) */ #define pgSurface_New2 \ (*(pgSurfaceObject * (*)(SDL_Surface *, int)) \ PYGAMEAPI_GET_SLOT(surface, 1)) /** * \brief Sets the SDL surface for a `pygame.Surface` instance. * * \param self The `pygame.Surface` instance to set the surface for. * \param s The SDL surface to set. * \param owner If true, the surface will be freed when the python object is * destroyed. \returns 0 on success, -1 on failure. * * \note int pgSurface_SetSurface(pgSurfaceObject *self, SDL_Surface *s, int * owner) */ #define pgSurface_SetSurface \ (*(int (*)(pgSurfaceObject *, SDL_Surface *, int))PYGAMEAPI_GET_SLOT( \ surface, 3)) /** * \brief Blit one surface onto another. * * \param dstobj The destination surface. * \param srcobj The source surface. * \param dstrect The destination rectangle. * \param srcrect The source rectangle. * \param the_args The blit flags. * \return 0 for success, -1 or -2 for error. * * \note Is accessible through the C api. * \note int pgSurface_Blit(PyObject *dstobj, PyObject *srcobj, SDL_Rect * *dstrect, SDL_Rect *srcrect, int the_args) */ #define pgSurface_Blit \ (*(int (*)(pgSurfaceObject *, pgSurfaceObject *, SDL_Rect *, SDL_Rect *, \ int))PYGAMEAPI_GET_SLOT(surface, 2)) #define import_pygame_surface() \ do { \ IMPORT_PYGAME_MODULE(surface); \ if (PyErr_Occurred() != NULL) \ break; \ IMPORT_PYGAME_MODULE(surflock); \ } while (0) #define pgSurface_New(surface) pgSurface_New2((surface), 1) #define pgSurface_NewNoOwn(surface) pgSurface_New2((surface), 0) #endif /* ~PYGAMEAPI_SURFACE_INTERNAL */ /* * SURFLOCK module * auto imported/initialized by surface */ #ifndef PYGAMEAPI_SURFLOCK_INTERNAL #define pgLifetimeLock_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(surflock, 0)) #define pgLifetimeLock_Check(x) ((x)->ob_type == &pgLifetimeLock_Type) #define pgSurface_Prep(x) \ if ((x)->subsurface) \ (*(*(void (*)(pgSurfaceObject *))PYGAMEAPI_GET_SLOT(surflock, 1)))(x) #define pgSurface_Unprep(x) \ if ((x)->subsurface) \ (*(*(void (*)(pgSurfaceObject *))PYGAMEAPI_GET_SLOT(surflock, 2)))(x) #define pgSurface_Lock \ (*(int (*)(pgSurfaceObject *))PYGAMEAPI_GET_SLOT(surflock, 3)) #define pgSurface_Unlock \ (*(int (*)(pgSurfaceObject *))PYGAMEAPI_GET_SLOT(surflock, 4)) #define pgSurface_LockBy \ (*(int (*)(pgSurfaceObject *, PyObject *))PYGAMEAPI_GET_SLOT(surflock, 5)) #define pgSurface_UnlockBy \ (*(int (*)(pgSurfaceObject *, PyObject *))PYGAMEAPI_GET_SLOT(surflock, 6)) #define pgSurface_LockLifetime \ (*(PyObject * (*)(PyObject *, PyObject *)) PYGAMEAPI_GET_SLOT(surflock, 7)) #endif /* * EVENT module */ typedef struct pgEventObject pgEventObject; #ifndef PYGAMEAPI_EVENT_INTERNAL #define pgEvent_Type (*(PyTypeObject *)PYGAMEAPI_GET_SLOT(event, 0)) #define pgEvent_Check(x) ((x)->ob_type == &pgEvent_Type) #define pgEvent_New \ (*(PyObject * (*)(SDL_Event *)) PYGAMEAPI_GET_SLOT(event, 1)) #define pgEvent_New2 \ (*(PyObject * (*)(int, PyObject *)) PYGAMEAPI_GET_SLOT(event, 2)) #define pgEvent_FillUserEvent \ (*(int (*)(pgEventObject *, SDL_Event *))PYGAMEAPI_GET_SLOT(event, 3)) #define pg_EnableKeyRepeat (*(int (*)(int, int))PYGAMEAPI_GET_SLOT(event, 4)) #define pg_GetKeyRepeat (*(void (*)(int *, int *))PYGAMEAPI_GET_SLOT(event, 5)) #define import_pygame_event() IMPORT_PYGAME_MODULE(event) #endif /* * RWOBJECT module * the rwobject are only needed for C side work, not accessible from python. */ #ifndef PYGAMEAPI_RWOBJECT_INTERNAL #define pgRWops_FromObject \ (*(SDL_RWops * (*)(PyObject *, char **)) PYGAMEAPI_GET_SLOT(rwobject, 0)) #define pgRWops_IsFileObject \ (*(int (*)(SDL_RWops *))PYGAMEAPI_GET_SLOT(rwobject, 1)) #define pg_EncodeFilePath \ (*(PyObject * (*)(PyObject *, PyObject *)) PYGAMEAPI_GET_SLOT(rwobject, 2)) #define pg_EncodeString \ (*(PyObject * (*)(PyObject *, const char *, const char *, PyObject *)) \ PYGAMEAPI_GET_SLOT(rwobject, 3)) #define pgRWops_FromFileObject \ (*(SDL_RWops * (*)(PyObject *)) PYGAMEAPI_GET_SLOT(rwobject, 4)) #define pgRWops_ReleaseObject \ (*(int (*)(SDL_RWops *))PYGAMEAPI_GET_SLOT(rwobject, 5)) #define import_pygame_rwobject() IMPORT_PYGAME_MODULE(rwobject) #endif /* * PixelArray module */ #ifndef PYGAMEAPI_PIXELARRAY_INTERNAL #define PyPixelArray_Type ((PyTypeObject *)PYGAMEAPI_GET_SLOT(pixelarray, 0)) #define PyPixelArray_Check(x) ((x)->ob_type == &PyPixelArray_Type) #define PyPixelArray_New (*(PyObject * (*)) PYGAMEAPI_GET_SLOT(pixelarray, 1)) #define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray) #endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */ /* * Color module */ typedef struct pgColorObject pgColorObject; #ifndef PYGAMEAPI_COLOR_INTERNAL #define pgColor_Type (*(PyObject *)PYGAMEAPI_GET_SLOT(color, 0)) #define pgColor_Check(x) ((x)->ob_type == &pgColor_Type) #define pgColor_New (*(PyObject * (*)(Uint8 *)) PYGAMEAPI_GET_SLOT(color, 1)) #define pgColor_NewLength \ (*(PyObject * (*)(Uint8 *, Uint8)) PYGAMEAPI_GET_SLOT(color, 3)) #define pg_RGBAFromColorObj \ (*(int (*)(PyObject *, Uint8 *))PYGAMEAPI_GET_SLOT(color, 2)) #define pg_RGBAFromFuzzyColorObj \ (*(int (*)(PyObject *, Uint8 *))PYGAMEAPI_GET_SLOT(color, 4)) #define pgColor_AsArray(x) (((pgColorObject *)x)->data) #define pgColor_NumComponents(x) (((pgColorObject *)x)->len) #define import_pygame_color() IMPORT_PYGAME_MODULE(color) #endif /* PYGAMEAPI_COLOR_INTERNAL */ /* * Math 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 */ #define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE /* * base pygame API slots * disable slots with NO_PYGAME_C_API */ #ifdef PYGAME_H PYGAMEAPI_DEFINE_SLOTS(base); PYGAMEAPI_DEFINE_SLOTS(rect); PYGAMEAPI_DEFINE_SLOTS(cdrom); PYGAMEAPI_DEFINE_SLOTS(joystick); PYGAMEAPI_DEFINE_SLOTS(display); PYGAMEAPI_DEFINE_SLOTS(surface); PYGAMEAPI_DEFINE_SLOTS(surflock); PYGAMEAPI_DEFINE_SLOTS(event); PYGAMEAPI_DEFINE_SLOTS(rwobject); PYGAMEAPI_DEFINE_SLOTS(pixelarray); PYGAMEAPI_DEFINE_SLOTS(color); PYGAMEAPI_DEFINE_SLOTS(math); #else /* ~PYGAME_H */ PYGAMEAPI_EXTERN_SLOTS(base); PYGAMEAPI_EXTERN_SLOTS(rect); PYGAMEAPI_EXTERN_SLOTS(cdrom); PYGAMEAPI_EXTERN_SLOTS(joystick); PYGAMEAPI_EXTERN_SLOTS(display); PYGAMEAPI_EXTERN_SLOTS(surface); PYGAMEAPI_EXTERN_SLOTS(surflock); PYGAMEAPI_EXTERN_SLOTS(event); PYGAMEAPI_EXTERN_SLOTS(rwobject); PYGAMEAPI_EXTERN_SLOTS(pixelarray); PYGAMEAPI_EXTERN_SLOTS(color); PYGAMEAPI_EXTERN_SLOTS(math); #endif /* ~PYGAME_H */ #endif /* PYGAME_H */ /* Use the end of this file for other cross module inline utility * functions There seems to be no good reason to stick to macro only * functions in Python 3. */ static PG_INLINE PyObject * pg_tuple_couple_from_values_int(int val1, int val2) { /* 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. */ PyObject *tup = PyTuple_New(2); if (!tup) { return NULL; } PyObject *tmp = PyLong_FromLong(val1); if (!tmp) { Py_DECREF(tup); return NULL; } PyTuple_SET_ITEM(tup, 0, tmp); tmp = PyLong_FromLong(val2); if (!tmp) { Py_DECREF(tup); return NULL; } PyTuple_SET_ITEM(tup, 1, tmp); return tup; } static PG_INLINE PyObject * pg_tuple_triple_from_values_int(int val1, int val2, int val3) { /* This function turns three input integers into a python tuple object. * Currently, 5th November 2022, this is faster than using Py_BuildValue * to do the same thing. */ PyObject *tup = PyTuple_New(3); if (!tup) { return NULL; } PyObject *tmp = PyLong_FromLong(val1); if (!tmp) { Py_DECREF(tup); return NULL; } PyTuple_SET_ITEM(tup, 0, tmp); tmp = PyLong_FromLong(val2); if (!tmp) { Py_DECREF(tup); return NULL; } PyTuple_SET_ITEM(tup, 1, tmp); tmp = PyLong_FromLong(val3); if (!tmp) { Py_DECREF(tup); return NULL; } PyTuple_SET_ITEM(tup, 2, tmp); return tup; }