Mercurial > pygame
diff src/numeric_arrayobject.h @ 871:62e182c1c769
Added numpy surface array module. Removed Numeric dependency and imported Numeric/arrayobject header.
| author | marcus |
|---|---|
| date | Fri, 04 Jan 2008 07:55:27 +0000 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/numeric_arrayobject.h Fri Jan 04 07:55:27 2008 +0000 @@ -0,0 +1,473 @@ +/* + * Imported Numeric-24.2 numeric/arrayobject.h header file to make the + * Numeric dependency obsolete. + */ + +/* + * Legal Notice + * + * *** Legal Notice for all LLNL-contributed files *** + * + * Copyright (c) 1996. The Regents of the University of California. All + * rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire + * notice is included in all copies of any software which is or includes + * a copy or modification of this software and in all copies of the + * supporting documentation for such software. + * + * This work was produced at the University of California, Lawrence + * Livermore National Laboratory under contract no. W-7405-ENG-48 + * between the U.S. Department of Energy and The Regents of the + * University of California for the operation of UC LLNL. + * + * DISCLAIMER + * + * This software was prepared as an account of work sponsored by an + * agency of the United States Government. Neither the United States + * Government nor the University of California nor any of their + * employees, makes any warranty, express or implied, or assumes any + * liability or responsibility for the accuracy, completeness, or + * usefulness of any information, apparatus, product, or process + * disclosed, or represents that its use would not infringe + * privately-owned rights. Reference herein to any specific commercial + * products, process, or service by trade name, trademark, manufacturer, + * or otherwise, does not necessarily constitute or imply its + * endorsement, recommendation, or favoring by the United States + * Government or the University of California. The views and opinions of + * authors expressed herein do not necessarily state or reflect those of + * the United States Government or the University of California, and + * shall not be used for advertising or product endorsement purposes. + */ + +#ifndef Py_ARRAYOBJECT_H +#define Py_ARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt) +#define MAX_ELSIZE 16 + +#define PyArray_UNSIGNED_TYPES + +enum PyArray_TYPES { PyArray_CHAR, PyArray_UBYTE, PyArray_SBYTE, + PyArray_SHORT, PyArray_USHORT, + PyArray_INT, PyArray_UINT, + PyArray_LONG, + PyArray_FLOAT, PyArray_DOUBLE, + PyArray_CFLOAT, PyArray_CDOUBLE, + PyArray_OBJECT, + PyArray_NTYPES, PyArray_NOTYPE}; + +typedef void (PyArray_VectorUnaryFunc) (char *, int, char *, int, int); + +typedef PyObject * (PyArray_GetItemFunc) (char *); +typedef int (PyArray_SetItemFunc) (PyObject *, char *); + +typedef struct { + PyArray_VectorUnaryFunc *cast[PyArray_NTYPES]; /* Functions to cast to */ + /* all other types */ + PyArray_GetItemFunc *getitem; + PyArray_SetItemFunc *setitem; + + int type_num, elsize; + char *one, *zero; + char type; + +} PyArray_Descr; + +/* Array flags */ +#define CONTIGUOUS 1 +#define OWN_DIMENSIONS 2 +#define OWN_STRIDES 4 +#define OWN_DATA 8 +#define SAVESPACE 16 + +/* type bit */ +#define SAVESPACEBIT 128 + +typedef struct { + PyObject_HEAD + char *data; + int nd; + int *dimensions, *strides; + PyObject *base; + PyArray_Descr *descr; + int flags; + PyObject *weakreflist; +} PyArrayObject; + +/* Array Interface flags */ +#define FORTRAN 0x002 +#define ALIGNED 0x100 +#define NOTSWAPPED 0x200 +#define WRITEABLE 0x400 + +typedef struct { + int version; + int nd; + char typekind; + int itemsize; + int flags; + Py_intptr_t *shape; + Py_intptr_t *strides; + void *data; +} PyArrayInterface; + + +/* + * C API + */ + +/* Type definitions */ + +#define PyArray_Type_NUM 0 + +/* Function definitions */ + +/* The following are not intended for use in user code, only needed by umath. */ +/* If you write your own match library, you might want this function. */ +#define PyArray_SetNumericOps_RET int +#define PyArray_SetNumericOps_PROTO (PyObject *) +#define PyArray_SetNumericOps_NUM 1 + +#define PyArray_INCREF_RET int +#define PyArray_INCREF_PROTO (PyArrayObject *ap) +#define PyArray_INCREF_NUM 2 + +#define PyArray_XDECREF_RET int +#define PyArray_XDECREF_PROTO (PyArrayObject *ap) +#define PyArray_XDECREF_NUM 3 + +/* Export the array error object. Is this a good idea? */ +#define PyArrayError_RET PyObject * +#define PyArrayError_PROTO (void) +#define PyArrayError_NUM 4 + +/* Set the array print function to be a python function */ +#define PyArray_SetStringFunction_RET void +#define PyArray_SetStringFunction_PROTO (PyObject *op, int repr) +#define PyArray_SetStringFunction_NUM 5 + +/* Get the PyArray_Descr structure for a typecode */ +#define PyArray_DescrFromType_RET PyArray_Descr * +#define PyArray_DescrFromType_PROTO (int) +#define PyArray_DescrFromType_NUM 6 + +/* Cast an array to a different type */ +#define PyArray_Cast_RET PyObject * +#define PyArray_Cast_PROTO (PyArrayObject *, int) +#define PyArray_Cast_NUM 7 + +/* Check the type coercion rules */ +#define PyArray_CanCastSafely_RET int +#define PyArray_CanCastSafely_PROTO (int fromtype, int totype) +#define PyArray_CanCastSafely_NUM 8 + +/* Return the typecode to use for an object if it was an array */ +#define PyArray_ObjectType_RET int +#define PyArray_ObjectType_PROTO (PyObject *, int) +#define PyArray_ObjectType_NUM 9 + +#define _PyArray_multiply_list_RET int +#define _PyArray_multiply_list_PROTO (int *lp, int n) +#define _PyArray_multiply_list_NUM 10 + + +/* The following defines the C API for the array object for most users */ + +#define PyArray_SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd)) +#define PyArray_NBYTES(mp) ((mp)->descr->elsize * PyArray_SIZE(mp)) +/* Obviously this needs some work. */ +#define PyArray_ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS) +#define PyArray_ISSPACESAVER(m) (((PyArrayObject *)m)->flags & SAVESPACE) +#define PyScalarArray_Check(m) (PyArray_Check((m)) && (((PyArrayObject *)(m))->nd == 0)) + +/* Return the size in number of items of an array */ +#define PyArray_Size_RET int +#define PyArray_Size_PROTO (PyObject *) +#define PyArray_Size_NUM 11 + + +/* Array creation functions */ +/* new_array = PyArray_FromDims(n_dimensions, dimensions[n_dimensions], item_type); */ +#define PyArray_FromDims_RET PyObject * +#define PyArray_FromDims_PROTO (int, int *, int) +#define PyArray_FromDims_NUM 12 + +/* array_from_existing_data = PyArray_FromDimsAndData(n_dims, dims[n_dims], item_type, old_data); */ +/* WARNING: using PyArray_FromDimsAndData is not reccommended! It should only be used to refer to */ +/* global arrays that will never be freed (like FORTRAN common blocks). */ +#define PyArray_FromDimsAndData_RET PyObject * +#define PyArray_FromDimsAndData_PROTO (int, int *, int, char *) +#define PyArray_FromDimsAndData_NUM 13 + +/* Initialize from a python object. */ + +/* PyArray_ContiguousFromObject(object, typecode, min_dimensions, max_dimensions) */ +/* if max_dimensions = 0, then any number of dimensions are allowed. */ +/* If you want an exact number of dimensions, you should use max_dimensions */ +/* = min_dimensions. */ + +#define PyArray_ContiguousFromObject_RET PyObject * +#define PyArray_ContiguousFromObject_PROTO (PyObject *, int, int, int) +#define PyArray_ContiguousFromObject_NUM 14 + +/* Same as contiguous, except guarantees a copy of the original data */ +#define PyArray_CopyFromObject_RET PyObject * +#define PyArray_CopyFromObject_PROTO (PyObject *, int, int, int) +#define PyArray_CopyFromObject_NUM 15 + +/* Shouldn't be used unless you know what you're doing and are not scared by discontiguous arrays */ +#define PyArray_FromObject_RET PyObject * +#define PyArray_FromObject_PROTO (PyObject *, int, int, int) +#define PyArray_FromObject_NUM 16 + +/* Return either an array, or if passed a 0d array return the appropriate python scalar */ +#define PyArray_Return_RET PyObject * +#define PyArray_Return_PROTO (PyArrayObject *) +#define PyArray_Return_NUM 17 + +#define PyArray_Reshape_RET PyObject * +#define PyArray_Reshape_PROTO (PyArrayObject *ap, PyObject *shape) +#define PyArray_Reshape_NUM 18 + +#define PyArray_Copy_RET PyObject * +#define PyArray_Copy_PROTO (PyArrayObject *ap) +#define PyArray_Copy_NUM 19 + +#define PyArray_Take_RET PyObject * +#define PyArray_Take_PROTO (PyObject *ap, PyObject *items, int axis) +#define PyArray_Take_NUM 20 + +/*Getting arrays in various useful forms. */ +#define PyArray_As1D_RET int +#define PyArray_As1D_PROTO (PyObject **op, char **ptr, int *d1, int typecode) +#define PyArray_As1D_NUM 21 + +#define PyArray_As2D_RET int +#define PyArray_As2D_PROTO (PyObject **op, char ***ptr, int *d1, int *d2, int typecode) +#define PyArray_As2D_NUM 22 + +#define PyArray_Free_RET int +#define PyArray_Free_PROTO (PyObject *op, char *ptr) +#define PyArray_Free_NUM 23 + +/* array_from_existing_data = PyArray_FromDimsAndDataAndDescr(n_dims, dims[n_dims], descr, old_data); */ +/* WARNING: using PyArray_FromDimsAndDataAndDescr is not reccommended! It should only be used to refer to */ +/* global arrays that will never be freed (like FORTRAN common blocks). */ +#define PyArray_FromDimsAndDataAndDescr_RET PyObject * +#define PyArray_FromDimsAndDataAndDescr_PROTO (int, int *, PyArray_Descr *, char *) +#define PyArray_FromDimsAndDataAndDescr_NUM 24 + +#define PyArray_Converter_RET int +#define PyArray_Converter_PROTO (PyObject *, PyObject **) +#define PyArray_Converter_NUM 25 + +#define PyArray_Put_RET PyObject * +#define PyArray_Put_PROTO (PyObject *ap, PyObject *items, PyObject* values) +#define PyArray_Put_NUM 26 + +#define PyArray_PutMask_RET PyObject * +#define PyArray_PutMask_PROTO (PyObject *ap, PyObject *mask, PyObject* values) +#define PyArray_PutMask_NUM 27 + +#define PyArray_CopyArray_RET int +#define PyArray_CopyArray_PROTO (PyArrayObject *dest, PyArrayObject *src) +#define PyArray_CopyArray_NUM 28 + +#define PyArray_ValidType_RET int +#define PyArray_ValidType_PROTO (int type) +#define PyArray_ValidType_NUM 29 + +/* Convert a Python object to a C int, if possible. Checks for + potential overflow, which is important on machines where + sizeof(int) != sizeof(long) (note that a Python int is a C long). + Handles Python ints, Python longs, and any ArrayObject that + works in int(). */ +#define PyArray_IntegerAsInt_RET int +#define PyArray_IntegerAsInt_PROTO (PyObject *o) +#define PyArray_IntegerAsInt_NUM 30 + +/* Total number of C API pointers */ +#define PyArray_API_pointers 31 + + +#ifdef _ARRAY_MODULE + +extern PyTypeObject PyArray_Type; +#define PyArray_Check(op) ((op)->ob_type == &PyArray_Type) + +extern PyArray_SetNumericOps_RET PyArray_SetNumericOps \ + PyArray_SetNumericOps_PROTO; +extern PyArray_INCREF_RET PyArray_INCREF PyArray_INCREF_PROTO; +extern PyArray_XDECREF_RET PyArray_XDECREF PyArray_XDECREF_PROTO; +extern PyArrayError_RET PyArrayError PyArrayError_PROTO; +extern PyArray_SetStringFunction_RET PyArray_SetStringFunction \ + PyArray_SetStringFunction_PROTO; +extern PyArray_DescrFromType_RET PyArray_DescrFromType \ + PyArray_DescrFromType_PROTO; +extern PyArray_Cast_RET PyArray_Cast PyArray_Cast_PROTO; +extern PyArray_CanCastSafely_RET PyArray_CanCastSafely \ + PyArray_CanCastSafely_PROTO; +extern PyArray_ObjectType_RET PyArray_ObjectType PyArray_ObjectType_PROTO; +extern _PyArray_multiply_list_RET _PyArray_multiply_list \ + _PyArray_multiply_list_PROTO; +extern PyArray_Size_RET PyArray_Size PyArray_Size_PROTO; +extern PyArray_FromDims_RET PyArray_FromDims PyArray_FromDims_PROTO; +extern PyArray_FromDimsAndData_RET PyArray_FromDimsAndData \ + PyArray_FromDimsAndData_PROTO; +extern PyArray_FromDimsAndDataAndDescr_RET PyArray_FromDimsAndDataAndDescr \ + PyArray_FromDimsAndDataAndDescr_PROTO; +extern PyArray_ContiguousFromObject_RET PyArray_ContiguousFromObject \ + PyArray_ContiguousFromObject_PROTO; +extern PyArray_CopyFromObject_RET PyArray_CopyFromObject \ + PyArray_CopyFromObject_PROTO; +extern PyArray_FromObject_RET PyArray_FromObject PyArray_FromObject_PROTO; +extern PyArray_Return_RET PyArray_Return PyArray_Return_PROTO; +extern PyArray_Reshape_RET PyArray_Reshape PyArray_Reshape_PROTO; +extern PyArray_Copy_RET PyArray_Copy PyArray_Copy_PROTO; +extern PyArray_Take_RET PyArray_Take PyArray_Take_PROTO; +extern PyArray_As1D_RET PyArray_As1D PyArray_As1D_PROTO; +extern PyArray_As2D_RET PyArray_As2D PyArray_As2D_PROTO; +extern PyArray_Free_RET PyArray_Free PyArray_Free_PROTO; +extern PyArray_Converter_RET PyArray_Converter PyArray_Converter_PROTO; +extern PyArray_Put_RET PyArray_Put PyArray_Put_PROTO; +extern PyArray_PutMask_RET PyArray_PutMask PyArray_PutMask_PROTO; +extern PyArray_CopyArray_RET PyArray_CopyArray PyArray_CopyArray_PROTO; +extern PyArray_ValidType_RET PyArray_ValidType PyArray_ValidType_PROTO; +extern PyArray_IntegerAsInt_RET PyArray_IntegerAsInt PyArray_IntegerAsInt_PROTO; + +#else + +#if defined(PY_ARRAY_UNIQUE_SYMBOL) +#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL +#endif + +/* C API address pointer */ +#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY) +extern void **PyArray_API; +#else +#if defined(PY_ARRAY_UNIQUE_SYMBOL) +void **PyArray_API; +#else +static void **PyArray_API; +#endif +#endif + +#define PyArray_Check(op) \ + ((op)->ob_type == (PyTypeObject *)PyArray_API[PyArray_Type_NUM]) +#define PyArray_Type *(PyTypeObject *)PyArray_API[PyArray_Type_NUM] + +#define PyArray_SetNumericOps \ + (*(PyArray_SetNumericOps_RET (*)PyArray_SetNumericOps_PROTO) \ + PyArray_API[PyArray_SetNumericOps_NUM]) +#define PyArray_INCREF \ + (*(PyArray_INCREF_RET (*)PyArray_INCREF_PROTO) \ + PyArray_API[PyArray_INCREF_NUM]) +#define PyArray_XDECREF \ + (*(PyArray_XDECREF_RET (*)PyArray_XDECREF_PROTO) \ + PyArray_API[PyArray_XDECREF_NUM]) +#define PyArrayError \ + (*(PyArrayError_RET (*)PyArrayError_PROTO) \ + PyArray_API[PyArrayError_NUM]) +#define PyArray_SetStringFunction \ + (*(PyArray_SetStringFunction_RET (*)PyArray_SetStringFunction_PROTO) \ + PyArray_API[PyArray_SetStringFunction_NUM]) +#define PyArray_DescrFromType \ + (*(PyArray_DescrFromType_RET (*)PyArray_DescrFromType_PROTO) \ + PyArray_API[PyArray_DescrFromType_NUM]) +#define PyArray_Cast \ + (*(PyArray_Cast_RET (*)PyArray_Cast_PROTO) \ + PyArray_API[PyArray_Cast_NUM]) +#define PyArray_CanCastSafely \ + (*(PyArray_CanCastSafely_RET (*)PyArray_CanCastSafely_PROTO) \ + PyArray_API[PyArray_CanCastSafely_NUM]) +#define PyArray_ObjectType \ + (*(PyArray_ObjectType_RET (*)PyArray_ObjectType_PROTO) \ + PyArray_API[PyArray_ObjectType_NUM]) +#define _PyArray_multiply_list \ + (*(_PyArray_multiply_list_RET (*)_PyArray_multiply_list_PROTO) \ + PyArray_API[_PyArray_multiply_list_NUM]) +#define PyArray_Size \ + (*(PyArray_Size_RET (*)PyArray_Size_PROTO) \ + PyArray_API[PyArray_Size_NUM]) +#define PyArray_FromDims \ + (*(PyArray_FromDims_RET (*)PyArray_FromDims_PROTO) \ + PyArray_API[PyArray_FromDims_NUM]) +#define PyArray_FromDimsAndData \ + (*(PyArray_FromDimsAndData_RET (*)PyArray_FromDimsAndData_PROTO) \ + PyArray_API[PyArray_FromDimsAndData_NUM]) +#define PyArray_FromDimsAndDataAndDescr \ + (*(PyArray_FromDimsAndDataAndDescr_RET (*)PyArray_FromDimsAndDataAndDescr_PROTO) \ + PyArray_API[PyArray_FromDimsAndDataAndDescr_NUM]) +#define PyArray_ContiguousFromObject \ + (*(PyArray_ContiguousFromObject_RET (*)PyArray_ContiguousFromObject_PROTO) \ + PyArray_API[PyArray_ContiguousFromObject_NUM]) +#define PyArray_CopyFromObject \ + (*(PyArray_CopyFromObject_RET (*)PyArray_CopyFromObject_PROTO) \ + PyArray_API[PyArray_CopyFromObject_NUM]) +#define PyArray_FromObject \ + (*(PyArray_FromObject_RET (*)PyArray_FromObject_PROTO) \ + PyArray_API[PyArray_FromObject_NUM]) +#define PyArray_Return \ + (*(PyArray_Return_RET (*)PyArray_Return_PROTO) \ + PyArray_API[PyArray_Return_NUM]) +#define PyArray_Reshape \ + (*(PyArray_Reshape_RET (*)PyArray_Reshape_PROTO) \ + PyArray_API[PyArray_Reshape_NUM]) +#define PyArray_Copy \ + (*(PyArray_Copy_RET (*)PyArray_Copy_PROTO) \ + PyArray_API[PyArray_Copy_NUM]) +#define PyArray_Take \ + (*(PyArray_Take_RET (*)PyArray_Take_PROTO) \ + PyArray_API[PyArray_Take_NUM]) +#define PyArray_As1D \ + (*(PyArray_As1D_RET (*)PyArray_As1D_PROTO) \ + PyArray_API[PyArray_As1D_NUM]) +#define PyArray_As2D \ + (*(PyArray_As2D_RET (*)PyArray_As2D_PROTO) \ + PyArray_API[PyArray_As2D_NUM]) +#define PyArray_Free \ + (*(PyArray_Free_RET (*)PyArray_Free_PROTO) \ + PyArray_API[PyArray_Free_NUM]) +#define PyArray_Converter \ + (*(PyArray_Converter_RET (*)PyArray_Converter_PROTO) \ + PyArray_API[PyArray_Converter_NUM]) +#define PyArray_Put \ + (*(PyArray_Put_RET (*)PyArray_Put_PROTO) \ + PyArray_API[PyArray_Put_NUM]) +#define PyArray_PutMask \ + (*(PyArray_PutMask_RET (*)PyArray_PutMask_PROTO) \ + PyArray_API[PyArray_PutMask_NUM]) +#define PyArray_CopyArray \ + (*(PyArray_CopyArray_RET (*)PyArray_CopyArray_PROTO) \ + PyArray_API[PyArray_CopyArray_NUM]) +#define PyArray_ValidType \ + (*(PyArray_ValidType_RET (*)PyArray_ValidType_PROTO) \ + PyArray_API[PyArray_ValidType_NUM]) +#define PyArray_IntegerAsInt \ + (*(PyArray_IntegerAsInt_RET (*)PyArray_IntegerAsInt_PROTO) \ + PyArray_API[PyArray_IntegerAsInt_NUM]) + +#define import_array() \ +{ \ + PyObject *numpy = PyImport_ImportModule("_numpy"); \ + if (numpy != NULL) { \ + PyObject *module_dict = PyModule_GetDict(numpy); \ + PyObject *c_api_object = PyDict_GetItemString(module_dict, "_ARRAY_API"); \ + if (PyCObject_Check(c_api_object)) { \ + PyArray_API = (void **)PyCObject_AsVoidPtr(c_api_object); \ + } \ + } \ +} + +#endif + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ARRAYOBJECT_H */
