123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864 |
- /*
- 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
- ** SDL and Python includes. 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 libarary, 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.
- **
- ** When making changes, it is very important to keep the
- ** FIRSTSLOT and NUMSLOT constants up to date for each
- ** section. Also be sure not to overlap any of the slots.
- ** When you do make a mistake with this, it will result
- ** is a dereferenced NULL pointer that is easier to diagnose
- ** than it could be :]
- **/
- #if defined(HAVE_SNPRINTF) /* defined in python.h (pyerrors.h) and SDL.h \
- (SDL_config.h) */
- #undef HAVE_SNPRINTF /* remove GCC redefine warning */
- #endif
- // This must be before all else
- #if defined(__SYMBIAN32__) && defined(OPENC)
- #include <sys/types.h>
- #if defined(__WINS__)
- void *
- _alloca(size_t size);
- #define alloca _alloca
- #endif
- #endif
- #define PG_STRINGIZE_HELPER(x) #x
- #define PG_STRINGIZE(x) PG_STRINGIZE_HELPER(x)
- #define PG_WARN(desc) message(__FILE__ "(" PG_STRINGIZE(__LINE__) "): WARNING: " #desc)
- /* This is unconditionally defined in Python.h */
- #if defined(_POSIX_C_SOURCE)
- #undef _POSIX_C_SOURCE
- #endif
- #include <Python.h>
- /* the version macros are defined since version 1.9.5 */
- #define PG_MAJOR_VERSION 1
- #define PG_MINOR_VERSION 9
- #define PG_PATCH_VERSION 6
- #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))
- /* Cobjects vanish in Python 3.2; so we will code as though we use capsules */
- #if defined(Py_CAPSULE_H)
- #define PG_HAVE_CAPSULE 1
- #else
- #define PG_HAVE_CAPSULE 0
- #endif
- #if defined(Py_COBJECT_H)
- #define PG_HAVE_COBJECT 1
- #else
- #define PG_HAVE_COBJECT 0
- #endif
- #if !PG_HAVE_CAPSULE
- #define PyCapsule_New(ptr, n, dfn) PyCObject_FromVoidPtr(ptr, dfn)
- #define PyCapsule_GetPointer(obj, n) PyCObject_AsVoidPtr(obj)
- #define PyCapsule_CheckExact(obj) PyCObject_Check(obj)
- #endif
- /* Pygame uses Py_buffer (PEP 3118) to exchange array information internally;
- * define here as needed.
- */
- #if !defined(PyBUF_SIMPLE)
- typedef struct bufferinfo {
- void *buf;
- PyObject *obj;
- Py_ssize_t len;
- Py_ssize_t itemsize;
- int readonly;
- int ndim;
- char *format;
- Py_ssize_t *shape;
- Py_ssize_t *strides;
- Py_ssize_t *suboffsets;
- void *internal;
- } Py_buffer;
- /* Flags for getting buffers */
- #define PyBUF_SIMPLE 0
- #define PyBUF_WRITABLE 0x0001
- /* we used to include an E, backwards compatible alias */
- #define PyBUF_WRITEABLE PyBUF_WRITABLE
- #define PyBUF_FORMAT 0x0004
- #define PyBUF_ND 0x0008
- #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
- #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
- #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
- #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
- #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
- #define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE)
- #define PyBUF_CONTIG_RO (PyBUF_ND)
- #define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE)
- #define PyBUF_STRIDED_RO (PyBUF_STRIDES)
- #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT)
- #define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT)
- #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT)
- #define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT)
- #define PyBUF_READ 0x100
- #define PyBUF_WRITE 0x200
- #define PyBUF_SHADOW 0x400
- typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
- typedef void (*releasebufferproc)(Py_buffer *);
- #endif /* #if !defined(PyBUF_SIMPLE) */
- /* 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;
- /* Operating system specific adjustments
- */
- // No signal()
- #if defined(__SYMBIAN32__) && defined(HAVE_SIGNAL_H)
- #undef HAVE_SIGNAL_H
- #endif
- #if defined(HAVE_SNPRINTF)
- #undef HAVE_SNPRINTF
- #endif
- #ifdef MS_WIN32 /*Python gives us MS_WIN32, SDL needs just WIN32*/
- #ifndef WIN32
- #define WIN32
- #endif
- #endif
- /// Prefix when initializing module
- #define MODPREFIX ""
- /// Prefix when importing module
- #define IMPPREFIX "pygame."
- #ifdef __SYMBIAN32__
- #undef MODPREFIX
- #undef IMPPREFIX
- // On Symbian there is no pygame package. The extensions are built-in or in
- // sys\bin.
- #define MODPREFIX "pygame_"
- #define IMPPREFIX "pygame_"
- #endif
- #include <SDL.h>
- /* Pygame's SDL version macros:
- * IS_SDLv1 is 1 if SDL 1.x.x, 0 otherwise
- * IS_SDLv2 is 1 if at least SDL 2.0.0, 0 otherwise
- */
- #if (SDL_VERSION_ATLEAST(2, 0, 0))
- #define IS_SDLv1 0
- #define IS_SDLv2 1
- #else
- #define IS_SDLv1 1
- #define IS_SDLv2 0
- #endif
- /*#if IS_SDLv1 && PG_MAJOR_VERSION >= 2
- #error pygame 2 requires SDL 2
- #endif*/
- #if IS_SDLv2
- /* SDL 1.2 constants removed from SDL 2 */
- typedef enum {
- SDL_HWSURFACE = 0,
- SDL_RESIZABLE = SDL_WINDOW_RESIZABLE,
- SDL_ASYNCBLIT = 0,
- SDL_OPENGL = SDL_WINDOW_OPENGL,
- SDL_OPENGLBLIT = 0,
- SDL_ANYFORMAT = 0,
- SDL_HWPALETTE = 0,
- SDL_DOUBLEBUF = 0,
- SDL_FULLSCREEN = SDL_WINDOW_FULLSCREEN,
- SDL_HWACCEL = 0,
- SDL_SRCCOLORKEY = 0,
- SDL_RLEACCELOK = 0,
- SDL_SRCALPHA = 0,
- SDL_NOFRAME = SDL_WINDOW_BORDERLESS,
- SDL_GL_SWAP_CONTROL = 0,
- TIMER_RESOLUTION = 0
- } PygameVideoFlags;
- /* the wheel button constants were removed from SDL 2 */
- typedef enum {
- PGM_BUTTON_LEFT = SDL_BUTTON_LEFT,
- PGM_BUTTON_RIGHT = SDL_BUTTON_RIGHT,
- PGM_BUTTON_MIDDLE = SDL_BUTTON_MIDDLE,
- PGM_BUTTON_WHEELUP = 4,
- PGM_BUTTON_WHEELDOWN = 5,
- PGM_BUTTON_X1 = SDL_BUTTON_X1 + 2,
- PGM_BUTTON_X2 = SDL_BUTTON_X2 + 2,
- PGM_BUTTON_KEEP = 0x80
- } PygameMouseFlags;
- typedef enum {
- SDL_NOEVENT = 0,
- /* SDL 1.2 allowed for 8 user defined events. */
- SDL_NUMEVENTS = SDL_USEREVENT + 8,
- SDL_ACTIVEEVENT = SDL_NUMEVENTS,
- PGE_EVENTBEGIN = SDL_NUMEVENTS,
- SDL_VIDEORESIZE,
- SDL_VIDEOEXPOSE,
- PGE_KEYREPEAT,
- PGE_EVENTEND
- } PygameEventCode;
- #define PGE_NUMEVENTS (PGE_EVENTEND - PGE_EVENTBEGIN)
- typedef enum {
- SDL_APPFOCUSMOUSE,
- SDL_APPINPUTFOCUS,
- SDL_APPACTIVE
- } PygameAppCode;
- /* Surface flags: based on SDL 1.2 flags */
- typedef enum {
- PGS_SWSURFACE = 0x00000000,
- PGS_HWSURFACE = 0x00000001,
- PGS_ASYNCBLIT = 0x00000004,
- PGS_ANYFORMAT = 0x10000000,
- PGS_HWPALETTE = 0x20000000,
- PGS_DOUBLEBUF = 0x40000000,
- PGS_FULLSCREEN = 0x80000000,
- PGS_OPENGL = 0x00000002,
- PGS_OPENGLBLIT = 0x0000000A,
- PGS_RESIZABLE = 0x00000010,
- PGS_NOFRAME = 0x00000020,
- PGS_SHOWN = 0x00000040, /* Added from SDL 2 */
- PGS_HIDDEN = 0x00000080, /* Added from SDL 2 */
- PGS_HWACCEL = 0x00000100,
- PGS_SRCCOLORKEY = 0x00001000,
- PGS_RLEACCELOK = 0x00002000,
- PGS_RLEACCEL = 0x00004000,
- PGS_SRCALPHA = 0x00010000,
- PGS_PREALLOC = 0x01000000
- } PygameSurfaceFlags;
- 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;
- #endif /* IS_SDLv2 */
- /* macros used throughout the source */
- #define RAISE(x, y) (PyErr_SetString((x), (y)), (PyObject *)NULL)
- #ifdef WITH_THREAD
- #define PG_CHECK_THREADS() (1)
- #else /* ~WITH_THREAD */
- #define PG_CHECK_THREADS() \
- (RAISE(PyExc_NotImplementedError, \
- "Python built without thread support"))
- #endif /* ~WITH_THREAD */
- #define PyType_Init(x) (((x).ob_type) = &PyType_Type)
- #define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API"
- #ifndef MIN
- #define MIN(a, b) ((a) < (b) ? (a) : (b))
- #endif
- #ifndef MAX
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #endif
- #ifndef ABS
- #define ABS(a) (((a) < 0) ? -(a) : (a))
- #endif
- /* test sdl initializations */
- #define VIDEO_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_VIDEO)) \
- return RAISE(pgExc_SDLError, "video system not initialized")
- #define CDROM_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_CDROM)) \
- return RAISE(pgExc_SDLError, "cdrom system not initialized")
- #define JOYSTICK_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_JOYSTICK)) \
- return RAISE(pgExc_SDLError, "joystick system not initialized")
- /* BASE */
- #define VIEW_CONTIGUOUS 1
- #define VIEW_C_ORDER 2
- #define VIEW_F_ORDER 4
- #define PYGAMEAPI_BASE_FIRSTSLOT 0
- #if IS_SDLv1
- #define PYGAMEAPI_BASE_NUMSLOTS 19
- #else /* IS_SDLv2 */
- #define PYGAMEAPI_BASE_NUMSLOTS 23
- #endif /* IS_SDLv2 */
- #ifndef PYGAMEAPI_BASE_INTERNAL
- #define pgExc_SDLError ((PyObject *)PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT])
- #define pg_RegisterQuit \
- (*(void (*)(void (*)(void)))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 1])
- #define pg_IntFromObj \
- (*(int (*)(PyObject *, int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 2])
- #define pg_IntFromObjIndex \
- (*(int (*)(PyObject *, int, \
- int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 3])
- #define pg_TwoIntsFromObj \
- (*(int (*)(PyObject *, int *, \
- int *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 4])
- #define pg_FloatFromObj \
- (*(int (*)(PyObject *, float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 5])
- #define pg_FloatFromObjIndex \
- (*(int (*)(PyObject *, int, \
- float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 6])
- #define pg_TwoFloatsFromObj \
- (*(int (*)(PyObject *, float *, \
- float *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 7])
- #define pg_UintFromObj \
- (*(int (*)(PyObject *, \
- Uint32 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 8])
- #define pg_UintFromObjIndex \
- (*(int (*)(PyObject *, int, \
- Uint32 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 9])
- #define pgVideo_AutoQuit \
- (*(void (*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 10])
- #define pgVideo_AutoInit \
- (*(int (*)(void))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 11])
- #define pg_RGBAFromObj \
- (*(int (*)(PyObject *, \
- Uint8 *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 12])
- #define pgBuffer_AsArrayInterface \
- (*(PyObject * (*)(Py_buffer *)) \
- PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 13])
- #define pgBuffer_AsArrayStruct \
- (*(PyObject * (*)(Py_buffer *)) \
- PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 14])
- #define pgObject_GetBuffer \
- (*(int (*)(PyObject *, pg_buffer *, \
- int))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 15])
- #define pgBuffer_Release \
- (*(void (*)(pg_buffer *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 16])
- #define pgDict_AsBuffer \
- (*(int (*)(pg_buffer *, PyObject *, \
- int))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 17])
- #define pgExc_BufferError \
- ((PyObject *)PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 18])
- #if IS_SDLv2
- #define pg_GetDefaultWindow \
- (*(SDL_Window * (*)(void)) PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 19])
- #define pg_SetDefaultWindow \
- (*(void (*)(SDL_Window *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 20])
- #define pg_GetDefaultWindowSurface \
- (*(PyObject * (*)(void)) PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 21])
- #define pg_SetDefaultWindowSurface \
- (*(void (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_BASE_FIRSTSLOT + 22])
- #endif /* IS_SDLv2 */
- #define import_pygame_base() IMPORT_PYGAME_MODULE(base, BASE)
- #endif
- /* RECT */
- #define PYGAMEAPI_RECT_FIRSTSLOT \
- (PYGAMEAPI_BASE_FIRSTSLOT + PYGAMEAPI_BASE_NUMSLOTS)
- #define PYGAMEAPI_RECT_NUMSLOTS 4
- #if IS_SDLv1
- typedef struct {
- int x, y;
- int w, h;
- } GAME_Rect;
- #else
- typedef SDL_Rect GAME_Rect;
- #endif
- typedef struct {
- PyObject_HEAD GAME_Rect r;
- PyObject *weakreflist;
- } pgRectObject;
- #define pgRect_AsRect(x) (((pgRectObject *)x)->r)
- #ifndef PYGAMEAPI_RECT_INTERNAL
- #define pgRect_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0])
- #define pgRect_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 0])
- #define pgRect_New \
- (*(PyObject * (*)(SDL_Rect *)) PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 1])
- #define pgRect_New4 \
- (*(PyObject * (*)(int, int, int, int)) \
- PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 2])
- #define pgRect_FromObject \
- (*(GAME_Rect * (*)(PyObject *, GAME_Rect *)) \
- PyGAME_C_API[PYGAMEAPI_RECT_FIRSTSLOT + 3])
- #define import_pygame_rect() IMPORT_PYGAME_MODULE(rect, RECT)
- #endif
- /* CDROM */
- #define PYGAMEAPI_CDROM_FIRSTSLOT \
- (PYGAMEAPI_RECT_FIRSTSLOT + PYGAMEAPI_RECT_NUMSLOTS)
- #define PYGAMEAPI_CDROM_NUMSLOTS 2
- typedef struct {
- PyObject_HEAD int id;
- } pgCDObject;
- #define pgCD_AsID(x) (((pgCDObject *)x)->id)
- #ifndef PYGAMEAPI_CDROM_INTERNAL
- #define pgCD_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0])
- #define pgCD_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0])
- #define pgCD_New \
- (*(PyObject * (*)(int)) PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 1])
- #define import_pygame_cd() IMPORT_PYGAME_MODULE(cdrom, CDROM)
- #endif
- /* JOYSTICK */
- #define PYGAMEAPI_JOYSTICK_FIRSTSLOT \
- (PYGAMEAPI_CDROM_FIRSTSLOT + PYGAMEAPI_CDROM_NUMSLOTS)
- #define PYGAMEAPI_JOYSTICK_NUMSLOTS 2
- typedef struct {
- PyObject_HEAD int id;
- } pgJoystickObject;
- #define pgJoystick_AsID(x) (((pgJoystickObject *)x)->id)
- #ifndef PYGAMEAPI_JOYSTICK_INTERNAL
- #define pgJoystick_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0])
- #define pgJoystick_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 0])
- #define pgJoystick_New \
- (*(PyObject * (*)(int)) PyGAME_C_API[PYGAMEAPI_JOYSTICK_FIRSTSLOT + 1])
- #define import_pygame_joystick() IMPORT_PYGAME_MODULE(joystick, JOYSTICK)
- #endif
- /* DISPLAY */
- #define PYGAMEAPI_DISPLAY_FIRSTSLOT \
- (PYGAMEAPI_JOYSTICK_FIRSTSLOT + PYGAMEAPI_JOYSTICK_NUMSLOTS)
- #define PYGAMEAPI_DISPLAY_NUMSLOTS 2
- typedef struct {
- #if IS_SDLv1
- PyObject_HEAD SDL_VideoInfo info;
- #else
- PyObject_HEAD pg_VideoInfo info;
- #endif
- } pgVidInfoObject;
- #define pgVidInfo_AsVidInfo(x) (((pgVidInfoObject *)x)->info)
- #ifndef PYGAMEAPI_DISPLAY_INTERNAL
- #define pgVidInfo_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0])
- #define pgVidInfo_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 0])
- #if IS_SDLv1
- #define pgVidInfo_New \
- (*(PyObject * (*)(SDL_VideoInfo *)) \
- PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 1])
- #else
- #define pgVidInfo_New \
- (*(PyObject * (*)(pg_VideoInfo *)) \
- PyGAME_C_API[PYGAMEAPI_DISPLAY_FIRSTSLOT + 1])
- #endif
- #define import_pygame_display() IMPORT_PYGAME_MODULE(display, DISPLAY)
- #endif
- /* SURFACE */
- #define PYGAMEAPI_SURFACE_FIRSTSLOT \
- (PYGAMEAPI_DISPLAY_FIRSTSLOT + PYGAMEAPI_DISPLAY_NUMSLOTS)
- #define PYGAMEAPI_SURFACE_NUMSLOTS 3
- typedef struct {
- PyObject_HEAD SDL_Surface *surf;
- #if IS_SDLv2
- int owner;
- #endif /* IS_SDLv2 */
- struct pgSubSurface_Data *subsurface; /*ptr to subsurface data (if a
- * subsurface)*/
- PyObject *weakreflist;
- PyObject *locklist;
- PyObject *dependency;
- } pgSurfaceObject;
- #define pgSurface_AsSurface(x) (((pgSurfaceObject *)x)->surf)
- #ifndef PYGAMEAPI_SURFACE_INTERNAL
- #define pgSurface_Check(x) \
- (PyObject_IsInstance((x), \
- (PyObject *)PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0]))
- #define pgSurface_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 0])
- #if IS_SDLv1
- #define pgSurface_New \
- (*(PyObject * (*)(SDL_Surface *)) \
- PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 1])
- #else /* IS_SDLv2 */
- #define pgSurface_New2 \
- (*(PyObject * (*)(SDL_Surface *, int)) \
- PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 1])
- #endif /* IS_SDLv2 */
- #define pgSurface_Blit \
- (*(int (*)(PyObject *, PyObject *, SDL_Rect *, SDL_Rect *, \
- int))PyGAME_C_API[PYGAMEAPI_SURFACE_FIRSTSLOT + 2])
- #define import_pygame_surface() \
- do { \
- IMPORT_PYGAME_MODULE(surface, SURFACE); \
- if (PyErr_Occurred() != NULL) \
- break; \
- IMPORT_PYGAME_MODULE(surflock, SURFLOCK); \
- } while (0)
- #if IS_SDLv2
- #define pgSurface_New(surface) pgSurface_New2((surface), 1)
- #define pgSurface_NewNoOwn(surface) pgSurface_New2((surface), 0)
- #endif /* IS_SDLv2 */
- #endif
- /* SURFLOCK */ /*auto import/init by surface*/
- #define PYGAMEAPI_SURFLOCK_FIRSTSLOT \
- (PYGAMEAPI_SURFACE_FIRSTSLOT + PYGAMEAPI_SURFACE_NUMSLOTS)
- #define PYGAMEAPI_SURFLOCK_NUMSLOTS 8
- struct pgSubSurface_Data {
- PyObject *owner;
- int pixeloffset;
- int offsetx, offsety;
- };
- typedef struct {
- PyObject_HEAD PyObject *surface;
- PyObject *lockobj;
- PyObject *weakrefs;
- } pgLifetimeLockObject;
- #ifndef PYGAMEAPI_SURFLOCK_INTERNAL
- #define pgLifetimeLock_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 0])
- #define pgSurface_Prep(x) \
- if (((pgSurfaceObject *)x)->subsurface) \
- (*(*(void (*)( \
- PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 1]))(x)
- #define pgSurface_Unprep(x) \
- if (((pgSurfaceObject *)x)->subsurface) \
- (*(*(void (*)( \
- PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 2]))(x)
- #define pgSurface_Lock \
- (*(int (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 3])
- #define pgSurface_Unlock \
- (*(int (*)(PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 4])
- #define pgSurface_LockBy \
- (*(int (*)(PyObject *, \
- PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 5])
- #define pgSurface_UnlockBy \
- (*(int (*)(PyObject *, \
- PyObject *))PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 6])
- #define pgSurface_LockLifetime \
- (*(PyObject * (*)(PyObject *, PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_SURFLOCK_FIRSTSLOT + 7])
- #endif
- /* EVENT */
- #define PYGAMEAPI_EVENT_FIRSTSLOT \
- (PYGAMEAPI_SURFLOCK_FIRSTSLOT + PYGAMEAPI_SURFLOCK_NUMSLOTS)
- #if IS_SDLv1
- #define PYGAMEAPI_EVENT_NUMSLOTS 4
- #else /* IS_SDLv2 */
- #define PYGAMEAPI_EVENT_NUMSLOTS 6
- #endif /* IS_SDLv2 */
- typedef struct {
- PyObject_HEAD int type;
- PyObject *dict;
- } pgEventObject;
- #ifndef PYGAMEAPI_EVENT_INTERNAL
- #define pgEvent_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0])
- #define pgEvent_Type \
- (*(PyTypeObject *)PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 0])
- #define pgEvent_New \
- (*(PyObject * (*)(SDL_Event *)) \
- PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 1])
- #define pgEvent_New2 \
- (*(PyObject * (*)(int, PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 2])
- #define pgEvent_FillUserEvent \
- (*(int (*)(pgEventObject *, \
- SDL_Event *))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 3])
- #if IS_SDLv2
- #define pg_EnableKeyRepeat \
- (*(int (*)(int, int))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 4])
- #define pg_GetKeyRepeat \
- (*(void (*)(int *, int *))PyGAME_C_API[PYGAMEAPI_EVENT_FIRSTSLOT + 5])
- #endif /* IS_SDLv2 */
- #define import_pygame_event() IMPORT_PYGAME_MODULE(event, EVENT)
- #endif
- /* RWOBJECT */
- /*the rwobject are only needed for C side work, not accessable from python*/
- #define PYGAMEAPI_RWOBJECT_FIRSTSLOT \
- (PYGAMEAPI_EVENT_FIRSTSLOT + PYGAMEAPI_EVENT_NUMSLOTS)
- #define PYGAMEAPI_RWOBJECT_NUMSLOTS 6
- #ifndef PYGAMEAPI_RWOBJECT_INTERNAL
- #define pgRWops_FromObject \
- (*(SDL_RWops * (*)(PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 0])
- #define pgRWops_IsFileObject \
- (*(int (*)(SDL_RWops *))PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 1])
- #define pg_EncodeFilePath \
- (*(PyObject * (*)(PyObject *, PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 2])
- #define pg_EncodeString \
- (*(PyObject * (*)(PyObject *, const char *, const char *, PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 3])
- #define pgRWops_FromFileObject \
- (*(SDL_RWops * (*)(PyObject *)) \
- PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 4])
- #define pgRWops_ReleaseObject \
- (*(int (*)(SDL_RWops *)) \
- PyGAME_C_API[PYGAMEAPI_RWOBJECT_FIRSTSLOT + 5])
- #define import_pygame_rwobject() IMPORT_PYGAME_MODULE(rwobject, RWOBJECT)
- #endif
- /* PixelArray */
- #define PYGAMEAPI_PIXELARRAY_FIRSTSLOT \
- (PYGAMEAPI_RWOBJECT_FIRSTSLOT + PYGAMEAPI_RWOBJECT_NUMSLOTS)
- #define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2
- #ifndef PYGAMEAPI_PIXELARRAY_INTERNAL
- #define PyPixelArray_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 0])
- #define PyPixelArray_New \
- (*(PyObject * (*)) PyGAME_C_API[PYGAMEAPI_PIXELARRAY_FIRSTSLOT + 1])
- #define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray, PIXELARRAY)
- #endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */
- /* Color */
- #define PYGAMEAPI_COLOR_FIRSTSLOT \
- (PYGAMEAPI_PIXELARRAY_FIRSTSLOT + PYGAMEAPI_PIXELARRAY_NUMSLOTS)
- #define PYGAMEAPI_COLOR_NUMSLOTS 4
- #ifndef PYGAMEAPI_COLOR_INTERNAL
- #define pgColor_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 0])
- #define pgColor_Type (*(PyObject *)PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT])
- #define pgColor_New \
- (*(PyObject * (*)(Uint8 *)) PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 1])
- #define pgColor_NewLength \
- (*(PyObject * (*)(Uint8 *, Uint8)) \
- PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 3])
- #define pg_RGBAFromColorObj \
- (*(int (*)(PyObject *, \
- Uint8 *))PyGAME_C_API[PYGAMEAPI_COLOR_FIRSTSLOT + 2])
- #define import_pygame_color() IMPORT_PYGAME_MODULE(color, COLOR)
- #endif /* PYGAMEAPI_COLOR_INTERNAL */
- /* Math */
- #define PYGAMEAPI_MATH_FIRSTSLOT \
- (PYGAMEAPI_COLOR_FIRSTSLOT + PYGAMEAPI_COLOR_NUMSLOTS)
- #define PYGAMEAPI_MATH_NUMSLOTS 2
- #ifndef PYGAMEAPI_MATH_INTERNAL
- #define pgVector2_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 0])
- #define pgVector3_Check(x) \
- ((x)->ob_type == \
- (PyTypeObject *)PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 1])
- /*
- #define pgVector2_New \
- (*(PyObject*(*)) PyGAME_C_API[PYGAMEAPI_MATH_FIRSTSLOT + 1])
- */
- #define import_pygame_math() IMPORT_PYGAME_MODULE(math, MATH)
- #endif /* PYGAMEAPI_MATH_INTERNAL */
- #define PG_CAPSULE_NAME(m) (IMPPREFIX m "." PYGAMEAPI_LOCAL_ENTRY)
- #define _IMPORT_PYGAME_MODULE(module, MODULE, api_root) \
- { \
- PyObject *_module = PyImport_ImportModule(IMPPREFIX #module); \
- \
- if (_module != NULL) { \
- PyObject *_c_api = \
- PyObject_GetAttrString(_module, PYGAMEAPI_LOCAL_ENTRY); \
- \
- Py_DECREF(_module); \
- if (_c_api != NULL && PyCapsule_CheckExact(_c_api)) { \
- void **localptr = (void **)PyCapsule_GetPointer( \
- _c_api, PG_CAPSULE_NAME(#module)); \
- \
- if (localptr != NULL) { \
- memcpy(api_root + PYGAMEAPI_##MODULE##_FIRSTSLOT, \
- localptr, \
- sizeof(void **) * PYGAMEAPI_##MODULE##_NUMSLOTS); \
- } \
- } \
- Py_XDECREF(_c_api); \
- } \
- }
- #ifndef NO_PYGAME_C_API
- #define IMPORT_PYGAME_MODULE(module, MODULE) \
- _IMPORT_PYGAME_MODULE(module, MODULE, PyGAME_C_API)
- #define PYGAMEAPI_TOTALSLOTS \
- (PYGAMEAPI_MATH_FIRSTSLOT + PYGAMEAPI_MATH_NUMSLOTS)
- #ifdef PYGAME_H
- void *PyGAME_C_API[PYGAMEAPI_TOTALSLOTS] = {NULL};
- #else
- extern void *PyGAME_C_API[PYGAMEAPI_TOTALSLOTS];
- #endif
- #endif
- #if PG_HAVE_CAPSULE
- #define encapsulate_api(ptr, module) \
- PyCapsule_New(ptr, PG_CAPSULE_NAME(module), NULL)
- #else
- #define encapsulate_api(ptr, module) PyCObject_FromVoidPtr(ptr, NULL)
- #endif
- #ifndef PG_INLINE
- #if defined(__clang__)
- #define PG_INLINE __inline__ __attribute__((__unused__))
- #elif defined(__GNUC__)
- #define PG_INLINE __inline__
- #elif defined(_MSC_VER)
- #define PG_INLINE __inline
- #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- #define PG_INLINE inline
- #else
- #define PG_INLINE
- #endif
- #endif
- /*last platform compiler stuff*/
- #if defined(macintosh) && defined(__MWERKS__) || defined(__SYMBIAN32__)
- #define PYGAME_EXPORT __declspec(export)
- #else
- #define PYGAME_EXPORT
- #endif
- #endif /* PYGAME_H */
|